summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bard_music.c1
-rw-r--r--src/battle_1.c17
-rw-r--r--src/battle_ai_script_commands.c1472
-rw-r--r--src/battle_ai_switch_items.c490
-rw-r--r--src/battle_anim.c475
-rw-r--r--src/battle_anim_sound_tasks.c438
-rw-r--r--src/battle_bg.c752
-rw-r--r--src/battle_controller_link_opponent.c896
-rw-r--r--src/battle_controller_link_partner.c781
-rw-r--r--src/battle_controller_opponent.c921
-rw-r--r--src/battle_controller_player.c1572
-rw-r--r--src/battle_controller_player_partner.c870
-rw-r--r--src/battle_controller_recorded_opponent.c841
-rw-r--r--src/battle_controller_recorded_player.c855
-rw-r--r--src/battle_controller_safari.c216
-rw-r--r--src/battle_controller_wally.c590
-rw-r--r--src/battle_controllers.c1243
-rw-r--r--src/battle_data.c13
-rw-r--r--src/battle_dome_cards.c21
-rw-r--r--src/battle_gfx_sfx_util.c643
-rw-r--r--src/battle_interface.c1181
-rw-r--r--src/battle_main.c (renamed from src/battle_2.c)2929
-rw-r--r--src/battle_message.c3235
-rw-r--r--src/battle_records.c510
-rw-r--r--src/battle_script_commands.c5678
-rw-r--r--src/battle_setup.c1868
-rw-r--r--src/battle_tent.c268
-rw-r--r--src/battle_transition.c4346
-rw-r--r--src/battle_tv.c1574
-rw-r--r--src/battle_util.c2562
-rw-r--r--src/battle_util2.c79
-rw-r--r--src/berry.c84
-rw-r--r--src/berry_blender.c3174
-rw-r--r--src/berry_fix_program.c335
-rw-r--r--src/berry_tag_screen.c653
-rw-r--r--src/bg.c14
-rw-r--r--src/bike.c1077
-rw-r--r--src/birch_pc.c89
-rw-r--r--src/blit.c209
-rw-r--r--[-rwxr-xr-x]src/braille_puzzles.c246
-rw-r--r--src/calculate_base_damage.c283
-rw-r--r--[-rwxr-xr-x]src/clear_save_data_screen.c10
-rw-r--r--src/clock.c93
-rw-r--r--src/coins.c27
-rw-r--r--src/coord_event_weather.c119
-rw-r--r--src/credits.c2355
-rwxr-xr-xsrc/data/field_event_obj/base_oam.h52
-rwxr-xr-xsrc/data/field_event_obj/berry_tree_graphics_tables.h570
-rwxr-xr-xsrc/data/field_event_obj/event_object_anims.h1176
-rwxr-xr-xsrc/data/field_event_obj/event_object_graphics.h1669
-rwxr-xr-xsrc/data/field_event_obj/event_object_graphics_info.h250
-rwxr-xr-xsrc/data/field_event_obj/event_object_graphics_info_pointers.h504
-rwxr-xr-xsrc/data/field_event_obj/event_object_pic_tables.h2179
-rwxr-xr-xsrc/data/field_event_obj/event_object_subsprites.h342
-rwxr-xr-xsrc/data/field_event_obj/field_effect_object_template_pointers.h82
-rwxr-xr-xsrc/data/field_event_obj/field_effect_objects.h997
-rwxr-xr-xsrc/data/field_event_obj/movement_action_func_tables.h1518
-rwxr-xr-xsrc/data/field_event_obj/movement_type_func_tables.h443
-rw-r--r--src/data/text/move_names.h357
-rw-r--r--src/data/text/species_names.h414
-rw-r--r--src/data/text/trainer_class_names.h73
-rw-r--r--src/data/trainer_parties.h12437
-rw-r--r--src/data/trainers.h11971
-rw-r--r--src/daycare.c99
-rw-r--r--src/decompress.c9
-rw-r--r--src/decoration.c338
-rw-r--r--src/decoration_inventory.c1
-rw-r--r--src/dewford_trend.c340
-rw-r--r--[-rwxr-xr-x]src/diploma.c19
-rw-r--r--src/dma3_manager.c555
-rw-r--r--src/dynamic_placeholder_text_util.c56
-rw-r--r--src/easy_chat.c437
-rw-r--r--src/egg_hatch.c179
-rw-r--r--src/event_data.c4
-rw-r--r--src/event_obj_lock.c186
-rw-r--r--src/event_object_movement.c9160
-rw-r--r--src/evolution_graphics.c84
-rw-r--r--src/evolution_scene.c306
-rw-r--r--src/field_camera.c497
-rw-r--r--src/field_door.c898
-rw-r--r--src/field_effect.c3883
-rwxr-xr-xsrc/field_map_obj.c5119
-rwxr-xr-xsrc/field_message_box.c155
-rw-r--r--src/field_poison.c148
-rw-r--r--src/field_region_map.c6
-rw-r--r--[-rwxr-xr-x]src/field_special_scene.c16
-rw-r--r--src/field_tasks.c776
-rw-r--r--src/fieldmap.c1034
-rw-r--r--src/fldeff_cut.c688
-rw-r--r--src/fldeff_flash.c367
-rw-r--r--src/fldeff_groundshake.c299
-rw-r--r--src/fldeff_softboiled.c109
-rw-r--r--src/fldeff_strength.c47
-rw-r--r--src/fldeff_sweetscent.c98
-rw-r--r--src/fldeff_teleport.c43
-rw-r--r--src/fossil_specials.c770
-rw-r--r--src/gym_leader_rematch.c106
-rw-r--r--src/hall_of_fame.c125
-rw-r--r--src/heal_location.c4
-rw-r--r--src/hof_pc.c45
-rw-r--r--src/international_string_util.c4
-rw-r--r--src/intro.c3020
-rw-r--r--src/intro_credits_graphics.c740
-rw-r--r--src/item.c1039
-rw-r--r--src/item_icon.c169
-rwxr-xr-xsrc/item_menu.c2244
-rw-r--r--src/item_menu_icons.c684
-rwxr-xr-xsrc/item_use.c1122
-rw-r--r--src/landmark.c441
-rw-r--r--src/libc.c173
-rw-r--r--src/libisagbprn.c177
-rw-r--r--src/librfu_rfu.c32
-rw-r--r--src/lilycove_lady.c136
-rw-r--r--src/link.c2430
-rw-r--r--src/link_rfu.c4942
-rw-r--r--src/list_menu.c1462
-rw-r--r--src/load_save.c234
-rw-r--r--src/lottery_corner.c6
-rw-r--r--src/m4a_2.c8
-rw-r--r--src/m4a_4.c4
-rw-r--r--src/mail.c361
-rw-r--r--src/mail_data.c203
-rw-r--r--src/main.c101
-rw-r--r--src/main_menu.c1992
-rw-r--r--src/map_name_popup.c474
-rw-r--r--src/match_call.c1275
-rw-r--r--src/mauville_old_man.c1248
-rw-r--r--src/menu.c2416
-rw-r--r--src/menu_helpers.c455
-rw-r--r--src/metatile_behavior.c5
-rw-r--r--src/mon_markings.c612
-rw-r--r--src/mystery_event_menu.c302
-rw-r--r--src/mystery_event_msg.c13
-rw-r--r--src/mystery_event_script.c396
-rw-r--r--src/naming_screen.c2175
-rw-r--r--src/new_game.c61
-rw-r--r--src/option_menu.c645
-rw-r--r--src/overworld.c3180
-rw-r--r--src/palette.c324
-rw-r--r--src/player_pc.c1360
-rw-r--r--src/pokeball.c1276
-rw-r--r--src/pokeblock.c1334
-rw-r--r--src/pokeblock_feed.c1105
-rw-r--r--src/pokedex.c5232
-rw-r--r--src/pokemon.c6099
-rw-r--r--src/pokemon_1.c391
-rw-r--r--src/pokemon_2.c1365
-rw-r--r--src/pokemon_3.c1749
-rw-r--r--src/pokemon_animation.c5658
-rw-r--r--src/pokemon_icon.c1318
-rw-r--r--src/pokemon_size_record.c2
-rw-r--r--src/pokemon_storage_system.c69
-rw-r--r--[-rwxr-xr-x]src/pokemon_summary_screen.c546
-rw-r--r--src/random.c (renamed from src/rng.c)6
-rw-r--r--src/rayquaza_scene.c2932
-rw-r--r--src/record_mixing.c2286
-rw-r--r--src/recorded_battle.c265
-rw-r--r--src/region_map.c229
-rw-r--r--src/reset_rtc_screen.c639
-rw-r--r--src/reset_save_heap.c12
-rw-r--r--src/reshow_battle_screen.c223
-rw-r--r--src/roamer.c4
-rw-r--r--src/rom4.c19
-rw-r--r--src/rom6.c210
-rw-r--r--src/rom_8011DC0.c3264
-rw-r--r--src/rom_8034C54.c453
-rw-r--r--src/rotating_gate.c1188
-rw-r--r--src/safari_zone.c34
-rw-r--r--src/save.c97
-rw-r--r--[-rwxr-xr-x]src/save_failed_screen.c27
-rw-r--r--[-rwxr-xr-x]src/save_location.c83
-rw-r--r--src/scanline_effect.c262
-rw-r--r--src/scrcmd.c302
-rw-r--r--src/script.c2
-rw-r--r--src/script_movement.c232
-rw-r--r--src/secret_base.c397
-rw-r--r--src/smokescreen.c71
-rw-r--r--src/sound.c80
-rw-r--r--src/sprite.c131
-rw-r--r--src/start_menu.c1337
-rw-r--r--src/starter_choose.c53
-rw-r--r--src/strings.c2051
-rw-r--r--src/text.c4165
-rw-r--r--src/text_window.c128
-rw-r--r--src/tileset_anims.c599
-rw-r--r--src/time_events.c118
-rw-r--r--src/title_screen.c784
-rw-r--r--src/trader.c209
-rw-r--r--src/trainer_see.c780
-rw-r--r--src/tv.c793
-rw-r--r--src/unk_81BAD84.c47
-rw-r--r--src/unk_text_util_2.c26
-rw-r--r--src/unk_transition.c633
-rw-r--r--src/use_pokeblock.c230
-rw-r--r--src/util.c2
-rw-r--r--src/walda_phrase.c6
-rw-r--r--src/wallclock.c1057
-rw-r--r--src/wild_encounter.c4608
-rw-r--r--src/window.c770
199 files changed, 172161 insertions, 30637 deletions
diff --git a/src/bard_music.c b/src/bard_music.c
index 6fb1496e5..6c2578071 100644
--- a/src/bard_music.c
+++ b/src/bard_music.c
@@ -2,6 +2,7 @@
// Includes
#include "global.h"
#include "bard_music.h"
+#include "constants/easy_chat.h"
#include "easy_chat.h"
#include "data/bard_music/bard_sounds.h"
diff --git a/src/battle_1.c b/src/battle_1.c
deleted file mode 100644
index 5e4ef5583..000000000
--- a/src/battle_1.c
+++ /dev/null
@@ -1,17 +0,0 @@
-
-// Includes
-#include "global.h"
-
-// Static type declarations
-
-// Static RAM declarations
-
-IWRAM_DATA u32 gUnknown_03000DD4;
-IWRAM_DATA u32 gUnknown_03000DD8;
-IWRAM_DATA u32 gUnknown_03000DDC;
-
-// Static ROM declarations
-
-// .rodata
-
-// .text
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index 24377eacc..74247f8a2 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -2,18 +2,16 @@
#include "battle_ai_script_commands.h"
#include "pokemon.h"
#include "battle.h"
-#include "species.h"
-#include "abilities.h"
-#include "rng.h"
+#include "battle_setup.h"
+#include "recorded_battle.h"
+#include "constants/species.h"
+#include "constants/abilities.h"
+#include "random.h"
#include "item.h"
-#include "battle_move_effects.h"
-#include "moves.h"
+#include "constants/battle_move_effects.h"
+#include "constants/moves.h"
#include "util.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) (const u8*) AIScriptRead32(ptr)
+#include "constants/battle_ai.h"
#define AI_ACTION_DONE 0x0001
#define AI_ACTION_FLEE 0x0002
@@ -27,14 +25,6 @@
#define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(gBattleResources->ai))
#define BATTLE_HISTORY ((struct BattleHistory *)(gBattleResources->battleHistory))
-enum
-{
- AI_TARGET,
- AI_USER,
- AI_TARGET_PARTNER,
- AI_USER_PARTNER
-};
-
// AI states
enum
{
@@ -52,33 +42,12 @@ in order to read the next command correctly. refer to battle_ai_scripts.s for th
AI scripts.
*/
-extern u32 gBattleTypeFlags;
-extern u8 gActiveBank;
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u16 gCurrentMove;
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT];
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
-extern u32 gStatuses3[BATTLE_BANKS_COUNT];
-extern u16 gSideAffecting[2];
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u16 gDynamicBasePower;
-extern u8 gBattleMoveFlags;
-extern s32 gBattleMoveDamage;
-extern u8 gCritMultiplier;
-extern u16 gBattleWeather;
-
-extern const struct BattleMove gBattleMoves[];
-extern const struct BaseStats gBaseStats[];
-extern const u8 * const gBattleAI_ScriptsTable[];
-
-extern u32 GetAiScriptsInRecordedBattle();
+extern const u8 *const gBattleAI_ScriptsTable[];
+
extern u32 GetAiScriptsInBattleFactory();
-static u8 BattleAI_ChooseMoveOrAction_Singles(void);
-static u8 BattleAI_ChooseMoveOrAction_Doubles(void);
+static u8 ChooseMoveOrAction_Singles(void);
+static u8 ChooseMoveOrAction_Doubles(void);
static void RecordLastUsedMoveByTarget(void);
static void BattleAI_DoAIProcessing(void);
static void AIStackPushVar(const u8 *);
@@ -105,30 +74,30 @@ 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_less_than_ptr(void);
+static void BattleAICmd_if_more_than_ptr(void);
+static void BattleAICmd_if_equal_ptr(void);
+static void BattleAICmd_if_not_equal_ptr(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_hwords(void);
static void BattleAICmd_if_not_in_hwords(void);
-static void BattleAICmd_if_user_can_damage(void);
-static void BattleAICmd_if_user_cant_damage(void);
+static void BattleAICmd_if_user_has_attacking_move(void);
+static void BattleAICmd_if_user_has_no_attacking_moves(void);
static void BattleAICmd_get_turn_count(void);
static void BattleAICmd_get_type(void);
-static void BattleAICmd_get_last_used_bank_move_power(void);
-static void BattleAICmd_is_most_powerful_move(void);
-static void BattleAICmd_get_last_used_bank_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_get_considered_move_power(void);
+static void BattleAICmd_get_how_powerful_move_is(void);
+static void BattleAICmd_get_last_used_battler_move(void);
+static void BattleAICmd_if_equal_(void);
+static void BattleAICmd_if_not_equal_(void);
+static void BattleAICmd_if_user_goes(void);
+static void BattleAICmd_if_user_doesnt_go(void);
static void BattleAICmd_nullsub_2A(void);
static void BattleAICmd_nullsub_2B(void);
-static void BattleAICmd_count_alive_pokemon(void);
+static void BattleAICmd_count_usable_party_mons(void);
static void BattleAICmd_get_considered_move(void);
static void BattleAICmd_get_considered_move_effect(void);
static void BattleAICmd_get_ability(void);
@@ -148,17 +117,17 @@ 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_doesnt_have_move(void);
+static void BattleAICmd_if_has_move_with_effect(void);
+static void BattleAICmd_if_doesnt_have_move_with_effect(void);
static void BattleAICmd_if_any_move_disabled_or_encored(void);
static void BattleAICmd_if_curr_move_disabled_or_encored(void);
static void BattleAICmd_flee(void);
-static void BattleAICmd_if_random_100(void);
+static void BattleAICmd_if_random_safari_flee(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_is_first_turn_for(void);
static void BattleAICmd_get_stockpile_count(void);
static void BattleAICmd_is_double_battle(void);
static void BattleAICmd_get_used_held_item(void);
@@ -173,7 +142,7 @@ 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_goto(void);
static void BattleAICmd_end(void);
static void BattleAICmd_if_level_cond(void);
static void BattleAICmd_if_target_taunted(void);
@@ -185,115 +154,113 @@ static void BattleAICmd_if_flash_fired(void);
static void BattleAICmd_if_holds_item(void);
// ewram
-
EWRAM_DATA const u8 *gAIScriptPtr = NULL;
-EWRAM_DATA static u8 sBank_AI = 0;
+EWRAM_DATA static u8 sBattler_AI = 0;
// const rom data
-
typedef void (*BattleAICmdFunc)(void);
static const BattleAICmdFunc sBattleAICmdTable[] =
{
- BattleAICmd_if_random_less_than, // 0x0
- BattleAICmd_if_random_greater_than, // 0x1
- BattleAICmd_if_random_equal, // 0x2
- BattleAICmd_if_random_not_equal, // 0x3
- BattleAICmd_score, // 0x4
- BattleAICmd_if_hp_less_than, // 0x5
- BattleAICmd_if_hp_more_than, // 0x6
- BattleAICmd_if_hp_equal, // 0x7
- BattleAICmd_if_hp_not_equal, // 0x8
- BattleAICmd_if_status, // 0x9
- BattleAICmd_if_not_status, // 0xA
- BattleAICmd_if_status2, // 0xB
- BattleAICmd_if_not_status2, // 0xC
- BattleAICmd_if_status3, // 0xD
- BattleAICmd_if_not_status3, // 0xE
- BattleAICmd_if_side_affecting, // 0xF
- BattleAICmd_if_not_side_affecting, // 0x10
- BattleAICmd_if_less_than, // 0x11
- BattleAICmd_if_more_than, // 0x12
- BattleAICmd_if_equal, // 0x13
- BattleAICmd_if_not_equal, // 0x14
- BattleAICmd_if_less_than_32, // 0x15
- BattleAICmd_if_more_than_32, // 0x16
- BattleAICmd_if_equal_32, // 0x17
- BattleAICmd_if_not_equal_32, // 0x18
- BattleAICmd_if_move, // 0x19
- BattleAICmd_if_not_move, // 0x1A
- BattleAICmd_if_in_bytes, // 0x1B
- BattleAICmd_if_not_in_bytes, // 0x1C
- BattleAICmd_if_in_hwords, // 0x1D
- BattleAICmd_if_not_in_hwords, // 0x1E
- BattleAICmd_if_user_can_damage, // 0x1F
- BattleAICmd_if_user_cant_damage, // 0x20
- BattleAICmd_get_turn_count, // 0x21
- BattleAICmd_get_type, // 0x22
- BattleAICmd_get_last_used_bank_move_power, // 0x23
- BattleAICmd_is_most_powerful_move, // 0x24
- BattleAICmd_get_last_used_bank_move, // 0x25
- BattleAICmd_if_arg_equal, // 0x26
- BattleAICmd_if_arg_not_equal, // 0x27
- BattleAICmd_if_would_go_first, // 0x28
- BattleAICmd_if_would_not_go_first, // 0x29
- BattleAICmd_nullsub_2A, // 0x2A
- BattleAICmd_nullsub_2B, // 0x2B
- BattleAICmd_count_alive_pokemon, // 0x2C
- BattleAICmd_get_considered_move, // 0x2D
- BattleAICmd_get_considered_move_effect, // 0x2E
- BattleAICmd_get_ability, // 0x2F
- BattleAICmd_get_highest_type_effectiveness, // 0x30
- BattleAICmd_if_type_effectiveness, // 0x31
- BattleAICmd_nullsub_32, // 0x32
- BattleAICmd_nullsub_33, // 0x33
- BattleAICmd_if_status_in_party, // 0x34
- BattleAICmd_if_status_not_in_party, // 0x35
- BattleAICmd_get_weather, // 0x36
- BattleAICmd_if_effect, // 0x37
- BattleAICmd_if_not_effect, // 0x38
- BattleAICmd_if_stat_level_less_than, // 0x39
- BattleAICmd_if_stat_level_more_than, // 0x3A
- BattleAICmd_if_stat_level_equal, // 0x3B
- BattleAICmd_if_stat_level_not_equal, // 0x3C
- BattleAICmd_if_can_faint, // 0x3D
- BattleAICmd_if_cant_faint, // 0x3E
- BattleAICmd_if_has_move, // 0x3F
- BattleAICmd_if_dont_have_move, // 0x40
- BattleAICmd_if_move_effect, // 0x41
- BattleAICmd_if_not_move_effect, // 0x42
+ BattleAICmd_if_random_less_than, // 0x0
+ BattleAICmd_if_random_greater_than, // 0x1
+ BattleAICmd_if_random_equal, // 0x2
+ BattleAICmd_if_random_not_equal, // 0x3
+ BattleAICmd_score, // 0x4
+ BattleAICmd_if_hp_less_than, // 0x5
+ BattleAICmd_if_hp_more_than, // 0x6
+ BattleAICmd_if_hp_equal, // 0x7
+ BattleAICmd_if_hp_not_equal, // 0x8
+ BattleAICmd_if_status, // 0x9
+ BattleAICmd_if_not_status, // 0xA
+ BattleAICmd_if_status2, // 0xB
+ BattleAICmd_if_not_status2, // 0xC
+ BattleAICmd_if_status3, // 0xD
+ BattleAICmd_if_not_status3, // 0xE
+ BattleAICmd_if_side_affecting, // 0xF
+ BattleAICmd_if_not_side_affecting, // 0x10
+ BattleAICmd_if_less_than, // 0x11
+ BattleAICmd_if_more_than, // 0x12
+ BattleAICmd_if_equal, // 0x13
+ BattleAICmd_if_not_equal, // 0x14
+ BattleAICmd_if_less_than_ptr, // 0x15
+ BattleAICmd_if_more_than_ptr, // 0x16
+ BattleAICmd_if_equal_ptr, // 0x17
+ BattleAICmd_if_not_equal_ptr, // 0x18
+ BattleAICmd_if_move, // 0x19
+ BattleAICmd_if_not_move, // 0x1A
+ BattleAICmd_if_in_bytes, // 0x1B
+ BattleAICmd_if_not_in_bytes, // 0x1C
+ BattleAICmd_if_in_hwords, // 0x1D
+ BattleAICmd_if_not_in_hwords, // 0x1E
+ BattleAICmd_if_user_has_attacking_move, // 0x1F
+ BattleAICmd_if_user_has_no_attacking_moves, // 0x20
+ BattleAICmd_get_turn_count, // 0x21
+ BattleAICmd_get_type, // 0x22
+ BattleAICmd_get_considered_move_power, // 0x23
+ BattleAICmd_get_how_powerful_move_is, // 0x24
+ BattleAICmd_get_last_used_battler_move, // 0x25
+ BattleAICmd_if_equal_, // 0x26
+ BattleAICmd_if_not_equal_, // 0x27
+ BattleAICmd_if_user_goes, // 0x28
+ BattleAICmd_if_user_doesnt_go, // 0x29
+ BattleAICmd_nullsub_2A, // 0x2A
+ BattleAICmd_nullsub_2B, // 0x2B
+ BattleAICmd_count_usable_party_mons, // 0x2C
+ BattleAICmd_get_considered_move, // 0x2D
+ BattleAICmd_get_considered_move_effect, // 0x2E
+ BattleAICmd_get_ability, // 0x2F
+ BattleAICmd_get_highest_type_effectiveness, // 0x30
+ BattleAICmd_if_type_effectiveness, // 0x31
+ BattleAICmd_nullsub_32, // 0x32
+ BattleAICmd_nullsub_33, // 0x33
+ BattleAICmd_if_status_in_party, // 0x34
+ BattleAICmd_if_status_not_in_party, // 0x35
+ BattleAICmd_get_weather, // 0x36
+ BattleAICmd_if_effect, // 0x37
+ BattleAICmd_if_not_effect, // 0x38
+ BattleAICmd_if_stat_level_less_than, // 0x39
+ BattleAICmd_if_stat_level_more_than, // 0x3A
+ BattleAICmd_if_stat_level_equal, // 0x3B
+ BattleAICmd_if_stat_level_not_equal, // 0x3C
+ BattleAICmd_if_can_faint, // 0x3D
+ BattleAICmd_if_cant_faint, // 0x3E
+ BattleAICmd_if_has_move, // 0x3F
+ BattleAICmd_if_doesnt_have_move, // 0x40
+ BattleAICmd_if_has_move_with_effect, // 0x41
+ BattleAICmd_if_doesnt_have_move_with_effect, // 0x42
BattleAICmd_if_any_move_disabled_or_encored, // 0x43
BattleAICmd_if_curr_move_disabled_or_encored, // 0x44
- BattleAICmd_flee, // 0x45
- BattleAICmd_if_random_100, // 0x46
- BattleAICmd_watch, // 0x47
- BattleAICmd_get_hold_effect, // 0x48
- BattleAICmd_get_gender, // 0x49
- BattleAICmd_is_first_turn, // 0x4A
- BattleAICmd_get_stockpile_count, // 0x4B
- BattleAICmd_is_double_battle, // 0x4C
- BattleAICmd_get_used_held_item, // 0x4D
- BattleAICmd_get_move_type_from_result, // 0x4E
- BattleAICmd_get_move_power_from_result, // 0x4F
- BattleAICmd_get_move_effect_from_result, // 0x50
- BattleAICmd_get_protect_count, // 0x51
- BattleAICmd_nullsub_52, // 0x52
- BattleAICmd_nullsub_53, // 0x53
- BattleAICmd_nullsub_54, // 0x54
- BattleAICmd_nullsub_55, // 0x55
- BattleAICmd_nullsub_56, // 0x56
- BattleAICmd_nullsub_57, // 0x57
- BattleAICmd_call, // 0x58
- BattleAICmd_jump, // 0x59
- BattleAICmd_end, // 0x5A
- BattleAICmd_if_level_cond, // 0x5B
- BattleAICmd_if_target_taunted, // 0x5C
- BattleAICmd_if_target_not_taunted, // 0x5D
- BattleAICmd_if_target_is_ally, // 0x5E
- BattleAICmd_is_of_type, // 0x5F
- BattleAICmd_check_ability, // 0x60
- BattleAICmd_if_flash_fired, // 0x61
- BattleAICmd_if_holds_item, // 0x62
+ BattleAICmd_flee, // 0x45
+ BattleAICmd_if_random_safari_flee, // 0x46
+ BattleAICmd_watch, // 0x47
+ BattleAICmd_get_hold_effect, // 0x48
+ BattleAICmd_get_gender, // 0x49
+ BattleAICmd_is_first_turn_for, // 0x4A
+ BattleAICmd_get_stockpile_count, // 0x4B
+ BattleAICmd_is_double_battle, // 0x4C
+ BattleAICmd_get_used_held_item, // 0x4D
+ BattleAICmd_get_move_type_from_result, // 0x4E
+ BattleAICmd_get_move_power_from_result, // 0x4F
+ BattleAICmd_get_move_effect_from_result, // 0x50
+ BattleAICmd_get_protect_count, // 0x51
+ BattleAICmd_nullsub_52, // 0x52
+ BattleAICmd_nullsub_53, // 0x53
+ BattleAICmd_nullsub_54, // 0x54
+ BattleAICmd_nullsub_55, // 0x55
+ BattleAICmd_nullsub_56, // 0x56
+ BattleAICmd_nullsub_57, // 0x57
+ BattleAICmd_call, // 0x58
+ BattleAICmd_goto, // 0x59
+ BattleAICmd_end, // 0x5A
+ BattleAICmd_if_level_cond, // 0x5B
+ BattleAICmd_if_target_taunted, // 0x5C
+ BattleAICmd_if_target_not_taunted, // 0x5D
+ BattleAICmd_if_target_is_ally, // 0x5E
+ BattleAICmd_is_of_type, // 0x5F
+ BattleAICmd_check_ability, // 0x60
+ BattleAICmd_if_flash_fired, // 0x61
+ BattleAICmd_if_holds_item, // 0x62
};
static const u16 sDiscouragedPowerfulMoveEffects[] =
@@ -313,26 +280,29 @@ static const u16 sDiscouragedPowerfulMoveEffects[] =
0xFFFF
};
+// code
void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves)
{
s32 i;
- u8 *data = (u8 *)gBattleResources->battleHistory;
+ u8 *data = (u8 *)BATTLE_HISTORY;
for (i = 0; i < sizeof(struct BattleHistory); i++)
data[i] = 0;
- // items are allowed to use in ONLY trainer battles
- if ((gBattleTypeFlags &
- (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER |
- BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER
- | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_SECRET_BASE))
- == BATTLE_TYPE_TRAINER)
+
+ // Items are allowed to use in ONLY trainer battles.
+ if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER
+ | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_SECRET_BASE | BATTLE_TYPE_FRONTIER
+ | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_x2000000)
+ )
+ )
{
for (i = 0; i < 4; i++)
{
if (gTrainers[gTrainerBattleOpponent_A].items[i] != 0)
{
- gBattleResources->battleHistory->trainerItems[gBattleResources->battleHistory->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i];
- gBattleResources->battleHistory->itemsNo++;
+ BATTLE_HISTORY->trainerItems[BATTLE_HISTORY->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i];
+ BATTLE_HISTORY->itemsNo++;
}
}
}
@@ -346,23 +316,24 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
u8 *data = (u8 *)AI_THINKING_STRUCT;
u8 moveLimitations;
- // clear AI data.
+ // Clear AI data.
for (i = 0; i < sizeof(struct AI_ThinkingStruct); i++)
data[i] = 0;
- // conditional score reset, unlike Ruby.
+ // Conditional score reset, unlike Ruby.
for (i = 0; i < 4; i++)
{
if (defaultScoreMoves & 1)
AI_THINKING_STRUCT->score[i] = 100;
else
AI_THINKING_STRUCT->score[i] = 0;
+
defaultScoreMoves >>= 1;
}
- moveLimitations = CheckMoveLimitations(gActiveBank, 0, 0xFF);
+ moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
- // ignore moves that aren't possible to use
+ // Ignore moves that aren't possible to use.
for (i = 0; i < 4; i++)
{
if (gBitTable[i] & moveLimitations)
@@ -370,37 +341,43 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16);
}
+
gBattleResources->AI_ScriptsStack->size = 0;
- sBank_AI = gActiveBank;
- // decide a random target bank in doubles
+ sBattler_AI = gActiveBattler;
+
+ // Decide a random target battlerId in doubles.
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- gBankTarget = (Random() & 2) + (GetBankSide(gActiveBank) ^ 1);
- if (gAbsentBankFlags & gBitTable[gBankTarget])
- gBankTarget ^= 2;
+ gBattlerTarget = (Random() & BIT_FLANK) + (GetBattlerSide(gActiveBattler) ^ BIT_SIDE);
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
+ gBattlerTarget ^= BIT_FLANK;
}
- // in singles there's only one choice
+ // There's only one choice in single battles.
else
- gBankTarget = sBank_AI ^ 1;
+ {
+ gBattlerTarget = sBattler_AI ^ BIT_SIDE;
+ }
+ // Choose proper trainer ai scripts.
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
AI_THINKING_STRUCT->aiFlags = GetAiScriptsInRecordedBattle();
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- AI_THINKING_STRUCT->aiFlags = 0x40000000;
+ AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI;
else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
- AI_THINKING_STRUCT->aiFlags = 0x20000000;
+ AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING;
else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
- AI_THINKING_STRUCT->aiFlags = 0x80000000;
+ AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_FIRST_BATTLE;
else if (gBattleTypeFlags & BATTLE_TYPE_FACTORY)
AI_THINKING_STRUCT->aiFlags = GetAiScriptsInBattleFactory();
else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x4000000 | BATTLE_TYPE_SECRET_BASE))
- AI_THINKING_STRUCT->aiFlags = 7; // the smartest possible set
+ AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_TRY_TO_FAINT;
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags;
else
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags;
+
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- AI_THINKING_STRUCT->aiFlags |= 0x80; // act smart in doubles and don't attack your partner
+ AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // act smart in doubles and don't attack your partner
}
u8 BattleAI_ChooseMoveOrAction(void)
@@ -409,15 +386,15 @@ u8 BattleAI_ChooseMoveOrAction(void)
u8 ret;
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
- ret = BattleAI_ChooseMoveOrAction_Singles();
+ ret = ChooseMoveOrAction_Singles();
else
- ret = BattleAI_ChooseMoveOrAction_Doubles();
+ ret = ChooseMoveOrAction_Doubles();
gCurrentMove = savedCurrentMove;
return ret;
}
-static u8 BattleAI_ChooseMoveOrAction_Singles(void)
+static u8 ChooseMoveOrAction_Singles(void)
{
u8 currentMoveArray[4];
u8 consideredMoveArray[4];
@@ -438,11 +415,11 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void)
AI_THINKING_STRUCT->movesetIndex = 0;
}
- // special flags for safari
+ // Check special AI actions.
if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE)
- return 4;
+ return AI_CHOICE_FLEE;
if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH)
- return 5;
+ return AI_CHOICE_WATCH;
numOfBestMoves = 1;
currentMoveArray[0] = AI_THINKING_STRUCT->score[0];
@@ -450,9 +427,9 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void)
for (i = 1; i < 4; i++)
{
- if (gBattleMons[sBank_AI].moves[i] != 0) // emerald adds an extra move ID check for some reason.
+ if (gBattleMons[sBattler_AI].moves[i] != MOVE_NONE)
{
- // in ruby, the order of these if statements are reversed.
+ // In ruby, the order of these if statements is reversed.
if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i])
{
currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i];
@@ -469,7 +446,7 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void)
return consideredMoveArray[Random() % numOfBestMoves];
}
-static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
+static u8 ChooseMoveOrAction_Doubles(void)
{
s32 i;
s32 j;
@@ -485,7 +462,7 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
for (i = 0; i < 4; i++)
{
- if (i == sBank_AI || gBattleMons[i].hp == 0)
+ if (i == sBattler_AI || gBattleMons[i].hp == 0)
{
actionOrMoveIndex[i] = -1;
bestMovePointsForTarget[i] = -1;
@@ -497,9 +474,9 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
else
BattleAI_SetupAIData(0xF);
- gBankTarget = i;
+ gBattlerTarget = i;
- if ((i & BIT_SIDE) != (sBank_AI & BIT_SIDE))
+ if ((i & BIT_SIDE) != (sBattler_AI & BIT_SIDE))
RecordLastUsedMoveByTarget();
AI_THINKING_STRUCT->aiLogicId = 0;
@@ -516,10 +493,15 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
AI_THINKING_STRUCT->aiLogicId++;
AI_THINKING_STRUCT->movesetIndex = 0;
}
+
if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE)
- actionOrMoveIndex[i] = 4;
+ {
+ actionOrMoveIndex[i] = AI_CHOICE_FLEE;
+ }
else if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH)
- actionOrMoveIndex[i] = 5;
+ {
+ actionOrMoveIndex[i] = AI_CHOICE_WATCH;
+ }
else
{
mostViableMovesScores[0] = AI_THINKING_STRUCT->score[0];
@@ -527,7 +509,7 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
mostViableMovesNo = 1;
for (j = 1; j < 4; j++)
{
- if (gBattleMons[sBank_AI].moves[j] != 0)
+ if (gBattleMons[sBattler_AI].moves[j] != 0)
{
if (mostViableMovesScores[0] == AI_THINKING_STRUCT->score[j])
{
@@ -542,18 +524,16 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
mostViableMovesNo = 1;
}
}
- //_08130E72
}
actionOrMoveIndex[i] = mostViableMovesIndices[Random() % mostViableMovesNo];
bestMovePointsForTarget[i] = mostViableMovesScores[0];
- // don't use a move against ally if it has less than 100 pts
- if (i == (sBank_AI ^ BIT_MON) && bestMovePointsForTarget[i] < 100)
+ // Don't use a move against ally if it has less than 100 points.
+ if (i == (sBattler_AI ^ BIT_FLANK) && bestMovePointsForTarget[i] < 100)
{
bestMovePointsForTarget[i] = -1;
- mostViableMovesScores[0] = mostViableMovesScores[0]; // needed to match
+ mostViableMovesScores[0] = mostViableMovesScores[0]; // Needed to match.
}
-
}
}
}
@@ -564,13 +544,11 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
for (i = 1; i < 4; i++)
{
- //_08130EDA
if (mostMovePoints == bestMovePointsForTarget[i])
{
mostViableTargetsArray[mostViableTargetsNo] = i;
mostViableTargetsNo++;
}
- //_08130EEE
if (mostMovePoints < bestMovePointsForTarget[i])
{
mostMovePoints = bestMovePointsForTarget[i];
@@ -579,8 +557,8 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
}
}
- gBankTarget = mostViableTargetsArray[Random() % mostViableTargetsNo];
- return actionOrMoveIndex[gBankTarget];
+ gBattlerTarget = mostViableTargetsArray[Random() % mostViableTargetsNo];
+ return actionOrMoveIndex[gBattlerTarget];
}
static void BattleAI_DoAIProcessing(void)
@@ -593,19 +571,21 @@ static void BattleAI_DoAIProcessing(void)
break;
case AIState_SettingUp:
gAIScriptPtr = gBattleAI_ScriptsTable[AI_THINKING_STRUCT->aiLogicId]; // set AI ptr to logic ID.
- if (gBattleMons[sBank_AI].pp[AI_THINKING_STRUCT->movesetIndex] == 0)
+ if (gBattleMons[sBattler_AI].pp[AI_THINKING_STRUCT->movesetIndex] == 0)
{
AI_THINKING_STRUCT->moveConsidered = 0;
}
else
{
- AI_THINKING_STRUCT->moveConsidered = gBattleMons[sBank_AI].moves[AI_THINKING_STRUCT->movesetIndex];
+ AI_THINKING_STRUCT->moveConsidered = gBattleMons[sBattler_AI].moves[AI_THINKING_STRUCT->movesetIndex];
}
AI_THINKING_STRUCT->aiState++;
break;
case AIState_Processing:
if (AI_THINKING_STRUCT->moveConsidered != 0)
+ {
sBattleAICmdTable[*gAIScriptPtr](); // Run AI command.
+ }
else
{
AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0;
@@ -633,43 +613,43 @@ static void RecordLastUsedMoveByTarget(void)
for (i = 0; i < 4; i++)
{
- if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == gLastUsedMovesByBanks[gBankTarget])
+ if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
break;
- if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] != gLastUsedMovesByBanks[gBankTarget] // HACK: This redundant condition is a hack to make the asm match.
- && gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == 0)
+ if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] != gLastMoves[gBattlerTarget] // HACK: This redundant condition is a hack to make the asm match.
+ && BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == MOVE_NONE)
{
- gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] = gLastUsedMovesByBanks[gBankTarget];
+ BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] = gLastMoves[gBattlerTarget];
break;
}
}
}
-void ClearBankMoveHistory(u8 bank)
+void ClearBattlerMoveHistory(u8 battlerId)
{
s32 i;
for (i = 0; i < 4; i++)
- gBattleResources->battleHistory->usedMoves[bank].moves[i] = 0;
+ BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE;
}
-void RecordAbilityBattle(u8 bank, u8 abilityId)
+void RecordAbilityBattle(u8 battlerId, u8 abilityId)
{
- gBattleResources->battleHistory->abilities[bank] = abilityId;
+ BATTLE_HISTORY->abilities[battlerId] = abilityId;
}
-void ClearBankAbilityHistory(u8 bank)
+void ClearBattlerAbilityHistory(u8 battlerId)
{
- gBattleResources->battleHistory->abilities[bank] = 0;
+ BATTLE_HISTORY->abilities[battlerId] = ABILITY_NONE;
}
-void RecordItemEffectBattle(u8 bank, u8 itemEffect)
+void RecordItemEffectBattle(u8 battlerId, u8 itemEffect)
{
- gBattleResources->battleHistory->itemEffects[bank] = itemEffect;
+ BATTLE_HISTORY->itemEffects[battlerId] = itemEffect;
}
-void ClearBankItemEffectHistory(u8 bank)
+void ClearBattlerItemEffectHistory(u8 battlerId)
{
- gBattleResources->battleHistory->itemEffects[bank] = 0;
+ BATTLE_HISTORY->itemEffects[battlerId] = 0;
}
static void BattleAICmd_if_random_less_than(void)
@@ -677,7 +657,7 @@ static void BattleAICmd_if_random_less_than(void)
u16 random = Random();
if (random % 256 < gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -687,7 +667,7 @@ static void BattleAICmd_if_random_greater_than(void)
u16 random = Random();
if (random % 256 > gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -697,7 +677,7 @@ static void BattleAICmd_if_random_equal(void)
u16 random = Random();
if (random % 256 == gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -707,16 +687,16 @@ static void BattleAICmd_if_random_not_equal(void)
u16 random = Random();
if (random % 256 != gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
static void BattleAICmd_score(void)
{
- AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += 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 (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 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.
@@ -724,206 +704,206 @@ static void BattleAICmd_score(void)
static void BattleAICmd_if_hp_less_than(void)
{
- u16 index;
+ u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) < gAIScriptPtr[2])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < gAIScriptPtr[2])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
static void BattleAICmd_if_hp_more_than(void)
{
- u16 index;
+ u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) > gAIScriptPtr[2])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > gAIScriptPtr[2])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
static void BattleAICmd_if_hp_equal(void)
{
- u16 index;
+ u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) == gAIScriptPtr[2])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == gAIScriptPtr[2])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
static void BattleAICmd_if_hp_not_equal(void)
{
- u16 index;
+ u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) != gAIScriptPtr[2])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != gAIScriptPtr[2])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
static void BattleAICmd_if_status(void)
{
- u16 index;
- u32 arg;
+ u16 battlerId;
+ u32 status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg = AIScriptRead32(gAIScriptPtr + 2);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gBattleMons[index].status1 & arg) != 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if (gBattleMons[battlerId].status1 & status)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
static void BattleAICmd_if_not_status(void)
{
- u16 index;
- u32 arg;
+ u16 battlerId;
+ u32 status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg = AIScriptRead32(gAIScriptPtr + 2);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gBattleMons[index].status1 & arg) == 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if (!(gBattleMons[battlerId].status1 & status))
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
static void BattleAICmd_if_status2(void)
{
- u16 index;
- u32 arg;
+ u16 battlerId;
+ u32 status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg = AIScriptRead32(gAIScriptPtr + 2);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gBattleMons[index].status2 & arg) != 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if ((gBattleMons[battlerId].status2 & status))
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
static void BattleAICmd_if_not_status2(void)
{
- u16 index;
- u32 arg;
+ u16 battlerId;
+ u32 status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg = AIScriptRead32(gAIScriptPtr + 2);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gBattleMons[index].status2 & arg) == 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if (!(gBattleMons[battlerId].status2 & status))
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
static void BattleAICmd_if_status3(void)
{
- u16 index;
- u32 arg;
+ u16 battlerId;
+ u32 status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg = AIScriptRead32(gAIScriptPtr + 2);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gStatuses3[index] & arg) != 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if (gStatuses3[battlerId] & status)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
static void BattleAICmd_if_not_status3(void)
{
- u16 index;
- u32 arg;
+ u16 battlerId;
+ u32 status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg = AIScriptRead32(gAIScriptPtr + 2);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gStatuses3[index] & arg) == 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if (!(gStatuses3[battlerId] & status))
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
static void BattleAICmd_if_side_affecting(void)
{
- u16 index;
- u32 arg1, arg2;
+ u16 battlerId;
+ u32 side, status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg1 = GetBankIdentity(index) & 1;
- arg2 = AIScriptRead32(gAIScriptPtr + 2);
+ side = GET_BATTLER_SIDE(battlerId);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gSideAffecting[arg1] & arg2) != 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if (gSideStatuses[side] & status)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
static void BattleAICmd_if_not_side_affecting(void)
{
- u16 index;
- u32 arg1, arg2;
+ u16 battlerId;
+ u32 side, status;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- arg1 = GetBankIdentity(index) & 1;
- arg2 = AIScriptRead32(gAIScriptPtr + 2);
+ side = GET_BATTLER_SIDE(battlerId);
+ status = T1_READ_32(gAIScriptPtr + 2);
- if ((gSideAffecting[arg1] & arg2) == 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ if (!(gSideStatuses[side] & status))
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
@@ -931,7 +911,7 @@ static void BattleAICmd_if_not_side_affecting(void)
static void BattleAICmd_if_less_than(void)
{
if (AI_THINKING_STRUCT->funcResult < gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -939,7 +919,7 @@ static void BattleAICmd_if_less_than(void)
static void BattleAICmd_if_more_than(void)
{
if (AI_THINKING_STRUCT->funcResult > gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -947,7 +927,7 @@ static void BattleAICmd_if_more_than(void)
static void BattleAICmd_if_equal(void)
{
if (AI_THINKING_STRUCT->funcResult == gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -955,80 +935,80 @@ static void BattleAICmd_if_equal(void)
static void BattleAICmd_if_not_equal(void)
{
if (AI_THINKING_STRUCT->funcResult != gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-static void BattleAICmd_if_less_than_32(void)
+static void BattleAICmd_if_less_than_ptr(void)
{
- const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *value = T1_READ_PTR(gAIScriptPtr + 1);
- if (AI_THINKING_STRUCT->funcResult < *temp)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ if (AI_THINKING_STRUCT->funcResult < *value)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
-static void BattleAICmd_if_more_than_32(void)
+static void BattleAICmd_if_more_than_ptr(void)
{
- const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *value = T1_READ_PTR(gAIScriptPtr + 1);
- if (AI_THINKING_STRUCT->funcResult > *temp)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ if (AI_THINKING_STRUCT->funcResult > *value)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
-static void BattleAICmd_if_equal_32(void)
+static void BattleAICmd_if_equal_ptr(void)
{
- const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *value = T1_READ_PTR(gAIScriptPtr + 1);
- if (AI_THINKING_STRUCT->funcResult == *temp)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ if (AI_THINKING_STRUCT->funcResult == *value)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
-static void BattleAICmd_if_not_equal_32(void)
+static void BattleAICmd_if_not_equal_ptr(void)
{
- const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *value = T1_READ_PTR(gAIScriptPtr + 1);
- if (AI_THINKING_STRUCT->funcResult != *temp)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ if (AI_THINKING_STRUCT->funcResult != *value)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
static void BattleAICmd_if_move(void)
{
- u16 move = AIScriptRead16(gAIScriptPtr + 1);
+ u16 move = T1_READ_16(gAIScriptPtr + 1);
if (AI_THINKING_STRUCT->moveConsidered == move)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
static void BattleAICmd_if_not_move(void)
{
- u16 move = AIScriptRead16(gAIScriptPtr + 1);
+ u16 move = T1_READ_16(gAIScriptPtr + 1);
if (AI_THINKING_STRUCT->moveConsidered != move)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
static void BattleAICmd_if_in_bytes(void)
{
- const u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *ptr = T1_READ_PTR(gAIScriptPtr + 1);
while (*ptr != 0xFF)
{
if (AI_THINKING_STRUCT->funcResult == *ptr)
{
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
return;
}
ptr++;
@@ -1038,7 +1018,7 @@ static void BattleAICmd_if_in_bytes(void)
static void BattleAICmd_if_not_in_bytes(void)
{
- const u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *ptr = T1_READ_PTR(gAIScriptPtr + 1);
while (*ptr != 0xFF)
{
@@ -1049,18 +1029,18 @@ static void BattleAICmd_if_not_in_bytes(void)
}
ptr++;
}
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
}
static void BattleAICmd_if_in_hwords(void)
{
- const u16 *ptr = (const u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
+ const u16 *ptr = (const u16 *)T1_READ_PTR(gAIScriptPtr + 1);
while (*ptr != 0xFFFF)
{
if (AI_THINKING_STRUCT->funcResult == *ptr)
{
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
return;
}
ptr++;
@@ -1070,7 +1050,7 @@ static void BattleAICmd_if_in_hwords(void)
static void BattleAICmd_if_not_in_hwords(void)
{
- const u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
+ const u16 *ptr = (const u16 *)T1_READ_PTR(gAIScriptPtr + 1);
while (*ptr != 0xFFFF)
{
@@ -1081,39 +1061,41 @@ static void BattleAICmd_if_not_in_hwords(void)
}
ptr++;
}
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5);
}
-static void BattleAICmd_if_user_can_damage(void)
+static void BattleAICmd_if_user_has_attacking_move(void)
{
s32 i;
for (i = 0; i < 4; i++)
{
- if (gBattleMons[sBank_AI].moves[i] != 0
- && gBattleMoves[gBattleMons[sBank_AI].moves[i]].power != 0)
+ if (gBattleMons[sBattler_AI].moves[i] != 0
+ && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0)
break;
}
+
if (i == 4)
gAIScriptPtr += 5;
else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
}
-static void BattleAICmd_if_user_cant_damage(void)
+static void BattleAICmd_if_user_has_no_attacking_moves(void)
{
s32 i;
for (i = 0; i < 4; i++)
{
- if (gBattleMons[sBank_AI].moves[i] != 0
- && gBattleMoves[gBattleMons[sBank_AI].moves[i]].power != 0)
+ if (gBattleMons[sBattler_AI].moves[i] != 0
+ && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0)
break;
}
+
if (i != 4)
gAIScriptPtr += 5;
else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
}
static void BattleAICmd_get_turn_count(void)
@@ -1128,64 +1110,60 @@ static void BattleAICmd_get_type(void)
switch (typeVar)
{
- case 1: // player primary type
- AI_THINKING_STRUCT->funcResult = gBattleMons[sBank_AI].type1;
+ case AI_TYPE1_USER: // AI user primary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].type1;
break;
- case 0: // enemy primary type
- AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type1;
+ case AI_TYPE1_TARGET: // target primary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type1;
break;
- case 3: // player secondary type
- AI_THINKING_STRUCT->funcResult = gBattleMons[sBank_AI].type2;
+ case AI_TYPE2_USER: // AI user secondary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].type2;
break;
- case 2: // enemy secondary type
- AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type2;
+ case AI_TYPE2_TARGET: // target secondary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type2;
break;
- case 4: // type of move being pointed to
+ case AI_TYPE_MOVE: // type of move being pointed to
AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type;
break;
}
gAIScriptPtr += 2;
}
-static u8 BattleAI_GetWantedBank(u8 index)
+static u8 BattleAI_GetWantedBattler(u8 wantedBattler)
{
- switch (index)
+ switch (wantedBattler)
{
- case AI_USER:
- return sBank_AI;
- case AI_TARGET:
- default:
- return gBankTarget;
- case AI_USER_PARTNER:
- return sBank_AI ^ BIT_MON;
- case AI_TARGET_PARTNER:
- return gBankTarget ^ BIT_MON;
+ case AI_USER:
+ return sBattler_AI;
+ case AI_TARGET:
+ default:
+ return gBattlerTarget;
+ case AI_USER_PARTNER:
+ return sBattler_AI ^ BIT_FLANK;
+ case AI_TARGET_PARTNER:
+ return gBattlerTarget ^ BIT_FLANK;
}
}
static void BattleAICmd_is_of_type(void)
{
- u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
+ u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
- if(gBattleMons[bank].type1 == gAIScriptPtr[2] || gBattleMons[bank].type2 == gAIScriptPtr[2])
- {
- AI_THINKING_STRUCT->funcResult = 1;
- }
+ if (IS_BATTLER_OF_TYPE(battlerId, gAIScriptPtr[2]))
+ AI_THINKING_STRUCT->funcResult = TRUE;
else
- {
- AI_THINKING_STRUCT->funcResult = 0;
- }
+ AI_THINKING_STRUCT->funcResult = FALSE;
gAIScriptPtr += 3;
}
-static void BattleAICmd_get_last_used_bank_move_power(void)
+static void BattleAICmd_get_considered_move_power(void)
{
AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power;
gAIScriptPtr += 1;
}
-static void BattleAICmd_is_most_powerful_move(void)
+static void BattleAICmd_get_how_powerful_move_is(void)
{
s32 i, checkedMove;
s32 moveDmgs[4];
@@ -1202,24 +1180,24 @@ static void BattleAICmd_is_most_powerful_move(void)
gDynamicBasePower = 0;
*(&gBattleStruct->dynamicMoveType) = 0;
gBattleScripting.dmgMultiplier = 1;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gCritMultiplier = 1;
for (checkedMove = 0; checkedMove < 4; checkedMove++)
{
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
{
- if (gBattleMoves[gBattleMons[sBank_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
+ if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
break;
}
- if (gBattleMons[sBank_AI].moves[checkedMove] != MOVE_NONE
+ if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
- && gBattleMoves[gBattleMons[sBank_AI].moves[checkedMove]].power > 1)
+ && gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1)
{
- gCurrentMove = gBattleMons[sBank_AI].moves[checkedMove];
- AI_CalcDmg(sBank_AI, gBankTarget);
- TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
+ gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove];
+ AI_CalcDmg(sBattler_AI, gBattlerTarget);
+ TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;
if (moveDmgs[checkedMove] == 0)
moveDmgs[checkedMove] = 1;
@@ -1237,56 +1215,56 @@ static void BattleAICmd_is_most_powerful_move(void)
}
if (checkedMove == 4)
- AI_THINKING_STRUCT->funcResult = 2; // is the most powerful
+ AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful.
else
- AI_THINKING_STRUCT->funcResult = 1; // not most powerful
+ AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.
}
else
{
- AI_THINKING_STRUCT->funcResult = 0; // highly discouraged in terms of power
+ AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power.
}
gAIScriptPtr++;
}
-static void BattleAICmd_get_last_used_bank_move(void)
+static void BattleAICmd_get_last_used_battler_move(void)
{
if (gAIScriptPtr[1] == AI_USER)
- AI_THINKING_STRUCT->funcResult = gLastUsedMovesByBanks[sBank_AI];
+ AI_THINKING_STRUCT->funcResult = gLastMoves[sBattler_AI];
else
- AI_THINKING_STRUCT->funcResult = gLastUsedMovesByBanks[gBankTarget];
+ AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerTarget];
gAIScriptPtr += 2;
}
-static void BattleAICmd_if_arg_equal(void)
+static void BattleAICmd_if_equal_(void) // Same as if_equal.
{
if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-static void BattleAICmd_if_arg_not_equal(void)
+static void BattleAICmd_if_not_equal_(void) // Same as if_not_equal.
{
if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-static void BattleAICmd_if_would_go_first(void)
+static void BattleAICmd_if_user_goes(void)
{
- if (GetWhoStrikesFirst(sBank_AI, gBankTarget, TRUE) == gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) == gAIScriptPtr[1])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-static void BattleAICmd_if_would_not_go_first(void)
+static void BattleAICmd_if_user_doesnt_go(void)
{
- if (GetWhoStrikesFirst(sBank_AI, gBankTarget, TRUE) != gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) != gAIScriptPtr[1])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -1299,41 +1277,41 @@ static void BattleAICmd_nullsub_2B(void)
{
}
-static void BattleAICmd_count_alive_pokemon(void)
+static void BattleAICmd_count_usable_party_mons(void)
{
- u8 index;
- u8 bankOnField1, bankOnField2;
+ u8 battlerId;
+ u8 battlerOnField1, battlerOnField2;
struct Pokemon *party;
- int i;
+ s32 i;
AI_THINKING_STRUCT->funcResult = 0;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- if (GetBankSide(index) == SIDE_PLAYER)
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- u32 status;
- bankOnField1 = gBattlePartyID[index];
- status = GetBankIdentity(index) ^ 2;
- bankOnField2 = gBattlePartyID[GetBankByIdentity(status)];
+ u32 position;
+ battlerOnField1 = gBattlerPartyIndexes[battlerId];
+ position = GetBattlerPosition(battlerId) ^ BIT_FLANK;
+ battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)];
}
- else // in singles there's only one bank by side
+ else // In singles there's only one battlerId by side.
{
- bankOnField1 = gBattlePartyID[index];
- bankOnField2 = gBattlePartyID[index];
+ battlerOnField1 = gBattlerPartyIndexes[battlerId];
+ battlerOnField2 = gBattlerPartyIndexes[battlerId];
}
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
- if (i != bankOnField1 && i != bankOnField2
+ if (i != battlerOnField1 && i != battlerOnField2
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
@@ -1359,165 +1337,160 @@ static void BattleAICmd_get_considered_move_effect(void)
static void BattleAICmd_get_ability(void)
{
- u8 index;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- index = sBank_AI;
+ battlerId = sBattler_AI;
else
- index = gBankTarget;
+ battlerId = gBattlerTarget;
- if(gActiveBank != index)
+ if (gActiveBattler != battlerId)
{
- if(BATTLE_HISTORY->abilities[index] != 0)
+ if (BATTLE_HISTORY->abilities[battlerId] != 0)
{
- AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[index];
+ AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[battlerId];
gAIScriptPtr += 2;
return;
}
// abilities that prevent fleeing.
- if (gBattleMons[index].ability == ABILITY_SHADOW_TAG
- || gBattleMons[index].ability == ABILITY_MAGNET_PULL
- || gBattleMons[index].ability == ABILITY_ARENA_TRAP)
+ if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG
+ || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL
+ || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)
{
- AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability;
+ AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;
gAIScriptPtr += 2;
return;
}
- if (gBaseStats[gBattleMons[index].species].ability1 != ABILITY_NONE)
+ if (gBaseStats[gBattleMons[battlerId].species].ability1 != ABILITY_NONE)
{
- if (gBaseStats[gBattleMons[index].species].ability2 != ABILITY_NONE)
+ if (gBaseStats[gBattleMons[battlerId].species].ability2 != ABILITY_NONE)
{
// AI has no knowledge of opponent, so it guesses which ability.
if (Random() & 1)
- {
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1;
- }
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1;
else
- {
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2;
- }
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2;
}
else
{
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; // it's definitely ability 1.
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1; // It's definitely ability 1.
}
}
else
{
- AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1.
}
}
else
{
// The AI knows its own ability.
- AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability;
+ AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;
}
+
gAIScriptPtr += 2;
}
static void BattleAICmd_check_ability(void)
{
- u32 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
+ u32 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
u32 ability = gAIScriptPtr[2];
if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER)
{
- if (BATTLE_HISTORY->abilities[bank] != 0)
+ if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE)
{
- ability = BATTLE_HISTORY->abilities[bank];
+ ability = BATTLE_HISTORY->abilities[battlerId];
AI_THINKING_STRUCT->funcResult = ability;
}
- // abilities that prevent fleeing.
- else if (gBattleMons[bank].ability == ABILITY_SHADOW_TAG
- || gBattleMons[bank].ability == ABILITY_MAGNET_PULL
- || gBattleMons[bank].ability == ABILITY_ARENA_TRAP)
+ // Abilities that prevent fleeing.
+ else if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG
+ || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL
+ || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)
{
- ability = gBattleMons[bank].ability;
+ ability = gBattleMons[battlerId].ability;
}
- else if (gBaseStats[gBattleMons[bank].species].ability1 != ABILITY_NONE)
+ else if (gBaseStats[gBattleMons[battlerId].species].ability1 != ABILITY_NONE)
{
- if (gBaseStats[gBattleMons[bank].species].ability2 != ABILITY_NONE)
+ if (gBaseStats[gBattleMons[battlerId].species].ability2 != ABILITY_NONE)
{
- u8 abilityDummyVariable = ability; // needed to match
- if (gBaseStats[gBattleMons[bank].species].ability1 != abilityDummyVariable
- && gBaseStats[gBattleMons[bank].species].ability2 != abilityDummyVariable)
+ u8 abilityDummyVariable = ability; // Needed to match.
+ if (gBaseStats[gBattleMons[battlerId].species].ability1 != abilityDummyVariable
+ && gBaseStats[gBattleMons[battlerId].species].ability2 != abilityDummyVariable)
{
- ability = gBaseStats[gBattleMons[bank].species].ability1;
+ ability = gBaseStats[gBattleMons[battlerId].species].ability1;
}
else
- ability = 0;
+ {
+ ability = ABILITY_NONE;
+ }
}
else
{
- ability = gBaseStats[gBattleMons[bank].species].ability1;
+ ability = gBaseStats[gBattleMons[battlerId].species].ability1;
}
}
else
{
- ability = gBaseStats[gBattleMons[bank].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
+ ability = gBaseStats[gBattleMons[battlerId].species].ability2; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1.
}
}
else
{
// The AI knows its own or partner's ability.
- ability = gBattleMons[bank].ability;
+ ability = gBattleMons[battlerId].ability;
}
+
if (ability == 0)
- {
- AI_THINKING_STRUCT->funcResult = 2; // unable to answer
- }
+ AI_THINKING_STRUCT->funcResult = 2; // Unable to answer.
else if (ability == gAIScriptPtr[2])
- {
- AI_THINKING_STRUCT->funcResult = 1; // pokemon has the ability we wanted to check
- }
+ AI_THINKING_STRUCT->funcResult = 1; // Pokemon has the ability we wanted to check.
else
- {
- AI_THINKING_STRUCT->funcResult = 0; // pokemon doesn't have the ability we wanted to check
- }
+ AI_THINKING_STRUCT->funcResult = 0; // Pokemon doesn't have the ability we wanted to check.
+
gAIScriptPtr += 3;
}
static void BattleAICmd_get_highest_type_effectiveness(void)
{
s32 i;
- u8* dynamicMoveType;
+ u8 *dynamicMoveType;
gDynamicBasePower = 0;
dynamicMoveType = &gBattleStruct->dynamicMoveType;
*dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gCritMultiplier = 1;
AI_THINKING_STRUCT->funcResult = 0;
for (i = 0; i < 4; i++)
{
gBattleMoveDamage = 40;
- gCurrentMove = gBattleMons[sBank_AI].moves[i];
+ gCurrentMove = gBattleMons[sBattler_AI].moves[i];
- if (gCurrentMove)
+ if (gCurrentMove != MOVE_NONE)
{
- TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
+ TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
- // reduce by 1/3.
- if (gBattleMoveDamage == 120)
- gBattleMoveDamage = 80;
+ if (gBattleMoveDamage == 120) // Super effective STAB.
+ gBattleMoveDamage = AI_EFFECTIVENESS_x2;
if (gBattleMoveDamage == 240)
- gBattleMoveDamage = 160;
- if (gBattleMoveDamage == 30)
- gBattleMoveDamage = 20;
+ gBattleMoveDamage = AI_EFFECTIVENESS_x4;
+ if (gBattleMoveDamage == 30) // Not very effective STAB.
+ gBattleMoveDamage = AI_EFFECTIVENESS_x0_5;
if (gBattleMoveDamage == 15)
- gBattleMoveDamage = 10;
+ gBattleMoveDamage = AI_EFFECTIVENESS_x0_25;
- if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
- gBattleMoveDamage = 0;
+ if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
+ gBattleMoveDamage = AI_EFFECTIVENESS_x0;
if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage)
AI_THINKING_STRUCT->funcResult = gBattleMoveDamage;
}
}
+
gAIScriptPtr += 1;
}
@@ -1528,31 +1501,31 @@ static void BattleAICmd_if_type_effectiveness(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gCritMultiplier = 1;
- gBattleMoveDamage = 40;
+ gBattleMoveDamage = AI_EFFECTIVENESS_x1;
gCurrentMove = AI_THINKING_STRUCT->moveConsidered;
- TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
+ TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
- if (gBattleMoveDamage == 120)
- gBattleMoveDamage = 80;
+ if (gBattleMoveDamage == 120) // Super effective STAB.
+ gBattleMoveDamage = AI_EFFECTIVENESS_x2;
if (gBattleMoveDamage == 240)
- gBattleMoveDamage = 160;
- if (gBattleMoveDamage == 30)
- gBattleMoveDamage = 20;
+ gBattleMoveDamage = AI_EFFECTIVENESS_x4;
+ if (gBattleMoveDamage == 30) // Not very effective STAB.
+ gBattleMoveDamage = AI_EFFECTIVENESS_x0_5;
if (gBattleMoveDamage == 15)
- gBattleMoveDamage = 10;
+ gBattleMoveDamage = AI_EFFECTIVENESS_x0_25;
- if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
- gBattleMoveDamage = 0;
+ if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
+ gBattleMoveDamage = AI_EFFECTIVENESS_x0;
- // store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8.
+ // Store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8.
damageVar = gBattleMoveDamage;
if (damageVar == gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -1568,25 +1541,25 @@ static void BattleAICmd_nullsub_33(void)
static void BattleAICmd_if_status_in_party(void)
{
struct Pokemon *party;
- int i;
+ s32 i;
u32 statusToCompareTo;
- u8 index;
+ u8 battlerId;
- switch(gAIScriptPtr[1])
+ switch (gAIScriptPtr[1])
{
- case AI_USER:
- index = sBank_AI;
- break;
- default:
- index = gBankTarget;
- break;
+ case AI_USER:
+ battlerId = sBattler_AI;
+ break;
+ default:
+ battlerId = gBattlerTarget;
+ break;
}
- party = (GetBankSide(index) == 0) ? gPlayerParty : gEnemyParty;
+ party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
- statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
+ statusToCompareTo = T1_READ_32(gAIScriptPtr + 2);
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&party[i], MON_DATA_SPECIES);
u16 hp = GetMonData(&party[i], MON_DATA_HP);
@@ -1594,7 +1567,7 @@ static void BattleAICmd_if_status_in_party(void)
if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo)
{
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
return;
}
}
@@ -1605,25 +1578,25 @@ static void BattleAICmd_if_status_in_party(void)
static void BattleAICmd_if_status_not_in_party(void)
{
struct Pokemon *party;
- int i;
+ s32 i;
u32 statusToCompareTo;
- u8 index;
+ u8 battlerId;
switch(gAIScriptPtr[1])
{
- case 1:
- index = sBank_AI;
- break;
- default:
- index = gBankTarget;
- break;
+ case 1:
+ battlerId = sBattler_AI;
+ break;
+ default:
+ battlerId = gBattlerTarget;
+ break;
}
- party = (GetBankSide(index) == 0) ? gPlayerParty : gEnemyParty;
+ party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
- statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
+ statusToCompareTo = T1_READ_32(gAIScriptPtr + 2);
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&party[i], MON_DATA_SPECIES);
u16 hp = GetMonData(&party[i], MON_DATA_HP);
@@ -1631,23 +1604,24 @@ static void BattleAICmd_if_status_not_in_party(void)
if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo)
{
- gAIScriptPtr += 10; // still bugged in Emerald
+ gAIScriptPtr += 10; // UB: Still bugged in Emerald. Uncomment the return statement to fix.
+ // return;
}
}
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6);
}
static void BattleAICmd_get_weather(void)
{
if (gBattleWeather & WEATHER_RAIN_ANY)
- AI_THINKING_STRUCT->funcResult = 1;
+ AI_THINKING_STRUCT->funcResult = AI_WEATHER_RAIN;
if (gBattleWeather & WEATHER_SANDSTORM_ANY)
- AI_THINKING_STRUCT->funcResult = 2;
+ AI_THINKING_STRUCT->funcResult = AI_WEATHER_SANDSTORM;
if (gBattleWeather & WEATHER_SUN_ANY)
- AI_THINKING_STRUCT->funcResult = 0;
+ AI_THINKING_STRUCT->funcResult = AI_WEATHER_SUN;
if (gBattleWeather & WEATHER_HAIL_ANY)
- AI_THINKING_STRUCT->funcResult = 3;
+ AI_THINKING_STRUCT->funcResult = AI_WEATHER_HAIL;
gAIScriptPtr += 1;
}
@@ -1655,7 +1629,7 @@ static void BattleAICmd_get_weather(void)
static void BattleAICmd_if_effect(void)
{
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -1663,67 +1637,67 @@ static void BattleAICmd_if_effect(void)
static void BattleAICmd_if_not_effect(void)
{
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != gAIScriptPtr[1])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
static void BattleAICmd_if_stat_level_less_than(void)
{
- u32 bank;
+ u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- if (gBattleMons[bank].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
}
static void BattleAICmd_if_stat_level_more_than(void)
{
- u32 bank;
+ u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- if (gBattleMons[bank].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
}
static void BattleAICmd_if_stat_level_equal(void)
{
- u32 bank;
+ u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- if (gBattleMons[bank].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
}
static void BattleAICmd_if_stat_level_not_equal(void)
{
- u32 bank;
+ u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- if (gBattleMons[bank].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3])
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
}
@@ -1739,20 +1713,20 @@ static void BattleAICmd_if_can_faint(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gCritMultiplier = 1;
gCurrentMove = AI_THINKING_STRUCT->moveConsidered;
- AI_CalcDmg(sBank_AI, gBankTarget);
- TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
+ AI_CalcDmg(sBattler_AI, gBattlerTarget);
+ TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
- // moves always do at least 1 damage.
+ // Moves always do at least 1 damage.
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if (gBattleMons[gBankTarget].hp <= gBattleMoveDamage)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
}
@@ -1768,136 +1742,111 @@ static void BattleAICmd_if_cant_faint(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gCritMultiplier = 1;
gCurrentMove = AI_THINKING_STRUCT->moveConsidered;
- AI_CalcDmg(sBank_AI, gBankTarget);
- TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
+ AI_CalcDmg(sBattler_AI, gBattlerTarget);
+ TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
- // this macro is missing the damage 0 = 1 assumption.
+ // This macro is missing the damage 0 = 1 assumption.
- if (gBattleMons[gBankTarget].hp > gBattleMoveDamage)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
}
static void BattleAICmd_if_has_move(void)
{
- int i;
- const u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
+ s32 i;
+ const u16 *movePtr = (u16 *)(gAIScriptPtr + 2);
- switch(gAIScriptPtr[1])
+ switch (gAIScriptPtr[1])
{
- case AI_USER:
- for (i = 0; i < 4; i++)
- {
- if (gBattleMons[sBank_AI].moves[i] == *temp_ptr)
- break;
- }
- if (i == 4)
- {
- gAIScriptPtr += 8;
- return;
- }
- else
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
- return;
- }
- case AI_USER_PARTNER:
- if (gBattleMons[sBank_AI ^ 2].hp == 0)
- {
- gAIScriptPtr += 8;
- return;
- }
- else
- {
- for (i = 0; i < 4; i++)
- {
- if (gBattleMons[sBank_AI ^ 2].moves[i] == *temp_ptr)
- break;
- }
- }
- if (i == 4)
- {
- gAIScriptPtr += 8;
- return;
- }
- else
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
- return;
- }
- case AI_TARGET:
- case AI_TARGET_PARTNER:
+ case AI_USER:
+ for (i = 0; i < 4; i++)
+ {
+ if (gBattleMons[sBattler_AI].moves[i] == *movePtr)
+ break;
+ }
+ if (i == 4)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
+ break;
+ case AI_USER_PARTNER:
+ if (gBattleMons[sBattler_AI ^ BIT_FLANK].hp == 0)
+ {
+ gAIScriptPtr += 8;
+ break;
+ }
+ else
+ {
for (i = 0; i < 4; i++)
{
- if (BATTLE_HISTORY->usedMoves[gBankTarget].moves[i] == *temp_ptr)
+ if (gBattleMons[sBattler_AI ^ BIT_FLANK].moves[i] == *movePtr)
break;
}
- if (i == 4)
- {
- gAIScriptPtr += 8;
- return;
- }
- else
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
- return;
- }
+ }
+ if (i == 4)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
+ break;
+ case AI_TARGET:
+ case AI_TARGET_PARTNER:
+ for (i = 0; i < 4; i++)
+ {
+ if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr)
+ break;
+ }
+ if (i == 4)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
+ break;
}
}
-static void BattleAICmd_if_dont_have_move(void)
+static void BattleAICmd_if_doesnt_have_move(void)
{
- int i;
- const u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
+ s32 i;
+ const u16 *movePtr = (u16 *)(gAIScriptPtr + 2);
switch(gAIScriptPtr[1])
{
- case AI_USER:
- case AI_USER_PARTNER: // UB: no separate check for user partner
- for (i = 0; i < 4; i++)
- {
- if (gBattleMons[sBank_AI].moves[i] == *temp_ptr)
- break;
- }
- if (i != 4)
- {
- gAIScriptPtr += 8;
- return;
- }
- else
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
- return;
- }
- case AI_TARGET:
- case AI_TARGET_PARTNER:
- for (i = 0; i < 4; i++)
- {
- if (BATTLE_HISTORY->usedMoves[gBankTarget].moves[i] == *temp_ptr)
- break;
- }
- if (i != 4)
- {
- gAIScriptPtr += 8;
- return;
- }
- else
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
- return;
- }
+ case AI_USER:
+ case AI_USER_PARTNER: // UB: no separate check for user partner.
+ for (i = 0; i < 4; i++)
+ {
+ if (gBattleMons[sBattler_AI].moves[i] == *movePtr)
+ break;
+ }
+ if (i != 4)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
+ break;
+ case AI_TARGET:
+ case AI_TARGET_PARTNER:
+ for (i = 0; i < 4; i++)
+ {
+ if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr)
+ break;
+ }
+ if (i != 4)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
+ break;
}
}
-static void BattleAICmd_if_move_effect(void)
+static void BattleAICmd_if_has_move_with_effect(void)
{
- int i;
+ s32 i;
switch (gAIScriptPtr[1])
{
@@ -1905,32 +1854,33 @@ static void BattleAICmd_if_move_effect(void)
case AI_USER_PARTNER:
for (i = 0; i < 4; i++)
{
- if(gBattleMons[sBank_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBank_AI].moves[i]].effect == gAIScriptPtr[2])
+ if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i == 4)
gAIScriptPtr += 7;
else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
break;
case AI_TARGET:
case AI_TARGET_PARTNER:
for (i = 0; i < 4; i++)
{
- if (gBattleMons[sBank_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBankTarget].moves[i]].effect == gAIScriptPtr[2])
+ // UB: checks sBattler_AI instead of gBattlerTarget.
+ if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i == 4)
gAIScriptPtr += 7;
else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
break;
}
}
-static void BattleAICmd_if_not_move_effect(void)
+static void BattleAICmd_if_doesnt_have_move_with_effect(void)
{
- int i;
+ s32 i;
switch (gAIScriptPtr[1])
{
@@ -1938,59 +1888,56 @@ static void BattleAICmd_if_not_move_effect(void)
case AI_USER_PARTNER:
for (i = 0; i < 4; i++)
{
- if(gBattleMons[sBank_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBank_AI].moves[i]].effect == gAIScriptPtr[2])
+ if(gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i != 4)
gAIScriptPtr += 7;
else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
break;
case AI_TARGET:
case AI_TARGET_PARTNER:
for (i = 0; i < 4; i++)
{
- if (BATTLE_HISTORY->usedMoves[gBankTarget].moves[i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBankTarget].moves[i]].effect == gAIScriptPtr[2])
+ if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i != 4)
gAIScriptPtr += 7;
else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
break;
}
}
static void BattleAICmd_if_any_move_disabled_or_encored(void)
{
- u8 bank;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
if (gAIScriptPtr[2] == 0)
{
- if (gDisableStructs[bank].disabledMove == 0)
- {
+ if (gDisableStructs[battlerId].disabledMove == MOVE_NONE)
gAIScriptPtr += 7;
- return;
- }
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
- return;
+ else
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
}
- else if (gAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1.
+ else if (gAIScriptPtr[2] != 1)
{
gAIScriptPtr += 7;
- return;
}
- else if (gDisableStructs[bank].encoredMove != 0)
+ else
{
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
- return;
+ if (gDisableStructs[battlerId].encoredMove != MOVE_NONE)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
+ else
+ gAIScriptPtr += 7;
}
- gAIScriptPtr += 7;
}
static void BattleAICmd_if_curr_move_disabled_or_encored(void)
@@ -1998,24 +1945,20 @@ static void BattleAICmd_if_curr_move_disabled_or_encored(void)
switch (gAIScriptPtr[1])
{
case 0:
- if (gDisableStructs[gActiveBank].disabledMove == AI_THINKING_STRUCT->moveConsidered)
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
- return;
- }
- gAIScriptPtr += 6;
- return;
+ if (gDisableStructs[gActiveBattler].disabledMove == AI_THINKING_STRUCT->moveConsidered)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
+ break;
case 1:
- if (gDisableStructs[gActiveBank].encoredMove == AI_THINKING_STRUCT->moveConsidered)
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
- return;
- }
- gAIScriptPtr += 6;
- return;
+ if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
+ break;
default:
gAIScriptPtr += 6;
- return;
+ break;
}
}
@@ -2024,12 +1967,12 @@ static void BattleAICmd_flee(void)
AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK);
}
-static void BattleAICmd_if_random_100(void)
+static void BattleAICmd_if_random_safari_flee(void)
{
- u8 safariFleeRate = gBattleStruct->field_7B * 5; // safari flee rate, from 0-20
+ u8 safariFleeRate = gBattleStruct->safariEscapeFactor * 5; // Safari flee rate, from 0-20.
if ((u8)(Random() % 100) < safariFleeRate)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
}
@@ -2041,83 +1984,80 @@ static void BattleAICmd_watch(void)
static void BattleAICmd_get_hold_effect(void)
{
- u8 bank;
- u16 status;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- if (gActiveBank != bank)
- {
- AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[bank]);
- }
+ if (gActiveBattler != battlerId)
+ AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[battlerId]);
else
- AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[bank].item);
+ AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item);
gAIScriptPtr += 2;
}
static void BattleAICmd_if_holds_item(void)
{
- u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
+ u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
u16 item;
u8 var1, var2;
- if ((bank & BIT_SIDE) == (sBank_AI & BIT_SIDE))
- item = gBattleMons[bank].item;
+ if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
+ item = gBattleMons[battlerId].item;
else
- item = BATTLE_HISTORY->itemEffects[bank];
+ item = BATTLE_HISTORY->itemEffects[battlerId];
// UB: doesn't properly read an unaligned u16
var2 = gAIScriptPtr[2];
var1 = gAIScriptPtr[3];
if ((var1 | var2) == item)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
}
static void BattleAICmd_get_gender(void)
{
- u8 bank;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[bank].species, gBattleMons[bank].personality);
+ AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species, gBattleMons[battlerId].personality);
gAIScriptPtr += 2;
}
-static void BattleAICmd_is_first_turn(void)
+static void BattleAICmd_is_first_turn_for(void)
{
- u8 bank;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].isFirstTurn;
+ AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].isFirstTurn;
gAIScriptPtr += 2;
}
static void BattleAICmd_get_stockpile_count(void)
{
- u8 bank;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].stockpileCounter;
+ AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].stockpileCounter;
gAIScriptPtr += 2;
}
@@ -2131,18 +2071,18 @@ static void BattleAICmd_is_double_battle(void)
static void BattleAICmd_get_used_held_item(void)
{
- u8 bank;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- // This is likely a leftover from Ruby's code and its ugly ewram access
+ // This is likely a leftover from Ruby's code and its ugly ewram access.
#ifdef NONMATCHING
- AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[bank];
+ AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId];
#else
- AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (bank * 2));
+ AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2));
#endif // NONMATCHING
gAIScriptPtr += 2;
@@ -2171,14 +2111,14 @@ static void BattleAICmd_get_move_effect_from_result(void)
static void BattleAICmd_get_protect_count(void)
{
- u8 bank;
+ u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
- bank = sBank_AI;
+ battlerId = sBattler_AI;
else
- bank = gBankTarget;
+ battlerId = gBattlerTarget;
- AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].protectUses;
+ AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].protectUses;
gAIScriptPtr += 2;
}
@@ -2210,12 +2150,12 @@ static void BattleAICmd_nullsub_57(void)
static void BattleAICmd_call(void)
{
AIStackPushVar(gAIScriptPtr + 5);
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
}
-static void BattleAICmd_jump(void)
+static void BattleAICmd_goto(void)
{
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
}
static void BattleAICmd_end(void)
@@ -2229,62 +2169,56 @@ static void BattleAICmd_if_level_cond(void)
switch (gAIScriptPtr[1])
{
case 0: // greater than
- if (gBattleMons[sBank_AI].level > gBattleMons[gBankTarget].level)
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
- return;
- }
- gAIScriptPtr += 6;
- return;
+ if (gBattleMons[sBattler_AI].level > gBattleMons[gBattlerTarget].level)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
+ break;
case 1: // less than
- if (gBattleMons[sBank_AI].level < gBattleMons[gBankTarget].level)
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
- return;
- }
- gAIScriptPtr += 6;
- return;
+ if (gBattleMons[sBattler_AI].level < gBattleMons[gBattlerTarget].level)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
+ break;
case 2: // equal
- if (gBattleMons[sBank_AI].level == gBattleMons[gBankTarget].level)
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
- return;
- }
- gAIScriptPtr += 6;
- return;
+ if (gBattleMons[sBattler_AI].level == gBattleMons[gBattlerTarget].level)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
+ break;
}
}
static void BattleAICmd_if_target_taunted(void)
{
- if (gDisableStructs[gBankTarget].tauntTimer1 != 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ if (gDisableStructs[gBattlerTarget].tauntTimer1 != 0)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
}
static void BattleAICmd_if_target_not_taunted(void)
{
- if (gDisableStructs[gBankTarget].tauntTimer1 == 0)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ if (gDisableStructs[gBattlerTarget].tauntTimer1 == 0)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
}
static void BattleAICmd_if_target_is_ally(void)
{
- if((sBank_AI & 1) == (gBankTarget & 1))
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ if ((sBattler_AI & BIT_SIDE) == (gBattlerTarget & BIT_SIDE))
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
}
static void BattleAICmd_if_flash_fired(void)
{
- u8 index = BattleAI_GetWantedBank(gAIScriptPtr[1]);
+ u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
- if(gBattleResources->flags->flags[index] & UNKNOWN_FLAG_FLASH_FIRE)
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ if (gBattleResources->flags->flags[battlerId] & UNKNOWN_FLAG_FLASH_FIRE)
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -2308,5 +2242,7 @@ static bool8 AIStackPop(void)
return TRUE;
}
else
+ {
return FALSE;
+ }
}
diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c
index 75d144c3d..a105e7edf 100644
--- a/src/battle_ai_switch_items.c
+++ b/src/battle_ai_switch_items.c
@@ -1,32 +1,13 @@
#include "global.h"
#include "battle.h"
#include "battle_controllers.h"
-#include "abilities.h"
-#include "moves.h"
+#include "constants/abilities.h"
+#include "constants/moves.h"
#include "pokemon.h"
-#include "species.h"
-#include "rng.h"
+#include "constants/species.h"
+#include "random.h"
#include "util.h"
-#include "items.h"
-#include "pokemon_item_effects.h"
-
-extern u8 gActiveBank;
-extern u8 gAbsentBankFlags;
-extern u32 gBattleTypeFlags;
-extern u32 gStatuses3[BATTLE_BANKS_COUNT];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u16 gUnknown_02024250[BATTLE_BANKS_COUNT];
-extern u8 gUnknown_02024270[BATTLE_BANKS_COUNT];
-extern u16 gDynamicBasePower;
-extern u8 gBattleMoveFlags;
-extern u8 gCritMultiplier;
-extern s32 gBattleMoveDamage;
-
-extern const struct BattleMove gBattleMoves[];
-extern const struct BaseStats gBaseStats[];
-extern const u8 gTypeEffectiveness[];
-extern const u8 * const gItemEffectTable[]; // todo: fix once struct is declared
+#include "constants/items.h"
// this file's functions
static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng);
@@ -35,21 +16,23 @@ static bool8 ShouldUseItem(void);
static bool8 ShouldSwitchIfPerishSong(void)
{
- if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG
- && gDisableStructs[gActiveBank].perishSongTimer1 == 0)
+ if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG
+ && gDisableStructs[gActiveBattler].perishSongTimer1 == 0)
{
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
-
- return FALSE;
+ else
+ {
+ return FALSE;
+ }
}
static bool8 ShouldSwitchIfWonderGuard(void)
{
- u8 opposingIdentity;
- u8 opposingBank;
+ u8 opposingPosition;
+ u8 opposingBattler;
u8 moveFlags;
s32 i, j;
s32 firstId;
@@ -60,27 +43,27 @@ static bool8 ShouldSwitchIfWonderGuard(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
return FALSE;
- opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
+ opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler));
- if (gBattleMons[GetBankByIdentity(opposingIdentity)].ability != ABILITY_WONDER_GUARD)
+ if (gBattleMons[GetBattlerAtPosition(opposingPosition)].ability != ABILITY_WONDER_GUARD)
return FALSE;
- // check if pokemon has a super effective move
- for (opposingBank = GetBankByIdentity(opposingIdentity), i = 0; i < 4; i++)
+ // Check if Pokemon has a super effective move.
+ for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; i++)
{
- move = gBattleMons[gActiveBank].moves[i];
+ move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
- moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
- if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);
+ if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
return FALSE;
}
- // get party information
+ // Get party information.
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if ((gActiveBank & BIT_MON) == 0)
+ if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -90,12 +73,12 @@ static bool8 ShouldSwitchIfWonderGuard(void)
firstId = 0, lastId = 6;
}
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
- // find a pokemon in the party that has a super effective move
+ // Find a Pokemon in the party that has a super effective move.
for (i = firstId; i < lastId; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) == 0)
@@ -104,35 +87,35 @@ static bool8 ShouldSwitchIfWonderGuard(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
- if (i == gBattlePartyID[gActiveBank])
+ if (i == gBattlerPartyIndexes[gActiveBattler])
continue;
- GetMonData(&party[i], MON_DATA_SPECIES); // unused return value
- GetMonData(&party[i], MON_DATA_ALT_ABILITY); // unused return value
+ GetMonData(&party[i], MON_DATA_SPECIES); // Unused return value.
+ GetMonData(&party[i], MON_DATA_ALT_ABILITY); // Unused return value.
- for (opposingBank = GetBankByIdentity(opposingIdentity), j = 0; j < 4; j++)
+ for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
if (move == MOVE_NONE)
continue;
- moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
- if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % 3 < 2)
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);
+ if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2)
{
- // we found a mon
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = i;
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ // We found a mon.
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
}
- return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard
+ return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard.
}
static bool8 FindMonThatAbsorbsOpponentsMove(void)
{
- u8 bankIn1, bankIn2;
+ u8 battlerIn1, battlerIn2;
u8 absorbingTypeAbility;
s32 firstId;
s32 lastId; // + 1
@@ -141,42 +124,42 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3 != 0)
return FALSE;
- if (gUnknown_02024250[gActiveBank] == 0)
+ if (gLastLandedMoves[gActiveBattler] == 0)
return FALSE;
- if (gUnknown_02024250[gActiveBank] == 0xFFFF)
+ if (gLastLandedMoves[gActiveBattler] == 0xFFFF)
return FALSE;
- if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
+ if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- bankIn1 = gActiveBank;
- if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
- bankIn2 = gActiveBank;
+ battlerIn1 = gActiveBattler;
+ if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])
+ battlerIn2 = gActiveBattler;
else
- bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
+ battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));
}
else
{
- bankIn1 = gActiveBank;
- bankIn2 = gActiveBank;
+ battlerIn1 = gActiveBattler;
+ battlerIn2 = gActiveBattler;
}
- if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_FIRE)
+ if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE)
absorbingTypeAbility = ABILITY_FLASH_FIRE;
- else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_WATER)
+ else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_WATER)
absorbingTypeAbility = ABILITY_WATER_ABSORB;
- else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_ELECTRIC)
+ else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_ELECTRIC)
absorbingTypeAbility = ABILITY_VOLT_ABSORB;
else
return FALSE;
- if (gBattleMons[gActiveBank].ability == absorbingTypeAbility)
+ if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility)
return FALSE;
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if ((gActiveBank & BIT_MON) == 0)
+ if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -186,7 +169,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
firstId = 0, lastId = 6;
}
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -202,13 +185,13 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
- if (i == gBattlePartyID[bankIn1])
+ if (i == gBattlerPartyIndexes[battlerIn1])
continue;
- if (i == gBattlePartyID[bankIn2])
+ if (i == gBattlerPartyIndexes[battlerIn2])
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))
continue;
species = GetMonData(&party[i], MON_DATA_SPECIES);
@@ -219,9 +202,9 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
if (absorbingTypeAbility == monAbility && Random() & 1)
{
- // we found a mon
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = i;
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ // we found a mon.
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -231,34 +214,35 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
static bool8 ShouldSwitchIfNaturalCure(void)
{
- if (!(gBattleMons[gActiveBank].status1 & STATUS_SLEEP))
+ if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
return FALSE;
- if (gBattleMons[gActiveBank].ability != ABILITY_NATURAL_CURE)
+ if (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE)
return FALSE;
- if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 2)
+ if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2)
return FALSE;
- if ((gUnknown_02024250[gActiveBank] == 0 || gUnknown_02024250[gActiveBank] == 0xFFFF) && Random() & 1)
+ if ((gLastLandedMoves[gActiveBattler] == 0 || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1)
{
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
- else if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0 && Random() & 1)
+ else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1)
{
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
- if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 1))
+ if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 1))
return TRUE;
- if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 1))
+ if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1))
return TRUE;
+
if (Random() & 1)
{
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@@ -267,25 +251,25 @@ static bool8 ShouldSwitchIfNaturalCure(void)
static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
{
- u8 opposingIdentity;
- u8 opposingBank;
+ u8 opposingPosition;
+ u8 opposingBattler;
s32 i;
u8 moveFlags;
u16 move;
- opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
- opposingBank = GetBankByIdentity(opposingIdentity);
+ opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler));
+ opposingBattler = GetBattlerAtPosition(opposingPosition);
- if (!(gAbsentBankFlags & gBitTable[opposingBank]))
+ if (!(gAbsentBattlerFlags & gBitTable[opposingBattler]))
{
for (i = 0; i < 4; i++)
{
- move = gBattleMons[gActiveBank].moves[i];
+ move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
- moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
- if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);
+ if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
{
if (noRng)
return TRUE;
@@ -297,18 +281,18 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
return FALSE;
- opposingBank = GetBankByIdentity(opposingIdentity ^ BIT_MON);
+ opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition));
- if (!(gAbsentBankFlags & gBitTable[opposingBank]))
+ if (!(gAbsentBattlerFlags & gBitTable[opposingBattler]))
{
for (i = 0; i < 4; i++)
{
- move = gBattleMons[gActiveBank].moves[i];
+ move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
- moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
- if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);
+ if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
{
if (noRng)
return TRUE;
@@ -328,8 +312,8 @@ static bool8 AreStatsRaised(void)
for (i = 0; i < BATTLE_STATS_NO; i++)
{
- if (gBattleMons[gActiveBank].statStages[i] > 6)
- buffedStatsValue += gBattleMons[gActiveBank].statStages[i] - 6;
+ if (gBattleMons[gActiveBattler].statStages[i] > 6)
+ buffedStatsValue += gBattleMons[gActiveBattler].statStages[i] - 6;
}
return (buffedStatsValue > 3);
@@ -337,7 +321,7 @@ static bool8 AreStatsRaised(void)
static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
{
- u8 bankIn1, bankIn2;
+ u8 battlerIn1, battlerIn2;
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
@@ -345,32 +329,32 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
u16 move;
u8 moveFlags;
- if (gUnknown_02024250[gActiveBank] == 0)
+ if (gLastLandedMoves[gActiveBattler] == 0)
return FALSE;
- if (gUnknown_02024250[gActiveBank] == 0xFFFF)
+ if (gLastLandedMoves[gActiveBattler] == 0xFFFF)
return FALSE;
- if (gUnknown_02024270[gActiveBank] == 0xFF)
+ if (gLastHitBy[gActiveBattler] == 0xFF)
return FALSE;
- if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
+ if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- bankIn1 = gActiveBank;
- if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
- bankIn2 = gActiveBank;
+ battlerIn1 = gActiveBattler;
+ if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])
+ battlerIn2 = gActiveBattler;
else
- bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
+ battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));
}
else
{
- bankIn1 = gActiveBank;
- bankIn2 = gActiveBank;
+ battlerIn1 = gActiveBattler;
+ battlerIn2 = gActiveBattler;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if ((gActiveBank & BIT_MON) == 0)
+ if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -380,7 +364,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
firstId = 0, lastId = 6;
}
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -396,13 +380,13 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
- if (i == gBattlePartyID[bankIn1])
+ if (i == gBattlerPartyIndexes[battlerIn1])
continue;
- if (i == gBattlePartyID[bankIn2])
+ if (i == gBattlerPartyIndexes[battlerIn2])
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))
continue;
species = GetMonData(&party[i], MON_DATA_SPECIES);
@@ -411,10 +395,10 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
else
monAbility = gBaseStats[species].ability1;
- moveFlags = AI_TypeCalc(gUnknown_02024250[gActiveBank], species, monAbility);
+ moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility);
if (moveFlags & flags)
{
- bankIn1 = gUnknown_02024270[gActiveBank];
+ battlerIn1 = gLastHitBy[gActiveBattler];
for (j = 0; j < 4; j++)
{
@@ -422,11 +406,11 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
if (move == 0)
continue;
- moveFlags = AI_TypeCalc(move, gBattleMons[bankIn1].species, gBattleMons[bankIn1].ability);
- if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % moduloPercent == 0)
+ moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability);
+ if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0)
{
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = i;
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -438,27 +422,27 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
static bool8 ShouldSwitch(void)
{
- u8 bankIn1, bankIn2;
- u8 *activeBankPtr; // needed to match
+ u8 battlerIn1, battlerIn2;
+ u8 *activeBattlerPtr; // Needed to match.
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
s32 i;
s32 availableToSwitch;
- if (gBattleMons[*(activeBankPtr = &gActiveBank)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
+ if (gBattleMons[*(activeBattlerPtr = &gActiveBattler)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
+ return FALSE;
+ if (gStatuses3[gActiveBattler] & STATUS3_ROOTED)
return FALSE;
- if (gStatuses3[gActiveBank] & STATUS3_ROOTED)
+ if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG))
return FALSE;
- if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_SHADOW_TAG, 0, 0))
+ if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) // Misses the flying type and Levitate check.
return FALSE;
- if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_ARENA_TRAP, 0, 0))
- return FALSE; // misses the flying or levitate check
- if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0))
+ if (ABILITY_ON_FIELD2(ABILITY_MAGNET_PULL))
{
- if (gBattleMons[gActiveBank].type1 == TYPE_STEEL)
+ if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL)
return FALSE;
- if (gBattleMons[gActiveBank].type2 == TYPE_STEEL)
+ if (gBattleMons[gActiveBattler].type2 == TYPE_STEEL)
return FALSE;
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
@@ -467,21 +451,21 @@ static bool8 ShouldSwitch(void)
availableToSwitch = 0;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- bankIn1 = *activeBankPtr;
- if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON)])
- bankIn2 = *activeBankPtr;
+ battlerIn1 = *activeBattlerPtr;
+ if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(*activeBattlerPtr) ^ BIT_FLANK)])
+ battlerIn2 = *activeBattlerPtr;
else
- bankIn2 = GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON);
+ battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(*activeBattlerPtr) ^ BIT_FLANK);
}
else
{
- bankIn1 = *activeBankPtr;
- bankIn2 = *activeBankPtr;
+ battlerIn1 = *activeBattlerPtr;
+ battlerIn2 = *activeBattlerPtr;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if ((gActiveBank & BIT_MON) == 0)
+ if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -491,7 +475,7 @@ static bool8 ShouldSwitch(void)
firstId = 0, lastId = 6;
}
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -504,13 +488,13 @@ static bool8 ShouldSwitch(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
- if (i == gBattlePartyID[bankIn1])
+ if (i == gBattlerPartyIndexes[battlerIn1])
continue;
- if (i == gBattlePartyID[bankIn2])
+ if (i == gBattlerPartyIndexes[battlerIn2])
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))
continue;
availableToSwitch++;
@@ -530,8 +514,8 @@ static bool8 ShouldSwitch(void)
return FALSE;
if (AreStatsRaised())
return FALSE;
- if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 2)
- || FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 3))
+ if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 2)
+ || FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 3))
return TRUE;
return FALSE;
@@ -540,12 +524,12 @@ static bool8 ShouldSwitch(void)
void AI_TrySwitchOrUseItem(void)
{
struct Pokemon *party;
- u8 bankIn1, bankIn2;
+ u8 battlerIn1, battlerIn2;
s32 firstId;
s32 lastId; // + 1
- u8 bankIdentity = GetBankIdentity(gActiveBank);
+ u8 battlerIdentity = GetBattlerPosition(gActiveBattler);
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -554,25 +538,25 @@ void AI_TrySwitchOrUseItem(void)
{
if (ShouldSwitch())
{
- if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) == 6)
+ if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == PARTY_SIZE)
{
s32 monToSwitchId = GetMostSuitableMonToSwitchInto();
- if (monToSwitchId == 6)
+ if (monToSwitchId == PARTY_SIZE)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- bankIn1 = GetBankByIdentity(bankIdentity);
- bankIn2 = bankIn1;
+ battlerIn1 = GetBattlerAtPosition(battlerIdentity);
+ battlerIn2 = battlerIn1;
}
else
{
- bankIn1 = GetBankByIdentity(bankIdentity);
- bankIn2 = GetBankByIdentity(bankIdentity ^ BIT_MON);
+ battlerIn1 = GetBattlerAtPosition(battlerIdentity);
+ battlerIn2 = GetBattlerAtPosition(battlerIdentity ^ BIT_FLANK);
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if ((gActiveBank & BIT_MON) == 0)
+ if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -586,23 +570,23 @@ void AI_TrySwitchOrUseItem(void)
{
if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0)
continue;
- if (monToSwitchId == gBattlePartyID[bankIn1])
+ if (monToSwitchId == gBattlerPartyIndexes[battlerIn1])
continue;
- if (monToSwitchId == gBattlePartyID[bankIn2])
+ if (monToSwitchId == gBattlerPartyIndexes[battlerIn2])
continue;
- if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + bankIn1))
+ if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + battlerIn1))
continue;
- if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + bankIn2))
+ if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + battlerIn2))
continue;
break;
}
}
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = monToSwitchId;
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = monToSwitchId;
}
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank);
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler);
return;
}
else if (ShouldUseItem())
@@ -611,7 +595,7 @@ void AI_TrySwitchOrUseItem(void)
}
}
- EmitTwoReturnValues(1, ACTION_USE_MOVE, (gActiveBank ^ BIT_SIDE) << 8);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8);
}
static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var)
@@ -627,10 +611,10 @@ static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8
}
else if (TYPE_EFFECT_ATK_TYPE(i) == atkType)
{
- // check type1
+ // Check type1.
if (TYPE_EFFECT_DEF_TYPE(i) == defType1)
*var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10;
- // check type2
+ // Check type2.
if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2)
*var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10;
}
@@ -640,10 +624,10 @@ static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8
u8 GetMostSuitableMonToSwitchInto(void)
{
- u8 opposingBank;
- u8 bestDmg; // note : should be changed to u32 for obvious reasons
+ u8 opposingBattler;
+ u8 bestDmg; // Note : should be changed to u32 for obvious reasons.
u8 bestMonId;
- u8 bankIn1, bankIn2;
+ u8 battlerIn1, battlerIn2;
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
@@ -651,34 +635,34 @@ u8 GetMostSuitableMonToSwitchInto(void)
u8 invalidMons;
u16 move;
- if (*(gBattleStruct->monToSwitchIntoId + gActiveBank) != 6)
- return *(gBattleStruct->monToSwitchIntoId + gActiveBank);
+ if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE)
+ return *(gBattleStruct->monToSwitchIntoId + gActiveBattler);
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
- return gBattlePartyID[gActiveBank] + 1;
+ return gBattlerPartyIndexes[gActiveBattler] + 1;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- bankIn1 = gActiveBank;
- if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
- bankIn2 = gActiveBank;
+ battlerIn1 = gActiveBattler;
+ if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)])
+ battlerIn2 = gActiveBattler;
else
- bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
+ battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK);
- // UB: It considers the opponent only player's side even though it can battle alongside player;
- opposingBank = Random() & BIT_MON;
- if (gAbsentBankFlags & gBitTable[opposingBank])
- opposingBank ^= BIT_MON;
+ // UB: It considers the opponent only player's side even though it can battle alongside player.
+ opposingBattler = Random() & BIT_FLANK;
+ if (gAbsentBattlerFlags & gBitTable[opposingBattler])
+ opposingBattler ^= BIT_FLANK;
}
else
{
- opposingBank = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_SIDE);
- bankIn1 = gActiveBank;
- bankIn2 = gActiveBank;
+ opposingBattler = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_SIDE);
+ battlerIn1 = gActiveBattler;
+ battlerIn2 = gActiveBattler;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if ((gActiveBank & BIT_MON) == 0)
+ if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -688,34 +672,34 @@ u8 GetMostSuitableMonToSwitchInto(void)
firstId = 0, lastId = 6;
}
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
invalidMons = 0;
- while (invalidMons != 0x3F) // all mons are invalid
+ while (invalidMons != 0x3F) // All mons are invalid.
{
bestDmg = 0;
bestMonId = 6;
- // find the mon which type is the most suitable offensively
+ // Find the mon whose type is the most suitable offensively.
for (i = firstId; i < lastId; i++)
{
u16 species = GetMonData(&party[i], MON_DATA_SPECIES);
if (species != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& !(gBitTable[i] & invalidMons)
- && gBattlePartyID[bankIn1] != i
- && gBattlePartyID[bankIn2] != i
- && i != *(gBattleStruct->monToSwitchIntoId + bankIn1)
- && i != *(gBattleStruct->monToSwitchIntoId + bankIn2))
+ && gBattlerPartyIndexes[battlerIn1] != i
+ && gBattlerPartyIndexes[battlerIn2] != i
+ && i != *(gBattleStruct->monToSwitchIntoId + battlerIn1)
+ && i != *(gBattleStruct->monToSwitchIntoId + battlerIn2))
{
u8 type1 = gBaseStats[species].type1;
u8 type2 = gBaseStats[species].type2;
u8 typeDmg = 10;
- ModulateByTypeEffectiveness(gBattleMons[opposingBank].type1, type1, type2, &typeDmg);
- ModulateByTypeEffectiveness(gBattleMons[opposingBank].type2, type1, type2, &typeDmg);
+ ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg);
+ ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg);
if (bestDmg < typeDmg)
{
bestDmg = typeDmg;
@@ -728,49 +712,49 @@ u8 GetMostSuitableMonToSwitchInto(void)
}
}
- // ok, we know the mon has the right typing but does it have at least one super effective move?
- if (bestMonId != 6)
+ // Ok, we know the mon has the right typing but does it have at least one super effective move?
+ if (bestMonId != PARTY_SIZE)
{
for (i = 0; i < 4; i++)
{
move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i);
- if (move != MOVE_NONE && TypeCalc(move, gActiveBank, opposingBank) & MOVESTATUS_SUPEREFFECTIVE)
+ if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE)
break;
}
if (i != 4)
- return bestMonId; // has both the typing and at least one super effective move
+ return bestMonId; // Has both the typing and at least one super effective move.
- invalidMons |= gBitTable[bestMonId]; // sorry buddy, we want something better
+ invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better.
}
else
{
- invalidMons = 0x3F; // no viable mon to switch
+ invalidMons = 0x3F; // No viable mon to switch.
}
}
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gCritMultiplier = 1;
bestDmg = 0;
bestMonId = 6;
- // if we couldn't find the best mon in terms of typing, find the one that deals most damage
+ // If we couldn't find the best mon in terms of typing, find the one that deals most damage.
for (i = firstId; i < lastId; i++)
{
if ((u16)(GetMonData(&party[i], MON_DATA_SPECIES)) == SPECIES_NONE)
continue;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
- if (gBattlePartyID[bankIn1] == i)
+ if (gBattlerPartyIndexes[battlerIn1] == i)
continue;
- if (gBattlePartyID[bankIn2] == i)
+ if (gBattlerPartyIndexes[battlerIn2] == i)
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1))
continue;
- if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
+ if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))
continue;
for (j = 0; j < 4; j++)
@@ -779,8 +763,8 @@ u8 GetMostSuitableMonToSwitchInto(void)
gBattleMoveDamage = 0;
if (move != MOVE_NONE && gBattleMoves[move].power != 1)
{
- AI_CalcDmg(gActiveBank, opposingBank);
- TypeCalc(move, gActiveBank, opposingBank);
+ AI_CalcDmg(gActiveBattler, opposingBattler);
+ TypeCalc(move, gActiveBattler, opposingBattler);
}
if (bestDmg < gBattleMoveDamage)
{
@@ -793,21 +777,21 @@ u8 GetMostSuitableMonToSwitchInto(void)
return bestMonId;
}
-// TODO: use PokemonItemEffect struct instead of u8 once it's documented
+// TODO: use PokemonItemEffect struct instead of u8 once it's documented.
static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument
{
if (itemId == ITEM_FULL_RESTORE)
return AI_ITEM_FULL_RESTORE;
- if (itemEffect[4] & 4)
+ else if (itemEffect[4] & 4)
return AI_ITEM_HEAL_HP;
- if (itemEffect[3] & 0x3F)
+ else if (itemEffect[3] & 0x3F)
return AI_ITEM_CURE_CONDITION;
- if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0)
+ else if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0)
return AI_ITEM_X_STAT;
- if (itemEffect[3] & 0x80)
+ else if (itemEffect[3] & 0x80)
return AI_ITEM_GUARD_SPECS;
-
- return AI_ITEM_NOT_RECOGNIZABLE;
+ else
+ return AI_ITEM_NOT_RECOGNIZABLE;
}
static bool8 ShouldUseItem(void)
@@ -817,15 +801,15 @@ static bool8 ShouldUseItem(void)
u8 validMons = 0;
bool8 shouldUse = FALSE;
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON2)
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT)
return FALSE;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
@@ -840,7 +824,7 @@ static bool8 ShouldUseItem(void)
u16 item;
const u8 *itemEffects;
u8 paramOffset;
- u8 bankSide;
+ u8 battlerSide;
if (i != 0 && validMons > (gBattleResources->battleHistory->itemsNo - i) + 1)
continue;
@@ -855,14 +839,14 @@ static bool8 ShouldUseItem(void)
else
itemEffects = gItemEffectTable[item - 13];
- *(gBattleStruct->AI_itemType + gActiveBank / 2) = GetAI_ItemType(item, itemEffects);
+ *(gBattleStruct->AI_itemType + gActiveBattler / 2) = GetAI_ItemType(item, itemEffects);
- switch (*(gBattleStruct->AI_itemType + gActiveBank / 2))
+ switch (*(gBattleStruct->AI_itemType + gActiveBattler / 2))
{
case AI_ITEM_FULL_RESTORE:
- if (gBattleMons[gActiveBank].hp >= gBattleMons[gActiveBank].maxHP / 4)
+ if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4)
break;
- if (gBattleMons[gActiveBank].hp == 0)
+ if (gBattleMons[gActiveBattler].hp == 0)
break;
shouldUse = TRUE;
break;
@@ -870,65 +854,65 @@ static bool8 ShouldUseItem(void)
paramOffset = GetItemEffectParamOffset(item, 4, 4);
if (paramOffset == 0)
break;
- if (gBattleMons[gActiveBank].hp == 0)
+ if (gBattleMons[gActiveBattler].hp == 0)
break;
- if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 4 || gBattleMons[gActiveBank].maxHP - gBattleMons[gActiveBank].hp > itemEffects[paramOffset])
+ if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 4 || gBattleMons[gActiveBattler].maxHP - gBattleMons[gActiveBattler].hp > itemEffects[paramOffset])
shouldUse = TRUE;
break;
case AI_ITEM_CURE_CONDITION:
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
- if (itemEffects[3] & 0x20 && gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
+ if (itemEffects[3] & 0x20 && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
{
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBank].status1 & STATUS_POISON || gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON))
+ if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))
{
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x10;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x8 && gBattleMons[gActiveBank].status1 & STATUS_BURN)
+ if (itemEffects[3] & 0x8 && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)
{
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x4 && gBattleMons[gActiveBank].status1 & STATUS_FREEZE)
+ if (itemEffects[3] & 0x4 && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)
{
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x2 && gBattleMons[gActiveBank].status1 & STATUS_PARALYSIS)
+ if (itemEffects[3] & 0x2 && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)
{
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
shouldUse = TRUE;
}
- if (itemEffects[3] & 0x1 && gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
+ if (itemEffects[3] & 0x1 && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
{
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
shouldUse = TRUE;
}
break;
case AI_ITEM_X_STAT:
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
- if (gDisableStructs[gActiveBank].isFirstTurn == 0)
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
+ if (gDisableStructs[gActiveBattler].isFirstTurn == 0)
break;
if (itemEffects[0] & 0xF)
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
if (itemEffects[1] & 0xF0)
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
if (itemEffects[1] & 0xF)
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
if (itemEffects[2] & 0xF)
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
if (itemEffects[2] & 0xF0)
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
if (itemEffects[0] & 0x30)
- *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x80;
+ *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80;
shouldUse = TRUE;
break;
case AI_ITEM_GUARD_SPECS:
- bankSide = GetBankSide(gActiveBank);
- if (gDisableStructs[gActiveBank].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0)
+ battlerSide = GetBattlerSide(gActiveBattler);
+ if (gDisableStructs[gActiveBattler].isFirstTurn != 0 && gSideTimers[battlerSide].mistTimer == 0)
shouldUse = TRUE;
break;
case AI_ITEM_NOT_RECOGNIZABLE:
@@ -937,8 +921,8 @@ static bool8 ShouldUseItem(void)
if (shouldUse)
{
- EmitTwoReturnValues(1, ACTION_USE_ITEM, 0);
- *(gBattleStruct->chosenItem + (gActiveBank / 2) * 2) = item;
+ BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);
+ *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item;
gBattleResources->battleHistory->trainerItems[i] = 0;
return shouldUse;
}
diff --git a/src/battle_anim.c b/src/battle_anim.c
index fa3ac73be..b6f726897 100644
--- a/src/battle_anim.c
+++ b/src/battle_anim.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "battle.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "sprite.h"
#include "contest.h"
#include "m4a.h"
@@ -18,14 +19,8 @@
// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index.
#define GET_TRUE_SPRITE_INDEX(i) ((i - 10000))
-#define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
-#define SCRIPT_READ_32(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
-#define SCRIPT_READ_PTR(ptr) ((const u8*)(SCRIPT_READ_32(ptr)))
-
#define ANIM_SPRITE_INDEX_COUNT 8
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
extern u16 gBattle_WIN0H;
extern u16 gBattle_WIN0V;
extern u16 gBattle_WIN1H;
@@ -34,12 +29,9 @@ extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern struct MusicPlayerInfo gMPlay_BGM;
-extern struct MusicPlayerInfo gMPlay_SE1;
-extern struct MusicPlayerInfo gMPlay_SE2;
-extern u8 gDecompressionBuffer[];
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_SE1;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern const u16 gUnknown_082C8D64[];
extern const u8 * const gBattleAnims_Moves[];
@@ -67,7 +59,7 @@ static void ScriptCmd_return(void);
static void ScriptCmd_setarg(void);
static void ScriptCmd_choosetwoturnanim(void);
static void ScriptCmd_jumpifmoveturn(void);
-static void ScriptCmd_jump(void);
+static void ScriptCmd_goto(void);
static void ScriptCmd_fadetobg(void);
static void ScriptCmd_restorebg(void);
static void ScriptCmd_waitbgfadeout(void);
@@ -128,10 +120,10 @@ EWRAM_DATA static u16 sSoundAnimFramesToWait = 0;
EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0};
EWRAM_DATA u8 gAnimMoveTurn = 0;
EWRAM_DATA static u8 sAnimBackgroundFadeState = 0;
-EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused.
-EWRAM_DATA u8 gAnimBankAttacker = 0;
-EWRAM_DATA u8 gAnimBankTarget = 0;
-EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0};
+EWRAM_DATA static u16 sAnimMoveIndex = 0; // Set but unused.
+EWRAM_DATA u8 gBattleAnimAttacker = 0;
+EWRAM_DATA u8 gBattleAnimTarget = 0;
+EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gUnknown_02038440 = 0;
// const rom data
@@ -156,7 +148,7 @@ static void (* const sScriptCmdTable[])(void) =
ScriptCmd_setarg,
ScriptCmd_choosetwoturnanim,
ScriptCmd_jumpifmoveturn,
- ScriptCmd_jump,
+ ScriptCmd_goto,
ScriptCmd_fadetobg,
ScriptCmd_restorebg,
ScriptCmd_waitbgfadeout,
@@ -187,6 +179,7 @@ static void (* const sScriptCmdTable[])(void) =
ScriptCmd_stopsound
};
+// code
void ClearBattleAnimationVars(void)
{
s32 i;
@@ -200,11 +193,11 @@ void ClearBattleAnimationVars(void)
gAnimMovePower = 0;
gAnimFriendship = 0;
- // clear index array.
+ // Clear index array.
for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
sAnimSpriteIndexArray[i] |= 0xFFFF;
- // clear anim args.
+ // Clear anim args.
for (i = 0; i < ANIM_ARGS_COUNT; i++)
gBattleAnimArgs[i] = 0;
@@ -213,15 +206,15 @@ void ClearBattleAnimationVars(void)
gAnimMoveTurn = 0;
sAnimBackgroundFadeState = 0;
sAnimMoveIndex = 0;
- gAnimBankAttacker = 0;
- gAnimBankTarget = 0;
+ gBattleAnimAttacker = 0;
+ gBattleAnimTarget = 0;
gUnknown_02038440 = 0;
}
void DoMoveAnim(u16 move)
{
- gAnimBankAttacker = gBankAttacker;
- gAnimBankTarget = gBankTarget;
+ gBattleAnimAttacker = gBattlerAttacker;
+ gBattleAnimTarget = gBattlerTarget;
LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE);
}
@@ -233,18 +226,18 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
{
sub_80A8278();
UpdateOamPriorityInAllHealthboxes(0);
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- if (GetBankSide(i) != 0)
- gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES);
+ if (GetBattlerSide(i) != 0)
+ gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
else
- gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES);
+ gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
}
}
else
{
for (i = 0; i < 4; i++)
- gAnimSpeciesByBanks[i] = gContestResources->field_18->field_0;
+ gAnimBattlerSpecies[i] = gContestResources->field_18->field_0;
}
if (!isMoveAnim)
@@ -271,7 +264,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
{
if (tableId == gUnknown_082C8D64[i])
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 128);
break;
}
}
@@ -356,7 +349,7 @@ static void ScriptCmd_loadspritegfx(void)
u16 index;
sBattleAnimScriptPtr++;
- index = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ index = T1_READ_16(sBattleAnimScriptPtr);
LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
sBattleAnimScriptPtr += 2;
@@ -370,7 +363,7 @@ static void ScriptCmd_unloadspritegfx(void)
u16 index;
sBattleAnimScriptPtr++;
- index = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ index = T1_READ_16(sBattleAnimScriptPtr);
FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
sBattleAnimScriptPtr += 2;
@@ -386,7 +379,7 @@ static void ScriptCmd_createsprite(void)
s16 subpriority;
sBattleAnimScriptPtr++;
- template = (const struct SpriteTemplate *)(SCRIPT_READ_32(sBattleAnimScriptPtr));
+ template = (const struct SpriteTemplate *)(T2_READ_32(sBattleAnimScriptPtr));
sBattleAnimScriptPtr += 4;
argVar = sBattleAnimScriptPtr[0];
@@ -396,7 +389,7 @@ static void ScriptCmd_createsprite(void)
sBattleAnimScriptPtr++;
for (i = 0; i < argsCount; i++)
{
- gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
sBattleAnimScriptPtr += 2;
}
@@ -408,7 +401,7 @@ static void ScriptCmd_createsprite(void)
else
argVar *= -1;
- subpriority = sub_80A82E4(gAnimBankTarget) + (s8)(argVar);
+ subpriority = sub_80A82E4(gBattleAnimTarget) + (s8)(argVar);
}
else
{
@@ -417,13 +410,13 @@ static void ScriptCmd_createsprite(void)
else
argVar *= -1;
- subpriority = sub_80A82E4(gAnimBankAttacker) + (s8)(argVar);
+ subpriority = sub_80A82E4(gBattleAnimAttacker) + (s8)(argVar);
}
if (subpriority < 3)
subpriority = 3;
- CreateSpriteAndAnimate(template, sub_80A5C6C(gAnimBankTarget, 2), sub_80A5C6C(gAnimBankTarget, 3), subpriority);
+ CreateSpriteAndAnimate(template, GetBattlerSpriteCoord(gBattleAnimTarget, 2), GetBattlerSpriteCoord(gBattleAnimTarget, 3), subpriority);
gAnimVisualTaskCount++;
}
@@ -437,7 +430,7 @@ static void ScriptCmd_createvisualtask(void)
sBattleAnimScriptPtr++;
- taskFunc = (TaskFunc)SCRIPT_READ_32(sBattleAnimScriptPtr);
+ taskFunc = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);
sBattleAnimScriptPtr += 4;
taskPriority = sBattleAnimScriptPtr[0];
@@ -448,7 +441,7 @@ static void ScriptCmd_createvisualtask(void)
for (i = 0; i < numArgs; i++)
{
- gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
sBattleAnimScriptPtr += 2;
}
@@ -467,7 +460,7 @@ static void ScriptCmd_delay(void)
gAnimScriptCallback = WaitAnimFrameCount;
}
-// wait for visual tasks to finish.
+// Wait for visual tasks to finish.
static void ScriptCmd_waitforvisualfinish(void)
{
if (gAnimVisualTaskCount == 0)
@@ -494,7 +487,7 @@ static void ScriptCmd_end(void)
s32 i;
bool32 continuousAnim = FALSE;
- // keep waiting as long as there is animations to be done.
+ // Keep waiting as long as there are animations to be done.
if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0
|| sMonAnimTaskIdArray[0] != 0xFF || sMonAnimTaskIdArray[1] != 0xFF)
{
@@ -503,22 +496,22 @@ static void ScriptCmd_end(void)
return;
}
- // finish the sound effects.
+ // Finish the sound effects.
if (IsSEPlaying())
{
- if (++sSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect.
+ if (++sSoundAnimFramesToWait <= 90) // Wait 90 frames, then halt the sound effect.
{
gAnimFramesToWait = 1;
return;
}
else
{
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
}
}
- // the SE has halted, so set the SE Frame Counter to 0 and continue.
+ // The SE has halted, so set the SE Frame Counter to 0 and continue.
sSoundAnimFramesToWait = 0;
for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
@@ -531,9 +524,9 @@ static void ScriptCmd_end(void)
}
}
- if (!continuousAnim) // may have been used for debug?
+ if (!continuousAnim) // May have been used for debug?
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256);
if (!IsContest())
{
sub_80A8278();
@@ -546,26 +539,26 @@ static void ScriptCmd_end(void)
static void ScriptCmd_playse(void)
{
sBattleAnimScriptPtr++;
- PlaySE(SCRIPT_READ_16(sBattleAnimScriptPtr));
+ PlaySE(T1_READ_16(sBattleAnimScriptPtr));
sBattleAnimScriptPtr += 2;
}
-#define t1_MONBG_BANK 0
+#define t1_MONBG_BATTLER 0
#define t1_MON_IN_BG2 1
#define t1_CREATE_ANOTHER_TASK 2
#define t1_IS_SECONDMON_BG 3
-#define t2_BANK_SPRITE_ID 0
+#define t2_BATTLER_SPRITE_ID 0
#define t2_MON_IN_BG2 5
-#define t2_MONBG_BANK 6
+#define t2_MONBG_BATTLER 6
static void sub_80A40F4(u8 taskId)
{
u8 newTaskId;
s16 *selfData = gTasks[taskId].data;
- u8 bankSpriteId = gBankSpriteIds[selfData[t1_MONBG_BANK]];
- gSprites[bankSpriteId].invisible = 1;
+ u8 battlerSpriteId = gBattlerSpriteIds[selfData[t1_MONBG_BATTLER]];
+ gSprites[battlerSpriteId].invisible = 1;
if (!selfData[t1_CREATE_ANOTHER_TASK])
{
@@ -574,9 +567,9 @@ static void sub_80A40F4(u8 taskId)
}
newTaskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
- gTasks[newTaskId].data[t2_BANK_SPRITE_ID] = bankSpriteId;
- gTasks[newTaskId].data[1] = gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x;
- gTasks[newTaskId].data[2] = gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y;
+ gTasks[newTaskId].data[t2_BATTLER_SPRITE_ID] = battlerSpriteId;
+ gTasks[newTaskId].data[1] = gSprites[battlerSpriteId].pos1.x + gSprites[battlerSpriteId].pos2.x;
+ gTasks[newTaskId].data[2] = gSprites[battlerSpriteId].pos1.y + gSprites[battlerSpriteId].pos2.y;
if (!selfData[t1_MON_IN_BG2])
{
@@ -590,7 +583,7 @@ static void sub_80A40F4(u8 taskId)
}
gTasks[newTaskId].data[t2_MON_IN_BG2] = selfData[t1_MON_IN_BG2];
- gTasks[newTaskId].data[t2_MONBG_BANK] = selfData[t1_MONBG_BANK];
+ gTasks[newTaskId].data[t2_MONBG_BATTLER] = selfData[t1_MONBG_BATTLER];
sMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId;
DestroyAnimVisualTask(taskId);
}
@@ -599,48 +592,48 @@ static void ScriptCmd_monbg(void)
{
bool8 toBG_2;
u8 taskId;
- u8 bank;
- u8 animBank;
+ u8 battlerId;
+ u8 animBattler;
sBattleAnimScriptPtr++;
- animBank = sBattleAnimScriptPtr[0];
- if (animBank & ANIM_BANK_TARGET)
- bank = gAnimBankTarget;
+ animBattler = sBattleAnimScriptPtr[0];
+ if (animBattler & ANIM_TARGET)
+ battlerId = gBattleAnimTarget;
else
- bank = gAnimBankAttacker;
+ battlerId = gBattleAnimAttacker;
- if (IsAnimBankSpriteVisible(bank))
+ if (IsBattlerSpriteVisible(battlerId))
{
- u8 identity = GetBankIdentity(bank);
- if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
+ u8 position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
- sub_80A438C(bank, toBG_2, FALSE);
+ sub_80A438C(battlerId, toBG_2, FALSE);
taskId = CreateTask(sub_80A40F4, 10);
gAnimVisualTaskCount++;
- gTasks[taskId].data[t1_MONBG_BANK] = bank;
+ gTasks[taskId].data[t1_MONBG_BATTLER] = battlerId;
gTasks[taskId].data[t1_MON_IN_BG2] = toBG_2;
gTasks[taskId].data[t1_CREATE_ANOTHER_TASK] = TRUE;
gTasks[taskId].data[t1_IS_SECONDMON_BG] = 0;
}
- bank ^= BIT_MON;
- if (IsAnimBankSpriteVisible(bank))
+ battlerId ^= BIT_FLANK;
+ if (IsBattlerSpriteVisible(battlerId))
{
- u8 identity = GetBankIdentity(bank);
- if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
+ u8 position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
- sub_80A438C(bank, toBG_2, FALSE);
+ sub_80A438C(battlerId, toBG_2, FALSE);
taskId = CreateTask(sub_80A40F4, 10);
gAnimVisualTaskCount++;
- gTasks[taskId].data[0] = bank;
+ gTasks[taskId].data[0] = battlerId;
gTasks[taskId].data[1] = toBG_2;
gTasks[taskId].data[t1_CREATE_ANOTHER_TASK] = TRUE;
gTasks[taskId].data[t1_IS_SECONDMON_BG] = 1;
@@ -651,33 +644,33 @@ static void ScriptCmd_monbg(void)
gAnimScriptCallback = WaitAnimFrameCount;
}
-bool8 IsAnimBankSpriteVisible(u8 bank)
+bool8 IsBattlerSpriteVisible(u8 battlerId)
{
if (IsContest())
{
- if (bank == gAnimBankAttacker)
+ if (battlerId == gBattleAnimAttacker)
return TRUE;
else
return FALSE;
}
- if (!IsBankSpritePresent(bank))
+ if (!IsBattlerSpritePresent(battlerId))
return FALSE;
if (IsContest())
- return TRUE; // this line wont ever be reached.
- if (!gBattleSpritesDataPtr->bankData[bank].invisible || !gSprites[gBankSpriteIds[bank]].invisible)
+ return TRUE; // This line won't ever be reached.
+ if (!gBattleSpritesDataPtr->battlerData[battlerId].invisible || !gSprites[gBattlerSpriteIds[battlerId]].invisible)
return TRUE;
return FALSE;
}
-void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
+void sub_80A438C(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible)
{
struct UnknownAnimStruct2 unknownStruct;
- u8 bankSpriteId;
+ u8 battlerSpriteId;
if (!toBG_2)
{
- u8 bankIdentity;
+ u8 battlerPosition;
if (IsContest() == TRUE)
{
@@ -698,28 +691,28 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1);
SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0);
- bankSpriteId = gBankSpriteIds[bank];
+ battlerSpriteId = gBattlerSpriteIds[battlerId];
- gBattle_BG1_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20;
+ gBattle_BG1_X = -(gSprites[battlerSpriteId].pos1.x + gSprites[battlerSpriteId].pos2.x) + 0x20;
if (IsContest() && IsSpeciesNotUnown(gContestResources->field_18->field_0))
gBattle_BG1_X--;
- gBattle_BG1_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20;
+ gBattle_BG1_Y = -(gSprites[battlerSpriteId].pos1.y + gSprites[battlerSpriteId].pos2.y) + 0x20;
if (setSpriteInvisible)
- gSprites[gBankSpriteIds[bank]].invisible = 1;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = 1;
SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
- LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], unknownStruct.unk8 * 16, 0x20);
- CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + unknownStruct.unk8 * 32), 0x20);
+ LoadPalette(&gPlttBufferUnfaded[0x100 + battlerId * 16], unknownStruct.unk8 * 16, 0x20);
+ CpuCopy32(&gPlttBufferUnfaded[0x100 + battlerId * 16], (void*)(BG_PLTT + unknownStruct.unk8 * 32), 0x20);
if (IsContest())
- bankIdentity = 0;
+ battlerPosition = 0;
else
- bankIdentity = GetBankIdentity(bank);
+ battlerPosition = GetBattlerPosition(battlerId);
- sub_8118FBC(1, 0, 0, bankIdentity, unknownStruct.unk8, unknownStruct.unk0, unknownStruct.unk4, unknownStruct.unkA);
+ sub_8118FBC(1, 0, 0, battlerPosition, unknownStruct.unk8, unknownStruct.unk0, unknownStruct.unk4, unknownStruct.unkA);
if (IsContest())
sub_80A46A0();
@@ -735,21 +728,21 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1);
SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0);
- bankSpriteId = gBankSpriteIds[bank];
+ battlerSpriteId = gBattlerSpriteIds[battlerId];
- gBattle_BG2_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20;
- gBattle_BG2_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20;
+ gBattle_BG2_X = -(gSprites[battlerSpriteId].pos1.x + gSprites[battlerSpriteId].pos2.x) + 0x20;
+ gBattle_BG2_Y = -(gSprites[battlerSpriteId].pos1.y + gSprites[battlerSpriteId].pos2.y) + 0x20;
if (setSpriteInvisible)
- gSprites[gBankSpriteIds[bank]].invisible = 1;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = 1;
SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);
SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);
- LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], 0x90, 0x20);
- CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + 0x120), 0x20);
+ LoadPalette(&gPlttBufferUnfaded[0x100 + battlerId * 16], 0x90, 0x20);
+ CpuCopy32(&gPlttBufferUnfaded[0x100 + battlerId * 16], (void*)(BG_PLTT + 0x120), 0x20);
- sub_8118FBC(2, 0, 0, GetBankIdentity(bank), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA);
+ sub_8118FBC(2, 0, 0, GetBattlerPosition(battlerId), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA);
}
}
@@ -855,33 +848,33 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
static void ScriptCmd_clearmonbg(void)
{
- u8 animBankId;
- u8 bank;
+ u8 animBattlerId;
+ u8 battlerId;
u8 taskId;
sBattleAnimScriptPtr++;
- animBankId = sBattleAnimScriptPtr[0];
+ animBattlerId = sBattleAnimScriptPtr[0];
- if (animBankId == ANIM_BANK_ATTACKER)
- animBankId = ANIM_BANK_ATK_PARTNER;
- else if (animBankId == ANIM_BANK_TARGET)
- animBankId = ANIM_BANK_DEF_PARTNER;
+ if (animBattlerId == ANIM_ATTACKER)
+ animBattlerId = ANIM_ATK_PARTNER;
+ else if (animBattlerId == ANIM_TARGET)
+ animBattlerId = ANIM_DEF_PARTNER;
- if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
- bank = gAnimBankAttacker;
+ if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)
+ battlerId = gBattleAnimAttacker;
else
- bank = gAnimBankTarget;
+ battlerId = gBattleAnimTarget;
if (sMonAnimTaskIdArray[0] != 0xFF)
- gSprites[gBankSpriteIds[bank]].invisible = 0;
- if (animBankId > 1 && sMonAnimTaskIdArray[1] != 0xFF)
- gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = 0;
+ if (animBattlerId > 1 && sMonAnimTaskIdArray[1] != 0xFF)
+ gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = 0;
else
- animBankId = 0;
+ animBattlerId = 0;
taskId = CreateTask(sub_80A4980, 5);
- gTasks[taskId].data[0] = animBankId;
- gTasks[taskId].data[2] = bank;
+ gTasks[taskId].data[0] = animBattlerId;
+ gTasks[taskId].data[2] = battlerId;
sBattleAnimScriptPtr++;
}
@@ -892,8 +885,8 @@ static void sub_80A4980(u8 taskId)
if (gTasks[taskId].data[1] != 1)
{
u8 to_BG2;
- u8 identity = GetBankIdentity(gTasks[taskId].data[2]);
- if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
+ u8 position = GetBattlerPosition(gTasks[taskId].data[2]);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
to_BG2 = FALSE;
else
to_BG2 = TRUE;
@@ -917,44 +910,44 @@ static void sub_80A4980(u8 taskId)
static void ScriptCmd_monbg_22(void)
{
bool8 toBG_2;
- u8 bank;
- u8 animBankId;
+ u8 battlerId;
+ u8 animBattlerId;
sBattleAnimScriptPtr++;
- animBankId = sBattleAnimScriptPtr[0];
+ animBattlerId = sBattleAnimScriptPtr[0];
- if (animBankId == ANIM_BANK_ATTACKER)
- animBankId = ANIM_BANK_ATK_PARTNER;
- else if (animBankId == ANIM_BANK_TARGET)
- animBankId = ANIM_BANK_DEF_PARTNER;
+ if (animBattlerId == ANIM_ATTACKER)
+ animBattlerId = ANIM_ATK_PARTNER;
+ else if (animBattlerId == ANIM_TARGET)
+ animBattlerId = ANIM_DEF_PARTNER;
- if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
- bank = gAnimBankAttacker;
+ if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)
+ battlerId = gBattleAnimAttacker;
else
- bank = gAnimBankTarget;
+ battlerId = gBattleAnimTarget;
- if (IsAnimBankSpriteVisible(bank))
+ if (IsBattlerSpriteVisible(battlerId))
{
- u8 identity = GetBankIdentity(bank);
- if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
+ u8 position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
- sub_80A438C(bank, toBG_2, FALSE);
+ sub_80A438C(battlerId, toBG_2, FALSE);
}
- bank ^= BIT_MON;
- if (animBankId > 1 && IsAnimBankSpriteVisible(bank))
+ battlerId ^= BIT_FLANK;
+ if (animBattlerId > 1 && IsBattlerSpriteVisible(battlerId))
{
- u8 identity = GetBankIdentity(bank);
- if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
+ u8 position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
- sub_80A438C(bank, toBG_2, FALSE);
+ sub_80A438C(battlerId, toBG_2, FALSE);
}
sBattleAnimScriptPtr++;
@@ -962,33 +955,33 @@ static void ScriptCmd_monbg_22(void)
static void ScriptCmd_clearmonbg_23(void)
{
- u8 animBankId;
- u8 bank;
+ u8 animBattlerId;
+ u8 battlerId;
u8 taskId;
sBattleAnimScriptPtr++;
- animBankId = sBattleAnimScriptPtr[0];
+ animBattlerId = sBattleAnimScriptPtr[0];
- if (animBankId == ANIM_BANK_ATTACKER)
- animBankId = ANIM_BANK_ATK_PARTNER;
- else if (animBankId == ANIM_BANK_TARGET)
- animBankId = ANIM_BANK_DEF_PARTNER;
+ if (animBattlerId == ANIM_ATTACKER)
+ animBattlerId = ANIM_ATK_PARTNER;
+ else if (animBattlerId == ANIM_TARGET)
+ animBattlerId = ANIM_DEF_PARTNER;
- if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
- bank = gAnimBankAttacker;
+ if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)
+ battlerId = gBattleAnimAttacker;
else
- bank = gAnimBankTarget;
+ battlerId = gBattleAnimTarget;
- if (IsAnimBankSpriteVisible(bank))
- gSprites[gBankSpriteIds[bank]].invisible = 0;
- if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON))
- gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0;
+ if (IsBattlerSpriteVisible(battlerId))
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = 0;
+ if (animBattlerId > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK))
+ gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = 0;
else
- animBankId = 0;
+ animBattlerId = 0;
taskId = CreateTask(sub_80A4BB0, 5);
- gTasks[taskId].data[0] = animBankId;
- gTasks[taskId].data[2] = bank;
+ gTasks[taskId].data[0] = animBattlerId;
+ gTasks[taskId].data[2] = battlerId;
sBattleAnimScriptPtr++;
}
@@ -999,30 +992,30 @@ static void sub_80A4BB0(u8 taskId)
if (gTasks[taskId].data[1] != 1)
{
bool8 toBG_2;
- u8 bank = gTasks[taskId].data[2];
- u8 identity = GetBankIdentity(bank);
- if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
+ u8 battlerId = gTasks[taskId].data[2];
+ u8 position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
- if (IsAnimBankSpriteVisible(bank))
+ if (IsBattlerSpriteVisible(battlerId))
sub_80A477C(toBG_2);
- if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON))
+ if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK))
sub_80A477C(toBG_2 ^ 1);
DestroyTask(taskId);
}
}
-#undef t1_MONBG_BANK
+#undef t1_MONBG_BATTLER
#undef t1_MON_IN_BG2
#undef t1_CREATE_ANOTHER_TASK
#undef t1_IS_SECONDMON_BG
-#undef t2_BANK_SPRITE_ID
+#undef t2_BATTLER_SPRITE_ID
#undef t2_MON_IN_BG2
-#undef t2_MONBG_BANK
+#undef t2_MONBG_BATTLER
static void ScriptCmd_setalpha(void)
{
@@ -1056,7 +1049,7 @@ static void ScriptCmd_call(void)
{
sBattleAnimScriptPtr++;
sBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4;
- sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
}
static void ScriptCmd_return(void)
@@ -1073,7 +1066,7 @@ static void ScriptCmd_setarg(void)
sBattleAnimScriptPtr++;
argId = sBattleAnimScriptPtr[0];
sBattleAnimScriptPtr++;
- value = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ value = T1_READ_16(sBattleAnimScriptPtr);
sBattleAnimScriptPtr = addr + 4;
gBattleAnimArgs[argId] = value;
}
@@ -1083,7 +1076,7 @@ static void ScriptCmd_choosetwoturnanim(void)
sBattleAnimScriptPtr++;
if (gAnimMoveTurn & 1)
sBattleAnimScriptPtr += 4;
- sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
}
static void ScriptCmd_jumpifmoveturn(void)
@@ -1094,15 +1087,15 @@ static void ScriptCmd_jumpifmoveturn(void)
sBattleAnimScriptPtr++;
if (toCheck == gAnimMoveTurn)
- sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
else
sBattleAnimScriptPtr += 4;
}
-static void ScriptCmd_jump(void)
+static void ScriptCmd_goto(void)
{
sBattleAnimScriptPtr++;
- sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
}
// Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior.
@@ -1144,7 +1137,7 @@ static void ScriptCmd_fadetobgfromset(void)
if (IsContest())
gTasks[taskId].tBackgroundId = bg3;
- else if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
+ else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
gTasks[taskId].tBackgroundId = bg2;
else
gTasks[taskId].tBackgroundId = bg1;
@@ -1269,21 +1262,21 @@ static void ScriptCmd_changebg(void)
s8 BattleAnimAdjustPanning(s8 pan)
{
- if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].statusAnimActive)
+ if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
{
- if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
else
pan = PAN_SIDE_PLAYER;
}
else if (IsContest())
{
- if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != PAN_SIDE_OPPONENT)
+ if (gBattleAnimAttacker != gBattleAnimTarget || gBattleAnimAttacker != 2 || pan != PAN_SIDE_OPPONENT)
pan *= -1;
}
- else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER)
+ else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
{
- if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
{
if (pan == PAN_SIDE_OPPONENT)
pan = PAN_SIDE_PLAYER;
@@ -1291,7 +1284,7 @@ s8 BattleAnimAdjustPanning(s8 pan)
pan *= -1;
}
}
- else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT)
+ else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
{
if (pan == PAN_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
@@ -1311,31 +1304,31 @@ s8 BattleAnimAdjustPanning(s8 pan)
s8 BattleAnimAdjustPanning2(s8 pan)
{
- if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].statusAnimActive)
+ if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
{
- if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
else
pan = PAN_SIDE_PLAYER;
}
else
{
- if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER || IsContest())
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest())
pan = -pan;
}
return pan;
}
-s16 sub_80A52EC(s16 a)
+s16 KeepPanInRange(s16 panArg)
{
- s16 var = a;
+ s16 pan = panArg;
- if (var > 63)
- var = 63;
- else if (var < -64)
- var = -64;
+ if (pan > PAN_SIDE_OPPONENT)
+ pan = PAN_SIDE_OPPONENT;
+ else if (pan < PAN_SIDE_PLAYER)
+ pan = PAN_SIDE_PLAYER;
- return var;
+ return pan;
}
s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan)
@@ -1358,7 +1351,7 @@ static void ScriptCmd_playsewithpan(void)
s8 pan;
sBattleAnimScriptPtr++;
- songId = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ songId = T1_READ_16(sBattleAnimScriptPtr);
pan = sBattleAnimScriptPtr[2];
PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan));
sBattleAnimScriptPtr += 3;
@@ -1389,7 +1382,7 @@ static void ScriptCmd_panse_1B(void)
u8 taskId;
sBattleAnimScriptPtr++;
- songNum = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ songNum = T1_READ_16(sBattleAnimScriptPtr);
currentPanArg = sBattleAnimScriptPtr[2];
incrementPan = sBattleAnimScriptPtr[3];
incrementPanArg = sBattleAnimScriptPtr[4];
@@ -1427,18 +1420,18 @@ void Task_PanFromInitialToTarget(u8 taskId)
pan = currentPan + incrementPan;
gTasks[taskId].tCurrentPan = pan;
- if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately
+ if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately.
{
destroyTask = TRUE;
}
- else if (initialPanning < targetPanning) // Panning increasing
+ else if (initialPanning < targetPanning) // Panning increasing.
{
- if (pan >= targetPanning) // Target reached
+ if (pan >= targetPanning) // Target reached.
destroyTask = TRUE;
}
- else // Panning decreasing
+ else // Panning decreasing.
{
- if (pan <= targetPanning) // Target reached
+ if (pan <= targetPanning) // Target reached.
destroyTask = TRUE;
}
@@ -1461,7 +1454,7 @@ static void ScriptCmd_panse_26(void)
u8 taskId;
sBattleAnimScriptPtr++;
- songId = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ songId = T1_READ_16(sBattleAnimScriptPtr);
currentPan = sBattleAnimScriptPtr[2];
targetPan = sBattleAnimScriptPtr[3];
incrementPan = sBattleAnimScriptPtr[4];
@@ -1488,7 +1481,7 @@ static void ScriptCmd_panse_27(void)
u8 taskId;
sBattleAnimScriptPtr++;
- songId = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ songId = T1_READ_16(sBattleAnimScriptPtr);
currentPanArg = sBattleAnimScriptPtr[2];
targetPanArg = sBattleAnimScriptPtr[3];
incrementPanArg = sBattleAnimScriptPtr[4];
@@ -1532,7 +1525,7 @@ static void ScriptCmd_loopsewithpan(void)
u8 taskId;
sBattleAnimScriptPtr++;
- songId = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ songId = T1_READ_16(sBattleAnimScriptPtr);
panningArg = sBattleAnimScriptPtr[2];
framesToWait = sBattleAnimScriptPtr[3];
numberOfPlays = sBattleAnimScriptPtr[4];
@@ -1589,7 +1582,7 @@ static void ScriptCmd_waitplaysewithpan(void)
u8 taskId;
sBattleAnimScriptPtr++;
- songId = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ songId = T1_READ_16(sBattleAnimScriptPtr);
panningArg = sBattleAnimScriptPtr[2];
framesToWait = sBattleAnimScriptPtr[3];
panning = BattleAnimAdjustPanning(panningArg);
@@ -1624,13 +1617,13 @@ static void ScriptCmd_createsoundtask(void)
s32 i;
sBattleAnimScriptPtr++;
- func = (TaskFunc)SCRIPT_READ_32(sBattleAnimScriptPtr);
+ func = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);
sBattleAnimScriptPtr += 4;
numArgs = sBattleAnimScriptPtr[0];
sBattleAnimScriptPtr++;
for (i = 0; i < numArgs; i++)
{
- gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr);
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
sBattleAnimScriptPtr += 2;
}
taskId = CreateTask(func, 1);
@@ -1649,8 +1642,8 @@ static void ScriptCmd_waitsound(void)
{
if (++sSoundAnimFramesToWait > 90)
{
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
sSoundAnimFramesToWait = 0;
}
else
@@ -1673,10 +1666,10 @@ static void ScriptCmd_jumpargeq(void)
sBattleAnimScriptPtr++;
argId = sBattleAnimScriptPtr[0];
- valueToCheck = SCRIPT_READ_16(sBattleAnimScriptPtr + 1);
+ valueToCheck = T1_READ_16(sBattleAnimScriptPtr + 1);
if (valueToCheck == gBattleAnimArgs[argId])
- sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr + 3);
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr + 3);
else
sBattleAnimScriptPtr += 7;
}
@@ -1685,27 +1678,27 @@ static void ScriptCmd_jumpifcontest(void)
{
sBattleAnimScriptPtr++;
if (IsContest())
- sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
else
sBattleAnimScriptPtr += 4;
}
static void ScriptCmd_monbgprio_28(void)
{
- u8 wantedBank;
- u8 bank;
- u8 bankIdentity;
+ u8 wantedBattler;
+ u8 battlerId;
+ u8 battlerPosition;
- wantedBank = sBattleAnimScriptPtr[1];
+ wantedBattler = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
- if (wantedBank != ANIM_BANK_ATTACKER)
- bank = gAnimBankTarget;
+ if (wantedBattler != ANIM_ATTACKER)
+ battlerId = gBattleAnimTarget;
else
- bank = gAnimBankAttacker;
+ battlerId = gBattleAnimAttacker;
- bankIdentity = GetBankIdentity(bank);
- if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2))
+ battlerPosition = GetBattlerPosition(battlerId);
+ if (!IsContest() && (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT))
{
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
@@ -1724,21 +1717,21 @@ static void ScriptCmd_monbgprio_29(void)
static void ScriptCmd_monbgprio_2A(void)
{
- u8 wantedBank;
- u8 bankIdentity;
- u8 bank;
+ u8 wantedBattler;
+ u8 battlerPosition;
+ u8 battlerId;
- wantedBank = sBattleAnimScriptPtr[1];
+ wantedBattler = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
- if (GetBankSide(gAnimBankAttacker) != GetBankSide(gAnimBankTarget))
+ if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget))
{
- if (wantedBank != ANIM_BANK_ATTACKER)
- bank = gAnimBankTarget;
+ if (wantedBattler != ANIM_ATTACKER)
+ battlerId = gBattleAnimTarget;
else
- bank = gAnimBankAttacker;
+ battlerId = gBattleAnimAttacker;
- bankIdentity = GetBankIdentity(bank);
- if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2))
+ battlerPosition = GetBattlerPosition(battlerId);
+ if (!IsContest() && (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT))
{
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
@@ -1750,7 +1743,7 @@ static void ScriptCmd_invisible(void)
{
u8 spriteId;
- spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]);
+ spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
if (spriteId != 0xFF)
gSprites[spriteId].invisible = 1;
@@ -1761,7 +1754,7 @@ static void ScriptCmd_visible(void)
{
u8 spriteId;
- spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]);
+ spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
if (spriteId != 0xFF)
gSprites[spriteId].invisible = 0;
@@ -1770,24 +1763,24 @@ static void ScriptCmd_visible(void)
static void ScriptCmd_doublebattle_2D(void)
{
- u8 wantedBank;
+ u8 wantedBattler;
u8 r4;
u8 spriteId;
- wantedBank = sBattleAnimScriptPtr[1];
+ wantedBattler = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (!IsContest() && IsDoubleBattle()
- && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
+ && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
{
- if (wantedBank == ANIM_BANK_ATTACKER)
+ if (wantedBattler == ANIM_ATTACKER)
{
- r4 = sub_80A8364(gAnimBankAttacker);
- spriteId = GetAnimBankSpriteId(0);
+ r4 = sub_80A8364(gBattleAnimAttacker);
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
}
else
{
- r4 = sub_80A8364(gAnimBankTarget);
- spriteId = GetAnimBankSpriteId(1);
+ r4 = sub_80A8364(gBattleAnimTarget);
+ spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
}
if (spriteId != 0xFF)
{
@@ -1805,24 +1798,24 @@ static void ScriptCmd_doublebattle_2D(void)
static void ScriptCmd_doublebattle_2E(void)
{
- u8 wantedBank;
+ u8 wantedBattler;
u8 r4;
u8 spriteId;
- wantedBank = sBattleAnimScriptPtr[1];
+ wantedBattler = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (!IsContest() && IsDoubleBattle()
- && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
+ && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
{
- if (wantedBank == ANIM_BANK_ATTACKER)
+ if (wantedBattler == ANIM_ATTACKER)
{
- r4 = sub_80A8364(gAnimBankAttacker);
- spriteId = GetAnimBankSpriteId(0);
+ r4 = sub_80A8364(gBattleAnimAttacker);
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
}
else
{
- r4 = sub_80A8364(gAnimBankTarget);
- spriteId = GetAnimBankSpriteId(1);
+ r4 = sub_80A8364(gBattleAnimTarget);
+ spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
}
if (spriteId != 0xFF && r4 == 2)
@@ -1832,7 +1825,7 @@ static void ScriptCmd_doublebattle_2E(void)
static void ScriptCmd_stopsound(void)
{
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
sBattleAnimScriptPtr++;
}
diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c
new file mode 100644
index 000000000..5a829171e
--- /dev/null
+++ b/src/battle_anim_sound_tasks.c
@@ -0,0 +1,438 @@
+#include "global.h"
+#include "battle.h"
+#include "constants/battle_anim.h"
+#include "constants/species.h"
+#include "battle_anim.h"
+#include "task.h"
+#include "sound.h"
+#include "contest.h"
+
+// this file's functions
+static void sub_8158B98(u8 taskId);
+static void sub_8158C04(u8 taskId);
+static void sub_8158D08(u8 taskId);
+static void sub_8158FF4(u8 taskId);
+static void sub_815913C(u8 taskId);
+static void sub_8159308(u8 taskId);
+
+// task start
+void sub_8158B30(u8 taskId)
+{
+ s8 pan1, pan2, panIncrement;
+
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+
+ pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
+ pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
+ panIncrement = CalculatePanIncrement(pan1, pan2, 2);
+
+ gTasks[taskId].data[2] = pan1;
+ gTasks[taskId].data[3] = pan2;
+ gTasks[taskId].data[4] = panIncrement;
+ gTasks[taskId].data[10] = 10;
+
+ gTasks[taskId].func = sub_8158B98;
+}
+
+static void sub_8158B98(u8 taskId)
+{
+ s16 pan = gTasks[taskId].data[2];
+ s8 panIncrement = gTasks[taskId].data[4];
+ if (++gTasks[taskId].data[11] == 111)
+ {
+ gTasks[taskId].data[10] = 5;
+ gTasks[taskId].data[11] = 0;
+ gTasks[taskId].func = sub_8158C04;
+ }
+ else
+ {
+ if (++gTasks[taskId].data[10] == 11)
+ {
+ gTasks[taskId].data[10] = 0;
+ PlaySE12WithPanning(gTasks[taskId].data[0], pan);
+ }
+ pan += panIncrement;
+ gTasks[taskId].data[2] = KeepPanInRange(pan);
+ }
+}
+
+static void sub_8158C04(u8 taskId)
+{
+ if (++gTasks[taskId].data[10] == 6)
+ {
+ s8 pan;
+
+ gTasks[taskId].data[10] = 0;
+ pan = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
+ PlaySE12WithPanning(gTasks[taskId].data[1], pan);
+ if (++gTasks[taskId].data[11] == 2)
+ DestroyAnimSoundTask(taskId);
+ }
+}
+// task end
+
+// task start
+void sub_8158C58(u8 taskId)
+{
+ u16 songId = gBattleAnimArgs[0];
+ s8 targetPan = gBattleAnimArgs[2];
+ s8 panIncrement = gBattleAnimArgs[3];
+ u8 r10 = gBattleAnimArgs[4];
+ u8 r7 = gBattleAnimArgs[5];
+ u8 r9 = gBattleAnimArgs[6];
+ s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
+
+ targetPan = BattleAnimAdjustPanning(targetPan);
+ panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
+
+ gTasks[taskId].data[0] = songId;
+ gTasks[taskId].data[1] = sourcePan;
+ gTasks[taskId].data[2] = targetPan;
+ gTasks[taskId].data[3] = panIncrement;
+ gTasks[taskId].data[4] = r10;
+ gTasks[taskId].data[5] = r7;
+ gTasks[taskId].data[6] = r9;
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11] = sourcePan;
+ gTasks[taskId].data[12] = r9;
+
+ gTasks[taskId].func = sub_8158D08;
+ sub_8158D08(taskId);
+}
+
+static void sub_8158D08(u8 taskId)
+{
+ if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6])
+ {
+ gTasks[taskId].data[12] = 0;
+ PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]);
+ if (--gTasks[taskId].data[4] == 0)
+ {
+ DestroyAnimSoundTask(taskId);
+ return;
+ }
+ }
+
+ if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11] += gTasks[taskId].data[3];
+ gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]);
+ }
+}
+// task end
+
+// task start
+void sub_8158D8C(u8 taskId)
+{
+ u16 species = 0;
+ s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
+ if (IsContest())
+ {
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ species = gContestResources->field_18->field_0;
+ else
+ DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task.
+ }
+ else
+ {
+ u8 battlerId;
+
+ // Get wanted battler.
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ battlerId = gBattleAnimAttacker;
+ else if (gBattleAnimArgs[0] == ANIM_TARGET)
+ battlerId = gBattleAnimTarget;
+ else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
+ battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
+ else
+ battlerId = BATTLE_PARTNER(gBattleAnimTarget);
+
+ // Check if battler is visible.
+ if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ else
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ }
+
+ if (species != SPECIES_NONE)
+ PlayCry3(species, pan, 3);
+
+ DestroyAnimVisualTask(taskId);
+}
+// task end
+
+// task start
+void sub_8158E9C(u8 taskId)
+{
+ u16 species = 0;
+ s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
+ if (IsContest())
+ {
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ species = gContestResources->field_18->field_0;
+ else
+ DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task.
+ }
+ else
+ {
+ u8 battlerId;
+
+ // Get wanted battler.
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ battlerId = gBattleAnimAttacker;
+ else if (gBattleAnimArgs[0] == ANIM_TARGET)
+ battlerId = gBattleAnimTarget;
+ else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
+ battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
+ else
+ battlerId = BATTLE_PARTNER(gBattleAnimTarget);
+
+ // Check if battler is visible.
+ if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ else
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ }
+
+ gTasks[taskId].data[0] = gBattleAnimArgs[1];
+ gTasks[taskId].data[1] = species;
+ gTasks[taskId].data[2] = pan;
+
+ if (species != SPECIES_NONE)
+ {
+ if (gBattleAnimArgs[1] == 0xFF)
+ PlayCry3(species, pan, 9);
+ else
+ PlayCry3(species, pan, 7);
+
+ gTasks[taskId].func = sub_8158FF4;
+ }
+ else
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+static void sub_8158FF4(u8 taskId)
+{
+ u16 species = gTasks[taskId].data[1];
+ s8 pan = gTasks[taskId].data[2];
+
+ if (gTasks[taskId].data[9] < 2)
+ {
+ gTasks[taskId].data[9]++;
+ }
+ else
+ {
+ if (gTasks[taskId].data[0] == 0xFF)
+ {
+ if (!IsCryPlaying())
+ {
+ PlayCry3(species, pan, 10);
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ else
+ {
+ if (!IsCryPlaying())
+ {
+ PlayCry3(species, pan, 8);
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ }
+}
+// task end
+
+void sub_8159078(u8 taskId)
+{
+ if (gTasks[taskId].data[9] < 2)
+ {
+ gTasks[taskId].data[9]++;
+ }
+ else
+ {
+ if (!IsCryPlaying())
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// task start
+void sub_81590B8(u8 taskId)
+{
+ u16 species;
+ s8 pan;
+
+ gTasks[taskId].data[10] = gBattleAnimArgs[0];
+ pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
+
+ if (IsContest())
+ species = gContestResources->field_18->field_0;
+ else
+ species = gAnimBattlerSpecies[gBattleAnimAttacker];
+
+ gTasks[taskId].data[1] = species;
+ gTasks[taskId].data[2] = pan;
+
+ if (species != SPECIES_NONE)
+ gTasks[taskId].func = sub_815913C;
+ else
+ DestroyAnimVisualTask(taskId);
+}
+
+static void sub_815913C(u8 taskId)
+{
+ u16 species = gTasks[taskId].data[1];
+ s8 pan = gTasks[taskId].data[2];
+
+ switch (gTasks[taskId].data[9])
+ {
+ case 2:
+ PlayCry6(species, pan, 4);
+ gTasks[taskId].data[9]++;
+ break;
+ case 1:
+ case 3:
+ case 4:
+ gTasks[taskId].data[9]++;
+ break;
+ case 5:
+ if (IsCryPlaying())
+ break;
+ case 0:
+ StopCryAndClearCrySongs();
+ gTasks[taskId].data[9]++;
+ break;
+ default:
+ if (gTasks[taskId].data[10] == 0)
+ PlayCry6(species, pan, 6);
+ else
+ PlayCry3(species, pan, 6);
+
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+// task end
+
+void sub_8159210(u8 taskId)
+{
+ u16 songId = gBattleAnimArgs[0];
+ s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
+
+ PlaySE1WithPanning(songId, pan);
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8159244(u8 taskId)
+{
+ u16 songId = gBattleAnimArgs[0];
+ s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
+
+ PlaySE2WithPanning(songId, pan);
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8159278(u8 taskId)
+{
+ s8 targetPan = gBattleAnimArgs[1];
+ s8 panIncrement = gBattleAnimArgs[2];
+ u16 r9 = gBattleAnimArgs[3];
+ s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]);
+
+ targetPan = BattleAnimAdjustPanning(targetPan);
+ panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
+
+ gTasks[taskId].data[1] = sourcePan;
+ gTasks[taskId].data[2] = targetPan;
+ gTasks[taskId].data[3] = panIncrement;
+ gTasks[taskId].data[5] = r9;
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11] = sourcePan;
+
+ gTasks[taskId].func = sub_8159308;
+ sub_8159308(taskId);
+}
+
+#ifdef NONMATCHING
+void sub_8159308(u8 taskId)
+{
+ s16 panIncrement = gTasks[taskId].data[3];
+
+ if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
+ {
+ gTasks[taskId].data[10] = 0;
+
+ gTasks[taskId].data[11] += panIncrement;
+ gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]);
+ }
+
+ gUnknown_02038440 = gTasks[taskId].data[11];
+ if (gTasks[taskId].data[11] == gTasks[taskId].data[2])
+ DestroyAnimVisualTask(taskId);
+}
+#else
+NAKED
+void sub_8159308(u8 taskId)
+{
+ asm_unified(" push {r4,r5,lr}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r5, r0, 0\n\
+ ldr r1, =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r4, r0, r1\n\
+ ldrh r2, [r4, 0xE]\n\
+ ldrh r0, [r4, 0x1C]\n\
+ adds r1, r0, 0x1\n\
+ strh r1, [r4, 0x1C]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r3, 0x12\n\
+ ldrsh r1, [r4, r3]\n\
+ cmp r0, r1\n\
+ bne _08159342\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x1C]\n\
+ ldrh r1, [r4, 0x1E]\n\
+ adds r0, r2, r1\n\
+ strh r0, [r4, 0x1E]\n\
+ movs r2, 0x1E\n\
+ ldrsh r0, [r4, r2]\n\
+ bl KeepPanInRange\n\
+ strh r0, [r4, 0x1E]\n\
+_08159342:\n\
+ ldr r1, =gUnknown_02038440\n\
+ ldrh r0, [r4, 0x1E]\n\
+ strb r0, [r1]\n\
+ movs r3, 0x1E\n\
+ ldrsh r1, [r4, r3]\n\
+ movs r2, 0xC\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r1, r0\n\
+ bne _0815935A\n\
+ adds r0, r5, 0\n\
+ bl DestroyAnimVisualTask\n\
+_0815935A:\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool");
+}
+#endif
diff --git a/src/battle_bg.c b/src/battle_bg.c
new file mode 100644
index 000000000..999b64a54
--- /dev/null
+++ b/src/battle_bg.c
@@ -0,0 +1,752 @@
+#include "global.h"
+#include "battle.h"
+#include "sprite.h"
+#include "constants/trainers.h"
+#include "graphics.h"
+#include "decompress.h"
+#include "bg.h"
+#include "palette.h"
+#include "main.h"
+#include "gpu_regs.h"
+#include "link.h"
+#include "battle_message.h"
+#include "task.h"
+#include "trig.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "window.h"
+#include "text_window.h"
+#include "menu.h"
+#include "battle_setup.h"
+#include "constants/map_types.h"
+
+struct BattleBackground
+{
+ const void *tileset;
+ const void *tilemap;
+ const void *entryTileset;
+ const void *entryTilemap;
+ const void *palette;
+};
+
+extern const struct SpriteTemplate gUnknown_0831A9D0;
+extern const struct SpriteTemplate gUnknown_0831A9E8;
+extern const struct CompressedSpriteSheet gUnknown_0831AA00;
+extern const struct BgTemplate gBattleBgTemplates[4];
+extern const struct WindowTemplate *const gBattleWindowTemplates[];
+extern const struct BattleBackground gBattleTerrainTable[];
+
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+
+extern u8 GetCurrentMapBattleScene(void);
+
+void BattleInitBgsAndWindows(void)
+{
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gBattleBgTemplates, ARRAY_COUNT(gBattleBgTemplates));
+
+ if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
+ {
+ gBattleScripting.windowsType = 1;
+ SetBgTilemapBuffer(1, gUnknown_02023060);
+ SetBgTilemapBuffer(2, gUnknown_02023060);
+ }
+ else
+ {
+ gBattleScripting.windowsType = 0;
+ }
+
+ InitWindows(gBattleWindowTemplates[gBattleScripting.windowsType]);
+ DeactivateAllTextPrinters();
+}
+
+void sub_80356D0(void)
+{
+ DisableInterrupts(INTR_FLAG_HBLANK);
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ BattleInitBgsAndWindows();
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+}
+
+void LoadBattleMenuWindowGfx(void)
+{
+ LoadUserWindowBorderGfx(2, 0x12, 0x10);
+ LoadUserWindowBorderGfx(2, 0x22, 0x10);
+ LoadCompressedPalette(gUnknown_08D85600, 0x50, 0x20);
+
+ if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
+ {
+ sub_81978B0(0x70);
+ LoadMessageBoxGfx(0, 0x30, 0x70);
+ gPlttBufferUnfaded[0x76] = 0;
+ CpuCopy16(&gPlttBufferUnfaded[0x76], &gPlttBufferFaded[0x76], 2);
+ }
+}
+
+void DrawMainBattleBackground(void)
+{
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000))
+ {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Rayquaza, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Rayquaza, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, 0x20, 0x60);
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
+ if (trainerClass == TRAINER_CLASS_LEADER)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
+ return;
+ }
+ else if (trainerClass == TRAINER_CLASS_CHAMPION)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumWallace, 0x20, 0x60);
+ return;
+ }
+ }
+
+ switch (GetCurrentMapBattleScene())
+ {
+ default:
+ case MAP_BATTLE_SCENE_NORMAL:
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_GYM:
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_MAGMA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_AQUA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_SIDNEY:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_PHOEBE:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_GLACIA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_DRAKE:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_FRONTIER:
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
+ break;
+ }
+ }
+}
+
+void LoadBattleTextboxAndBackground(void)
+{
+ LZDecompressVram(gBattleTextboxTiles, (void*)(VRAM));
+ CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
+ LoadBattleMenuWindowGfx();
+
+ DrawMainBattleBackground();
+}
+
+static void sub_8035AE4(u8 taskId, u8 battlerId, u8 bgId, u8 destX, u8 destY)
+{
+ s32 i;
+ u16 var = 0;
+ u16 src[6];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gTasks[taskId].data[5] != 0)
+ {
+ switch (battlerId)
+ {
+ case 0:
+ var = 0x3F & gTasks[taskId].data[3];
+ break;
+ case 1:
+ var = (0xFC0 & gTasks[taskId].data[4]) >> 6;
+ break;
+ case 2:
+ var = (0xFC0 & gTasks[taskId].data[3]) >> 6;
+ break;
+ case 3:
+ var = 0x3F & gTasks[taskId].data[4];
+ break;
+ }
+ }
+ else
+ {
+ switch (battlerId)
+ {
+ case 0:
+ var = 0x3F & gTasks[taskId].data[3];
+ break;
+ case 1:
+ var = 0x3F & gTasks[taskId].data[4];
+ break;
+ case 2:
+ var = (0xFC0 & gTasks[taskId].data[3]) >> 6;
+ break;
+ case 3:
+ var = (0xFC0 & gTasks[taskId].data[4]) >> 6;
+ break;
+ }
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ src[i] = ((var & (3 << (i * 2))) >> (i * 2)) + 0x6001;
+ }
+
+ CopyToBgTilemapBufferRect_ChangePalette(bgId, src, destX, destY, 3, 1, 0x11);
+ CopyBgTilemapBufferToVram(bgId);
+ }
+ else
+ {
+ if (battlerId == gBattleScripting.multiplayerId)
+ var = gTasks[taskId].data[3];
+ else
+ var = gTasks[taskId].data[4];
+
+ for (i = 0; i < 6; i++)
+ {
+ src[i] = ((var & (3 << (i * 2))) >> (i * 2)) + 0x6001;
+ }
+
+ CopyToBgTilemapBufferRect_ChangePalette(bgId, src, destX, destY, 6, 1, 0x11);
+ CopyBgTilemapBufferToVram(bgId);
+ }
+}
+
+static void sub_8035C4C(void)
+{
+ if (gBattleOutcome == B_OUTCOME_DREW)
+ {
+ BattlePutTextOnWindow(gText_Draw, 0x15);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gBattleOutcome == B_OUTCOME_WON)
+ {
+ switch (gLinkPlayers[gBattleScripting.multiplayerId].id)
+ {
+ case 0:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ case 1:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ case 2:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ case 3:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ }
+ }
+ else
+ {
+ switch (gLinkPlayers[gBattleScripting.multiplayerId].id)
+ {
+ case 0:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ case 1:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ case 2:
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ break;
+ case 3:
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ break;
+ }
+ }
+ }
+ else if (gBattleOutcome == B_OUTCOME_WON)
+ {
+ if (gLinkPlayers[gBattleScripting.multiplayerId].id != 0)
+ {
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ }
+ else
+ {
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ }
+ }
+ else
+ {
+ if (gLinkPlayers[gBattleScripting.multiplayerId].id != 0)
+ {
+ BattlePutTextOnWindow(gText_Win, 0x16);
+ BattlePutTextOnWindow(gText_Loss, 0x17);
+ }
+ else
+ {
+ BattlePutTextOnWindow(gText_Win, 0x17);
+ BattlePutTextOnWindow(gText_Loss, 0x16);
+ }
+ }
+}
+
+void sub_8035D74(u8 taskId)
+{
+ struct LinkPlayer *linkPlayer;
+ u8 *name;
+ s32 i, palId;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
+ {
+ name = gLinkPlayers[i].name;
+ linkPlayer = &gLinkPlayers[i];
+
+ switch (linkPlayer->id)
+ {
+ case 0:
+ BattlePutTextOnWindow(name, 0x11);
+ sub_8035AE4(taskId, linkPlayer->id, 1, 2, 4);
+ break;
+ case 1:
+ BattlePutTextOnWindow(name, 0x12);
+ sub_8035AE4(taskId, linkPlayer->id, 2, 2, 4);
+ break;
+ case 2:
+ BattlePutTextOnWindow(name, 0x13);
+ sub_8035AE4(taskId, linkPlayer->id, 1, 2, 8);
+ break;
+ case 3:
+ BattlePutTextOnWindow(name, 0x14);
+ sub_8035AE4(taskId, linkPlayer->id, 2, 2, 8);
+ break;
+ }
+ }
+ }
+ else
+ {
+ u8 playerId = gBattleScripting.multiplayerId;
+ u8 opponentId = playerId ^ BIT_SIDE;
+ u8 opponentId_copy = opponentId;
+
+ if (gLinkPlayers[playerId].id != 0)
+ opponentId = playerId, playerId = opponentId_copy;
+
+ name = gLinkPlayers[playerId].name;
+ BattlePutTextOnWindow(name, 0xF);
+
+ name = gLinkPlayers[opponentId].name;
+ BattlePutTextOnWindow(name, 0x10);
+
+ sub_8035AE4(taskId, playerId, 1, 2, 7);
+ sub_8035AE4(taskId, opponentId, 2, 2, 7);
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ palId = AllocSpritePalette(0x2710);
+ gPlttBufferUnfaded[palId * 16 + 0x10F] = gPlttBufferFaded[palId * 16 + 0x10F] = 0x7FFF;
+ gBattleStruct->field_7D = CreateSprite(&gUnknown_0831A9D0, 111, 80, 0);
+ gBattleStruct->field_7E = CreateSprite(&gUnknown_0831A9E8, 129, 80, 0);
+ gSprites[gBattleStruct->field_7D].invisible = 1;
+ gSprites[gBattleStruct->field_7E].invisible = 1;
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (gTasks[taskId].data[5] != 0)
+ {
+ gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);
+ gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);
+ gBattle_BG1_Y = -36;
+ gBattle_BG2_Y = -36;
+ }
+ else
+ {
+ gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);
+ gBattle_BG1_Y = (Cos2(gTasks[taskId].data[1]) / 32) - 164;
+ gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);
+ gBattle_BG2_Y = (Cos2(gTasks[taskId].data[2]) / 32) - 164;
+ }
+
+ if (gTasks[taskId].data[2] != 0)
+ {
+ gTasks[taskId].data[2] -= 2;
+ gTasks[taskId].data[1] += 2;
+ }
+ else
+ {
+ if (gTasks[taskId].data[5] != 0)
+ sub_8035C4C();
+
+ PlaySE(SE_W231);
+ DestroyTask(taskId);
+ gSprites[gBattleStruct->field_7D].invisible = 0;
+ gSprites[gBattleStruct->field_7E].invisible = 0;
+ gSprites[gBattleStruct->field_7E].oam.tileNum += 0x40;
+ gSprites[gBattleStruct->field_7D].data[0] = 0;
+ gSprites[gBattleStruct->field_7E].data[0] = 1;
+ gSprites[gBattleStruct->field_7D].data[1] = gSprites[gBattleStruct->field_7D].pos1.x;
+ gSprites[gBattleStruct->field_7E].data[1] = gSprites[gBattleStruct->field_7E].pos1.x;
+ gSprites[gBattleStruct->field_7D].data[2] = 0;
+ gSprites[gBattleStruct->field_7E].data[2] = 0;
+ }
+ break;
+ }
+}
+
+void DrawBattleEntryBackground(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ LZDecompressVram(gUnknown_08D778F0, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gUnknown_08D77B0C, (void*)(VRAM + 0x10000));
+ LoadCompressedPalette(gUnknown_08D77AE4, 0x60, 0x20);
+ SetBgAttribute(1, BG_CTRL_ATTR_MAPBASEINDEX, 1);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04);
+ CopyToBgTilemapBuffer(1, gUnknown_08D779D8, 0, 0);
+ CopyToBgTilemapBuffer(2, gUnknown_08D779D8, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ SetGpuReg(REG_OFFSET_WININ, 0x36);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x36);
+ gBattle_BG1_Y = 0xFF5C;
+ gBattle_BG2_Y = 0xFF5C;
+ LoadCompressedObjectPicUsingHeap(&gUnknown_0831AA00);
+ }
+ else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
+ {
+ if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == TRAINER_STEVEN_PARTNER)
+ {
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
+ }
+ else
+ {
+ SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 2);
+ SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 2);
+ CopyToBgTilemapBuffer(1, gUnknown_08D857A8, 0, 0);
+ CopyToBgTilemapBuffer(2, gUnknown_08D85A1C, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ }
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
+ {
+ LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void*)(VRAM + 0xE000));
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE)
+ {
+ LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void*)(VRAM + 0xE000));
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA)
+ {
+ LZDecompressVram(gBattleTerrainAnimTiles_Rayquaza, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainAnimTilemap_Rayquaza, (void*)(VRAM + 0xE000));
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
+ if (trainerClass == TRAINER_CLASS_LEADER)
+ {
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
+ return;
+ }
+ else if (trainerClass == TRAINER_CLASS_CHAMPION)
+ {
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
+ return;
+ }
+ }
+
+ if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL)
+ {
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTileset, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void*)(VRAM + 0xE000));
+ }
+ else
+ {
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
+ }
+ }
+}
+
+bool8 LoadChosenBattleElement(u8 caseId)
+{
+ bool8 ret = FALSE;
+
+ switch (caseId)
+ {
+ case 0:
+ LZDecompressVram(gBattleTextboxTiles, (void*)(VRAM));
+ break;
+ case 1:
+ CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ break;
+ case 2:
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
+ break;
+ case 3:
+ if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
+ {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000));
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
+ if (trainerClass == TRAINER_CLASS_LEADER)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ break;
+ }
+ else if (trainerClass == TRAINER_CLASS_CHAMPION)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ break;
+ }
+ }
+
+ switch (GetCurrentMapBattleScene())
+ {
+ default:
+ case MAP_BATTLE_SCENE_NORMAL:
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_GYM:
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_MAGMA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_AQUA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_SIDNEY:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_PHOEBE:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_GLACIA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_DRAKE:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ break;
+ case MAP_BATTLE_SCENE_FRONTIER:
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ break;
+ }
+ }
+ break;
+ case 4:
+ if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
+ {
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
+ {
+ if (gGameVersion == VERSION_RUBY)
+ LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000));
+ else
+ LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000));
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
+ if (trainerClass == TRAINER_CLASS_LEADER)
+ {
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ break;
+ }
+ else if (trainerClass == TRAINER_CLASS_CHAMPION)
+ {
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ break;
+ }
+ }
+
+ switch (GetCurrentMapBattleScene())
+ {
+ default:
+ case MAP_BATTLE_SCENE_NORMAL:
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_GYM:
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_MAGMA:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_AQUA:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_SIDNEY:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_PHOEBE:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_GLACIA:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_DRAKE:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ break;
+ case MAP_BATTLE_SCENE_FRONTIER:
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ break;
+ }
+ }
+ break;
+ case 5:
+ if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
+ {
+ LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
+ {
+ if (gGameVersion == VERSION_RUBY)
+ LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
+ else
+ LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
+ if (trainerClass == TRAINER_CLASS_LEADER)
+ {
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
+ break;
+ }
+ else if (trainerClass == TRAINER_CLASS_CHAMPION)
+ {
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumWallace, 0x20, 0x60);
+ break;
+ }
+ }
+
+ switch (GetCurrentMapBattleScene())
+ {
+ default:
+ case MAP_BATTLE_SCENE_NORMAL:
+ LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_GYM:
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_MAGMA:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_AQUA:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_SIDNEY:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_PHOEBE:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_GLACIA:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_DRAKE:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_FRONTIER:
+ LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
+ break;
+ }
+ }
+ break;
+ case 6:
+ LoadBattleMenuWindowGfx();
+ break;
+ default:
+ ret = TRUE;
+ break;
+ }
+
+ return ret;
+}
diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c
index 423d34d45..d786dacd1 100644
--- a/src/battle_controller_link_opponent.c
+++ b/src/battle_controller_link_opponent.c
@@ -4,13 +4,15 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
-#include "battle_link_817C95C.h"
+#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
-#include "songs.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
#include "sound.h"
#include "window.h"
#include "m4a.h"
@@ -22,47 +24,19 @@
#include "reshow_battle_screen.h"
#include "pokeball.h"
#include "data2.h"
+#include "battle_setup.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void (*gPreBattleCallback1)(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u16 gSpecialVar_ItemId;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
-extern u16 gUnknown_020243FC;
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u16 gPartnerTrainerId;
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u8 gUnknown_020244B4[];
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
-extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct UnusedControllerStruct gUnknown_02022D0C;
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
-extern const struct BattleMove gBattleMoves[];
-extern const u8 gUnknown_0831F578[];
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_806A068(u16, u8);
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
extern void sub_81851A8(u8 *);
extern u16 sub_8068B48(void);
+extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
// this file's functions
static void LinkOpponentHandleGetMonData(void);
@@ -82,7 +56,7 @@ static void LinkOpponentHandleBallThrowAnim(void);
static void LinkOpponentHandlePause(void);
static void LinkOpponentHandleMoveAnimation(void);
static void LinkOpponentHandlePrintString(void);
-static void LinkOpponentHandlePrintStringPlayerOnly(void);
+static void LinkOpponentHandlePrintSelectionString(void);
static void LinkOpponentHandleChooseAction(void);
static void LinkOpponentHandleUnknownYesNoBox(void);
static void LinkOpponentHandleChooseMove(void);
@@ -108,14 +82,14 @@ static void LinkOpponentHandleCmd39(void);
static void LinkOpponentHandleCmd40(void);
static void LinkOpponentHandleHitAnimation(void);
static void LinkOpponentHandleCmd42(void);
-static void LinkOpponentHandleEffectivenessSound(void);
+static void LinkOpponentHandlePlaySE(void);
static void LinkOpponentHandlePlayFanfareOrBGM(void);
static void LinkOpponentHandleFaintingCry(void);
static void LinkOpponentHandleIntroSlide(void);
static void LinkOpponentHandleIntroTrainerBallThrow(void);
static void LinkOpponentHandleDrawPartyStatusSummary(void);
-static void LinkOpponentHandleCmd49(void);
-static void LinkOpponentHandleCmd50(void);
+static void LinkOpponentHandleHidePartyStatusSummary(void);
+static void LinkOpponentHandleEndBounceEffect(void);
static void LinkOpponentHandleSpriteInvisibility(void);
static void LinkOpponentHandleBattleAnimation(void);
static void LinkOpponentHandleLinkStandbyMsg(void);
@@ -128,7 +102,7 @@ static void LinkOpponentBufferExecCompleted(void);
static void sub_8064DD0(void);
static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst);
static void SetLinkOpponentMonData(u8 monId);
-static void sub_8066494(u8 bank, bool8 dontClearSubstituteBit);
+static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit);
static void DoSwitchOutAnimation(void);
static void LinkOpponentDoMoveAnimation(void);
static void sub_8067618(u8 taskId);
@@ -154,7 +128,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
LinkOpponentHandlePause,
LinkOpponentHandleMoveAnimation,
LinkOpponentHandlePrintString,
- LinkOpponentHandlePrintStringPlayerOnly,
+ LinkOpponentHandlePrintSelectionString,
LinkOpponentHandleChooseAction,
LinkOpponentHandleUnknownYesNoBox,
LinkOpponentHandleChooseMove,
@@ -180,14 +154,14 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
LinkOpponentHandleCmd40,
LinkOpponentHandleHitAnimation,
LinkOpponentHandleCmd42,
- LinkOpponentHandleEffectivenessSound,
+ LinkOpponentHandlePlaySE,
LinkOpponentHandlePlayFanfareOrBGM,
LinkOpponentHandleFaintingCry,
LinkOpponentHandleIntroSlide,
LinkOpponentHandleIntroTrainerBallThrow,
LinkOpponentHandleDrawPartyStatusSummary,
- LinkOpponentHandleCmd49,
- LinkOpponentHandleCmd50,
+ LinkOpponentHandleHidePartyStatusSummary,
+ LinkOpponentHandleEndBounceEffect,
LinkOpponentHandleSpriteInvisibility,
LinkOpponentHandleBattleAnimation,
LinkOpponentHandleLinkStandbyMsg,
@@ -202,48 +176,48 @@ static void nullsub_28(void)
void SetControllerToLinkOpponent(void)
{
- gBattleBankFunc[gActiveBank] = LinkOpponentBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = LinkOpponentBufferRunCommand;
}
static void LinkOpponentBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sLinkOpponentBufferCommands))
- sLinkOpponentBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands))
+ sLinkOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
LinkOpponentBufferExecCompleted();
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
LinkOpponentBufferExecCompleted();
}
static void CompleteOnBankSpriteCallbackDummy2(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
LinkOpponentBufferExecCompleted();
}
static void sub_8064470(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- FreeTrainerFrontPicPalette(gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam);
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
+ FreeTrainerFrontPicPalette(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
LinkOpponentBufferExecCompleted();
}
}
static void sub_80644D8(void)
{
- if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 0xFF)
+ if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
LinkOpponentBufferExecCompleted();
}
}
@@ -255,13 +229,13 @@ static void sub_8064520(void)
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
r8 = TRUE;
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy)
{
r8 = TRUE;
}
@@ -270,39 +244,39 @@ static void sub_8064520(void)
if (r8)
{
- if (r4 || !IsAnimBankSpriteVisible(gActiveBank ^ BIT_MON))
+ if (r4 || !IsBattlerSpriteVisible(BATTLE_PARTNER(gActiveBattler)))
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
return;
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x1)
return;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
return;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
- if (GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON2)
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)
{
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
}
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_80644D8;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80644D8;
}
}
@@ -310,106 +284,106 @@ static void sub_8064734(void)
{
bool32 r10 = FALSE;
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
}
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
+ && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x1)
{
- sub_8172EF0(gActiveBank ^ BIT_MON, &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]]);
+ sub_8172EF0(BATTLE_PARTNER(gActiveBattler), &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]);
}
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL);
+ sub_8076918(BATTLE_PARTNER(gActiveBattler));
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]);
}
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1;
}
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x40
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x40
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x40
&& !IsCryPlayingOrClearCrySongs())
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- if (GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON1)
- m4aMPlayContinue(&gMPlay_BGM);
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)
+ m4aMPlayContinue(&gMPlayInfo_BGM);
}
else
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
}
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1;
r10 = TRUE;
}
if (r10)
{
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON2)
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)
{
- if (++gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 1)
+ if (++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 1)
return;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
}
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank ^ BIT_MON, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]], MON_DATA_SPECIES));
+ DestroySprite(&gSprites[gUnknown_03005D7C[BATTLE_PARTNER(gActiveBattler)]]);
+ SetBattlerShadowSpriteCallback(BATTLE_PARTNER(gActiveBattler), GetMonData(&gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], MON_DATA_SPECIES));
}
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0;
- gBattleBankFunc[gActiveBank] = sub_8064520;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064520;
}
}
}
static void sub_8064B04(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80)
{
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
}
else
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
LinkOpponentBufferExecCompleted();
@@ -420,13 +394,13 @@ static void sub_8064B04(void)
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
{
@@ -436,21 +410,21 @@ static void CompleteOnHealthbarDone(void)
static void sub_8064C14(void)
{
- if (!gSprites[gBankSpriteIds[gActiveBank]].inUse)
+ if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse)
{
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
LinkOpponentBufferExecCompleted();
}
}
static void sub_8064C58(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- EnemyShadowCallbackToSetInvisible(gActiveBank);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ HideBattlerShadowSprite(gActiveBattler);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
LinkOpponentBufferExecCompleted();
}
}
@@ -463,42 +437,42 @@ static void CompleteOnInactiveTextPrinter(void)
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
LinkOpponentBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
static void sub_8064D60(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleBankFunc[gActiveBank] = sub_8064DD0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064DD0;
}
}
static void sub_8064DD0(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive && !IsCryPlayingOrClearCrySongs())
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs())
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- || gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy_2)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ || gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy_2)
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
LinkOpponentBufferExecCompleted();
}
}
@@ -506,67 +480,67 @@ static void sub_8064DD0(void)
static void sub_8064E50(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
- CopyBattleSpriteInvisibility(gActiveBank);
- gBattleBankFunc[gActiveBank] = sub_8064D60;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
+ CopyBattleSpriteInvisibility(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064D60;
}
}
static void sub_8064F40(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80)
{
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
}
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
- gBattleBankFunc[gActiveBank] = sub_8064E50;
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064E50;
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
LinkOpponentBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
LinkOpponentBufferExecCompleted();
}
static void LinkOpponentBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = LinkOpponentBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = LinkOpponentBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
@@ -577,13 +551,13 @@ static void LinkOpponentHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += CopyLinkOpponentMonData(gBattlePartyID[gActiveBank], monData);
+ size += CopyLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -591,7 +565,7 @@ static void LinkOpponentHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
LinkOpponentBufferExecCompleted();
}
@@ -605,7 +579,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);
@@ -671,7 +645,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -686,7 +660,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -911,13 +885,13 @@ static void LinkOpponentHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetLinkOpponentMonData(gBattlePartyID[gActiveBank]);
+ SetLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -930,11 +904,11 @@ static void LinkOpponentHandleSetMonData(void)
static void SetLinkOpponentMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -975,10 +949,10 @@ static void SetLinkOpponentMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -992,263 +966,263 @@ static void SetLinkOpponentMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
}
static void LinkOpponentHandleSetRawMonData(void)
{
- u8 *dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
+ u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
- dst[i] = gBattleBufferA[gActiveBank][3 + i];
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
+ dst[i] = gBattleBufferA[gActiveBattler][3 + i];
LinkOpponentBufferExecCompleted();
}
static void LinkOpponentHandleLoadMonSprite(void)
{
- u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_806A068(species, GetBankIdentity(gActiveBank));
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(gActiveBank, 2),
- GetBankSpriteDefault_Y(gActiveBank),
- sub_80A82E4(gActiveBank));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(gActiveBattler, 2),
+ GetBattlerSpriteDefault_Y(gActiveBattler),
+ sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
- gBattleBankFunc[gActiveBank] = sub_8064B04;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064B04;
}
static void LinkOpponentHandleSwitchInAnim(void)
{
- gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1];
- sub_8066494(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattleBankFunc[gActiveBank] = sub_8064F40;
+ gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];
+ sub_8066494(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064F40;
}
-static void sub_8066494(u8 bank, bool8 dontClearSubstituteBit)
+static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit)
{
u16 species;
- ClearTemporarySpeciesSpriteData(bank, dontClearSubstituteBit);
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank);
- sub_806A068(species, GetBankIdentity(bank));
+ ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
- gBankSpriteIds[bank] = CreateSprite(
- &gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattlerSpriteIds[battlerId] = CreateSprite(
+ &gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFE);
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT);
}
static void LinkOpponentHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = DoSwitchOutAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- EnemyShadowCallbackToSetInvisible(gActiveBank);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ HideBattlerShadowSprite(gActiveBattler);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
LinkOpponentBufferExecCompleted();
}
}
static void DoSwitchOutAnimation(void)
{
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON);
- gBattleBankFunc[gActiveBank] = sub_8064C58;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064C58;
}
break;
}
@@ -1261,39 +1235,39 @@ static void LinkOpponentHandleDrawTrainerPic(void)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- if ((GetBankIdentity(gActiveBank) & BIT_MON) != 0) // second mon
+ if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon
xPos = 152;
else // first mon
xPos = 200;
if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
{
- if (gActiveBank == 1)
+ if (gActiveBattler == B_POSITION_OPPONENT_LEFT)
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A);
else
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B);
}
else
{
- if ((gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_FIRE_RED
- || (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_LEAF_GREEN)
+ if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_FIRE_RED
+ || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_LEAF_GREEN)
{
- if (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender != 0)
- trainerPicId = gUnknown_0831F578[0x4F];
+ if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE)
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_LEAF];
else
- trainerPicId = gUnknown_0831F578[0x4E];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_RED];
}
- else if ((gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_RUBY
- || (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_SAPPHIRE)
+ else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY
+ || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE)
{
- if (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender != 0)
- trainerPicId = gUnknown_0831F578[0x51];
+ if (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender != MALE)
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_RS_MAY];
else
- trainerPicId = gUnknown_0831F578[0x50];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_RS_BRENDAN];
}
else
{
- trainerPicId = PlayerGenderToFrontTrainerPicId(gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender);
+ trainerPicId = PlayerGenderToFrontTrainerPicId(gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender);
}
}
}
@@ -1308,17 +1282,17 @@ static void LinkOpponentHandleDrawTrainerPic(void)
|| (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_LEAF_GREEN)
{
if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != 0)
- trainerPicId = gUnknown_0831F578[0x4F];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_LEAF];
else
- trainerPicId = gUnknown_0831F578[0x4E];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_RED];
}
else if ((gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_RUBY
|| (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_SAPPHIRE)
{
if (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].gender != 0)
- trainerPicId = gUnknown_0831F578[0x51];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_RS_MAY];
else
- trainerPicId = gUnknown_0831F578[0x50];
+ trainerPicId = gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_RS_BRENDAN];
}
else
{
@@ -1326,73 +1300,73 @@ static void LinkOpponentHandleDrawTrainerPic(void)
}
}
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
xPos,
(8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40,
- sub_80A82E4(gActiveBank));
+ sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 2;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void LinkOpponentHandleTrainerSlide(void)
{
u32 trainerPicId;
- if (gActiveBank == 1)
+ if (gActiveBattler == 1)
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A);
else
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B);
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E);
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E);
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 96;
- gSprites[gBankSpriteIds[gActiveBank]].pos1.x += 32;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 96;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.x += 32;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy2; // this line is redundant, because LinkOpponentBufferExecCompleted changes the battle bank function
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; // this line is redundant, because LinkOpponentBufferExecCompleted changes the battle battlerId function
LinkOpponentBufferExecCompleted();
}
static void LinkOpponentHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 280;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
- gBattleBankFunc[gActiveBank] = sub_8064470;
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064470;
}
static void LinkOpponentHandleFaintAnimation(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_OPPONENT);
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039934;
- gBattleBankFunc[gActiveBank] = sub_8064C14;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064C14;
}
}
}
@@ -1419,52 +1393,52 @@ static void LinkOpponentHandlePause(void)
static void LinkOpponentHandleMoveAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
-
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
{
LinkOpponentBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = LinkOpponentDoMoveAnimation;
- sub_817E0FC(move, gWeatherMoveAnim, gAnimDisableStructPtr);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDoMoveAnimation;
+ BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr);
}
}
}
static void LinkOpponentDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- u8 multihit = gBattleBufferA[gActiveBank][11];
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+ u8 multihit = gBattleBufferA[gActiveBattler][11];
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute
- && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute
+ && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)
{
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -1472,20 +1446,20 @@ static void LinkOpponentDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
LinkOpponentBufferExecCompleted();
}
break;
@@ -1498,14 +1472,14 @@ static void LinkOpponentHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
- sub_817C95C(*stringId);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
+ BattleTv_SetDataBasedOnString(*stringId);
}
-static void LinkOpponentHandlePrintStringPlayerOnly(void)
+static void LinkOpponentHandlePrintSelectionString(void)
{
LinkOpponentBufferExecCompleted();
}
@@ -1545,23 +1519,23 @@ static void LinkOpponentHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void LinkOpponentHandleExpUpdate(void)
@@ -1571,24 +1545,24 @@ static void LinkOpponentHandleExpUpdate(void)
static void LinkOpponentHandleStatusIconUpdate(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 bank;
+ u8 battlerId;
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_STATUS_ICON);
- bank = gActiveBank;
- gBattleSpritesDataPtr->healthBoxesData[bank].statusAnimActive = 0;
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);
+ battlerId = gActiveBattler;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void LinkOpponentHandleStatusAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1],
- gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24));
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],
+ gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
@@ -1645,7 +1619,7 @@ static void LinkOpponentHandleCmd37(void)
static void LinkOpponentHandleCmd38(void)
{
- gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBank][1];
+ gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1];
LinkOpponentBufferExecCompleted();
}
@@ -1663,16 +1637,16 @@ static void LinkOpponentHandleCmd40(void)
static void LinkOpponentHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
LinkOpponentBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -1681,29 +1655,29 @@ static void LinkOpponentHandleCmd42(void)
LinkOpponentBufferExecCompleted();
}
-static void LinkOpponentHandleEffectivenessSound(void)
+static void LinkOpponentHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
LinkOpponentBufferExecCompleted();
}
static void LinkOpponentHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
LinkOpponentBufferExecCompleted();
@@ -1711,7 +1685,7 @@ static void LinkOpponentHandlePlayFanfareOrBGM(void)
static void LinkOpponentHandleFaintingCry(void)
{
- u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry3(species, 25, 5);
LinkOpponentBufferExecCompleted();
@@ -1719,8 +1693,8 @@ static void LinkOpponentHandleFaintingCry(void)
static void LinkOpponentHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
LinkOpponentBufferExecCompleted();
}
@@ -1729,46 +1703,46 @@ static void LinkOpponentHandleIntroTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 280;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_80676FC);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_80676FC);
taskId = CreateTask(sub_8067618, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_28;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_28;
}
static void sub_8067618(u8 taskId)
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBank = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
+ gActiveBattler = gTasks[taskId].data[0];
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_8066494(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_8066494(gActiveBattler, FALSE);
}
else
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_8066494(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_8066494(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_8066494(gActiveBattler, FALSE);
+ gActiveBattler = BATTLE_PARTNER(gActiveBattler);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_8066494(gActiveBattler, FALSE);
+ gActiveBattler = BATTLE_PARTNER(gActiveBattler);
}
- gBattleBankFunc[gActiveBank] = sub_8064734;
- gActiveBank = savedActiveBank;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8064734;
+ gActiveBattler = savedActiveBank;
DestroyTask(taskId);
}
@@ -1781,87 +1755,87 @@ static void sub_80676FC(struct Sprite *sprite)
static void LinkOpponentHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
LinkOpponentBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
- if (gBattleBufferA[gActiveBank][2] != 0)
+ if (gBattleBufferA[gActiveBattler][2] != 0)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E < 2)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E < 2)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E++;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E++;
return;
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E = 0;
}
}
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
- if (gBattleBufferA[gActiveBank][2] != 0)
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0x5D;
+ if (gBattleBufferA[gActiveBattler][2] != 0)
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D;
- gBattleBankFunc[gActiveBank] = sub_806782C;
+ gBattlerControllerFuncs[gActiveBattler] = sub_806782C;
}
}
static void sub_806782C(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5++ > 0x5C)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
LinkOpponentBufferExecCompleted();
}
}
-static void LinkOpponentHandleCmd49(void)
+static void LinkOpponentHandleHidePartyStatusSummary(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
LinkOpponentBufferExecCompleted();
}
-static void LinkOpponentHandleCmd50(void)
+static void LinkOpponentHandleEndBounceEffect(void)
{
LinkOpponentBufferExecCompleted();
}
static void LinkOpponentHandleSpriteInvisibility(void)
{
- if (IsBankSpritePresent(gActiveBank))
+ if (IsBattlerSpritePresent(gActiveBattler))
{
- gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
- CopyBattleSpriteInvisibility(gActiveBank);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];
+ CopyBattleSpriteInvisibility(gActiveBattler);
}
LinkOpponentBufferExecCompleted();
}
static void LinkOpponentHandleBattleAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
LinkOpponentBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
- sub_817E32C(animationId);
+ BattleTv_SetDataBasedOnAnimation(animationId);
}
}
static void LinkOpponentHandleLinkStandbyMsg(void)
{
- sub_81851A8(&gBattleBufferA[gActiveBank][2]);
+ sub_81851A8(&gBattleBufferA[gActiveBattler][2]);
LinkOpponentBufferExecCompleted();
}
@@ -1872,18 +1846,18 @@ static void LinkOpponentHandleResetActionMoveSelection(void)
static void LinkOpponentHandleCmd55(void)
{
- sub_81851A8(&gBattleBufferA[gActiveBank][4]);
+ sub_81851A8(&gBattleBufferA[gActiveBattler][4]);
- if (gBattleBufferA[gActiveBank][1] == BATTLE_DREW)
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
+ if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW)
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
else
- gBattleOutcome = gBattleBufferA[gActiveBank][1] ^ BATTLE_DREW;
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW;
- gSaveBlock2Ptr->field_CA9_b = gBattleBufferA[gActiveBank][2];
+ gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
LinkOpponentBufferExecCompleted();
- gBattleBankFunc[gActiveBank] = sub_80587B0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80587B0;
}
static void nullsub_92(void)
diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c
index e3bee98d9..9867c14e4 100644
--- a/src/battle_controller_link_partner.c
+++ b/src/battle_controller_link_partner.c
@@ -4,13 +4,15 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
-#include "battle_link_817C95C.h"
+#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
-#include "songs.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
#include "sound.h"
#include "window.h"
#include "m4a.h"
@@ -22,43 +24,18 @@
#include "reshow_battle_screen.h"
#include "pokeball.h"
#include "data2.h"
+#include "battle_setup.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void (*gPreBattleCallback1)(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u16 gSpecialVar_ItemId;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
-extern u16 gUnknown_020243FC;
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u16 gPartnerTrainerId;
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u8 gUnknown_020244B4[];
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
-extern const struct BattleMove gBattleMoves[];
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_806A068(u16, u8);
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
extern void sub_81851A8(u8 *);
+extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
// this file's functions
static void LinkPartnerHandleGetMonData(void);
@@ -78,7 +55,7 @@ static void LinkPartnerHandleBallThrowAnim(void);
static void LinkPartnerHandlePause(void);
static void LinkPartnerHandleMoveAnimation(void);
static void LinkPartnerHandlePrintString(void);
-static void LinkPartnerHandlePrintStringPlayerOnly(void);
+static void LinkPartnerHandlePrintSelectionString(void);
static void LinkPartnerHandleChooseAction(void);
static void LinkPartnerHandleUnknownYesNoBox(void);
static void LinkPartnerHandleChooseMove(void);
@@ -104,14 +81,14 @@ static void LinkPartnerHandleCmd39(void);
static void LinkPartnerHandleCmd40(void);
static void LinkPartnerHandleHitAnimation(void);
static void LinkPartnerHandleCmd42(void);
-static void LinkPartnerHandleEffectivenessSound(void);
+static void LinkPartnerHandlePlaySE(void);
static void LinkPartnerHandlePlayFanfareOrBGM(void);
static void LinkPartnerHandleFaintingCry(void);
static void LinkPartnerHandleIntroSlide(void);
static void LinkPartnerHandleIntroTrainerBallThrow(void);
static void LinkPartnerHandleDrawPartyStatusSummary(void);
-static void LinkPartnerHandleCmd49(void);
-static void LinkPartnerHandleCmd50(void);
+static void LinkPartnerHandleHidePartyStatusSummary(void);
+static void LinkPartnerHandleEndBounceEffect(void);
static void LinkPartnerHandleSpriteInvisibility(void);
static void LinkPartnerHandleBattleAnimation(void);
static void LinkPartnerHandleLinkStandbyMsg(void);
@@ -124,7 +101,7 @@ static void LinkPartnerBufferExecCompleted(void);
static void sub_814B554(void);
static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst);
static void SetLinkPartnerMonData(u8 monId);
-static void sub_814CC98(u8 bank, bool8 dontClearSubstituteBit);
+static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit);
static void DoSwitchOutAnimation(void);
static void LinkPartnerDoMoveAnimation(void);
static void sub_814DCCC(u8 taskId);
@@ -149,7 +126,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
LinkPartnerHandlePause,
LinkPartnerHandleMoveAnimation,
LinkPartnerHandlePrintString,
- LinkPartnerHandlePrintStringPlayerOnly,
+ LinkPartnerHandlePrintSelectionString,
LinkPartnerHandleChooseAction,
LinkPartnerHandleUnknownYesNoBox,
LinkPartnerHandleChooseMove,
@@ -175,14 +152,14 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
LinkPartnerHandleCmd40,
LinkPartnerHandleHitAnimation,
LinkPartnerHandleCmd42,
- LinkPartnerHandleEffectivenessSound,
+ LinkPartnerHandlePlaySE,
LinkPartnerHandlePlayFanfareOrBGM,
LinkPartnerHandleFaintingCry,
LinkPartnerHandleIntroSlide,
LinkPartnerHandleIntroTrainerBallThrow,
LinkPartnerHandleDrawPartyStatusSummary,
- LinkPartnerHandleCmd49,
- LinkPartnerHandleCmd50,
+ LinkPartnerHandleHidePartyStatusSummary,
+ LinkPartnerHandleEndBounceEffect,
LinkPartnerHandleSpriteInvisibility,
LinkPartnerHandleBattleAnimation,
LinkPartnerHandleLinkStandbyMsg,
@@ -197,42 +174,42 @@ static void nullsub_112(void)
void SetControllerToLinkPartner(void)
{
- gBattleBankFunc[gActiveBank] = LinkPartnerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = LinkPartnerBufferRunCommand;
}
static void LinkPartnerBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sLinkPartnerBufferCommands))
- sLinkPartnerBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands))
+ sLinkPartnerBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
LinkPartnerBufferExecCompleted();
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
LinkPartnerBufferExecCompleted();
}
static void sub_814AF54(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
nullsub_25(0);
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
LinkPartnerBufferExecCompleted();
}
}
static void sub_814AFBC(void)
{
- if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 0xFF)
+ if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
LinkPartnerBufferExecCompleted();
}
}
@@ -243,13 +220,13 @@ static void sub_814B004(void)
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
r6 = TRUE;
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
{
r6 = TRUE;
}
@@ -260,84 +237,84 @@ static void sub_814B004(void)
if (r6)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_814AFBC;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_814AFBC;
}
}
static void sub_814B0E8(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8
- && gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 != 1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive
+ && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 != 1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler ^ BIT_FLANK);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);
}
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleBankFunc[gActiveBank] = sub_814B004;
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B004;
}
}
static void sub_814B290(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].animEnded && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0)
LinkPartnerBufferExecCompleted();
}
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
{
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
LinkPartnerBufferExecCompleted();
}
}
static void sub_814B340(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > DISPLAY_HEIGHT)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
nullsub_24(species);
- FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
LinkPartnerBufferExecCompleted();
}
}
static void sub_814B3DC(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
LinkPartnerBufferExecCompleted();
}
}
@@ -350,39 +327,39 @@ static void CompleteOnInactiveTextPrinter(void)
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
LinkPartnerBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
static void sub_814B4E0(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- CopyBattleSpriteInvisibility(gActiveBank);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
+ CopyBattleSpriteInvisibility(gActiveBattler);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleBankFunc[gActiveBank] = sub_814B554;
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B554;
}
}
static void sub_814B554(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
LinkPartnerBufferExecCompleted();
}
@@ -390,66 +367,66 @@ static void sub_814B554(void)
static void sub_814B5A8(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
CreateTask(c3_0802FDF4, 10);
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
- gBattleBankFunc[gActiveBank] = sub_814B4E0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B4E0;
}
}
static void sub_814B69C(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);
}
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- gBattleBankFunc[gActiveBank] = sub_814B5A8;
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B5A8;
}
}
static void LinkPartnerBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = LinkPartnerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = LinkPartnerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
LinkPartnerBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
LinkPartnerBufferExecCompleted();
}
@@ -460,13 +437,13 @@ static void LinkPartnerHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += CopyLinkPartnerMonData(gBattlePartyID[gActiveBank], monData);
+ size += CopyLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -474,7 +451,7 @@ static void LinkPartnerHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
LinkPartnerBufferExecCompleted();
}
@@ -488,7 +465,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
@@ -554,7 +531,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -569,7 +546,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -794,13 +771,13 @@ static void LinkPartnerHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetLinkPartnerMonData(gBattlePartyID[gActiveBank]);
+ SetLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -813,11 +790,11 @@ static void LinkPartnerHandleSetMonData(void)
static void SetLinkPartnerMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -858,10 +835,10 @@ static void SetLinkPartnerMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -875,167 +852,167 @@ static void SetLinkPartnerMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
}
static void LinkPartnerHandleSetRawMonData(void)
{
- u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
+ u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
- dst[i] = gBattleBufferA[gActiveBank][3 + i];
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
+ dst[i] = gBattleBufferA[gActiveBattler][3 + i];
LinkPartnerBufferExecCompleted();
}
@@ -1044,93 +1021,93 @@ static void LinkPartnerHandleLoadMonSprite(void)
{
u16 species;
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
- sub_806A068(species, GetBankIdentity(gActiveBank));
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(gActiveBank, 2),
- GetBankSpriteDefault_Y(gActiveBank),
- sub_80A82E4(gActiveBank));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
- gBattleBankFunc[gActiveBank] = sub_814B290;
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(gActiveBattler, 2),
+ GetBattlerSpriteDefault_Y(gActiveBattler),
+ sub_80A82E4(gActiveBattler));
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B290;
}
static void LinkPartnerHandleSwitchInAnim(void)
{
- ClearTemporarySpeciesSpriteData(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_814CC98(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattleBankFunc[gActiveBank] = sub_814B69C;
+ ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ sub_814CC98(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B69C;
}
-static void sub_814CC98(u8 bank, bool8 dontClearSubstituteBit)
+static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit)
{
u16 species;
- ClearTemporarySpeciesSpriteData(bank, dontClearSubstituteBit);
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- sub_806A068(species, GetBankIdentity(bank));
+ ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
- gBankSpriteIds[bank] = CreateSprite(
- &gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattlerSpriteIds[battlerId] = CreateSprite(
+ &gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF);
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);
}
static void LinkPartnerHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = DoSwitchOutAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
LinkPartnerBufferExecCompleted();
}
}
static void DoSwitchOutAnimation(void)
{
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON);
- gBattleBankFunc[gActiveBank] = sub_814B3DC;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B3DC;
}
break;
}
@@ -1143,7 +1120,7 @@ static void LinkPartnerHandleDrawTrainerPic(void)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- if ((GetBankIdentity(gActiveBank) & BIT_MON) != 0) // second mon
+ if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon
xPos = 90;
else // first mon
xPos = 32;
@@ -1153,31 +1130,31 @@ static void LinkPartnerHandleDrawTrainerPic(void)
xPos = 80;
}
- if ((gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_FIRE_RED
- || (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_LEAF_GREEN)
+ if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_FIRE_RED
+ || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_LEAF_GREEN)
{
- trainerPicId = gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender + BACK_PIC_RED;
+ trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RED;
}
- else if ((gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_RUBY
- || (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_SAPPHIRE)
+ else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY
+ || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE)
{
- trainerPicId = gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender + BACK_PIC_RS_BRENDAN;
+ trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN;
}
else
{
- trainerPicId = gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender;
+ trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender;
}
- DecompressTrainerBackPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, xPos, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, sub_80A82E4(gActiveBank));
+ DecompressTrainerBackPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void LinkPartnerHandleTrainerSlide(void)
@@ -1187,34 +1164,34 @@ static void LinkPartnerHandleTrainerSlide(void)
static void LinkPartnerHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
- gBattleBankFunc[gActiveBank] = sub_814AF54;
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
+ gBattlerControllerFuncs[gActiveBattler] = sub_814AF54;
}
static void LinkPartnerHandleFaintAnimation(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER);
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 5;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00;
- gBattleBankFunc[gActiveBank] = sub_814B340;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00;
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B340;
}
}
}
@@ -1241,52 +1218,52 @@ static void LinkPartnerHandlePause(void)
static void LinkPartnerHandleMoveAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
-
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
{
LinkPartnerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = LinkPartnerDoMoveAnimation;
- sub_817E0FC(move, gWeatherMoveAnim, gAnimDisableStructPtr);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDoMoveAnimation;
+ BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr);
}
}
}
static void LinkPartnerDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- u8 multihit = gBattleBufferA[gActiveBank][11];
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+ u8 multihit = gBattleBufferA[gActiveBattler][11];
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute
- && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute
+ && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)
{
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -1294,20 +1271,20 @@ static void LinkPartnerDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
LinkPartnerBufferExecCompleted();
}
break;
@@ -1320,14 +1297,14 @@ static void LinkPartnerHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
- sub_817C95C(*stringId);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
+ BattleTv_SetDataBasedOnString(*stringId);
}
-static void LinkPartnerHandlePrintStringPlayerOnly(void)
+static void LinkPartnerHandlePrintSelectionString(void)
{
LinkPartnerBufferExecCompleted();
}
@@ -1367,23 +1344,23 @@ static void LinkPartnerHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void LinkPartnerHandleExpUpdate(void)
@@ -1393,24 +1370,24 @@ static void LinkPartnerHandleExpUpdate(void)
static void LinkPartnerHandleStatusIconUpdate(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 bank;
+ u8 battlerId;
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_STATUS_ICON);
- bank = gActiveBank;
- gBattleSpritesDataPtr->healthBoxesData[bank].statusAnimActive = 0;
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);
+ battlerId = gActiveBattler;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void LinkPartnerHandleStatusAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1],
- gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24));
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],
+ gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
@@ -1467,7 +1444,7 @@ static void LinkPartnerHandleCmd37(void)
static void LinkPartnerHandleCmd38(void)
{
- gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBank][1];
+ gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1];
LinkPartnerBufferExecCompleted();
}
@@ -1485,16 +1462,16 @@ static void LinkPartnerHandleCmd40(void)
static void LinkPartnerHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
LinkPartnerBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -1503,29 +1480,29 @@ static void LinkPartnerHandleCmd42(void)
LinkPartnerBufferExecCompleted();
}
-static void LinkPartnerHandleEffectivenessSound(void)
+static void LinkPartnerHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
LinkPartnerBufferExecCompleted();
}
static void LinkPartnerHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
LinkPartnerBufferExecCompleted();
@@ -1533,7 +1510,7 @@ static void LinkPartnerHandlePlayFanfareOrBGM(void)
static void LinkPartnerHandleFaintingCry(void)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry3(species, -25, 5);
LinkPartnerBufferExecCompleted();
@@ -1541,8 +1518,8 @@ static void LinkPartnerHandleFaintingCry(void)
static void LinkPartnerHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
LinkPartnerBufferExecCompleted();
}
@@ -1552,46 +1529,46 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void)
u8 taskId;
u32 trainerPicId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 50;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
paletteNum = AllocSpritePalette(0xD6F9);
- if ((gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_FIRE_RED
- || (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_LEAF_GREEN)
+ if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_FIRE_RED
+ || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_LEAF_GREEN)
{
- trainerPicId = gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender + BACK_PIC_RED;
+ trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RED;
}
- else if ((gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_RUBY
- || (gLinkPlayers[GetBankMultiplayerId(gActiveBank)].version & 0xFF) == VERSION_SAPPHIRE)
+ else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY
+ || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE)
{
- trainerPicId = gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender + BACK_PIC_RS_BRENDAN;
+ trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN;
}
else
{
- trainerPicId = gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender;
+ trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender;
}
LoadCompressedPalette(gTrainerBackPicPaletteTable[trainerPicId].data, 0x100 + paletteNum * 16, 32);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;
taskId = CreateTask(sub_814DCCC, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_112;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_112;
}
static void sub_814DCCC(u8 taskId)
@@ -1602,99 +1579,99 @@ static void sub_814DCCC(u8 taskId)
}
else
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBank = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
+ gActiveBattler = gTasks[taskId].data[0];
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_814CC98(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_814CC98(gActiveBattler, FALSE);
}
else
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_814CC98(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_814CC98(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_814CC98(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ sub_814CC98(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
}
- gBattleBankFunc[gActiveBank] = sub_814B0E8;
- gActiveBank = savedActiveBank;
+ gBattlerControllerFuncs[gActiveBattler] = sub_814B0E8;
+ gActiveBattler = savedActiveBank;
DestroyTask(taskId);
}
}
static void LinkPartnerHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
LinkPartnerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
- if (gBattleBufferA[gActiveBank][2] != 0)
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0x5D;
+ if (gBattleBufferA[gActiveBattler][2] != 0)
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D;
- gBattleBankFunc[gActiveBank] = sub_814DE9C;
+ gBattlerControllerFuncs[gActiveBattler] = sub_814DE9C;
}
}
static void sub_814DE9C(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5++ > 0x5C)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
LinkPartnerBufferExecCompleted();
}
}
-static void LinkPartnerHandleCmd49(void)
+static void LinkPartnerHandleHidePartyStatusSummary(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
LinkPartnerBufferExecCompleted();
}
-static void LinkPartnerHandleCmd50(void)
+static void LinkPartnerHandleEndBounceEffect(void)
{
LinkPartnerBufferExecCompleted();
}
static void LinkPartnerHandleSpriteInvisibility(void)
{
- if (IsBankSpritePresent(gActiveBank))
+ if (IsBattlerSpritePresent(gActiveBattler))
{
- gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
- CopyBattleSpriteInvisibility(gActiveBank);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];
+ CopyBattleSpriteInvisibility(gActiveBattler);
}
LinkPartnerBufferExecCompleted();
}
static void LinkPartnerHandleBattleAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
LinkPartnerBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
- sub_817E32C(animationId);
+ BattleTv_SetDataBasedOnAnimation(animationId);
}
}
static void LinkPartnerHandleLinkStandbyMsg(void)
{
- sub_81851A8(&gBattleBufferA[gActiveBank][2]);
+ sub_81851A8(&gBattleBufferA[gActiveBattler][2]);
LinkPartnerBufferExecCompleted();
}
@@ -1705,13 +1682,13 @@ static void LinkPartnerHandleResetActionMoveSelection(void)
static void LinkPartnerHandleCmd55(void)
{
- sub_81851A8(&gBattleBufferA[gActiveBank][4]);
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
- gSaveBlock2Ptr->field_CA9_b = gBattleBufferA[gActiveBank][2];
+ sub_81851A8(&gBattleBufferA[gActiveBattler][4]);
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
+ gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
LinkPartnerBufferExecCompleted();
- gBattleBankFunc[gActiveBank] = sub_80587B0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80587B0;
}
static void nullsub_113(void)
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index 0aac4cbe4..1eaa9da18 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -4,17 +4,19 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
-#include "battle_link_817C95C.h"
+#include "constants/battle_anim.h"
+#include "battle_tv.h"
#include "battle_ai_script_commands.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
#include "item.h"
-#include "items.h"
-#include "songs.h"
+#include "constants/items.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "moves.h"
+#include "constants/moves.h"
+#include "constants/trainers.h"
#include "window.h"
#include "m4a.h"
#include "palette.h"
@@ -23,44 +25,21 @@
#include "string_util.h"
#include "bg.h"
#include "reshow_battle_screen.h"
-#include "rng.h"
+#include "random.h"
#include "pokeball.h"
#include "data2.h"
+#include "battle_setup.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern bool8 gDoingBattleAnim;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern struct MusicPlayerInfo gMPlay_BGM;
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void *gUnknown_020244D8;
-extern void *gUnknown_020244DC;
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
-extern struct UnusedControllerStruct gUnknown_02022D0C;
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
-extern u16 gUnknown_020243FC;
-extern u8 gUnknown_020244B4[];
-extern void (*gPreBattleCallback1)(void);
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
-extern const struct BattleMove gBattleMoves[];
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_806A068(u16, u8);
-extern void sub_81A57E4(u8 bank, u16 stringId);
-extern u8 sub_81A4CB0(void);
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
+extern void sub_81A57E4(u8 battlerId, u16 stringId);
+extern u8 GetFrontierBrainTrainerPicIndex(void);
extern u8 sub_81D5588(u16 trainerId);
extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
extern u8 GetEreaderTrainerFrontSpriteId(void);
@@ -83,7 +62,7 @@ static void OpponentHandleBallThrow(void);
static void OpponentHandlePause(void);
static void OpponentHandleMoveAnimation(void);
static void OpponentHandlePrintString(void);
-static void OpponentHandlePrintStringPlayerOnly(void);
+static void OpponentHandlePrintSelectionString(void);
static void OpponentHandleChooseAction(void);
static void OpponentHandleUnknownYesNoBox(void);
static void OpponentHandleChooseMove(void);
@@ -109,14 +88,14 @@ static void OpponentHandleCmd39(void);
static void OpponentHandleCmd40(void);
static void OpponentHandleHitAnimation(void);
static void OpponentHandleCmd42(void);
-static void OpponentHandleEffectivenessSound(void);
+static void OpponentHandlePlaySE(void);
static void OpponentHandlePlayFanfareOrBGM(void);
static void OpponentHandleFaintingCry(void);
static void OpponentHandleIntroSlide(void);
static void OpponentHandleIntroTrainerBallThrow(void);
static void OpponentHandleDrawPartyStatusSummary(void);
-static void OpponentHandleCmd49(void);
-static void OpponentHandleCmd50(void);
+static void OpponentHandleHidePartyStatusSummary(void);
+static void OpponentHandleEndBounceEffect(void);
static void OpponentHandleSpriteInvisibility(void);
static void OpponentHandleBattleAnimation(void);
static void OpponentHandleLinkStandbyMsg(void);
@@ -129,7 +108,7 @@ static void OpponentBufferExecCompleted(void);
static void sub_805FC80(void);
static u32 GetOpponentMonData(u8 monId, u8 *dst);
static void SetOpponentMonData(u8 monId);
-static void sub_80613DC(u8 bank, bool8 dontClearSubstituteBit);
+static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit);
static void DoSwitchOutAnimation(void);
static void OpponentDoMoveAnimation(void);
static void sub_806280C(struct Sprite *sprite);
@@ -155,7 +134,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
OpponentHandlePause,
OpponentHandleMoveAnimation,
OpponentHandlePrintString,
- OpponentHandlePrintStringPlayerOnly,
+ OpponentHandlePrintSelectionString,
OpponentHandleChooseAction,
OpponentHandleUnknownYesNoBox,
OpponentHandleChooseMove,
@@ -181,14 +160,14 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
OpponentHandleCmd40,
OpponentHandleHitAnimation,
OpponentHandleCmd42,
- OpponentHandleEffectivenessSound,
+ OpponentHandlePlaySE,
OpponentHandlePlayFanfareOrBGM,
OpponentHandleFaintingCry,
OpponentHandleIntroSlide,
OpponentHandleIntroTrainerBallThrow,
OpponentHandleDrawPartyStatusSummary,
- OpponentHandleCmd49,
- OpponentHandleCmd50,
+ OpponentHandleHidePartyStatusSummary,
+ OpponentHandleEndBounceEffect,
OpponentHandleSpriteInvisibility,
OpponentHandleBattleAnimation,
OpponentHandleLinkStandbyMsg,
@@ -206,48 +185,48 @@ static void nullsub_26(void)
void SetControllerToOpponent(void)
{
- gBattleBankFunc[gActiveBank] = OpponentBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = OpponentBufferRunCommand;
}
static void OpponentBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sOpponentBufferCommands))
- sOpponentBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sOpponentBufferCommands))
+ sOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
OpponentBufferExecCompleted();
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
OpponentBufferExecCompleted();
}
static void CompleteOnBankSpriteCallbackDummy2(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
OpponentBufferExecCompleted();
}
static void sub_805F240(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- FreeTrainerFrontPicPalette(gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam);
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
+ FreeTrainerFrontPicPalette(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
OpponentBufferExecCompleted();
}
}
static void sub_805F2A8(void)
{
- if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 0xFF)
+ if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
OpponentBufferExecCompleted();
}
}
@@ -259,42 +238,42 @@ static void sub_805F2F0(void)
if (!IsDoubleBattle() || ((IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) || (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
var = TRUE;
var2 = FALSE;
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
var = TRUE;
var2 = TRUE;
}
- gUnknown_020244D8 = &gBattleSpritesDataPtr->healthBoxesData[gActiveBank];
- gUnknown_020244DC = &gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON];
+ gUnknown_020244D8 = &gBattleSpritesDataPtr->healthBoxesData[gActiveBattler];
+ gUnknown_020244DC = &gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK];
if (var)
{
if (var2 == TRUE)
{
- if (var2 && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 && gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
+ if (var2 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
}
else
return;
}
- else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- if (GetBankIdentity(gActiveBank) == 3)
+ if (GetBattlerPosition(gActiveBattler) == 3)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 == 0 && gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1 == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 == 0 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 == 0)
{
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
@@ -302,14 +281,14 @@ static void sub_805F2F0(void)
else
return;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
}
else
return;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_805F2A8;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_805F2A8;
}
}
@@ -318,60 +297,60 @@ static void sub_805F560(void)
bool32 sp = FALSE;
bool32 r10 = FALSE;
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
- if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle() && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
- sub_8172EF0(gActiveBank ^ BIT_MON, &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]]);
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
+ if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle() && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1)
+ sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler ^ BIT_FLANK);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);
}
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1;
}
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x40
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x40
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40
&& !IsCryPlayingOrClearCrySongs())
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- if (GetBankIdentity(gActiveBank) == 1)
- m4aMPlayContinue(&gMPlay_BGM);
+ if (GetBattlerPosition(gActiveBattler) == 1)
+ m4aMPlayContinue(&gMPlayInfo_BGM);
}
else
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1;
sp = TRUE;
}
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
r10 = TRUE;
}
}
else
{
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
{
r10 = TRUE;
}
@@ -381,29 +360,29 @@ static void sub_805F560(void)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank ^ BIT_MON, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]], MON_DATA_SPECIES));
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES));
}
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0;
- gBattleBankFunc[gActiveBank] = sub_805F2F0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_805F2F0;
}
}
static void sub_805F994(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
OpponentBufferExecCompleted();
@@ -412,11 +391,11 @@ static void sub_805F994(void)
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
OpponentBufferExecCompleted();
@@ -424,21 +403,21 @@ static void CompleteOnHealthbarDone(void)
static void sub_805FAC4(void)
{
- if (!gSprites[gBankSpriteIds[gActiveBank]].inUse)
+ if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse)
{
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
OpponentBufferExecCompleted();
}
}
static void sub_805FB08(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- EnemyShadowCallbackToSetInvisible(gActiveBank);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ HideBattlerShadowSprite(gActiveBattler);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
OpponentBufferExecCompleted();
}
}
@@ -451,40 +430,40 @@ static void CompleteOnInactiveTextPrinter(void)
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
OpponentBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
static void sub_805FC10(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleBankFunc[gActiveBank] = sub_805FC80;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattlerControllerFuncs[gActiveBattler] = sub_805FC80;
}
}
static void sub_805FC80(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive && !IsCryPlayingOrClearCrySongs())
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs())
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy || gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy_2)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy || gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy_2)
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
OpponentBufferExecCompleted();
}
}
@@ -492,60 +471,60 @@ static void sub_805FC80(void)
static void sub_805FD00(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
- CopyBattleSpriteInvisibility(gActiveBank);
- gBattleBankFunc[gActiveBank] = sub_805FC10;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
+ CopyBattleSpriteInvisibility(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = sub_805FC10;
}
}
static void sub_805FDF0(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
- gBattleBankFunc[gActiveBank] = sub_805FD00;
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
+ gBattlerControllerFuncs[gActiveBattler] = sub_805FD00;
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
OpponentBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
OpponentBufferExecCompleted();
}
static void OpponentBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = OpponentBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = OpponentBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
@@ -556,13 +535,13 @@ static void OpponentHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += GetOpponentMonData(gBattlePartyID[gActiveBank], monData);
+ size += GetOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -570,7 +549,7 @@ static void OpponentHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
OpponentBufferExecCompleted();
}
@@ -584,7 +563,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);
@@ -650,7 +629,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -665,7 +644,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -883,14 +862,14 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst)
static void OpponentHandleGetRawMonData(void)
{
struct BattlePokemon battleMon;
- u8 *src = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
- u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBank][1];
+ u8 *src = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
+ u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
dst[i] = src[i];
- EmitDataTransfer(1, gBattleBufferA[gActiveBank][2], dst);
+ BtlController_EmitDataTransfer(1, gBattleBufferA[gActiveBattler][2], dst);
OpponentBufferExecCompleted();
}
@@ -899,13 +878,13 @@ static void OpponentHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetOpponentMonData(gBattlePartyID[gActiveBank]);
+ SetOpponentMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -918,11 +897,11 @@ static void OpponentHandleSetMonData(void)
static void SetOpponentMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -963,10 +942,10 @@ static void SetOpponentMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -980,265 +959,265 @@ static void SetOpponentMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
}
static void OpponentHandleSetRawMonData(void)
{
- u8 *dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
+ u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
- dst[i] = gBattleBufferA[gActiveBank][3 + i];
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
+ dst[i] = gBattleBufferA[gActiveBattler][3 + i];
OpponentBufferExecCompleted();
}
static void OpponentHandleLoadMonSprite(void)
{
- u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_806A068(species, GetBankIdentity(gActiveBank));
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(gActiveBank, 2),
- GetBankSpriteDefault_Y(gActiveBank),
- sub_80A82E4(gActiveBank));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(gActiveBattler, 2),
+ GetBattlerSpriteDefault_Y(gActiveBattler),
+ sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = species;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = species;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
- gBattleBankFunc[gActiveBank] = sub_805F994;
+ gBattlerControllerFuncs[gActiveBattler] = sub_805F994;
}
static void OpponentHandleSwitchInAnim(void)
{
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = 6;
- gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1];
- sub_80613DC(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattleBankFunc[gActiveBank] = sub_805FDF0;
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6;
+ gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];
+ sub_80613DC(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_805FDF0;
}
-static void sub_80613DC(u8 bank, bool8 dontClearSubstituteBit)
+static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit)
{
u16 species;
- ClearTemporarySpeciesSpriteData(bank, dontClearSubstituteBit);
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank);
- sub_806A068(species, GetBankIdentity(bank));
+ ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
- gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFE);
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT);
}
static void OpponentHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = DoSwitchOutAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- EnemyShadowCallbackToSetInvisible(gActiveBank);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ HideBattlerShadowSprite(gActiveBattler);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
OpponentBufferExecCompleted();
}
}
static void DoSwitchOutAnimation(void)
{
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON);
- gBattleBankFunc[gActiveBank] = sub_805FB08;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_805FB08;
}
break;
}
@@ -1253,15 +1232,15 @@ static void OpponentHandleDrawTrainerPic(void)
{
trainerPicId = GetSecretBaseTrainerPicIndex();
}
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
+ else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
{
- trainerPicId = sub_81A4CB0();
+ trainerPicId = GetFrontierBrainTrainerPicIndex();
}
else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
- if (gActiveBank == 1)
+ if (gActiveBattler == 1)
trainerPicId = sub_81D5588(gTrainerBattleOpponent_A);
else
trainerPicId = sub_81D5588(gTrainerBattleOpponent_B);
@@ -1275,7 +1254,7 @@ static void OpponentHandleDrawTrainerPic(void)
{
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if (gActiveBank == 1)
+ if (gActiveBattler == 1)
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A);
else
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B);
@@ -1291,7 +1270,7 @@ static void OpponentHandleDrawTrainerPic(void)
}
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
- if (gActiveBank != 1)
+ if (gActiveBattler != 1)
trainerPicId = gTrainers[gTrainerBattleOpponent_B].trainerPic;
else
trainerPicId = gTrainers[gTrainerBattleOpponent_A].trainerPic;
@@ -1303,7 +1282,7 @@ static void OpponentHandleDrawTrainerPic(void)
if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS))
{
- if ((GetBankIdentity(gActiveBank) & BIT_MON) != 0) // second mon
+ if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon
xPos = 152;
else // first mon
xPos = 200;
@@ -1313,20 +1292,20 @@ static void OpponentHandleDrawTrainerPic(void)
xPos = 176;
}
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
xPos,
(8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40,
- sub_80A82E4(gActiveBank));
+ sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 2;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void OpponentHandleTrainerSlide(void)
@@ -1337,15 +1316,15 @@ static void OpponentHandleTrainerSlide(void)
{
trainerPicId = GetSecretBaseTrainerPicIndex();
}
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
+ else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
{
- trainerPicId = sub_81A4CB0();
+ trainerPicId = GetFrontierBrainTrainerPicIndex();
}
else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
- if (gActiveBank == 1)
+ if (gActiveBattler == 1)
trainerPicId = sub_81D5588(gTrainerBattleOpponent_A);
else
trainerPicId = sub_81D5588(gTrainerBattleOpponent_B);
@@ -1359,7 +1338,7 @@ static void OpponentHandleTrainerSlide(void)
{
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if (gActiveBank == 1)
+ if (gActiveBattler == 1)
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A);
else
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B);
@@ -1375,7 +1354,7 @@ static void OpponentHandleTrainerSlide(void)
}
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
- if (gActiveBank != 1)
+ if (gActiveBattler != 1)
trainerPicId = gTrainers[gTrainerBattleOpponent_B].trainerPic;
else
trainerPicId = gTrainers[gTrainerBattleOpponent_A].trainerPic;
@@ -1385,47 +1364,47 @@ static void OpponentHandleTrainerSlide(void)
trainerPicId = gTrainers[gTrainerBattleOpponent_A].trainerPic;
}
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E);
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E);
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 96;
- gSprites[gBankSpriteIds[gActiveBank]].pos1.x += 32;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 96;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.x += 32;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy2;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2;
}
static void OpponentHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 280;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
- gBattleBankFunc[gActiveBank] = sub_805F240;
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
+ gBattlerControllerFuncs[gActiveBattler] = sub_805F240;
}
static void OpponentHandleFaintAnimation(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_OPPONENT);
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039934;
- gBattleBankFunc[gActiveBank] = sub_805FAC4;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon;
+ gBattlerControllerFuncs[gActiveBattler] = sub_805FAC4;
}
}
}
@@ -1452,51 +1431,51 @@ static void OpponentHandlePause(void)
static void OpponentHandleMoveAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
{
OpponentBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = OpponentDoMoveAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = OpponentDoMoveAnimation;
}
}
}
static void OpponentDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- u8 multihit = gBattleBufferA[gActiveBank][11];
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+ u8 multihit = gBattleBufferA[gActiveBattler][11];
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute
- && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute
+ && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)
{
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -1504,20 +1483,20 @@ static void OpponentDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
OpponentBufferExecCompleted();
}
break;
@@ -1530,14 +1509,14 @@ static void OpponentHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
- sub_81A57E4(gActiveBank, *stringId);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
+ sub_81A57E4(gActiveBattler, *stringId);
}
-static void OpponentHandlePrintStringPlayerOnly(void)
+static void OpponentHandlePrintSelectionString(void)
{
OpponentBufferExecCompleted();
}
@@ -1557,13 +1536,13 @@ static void OpponentHandleChooseMove(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
+ BtlController_EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
OpponentBufferExecCompleted();
}
else
{
u8 chosenMoveId;
- struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER))
{
@@ -1574,24 +1553,24 @@ static void OpponentHandleChooseMove(void)
switch (chosenMoveId)
{
case 5:
- EmitTwoReturnValues(1, ACTION_WATCHES_CAREFULLY, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_WATCH_CAREFULLY, 0);
break;
case 4:
- EmitTwoReturnValues(1, ACTION_RUN, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);
break;
case 6:
- EmitTwoReturnValues(1, 15, gBankTarget);
+ BtlController_EmitTwoReturnValues(1, 15, gBattlerTarget);
break;
default:
- if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER | MOVE_TARGET_x10))
- gBankTarget = gActiveBank;
+ if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
+ gBattlerTarget = gActiveBattler;
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH)
{
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1);
- if (gAbsentBankFlags & gBitTable[gBankTarget])
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
}
- EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBankTarget << 8));
+ BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBattlerTarget << 8));
break;
}
OpponentBufferExecCompleted();
@@ -1605,12 +1584,12 @@ static void OpponentHandleChooseMove(void)
move = moveInfo->moves[chosenMoveId];
} while (move == MOVE_NONE);
- if (gBattleMoves[move].target & (MOVE_TARGET_USER | MOVE_TARGET_x10))
- EmitTwoReturnValues(1, 10, (chosenMoveId) | (gActiveBank << 8));
+ if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
+ BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gActiveBattler << 8));
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBankByIdentity(Random() & 2) << 8));
+ BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8));
else
- EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBankByIdentity(IDENTITY_PLAYER_MON1) << 8));
+ BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8));
OpponentBufferExecCompleted();
}
@@ -1619,7 +1598,7 @@ static void OpponentHandleChooseMove(void)
static void OpponentHandleChooseItem(void)
{
- EmitOneReturnValue(1, *(gBattleStruct->chosenItem + (gActiveBank / 2) * 2));
+ BtlController_EmitOneReturnValue(1, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2));
OpponentBufferExecCompleted();
}
@@ -1627,7 +1606,7 @@ static void OpponentHandleChoosePokemon(void)
{
s32 chosenMonId;
- if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) == 6)
+ if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == 6)
{
chosenMonId = GetMostSuitableMonToSwitchInto();
@@ -1637,17 +1616,17 @@ static void OpponentHandleChoosePokemon(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- bank2 = bank1 = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ bank2 = bank1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
}
else
{
- bank1 = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- bank2 = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ bank1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ bank2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
- if (gActiveBank == 1)
+ if (gActiveBattler == 1)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -1660,8 +1639,8 @@ static void OpponentHandleChoosePokemon(void)
for (chosenMonId = firstId; chosenMonId < lastId; chosenMonId++)
{
if (GetMonData(&gEnemyParty[chosenMonId], MON_DATA_HP) != 0
- && chosenMonId != gBattlePartyID[bank1]
- && chosenMonId != gBattlePartyID[bank2])
+ && chosenMonId != gBattlerPartyIndexes[bank1]
+ && chosenMonId != gBattlerPartyIndexes[bank2])
{
break;
}
@@ -1670,13 +1649,13 @@ static void OpponentHandleChoosePokemon(void)
}
else
{
- chosenMonId = *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank);
- *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
+ chosenMonId = *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler);
+ *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
}
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = chosenMonId;
- EmitChosenMonReturnValue(1, chosenMonId, NULL);
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId;
+ BtlController_EmitChosenMonReturnValue(1, chosenMonId, NULL);
OpponentBufferExecCompleted();
}
@@ -1690,23 +1669,23 @@ static void OpponentHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = (gBattleBufferA[gActiveBank][3] << 8) | gBattleBufferA[gActiveBank][2];
+ hpVal = (gBattleBufferA[gActiveBattler][3] << 8) | gBattleBufferA[gActiveBattler][2];
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void OpponentHandleExpUpdate(void)
@@ -1716,24 +1695,24 @@ static void OpponentHandleExpUpdate(void)
static void OpponentHandleStatusIconUpdate(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 bank;
+ u8 battlerId;
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_STATUS_ICON);
- bank = gActiveBank;
- gBattleSpritesDataPtr->healthBoxesData[bank].statusAnimActive = 0;
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);
+ battlerId = gActiveBattler;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void OpponentHandleStatusAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1],
- gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24));
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],
+ gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
@@ -1790,7 +1769,7 @@ static void OpponentHandleCmd37(void)
static void OpponentHandleCmd38(void)
{
- gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBank][1];
+ gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1];
OpponentBufferExecCompleted();
}
@@ -1808,16 +1787,16 @@ static void OpponentHandleCmd40(void)
static void OpponentHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
OpponentBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -1826,29 +1805,29 @@ static void OpponentHandleCmd42(void)
OpponentBufferExecCompleted();
}
-static void OpponentHandleEffectivenessSound(void)
+static void OpponentHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
OpponentBufferExecCompleted();
}
static void OpponentHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
OpponentBufferExecCompleted();
@@ -1856,7 +1835,7 @@ static void OpponentHandlePlayFanfareOrBGM(void)
static void OpponentHandleFaintingCry(void)
{
- u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry3(species, 25, 5);
OpponentBufferExecCompleted();
@@ -1864,8 +1843,8 @@ static void OpponentHandleFaintingCry(void)
static void OpponentHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
OpponentBufferExecCompleted();
}
@@ -1874,23 +1853,23 @@ static void OpponentHandleIntroTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 280;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_806280C);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_806280C);
taskId = CreateTask(sub_8062828, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_26;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_26;
}
static void sub_806280C(struct Sprite *sprite)
@@ -1902,108 +1881,108 @@ static void sub_806280C(struct Sprite *sprite)
static void sub_8062828(u8 taskId)
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBank = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
+ gActiveBattler = gTasks[taskId].data[0];
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_80613DC(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_80613DC(gActiveBattler, FALSE);
}
else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_80613DC(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_80613DC(gActiveBattler, FALSE);
}
else
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_80613DC(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_80613DC(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_80613DC(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_80613DC(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
}
- gBattleBankFunc[gActiveBank] = sub_805F560;
- gActiveBank = savedActiveBank;
+ gBattlerControllerFuncs[gActiveBattler] = sub_805F560;
+ gActiveBattler = savedActiveBank;
DestroyTask(taskId);
}
static void OpponentHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
OpponentBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
- if (gBattleBufferA[gActiveBank][2] != 0)
+ if (gBattleBufferA[gActiveBattler][2] != 0)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E < 2)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E < 2)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E++;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E++;
return;
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E = 0;
}
}
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
- if (gBattleBufferA[gActiveBank][2] != 0)
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0x5D;
+ if (gBattleBufferA[gActiveBattler][2] != 0)
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D;
- gBattleBankFunc[gActiveBank] = sub_8062A2C;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8062A2C;
}
}
static void sub_8062A2C(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5++ > 0x5C)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
OpponentBufferExecCompleted();
}
}
-static void OpponentHandleCmd49(void)
+static void OpponentHandleHidePartyStatusSummary(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
OpponentBufferExecCompleted();
}
-static void OpponentHandleCmd50(void)
+static void OpponentHandleEndBounceEffect(void)
{
OpponentBufferExecCompleted();
}
static void OpponentHandleSpriteInvisibility(void)
{
- if (IsBankSpritePresent(gActiveBank))
+ if (IsBattlerSpritePresent(gActiveBattler))
{
- gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
- CopyBattleSpriteInvisibility(gActiveBank);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];
+ CopyBattleSpriteInvisibility(gActiveBattler);
}
OpponentBufferExecCompleted();
}
static void OpponentHandleBattleAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
OpponentBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
}
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 16c62c53b..6ab19e368 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -4,16 +4,18 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
-#include "battle_link_817C95C.h"
+#include "constants/battle_anim.h"
+#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
#include "item.h"
-#include "items.h"
-#include "songs.h"
+#include "constants/items.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "moves.h"
+#include "constants/moves.h"
+#include "constants/trainers.h"
#include "window.h"
#include "m4a.h"
#include "palette.h"
@@ -22,66 +24,30 @@
#include "string_util.h"
#include "bg.h"
#include "reshow_battle_screen.h"
-#include "rng.h"
+#include "random.h"
#include "pokeball.h"
#include "data2.h"
+#include "battle_setup.h"
+#include "item_use.h"
+#include "recorded_battle.h"
+#include "party_menu.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gAbsentBankFlags;
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern u8 gPlayerDpadHoldFrames;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void (*gPreBattleCallback1)(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern u8 gMultiUsePlayerCursor;
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct MusicPlayerInfo gMPlay_BGM;
-extern u16 gPartnerTrainerId;
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u16 gSpecialVar_ItemId;
extern u8 gUnknown_0203CEE8;
extern u8 gUnknown_0203CEE9;
extern u8 gUnknown_0203CF00[];
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
-extern u8 gNumberOfMovesToChoose;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
extern s32 gUnknown_0203CD70;
-extern u8 gBankInMenu;
-extern u32 gBattlePalaceMoveSelectionRngValue;
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
-extern u8 gUnknown_020244B4[];
-extern u16 gUnknown_020243FC;
extern struct UnusedControllerStruct gUnknown_02022D0C;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+extern struct SpriteTemplate gMultiuseSpriteTemplate;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
-extern const u8 gTypeNames[][7];
-extern const struct BattleMove gBattleMoves[];
-
-extern const u8 gText_BattleSwitchWhich[];
-extern const u8 gText_MoveInterfacePP[];
-extern const u8 gText_MoveInterfaceType[];
-extern const u8 gText_LinkStandby[];
-extern const u8 gText_BattleMenu[];
-extern const u8 gText_WhatWillPkmnDo[];
-extern const u8 gText_BattleYesNoChoice[];
-
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_81B89AC(u8 arg0);
+
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
extern void sub_81AABB0(void);
-extern void sub_806A068(u16, u8);
-extern void sub_81A57E4(u8 bank, u16 stringId);
+extern void sub_81A57E4(u8 battlerId, u16 stringId);
extern void sub_81851A8(u8 *);
// this file's functions
@@ -102,7 +68,7 @@ static void PlayerHandleBallThrowAnim(void);
static void PlayerHandlePause(void);
static void PlayerHandleMoveAnimation(void);
static void PlayerHandlePrintString(void);
-static void PlayerHandlePrintStringPlayerOnly(void);
+static void PlayerHandlePrintSelectionString(void);
static void PlayerHandleChooseAction(void);
static void PlayerHandleUnknownYesNoBox(void);
static void PlayerHandleChooseMove(void);
@@ -128,14 +94,14 @@ static void PlayerHandleCmd39(void);
static void PlayerHandleCmd40(void);
static void PlayerHandleHitAnimation(void);
static void PlayerHandleCmd42(void);
-static void PlayerHandleEffectivenessSound(void);
+static void PlayerHandlePlaySE(void);
static void PlayerHandlePlayFanfareOrBGM(void);
static void PlayerHandleFaintingCry(void);
static void PlayerHandleIntroSlide(void);
static void PlayerHandleIntroTrainerBallThrow(void);
static void PlayerHandleDrawPartyStatusSummary(void);
-static void PlayerHandleCmd49(void);
-static void PlayerHandleCmd50(void);
+static void PlayerHandleHidePartyStatusSummary(void);
+static void PlayerHandleEndBounceEffect(void);
static void PlayerHandleSpriteInvisibility(void);
static void PlayerHandleBattleAnimation(void);
static void PlayerHandleLinkStandbyMsg(void);
@@ -154,17 +120,17 @@ static void MoveSelectionDisplayMoveType(void);
static void MoveSelectionDisplayMoveNames(void);
static void HandleMoveSwitchting(void);
static void sub_8058FC0(void);
-static void sub_8059828(void);
+static void WaitForMonSelection(void);
static void CompleteWhenChoseItem(void);
-static void sub_8059544(u8 taskId);
+static void Task_LaunchLvlUpAnim(u8 taskId);
static void Task_PrepareToGiveExpWithExpBar(u8 taskId);
static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId);
static void sub_8059400(u8 taskId);
-static void sub_80595A4(u8 taskId);
+static void Task_UpdateLvlInHealthbox(u8 taskId);
static void PrintLinkStandbyMsg(void);
static u32 CopyPlayerMonData(u8 monId, u8 *dst);
static void SetPlayerMonData(u8 monId);
-static void sub_805B258(u8 bank, bool8 dontClearSubstituteBit);
+static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit);
static void DoSwitchOutAnimation(void);
static void PlayerDoMoveAnimation(void);
static void task05_08033660(u8 taskId);
@@ -189,7 +155,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
PlayerHandlePause,
PlayerHandleMoveAnimation,
PlayerHandlePrintString,
- PlayerHandlePrintStringPlayerOnly,
+ PlayerHandlePrintSelectionString,
PlayerHandleChooseAction,
PlayerHandleUnknownYesNoBox,
PlayerHandleChooseMove,
@@ -215,14 +181,14 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
PlayerHandleCmd40,
PlayerHandleHitAnimation,
PlayerHandleCmd42,
- PlayerHandleEffectivenessSound,
+ PlayerHandlePlaySE,
PlayerHandlePlayFanfareOrBGM,
PlayerHandleFaintingCry,
PlayerHandleIntroSlide,
PlayerHandleIntroTrainerBallThrow,
PlayerHandleDrawPartyStatusSummary,
- PlayerHandleCmd49,
- PlayerHandleCmd50,
+ PlayerHandleHidePartyStatusSummary,
+ PlayerHandleEndBounceEffect,
PlayerHandleSpriteInvisibility,
PlayerHandleBattleAnimation,
PlayerHandleLinkStandbyMsg,
@@ -231,10 +197,10 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
nullsub_22
};
-static const u8 sTargetIdentities[] = {IDENTITY_PLAYER_MON1, IDENTITY_PLAYER_MON2, IDENTITY_OPPONENT_MON2, IDENTITY_OPPONENT_MON1};
+static const u8 sTargetIdentities[] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT};
// unknown unused data
-static const u8 gUnknown_0831C5FC[] = {0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58};
+static const u8 sUnknown_0831C5FC[] = {0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58};
void nullsub_21(void)
{
@@ -242,33 +208,33 @@ void nullsub_21(void)
void SetControllerToPlayer(void)
{
- gBattleBankFunc[gActiveBank] = PlayerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerBufferRunCommand;
gDoingBattleAnim = FALSE;
gPlayerDpadHoldFrames = 0;
}
static void PlayerBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = PlayerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void PlayerBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sPlayerBufferCommands))
- sPlayerBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sPlayerBufferCommands))
+ sPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
PlayerBufferExecCompleted();
}
@@ -276,18 +242,18 @@ static void PlayerBufferRunCommand(void)
static void CompleteOnBankSpritePosX_0(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0)
PlayerBufferExecCompleted();
}
static void HandleInputChooseAction(void)
{
- u16 itemId = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- dp11b_obj_instanciate(gActiveBank, 1, 7, 1);
- dp11b_obj_instanciate(gActiveBank, 0, 7, 1);
+ DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1);
+ DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1);
- if (gMain.newAndRepeatedKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == 2)
+ if (gMain.newAndRepeatedKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A)
gPlayerDpadHoldFrames++;
else
gPlayerDpadHoldFrames = 0;
@@ -296,71 +262,71 @@ static void HandleInputChooseAction(void)
{
PlaySE(SE_SELECT);
- switch (gActionSelectionCursor[gActiveBank])
+ switch (gActionSelectionCursor[gActiveBattler])
{
case 0:
- EmitTwoReturnValues(1, ACTION_USE_MOVE, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0);
break;
case 1:
- EmitTwoReturnValues(1, ACTION_USE_ITEM, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);
break;
case 2:
- EmitTwoReturnValues(1, ACTION_SWITCH, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
break;
case 3:
- EmitTwoReturnValues(1, ACTION_RUN, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);
break;
}
PlayerBufferExecCompleted();
}
else if (gMain.newKeys & DPAD_LEFT)
{
- if (gActionSelectionCursor[gActiveBank] & 1) // if is ACTION_USE_ITEM or ACTION_RUN
+ if (gActionSelectionCursor[gActiveBattler] & 1) // if is B_ACTION_USE_ITEM or B_ACTION_RUN
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 1;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 1;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_RIGHT)
{
- if (!(gActionSelectionCursor[gActiveBank] & 1)) // if is ACTION_USE_MOVE or ACTION_SWITCH
+ if (!(gActionSelectionCursor[gActiveBattler] & 1)) // if is B_ACTION_USE_MOVE or B_ACTION_SWITCH
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 1;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 1;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_UP)
{
- if (gActionSelectionCursor[gActiveBank] & 2) // if is ACTION_SWITCH or ACTION_RUN
+ if (gActionSelectionCursor[gActiveBattler] & 2) // if is B_ACTION_SWITCH or B_ACTION_RUN
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 2;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 2;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_DOWN)
{
- if (!(gActionSelectionCursor[gActiveBank] & 2)) // if is ACTION_USE_MOVE or ACTION_USE_ITEM
+ if (!(gActionSelectionCursor[gActiveBattler] & 2)) // if is B_ACTION_USE_MOVE or B_ACTION_USE_ITEM
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 2;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 2;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59)
{
if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- && GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON2
- && !(gAbsentBankFlags & gBitTable[GetBankByIdentity(IDENTITY_PLAYER_MON1)])
+ && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT
+ && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)])
&& !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- if (gBattleBufferA[gActiveBank][1] == ACTION_USE_ITEM)
+ if (gBattleBufferA[gActiveBattler][1] == B_ACTION_USE_ITEM)
{
// Add item to bag if it is a ball
if (itemId <= ITEM_PREMIER_BALL)
@@ -369,7 +335,7 @@ static void HandleInputChooseAction(void)
return;
}
PlaySE(SE_SELECT);
- EmitTwoReturnValues(1, ACTION_CANCEL_PARTNER, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_CANCEL_PARTNER, 0);
PlayerBufferExecCompleted();
}
}
@@ -381,9 +347,9 @@ static void HandleInputChooseAction(void)
static void sub_80577F0(void) // unused
{
- dp11b_obj_free(gActiveBank, 1);
- dp11b_obj_free(gActiveBank, 0);
- gBattleBankFunc[gActiveBank] = HandleInputChooseTarget;
+ EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);
+ EndBounceEffect(gActiveBattler, BOUNCE_MON);
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget;
}
static void HandleInputChooseTarget(void)
@@ -392,18 +358,18 @@ static void HandleInputChooseTarget(void)
u8 identities[4];
memcpy(identities, sTargetIdentities, ARRAY_COUNT(sTargetIdentities));
- dp11b_obj_instanciate(gMultiUsePlayerCursor, 1, 0xF, 1);
+ DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1);
// what a weird loop
i = 0;
- if (gNoOfAllBanks != 0)
+ if (gBattlersCount != 0)
{
do
{
if (i != gMultiUsePlayerCursor)
- dp11b_obj_free(i, 1);
+ EndBounceEffect(i, BOUNCE_HEALTHBOX);
i++;
- } while (i < gNoOfAllBanks);
+ } while (i < gBattlersCount);
}
if (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == 2)
@@ -414,30 +380,30 @@ static void HandleInputChooseTarget(void)
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- gSprites[gBankSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
- EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBank] | (gMultiUsePlayerCursor << 8));
- dp11b_obj_free(gMultiUsePlayerCursor, 1);
+ gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
+ BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));
+ EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX);
PlayerBufferExecCompleted();
}
else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59)
{
PlaySE(SE_SELECT);
- gSprites[gBankSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
- gBattleBankFunc[gActiveBank] = HandleInputChooseMove;
- dp11b_obj_instanciate(gActiveBank, 1, 7, 1);
- dp11b_obj_instanciate(gActiveBank, 0, 7, 1);
- dp11b_obj_free(gMultiUsePlayerCursor, 1);
+ gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;
+ DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1);
+ DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1);
+ EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX);
}
else if (gMain.newKeys & (DPAD_LEFT | DPAD_UP))
{
PlaySE(SE_SELECT);
- gSprites[gBankSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
+ gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
do
{
- u8 currSelIdentity = GetBankIdentity(gMultiUsePlayerCursor);
+ u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (currSelIdentity == identities[i])
break;
@@ -446,40 +412,40 @@ static void HandleInputChooseTarget(void)
{
if (--i < 0)
i = 4; // UB: array out of range
- gMultiUsePlayerCursor = GetBankByIdentity(identities[i]);
- } while (gMultiUsePlayerCursor == gNoOfAllBanks);
+ gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]);
+ } while (gMultiUsePlayerCursor == gBattlersCount);
i = 0;
- switch (GetBankIdentity(gMultiUsePlayerCursor))
+ switch (GetBattlerPosition(gMultiUsePlayerCursor))
{
- case IDENTITY_PLAYER_MON1:
- case IDENTITY_PLAYER_MON2:
- if (gActiveBank != gMultiUsePlayerCursor)
+ case B_POSITION_PLAYER_LEFT:
+ case B_POSITION_PLAYER_RIGHT:
+ if (gActiveBattler != gMultiUsePlayerCursor)
i++;
- else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBank])].target & MOVE_TARGET_USER)
+ else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED)
i++;
break;
- case IDENTITY_OPPONENT_MON1:
- case IDENTITY_OPPONENT_MON2:
+ case B_POSITION_OPPONENT_LEFT:
+ case B_POSITION_OPPONENT_RIGHT:
i++;
break;
}
- if (gAbsentBankFlags & gBitTable[gMultiUsePlayerCursor])
+ if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor])
i = 0;
} while (i == 0);
- gSprites[gBankSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039AD8;
+ gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039AD8;
}
else if (gMain.newKeys & (DPAD_RIGHT | DPAD_DOWN))
{
PlaySE(SE_SELECT);
- gSprites[gBankSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
+ gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C;
do
{
- u8 currSelIdentity = GetBankIdentity(gMultiUsePlayerCursor);
+ u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (currSelIdentity == identities[i])
break;
@@ -488,38 +454,38 @@ static void HandleInputChooseTarget(void)
{
if (++i > 3)
i = 0;
- gMultiUsePlayerCursor = GetBankByIdentity(identities[i]);
- } while (gMultiUsePlayerCursor == gNoOfAllBanks);
+ gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]);
+ } while (gMultiUsePlayerCursor == gBattlersCount);
i = 0;
- switch (GetBankIdentity(gMultiUsePlayerCursor))
+ switch (GetBattlerPosition(gMultiUsePlayerCursor))
{
- case IDENTITY_PLAYER_MON1:
- case IDENTITY_PLAYER_MON2:
- if (gActiveBank != gMultiUsePlayerCursor)
+ case B_POSITION_PLAYER_LEFT:
+ case B_POSITION_PLAYER_RIGHT:
+ if (gActiveBattler != gMultiUsePlayerCursor)
i++;
- else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBank])].target & MOVE_TARGET_USER)
+ else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED)
i++;
break;
- case IDENTITY_OPPONENT_MON1:
- case IDENTITY_OPPONENT_MON2:
+ case B_POSITION_OPPONENT_LEFT:
+ case B_POSITION_OPPONENT_RIGHT:
i++;
break;
}
- if (gAbsentBankFlags & gBitTable[gMultiUsePlayerCursor])
+ if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor])
i = 0;
} while (i == 0);
- gSprites[gBankSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039AD8;
+ gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039AD8;
}
}
static void HandleInputChooseMove(void)
{
bool32 canSelectTarget = FALSE;
- struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
- if (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == 2)
+ if (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A)
gPlayerDpadHoldFrames++;
else
gPlayerDpadHoldFrames = 0;
@@ -529,115 +495,115 @@ static void HandleInputChooseMove(void)
u8 moveTarget;
PlaySE(SE_SELECT);
- if (moveInfo->moves[gMoveSelectionCursor[gActiveBank]] == MOVE_CURSE)
+ if (moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE)
{
if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST)
- moveTarget = MOVE_TARGET_x10;
+ moveTarget = MOVE_TARGET_USER;
else
moveTarget = MOVE_TARGET_SELECTED;
}
else
{
- moveTarget = gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBank]]].target;
+ moveTarget = gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].target;
}
- if (moveTarget & MOVE_TARGET_x10)
- gMultiUsePlayerCursor = gActiveBank;
+ if (moveTarget & MOVE_TARGET_USER)
+ gMultiUsePlayerCursor = gActiveBattler;
else
- gMultiUsePlayerCursor = GetBankByIdentity((GetBankIdentity(gActiveBank) & BIT_SIDE) ^ BIT_SIDE);
+ gMultiUsePlayerCursor = GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & BIT_SIDE) ^ BIT_SIDE);
- if (!gBattleBufferA[gActiveBank][1]) // not a double battle
+ if (!gBattleBufferA[gActiveBattler][1]) // not a double battle
{
- if (moveTarget & MOVE_TARGET_USER && !gBattleBufferA[gActiveBank][2])
+ if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleBufferA[gActiveBattler][2])
canSelectTarget++;
}
else // double battle
{
- if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_x10)))
+ if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER)))
canSelectTarget++; // either selected or user
- if (moveInfo->currentPp[gMoveSelectionCursor[gActiveBank]] == 0)
+ if (moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] == 0)
{
canSelectTarget = FALSE;
}
- else if (!(moveTarget & (MOVE_TARGET_x10 | MOVE_TARGET_USER)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) <= 1)
+ else if (!(moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) <= 1)
{
- gMultiUsePlayerCursor = GetDefaultMoveTarget(gActiveBank);
+ gMultiUsePlayerCursor = GetDefaultMoveTarget(gActiveBattler);
canSelectTarget = FALSE;
}
}
if (!canSelectTarget)
{
- EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBank] | (gMultiUsePlayerCursor << 8));
+ BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8));
PlayerBufferExecCompleted();
}
else
{
- gBattleBankFunc[gActiveBank] = HandleInputChooseTarget;
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget;
- if (moveTarget & (MOVE_TARGET_x10 | MOVE_TARGET_USER))
- gMultiUsePlayerCursor = gActiveBank;
- else if (gAbsentBankFlags & gBitTable[GetBankByIdentity(IDENTITY_OPPONENT_MON1)])
- gMultiUsePlayerCursor = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED))
+ gMultiUsePlayerCursor = gActiveBattler;
+ else if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)])
+ gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
else
- gMultiUsePlayerCursor = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
- gSprites[gBankSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039AD8;
+ gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039AD8;
}
}
else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59)
{
PlaySE(SE_SELECT);
- EmitTwoReturnValues(1, 10, 0xFFFF);
+ BtlController_EmitTwoReturnValues(1, 10, 0xFFFF);
PlayerBufferExecCompleted();
}
else if (gMain.newKeys & DPAD_LEFT)
{
- if (gMoveSelectionCursor[gActiveBank] & 1)
+ if (gMoveSelectionCursor[gActiveBattler] & 1)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 1;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 1;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
MoveSelectionDisplayPpNumber();
MoveSelectionDisplayMoveType();
}
}
else if (gMain.newKeys & DPAD_RIGHT)
{
- if (!(gMoveSelectionCursor[gActiveBank] & 1)
- && (gMoveSelectionCursor[gActiveBank] ^ 1) < gNumberOfMovesToChoose)
+ if (!(gMoveSelectionCursor[gActiveBattler] & 1)
+ && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gNumberOfMovesToChoose)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 1;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 1;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
MoveSelectionDisplayPpNumber();
MoveSelectionDisplayMoveType();
}
}
else if (gMain.newKeys & DPAD_UP)
{
- if (gMoveSelectionCursor[gActiveBank] & 2)
+ if (gMoveSelectionCursor[gActiveBattler] & 2)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 2;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 2;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
MoveSelectionDisplayPpNumber();
MoveSelectionDisplayMoveType();
}
}
else if (gMain.newKeys & DPAD_DOWN)
{
- if (!(gMoveSelectionCursor[gActiveBank] & 2)
- && (gMoveSelectionCursor[gActiveBank] ^ 2) < gNumberOfMovesToChoose)
+ if (!(gMoveSelectionCursor[gActiveBattler] & 2)
+ && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gNumberOfMovesToChoose)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 2;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 2;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
MoveSelectionDisplayPpNumber();
MoveSelectionDisplayMoveType();
}
@@ -646,16 +612,16 @@ static void HandleInputChooseMove(void)
{
if (gNumberOfMovesToChoose > 1 && !(gBattleTypeFlags & BATTLE_TYPE_LINK))
{
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 29);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);
- if (gMoveSelectionCursor[gActiveBank] != 0)
+ if (gMoveSelectionCursor[gActiveBattler] != 0)
gMultiUsePlayerCursor = 0;
else
- gMultiUsePlayerCursor = gMoveSelectionCursor[gActiveBank] + 1;
+ gMultiUsePlayerCursor = gMoveSelectionCursor[gActiveBattler] + 1;
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);
- BattleHandleAddTextPrinter(gText_BattleSwitchWhich, 0xB);
- gBattleBankFunc[gActiveBank] = HandleMoveSwitchting;
+ BattlePutTextOnWindow(gText_BattleSwitchWhich, 0xB);
+ gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitchting;
}
}
}
@@ -676,35 +642,35 @@ u32 sub_8057FBC(void) // unused
gBattle_BG0_Y = 0x140;
var = 0xFF;
}
- if (gMain.newKeys & DPAD_LEFT && gMoveSelectionCursor[gActiveBank] & 1)
+ if (gMain.newKeys & DPAD_LEFT && gMoveSelectionCursor[gActiveBattler] & 1)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 1;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 1;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
}
- if (gMain.newKeys & DPAD_RIGHT && !(gMoveSelectionCursor[gActiveBank] & 1)
- && (gMoveSelectionCursor[gActiveBank] ^ 1) < gNumberOfMovesToChoose)
+ if (gMain.newKeys & DPAD_RIGHT && !(gMoveSelectionCursor[gActiveBattler] & 1)
+ && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gNumberOfMovesToChoose)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 1;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 1;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
}
- if (gMain.newKeys & DPAD_UP && gMoveSelectionCursor[gActiveBank] & 2)
+ if (gMain.newKeys & DPAD_UP && gMoveSelectionCursor[gActiveBattler] & 2)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 2;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 2;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
}
- if (gMain.newKeys & DPAD_DOWN && !(gMoveSelectionCursor[gActiveBank] & 2)
- && (gMoveSelectionCursor[gActiveBank] ^ 2) < gNumberOfMovesToChoose)
+ if (gMain.newKeys & DPAD_DOWN && !(gMoveSelectionCursor[gActiveBattler] & 2)
+ && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gNumberOfMovesToChoose)
{
- MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBank]);
- gMoveSelectionCursor[gActiveBank] ^= 2;
+ MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]);
+ gMoveSelectionCursor[gActiveBattler] ^= 2;
PlaySE(SE_SELECT);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
}
return var;
@@ -720,73 +686,73 @@ static void HandleMoveSwitchting(void)
{
PlaySE(SE_SELECT);
- if (gMoveSelectionCursor[gActiveBank] != gMultiUsePlayerCursor)
+ if (gMoveSelectionCursor[gActiveBattler] != gMultiUsePlayerCursor)
{
- struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
s32 i;
// swap moves and pp
- i = moveInfo->moves[gMoveSelectionCursor[gActiveBank]];
- moveInfo->moves[gMoveSelectionCursor[gActiveBank]] = moveInfo->moves[gMultiUsePlayerCursor];
+ i = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]];
+ moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] = moveInfo->moves[gMultiUsePlayerCursor];
moveInfo->moves[gMultiUsePlayerCursor] = i;
- i = moveInfo->currentPp[gMoveSelectionCursor[gActiveBank]];
- moveInfo->currentPp[gMoveSelectionCursor[gActiveBank]] = moveInfo->currentPp[gMultiUsePlayerCursor];
+ i = moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]];
+ moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] = moveInfo->currentPp[gMultiUsePlayerCursor];
moveInfo->currentPp[gMultiUsePlayerCursor] = i;
- i = moveInfo->maxPp[gMoveSelectionCursor[gActiveBank]];
- moveInfo->maxPp[gMoveSelectionCursor[gActiveBank]] = moveInfo->maxPp[gMultiUsePlayerCursor];
+ i = moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]];
+ moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]] = moveInfo->maxPp[gMultiUsePlayerCursor];
moveInfo->maxPp[gMultiUsePlayerCursor] = i;
- if (gDisableStructs[gActiveBank].unk18_b & gBitTable[gMoveSelectionCursor[gActiveBank]])
+ if (gDisableStructs[gActiveBattler].unk18_b & gBitTable[gMoveSelectionCursor[gActiveBattler]])
{
- gDisableStructs[gActiveBank].unk18_b &= (~gBitTable[gMoveSelectionCursor[gActiveBank]]);
- gDisableStructs[gActiveBank].unk18_b |= gBitTable[gMultiUsePlayerCursor];
+ gDisableStructs[gActiveBattler].unk18_b &= (~gBitTable[gMoveSelectionCursor[gActiveBattler]]);
+ gDisableStructs[gActiveBattler].unk18_b |= gBitTable[gMultiUsePlayerCursor];
}
MoveSelectionDisplayMoveNames();
for (i = 0; i < 4; i++)
- perMovePPBonuses[i] = (gBattleMons[gActiveBank].ppBonuses & (3 << (i * 2))) >> (i * 2);
+ perMovePPBonuses[i] = (gBattleMons[gActiveBattler].ppBonuses & (3 << (i * 2))) >> (i * 2);
- totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBank]];
- perMovePPBonuses[gMoveSelectionCursor[gActiveBank]] = perMovePPBonuses[gMultiUsePlayerCursor];
+ totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]];
+ perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gMultiUsePlayerCursor];
perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses;
totalPPBonuses = 0;
for (i = 0; i < 4; i++)
totalPPBonuses |= perMovePPBonuses[i] << (i * 2);
- gBattleMons[gActiveBank].ppBonuses = totalPPBonuses;
+ gBattleMons[gActiveBattler].ppBonuses = totalPPBonuses;
for (i = 0; i < 4; i++)
{
- gBattleMons[gActiveBank].moves[i] = moveInfo->moves[i];
- gBattleMons[gActiveBank].pp[i] = moveInfo->currentPp[i];
+ gBattleMons[gActiveBattler].moves[i] = moveInfo->moves[i];
+ gBattleMons[gActiveBattler].pp[i] = moveInfo->currentPp[i];
}
- if (!(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED))
+ if (!(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
{
for (i = 0; i < 4; i++)
{
- moveStruct.moves[i] = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i);
- moveStruct.currentPp[i] = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_PP1 + i);
+ moveStruct.moves[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i);
+ moveStruct.currentPp[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i);
}
- totalPPBonuses = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_PP_BONUSES);
+ totalPPBonuses = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES);
for (i = 0; i < 4; i++)
perMovePPBonuses[i] = (totalPPBonuses & (3 << (i * 2))) >> (i * 2);
- i = moveStruct.moves[gMoveSelectionCursor[gActiveBank]];
- moveStruct.moves[gMoveSelectionCursor[gActiveBank]] = moveStruct.moves[gMultiUsePlayerCursor];
+ i = moveStruct.moves[gMoveSelectionCursor[gActiveBattler]];
+ moveStruct.moves[gMoveSelectionCursor[gActiveBattler]] = moveStruct.moves[gMultiUsePlayerCursor];
moveStruct.moves[gMultiUsePlayerCursor] = i;
- i = moveStruct.currentPp[gMoveSelectionCursor[gActiveBank]];
- moveStruct.currentPp[gMoveSelectionCursor[gActiveBank]] = moveStruct.currentPp[gMultiUsePlayerCursor];
+ i = moveStruct.currentPp[gMoveSelectionCursor[gActiveBattler]];
+ moveStruct.currentPp[gMoveSelectionCursor[gActiveBattler]] = moveStruct.currentPp[gMultiUsePlayerCursor];
moveStruct.currentPp[gMultiUsePlayerCursor] = i;
- totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBank]];
- perMovePPBonuses[gMoveSelectionCursor[gActiveBank]] = perMovePPBonuses[gMultiUsePlayerCursor];
+ totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]];
+ perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]] = perMovePPBonuses[gMultiUsePlayerCursor];
perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses;
totalPPBonuses = 0;
@@ -795,17 +761,17 @@ static void HandleMoveSwitchting(void)
for (i = 0; i < 4; i++)
{
- SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i, &moveStruct.moves[i]);
- SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_PP1 + i, &moveStruct.currentPp[i]);
+ SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i, &moveStruct.moves[i]);
+ SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i, &moveStruct.currentPp[i]);
}
- SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_PP_BONUSES, &totalPPBonuses);
+ SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES, &totalPPBonuses);
}
}
- gBattleBankFunc[gActiveBank] = HandleInputChooseMove;
- gMoveSelectionCursor[gActiveBank] = gMultiUsePlayerCursor;
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;
+ gMoveSelectionCursor[gActiveBattler] = gMultiUsePlayerCursor;
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
MoveSelectionDisplayPpString();
MoveSelectionDisplayPpNumber();
MoveSelectionDisplayMoveType();
@@ -814,8 +780,8 @@ static void HandleMoveSwitchting(void)
{
PlaySE(SE_SELECT);
MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
- gBattleBankFunc[gActiveBank] = HandleInputChooseMove;
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;
MoveSelectionDisplayPpString();
MoveSelectionDisplayPpNumber();
MoveSelectionDisplayMoveType();
@@ -824,15 +790,15 @@ static void HandleMoveSwitchting(void)
{
if (gMultiUsePlayerCursor & 1)
{
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 29);
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);
else
MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);
gMultiUsePlayerCursor ^= 1;
PlaySE(SE_SELECT);
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);
else
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);
@@ -842,15 +808,15 @@ static void HandleMoveSwitchting(void)
{
if (!(gMultiUsePlayerCursor & 1) && (gMultiUsePlayerCursor ^ 1) < gNumberOfMovesToChoose)
{
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 29);
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);
else
MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);
gMultiUsePlayerCursor ^= 1;
PlaySE(SE_SELECT);
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);
else
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);
@@ -860,15 +826,15 @@ static void HandleMoveSwitchting(void)
{
if (gMultiUsePlayerCursor & 2)
{
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 29);
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);
else
MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);
gMultiUsePlayerCursor ^= 2;
PlaySE(SE_SELECT);
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);
else
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);
@@ -878,15 +844,15 @@ static void HandleMoveSwitchting(void)
{
if (!(gMultiUsePlayerCursor & 2) && (gMultiUsePlayerCursor ^ 2) < gNumberOfMovesToChoose)
{
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 29);
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 29);
else
MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor);
gMultiUsePlayerCursor ^= 2;
PlaySE(SE_SELECT);
- if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBank])
+ if (gMultiUsePlayerCursor == gMoveSelectionCursor[gActiveBattler])
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 0);
else
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);
@@ -896,7 +862,7 @@ static void HandleMoveSwitchting(void)
static void sub_80586F8(void)
{
- if (gLinkVSyncDisabled == 0)
+ if (gWirelessCommType == 0)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -904,8 +870,8 @@ static void sub_80586F8(void)
gMain.inBattle = 0;
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(sub_8038D64);
- if (gBattleOutcome == BATTLE_WON)
- sub_817E3F4();
+ if (gBattleOutcome == B_OUTCOME_WON)
+ TryPutLinkBattleTvShowOnAir();
FreeAllWindowBuffers();
}
}
@@ -917,8 +883,8 @@ static void sub_80586F8(void)
gMain.inBattle = 0;
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(sub_8038D64);
- if (gBattleOutcome == BATTLE_WON)
- sub_817E3F4();
+ if (gBattleOutcome == B_OUTCOME_WON)
+ TryPutLinkBattleTvShowOnAir();
FreeAllWindowBuffers();
}
}
@@ -932,12 +898,12 @@ void sub_80587B0(void)
{
if (sub_800A520())
{
- if (gLinkVSyncDisabled == 0)
+ if (gWirelessCommType == 0)
sub_800AC34();
else
sub_800ADF8();
- gBattleBankFunc[gActiveBank] = sub_80586F8;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80586F8;
}
}
else
@@ -950,34 +916,34 @@ void sub_80587B0(void)
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
PlayerBufferExecCompleted();
}
static void CompleteOnBankSpriteCallbackDummy2(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
PlayerBufferExecCompleted();
}
static void sub_80588B4(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
nullsub_25(gSaveBlock2Ptr->playerGender);
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
PlayerBufferExecCompleted();
}
}
static void sub_8058924(void)
{
- if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 0xFF)
+ if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
PlayerBufferExecCompleted();
}
}
@@ -988,33 +954,33 @@ static void sub_805896C(void)
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
var = TRUE;
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
var = TRUE;
}
- if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
+ if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
if (IsDoubleBattle())
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], gActiveBank ^ BIT_MON);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], gActiveBattler ^ BIT_FLANK);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_8058924;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8058924;
}
}
@@ -1023,58 +989,58 @@ static void sub_8058B40(void)
bool32 r9 = FALSE;
bool32 r8 = FALSE;
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
- sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]);
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
- sub_8172EF0(gActiveBank ^ BIT_MON, &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
+ sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
+ sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler ^ BIT_FLANK);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);
}
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1;
}
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x40
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x40
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40
&& !IsCryPlayingOrClearCrySongs())
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
- m4aMPlayContinue(&gMPlay_BGM);
+ m4aMPlayContinue(&gMPlayInfo_BGM);
else
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1;
r9 = TRUE;
}
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
r8 = TRUE;
}
}
else
{
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
{
r8 = TRUE;
}
@@ -1083,63 +1049,63 @@ static void sub_8058B40(void)
if (r9 && r8)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0;
- gBattleBankFunc[gActiveBank] = sub_805896C;
+ gBattlerControllerFuncs[gActiveBattler] = sub_805896C;
}
}
static void sub_8058EDC(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- CopyBattleSpriteInvisibility(gActiveBank);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ CopyBattleSpriteInvisibility(gActiveBattler);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleBankFunc[gActiveBank] = sub_8058FC0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8058FC0;
}
}
static void sub_8058FC0(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive
&& !IsCryPlayingOrClearCrySongs())
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
PlayerBufferExecCompleted();
}
}
static void sub_805902C(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);
}
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
- gBattleBankFunc[gActiveBank] = sub_8058EDC;
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8058EDC;
}
}
@@ -1147,24 +1113,24 @@ void c3_0802FDF4(u8 taskId)
{
if (!IsCryPlayingOrClearCrySongs())
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
DestroyTask(taskId);
}
}
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
{
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
PlayerBufferExecCompleted();
}
}
@@ -1177,16 +1143,16 @@ static void CompleteOnInactiveTextPrinter(void)
#define tExpTask_monId data[0]
#define tExpTask_gainedExp data[1]
-#define tExpTask_bank data[2]
+#define tExpTask_battler data[2]
#define tExpTask_frames data[10]
static void Task_GiveExpToMon(u8 taskId)
{
u32 monId = (u8)(gTasks[taskId].tExpTask_monId);
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_battler;
s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;
- if (IsDoubleBattle() == TRUE || monId != gBattlePartyID[bank]) // give exp without the expbar
+ if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar.
{
struct Pokemon *mon = &gPlayerParty[monId];
u16 species = GetMonData(mon, MON_DATA_SPECIES);
@@ -1196,19 +1162,19 @@ static void Task_GiveExpToMon(u8 taskId)
if (currExp + gainedExp >= nextLvlExp)
{
- u8 savedActiveBank;
+ u8 savedActiveBattler;
SetMonData(mon, MON_DATA_EXP, &nextLvlExp);
CalculateMonStats(mon);
gainedExp -= nextLvlExp - currExp;
- savedActiveBank = gActiveBank;
- gActiveBank = bank;
- EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp);
- gActiveBank = savedActiveBank;
+ savedActiveBattler = gActiveBattler;
+ gActiveBattler = battlerId;
+ BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
+ gActiveBattler = savedActiveBattler;
if (IsDoubleBattle() == TRUE
- && ((u16)(monId) == gBattlePartyID[bank] || (u16)(monId) == gBattlePartyID[bank ^ BIT_MON]))
- gTasks[taskId].func = sub_8059544;
+ && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]))
+ gTasks[taskId].func = Task_LaunchLvlUpAnim;
else
gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;
}
@@ -1216,7 +1182,7 @@ static void Task_GiveExpToMon(u8 taskId)
{
currExp += gainedExp;
SetMonData(mon, MON_DATA_EXP, &currExp);
- gBattleBankFunc[bank] = CompleteOnInactiveTextPrinter;
+ gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
DestroyTask(taskId);
}
}
@@ -1230,7 +1196,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId)
{
u8 monIndex = gTasks[taskId].tExpTask_monId;
s32 gainedExp = gTasks[taskId].tExpTask_gainedExp;
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_battler;
struct Pokemon *mon = &gPlayerParty[monIndex];
u8 level = GetMonData(mon, MON_DATA_LEVEL);
u16 species = GetMonData(mon, MON_DATA_SPECIES);
@@ -1240,7 +1206,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId)
exp -= currLvlExp;
expToNextLvl = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLvlExp;
- SetBattleBarStruct(bank, gHealthBoxesIds[bank], expToNextLvl, exp, -gainedExp);
+ SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp);
PlaySE(SE_EXP);
gTasks[taskId].func = sub_8059400;
}
@@ -1255,12 +1221,12 @@ static void sub_8059400(u8 taskId)
{
u8 monId = gTasks[taskId].tExpTask_monId;
s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;
- u8 bank = gTasks[taskId].tExpTask_bank;
- s16 r4;
+ u8 battlerId = gTasks[taskId].tExpTask_battler;
+ s16 newExpPoints;
- r4 = sub_8074AA0(bank, gHealthBoxesIds[bank], EXP_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[bank]);
- if (r4 == -1)
+ newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]);
+ if (newExpPoints == -1) // The bar has been filled with given exp points.
{
u8 level;
s32 currExp;
@@ -1275,54 +1241,54 @@ static void sub_8059400(u8 taskId)
if (currExp + gainedExp >= expOnNextLvl)
{
- u8 savedActiveBank;
+ u8 savedActiveBattler;
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl);
CalculateMonStats(&gPlayerParty[monId]);
gainedExp -= expOnNextLvl - currExp;
- savedActiveBank = gActiveBank;
- gActiveBank = bank;
- EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp);
- gActiveBank = savedActiveBank;
- gTasks[taskId].func = sub_8059544;
+ savedActiveBattler = gActiveBattler;
+ gActiveBattler = battlerId;
+ BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
+ gActiveBattler = savedActiveBattler;
+ gTasks[taskId].func = Task_LaunchLvlUpAnim;
}
else
{
currExp += gainedExp;
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp);
- gBattleBankFunc[bank] = CompleteOnInactiveTextPrinter;
+ gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
DestroyTask(taskId);
}
}
}
}
-static void sub_8059544(u8 taskId)
+static void Task_LaunchLvlUpAnim(u8 taskId)
{
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_battler;
u8 monIndex = gTasks[taskId].tExpTask_monId;
- if (IsDoubleBattle() == TRUE && monIndex == gBattlePartyID[bank ^ BIT_MON])
- bank ^= BIT_MON;
+ if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])
+ battlerId ^= BIT_FLANK;
- InitAndLaunchSpecialAnimation(bank, bank, bank, B_ANIM_LVL_UP);
- gTasks[taskId].func = sub_80595A4;
+ InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP);
+ gTasks[taskId].func = Task_UpdateLvlInHealthbox;
}
-static void sub_80595A4(u8 taskId)
+static void Task_UpdateLvlInHealthbox(u8 taskId)
{
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_battler;
- if (!gBattleSpritesDataPtr->healthBoxesData[bank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive)
{
u8 monIndex = gTasks[taskId].tExpTask_monId;
- GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value
+ GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value.
- if (IsDoubleBattle() == TRUE && monIndex == gBattlePartyID[bank ^ BIT_MON])
- UpdateHealthboxAttribute(gHealthBoxesIds[bank ^ BIT_MON], &gPlayerParty[monIndex], HEALTHBOX_ALL);
+ if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL);
else
- UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[monIndex], HEALTHBOX_ALL);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL);
gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;
}
@@ -1331,36 +1297,36 @@ static void sub_80595A4(u8 taskId)
static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId)
{
u8 monIndex;
- u8 bank;
+ u8 battlerId;
monIndex = gTasks[taskId].tExpTask_monId;
- GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value
- bank = gTasks[taskId].tExpTask_bank;
- gBattleBankFunc[bank] = CompleteOnInactiveTextPrinter;
+ GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value.
+ battlerId = gTasks[taskId].tExpTask_battler;
+ gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
DestroyTask(taskId);
}
static void sub_80596A8(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > DISPLAY_HEIGHT)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
nullsub_24(species);
- FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
PlayerBufferExecCompleted();
}
}
static void sub_8059744(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
PlayerBufferExecCompleted();
}
}
@@ -1371,30 +1337,30 @@ static void CompleteOnInactiveTextPrinter2(void)
PlayerBufferExecCompleted();
}
-static void sub_80597CC(void)
+static void OpenPartyMenuToChooseMon(void)
{
if (!gPaletteFade.active)
{
- u8 r4;
+ u8 caseId;
- gBattleBankFunc[gActiveBank] = sub_8059828;
- r4 = gTasks[gUnknown_03005D7C[gActiveBank]].data[0];
- DestroyTask(gUnknown_03005D7C[gActiveBank]);
+ gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection;
+ caseId = gTasks[gUnknown_03005D7C[gActiveBattler]].data[0];
+ DestroyTask(gUnknown_03005D7C[gActiveBattler]);
FreeAllWindowBuffers();
- sub_81B89AC(r4);
+ OpenPartyMenuInBattle(caseId);
}
}
-static void sub_8059828(void)
+static void WaitForMonSelection(void)
{
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
if (gUnknown_0203CEE8 == 1)
- EmitChosenMonReturnValue(1, gUnknown_0203CEE9, gUnknown_0203CF00);
+ BtlController_EmitChosenMonReturnValue(1, gUnknown_0203CEE9, gUnknown_0203CF00);
else
- EmitChosenMonReturnValue(1, 6, NULL);
+ BtlController_EmitChosenMonReturnValue(1, 6, NULL);
- if ((gBattleBufferA[gActiveBank][1] & 0xF) == 1)
+ if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1)
PrintLinkStandbyMsg();
PlayerBufferExecCompleted();
@@ -1405,7 +1371,7 @@ static void OpenBagAndChooseItem(void)
{
if (!gPaletteFade.active)
{
- gBattleBankFunc[gActiveBank] = CompleteWhenChoseItem;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem;
nullsub_35();
FreeAllWindowBuffers();
sub_81AABB0();
@@ -1416,33 +1382,33 @@ static void CompleteWhenChoseItem(void)
{
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
- EmitOneReturnValue(1, gSpecialVar_ItemId);
+ BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);
PlayerBufferExecCompleted();
}
}
static void CompleteOnSpecialAnimDone(void)
{
- if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
PlayerBufferExecCompleted();
}
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
PlayerBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
@@ -1468,9 +1434,9 @@ static void PlayerHandleUnknownYesNoInput(void)
PlaySE(SE_SELECT);
if (gMultiUsePlayerCursor != 0)
- EmitTwoReturnValues(1, 0xE, 0);
+ BtlController_EmitTwoReturnValues(1, 0xE, 0);
else
- EmitTwoReturnValues(1, 0xD, 0);
+ BtlController_EmitTwoReturnValues(1, 0xD, 0);
PlayerBufferExecCompleted();
}
@@ -1485,14 +1451,14 @@ static void PlayerHandleUnknownYesNoInput(void)
static void MoveSelectionDisplayMoveNames(void)
{
s32 i;
- struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
gNumberOfMovesToChoose = 0;
for (i = 0; i < 4; i++)
{
MoveSelectionDestroyCursorAt(i);
StringCopy(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, i + 3);
+ BattlePutTextOnWindow(gDisplayedStringBattle, i + 3);
if (moveInfo->moves[i] != MOVE_NONE)
gNumberOfMovesToChoose++;
}
@@ -1501,7 +1467,7 @@ static void MoveSelectionDisplayMoveNames(void)
static void MoveSelectionDisplayPpString(void)
{
StringCopy(gDisplayedStringBattle, gText_MoveInterfacePP);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 7);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 7);
}
static void MoveSelectionDisplayPpNumber(void)
@@ -1509,23 +1475,23 @@ static void MoveSelectionDisplayPpNumber(void)
u8 *txtPtr;
struct ChooseMoveStruct *moveInfo;
- if (gBattleBufferA[gActiveBank][2] == TRUE) // check if we didn't want to display pp number
+ if (gBattleBufferA[gActiveBattler][2] == TRUE) // check if we didn't want to display pp number
return;
SetPpNumbersPaletteInMoveSelection();
- moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
- txtPtr = ConvertIntToDecimalStringN(gDisplayedStringBattle, moveInfo->currentPp[gMoveSelectionCursor[gActiveBank]], STR_CONV_MODE_RIGHT_ALIGN, 2);
+ moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
+ txtPtr = ConvertIntToDecimalStringN(gDisplayedStringBattle, moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2);
txtPtr[0] = CHAR_SLASH;
txtPtr++;
- ConvertIntToDecimalStringN(txtPtr, moveInfo->maxPp[gMoveSelectionCursor[gActiveBank]], STR_CONV_MODE_RIGHT_ALIGN, 2);
+ ConvertIntToDecimalStringN(txtPtr, moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 9);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 9);
}
static void MoveSelectionDisplayMoveType(void)
{
u8 *txtPtr;
- struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType);
txtPtr[0] = EXT_CTRL_CODE_BEGIN;
@@ -1535,8 +1501,8 @@ static void MoveSelectionDisplayMoveType(void)
txtPtr[0] = 1;
txtPtr++;
- StringCopy(txtPtr, gTypeNames[gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBank]]].type]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 10);
+ StringCopy(txtPtr, gTypeNames[gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].type]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 10);
}
static void MoveSelectionCreateCursorAt(u8 cursorPosition, u8 arg1)
@@ -1591,13 +1557,13 @@ void SetCB2ToReshowScreenAfterMenu2(void)
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
PlayerBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
PlayerBufferExecCompleted();
}
@@ -1607,7 +1573,7 @@ static void PrintLinkStandbyMsg(void)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- BattleHandleAddTextPrinter(gText_LinkStandby, 0);
+ BattlePutTextOnWindow(gText_LinkStandby, 0);
}
}
@@ -1618,13 +1584,13 @@ static void PlayerHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += CopyPlayerMonData(gBattlePartyID[gActiveBank], monData);
+ size += CopyPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -1632,7 +1598,7 @@ static void PlayerHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
PlayerBufferExecCompleted();
}
@@ -1646,7 +1612,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
@@ -1712,7 +1678,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -1727,7 +1693,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -1945,14 +1911,14 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst)
void PlayerHandleGetRawMonData(void)
{
struct BattlePokemon battleMon;
- u8 *src = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
- u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBank][1];
+ u8 *src = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
+ u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
dst[i] = src[i];
- EmitDataTransfer(1, gBattleBufferA[gActiveBank][2], dst);
+ BtlController_EmitDataTransfer(1, gBattleBufferA[gActiveBattler][2], dst);
PlayerBufferExecCompleted();
}
@@ -1961,13 +1927,13 @@ static void PlayerHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetPlayerMonData(gBattlePartyID[gActiveBank]);
+ SetPlayerMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -1980,11 +1946,11 @@ static void PlayerHandleSetMonData(void)
static void SetPlayerMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -2025,10 +1991,10 @@ static void SetPlayerMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -2042,260 +2008,260 @@ static void SetPlayerMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
}
static void PlayerHandleSetRawMonData(void)
{
- u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
+ u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
- dst[i] = gBattleBufferA[gActiveBank][3 + i];
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
+ dst[i] = gBattleBufferA[gActiveBattler][3 + i];
PlayerBufferExecCompleted();
}
static void PlayerHandleLoadMonSprite(void)
{
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpritePosX_0;
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpritePosX_0;
}
static void PlayerHandleSwitchInAnim(void)
{
- ClearTemporarySpeciesSpriteData(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- gActionSelectionCursor[gActiveBank] = 0;
- gMoveSelectionCursor[gActiveBank] = 0;
- sub_805B258(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattleBankFunc[gActiveBank] = sub_805902C;
+ ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ gActionSelectionCursor[gActiveBattler] = 0;
+ gMoveSelectionCursor[gActiveBattler] = 0;
+ sub_805B258(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_805902C;
}
-static void sub_805B258(u8 bank, bool8 dontClearSubstituteBit)
+static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit)
{
u16 species;
- ClearTemporarySpeciesSpriteData(bank, dontClearSubstituteBit);
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- sub_806A068(species, GetBankIdentity(bank));
+ ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
- gBankSpriteIds[bank] = CreateSprite(
- &gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattlerSpriteIds[battlerId] = CreateSprite(
+ &gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF);
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);
}
static void PlayerHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = DoSwitchOutAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
PlayerBufferExecCompleted();
}
}
static void DoSwitchOutAnimation(void)
{
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON);
- gBattleBankFunc[gActiveBank] = sub_8059744;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8059744;
}
break;
}
}
-// some explanation here
-// in emerald it's possible to have a tag battle in the battle frontier facilities with AI
-// which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it
+// In emerald it's possible to have a tag battle in the battle frontier facilities with AI
+// which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven)
+// that use an animated back pic.
static void PlayerHandleDrawTrainerPic(void)
{
s16 xPos, yPos;
@@ -2306,16 +2272,16 @@ static void PlayerHandleDrawTrainerPic(void)
if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_FIRE_RED
|| (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_LEAF_GREEN)
{
- trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RED;
+ trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RED;
}
else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY
|| (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE)
{
- trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RS_BRENDAN;
+ trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN;
}
else
{
- trainerPicId = gLinkPlayers[GetMultiplayerId()].gender;
+ trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_BRENDAN;
}
}
else
@@ -2325,12 +2291,12 @@ static void PlayerHandleDrawTrainerPic(void)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- if ((GetBankIdentity(gActiveBank) & BIT_MON) != 0) // second mon
+ if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right.
xPos = 90;
- else // first mon
+ else // First mon, on the left.
xPos = 32;
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != STEVEN_PARTNER_ID)
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER)
{
xPos = 90;
yPos = (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 80;
@@ -2348,35 +2314,35 @@ static void PlayerHandleDrawTrainerPic(void)
}
// Use front pic table for any tag battles unless your partner is Steven.
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != STEVEN_PARTNER_ID)
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER)
{
trainerPicId = PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender);
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A1C0(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBank));
-
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.y = 48;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineMode = 0;
- gSprites[gBankSpriteIds[gActiveBank]].hFlip = 1;
- }
- // use the back pic in any other scenario
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler));
+
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y = 48;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = 0;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1;
+ }
+ // Use the back pic in any other scenario.
else
{
- DecompressTrainerBackPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBank));
+ DecompressTrainerBackPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
}
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void PlayerHandleTrainerSlide(void)
@@ -2388,73 +2354,73 @@ static void PlayerHandleTrainerSlide(void)
if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_FIRE_RED
|| (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_LEAF_GREEN)
{
- trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RED;
+ trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RED;
}
else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY
|| (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE)
{
- trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RS_BRENDAN;
+ trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN;
}
else
{
- trainerPicId = gLinkPlayers[GetMultiplayerId()].gender;
+ trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_BRENDAN;
}
}
else
{
- trainerPicId = gSaveBlock2Ptr->playerGender;
+ trainerPicId = gSaveBlock2Ptr->playerGender + TRAINER_BACK_PIC_BRENDAN;
}
- DecompressTrainerBackPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, 80, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, 30);
+ DecompressTrainerBackPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, 30);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -96;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy2;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2;
}
static void PlayerHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 50;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
- gBattleBankFunc[gActiveBank] = sub_80588B4;
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
+ gBattlerControllerFuncs[gActiveBattler] = sub_80588B4;
}
static void PlayerHandleFaintAnimation(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER);
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 5;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00;
- gBattleBankFunc[gActiveBank] = sub_80596A8;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80596A8;
}
}
}
static void PlayerHandlePaletteFade(void)
{
- BeginNormalPaletteFade(-1, 2, 0, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0);
PlayerBufferExecCompleted();
}
@@ -2462,23 +2428,23 @@ static void PlayerHandleSuccessBallThrowAnim(void)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_BALL_THROW);
- gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void PlayerHandleBallThrowAnim(void)
{
- u8 ballThrowCaseId = gBattleBufferA[gActiveBank][1];
+ u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_BALL_THROW);
- gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void PlayerHandlePause(void)
{
- u8 var = gBattleBufferA[gActiveBank][1];
+ u8 var = gBattleBufferA[gActiveBattler][1];
// WTF is this??
while (var != 0)
@@ -2489,52 +2455,52 @@ static void PlayerHandlePause(void)
static void PlayerHandleMoveAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
- if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
+ if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // Always returns FALSE.
{
PlayerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = PlayerDoMoveAnimation;
- sub_817E0FC(move, gWeatherMoveAnim, gAnimDisableStructPtr);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerDoMoveAnimation;
+ BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr);
}
}
}
static void PlayerDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- u8 multihit = gBattleBufferA[gActiveBank][11];
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+ u8 multihit = gBattleBufferA[gActiveBattler][11];
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute
- && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute
+ && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)
{
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -2542,20 +2508,20 @@ static void PlayerDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
PlayerBufferExecCompleted();
}
break;
@@ -2568,17 +2534,17 @@ static void PlayerHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter2;
- sub_817C95C(*stringId);
- sub_81A57E4(gActiveBank, *stringId);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2;
+ BattleTv_SetDataBasedOnString(*stringId);
+ sub_81A57E4(gActiveBattler, *stringId);
}
-static void PlayerHandlePrintStringPlayerOnly(void)
+static void PlayerHandlePrintSelectionString(void)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
PlayerHandlePrintString();
else
PlayerBufferExecCompleted();
@@ -2590,7 +2556,7 @@ static void HandleChooseActionAfterDma3(void)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 160;
- gBattleBankFunc[gActiveBank] = HandleInputChooseAction;
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;
}
}
@@ -2598,27 +2564,27 @@ static void PlayerHandleChooseAction(void)
{
s32 i;
- gBattleBankFunc[gActiveBank] = HandleChooseActionAfterDma3;
- sub_817F2A8();
- BattleHandleAddTextPrinter(gText_BattleMenu, 2);
+ gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;
+ BattleTv_ClearExplosionFaintCause();
+ BattlePutTextOnWindow(gText_BattleMenu, 2);
for (i = 0; i < 4; i++)
ActionSelectionDestroyCursorAt(i);
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 1);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 1);
}
static void PlayerHandleUnknownYesNoBox(void)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
- BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 12);
+ BattlePutTextOnWindow(gText_BattleYesNoChoice, 12);
gMultiUsePlayerCursor = 1;
BattleCreateYesNoCursorAt(1);
- gBattleBankFunc[gActiveBank] = PlayerHandleUnknownYesNoInput;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerHandleUnknownYesNoInput;
}
else
{
@@ -2632,16 +2598,16 @@ static void HandleChooseMoveAfterDma3(void)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 320;
- gBattleBankFunc[gActiveBank] = HandleInputChooseMove;
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove;
}
}
static void PlayerChooseMoveInBattlePalace(void)
{
- if (--*(gBattleStruct->field_298 + gActiveBank) == 0)
+ if (--*(gBattleStruct->field_298 + gActiveBattler) == 0)
{
gBattlePalaceMoveSelectionRngValue = gRngValue;
- EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
+ BtlController_EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
PlayerBufferExecCompleted();
}
}
@@ -2650,13 +2616,13 @@ static void PlayerHandleChooseMove(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- *(gBattleStruct->field_298 + gActiveBank) = 8;
- gBattleBankFunc[gActiveBank] = PlayerChooseMoveInBattlePalace;
+ *(gBattleStruct->field_298 + gActiveBattler) = 8;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerChooseMoveInBattlePalace;
}
else
{
InitMoveSelectionsVarsAndStrings();
- gBattleBankFunc[gActiveBank] = HandleChooseMoveAfterDma3;
+ gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3;
}
}
@@ -2664,7 +2630,7 @@ void InitMoveSelectionsVarsAndStrings(void)
{
MoveSelectionDisplayMoveNames();
gMultiUsePlayerCursor = 0xFF;
- MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBank], 0);
+ MoveSelectionCreateCursorAt(gMoveSelectionCursor[gActiveBattler], 0);
MoveSelectionDisplayPpString();
MoveSelectionDisplayPpNumber();
MoveSelectionDisplayMoveType();
@@ -2674,12 +2640,12 @@ static void PlayerHandleChooseItem(void)
{
s32 i;
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- gBattleBankFunc[gActiveBank] = OpenBagAndChooseItem;
- gBankInMenu = gActiveBank;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem;
+ gBattlerInMenuId = gActiveBattler;
for (i = 0; i < 3; i++)
- gUnknown_0203CF00[i] = gBattleBufferA[gActiveBank][1 + i];
+ gUnknown_0203CF00[i] = gBattleBufferA[gActiveBattler][1 + i];
}
static void PlayerHandleChoosePokemon(void)
@@ -2687,30 +2653,30 @@ static void PlayerHandleChoosePokemon(void)
s32 i;
for (i = 0; i < 3; i++)
- gUnknown_0203CF00[i] = gBattleBufferA[gActiveBank][4 + i];
+ gUnknown_0203CF00[i] = gBattleBufferA[gActiveBattler][4 + i];
- if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBank][1] & 0xF) != 2)
+ if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_CANT_SWITCH)
{
- EmitChosenMonReturnValue(1, gBattlePartyID[gActiveBank] + 1, gUnknown_0203CF00);
+ BtlController_EmitChosenMonReturnValue(1, gBattlerPartyIndexes[gActiveBattler] + 1, gUnknown_0203CF00);
PlayerBufferExecCompleted();
}
else
{
- gUnknown_03005D7C[gActiveBank] = CreateTask(TaskDummy, 0xFF);
- gTasks[gUnknown_03005D7C[gActiveBank]].data[0] = gBattleBufferA[gActiveBank][1] & 0xF;
- *(&gBattleStruct->field_49) = gBattleBufferA[gActiveBank][1] >> 4;
- *(&gBattleStruct->field_8B) = gBattleBufferA[gActiveBank][2];
- *(&gBattleStruct->field_B0) = gBattleBufferA[gActiveBank][3];
- BeginNormalPaletteFade(-1, 0, 0, 16, 0);
- gBattleBankFunc[gActiveBank] = sub_80597CC;
- gBankInMenu = gActiveBank;
+ gUnknown_03005D7C[gActiveBattler] = CreateTask(TaskDummy, 0xFF);
+ gTasks[gUnknown_03005D7C[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF;
+ *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4;
+ *(&gBattleStruct->field_8B) = gBattleBufferA[gActiveBattler][2];
+ *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3];
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon;
+ gBattlerInMenuId = gActiveBattler;
}
}
static void PlayerHandleCmd23(void)
{
BattleStopLowHpSound();
- BeginNormalPaletteFade(-1, 2, 0, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0);
PlayerBufferExecCompleted();
}
@@ -2719,32 +2685,32 @@ static void PlayerHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (hpVal > 0)
gUnknown_0203CD70 += hpVal;
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], 0, HP_CURRENT);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void PlayerHandleExpUpdate(void)
{
- u8 monId = gBattleBufferA[gActiveBank][1];
+ u8 monId = gBattleBufferA[gActiveBattler][1];
if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_MON_LEVEL)
{
@@ -2756,49 +2722,49 @@ static void PlayerHandleExpUpdate(void)
u8 taskId;
LoadBattleBarGfx(1);
- GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // unused return value
- expPointsToGive = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // Unused return value.
+ expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]);
taskId = CreateTask(Task_GiveExpToMon, 10);
gTasks[taskId].tExpTask_monId = monId;
gTasks[taskId].tExpTask_gainedExp = expPointsToGive;
- gTasks[taskId].tExpTask_bank = gActiveBank;
- gBattleBankFunc[gActiveBank] = nullsub_21;
+ gTasks[taskId].tExpTask_battler = gActiveBattler;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_21;
}
}
#undef tExpTask_monId
#undef tExpTask_gainedExp
-#undef tExpTask_bank
+#undef tExpTask_battler
#undef tExpTask_frames
static void PlayerHandleStatusIconUpdate(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 bank;
+ u8 battlerId;
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_STATUS_ICON);
- bank = gActiveBank;
- gBattleSpritesDataPtr->healthBoxesData[bank].statusAnimActive = 0;
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);
+ battlerId = gActiveBattler;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void PlayerHandleStatusAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1],
- gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24));
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],
+ gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void PlayerHandleStatusXor(void)
{
- u8 val = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBank][1];
+ u8 val = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBattler][1];
- SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS, &val);
+ SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS, &val);
PlayerBufferExecCompleted();
}
@@ -2809,13 +2775,13 @@ static void PlayerHandleDataTransfer(void)
static void PlayerHandleDMA3Transfer(void)
{
- u32 dstArg = gBattleBufferA[gActiveBank][1]
- | (gBattleBufferA[gActiveBank][2] << 8)
- | (gBattleBufferA[gActiveBank][3] << 16)
- | (gBattleBufferA[gActiveBank][4] << 24);
- u16 sizeArg = gBattleBufferA[gActiveBank][5] | (gBattleBufferA[gActiveBank][6] << 8);
+ u32 dstArg = gBattleBufferA[gActiveBattler][1]
+ | (gBattleBufferA[gActiveBattler][2] << 8)
+ | (gBattleBufferA[gActiveBattler][3] << 16)
+ | (gBattleBufferA[gActiveBattler][4] << 24);
+ u16 sizeArg = gBattleBufferA[gActiveBattler][5] | (gBattleBufferA[gActiveBattler][6] << 8);
- const u8 *src = &gBattleBufferA[gActiveBank][7];
+ const u8 *src = &gBattleBufferA[gActiveBattler][7];
u8 *dst = (u8*)(dstArg);
u32 size = sizeArg;
@@ -2836,7 +2802,7 @@ static void PlayerHandleDMA3Transfer(void)
static void PlayerHandlePlayBGM(void)
{
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
PlayerBufferExecCompleted();
}
@@ -2847,25 +2813,25 @@ static void PlayerHandleCmd32(void)
static void PlayerHandleTwoReturnValues(void)
{
- EmitTwoReturnValues(1, 0, 0);
+ BtlController_EmitTwoReturnValues(1, 0, 0);
PlayerBufferExecCompleted();
}
static void PlayerHandleChosenMonReturnValue(void)
{
- EmitChosenMonReturnValue(1, 0, NULL);
+ BtlController_EmitChosenMonReturnValue(1, 0, NULL);
PlayerBufferExecCompleted();
}
static void PlayerHandleOneReturnValue(void)
{
- EmitOneReturnValue(1, 0);
+ BtlController_EmitOneReturnValue(1, 0);
PlayerBufferExecCompleted();
}
static void PlayerHandleOneReturnValue_Duplicate(void)
{
- EmitOneReturnValue_Duplicate(1, 0);
+ BtlController_EmitOneReturnValue_Duplicate(1, 0);
PlayerBufferExecCompleted();
}
@@ -2877,7 +2843,7 @@ static void PlayerHandleCmd37(void)
static void PlayerHandleCmd38(void)
{
- gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBank][1];
+ gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1];
PlayerBufferExecCompleted();
}
@@ -2895,16 +2861,16 @@ static void PlayerHandleCmd40(void)
static void PlayerHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
PlayerBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -2913,29 +2879,29 @@ static void PlayerHandleCmd42(void)
PlayerBufferExecCompleted();
}
-static void PlayerHandleEffectivenessSound(void)
+static void PlayerHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
PlayerBufferExecCompleted();
}
static void PlayerHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
PlayerBufferExecCompleted();
@@ -2943,7 +2909,7 @@ static void PlayerHandlePlayFanfareOrBGM(void)
static void PlayerHandleFaintingCry(void)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry3(species, -25, 5);
PlayerBufferExecCompleted();
@@ -2951,8 +2917,8 @@ static void PlayerHandleFaintingCry(void)
static void PlayerHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
PlayerBufferExecCompleted();
}
@@ -2961,40 +2927,40 @@ static void PlayerHandleIntroTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 50;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
paletteNum = AllocSpritePalette(0xD6F8);
LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, 0x100 + paletteNum * 16, 32);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;
taskId = CreateTask(task05_08033660, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_21;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_21;
}
void sub_805CC00(struct Sprite *sprite)
{
- u8 bank = sprite->data5;
+ u8 battlerId = sprite->data[5];
FreeSpriteOamMatrix(sprite);
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
DestroySprite(sprite);
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank);
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], 0);
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0);
}
static void task05_08033660(u8 taskId)
@@ -3005,109 +2971,109 @@ static void task05_08033660(u8 taskId)
}
else
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBattler = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
+ gActiveBattler = gTasks[taskId].data[0];
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_805B258(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_805B258(gActiveBattler, FALSE);
}
else
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_805B258(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_805B258(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_805B258(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ sub_805B258(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
}
- gBattleBankFunc[gActiveBank] = sub_8058B40;
- gActiveBank = savedActiveBank;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8058B40;
+ gActiveBattler = savedActiveBattler;
DestroyTask(taskId);
}
}
static void PlayerHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
PlayerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
- if (gBattleBufferA[gActiveBank][2] != 0)
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0x5D;
+ if (gBattleBufferA[gActiveBattler][2] != 0)
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D;
- gBattleBankFunc[gActiveBank] = sub_805CE38;
+ gBattlerControllerFuncs[gActiveBattler] = sub_805CE38;
}
}
static void sub_805CE38(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5++ > 0x5C)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
PlayerBufferExecCompleted();
}
}
-static void PlayerHandleCmd49(void)
+static void PlayerHandleHidePartyStatusSummary(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
PlayerBufferExecCompleted();
}
-static void PlayerHandleCmd50(void)
+static void PlayerHandleEndBounceEffect(void)
{
- dp11b_obj_free(gActiveBank, 1);
- dp11b_obj_free(gActiveBank, 0);
+ EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);
+ EndBounceEffect(gActiveBattler, BOUNCE_MON);
PlayerBufferExecCompleted();
}
static void PlayerHandleSpriteInvisibility(void)
{
- if (IsBankSpritePresent(gActiveBank))
+ if (IsBattlerSpritePresent(gActiveBattler))
{
- gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
- CopyBattleSpriteInvisibility(gActiveBank);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];
+ CopyBattleSpriteInvisibility(gActiveBattler);
}
PlayerBufferExecCompleted();
}
static void PlayerHandleBattleAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
PlayerBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
- sub_817E32C(animationId);
+ BattleTv_SetDataBasedOnAnimation(animationId);
}
}
static void PlayerHandleLinkStandbyMsg(void)
{
- sub_81851A8(&gBattleBufferA[gActiveBank][2]);
- switch (gBattleBufferA[gActiveBank][1])
+ sub_81851A8(&gBattleBufferA[gActiveBattler][2]);
+ switch (gBattleBufferA[gActiveBattler][1])
{
case 0:
PrintLinkStandbyMsg();
// fall through
case 1:
- dp11b_obj_free(gActiveBank, 1);
- dp11b_obj_free(gActiveBank, 0);
+ EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX);
+ EndBounceEffect(gActiveBattler, BOUNCE_MON);
break;
case 2:
PrintLinkStandbyMsg();
@@ -3118,17 +3084,17 @@ static void PlayerHandleLinkStandbyMsg(void)
static void PlayerHandleResetActionMoveSelection(void)
{
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case RESET_ACTION_MOVE_SELECTION:
- gActionSelectionCursor[gActiveBank] = 0;
- gMoveSelectionCursor[gActiveBank] = 0;
+ gActionSelectionCursor[gActiveBattler] = 0;
+ gMoveSelectionCursor[gActiveBattler] = 0;
break;
case RESET_ACTION_SELECTION:
- gActionSelectionCursor[gActiveBank] = 0;
+ gActionSelectionCursor[gActiveBattler] = 0;
break;
case RESET_MOVE_SELECTION:
- gMoveSelectionCursor[gActiveBank] = 0;
+ gMoveSelectionCursor[gActiveBattler] = 0;
break;
}
PlayerBufferExecCompleted();
@@ -3136,13 +3102,13 @@ static void PlayerHandleResetActionMoveSelection(void)
static void PlayerHandleCmd55(void)
{
- sub_81851A8(&gBattleBufferA[gActiveBank][4]);
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
- gSaveBlock2Ptr->field_CA9_b = gBattleBufferA[gActiveBank][2];
+ sub_81851A8(&gBattleBufferA[gActiveBattler][4]);
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
+ gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
PlayerBufferExecCompleted();
- gBattleBankFunc[gActiveBank] = sub_80587B0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80587B0;
}
static void nullsub_22(void)
diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c
index 0cd34442a..601b8dcc1 100644
--- a/src/battle_controller_player_partner.c
+++ b/src/battle_controller_player_partner.c
@@ -4,12 +4,14 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
-#include "songs.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
#include "sound.h"
#include "window.h"
#include "m4a.h"
@@ -21,44 +23,20 @@
#include "reshow_battle_screen.h"
#include "pokeball.h"
#include "data2.h"
+#include "battle_setup.h"
+#include "item_use.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void (*gPreBattleCallback1)(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u16 gSpecialVar_ItemId;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
-extern u8 gBankInMenu;
-extern u16 gUnknown_020243FC;
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u16 gPartnerTrainerId;
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u8 gUnknown_020244B4[];
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
-extern const struct BattleMove gBattleMoves[];
extern void sub_81358F4(void);
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_806A068(u16, u8);
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
+extern void SetMultiuseSpriteTemplateToPokemon(u16, u8);
+extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
// this file's functions
static void PlayerPartnerHandleGetMonData(void);
@@ -78,7 +56,7 @@ static void PlayerPartnerHandleBallThrowAnim(void);
static void PlayerPartnerHandlePause(void);
static void PlayerPartnerHandleMoveAnimation(void);
static void PlayerPartnerHandlePrintString(void);
-static void PlayerPartnerHandlePrintStringPlayerOnly(void);
+static void PlayerPartnerHandlePrintSelectionString(void);
static void PlayerPartnerHandleChooseAction(void);
static void PlayerPartnerHandleUnknownYesNoBox(void);
static void PlayerPartnerHandleChooseMove(void);
@@ -104,14 +82,14 @@ static void PlayerPartnerHandleCmd39(void);
static void PlayerPartnerHandleCmd40(void);
static void PlayerPartnerHandleHitAnimation(void);
static void PlayerPartnerHandleCmd42(void);
-static void PlayerPartnerHandleEffectivenessSound(void);
+static void PlayerPartnerHandlePlaySE(void);
static void PlayerPartnerHandlePlayFanfareOrBGM(void);
static void PlayerPartnerHandleFaintingCry(void);
static void PlayerPartnerHandleIntroSlide(void);
static void PlayerPartnerHandleIntroTrainerBallThrow(void);
static void PlayerPartnerHandleDrawPartyStatusSummary(void);
-static void PlayerPartnerHandleCmd49(void);
-static void PlayerPartnerHandleCmd50(void);
+static void PlayerPartnerHandleHidePartyStatusSummary(void);
+static void PlayerPartnerHandleEndBounceEffect(void);
static void PlayerPartnerHandleSpriteInvisibility(void);
static void PlayerPartnerHandleBattleAnimation(void);
static void PlayerPartnerHandleLinkStandbyMsg(void);
@@ -130,7 +108,7 @@ static void sub_81BB688(u8 taskId);
static void sub_81BB9A0(void);
static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst);
static void SetPlayerPartnerMonData(u8 monId);
-static void sub_81BD0E4(u8 bank, bool8 dontClearSubstituteBit);
+static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit);
static void DoSwitchOutAnimation(void);
static void PlayerPartnerDoMoveAnimation(void);
static void sub_81BE2C8(u8 taskId);
@@ -155,7 +133,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
PlayerPartnerHandlePause,
PlayerPartnerHandleMoveAnimation,
PlayerPartnerHandlePrintString,
- PlayerPartnerHandlePrintStringPlayerOnly,
+ PlayerPartnerHandlePrintSelectionString,
PlayerPartnerHandleChooseAction,
PlayerPartnerHandleUnknownYesNoBox,
PlayerPartnerHandleChooseMove,
@@ -181,14 +159,14 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
PlayerPartnerHandleCmd40,
PlayerPartnerHandleHitAnimation,
PlayerPartnerHandleCmd42,
- PlayerPartnerHandleEffectivenessSound,
+ PlayerPartnerHandlePlaySE,
PlayerPartnerHandlePlayFanfareOrBGM,
PlayerPartnerHandleFaintingCry,
PlayerPartnerHandleIntroSlide,
PlayerPartnerHandleIntroTrainerBallThrow,
PlayerPartnerHandleDrawPartyStatusSummary,
- PlayerPartnerHandleCmd49,
- PlayerPartnerHandleCmd50,
+ PlayerPartnerHandleHidePartyStatusSummary,
+ PlayerPartnerHandleEndBounceEffect,
PlayerPartnerHandleSpriteInvisibility,
PlayerPartnerHandleBattleAnimation,
PlayerPartnerHandleLinkStandbyMsg,
@@ -198,7 +176,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
};
// unknown unused data
-static const u8 gUnknown_08617254[] =
+static const u8 sUnknown_08617254[] =
{
0x83, 0x4d, 0xf3, 0x5f, 0x6f, 0x4f, 0xeb, 0x3e,
0x67, 0x2e, 0x10, 0x46, 0x8c, 0x3d, 0x28, 0x35,
@@ -212,42 +190,42 @@ static void nullsub_77(void)
void SetControllerToPlayerPartner(void)
{
- gBattleBankFunc[gActiveBank] = PlayerPartnerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerPartnerBufferRunCommand;
}
static void PlayerPartnerBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands))
- sPlayerPartnerBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands))
+ sPlayerPartnerBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
PlayerPartnerBufferExecCompleted();
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
PlayerPartnerBufferExecCompleted();
}
static void sub_81BAE98(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
nullsub_25(0);
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
PlayerPartnerBufferExecCompleted();
}
}
static void sub_81BAF00(void)
{
- if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 0xFF)
+ if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
PlayerPartnerBufferExecCompleted();
}
}
@@ -258,13 +236,13 @@ static void sub_81BAF48(void)
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
r6 = TRUE;
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
{
r6 = TRUE;
}
@@ -275,59 +253,59 @@ static void sub_81BAF48(void)
if (r6)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_81BAF00;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BAF00;
}
}
static void sub_81BB02C(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8
- && gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 != 1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive
+ && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 != 1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler ^ BIT_FLANK);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);
}
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleBankFunc[gActiveBank] = sub_81BAF48;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BAF48;
}
}
static void sub_81BB1D4(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].animEnded && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0)
PlayerPartnerBufferExecCompleted();
}
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
{
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
PlayerPartnerBufferExecCompleted();
}
}
@@ -347,10 +325,10 @@ static void CompleteOnInactiveTextPrinter(void)
static void Task_GiveExpToMon(u8 taskId)
{
u32 monId = (u8)(gTasks[taskId].tExpTask_monId);
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_bank;
s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;
- if (IsDoubleBattle() == TRUE || monId != gBattlePartyID[bank]) // give exp without the expbar
+ if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // give exp without the expbar
{
struct Pokemon *mon = &gPlayerParty[monId];
u16 species = GetMonData(mon, MON_DATA_SPECIES);
@@ -365,13 +343,13 @@ static void Task_GiveExpToMon(u8 taskId)
SetMonData(mon, MON_DATA_EXP, &nextLvlExp);
CalculateMonStats(mon);
gainedExp -= nextLvlExp - currExp;
- savedActiveBank = gActiveBank;
- gActiveBank = bank;
- EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp);
- gActiveBank = savedActiveBank;
+ savedActiveBank = gActiveBattler;
+ gActiveBattler = battlerId;
+ BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
+ gActiveBattler = savedActiveBank;
if (IsDoubleBattle() == TRUE
- && ((u16)(monId) == gBattlePartyID[bank] || (u16)(monId) == gBattlePartyID[bank ^ BIT_MON]))
+ && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]))
gTasks[taskId].func = sub_81BB628;
else
gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;
@@ -380,7 +358,7 @@ static void Task_GiveExpToMon(u8 taskId)
{
currExp += gainedExp;
SetMonData(mon, MON_DATA_EXP, &currExp);
- gBattleBankFunc[bank] = CompleteOnInactiveTextPrinter;
+ gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
DestroyTask(taskId);
}
}
@@ -394,7 +372,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId)
{
u8 monIndex = gTasks[taskId].tExpTask_monId;
s32 gainedExp = gTasks[taskId].tExpTask_gainedExp;
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_bank;
struct Pokemon *mon = &gPlayerParty[monIndex];
u8 level = GetMonData(mon, MON_DATA_LEVEL);
u16 species = GetMonData(mon, MON_DATA_SPECIES);
@@ -404,7 +382,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId)
exp -= currLvlExp;
expToNextLvl = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLvlExp;
- SetBattleBarStruct(bank, gHealthBoxesIds[bank], expToNextLvl, exp, -gainedExp);
+ SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp);
PlaySE(SE_EXP);
gTasks[taskId].func = sub_81BB4E4;
}
@@ -419,11 +397,11 @@ static void sub_81BB4E4(u8 taskId)
{
u8 monId = gTasks[taskId].tExpTask_monId;
s16 gainedExp = gTasks[taskId].tExpTask_gainedExp;
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_bank;
s16 r4;
- r4 = sub_8074AA0(bank, gHealthBoxesIds[bank], EXP_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[bank]);
+ r4 = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]);
if (r4 == -1)
{
u8 level;
@@ -444,17 +422,17 @@ static void sub_81BB4E4(u8 taskId)
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl);
CalculateMonStats(&gPlayerParty[monId]);
gainedExp -= expOnNextLvl - currExp;
- savedActiveBank = gActiveBank;
- gActiveBank = bank;
- EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp);
- gActiveBank = savedActiveBank;
+ savedActiveBank = gActiveBattler;
+ gActiveBattler = battlerId;
+ BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp);
+ gActiveBattler = savedActiveBank;
gTasks[taskId].func = sub_81BB628;
}
else
{
currExp += gainedExp;
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp);
- gBattleBankFunc[bank] = CompleteOnInactiveTextPrinter;
+ gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
DestroyTask(taskId);
}
}
@@ -463,30 +441,30 @@ static void sub_81BB4E4(u8 taskId)
static void sub_81BB628(u8 taskId)
{
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_bank;
u8 monIndex = gTasks[taskId].tExpTask_monId;
- if (IsDoubleBattle() == TRUE && monIndex == gBattlePartyID[bank ^ BIT_MON])
- bank ^= BIT_MON;
+ if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])
+ battlerId ^= BIT_FLANK;
- InitAndLaunchSpecialAnimation(bank, bank, bank, B_ANIM_LVL_UP);
+ InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP);
gTasks[taskId].func = sub_81BB688;
}
static void sub_81BB688(u8 taskId)
{
- u8 bank = gTasks[taskId].tExpTask_bank;
+ u8 battlerId = gTasks[taskId].tExpTask_bank;
- if (!gBattleSpritesDataPtr->healthBoxesData[bank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive)
{
u8 monIndex = gTasks[taskId].tExpTask_monId;
GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value
- if (IsDoubleBattle() == TRUE && monIndex == gBattlePartyID[bank ^ BIT_MON])
- UpdateHealthboxAttribute(gHealthBoxesIds[bank ^ BIT_MON], &gPlayerParty[monIndex], HEALTHBOX_ALL);
+ if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL);
else
- UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[monIndex], HEALTHBOX_ALL);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL);
gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter;
}
@@ -495,36 +473,36 @@ static void sub_81BB688(u8 taskId)
static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId)
{
u8 monIndex;
- u8 bank;
+ u8 battlerId;
monIndex = gTasks[taskId].tExpTask_monId;
GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value
- bank = gTasks[taskId].tExpTask_bank;
- gBattleBankFunc[bank] = CompleteOnInactiveTextPrinter;
+ battlerId = gTasks[taskId].tExpTask_bank;
+ gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter;
DestroyTask(taskId);
}
static void sub_81BB78C(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > DISPLAY_HEIGHT)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
nullsub_24(species);
- FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
PlayerPartnerBufferExecCompleted();
}
}
static void sub_81BB828(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
PlayerPartnerBufferExecCompleted();
}
}
@@ -537,39 +515,39 @@ static void CompleteOnInactiveTextPrinter2(void)
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
PlayerPartnerBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
static void sub_81BB92C(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- CopyBattleSpriteInvisibility(gActiveBank);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
+ CopyBattleSpriteInvisibility(gActiveBattler);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleBankFunc[gActiveBank] = sub_81BB9A0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BB9A0;
}
}
static void sub_81BB9A0(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
PlayerPartnerBufferExecCompleted();
}
@@ -577,66 +555,66 @@ static void sub_81BB9A0(void)
static void sub_81BB9F4(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
CreateTask(c3_0802FDF4, 10);
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
- gBattleBankFunc[gActiveBank] = sub_81BB92C;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BB92C;
}
}
static void sub_81BBAE8(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);
}
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- gBattleBankFunc[gActiveBank] = sub_81BB9F4;
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BB9F4;
}
}
static void PlayerPartnerBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = PlayerPartnerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerPartnerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
PlayerPartnerBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
PlayerPartnerBufferExecCompleted();
}
@@ -647,13 +625,13 @@ static void PlayerPartnerHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += CopyPlayerPartnerMonData(gBattlePartyID[gActiveBank], monData);
+ size += CopyPlayerPartnerMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -661,7 +639,7 @@ static void PlayerPartnerHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
PlayerPartnerBufferExecCompleted();
}
@@ -675,7 +653,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
@@ -741,7 +719,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -756,7 +734,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -981,13 +959,13 @@ static void PlayerPartnerHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetPlayerPartnerMonData(gBattlePartyID[gActiveBank]);
+ SetPlayerPartnerMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -1000,11 +978,11 @@ static void PlayerPartnerHandleSetMonData(void)
static void SetPlayerPartnerMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -1045,10 +1023,10 @@ static void SetPlayerPartnerMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -1062,167 +1040,167 @@ static void SetPlayerPartnerMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
}
static void PlayerPartnerHandleSetRawMonData(void)
{
- u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
+ u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
- dst[i] = gBattleBufferA[gActiveBank][3 + i];
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
+ dst[i] = gBattleBufferA[gActiveBattler][3 + i];
PlayerPartnerBufferExecCompleted();
}
@@ -1231,93 +1209,93 @@ static void PlayerPartnerHandleLoadMonSprite(void)
{
u16 species;
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
- sub_806A068(species, GetBankIdentity(gActiveBank));
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(gActiveBank, 2),
- GetBankSpriteDefault_Y(gActiveBank),
- sub_80A82E4(gActiveBank));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
- gBattleBankFunc[gActiveBank] = sub_81BB1D4;
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(gActiveBattler, 2),
+ GetBattlerSpriteDefault_Y(gActiveBattler),
+ sub_80A82E4(gActiveBattler));
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BB1D4;
}
static void PlayerPartnerHandleSwitchInAnim(void)
{
- ClearTemporarySpeciesSpriteData(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_81BD0E4(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattleBankFunc[gActiveBank] = sub_81BBAE8;
+ ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ sub_81BD0E4(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BBAE8;
}
-static void sub_81BD0E4(u8 bank, bool8 dontClearSubstituteBit)
+static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit)
{
u16 species;
- ClearTemporarySpeciesSpriteData(bank, dontClearSubstituteBit);
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- sub_806A068(species, GetBankIdentity(bank));
+ ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
- gBankSpriteIds[bank] = CreateSprite(
- &gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattlerSpriteIds[battlerId] = CreateSprite(
+ &gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF);
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);
}
static void PlayerPartnerHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = DoSwitchOutAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
PlayerPartnerBufferExecCompleted();
}
}
static void DoSwitchOutAnimation(void)
{
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON);
- gBattleBankFunc[gActiveBank] = sub_81BB828;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BB828;
}
break;
}
@@ -1331,9 +1309,9 @@ static void PlayerPartnerHandleDrawTrainerPic(void)
s16 xPos, yPos;
u32 trainerPicId;
- if (gPartnerTrainerId == STEVEN_PARTNER_ID)
+ if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER)
{
- trainerPicId = BACK_PIC_STEVEN;
+ trainerPicId = TRAINER_BACK_PIC_STEVEN;
xPos = 90;
yPos = (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80;
}
@@ -1345,33 +1323,33 @@ static void PlayerPartnerHandleDrawTrainerPic(void)
}
// Use back pic only if the partner is Steven
- if (gPartnerTrainerId == STEVEN_PARTNER_ID)
+ if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER)
{
- DecompressTrainerBackPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBank));
-
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ DecompressTrainerBackPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler));
+
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
}
else // otherwise use front sprite
{
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A1C0(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBank));
-
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.y = 48;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineMode = 0;
- gSprites[gBankSpriteIds[gActiveBank]].hFlip = 1;
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler));
+
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y = 48;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = 0;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1;
}
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void PlayerPartnerHandleTrainerSlide(void)
@@ -1381,34 +1359,34 @@ static void PlayerPartnerHandleTrainerSlide(void)
static void PlayerPartnerHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
- gBattleBankFunc[gActiveBank] = sub_81BAE98;
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BAE98;
}
static void PlayerPartnerHandleFaintAnimation(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER);
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 5;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00;
- gBattleBankFunc[gActiveBank] = sub_81BB78C;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BB78C;
}
}
}
@@ -1435,51 +1413,51 @@ static void PlayerPartnerHandlePause(void)
static void PlayerPartnerHandleMoveAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
-
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
{
PlayerPartnerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = PlayerPartnerDoMoveAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = PlayerPartnerDoMoveAnimation;
}
}
}
static void PlayerPartnerDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- u8 multihit = gBattleBufferA[gActiveBank][11];
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+ u8 multihit = gBattleBufferA[gActiveBattler][11];
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute
- && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute
+ && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)
{
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -1487,20 +1465,20 @@ static void PlayerPartnerDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
PlayerPartnerBufferExecCompleted();
}
break;
@@ -1513,13 +1491,13 @@ static void PlayerPartnerHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter2;
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2;
}
-static void PlayerPartnerHandlePrintStringPlayerOnly(void)
+static void PlayerPartnerHandlePrintSelectionString(void)
{
PlayerPartnerBufferExecCompleted();
}
@@ -1538,21 +1516,21 @@ static void PlayerPartnerHandleUnknownYesNoBox(void)
static void PlayerPartnerHandleChooseMove(void)
{
u8 chosenMoveId;
- struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
BattleAI_SetupAIData(0xF);
chosenMoveId = BattleAI_ChooseMoveOrAction();
- if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_x10 | MOVE_TARGET_USER))
- gBankTarget = gActiveBank;
+ if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED))
+ gBattlerTarget = gActiveBattler;
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH)
{
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- if (gAbsentBankFlags & gBitTable[gBankTarget])
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
}
- EmitTwoReturnValues(1, 10, chosenMoveId | (gBankTarget << 8));
+ BtlController_EmitTwoReturnValues(1, 10, chosenMoveId | (gBattlerTarget << 8));
PlayerPartnerBufferExecCompleted();
}
@@ -1567,22 +1545,22 @@ static void PlayerPartnerHandleChoosePokemon(void)
if (chosenMonId == 6) // just switch to the next mon
{
- u8 playerMonIdentity = GetBankByIdentity(IDENTITY_PLAYER_MON1);
- u8 selfIdentity = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ u8 playerMonIdentity = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ u8 selfIdentity = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
for (chosenMonId = 3; chosenMonId < 6; chosenMonId++)
{
if (GetMonData(&gPlayerParty[chosenMonId], MON_DATA_HP) != 0
- && chosenMonId != gBattlePartyID[playerMonIdentity]
- && chosenMonId != gBattlePartyID[selfIdentity])
+ && chosenMonId != gBattlerPartyIndexes[playerMonIdentity]
+ && chosenMonId != gBattlerPartyIndexes[selfIdentity])
{
break;
}
}
}
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = chosenMonId;
- EmitChosenMonReturnValue(1, chosenMonId, NULL);
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId;
+ BtlController_EmitChosenMonReturnValue(1, chosenMonId, NULL);
PlayerPartnerBufferExecCompleted();
}
@@ -1596,28 +1574,28 @@ static void PlayerPartnerHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void PlayerPartnerHandleExpUpdate(void)
{
- u8 monId = gBattleBufferA[gActiveBank][1];
+ u8 monId = gBattleBufferA[gActiveBattler][1];
if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_MON_LEVEL)
{
@@ -1630,12 +1608,12 @@ static void PlayerPartnerHandleExpUpdate(void)
LoadBattleBarGfx(1);
GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // unused return value
- expPointsToGive = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ expPointsToGive = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
taskId = CreateTask(Task_GiveExpToMon, 10);
gTasks[taskId].tExpTask_monId = monId;
gTasks[taskId].tExpTask_gainedExp = expPointsToGive;
- gTasks[taskId].tExpTask_bank = gActiveBank;
- gBattleBankFunc[gActiveBank] = nullsub_21;
+ gTasks[taskId].tExpTask_bank = gActiveBattler;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_21;
}
}
@@ -1646,24 +1624,24 @@ static void PlayerPartnerHandleExpUpdate(void)
static void PlayerPartnerHandleStatusIconUpdate(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 bank;
+ u8 battlerId;
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_STATUS_ICON);
- bank = gActiveBank;
- gBattleSpritesDataPtr->healthBoxesData[bank].statusAnimActive = 0;
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);
+ battlerId = gActiveBattler;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void PlayerPartnerHandleStatusAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1],
- gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24));
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],
+ gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
@@ -1720,7 +1698,7 @@ static void PlayerPartnerHandleCmd37(void)
static void PlayerPartnerHandleCmd38(void)
{
- gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBank][1];
+ gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1];
PlayerPartnerBufferExecCompleted();
}
@@ -1738,16 +1716,16 @@ static void PlayerPartnerHandleCmd40(void)
static void PlayerPartnerHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
PlayerPartnerBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -1756,29 +1734,29 @@ static void PlayerPartnerHandleCmd42(void)
PlayerPartnerBufferExecCompleted();
}
-static void PlayerPartnerHandleEffectivenessSound(void)
+static void PlayerPartnerHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
PlayerPartnerBufferExecCompleted();
}
static void PlayerPartnerHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
PlayerPartnerBufferExecCompleted();
@@ -1786,7 +1764,7 @@ static void PlayerPartnerHandlePlayFanfareOrBGM(void)
static void PlayerPartnerHandleFaintingCry(void)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry3(species, -25, 5);
PlayerPartnerBufferExecCompleted();
@@ -1794,8 +1772,8 @@ static void PlayerPartnerHandleFaintingCry(void)
static void PlayerPartnerHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
PlayerPartnerBufferExecCompleted();
}
@@ -1804,21 +1782,21 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 50;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
paletteNum = AllocSpritePalette(0xD6F9);
- if (gPartnerTrainerId == STEVEN_PARTNER_ID)
+ if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER)
{
- u8 spriteId = BACK_PIC_STEVEN;
+ u8 spriteId = TRAINER_BACK_PIC_STEVEN;
LoadCompressedPalette(gTrainerBackPicPaletteTable[spriteId].data, 0x100 + paletteNum * 16, 32);
}
else
@@ -1828,16 +1806,16 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void)
}
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;
taskId = CreateTask(sub_81BE2C8, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_77;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_77;
}
static void sub_81BE2C8(u8 taskId)
@@ -1848,91 +1826,91 @@ static void sub_81BE2C8(u8 taskId)
}
else
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBank = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
+ gActiveBattler = gTasks[taskId].data[0];
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_81BD0E4(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_81BD0E4(gActiveBattler, FALSE);
}
else
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_81BD0E4(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_81BD0E4(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_81BD0E4(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ sub_81BD0E4(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
}
- gBattleBankFunc[gActiveBank] = sub_81BB02C;
- gActiveBank = savedActiveBank;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BB02C;
+ gActiveBattler = savedActiveBank;
DestroyTask(taskId);
}
}
static void PlayerPartnerHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
PlayerPartnerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
- if (gBattleBufferA[gActiveBank][2] != 0)
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0x5D;
+ if (gBattleBufferA[gActiveBattler][2] != 0)
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D;
- gBattleBankFunc[gActiveBank] = sub_81BE498;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81BE498;
}
}
static void sub_81BE498(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5++ > 0x5C)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
PlayerPartnerBufferExecCompleted();
}
}
-static void PlayerPartnerHandleCmd49(void)
+static void PlayerPartnerHandleHidePartyStatusSummary(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
PlayerPartnerBufferExecCompleted();
}
-static void PlayerPartnerHandleCmd50(void)
+static void PlayerPartnerHandleEndBounceEffect(void)
{
PlayerPartnerBufferExecCompleted();
}
static void PlayerPartnerHandleSpriteInvisibility(void)
{
- if (IsBankSpritePresent(gActiveBank))
+ if (IsBattlerSpritePresent(gActiveBattler))
{
- gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
- CopyBattleSpriteInvisibility(gActiveBank);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];
+ CopyBattleSpriteInvisibility(gActiveBattler);
}
PlayerPartnerBufferExecCompleted();
}
static void PlayerPartnerHandleBattleAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
PlayerPartnerBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
}
@@ -1948,11 +1926,11 @@ static void PlayerPartnerHandleResetActionMoveSelection(void)
static void PlayerPartnerHandleCmd55(void)
{
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
PlayerPartnerBufferExecCompleted();
- gBattleBankFunc[gActiveBank] = sub_80587B0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80587B0;
}
static void nullsub_128(void)
diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c
index b55d644ac..affcb09ab 100644
--- a/src/battle_controller_recorded_opponent.c
+++ b/src/battle_controller_recorded_opponent.c
@@ -4,14 +4,16 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
-#include "battle_link_817C95C.h"
+#include "battle_tv.h"
#include "recorded_battle.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
-#include "songs.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
#include "sound.h"
#include "window.h"
#include "m4a.h"
@@ -23,45 +25,20 @@
#include "reshow_battle_screen.h"
#include "pokeball.h"
#include "data2.h"
+#include "item_use.h"
+#include "battle_setup.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void (*gPreBattleCallback1)(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u16 gSpecialVar_ItemId;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
-extern u16 gUnknown_020243FC;
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u16 gPartnerTrainerId;
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u8 gUnknown_020244B4[];
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
-extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct UnusedControllerStruct gUnknown_02022D0C;
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
extern u8 gUnknown_0203C7B4;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_806A068(u16, u8);
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
extern u16 sub_8068B48(void);
+extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
// this file's functions
static void RecordedOpponentHandleGetMonData(void);
@@ -81,7 +58,7 @@ static void RecordedOpponentHandleBallThrowAnim(void);
static void RecordedOpponentHandlePause(void);
static void RecordedOpponentHandleMoveAnimation(void);
static void RecordedOpponentHandlePrintString(void);
-static void RecordedOpponentHandlePrintStringPlayerOnly(void);
+static void RecordedOpponentHandlePrintSelectionString(void);
static void RecordedOpponentHandleChooseAction(void);
static void RecordedOpponentHandleUnknownYesNoBox(void);
static void RecordedOpponentHandleChooseMove(void);
@@ -107,14 +84,14 @@ static void RecordedOpponentHandleCmd39(void);
static void RecordedOpponentHandleCmd40(void);
static void RecordedOpponentHandleHitAnimation(void);
static void RecordedOpponentHandleCmd42(void);
-static void RecordedOpponentHandleEffectivenessSound(void);
+static void RecordedOpponentHandlePlaySE(void);
static void RecordedOpponentHandlePlayFanfareOrBGM(void);
static void RecordedOpponentHandleFaintingCry(void);
static void RecordedOpponentHandleIntroSlide(void);
static void RecordedOpponentHandleIntroTrainerBallThrow(void);
static void RecordedOpponentHandleDrawPartyStatusSummary(void);
-static void RecordedOpponentHandleCmd49(void);
-static void RecordedOpponentHandleCmd50(void);
+static void RecordedOpponentHandleHidePartyStatusSummary(void);
+static void RecordedOpponentHandleEndBounceEffect(void);
static void RecordedOpponentHandleSpriteInvisibility(void);
static void RecordedOpponentHandleBattleAnimation(void);
static void RecordedOpponentHandleLinkStandbyMsg(void);
@@ -127,7 +104,7 @@ static void RecordedOpponentBufferExecCompleted(void);
static void sub_8186F14(void);
static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst);
static void SetRecordedOpponentMonData(u8 monId);
-static void sub_81885D8(u8 bank, bool8 dontClearSubstituteBit);
+static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit);
static void DoSwitchOutAnimation(void);
static void RecordedOpponentDoMoveAnimation(void);
static void sub_8189548(u8 taskId);
@@ -153,7 +130,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void
RecordedOpponentHandlePause,
RecordedOpponentHandleMoveAnimation,
RecordedOpponentHandlePrintString,
- RecordedOpponentHandlePrintStringPlayerOnly,
+ RecordedOpponentHandlePrintSelectionString,
RecordedOpponentHandleChooseAction,
RecordedOpponentHandleUnknownYesNoBox,
RecordedOpponentHandleChooseMove,
@@ -179,14 +156,14 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void
RecordedOpponentHandleCmd40,
RecordedOpponentHandleHitAnimation,
RecordedOpponentHandleCmd42,
- RecordedOpponentHandleEffectivenessSound,
+ RecordedOpponentHandlePlaySE,
RecordedOpponentHandlePlayFanfareOrBGM,
RecordedOpponentHandleFaintingCry,
RecordedOpponentHandleIntroSlide,
RecordedOpponentHandleIntroTrainerBallThrow,
RecordedOpponentHandleDrawPartyStatusSummary,
- RecordedOpponentHandleCmd49,
- RecordedOpponentHandleCmd50,
+ RecordedOpponentHandleHidePartyStatusSummary,
+ RecordedOpponentHandleEndBounceEffect,
RecordedOpponentHandleSpriteInvisibility,
RecordedOpponentHandleBattleAnimation,
RecordedOpponentHandleLinkStandbyMsg,
@@ -201,48 +178,48 @@ static void nullsub_70(void)
void SetControllerToRecordedOpponent(void)
{
- gBattleBankFunc[gActiveBank] = RecordedOpponentBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentBufferRunCommand;
}
static void RecordedOpponentBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands))
- sRecordedOpponentBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands))
+ sRecordedOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
RecordedOpponentBufferExecCompleted();
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
RecordedOpponentBufferExecCompleted();
}
static void CompleteOnBankSpriteCallbackDummy2(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
RecordedOpponentBufferExecCompleted();
}
static void sub_81865C8(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- FreeTrainerFrontPicPalette(gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam);
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
+ FreeTrainerFrontPicPalette(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
RecordedOpponentBufferExecCompleted();
}
}
static void sub_8186630(void)
{
- if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 0xFF)
+ if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
RecordedOpponentBufferExecCompleted();
}
}
@@ -253,43 +230,39 @@ static void sub_8186678(void)
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].animEnded)
- {
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded)
var = TRUE;
- }
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].animEnded
- && gSprites[gBankSpriteIds[gActiveBank ^ BIT_MON]].animEnded)
- {
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded
+ && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].animEnded)
var = TRUE;
- }
}
if (var)
{
- if (GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON1)
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
return;
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1)
return;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_8186630;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186630;
}
}
@@ -298,63 +271,63 @@ static void sub_818686C(void)
bool32 r9 = FALSE;
bool32 r8 = FALSE;
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
- sub_8172EF0(gActiveBank ^ BIT_MON, &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
+ sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler ^ BIT_FLANK);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);
}
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1;
}
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x40
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x40
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40
&& !IsCryPlayingOrClearCrySongs())
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- if (GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON1)
- m4aMPlayContinue(&gMPlay_BGM);
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)
+ m4aMPlayContinue(&gMPlayInfo_BGM);
}
else
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
}
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1;
r9 = TRUE;
}
if (!IsDoubleBattle())
{
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
r8 = TRUE;
}
}
else
{
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
{
r8 = TRUE;
}
@@ -364,36 +337,36 @@ static void sub_818686C(void)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank ^ BIT_MON, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank ^ BIT_MON]], MON_DATA_SPECIES));
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES));
}
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0;
- gBattleBankFunc[gActiveBank] = sub_8186678;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186678;
}
}
static void sub_8186C48(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80)
{
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
}
else
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
RecordedOpponentBufferExecCompleted();
@@ -404,13 +377,13 @@ static void sub_8186C48(void)
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
{
@@ -420,21 +393,21 @@ static void CompleteOnHealthbarDone(void)
static void sub_8186D58(void)
{
- if (!gSprites[gBankSpriteIds[gActiveBank]].inUse)
+ if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse)
{
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
RecordedOpponentBufferExecCompleted();
}
}
static void sub_8186D9C(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- EnemyShadowCallbackToSetInvisible(gActiveBank);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ HideBattlerShadowSprite(gActiveBattler);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
RecordedOpponentBufferExecCompleted();
}
}
@@ -447,43 +420,43 @@ static void CompleteOnInactiveTextPrinter(void)
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
RecordedOpponentBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
static void sub_8186EA4(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleBankFunc[gActiveBank] = sub_8186F14;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186F14;
}
}
static void sub_8186F14(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive
&& !IsCryPlayingOrClearCrySongs())
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy
- || gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy_2)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ || gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy_2)
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
RecordedOpponentBufferExecCompleted();
}
}
@@ -491,67 +464,67 @@ static void sub_8186F14(void)
static void sub_8186F94(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
- CopyBattleSpriteInvisibility(gActiveBank);
- gBattleBankFunc[gActiveBank] = sub_8186EA4;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
+ CopyBattleSpriteInvisibility(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186EA4;
}
}
static void sub_8187084(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80)
{
- sub_8172EF0(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]);
}
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
- gBattleBankFunc[gActiveBank] = sub_8186F94;
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186F94;
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
RecordedOpponentBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
RecordedOpponentBufferExecCompleted();
}
static void RecordedOpponentBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = RecordedOpponentBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
@@ -562,13 +535,13 @@ static void RecordedOpponentHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += CopyRecordedOpponentMonData(gBattlePartyID[gActiveBank], monData);
+ size += CopyRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -576,7 +549,7 @@ static void RecordedOpponentHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
RecordedOpponentBufferExecCompleted();
}
@@ -590,7 +563,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);
@@ -656,7 +629,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -671,7 +644,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -896,13 +869,13 @@ static void RecordedOpponentHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetRecordedOpponentMonData(gBattlePartyID[gActiveBank]);
+ SetRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -915,11 +888,11 @@ static void RecordedOpponentHandleSetMonData(void)
static void SetRecordedOpponentMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -960,10 +933,10 @@ static void SetRecordedOpponentMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -977,264 +950,264 @@ static void SetRecordedOpponentMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
}
static void RecordedOpponentHandleSetRawMonData(void)
{
- u8 *dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
+ u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
- dst[i] = gBattleBufferA[gActiveBank][3 + i];
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
+ dst[i] = gBattleBufferA[gActiveBattler][3 + i];
RecordedOpponentBufferExecCompleted();
}
static void RecordedOpponentHandleLoadMonSprite(void)
{
- u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_806A068(species, GetBankIdentity(gActiveBank));
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(gActiveBank, 2),
- GetBankSpriteDefault_Y(gActiveBank),
- sub_80A82E4(gActiveBank));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(gActiveBattler, 2),
+ GetBattlerSpriteDefault_Y(gActiveBattler),
+ sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);
- SetBankEnemyShadowSpriteCallback(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+ SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
- gBattleBankFunc[gActiveBank] = sub_8186C48;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186C48;
}
static void RecordedOpponentHandleSwitchInAnim(void)
{
- gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1];
- sub_81885D8(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattleBankFunc[gActiveBank] = sub_8187084;
+ gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];
+ sub_81885D8(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8187084;
}
-static void sub_81885D8(u8 bank, bool8 dontClearSubstituteBit)
+static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit)
{
u16 species;
- ClearTemporarySpeciesSpriteData(bank, dontClearSubstituteBit);
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank);
- sub_806A068(species, GetBankIdentity(bank));
+ ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
- gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFE);
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT);
}
static void RecordedOpponentHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = DoSwitchOutAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- EnemyShadowCallbackToSetInvisible(gActiveBank);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ HideBattlerShadowSprite(gActiveBattler);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
RecordedOpponentBufferExecCompleted();
}
}
static void DoSwitchOutAnimation(void)
{
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON);
- gBattleBankFunc[gActiveBank] = sub_8186D9C;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186D9C;
}
break;
}
@@ -1247,21 +1220,21 @@ static void RecordedOpponentHandleDrawTrainerPic(void)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- if ((GetBankIdentity(gActiveBank) & BIT_MON) != 0) // second mon
+ if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon
xPos = 152;
else // first mon
xPos = 200;
if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
{
- if (gActiveBank == 1)
+ if (gActiveBattler == 1)
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A);
else
trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B);
}
else
{
- trainerPicId = PlayerGenderToFrontTrainerPicId(GetActiveBankLinkPlayerGender());
+ trainerPicId = PlayerGenderToFrontTrainerPicId(GetActiveBattlerLinkPlayerGender());
}
}
else
@@ -1277,20 +1250,20 @@ static void RecordedOpponentHandleDrawTrainerPic(void)
}
}
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
xPos,
(8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40,
- sub_80A82E4(gActiveBank));
+ sub_80A82E4(gActiveBattler));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 2;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicId;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void RecordedOpponentHandleTrainerSlide(void)
@@ -1300,31 +1273,31 @@ static void RecordedOpponentHandleTrainerSlide(void)
static void RecordedOpponentHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 280;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
- gBattleBankFunc[gActiveBank] = sub_81865C8;
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
+ gBattlerControllerFuncs[gActiveBattler] = sub_81865C8;
}
static void RecordedOpponentHandleFaintAnimation(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_OPPONENT);
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039934;
- gBattleBankFunc[gActiveBank] = sub_8186D58;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8186D58;
}
}
}
@@ -1351,51 +1324,51 @@ static void RecordedOpponentHandlePause(void)
static void RecordedOpponentHandleMoveAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
-
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
{
RecordedOpponentBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = RecordedOpponentDoMoveAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentDoMoveAnimation;
}
}
}
static void RecordedOpponentDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- u8 multihit = gBattleBufferA[gActiveBank][11];
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+ u8 multihit = gBattleBufferA[gActiveBattler][11];
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute
- && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute
+ && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)
{
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -1403,20 +1376,20 @@ static void RecordedOpponentDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
RecordedOpponentBufferExecCompleted();
}
break;
@@ -1429,20 +1402,20 @@ static void RecordedOpponentHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
}
-static void RecordedOpponentHandlePrintStringPlayerOnly(void)
+static void RecordedOpponentHandlePrintSelectionString(void)
{
RecordedOpponentBufferExecCompleted();
}
static void RecordedOpponentHandleChooseAction(void)
{
- EmitTwoReturnValues(1, RecordedBattle_ReadBankAction(gActiveBank), 0);
+ BtlController_EmitTwoReturnValues(1, RecordedBattle_GetBattlerAction(gActiveBattler), 0);
RecordedOpponentBufferExecCompleted();
}
@@ -1455,13 +1428,13 @@ static void RecordedOpponentHandleChooseMove(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
+ BtlController_EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
}
else
{
- u8 moveId = RecordedBattle_ReadBankAction(gActiveBank);
- u8 target = RecordedBattle_ReadBankAction(gActiveBank);
- EmitTwoReturnValues(1, 10, moveId | (target << 8));
+ u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler);
+ u8 target = RecordedBattle_GetBattlerAction(gActiveBattler);
+ BtlController_EmitTwoReturnValues(1, 10, moveId | (target << 8));
}
RecordedOpponentBufferExecCompleted();
@@ -1474,8 +1447,8 @@ static void RecordedOpponentHandleChooseItem(void)
static void RecordedOpponentHandleChoosePokemon(void)
{
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = RecordedBattle_ReadBankAction(gActiveBank);
- EmitChosenMonReturnValue(1, *(gBattleStruct->monToSwitchIntoId + gActiveBank), NULL);
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler);
+ BtlController_EmitChosenMonReturnValue(1, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL);
RecordedOpponentBufferExecCompleted();
}
@@ -1489,23 +1462,23 @@ static void RecordedOpponentHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void RecordedOpponentHandleExpUpdate(void)
@@ -1515,24 +1488,24 @@ static void RecordedOpponentHandleExpUpdate(void)
static void RecordedOpponentHandleStatusIconUpdate(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 bank;
+ u8 battlerId;
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], HEALTHBOX_STATUS_ICON);
- bank = gActiveBank;
- gBattleSpritesDataPtr->healthBoxesData[bank].statusAnimActive = 0;
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);
+ battlerId = gActiveBattler;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void RecordedOpponentHandleStatusAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1],
- gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24));
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],
+ gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
@@ -1589,7 +1562,7 @@ static void RecordedOpponentHandleCmd37(void)
static void RecordedOpponentHandleCmd38(void)
{
- gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBank][1];
+ gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1];
RecordedOpponentBufferExecCompleted();
}
@@ -1607,16 +1580,16 @@ static void RecordedOpponentHandleCmd40(void)
static void RecordedOpponentHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
RecordedOpponentBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -1625,29 +1598,29 @@ static void RecordedOpponentHandleCmd42(void)
RecordedOpponentBufferExecCompleted();
}
-static void RecordedOpponentHandleEffectivenessSound(void)
+static void RecordedOpponentHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
RecordedOpponentBufferExecCompleted();
}
static void RecordedOpponentHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
RecordedOpponentBufferExecCompleted();
@@ -1655,7 +1628,7 @@ static void RecordedOpponentHandlePlayFanfareOrBGM(void)
static void RecordedOpponentHandleFaintingCry(void)
{
- u16 species = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry3(species, 25, 5);
RecordedOpponentBufferExecCompleted();
@@ -1663,8 +1636,8 @@ static void RecordedOpponentHandleFaintingCry(void)
static void RecordedOpponentHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
RecordedOpponentBufferExecCompleted();
}
@@ -1673,46 +1646,46 @@ static void RecordedOpponentHandleIntroTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 280;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_818962C);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_818962C);
taskId = CreateTask(sub_8189548, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_70;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_70;
}
static void sub_8189548(u8 taskId)
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBank = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
+ gActiveBattler = gTasks[taskId].data[0];
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_81885D8(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_81885D8(gActiveBattler, FALSE);
}
else
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_81885D8(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_81885D8(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_81885D8(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_81885D8(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
}
- gBattleBankFunc[gActiveBank] = sub_818686C;
- gActiveBank = savedActiveBank;
+ gBattlerControllerFuncs[gActiveBattler] = sub_818686C;
+ gActiveBattler = savedActiveBank;
DestroyTask(taskId);
}
@@ -1725,79 +1698,79 @@ static void sub_818962C(struct Sprite *sprite)
static void RecordedOpponentHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
RecordedOpponentBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
- if (gBattleBufferA[gActiveBank][2] != 0)
+ if (gBattleBufferA[gActiveBattler][2] != 0)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E < 2)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E < 2)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E++;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E++;
return;
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1E = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E = 0;
}
}
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
- if (gBattleBufferA[gActiveBank][2] != 0)
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0x5D;
+ if (gBattleBufferA[gActiveBattler][2] != 0)
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D;
- gBattleBankFunc[gActiveBank] = sub_818975C;
+ gBattlerControllerFuncs[gActiveBattler] = sub_818975C;
}
}
static void sub_818975C(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5++ > 0x5C)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
RecordedOpponentBufferExecCompleted();
}
}
-static void RecordedOpponentHandleCmd49(void)
+static void RecordedOpponentHandleHidePartyStatusSummary(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
RecordedOpponentBufferExecCompleted();
}
-static void RecordedOpponentHandleCmd50(void)
+static void RecordedOpponentHandleEndBounceEffect(void)
{
RecordedOpponentBufferExecCompleted();
}
static void RecordedOpponentHandleSpriteInvisibility(void)
{
- if (IsBankSpritePresent(gActiveBank))
+ if (IsBattlerSpritePresent(gActiveBattler))
{
- gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
- CopyBattleSpriteInvisibility(gActiveBank);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];
+ CopyBattleSpriteInvisibility(gActiveBattler);
}
RecordedOpponentBufferExecCompleted();
}
static void RecordedOpponentHandleBattleAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
RecordedOpponentBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
}
@@ -1813,15 +1786,15 @@ static void RecordedOpponentHandleResetActionMoveSelection(void)
static void RecordedOpponentHandleCmd55(void)
{
- if (gBattleBufferA[gActiveBank][1] == BATTLE_DREW)
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
+ if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW)
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
else
- gBattleOutcome = gBattleBufferA[gActiveBank][1] ^ BATTLE_DREW;
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW;
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
RecordedOpponentBufferExecCompleted();
- gBattleBankFunc[gActiveBank] = sub_80587B0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80587B0;
}
static void nullsub_119(void)
diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c
index 78e7497a5..4f224bc67 100644
--- a/src/battle_controller_recorded_player.c
+++ b/src/battle_controller_recorded_player.c
@@ -4,13 +4,14 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
#include "recorded_battle.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "window.h"
#include "m4a.h"
@@ -22,46 +23,20 @@
#include "reshow_battle_screen.h"
#include "pokeball.h"
#include "data2.h"
+#include "item_use.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void (*gPreBattleCallback1)(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u16 gSpecialVar_ItemId;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
-extern u8 gBankInMenu;
-extern u16 gUnknown_020243FC;
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u16 gPartnerTrainerId;
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u8 gUnknown_020244B4[];
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
-extern u8 gBattleCommunication[];
+extern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT];
extern u8 gUnknown_0203C7B4;
-extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
-extern const struct BattleMove gBattleMoves[];
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_806A068(u16, u8);
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
+extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
// this file's functions
static void RecordedPlayerHandleGetMonData(void);
@@ -81,7 +56,7 @@ static void RecordedPlayerHandleBallThrowAnim(void);
static void RecordedPlayerHandlePause(void);
static void RecordedPlayerHandleMoveAnimation(void);
static void RecordedPlayerHandlePrintString(void);
-static void RecordedPlayerHandlePrintStringPlayerOnly(void);
+static void RecordedPlayerHandlePrintSelectionString(void);
static void RecordedPlayerHandleChooseAction(void);
static void RecordedPlayerHandleUnknownYesNoBox(void);
static void RecordedPlayerHandleChooseMove(void);
@@ -107,14 +82,14 @@ static void RecordedPlayerHandleCmd39(void);
static void RecordedPlayerHandleCmd40(void);
static void RecordedPlayerHandleHitAnimation(void);
static void RecordedPlayerHandleCmd42(void);
-static void RecordedPlayerHandleEffectivenessSound(void);
+static void RecordedPlayerHandlePlaySE(void);
static void RecordedPlayerHandlePlayFanfareOrBGM(void);
static void RecordedPlayerHandleFaintingCry(void);
static void RecordedPlayerHandleIntroSlide(void);
static void RecordedPlayerHandleIntroTrainerBallThrow(void);
static void RecordedPlayerHandleDrawPartyStatusSummary(void);
-static void RecordedPlayerHandleCmd49(void);
-static void RecordedPlayerHandleCmd50(void);
+static void RecordedPlayerHandleHidePartyStatusSummary(void);
+static void RecordedPlayerHandleEndBounceEffect(void);
static void RecordedPlayerHandleSpriteInvisibility(void);
static void RecordedPlayerHandleBattleAnimation(void);
static void RecordedPlayerHandleLinkStandbyMsg(void);
@@ -127,7 +102,7 @@ static void RecordedPlayerBufferExecCompleted(void);
static void sub_818A328(void);
static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst);
static void SetRecordedPlayerMonData(u8 monId);
-static void sub_818BA6C(u8 bank, bool8 dontClearSubstituteBit);
+static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit);
static void DoSwitchOutAnimation(void);
static void RecordedPlayerDoMoveAnimation(void);
static void sub_818CC24(u8 taskId);
@@ -152,7 +127,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void)
RecordedPlayerHandlePause,
RecordedPlayerHandleMoveAnimation,
RecordedPlayerHandlePrintString,
- RecordedPlayerHandlePrintStringPlayerOnly,
+ RecordedPlayerHandlePrintSelectionString,
RecordedPlayerHandleChooseAction,
RecordedPlayerHandleUnknownYesNoBox,
RecordedPlayerHandleChooseMove,
@@ -178,14 +153,14 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void)
RecordedPlayerHandleCmd40,
RecordedPlayerHandleHitAnimation,
RecordedPlayerHandleCmd42,
- RecordedPlayerHandleEffectivenessSound,
+ RecordedPlayerHandlePlaySE,
RecordedPlayerHandlePlayFanfareOrBGM,
RecordedPlayerHandleFaintingCry,
RecordedPlayerHandleIntroSlide,
RecordedPlayerHandleIntroTrainerBallThrow,
RecordedPlayerHandleDrawPartyStatusSummary,
- RecordedPlayerHandleCmd49,
- RecordedPlayerHandleCmd50,
+ RecordedPlayerHandleHidePartyStatusSummary,
+ RecordedPlayerHandleEndBounceEffect,
RecordedPlayerHandleSpriteInvisibility,
RecordedPlayerHandleBattleAnimation,
RecordedPlayerHandleLinkStandbyMsg,
@@ -200,42 +175,42 @@ static void nullsub_120(void)
void SetControllerToRecordedPlayer(void)
{
- gBattleBankFunc[gActiveBank] = RecordedPlayerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerBufferRunCommand;
}
static void RecordedPlayerBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands))
- sRecordedPlayerBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands))
+ sRecordedPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
RecordedPlayerBufferExecCompleted();
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
RecordedPlayerBufferExecCompleted();
}
static void sub_81899F0(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
nullsub_25(0);
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
RecordedPlayerBufferExecCompleted();
}
}
static void sub_8189A58(void)
{
- if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 == 0xFF)
+ if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0;
RecordedPlayerBufferExecCompleted();
}
}
@@ -244,53 +219,53 @@ static void sub_8189AA0(void)
{
bool32 r6 = FALSE;
- if (GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON1)
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT)
{
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
r6 = TRUE;
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
{
r6 = TRUE;
}
}
- if (r6 && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
+ if (r6 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
if (IsDoubleBattle())
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], gActiveBank ^ BIT_MON);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], gActiveBattler ^ BIT_FLANK);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_8189A58;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8189A58;
}
}
else
{
if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
r6 = TRUE;
}
else
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gHealthBoxesIds[gActiveBank ^ BIT_MON]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy)
{
r6 = TRUE;
}
@@ -301,8 +276,8 @@ static void sub_8189AA0(void)
if (r6)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3;
- gBattleBankFunc[gActiveBank] = sub_8189A58;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8189A58;
}
}
}
@@ -311,118 +286,118 @@ static void sub_8189D40(void)
{
bool32 r10 = FALSE;
- if (GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON1)
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);
}
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
{
- sub_8172EF0(gActiveBank ^ BIT_MON, &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]]);
+ sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);
}
}
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler ^ BIT_FLANK);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);
}
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1;
}
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x40
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x40
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40
&& !IsCryPlayingOrClearCrySongs())
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20)
{
if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- if (GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON1)
- m4aMPlayContinue(&gMPlay_BGM);
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT)
+ m4aMPlayContinue(&gMPlayInfo_BGM);
}
else
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
}
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1;
r10 = TRUE;
}
- if (r10 && gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (r10 && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]);
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x20 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x80 = 0;
- gBattleBankFunc[gActiveBank] = sub_8189AA0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8189AA0;
}
}
static void sub_818A064(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].animEnded && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0)
RecordedPlayerBufferExecCompleted();
}
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
{
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
RecordedPlayerBufferExecCompleted();
}
}
static void sub_818A114(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > DISPLAY_HEIGHT)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
nullsub_24(species);
- FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
RecordedPlayerBufferExecCompleted();
}
}
static void sub_818A1B0(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
RecordedPlayerBufferExecCompleted();
}
}
@@ -435,39 +410,39 @@ static void CompleteOnInactiveTextPrinter(void)
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
RecordedPlayerBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
static void sub_818A2B4(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
- CopyBattleSpriteInvisibility(gActiveBank);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
+ CopyBattleSpriteInvisibility(gActiveBattler);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleBankFunc[gActiveBank] = sub_818A328;
+ gBattlerControllerFuncs[gActiveBattler] = sub_818A328;
}
}
static void sub_818A328(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
RecordedPlayerBufferExecCompleted();
}
@@ -475,66 +450,66 @@ static void sub_818A328(void)
static void sub_818A37C(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
CreateTask(c3_0802FDF4, 10);
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
- gBattleBankFunc[gActiveBank] = sub_818A2B4;
+ gBattlerControllerFuncs[gActiveBattler] = sub_818A2B4;
}
}
static void sub_818A470(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]);
+ sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);
}
- if (gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
+ if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- gBattleBankFunc[gActiveBank] = sub_818A37C;
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_818A37C;
}
}
static void RecordedPlayerBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = RecordedPlayerBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
RecordedPlayerBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
RecordedPlayerBufferExecCompleted();
}
@@ -545,13 +520,13 @@ static void RecordedPlayerHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += CopyRecordedPlayerMonData(gBattlePartyID[gActiveBank], monData);
+ size += CopyRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -559,7 +534,7 @@ static void RecordedPlayerHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
RecordedPlayerBufferExecCompleted();
}
@@ -573,7 +548,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
@@ -639,7 +614,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -654,7 +629,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -879,13 +854,13 @@ static void RecordedPlayerHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetRecordedPlayerMonData(gBattlePartyID[gActiveBank]);
+ SetRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -898,11 +873,11 @@ static void RecordedPlayerHandleSetMonData(void)
static void SetRecordedPlayerMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -943,10 +918,10 @@ static void SetRecordedPlayerMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -960,167 +935,167 @@ static void SetRecordedPlayerMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
}
static void RecordedPlayerHandleSetRawMonData(void)
{
- u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1];
+ u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1];
u8 i;
- for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++)
- dst[i] = gBattleBufferA[gActiveBank][3 + i];
+ for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++)
+ dst[i] = gBattleBufferA[gActiveBattler][3 + i];
RecordedPlayerBufferExecCompleted();
}
@@ -1129,93 +1104,93 @@ static void RecordedPlayerHandleLoadMonSprite(void)
{
u16 species;
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
- sub_806A068(species, GetBankIdentity(gActiveBank));
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(gActiveBank, 2),
- GetBankSpriteDefault_Y(gActiveBank),
- sub_80A82E4(gActiveBank));
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
- gBattleBankFunc[gActiveBank] = sub_818A064;
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(gActiveBattler, 2),
+ GetBattlerSpriteDefault_Y(gActiveBattler),
+ sub_80A82E4(gActiveBattler));
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_818A064;
}
static void RecordedPlayerHandleSwitchInAnim(void)
{
- ClearTemporarySpeciesSpriteData(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_818BA6C(gActiveBank, gBattleBufferA[gActiveBank][2]);
- gBattleBankFunc[gActiveBank] = sub_818A470;
+ ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ sub_818BA6C(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
+ gBattlerControllerFuncs[gActiveBattler] = sub_818A470;
}
-static void sub_818BA6C(u8 bank, bool8 dontClearSubstituteBit)
+static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit)
{
u16 species;
- ClearTemporarySpeciesSpriteData(bank, dontClearSubstituteBit);
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- sub_806A068(species, GetBankIdentity(bank));
+ ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit);
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
- gBankSpriteIds[bank] = CreateSprite(
- &gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattlerSpriteIds[battlerId] = CreateSprite(
+ &gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF);
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);
}
static void RecordedPlayerHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = DoSwitchOutAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
RecordedPlayerBufferExecCompleted();
}
}
static void DoSwitchOutAnimation(void)
{
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON);
- gBattleBankFunc[gActiveBank] = sub_818A1B0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_818A1B0;
}
break;
}
@@ -1229,7 +1204,7 @@ static void RecordedPlayerHandleDrawTrainerPic(void)
if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- trainerPicId = GetActiveBankLinkPlayerGender();
+ trainerPicId = GetActiveBattlerLinkPlayerGender();
else
trainerPicId = gLinkPlayers[gUnknown_0203C7B4].gender;
}
@@ -1240,7 +1215,7 @@ static void RecordedPlayerHandleDrawTrainerPic(void)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- if ((GetBankIdentity(gActiveBank) & BIT_MON) != 0) // second mon
+ if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon
xPos = 90;
else // first mon
xPos = 32;
@@ -1265,31 +1240,31 @@ static void RecordedPlayerHandleDrawTrainerPic(void)
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
trainerPicId = PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender);
- DecompressTrainerFrontPic(trainerPicId, gActiveBank);
- sub_806A1C0(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBank));
-
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.y = 48;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
- gSprites[gBankSpriteIds[gActiveBank]].oam.affineMode = 0;
- gSprites[gBankSpriteIds[gActiveBank]].hFlip = 1;
+ DecompressTrainerFrontPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler));
+
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y = 48;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = 0;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1;
}
else
{
- DecompressTrainerBackPic(trainerPicId, gActiveBank);
- sub_806A12C(trainerPicId, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBank));
-
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
+ DecompressTrainerBackPic(trainerPicId, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler));
+
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
}
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void RecordedPlayerHandleTrainerSlide(void)
@@ -1299,34 +1274,34 @@ static void RecordedPlayerHandleTrainerSlide(void)
static void RecordedPlayerHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 35;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
- gBattleBankFunc[gActiveBank] = sub_81899F0;
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
+ gBattlerControllerFuncs[gActiveBattler] = sub_81899F0;
}
static void RecordedPlayerHandleFaintAnimation(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0)
{
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++;
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
PlaySE12WithPanning(SE_POKE_DEAD, -64);
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = 5;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8039C00;
- gBattleBankFunc[gActiveBank] = sub_818A114;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00;
+ gBattlerControllerFuncs[gActiveBattler] = sub_818A114;
}
}
}
@@ -1353,51 +1328,51 @@ static void RecordedPlayerHandlePause(void)
static void RecordedPlayerHandleMoveAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
-
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
{
RecordedPlayerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = RecordedPlayerDoMoveAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerDoMoveAnimation;
}
}
}
static void RecordedPlayerDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- u8 multihit = gBattleBufferA[gActiveBank][11];
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
+ u8 multihit = gBattleBufferA[gActiveBattler][11];
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute
- && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute
+ && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8)
{
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -1405,20 +1380,20 @@ static void RecordedPlayerDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
- gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
+ gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0;
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
RecordedPlayerBufferExecCompleted();
}
break;
@@ -1431,22 +1406,22 @@ static void RecordedPlayerHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
}
-static void RecordedPlayerHandlePrintStringPlayerOnly(void)
+static void RecordedPlayerHandlePrintSelectionString(void)
{
RecordedPlayerBufferExecCompleted();
}
static void ChooseActionInBattlePalace(void)
{
- if (gBattleCommunication[4] >= gNoOfAllBanks / 2)
+ if (gBattleCommunication[4] >= gBattlersCount / 2)
{
- EmitTwoReturnValues(1, RecordedBattle_ReadBankAction(gActiveBank), 0);
+ BtlController_EmitTwoReturnValues(1, RecordedBattle_GetBattlerAction(gActiveBattler), 0);
RecordedPlayerBufferExecCompleted();
}
}
@@ -1455,11 +1430,11 @@ static void RecordedPlayerHandleChooseAction(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gBattleBankFunc[gActiveBank] = ChooseActionInBattlePalace;
+ gBattlerControllerFuncs[gActiveBattler] = ChooseActionInBattlePalace;
}
else
{
- EmitTwoReturnValues(1, RecordedBattle_ReadBankAction(gActiveBank), 0);
+ BtlController_EmitTwoReturnValues(1, RecordedBattle_GetBattlerAction(gActiveBattler), 0);
RecordedPlayerBufferExecCompleted();
}
}
@@ -1473,13 +1448,13 @@ static void RecordedPlayerHandleChooseMove(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
+ BtlController_EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
}
else
{
- u8 moveId = RecordedBattle_ReadBankAction(gActiveBank);
- u8 target = RecordedBattle_ReadBankAction(gActiveBank);
- EmitTwoReturnValues(1, 10, moveId | (target << 8));
+ u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler);
+ u8 target = RecordedBattle_GetBattlerAction(gActiveBattler);
+ BtlController_EmitTwoReturnValues(1, 10, moveId | (target << 8));
}
RecordedPlayerBufferExecCompleted();
@@ -1492,8 +1467,8 @@ static void RecordedPlayerHandleChooseItem(void)
static void RecordedPlayerHandleChoosePokemon(void)
{
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = RecordedBattle_ReadBankAction(gActiveBank);
- EmitChosenMonReturnValue(1, *(gBattleStruct->monToSwitchIntoId + gActiveBank), NULL);
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler);
+ BtlController_EmitChosenMonReturnValue(1, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL);
RecordedPlayerBufferExecCompleted();
}
@@ -1507,24 +1482,24 @@ static void RecordedPlayerHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], 0, HP_CURRENT);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void RecordedPlayerHandleExpUpdate(void)
@@ -1534,24 +1509,24 @@ static void RecordedPlayerHandleExpUpdate(void)
static void RecordedPlayerHandleStatusIconUpdate(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 bank;
+ u8 battlerId;
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_STATUS_ICON);
- bank = gActiveBank;
- gBattleSpritesDataPtr->healthBoxesData[bank].statusAnimActive = 0;
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON);
+ battlerId = gActiveBattler;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
static void RecordedPlayerHandleStatusAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1],
- gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24));
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation;
+ InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1],
+ gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24));
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation;
}
}
@@ -1608,7 +1583,7 @@ static void RecordedPlayerHandleCmd37(void)
static void RecordedPlayerHandleCmd38(void)
{
- gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBank][1];
+ gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1];
RecordedPlayerBufferExecCompleted();
}
@@ -1626,16 +1601,16 @@ static void RecordedPlayerHandleCmd40(void)
static void RecordedPlayerHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
RecordedPlayerBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -1644,29 +1619,29 @@ static void RecordedPlayerHandleCmd42(void)
RecordedPlayerBufferExecCompleted();
}
-static void RecordedPlayerHandleEffectivenessSound(void)
+static void RecordedPlayerHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
RecordedPlayerBufferExecCompleted();
}
static void RecordedPlayerHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
RecordedPlayerBufferExecCompleted();
@@ -1674,7 +1649,7 @@ static void RecordedPlayerHandlePlayFanfareOrBGM(void)
static void RecordedPlayerHandleFaintingCry(void)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry3(species, -25, 5);
RecordedPlayerBufferExecCompleted();
@@ -1682,8 +1657,8 @@ static void RecordedPlayerHandleFaintingCry(void)
static void RecordedPlayerHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
RecordedPlayerBufferExecCompleted();
}
@@ -1693,35 +1668,35 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void)
u8 taskId;
u32 trainerPicId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 50;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
paletteNum = AllocSpritePalette(0xD6F9);
if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
- trainerPicId = gLinkPlayers[GetBankMultiplayerId(gActiveBank)].gender;
+ trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender;
else
trainerPicId = gSaveBlock2Ptr->playerGender;
LoadCompressedPalette(gTrainerBackPicPaletteTable[trainerPicId].data, 0x100 + paletteNum * 16, 32);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;
taskId = CreateTask(sub_818CC24, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_120;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_120;
}
static void sub_818CC24(u8 taskId)
@@ -1732,91 +1707,91 @@ static void sub_818CC24(u8 taskId)
}
else
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBank = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
+ gActiveBattler = gTasks[taskId].data[0];
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_818BA6C(gActiveBank, FALSE);
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_818BA6C(gActiveBattler, FALSE);
}
else
{
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_818BA6C(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- sub_818BA6C(gActiveBank, FALSE);
- gActiveBank ^= BIT_MON;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_818BA6C(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
+ sub_818BA6C(gActiveBattler, FALSE);
+ gActiveBattler ^= BIT_FLANK;
}
- gBattleBankFunc[gActiveBank] = sub_8189D40;
- gActiveBank = savedActiveBank;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8189D40;
+ gActiveBattler = savedActiveBank;
DestroyTask(taskId);
}
}
static void RecordedPlayerHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
RecordedPlayerBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
- if (gBattleBufferA[gActiveBank][2] != 0)
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0x5D;
+ if (gBattleBufferA[gActiveBattler][2] != 0)
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D;
- gBattleBankFunc[gActiveBank] = sub_818CDF4;
+ gBattlerControllerFuncs[gActiveBattler] = sub_818CDF4;
}
}
static void sub_818CDF4(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5++ > 0x5C)
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_5 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0;
RecordedPlayerBufferExecCompleted();
}
}
-static void RecordedPlayerHandleCmd49(void)
+static void RecordedPlayerHandleHidePartyStatusSummary(void)
{
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
RecordedPlayerBufferExecCompleted();
}
-static void RecordedPlayerHandleCmd50(void)
+static void RecordedPlayerHandleEndBounceEffect(void)
{
RecordedPlayerBufferExecCompleted();
}
static void RecordedPlayerHandleSpriteInvisibility(void)
{
- if (IsBankSpritePresent(gActiveBank))
+ if (IsBattlerSpritePresent(gActiveBattler))
{
- gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
- CopyBattleSpriteInvisibility(gActiveBank);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1];
+ CopyBattleSpriteInvisibility(gActiveBattler);
}
RecordedPlayerBufferExecCompleted();
}
static void RecordedPlayerHandleBattleAnimation(void)
{
- if (!mplay_80342A4(gActiveBank))
+ if (!mplay_80342A4(gActiveBattler))
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
RecordedPlayerBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
}
@@ -1832,11 +1807,11 @@ static void RecordedPlayerHandleResetActionMoveSelection(void)
static void RecordedPlayerHandleCmd55(void)
{
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
RecordedPlayerBufferExecCompleted();
- gBattleBankFunc[gActiveBank] = sub_80587B0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80587B0;
}
static void nullsub_121(void)
diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c
index a4f35bed1..bc97c01f9 100644
--- a/src/battle_controller_safari.c
+++ b/src/battle_controller_safari.c
@@ -4,11 +4,12 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "window.h"
#include "m4a.h"
@@ -19,33 +20,14 @@
#include "reshow_battle_screen.h"
#include "pokeball.h"
#include "data2.h"
+#include "pokeblock.h"
+#include "item_use.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern void (*gPreBattleCallback1)(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u16 gSpecialVar_ItemId;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
-extern u8 gBankInMenu;
-extern u16 gUnknown_020243FC;
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
-extern const u8 gText_SafariZoneMenu[];
-extern const u8 gText_WhatWillPkmnDo2[];
-
extern void sub_81358F4(void);
// this file's functions
@@ -66,7 +48,7 @@ static void SafariHandleBallThrowAnim(void);
static void SafariHandlePause(void);
static void SafariHandleMoveAnimation(void);
static void SafariHandlePrintString(void);
-static void SafariHandlePrintStringPlayerOnly(void);
+static void SafariHandlePrintSelectionString(void);
static void SafariHandleChooseAction(void);
static void SafariHandleUnknownYesNoBox(void);
static void SafariHandleChooseMove(void);
@@ -92,14 +74,14 @@ static void SafariHandleCmd39(void);
static void SafariHandleCmd40(void);
static void SafariHandleHitAnimation(void);
static void SafariHandleCmd42(void);
-static void SafariHandleEffectivenessSound(void);
+static void SafariHandlePlaySE(void);
static void SafariHandlePlayFanfareOrBGM(void);
static void SafariHandleFaintingCry(void);
static void SafariHandleIntroSlide(void);
static void SafariHandleIntroTrainerBallThrow(void);
static void SafariHandleDrawPartyStatusSummary(void);
-static void SafariHandleCmd49(void);
-static void SafariHandleCmd50(void);
+static void SafariHandleHidePartyStatusSummary(void);
+static void SafariHandleEndBounceEffect(void);
static void SafariHandleSpriteInvisibility(void);
static void SafariHandleBattleAnimation(void);
static void SafariHandleLinkStandbyMsg(void);
@@ -130,7 +112,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
SafariHandlePause,
SafariHandleMoveAnimation,
SafariHandlePrintString,
- SafariHandlePrintStringPlayerOnly,
+ SafariHandlePrintSelectionString,
SafariHandleChooseAction,
SafariHandleUnknownYesNoBox,
SafariHandleChooseMove,
@@ -156,14 +138,14 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
SafariHandleCmd40,
SafariHandleHitAnimation,
SafariHandleCmd42,
- SafariHandleEffectivenessSound,
+ SafariHandlePlaySE,
SafariHandlePlayFanfareOrBGM,
SafariHandleFaintingCry,
SafariHandleIntroSlide,
SafariHandleIntroTrainerBallThrow,
SafariHandleDrawPartyStatusSummary,
- SafariHandleCmd49,
- SafariHandleCmd50,
+ SafariHandleHidePartyStatusSummary,
+ SafariHandleEndBounceEffect,
SafariHandleSpriteInvisibility,
SafariHandleBattleAnimation,
SafariHandleLinkStandbyMsg,
@@ -178,15 +160,15 @@ static void nullsub_114(void)
void SetControllerToSafari(void)
{
- gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;
}
static void SafariBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sSafariBufferCommands))
- sSafariBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sSafariBufferCommands))
+ sSafariBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
SafariBufferExecCompleted();
}
@@ -198,68 +180,68 @@ static void HandleInputChooseAction(void)
{
PlaySE(SE_SELECT);
- switch (gActionSelectionCursor[gActiveBank])
+ switch (gActionSelectionCursor[gActiveBattler])
{
case 0:
- EmitTwoReturnValues(1, ACTION_SAFARI_ZONE_BALL, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_BALL, 0);
break;
case 1:
- EmitTwoReturnValues(1, ACTION_POKEBLOCK_CASE, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_POKEBLOCK, 0);
break;
case 2:
- EmitTwoReturnValues(1, ACTION_GO_NEAR, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_GO_NEAR, 0);
break;
case 3:
- EmitTwoReturnValues(1, ACTION_SAFARI_ZONE_RUN, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_RUN, 0);
break;
}
SafariBufferExecCompleted();
}
else if (gMain.newKeys & DPAD_LEFT)
{
- if (gActionSelectionCursor[gActiveBank] & 1)
+ if (gActionSelectionCursor[gActiveBattler] & 1)
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 1;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 1;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_RIGHT)
{
- if (!(gActionSelectionCursor[gActiveBank] & 1))
+ if (!(gActionSelectionCursor[gActiveBattler] & 1))
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 1;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 1;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_UP)
{
- if (gActionSelectionCursor[gActiveBank] & 2)
+ if (gActionSelectionCursor[gActiveBattler] & 2)
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 2;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 2;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_DOWN)
{
- if (!(gActionSelectionCursor[gActiveBank] & 2))
+ if (!(gActionSelectionCursor[gActiveBattler] & 2))
{
PlaySE(SE_SELECT);
- ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
- gActionSelectionCursor[gActiveBank] ^= 2;
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
+ gActionSelectionCursor[gActiveBattler] ^= 2;
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted();
}
@@ -271,7 +253,7 @@ static void CompleteOnInactiveTextPrinter(void)
static void CompleteOnHealthboxSpriteCallbackDummy(void)
{
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted();
}
@@ -287,17 +269,17 @@ static void sub_81595E4(void)
static void CompleteOnSpecialAnimDone(void)
{
- if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
SafariBufferExecCompleted();
}
-static void OpenPokeblockCase(void)
+static void SafariOpenPokeblockCase(void)
{
if (!gPaletteFade.active)
{
- gBattleBankFunc[gActiveBank] = CompleteWhenChosePokeblock;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChosePokeblock;
FreeAllWindowBuffers();
- sub_81358F4();
+ OpenPokeblockCaseInBattle();
}
}
@@ -305,36 +287,36 @@ static void CompleteWhenChosePokeblock(void)
{
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
- EmitOneReturnValue(1, gSpecialVar_ItemId);
+ BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);
SafariBufferExecCompleted();
}
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
SafariBufferExecCompleted();
}
static void SafariBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
SafariBufferExecCompleted();
}
@@ -375,18 +357,18 @@ static void SafariHandleReturnMonToBall(void)
static void SafariHandleDrawTrainerPic(void)
{
- DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBank);
- sub_806A12C(gSaveBlock2Ptr->playerGender, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(
- &gUnknown_0202499C,
+ DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(
+ &gMultiuseSpriteTemplate,
80,
(8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80,
30);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void SafariHandleTrainerSlide(void)
@@ -413,18 +395,18 @@ static void SafariHandleSuccessBallThrowAnim(void)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
- gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void SafariHandleBallThrowAnim(void)
{
- u8 ballThrowCaseId = gBattleBufferA[gActiveBank][1];
+ u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
- gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void SafariHandlePause(void)
@@ -443,15 +425,15 @@ static void SafariHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
}
-static void SafariHandlePrintStringPlayerOnly(void)
+static void SafariHandlePrintSelectionString(void)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
SafariHandlePrintString();
else
SafariBufferExecCompleted();
@@ -463,7 +445,7 @@ static void HandleChooseActionAfterDma3(void)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 160;
- gBattleBankFunc[gActiveBank] = HandleInputChooseAction;
+ gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;
}
}
@@ -471,15 +453,15 @@ static void SafariHandleChooseAction(void)
{
s32 i;
- gBattleBankFunc[gActiveBank] = HandleChooseActionAfterDma3;
- BattleHandleAddTextPrinter(gText_SafariZoneMenu, 2);
+ gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;
+ BattlePutTextOnWindow(gText_SafariZoneMenu, 2);
for (i = 0; i < 4; i++)
ActionSelectionDestroyCursorAt(i);
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo2);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 1);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 1);
}
static void SafariHandleUnknownYesNoBox(void)
@@ -496,9 +478,9 @@ static void SafariHandleChooseItem(void)
{
s32 i;
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- gBattleBankFunc[gActiveBank] = OpenPokeblockCase;
- gBankInMenu = gActiveBank;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gBattlerControllerFuncs[gActiveBattler] = SafariOpenPokeblockCase;
+ gBattlerInMenuId = gActiveBattler;
}
static void SafariHandleChoosePokemon(void)
@@ -523,7 +505,7 @@ static void SafariHandleExpUpdate(void)
static void SafariHandleStatusIconUpdate(void)
{
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_SAFARI_BALLS_TEXT);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_BALLS_TEXT);
SafariBufferExecCompleted();
}
@@ -607,29 +589,29 @@ static void SafariHandleCmd42(void)
SafariBufferExecCompleted();
}
-static void SafariHandleEffectivenessSound(void)
+static void SafariHandlePlaySE(void)
{
s8 pan;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
- PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
SafariBufferExecCompleted();
}
static void SafariHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
SafariBufferExecCompleted();
@@ -637,7 +619,7 @@ static void SafariHandlePlayFanfareOrBGM(void)
static void SafariHandleFaintingCry(void)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry1(species, 25);
SafariBufferExecCompleted();
@@ -645,17 +627,17 @@ static void SafariHandleFaintingCry(void)
static void SafariHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
SafariBufferExecCompleted();
}
static void SafariHandleIntroTrainerBallThrow(void)
{
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_SAFARI_ALL_TEXT);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
- gBattleBankFunc[gActiveBank] = CompleteOnHealthboxSpriteCallbackDummy;
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_ALL_TEXT);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthboxSpriteCallbackDummy;
}
static void SafariHandleDrawPartyStatusSummary(void)
@@ -663,12 +645,12 @@ static void SafariHandleDrawPartyStatusSummary(void)
SafariBufferExecCompleted();
}
-static void SafariHandleCmd49(void)
+static void SafariHandleHidePartyStatusSummary(void)
{
SafariBufferExecCompleted();
}
-static void SafariHandleCmd50(void)
+static void SafariHandleEndBounceEffect(void)
{
SafariBufferExecCompleted();
}
@@ -680,13 +662,13 @@ static void SafariHandleSpriteInvisibility(void)
static void SafariHandleBattleAnimation(void)
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
SafariBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
static void SafariHandleLinkStandbyMsg(void)
@@ -701,12 +683,12 @@ static void SafariHandleResetActionMoveSelection(void)
static void SafariHandleCmd55(void)
{
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
SafariBufferExecCompleted();
if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD))
- gBattleBankFunc[gActiveBank] = sub_81595E4;
+ gBattlerControllerFuncs[gActiveBattler] = sub_81595E4;
}
static void nullsub_115(void)
diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c
index 4dac1d264..960181fbc 100644
--- a/src/battle_controller_wally.c
+++ b/src/battle_controller_wally.c
@@ -4,16 +4,18 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
-#include "battle_link_817C95C.h"
+#include "constants/battle_anim.h"
+#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
#include "item.h"
-#include "items.h"
-#include "songs.h"
+#include "constants/items.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "moves.h"
+#include "constants/moves.h"
+#include "constants/trainers.h"
#include "window.h"
#include "m4a.h"
#include "palette.h"
@@ -22,51 +24,21 @@
#include "string_util.h"
#include "bg.h"
#include "reshow_battle_screen.h"
-#include "rng.h"
+#include "random.h"
#include "pokeball.h"
#include "data2.h"
#include "party_menu.h"
+#include "battle_setup.h"
+#include "item_use.h"
-extern u32 gBattleExecBuffer;
-extern u8 gActiveBank;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gAbsentBankFlags;
-extern u8 gNoOfAllBanks;
-extern bool8 gDoingBattleAnim;
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern u8 gMultiUsePlayerCursor;
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern struct MusicPlayerInfo gMPlay_BGM;
-extern u16 gPartnerTrainerId;
-extern struct SpriteTemplate gUnknown_0202499C;
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u16 gSpecialVar_ItemId;
-extern u8 gUnknown_03005D7C[BATTLE_BANKS_COUNT];
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleOutcome;
-extern u8 gNumberOfMovesToChoose;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
extern s32 gUnknown_0203CD70;
-extern u8 gBankInMenu;
-extern u32 gBattlePalaceMoveSelectionRngValue;
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
-extern u8 gUnknown_020244B4[];
-extern u16 gUnknown_020243FC;
extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
-extern const u8 gText_WhatWillWallyDo[];
-extern const u8 gText_BattleMenu[];
-
-extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
-extern void sub_806A068(u16, u8);
+extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
// this file's functions
static void WallyHandleGetMonData(void);
@@ -86,7 +58,7 @@ static void WallyHandleBallThrowAnim(void);
static void WallyHandlePause(void);
static void WallyHandleMoveAnimation(void);
static void WallyHandlePrintString(void);
-static void WallyHandlePrintStringPlayerOnly(void);
+static void WallyHandlePrintSelectionString(void);
static void WallyHandleChooseAction(void);
static void WallyHandleUnknownYesNoBox(void);
static void WallyHandleChooseMove(void);
@@ -112,14 +84,14 @@ static void WallyHandleCmd39(void);
static void WallyHandleCmd40(void);
static void WallyHandleHitAnimation(void);
static void WallyHandleCmd42(void);
-static void WallyHandleEffectivenessSound(void);
+static void WallyHandlePlaySE(void);
static void WallyHandlePlayFanfareOrBGM(void);
static void WallyHandleFaintingCry(void);
static void WallyHandleIntroSlide(void);
static void WallyHandleIntroTrainerBallThrow(void);
static void WallyHandleDrawPartyStatusSummary(void);
-static void WallyHandleCmd49(void);
-static void WallyHandleCmd50(void);
+static void WallyHandleHidePartyStatusSummary(void);
+static void WallyHandleEndBounceEffect(void);
static void WallyHandleSpriteInvisibility(void);
static void WallyHandleBattleAnimation(void);
static void WallyHandleLinkStandbyMsg(void);
@@ -155,7 +127,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
WallyHandlePause,
WallyHandleMoveAnimation,
WallyHandlePrintString,
- WallyHandlePrintStringPlayerOnly,
+ WallyHandlePrintSelectionString,
WallyHandleChooseAction,
WallyHandleUnknownYesNoBox,
WallyHandleChooseMove,
@@ -181,14 +153,14 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
WallyHandleCmd40,
WallyHandleHitAnimation,
WallyHandleCmd42,
- WallyHandleEffectivenessSound,
+ WallyHandlePlaySE,
WallyHandlePlayFanfareOrBGM,
WallyHandleFaintingCry,
WallyHandleIntroSlide,
WallyHandleIntroTrainerBallThrow,
WallyHandleDrawPartyStatusSummary,
- WallyHandleCmd49,
- WallyHandleCmd50,
+ WallyHandleHidePartyStatusSummary,
+ WallyHandleEndBounceEffect,
WallyHandleSpriteInvisibility,
WallyHandleBattleAnimation,
WallyHandleLinkStandbyMsg,
@@ -203,7 +175,7 @@ static void nullsub_117(void)
void SetControllerToWally(void)
{
- gBattleBankFunc[gActiveBank] = WallyBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = WallyBufferRunCommand;
gBattleStruct->wallyBattleState = 0;
gBattleStruct->wallyMovesState = 0;
gBattleStruct->wallyWaitFrames = 0;
@@ -212,10 +184,10 @@ void SetControllerToWally(void)
static void WallyBufferRunCommand(void)
{
- if (gBattleExecBuffer & gBitTable[gActiveBank])
+ if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
- if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sWallyBufferCommands))
- sWallyBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sWallyBufferCommands))
+ sWallyBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
WallyBufferExecCompleted();
}
@@ -232,7 +204,7 @@ static void WallyHandleActions(void)
if (--gBattleStruct->wallyWaitFrames == 0)
{
PlaySE(SE_SELECT);
- EmitTwoReturnValues(1, ACTION_USE_MOVE, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0);
WallyBufferExecCompleted();
gBattleStruct->wallyBattleState++;
gBattleStruct->wallyMovesState = 0;
@@ -243,7 +215,7 @@ static void WallyHandleActions(void)
if (--gBattleStruct->wallyWaitFrames == 0)
{
PlaySE(SE_SELECT);
- EmitTwoReturnValues(1, ACTION_USE_MOVE, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0);
WallyBufferExecCompleted();
gBattleStruct->wallyBattleState++;
gBattleStruct->wallyMovesState = 0;
@@ -253,7 +225,7 @@ static void WallyHandleActions(void)
case 3:
if (--gBattleStruct->wallyWaitFrames == 0)
{
- EmitTwoReturnValues(1, 9, 0);
+ BtlController_EmitTwoReturnValues(1, 9, 0);
WallyBufferExecCompleted();
gBattleStruct->wallyBattleState++;
gBattleStruct->wallyMovesState = 0;
@@ -274,16 +246,16 @@ static void WallyHandleActions(void)
if (--gBattleStruct->wallyWaitFrames == 0)
{
PlaySE(SE_SELECT);
- EmitTwoReturnValues(1, ACTION_USE_ITEM, 0);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);
WallyBufferExecCompleted();
}
break;
}
}
-static void CompleteOnBankSpriteCallbackDummy(void)
+static void CompleteOnBattlerSpriteCallbackDummy(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
WallyBufferExecCompleted();
}
@@ -303,7 +275,7 @@ static void OpenBagAfterPaletteFade(void)
{
if (!gPaletteFade.active)
{
- gBattleBankFunc[gActiveBank] = CompleteOnChosenItem;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnChosenItem;
nullsub_35();
FreeAllWindowBuffers();
DoWallyTutorialBagMenu();
@@ -314,37 +286,37 @@ static void CompleteOnChosenItem(void)
{
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
- EmitOneReturnValue(1, gSpecialVar_ItemId);
+ BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);
WallyBufferExecCompleted();
}
}
static void sub_816864C(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8)
- sub_8172EF0(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]);
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8)
- sub_8172EF0(gActiveBank ^ BIT_MON, &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive)
+ sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]);
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive)
+ sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]);
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x8
- && !gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x8
- && gSprites[gUnknown_03005D7C[gActiveBank]].callback == SpriteCallbackDummy
- && gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive
+ && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive
+ && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy
+ && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
{
if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank ^ BIT_MON]]);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank ^ BIT_MON], &gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank ^ BIT_MON);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank ^ BIT_MON]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler ^ BIT_FLANK);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]);
}
- DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBank]]);
- UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL);
- sub_8076918(gActiveBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL);
+ sub_8076918(gActiveBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->field_9_x1 = 0;
- gBattleBankFunc[gActiveBank] = sub_8168818;
+ gBattlerControllerFuncs[gActiveBattler] = sub_8168818;
}
}
@@ -353,23 +325,23 @@ static void sub_8168818(void)
{
bool32 r4 = FALSE;
- if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
r4 = TRUE;
- if (r4 && gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1
- && gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1)
+ if (r4 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1
+ && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].flag_x80 = 0;
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank ^ BIT_MON].field_1_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
CreateTask(c3_0802FDF4, 10);
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
WallyBufferExecCompleted();
}
@@ -377,82 +349,82 @@ static void sub_8168818(void)
static void CompleteOnHealthbarDone(void)
{
- s16 hpValue = sub_8074AA0(gActiveBank, gHealthBoxesIds[gActiveBank], HEALTH_BAR, 0);
+ s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0);
- SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
if (hpValue != -1)
{
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], hpValue, HP_CURRENT);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT);
}
else
{
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
WallyBufferExecCompleted();
}
}
static void DoHitAnimBlinkSpriteEffect(void)
{
- u8 spriteId = gBankSpriteIds[gActiveBank];
+ u8 spriteId = gBattlerSpriteIds[gActiveBattler];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = 0;
gDoingBattleAnim = FALSE;
WallyBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
static void sub_8168A20(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
WallyBufferExecCompleted();
}
}
static void CompleteOnBankSpriteCallbackDummy2(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
WallyBufferExecCompleted();
}
static void CompleteOnFinishedBattleAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
WallyBufferExecCompleted();
}
static void WallyBufferExecCompleted(void)
{
- gBattleBankFunc[gActiveBank] = WallyBufferRunCommand;
+ gBattlerControllerFuncs[gActiveBattler] = WallyBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
- gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
+ gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
- gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
WallyBufferExecCompleted();
}
@@ -463,13 +435,13 @@ static void WallyHandleGetMonData(void)
u8 monToCheck;
s32 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- size += CopyWallyMonData(gBattlePartyID[gActiveBank], monData);
+ size += CopyWallyMonData(gBattlerPartyIndexes[gActiveBattler], monData);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -477,7 +449,7 @@ static void WallyHandleGetMonData(void)
monToCheck >>= 1;
}
}
- EmitDataTransfer(1, size, monData);
+ BtlController_EmitDataTransfer(1, size, monData);
WallyBufferExecCompleted();
}
@@ -491,7 +463,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst)
u32 data32;
s32 size = 0;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
@@ -557,7 +529,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE);
+ data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE);
dst[0] = data16;
dst[1] = data16 >> 8;
size = 2;
@@ -572,7 +544,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst)
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE);
+ dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE);
size = 1;
break;
case REQUEST_OTID_BATTLE:
@@ -797,13 +769,13 @@ static void WallyHandleSetMonData(void)
u8 monToCheck;
u8 i;
- if (gBattleBufferA[gActiveBank][2] == 0)
+ if (gBattleBufferA[gActiveBattler][2] == 0)
{
- SetWallyMonData(gBattlePartyID[gActiveBank]);
+ SetWallyMonData(gBattlerPartyIndexes[gActiveBattler]);
}
else
{
- monToCheck = gBattleBufferA[gActiveBank][2];
+ monToCheck = gBattleBufferA[gActiveBattler][2];
for (i = 0; i < 6; i++)
{
if (monToCheck & 1)
@@ -816,11 +788,11 @@ static void WallyHandleSetMonData(void)
static void SetWallyMonData(u8 monId)
{
- struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
+ struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3];
s32 i;
- switch (gBattleBufferA[gActiveBank][1])
+ switch (gBattleBufferA[gActiveBattler][1])
{
case REQUEST_ALL_BATTLE:
{
@@ -861,10 +833,10 @@ static void SetWallyMonData(u8 monId)
}
break;
case REQUEST_SPECIES_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HELDITEM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
for (i = 0; i < 4; i++)
@@ -878,158 +850,158 @@ static void SetWallyMonData(u8 monId)
case REQUEST_MOVE2_BATTLE:
case REQUEST_MOVE3_BATTLE:
case REQUEST_MOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PP_DATA_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]);
break;
case REQUEST_PPMOVE1_BATTLE:
case REQUEST_PPMOVE2_BATTLE:
case REQUEST_PPMOVE3_BATTLE:
case REQUEST_PPMOVE4_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_OTID_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_EXP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_EV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_FRIENDSHIP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKERUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LOCATION_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MET_GAME_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_POKEBALL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ALL_IVS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]);
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]);
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]);
break;
case REQUEST_HP_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_IV_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_PERSONALITY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CHECKSUM_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_STATUS_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_LEVEL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MAX_HP_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_ATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_DEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPEED_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPATK_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SPDEF_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SHEEN_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_COOL_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_BEAUTY_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_CUTE_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_SMART_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_TOUGH_RIBBON_BATTLE:
- SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]);
+ SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]);
break;
}
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
}
static void WallyHandleSetRawMonData(void)
@@ -1049,48 +1021,48 @@ static void WallyHandleSwitchInAnim(void)
static void WallyHandleReturnMonToBall(void)
{
- if (gBattleBufferA[gActiveBank][1] == 0)
+ if (gBattleBufferA[gActiveBattler][1] == 0)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON);
- gBattleBankFunc[gActiveBank] = sub_8168A20;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON);
+ gBattlerControllerFuncs[gActiveBattler] = sub_8168A20;
}
else
{
- FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
- DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
- SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]);
+ FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]);
WallyBufferExecCompleted();
}
}
static void WallyHandleDrawTrainerPic(void)
{
- DecompressTrainerBackPic(BACK_PIC_WALLY, gActiveBank);
- sub_806A12C(BACK_PIC_WALLY, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
+ DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
80,
- 80 + 4 * (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords),
+ 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].coords),
30);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy;
}
static void WallyHandleTrainerSlide(void)
{
- DecompressTrainerBackPic(BACK_PIC_WALLY, gActiveBank);
- sub_806A12C(BACK_PIC_WALLY, GetBankIdentity(gActiveBank));
- gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C,
+ DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler);
+ SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler));
+ gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
80,
- 80 + 4 * (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords),
+ 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].coords),
30);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96;
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 2;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
- gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -96;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2;
}
static void WallyHandleTrainerSlideBack(void)
@@ -1112,18 +1084,18 @@ static void WallyHandleSuccessBallThrowAnim(void)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedAnimation;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation;
}
static void WallyHandleBallThrowAnim(void)
{
- u8 ballThrowCaseId = gBattleBufferA[gActiveBank][1];
+ u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE;
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedAnimation;
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation;
}
static void WallyHandlePause(void)
@@ -1133,46 +1105,46 @@ static void WallyHandlePause(void)
static void WallyHandleMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
- gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
- gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gAnimFriendship = gBattleBufferA[gActiveBank][10];
- gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
- gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ gAnimMoveTurn = gBattleBufferA[gActiveBattler][3];
+ gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBattler][10];
+ gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8);
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16];
+ gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality;
if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE
{
WallyBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
- gBattleBankFunc[gActiveBank] = WallyDoMoveAnimation;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
+ gBattlerControllerFuncs[gActiveBattler] = WallyDoMoveAnimation;
}
}
static void WallyDoMoveAnimation(void)
{
- u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
+ u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8);
- switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState)
+ switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState)
{
case 0:
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON);
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1;
break;
case 1:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
sub_805EB9C(0);
DoMoveAnim(move);
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 2;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2;
}
break;
case 2:
@@ -1180,19 +1152,19 @@ static void WallyDoMoveAnimation(void)
if (!gAnimScriptActive)
{
sub_805EB9C(1);
- if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute)
+ if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute)
{
- InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE);
+ InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE);
}
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3;
}
break;
case 3:
- if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
+ if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
{
CopyAllBattleSpritesInvisibilities();
- TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0;
+ TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
WallyBufferExecCompleted();
}
break;
@@ -1205,15 +1177,15 @@ static void WallyHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
+ stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
- gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
}
-static void WallyHandlePrintStringPlayerOnly(void)
+static void WallyHandlePrintSelectionString(void)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
WallyHandlePrintString();
else
WallyBufferExecCompleted();
@@ -1225,7 +1197,7 @@ static void HandleChooseActionAfterDma3(void)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 160;
- gBattleBankFunc[gActiveBank] = WallyHandleActions;
+ gBattlerControllerFuncs[gActiveBattler] = WallyHandleActions;
}
}
@@ -1233,15 +1205,15 @@ static void WallyHandleChooseAction(void)
{
s32 i;
- gBattleBankFunc[gActiveBank] = HandleChooseActionAfterDma3;
- BattleHandleAddTextPrinter(gText_BattleMenu, 2);
+ gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;
+ BattlePutTextOnWindow(gText_BattleMenu, 2);
for (i = 0; i < 4; i++)
ActionSelectionDestroyCursorAt(i);
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillWallyDo);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 1);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 1);
}
static void WallyHandleUnknownYesNoBox(void)
@@ -1270,7 +1242,7 @@ static void WallyHandleChooseMove(void)
if (--gBattleStruct->wallyMoveFrames == 0)
{
PlaySE(SE_SELECT);
- EmitTwoReturnValues(1, 10, 0x100);
+ BtlController_EmitTwoReturnValues(1, 10, 0x100);
WallyBufferExecCompleted();
}
break;
@@ -1279,9 +1251,9 @@ static void WallyHandleChooseMove(void)
static void WallyHandleChooseItem(void)
{
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- gBattleBankFunc[gActiveBank] = OpenBagAfterPaletteFade;
- gBankInMenu = gActiveBank;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gBattlerControllerFuncs[gActiveBattler] = OpenBagAfterPaletteFade;
+ gBattlerInMenuId = gActiveBattler;
}
static void WallyHandleChoosePokemon(void)
@@ -1299,24 +1271,24 @@ static void WallyHandleHealthBarUpdate(void)
s16 hpVal;
LoadBattleBarGfx(0);
- hpVal = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (hpVal != INSTANT_HP_BAR_DROP)
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
- u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
+ u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, curHP, hpVal);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal);
}
else
{
- u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP);
+ u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP);
- SetBattleBarStruct(gActiveBank, gHealthBoxesIds[gActiveBank], maxHP, 0, hpVal);
- UpdateHpTextInHealthbox(gHealthBoxesIds[gActiveBank], 0, HP_CURRENT);
+ SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal);
+ UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT);
}
- gBattleBankFunc[gActiveBank] = CompleteOnHealthbarDone;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone;
}
static void WallyHandleExpUpdate(void)
@@ -1401,16 +1373,16 @@ static void WallyHandleCmd40(void)
static void WallyHandleHitAnimation(void)
{
- if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE)
{
WallyBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gBankSpriteIds[gActiveBank]].data1 = 0;
- DoHitAnimHealthboxEffect(gActiveBank);
- gBattleBankFunc[gActiveBank] = DoHitAnimBlinkSpriteEffect;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0;
+ DoHitAnimHealthboxEffect(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = DoHitAnimBlinkSpriteEffect;
}
}
@@ -1419,22 +1391,22 @@ static void WallyHandleCmd42(void)
WallyBufferExecCompleted();
}
-static void WallyHandleEffectivenessSound(void)
+static void WallyHandlePlaySE(void)
{
- PlaySE(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
WallyBufferExecCompleted();
}
static void WallyHandlePlayFanfareOrBGM(void)
{
- if (gBattleBufferA[gActiveBank][3])
+ if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
- PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
- PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
WallyBufferExecCompleted();
@@ -1442,7 +1414,7 @@ static void WallyHandlePlayFanfareOrBGM(void)
static void WallyHandleFaintingCry(void)
{
- u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+ u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry1(species, 25);
WallyBufferExecCompleted();
@@ -1450,8 +1422,8 @@ static void WallyHandleFaintingCry(void)
static void WallyHandleIntroSlide(void)
{
- HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
- gUnknown_020243FC |= 1;
+ HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
+ gIntroSlideFlags |= 1;
WallyBufferExecCompleted();
}
@@ -1460,56 +1432,56 @@ static void WallyHandleIntroTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ oamt_add_pos2_onto_pos1(&gSprites[gBattlerSpriteIds[gActiveBattler]]);
- gSprites[gBankSpriteIds[gActiveBank]].data0 = 50;
- gSprites[gBankSpriteIds[gActiveBank]].data2 = -40;
- gSprites[gBankSpriteIds[gActiveBank]].data4 = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
- gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80A6EEC;
- gSprites[gBankSpriteIds[gActiveBank]].data5 = gActiveBank;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
- StoreSpriteCallbackInData6(&gSprites[gBankSpriteIds[gActiveBank]], sub_805CC00);
- StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
+ StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
paletteNum = AllocSpritePalette(0xD6F8);
- LoadCompressedPalette(gTrainerBackPicPaletteTable[BACK_PIC_WALLY].data, 0x100 + paletteNum * 16, 32);
- gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum;
+ LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_WALLY].data, 0x100 + paletteNum * 16, 32);
+ gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum;
taskId = CreateTask(sub_816AC04, 5);
- gTasks[taskId].data[0] = gActiveBank;
+ gTasks[taskId].data[0] = gActiveBattler;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1)
- gTasks[gUnknown_020244B4[gActiveBank]].func = sub_8073C30;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
+ gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->field_9_x1 = 1;
- gBattleBankFunc[gActiveBank] = nullsub_21;
+ gBattlerControllerFuncs[gActiveBattler] = nullsub_21;
}
-static void sub_816AA80(u8 bank)
+static void sub_816AA80(u8 battlerId)
{
u16 species;
- gBattleSpritesDataPtr->bankData[bank].transformSpecies = 0;
- gBattlePartyID[bank] = gBattleBufferA[bank][1];
- species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- gUnknown_03005D7C[bank] = CreateInvisibleSpriteWithCallback(sub_805D714);
- sub_806A068(species, GetBankIdentity(bank));
- gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C,
- sub_80A5C6C(bank, 2),
- GetBankSpriteDefault_Y(bank),
- sub_80A82E4(bank));
+ gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = 0;
+ gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1];
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
+ gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714);
+ SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId));
+ gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate,
+ GetBattlerSpriteCoord(battlerId, 2),
+ GetBattlerSpriteDefault_Y(battlerId),
+ sub_80A82E4(battlerId));
- gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank];
- gSprites[gUnknown_03005D7C[bank]].data2 = bank;
+ gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId];
+ gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = species;
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId;
+ gSprites[gBattlerSpriteIds[battlerId]].data[2] = species;
+ gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId;
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
- gSprites[gBankSpriteIds[bank]].invisible = TRUE;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_03005D7C[bank]].data0 = sub_80753E8(0, 0xFF);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]);
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+ gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
+ gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);
}
static void sub_816AC04(u8 taskId)
@@ -1520,37 +1492,37 @@ static void sub_816AC04(u8 taskId)
}
else
{
- u8 savedActiveBank = gActiveBank;
+ u8 savedActiveBank = gActiveBattler;
- gActiveBank = gTasks[taskId].data[0];
- gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank];
- sub_816AA80(gActiveBank);
- gBattleBankFunc[gActiveBank] = sub_816864C;
- gActiveBank = savedActiveBank;
+ gActiveBattler = gTasks[taskId].data[0];
+ gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
+ sub_816AA80(gActiveBattler);
+ gBattlerControllerFuncs[gActiveBattler] = sub_816864C;
+ gActiveBattler = savedActiveBank;
DestroyTask(taskId);
}
}
static void WallyHandleDrawPartyStatusSummary(void)
{
- if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
WallyBufferExecCompleted();
}
else
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].flag_x1 = 1;
- gUnknown_020244B4[gActiveBank] = CreatePartyStatusSummarySprites(gActiveBank, (struct HpAndStatus *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]);
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1;
+ gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]);
WallyBufferExecCompleted();
}
}
-static void WallyHandleCmd49(void)
+static void WallyHandleHidePartyStatusSummary(void)
{
WallyBufferExecCompleted();
}
-static void WallyHandleCmd50(void)
+static void WallyHandleEndBounceEffect(void)
{
WallyBufferExecCompleted();
}
@@ -1562,13 +1534,13 @@ static void WallyHandleSpriteInvisibility(void)
static void WallyHandleBattleAnimation(void)
{
- u8 animationId = gBattleBufferA[gActiveBank][1];
- u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+ u8 animationId = gBattleBufferA[gActiveBattler][1];
+ u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
- if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
+ if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
WallyBufferExecCompleted();
else
- gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
+ gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
static void WallyHandleLinkStandbyMsg(void)
@@ -1583,13 +1555,13 @@ static void WallyHandleResetActionMoveSelection(void)
static void WallyHandleCmd55(void)
{
- gBattleOutcome = gBattleBufferA[gActiveBank][1];
+ gBattleOutcome = gBattleBufferA[gActiveBattler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
WallyBufferExecCompleted();
if (!(gBattleTypeFlags & BATTLE_TYPE_WILD) && gBattleTypeFlags & BATTLE_TYPE_LINK)
- gBattleBankFunc[gActiveBank] = sub_80587B0;
+ gBattlerControllerFuncs[gActiveBattler] = sub_80587B0;
}
static void nullsub_118(void)
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index 858540a9f..4d714ca81 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -6,53 +6,25 @@
#include "battle_ai_script_commands.h"
#include "battle_anim.h"
#include "pokemon.h"
-#include "species.h"
+#include "constants/species.h"
#include "recorded_battle.h"
#include "util.h"
-#include "abilities.h"
+#include "constants/abilities.h"
#include "battle_message.h"
-extern u32 gBattleTypeFlags;
-extern u32 gBattleExecBuffer;
-extern void (*gBattleMainFunc)(void);
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT];
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern u8 gActiveBank;
-extern u8 gUnknown_0202428C;
-extern u32 gUnknown_02022FF4;
-extern u8 gUnknown_0203C7B4;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBuffersTransferData[0x100];
extern u8 gUnknown_02022D08;
extern u8 gUnknown_02022D09;
extern u8 gUnknown_02022D0A;
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u8 gEffectBank;
-extern u16 gBattleWeather;
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u16 gCurrentMove;
-extern u16 gLastUsedMove;
-extern u16 gLastUsedItem;
-extern u8 gBattleOutcome;
-extern u8 gLastUsedAbility;
-extern u8 gStringBank;
-
-extern const struct BattleMove gBattleMoves[];
+
+static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {};
extern void task00_08081A90(u8 taskId); // cable_club
-extern void sub_81B8D64(u8 bank, u8 arg1); // party_menu
+extern void sub_81B8D64(u8 battlerId, u8 arg1); // party_menu
// this file's funcionts
static void CreateTasksForSendRecvLinkBuffers(void);
-static void SetControllersVariablesInLinkBattle(void);
-static void SetControllersVariables(void);
+static void InitLinkBtlControllers(void);
+static void InitSinglePlayerBtlControllers(void);
static void SetBattlePartyIds(void);
static void Task_HandleSendLinkBuffersData(u8 taskId);
static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId);
@@ -61,10 +33,10 @@ void HandleLinkBattleSetup(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
sub_800B488();
if (!gReceivedRemoteLinkPlayers)
- sub_8009734();
+ OpenLink();
CreateTask(task00_08081A90, 0);
CreateTasksForSendRecvLinkBuffers();
}
@@ -76,16 +48,16 @@ void SetUpBattleVarsAndBirchZigzagoon(void)
gBattleMainFunc = nullsub_20;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- gBattleBankFunc[i] = nullsub_21;
- gBanksByIdentity[i] = 0xFF;
+ gBattlerControllerFuncs[i] = nullsub_21;
+ gBattlerPositions[i] = 0xFF;
gActionSelectionCursor[i] = 0;
gMoveSelectionCursor[i] = 0;
}
HandleLinkBattleSetup();
- gBattleExecBuffer = 0;
+ gBattleControllerExecFlags = 0;
ClearBattleAnimationVars();
ClearBattleMonForms();
BattleAI_HandleItemUseBeforeAISetup(0xF);
@@ -105,7 +77,6 @@ void SetUpBattleVarsAndBirchZigzagoon(void)
void sub_8032768(void)
{
s32 i;
- u8 *data;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
sub_8184DA4(1);
@@ -116,26 +87,26 @@ void sub_8032768(void)
RecordedBattle_SaveParties();
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- SetControllersVariablesInLinkBattle();
+ InitLinkBtlControllers();
else
- SetControllersVariables();
+ InitSinglePlayerBtlControllers();
SetBattlePartyIds();
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
sub_81B8D64(i, 0);
}
- for (i = 0; i < sizeof(gBattleStruct->field_1A4); i++)
- *(gBattleStruct->field_1A4 + i) = 0;
+ for (i = 0; i < sizeof(gBattleStruct->tvMovePoints); i++)
+ *((u8*)(&gBattleStruct->tvMovePoints) + i) = 0;
- for (i = 0; i < sizeof(gBattleStruct->field_204); i++)
- *(gBattleStruct->field_204 + i) = 0;
+ for (i = 0; i < sizeof(gBattleStruct->tv); i++)
+ *((u8*)(&gBattleStruct->tv) + i) = 0;
}
-static void SetControllersVariables(void)
+static void InitSinglePlayerBtlControllers(void)
{
s32 i;
@@ -145,62 +116,62 @@ static void SetControllersVariables(void)
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
{
- gBattleBankFunc[0] = SetControllerToRecordedPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToPlayerPartner;
- gBanksByIdentity[2] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToPlayerPartner;
+ gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;
- gBattleBankFunc[3] = SetControllerToOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
}
else
{
- gBattleBankFunc[0] = SetControllerToPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToPlayerPartner;
- gBanksByIdentity[2] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToPlayerPartner;
+ gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;
- gBattleBankFunc[3] = SetControllerToOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
}
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
sub_81B8D64(0, 0);
sub_81B8D64(1, 0);
sub_81B8D64(2, 1);
sub_81B8D64(3, 1);
- gBattlePartyID[0] = 0;
- gBattlePartyID[1] = 0;
- gBattlePartyID[2] = 3;
- gBattlePartyID[3] = 3;
+ gBattlerPartyIndexes[0] = 0;
+ gBattlerPartyIndexes[1] = 0;
+ gBattlerPartyIndexes[2] = 3;
+ gBattlerPartyIndexes[3] = 3;
}
else if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
gBattleMainFunc = BeginBattleIntro;
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- gBattleBankFunc[0] = SetControllerToSafari;
+ gBattlerControllerFuncs[0] = SetControllerToSafari;
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
- gBattleBankFunc[0] = SetControllerToWally;
+ gBattlerControllerFuncs[0] = SetControllerToWally;
else
- gBattleBankFunc[0] = SetControllerToPlayer;
+ gBattlerControllerFuncs[0] = SetControllerToPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gNoOfAllBanks = 2;
+ gBattlersCount = 2;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
{
@@ -210,32 +181,32 @@ static void SetControllersVariables(void)
{
gBattleMainFunc = BeginBattleIntro;
- gBattleBankFunc[0] = SetControllerToRecordedPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToRecordedOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToRecordedOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gNoOfAllBanks = 2;
+ gBattlersCount = 2;
}
else // see how the banks are switched
{
- gBattleBankFunc[1] = SetControllerToRecordedPlayer;
- gBanksByIdentity[1] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToRecordedPlayer;
+ gBattlerPositions[1] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[0] = SetControllerToRecordedOpponent;
- gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToRecordedOpponent;
+ gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT;
- gNoOfAllBanks = 2;
+ gBattlersCount = 2;
}
}
else
{
- gBattleBankFunc[0] = SetControllerToRecordedPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
}
}
}
@@ -243,19 +214,19 @@ static void SetControllersVariables(void)
{
gBattleMainFunc = BeginBattleIntro;
- gBattleBankFunc[0] = SetControllerToPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToPlayer;
- gBanksByIdentity[2] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToPlayer;
+ gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;
- gBattleBankFunc[3] = SetControllerToOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
{
@@ -263,97 +234,97 @@ static void SetControllersVariables(void)
{
gBattleMainFunc = BeginBattleIntro;
- gBattleBankFunc[0] = SetControllerToRecordedPlayer;
- gBanksByIdentity[0] = 0;
+ gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer;
+ gBattlerPositions[0] = 0;
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = 1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = 1;
- gBattleBankFunc[2] = SetControllerToRecordedPlayer;
- gBanksByIdentity[2] = 2;
+ gBattlerControllerFuncs[2] = SetControllerToRecordedPlayer;
+ gBattlerPositions[2] = 2;
- gBattleBankFunc[3] = SetControllerToOpponent;
- gBanksByIdentity[3] = 3;
+ gBattlerControllerFuncs[3] = SetControllerToOpponent;
+ gBattlerPositions[3] = 3;
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
sub_81B8D64(0, 0);
sub_81B8D64(1, 0);
sub_81B8D64(2, 1);
sub_81B8D64(3, 1);
- gBattlePartyID[0] = 0;
- gBattlePartyID[1] = 0;
- gBattlePartyID[2] = 3;
- gBattlePartyID[3] = 3;
+ gBattlerPartyIndexes[0] = 0;
+ gBattlerPartyIndexes[1] = 0;
+ gBattlerPartyIndexes[2] = 3;
+ gBattlerPartyIndexes[3] = 3;
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
u8 var; // multiplayer Id in a recorded battle?
- for (var = gUnknown_0203C7B4, i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (var = gUnknown_0203C7B4, i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- switch (gLinkPlayers[i].lp_field_18)
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- sub_81B8D64(gLinkPlayers[i].lp_field_18, 0);
+ sub_81B8D64(gLinkPlayers[i].id, 0);
break;
case 1:
case 2:
- sub_81B8D64(gLinkPlayers[i].lp_field_18, 1);
+ sub_81B8D64(gLinkPlayers[i].id, 1);
break;
}
if (i == var)
{
- gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetControllerToRecordedPlayer;
- switch (gLinkPlayers[i].lp_field_18)
+ gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer;
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON1;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0;
+ gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON2;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3;
+ gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
- else if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[var].lp_field_18 & 1))
- || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[var].lp_field_18 & 1)))
+ else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[var].id & 1))
+ || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[var].id & 1)))
{
- gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetControllerToRecordedPlayer;
- switch (gLinkPlayers[i].lp_field_18)
+ gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer;
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON1;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0;
+ gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON2;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3;
+ gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
else
{
- gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetControllerToRecordedOpponent;
- switch (gLinkPlayers[i].lp_field_18)
+ gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedOpponent;
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_OPPONENT_MON1;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0;
+ gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_OPPONENT_MON2;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3;
+ gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
@@ -361,59 +332,59 @@ static void SetControllersVariables(void)
}
else if (gBattleTypeFlags & BATTLE_TYPE_WILD)
{
- gBattleBankFunc[0] = SetControllerToRecordedPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[2] = SetControllerToRecordedPlayer;
- gBanksByIdentity[2] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToRecordedPlayer;
+ gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;
if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
- gBattleBankFunc[1] = SetControllerToRecordedOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToRecordedOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[3] = SetControllerToRecordedOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToRecordedOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
}
else
{
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[3] = SetControllerToOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
}
}
else
{
- gBattleBankFunc[1] = SetControllerToRecordedPlayer;
- gBanksByIdentity[1] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToRecordedPlayer;
+ gBattlerPositions[1] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[3] = SetControllerToRecordedPlayer;
- gBanksByIdentity[3] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToRecordedPlayer;
+ gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT;
if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
- gBattleBankFunc[0] = SetControllerToRecordedOpponent;
- gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToRecordedOpponent;
+ gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToRecordedOpponent;
- gBanksByIdentity[2] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToRecordedOpponent;
+ gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT;
}
else
{
- gBattleBankFunc[0] = SetControllerToOpponent;
- gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToOpponent;
+ gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToOpponent;
- gBanksByIdentity[2] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToOpponent;
+ gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT;
}
}
}
}
}
-static void SetControllersVariablesInLinkBattle(void)
+static void InitLinkBtlControllers(void)
{
s32 i;
u8 multiplayerId;
@@ -424,23 +395,23 @@ static void SetControllersVariablesInLinkBattle(void)
{
gBattleMainFunc = BeginBattleIntro;
- gBattleBankFunc[0] = SetControllerToPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToLinkOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToLinkOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gNoOfAllBanks = 2;
+ gBattlersCount = 2;
}
else
{
- gBattleBankFunc[1] = SetControllerToPlayer;
- gBanksByIdentity[1] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToPlayer;
+ gBattlerPositions[1] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[0] = SetControllerToLinkOpponent;
- gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToLinkOpponent;
+ gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT;
- gNoOfAllBanks = 2;
+ gBattlersCount = 2;
}
}
else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
@@ -449,35 +420,35 @@ static void SetControllersVariablesInLinkBattle(void)
{
gBattleMainFunc = BeginBattleIntro;
- gBattleBankFunc[0] = SetControllerToPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToLinkOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToLinkOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToPlayer;
- gBanksByIdentity[2] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToPlayer;
+ gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;
- gBattleBankFunc[3] = SetControllerToLinkOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToLinkOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
}
else
{
- gBattleBankFunc[1] = SetControllerToPlayer;
- gBanksByIdentity[1] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToPlayer;
+ gBattlerPositions[1] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[0] = SetControllerToLinkOpponent;
- gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToLinkOpponent;
+ gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[3] = SetControllerToPlayer;
- gBanksByIdentity[3] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToPlayer;
+ gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT;
- gBattleBankFunc[2] = SetControllerToLinkOpponent;
- gBanksByIdentity[2] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToLinkOpponent;
+ gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT;
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
@@ -486,45 +457,45 @@ static void SetControllersVariablesInLinkBattle(void)
{
gBattleMainFunc = BeginBattleIntro;
- gBattleBankFunc[0] = SetControllerToPlayer;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToPlayer;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToLinkPartner;
- gBanksByIdentity[2] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToLinkPartner;
+ gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;
- gBattleBankFunc[3] = SetControllerToOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
}
else
{
- gBattleBankFunc[0] = SetControllerToLinkPartner;
- gBanksByIdentity[0] = IDENTITY_PLAYER_MON1;
+ gBattlerControllerFuncs[0] = SetControllerToLinkPartner;
+ gBattlerPositions[0] = B_POSITION_PLAYER_LEFT;
- gBattleBankFunc[1] = SetControllerToLinkOpponent;
- gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1;
+ gBattlerControllerFuncs[1] = SetControllerToLinkOpponent;
+ gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT;
- gBattleBankFunc[2] = SetControllerToPlayer;
- gBanksByIdentity[2] = IDENTITY_PLAYER_MON2;
+ gBattlerControllerFuncs[2] = SetControllerToPlayer;
+ gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT;
- gBattleBankFunc[3] = SetControllerToLinkOpponent;
- gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2;
+ gBattlerControllerFuncs[3] = SetControllerToLinkOpponent;
+ gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
}
sub_81B8D64(0, 0);
sub_81B8D64(1, 0);
sub_81B8D64(2, 1);
sub_81B8D64(3, 1);
- gBattlePartyID[0] = 0;
- gBattlePartyID[1] = 0;
- gBattlePartyID[2] = 3;
- gBattlePartyID[3] = 3;
+ gBattlerPartyIndexes[0] = 0;
+ gBattlerPartyIndexes[1] = 0;
+ gBattlerPartyIndexes[2] = 3;
+ gBattlerPartyIndexes[3] = 3;
}
else
{
@@ -533,78 +504,78 @@ static void SetControllersVariablesInLinkBattle(void)
if (gBattleTypeFlags & BATTLE_TYPE_WILD)
gBattleMainFunc = BeginBattleIntro;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- switch (gLinkPlayers[i].lp_field_18)
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- sub_81B8D64(gLinkPlayers[i].lp_field_18, 0);
+ sub_81B8D64(gLinkPlayers[i].id, 0);
break;
case 1:
case 2:
- sub_81B8D64(gLinkPlayers[i].lp_field_18, 1);
+ sub_81B8D64(gLinkPlayers[i].id, 1);
break;
}
if (i == multiplayerId)
{
- gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetControllerToPlayer;
- switch (gLinkPlayers[i].lp_field_18)
+ gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToPlayer;
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 0;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0;
+ gBattlerPositions[gLinkPlayers[i].id] = 0;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 2;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3;
+ gBattlerPositions[gLinkPlayers[i].id] = 2;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 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)))
+ if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1))
+ || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1)))
{
- gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetControllerToLinkPartner;
- switch (gLinkPlayers[i].lp_field_18)
+ gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkPartner;
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 0;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0;
+ gBattlerPositions[gLinkPlayers[i].id] = 0;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 2;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3;
+ gBattlerPositions[gLinkPlayers[i].id] = 2;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
else
{
- gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetControllerToLinkOpponent;
- switch (gLinkPlayers[i].lp_field_18)
+ gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkOpponent;
+ switch (gLinkPlayers[i].id)
{
case 0:
case 3:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 1;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0;
+ gBattlerPositions[gLinkPlayers[i].id] = 1;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 0;
break;
case 1:
case 2:
- gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 3;
- gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3;
+ gBattlerPositions[gLinkPlayers[i].id] = 3;
+ gBattlerPartyIndexes[gLinkPlayers[i].id] = 3;
break;
}
}
}
}
- gNoOfAllBanks = 4;
+ gBattlersCount = 4;
}
}
@@ -614,20 +585,20 @@ static void SetBattlePartyIds(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- for (j = 0; j < 6; j++)
+ for (j = 0; j < PARTY_SIZE; j++)
{
if (i < 2)
{
- if (GET_BANK_SIDE2(i) == SIDE_PLAYER)
+ if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER)
{
if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
&& GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
&& GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0)
{
- gBattlePartyID[i] = j;
+ gBattlerPartyIndexes[i] = j;
break;
}
}
@@ -638,22 +609,22 @@ static void SetBattlePartyIds(void)
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
&& GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0)
{
- gBattlePartyID[i] = j;
+ gBattlerPartyIndexes[i] = j;
break;
}
}
}
else
{
- if (GET_BANK_SIDE2(i) == SIDE_PLAYER)
+ if (GET_BATTLER_SIDE2(i) == B_SIDE_PLAYER)
{
if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
&& GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != SPECIES_NONE // 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
- && gBattlePartyID[i - 2] != j)
+ && gBattlerPartyIndexes[i - 2] != j)
{
- gBattlePartyID[i] = j;
+ gBattlerPartyIndexes[i] = j;
break;
}
}
@@ -663,9 +634,9 @@ static void SetBattlePartyIds(void)
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
&& GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0
- && gBattlePartyID[i - 2] != j)
+ && gBattlerPartyIndexes[i - 2] != j)
{
- gBattlePartyID[i] = j;
+ gBattlerPartyIndexes[i] = j;
break;
}
}
@@ -674,7 +645,7 @@ static void SetBattlePartyIds(void)
}
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
- gBattlePartyID[1] = 0, gBattlePartyID[3] = 3;
+ gBattlerPartyIndexes[1] = 0, gBattlerPartyIndexes[3] = 3;
}
}
@@ -693,14 +664,14 @@ static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size)
case 0:
for (i = 0; i < size; i++)
{
- gBattleBufferA[gActiveBank][i] = *data;
+ gBattleBufferA[gActiveBattler][i] = *data;
data++;
}
break;
case 1:
for (i = 0; i < size; i++)
{
- gBattleBufferB[gActiveBank][i] = *data;
+ gBattleBufferB[gActiveBattler][i] = *data;
data++;
}
break;
@@ -751,13 +722,13 @@ void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data)
gTasks[gUnknown_02022D08].data[14] = 0;
}
gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_BUFFER_ID] = bufferId;
- gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ACTIVE_BANK] = gActiveBank;
- gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ATTACKER] = gBankAttacker;
- gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_TARGET] = gBankTarget;
+ gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ACTIVE_BANK] = gActiveBattler;
+ gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ATTACKER] = gBattlerAttacker;
+ gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_TARGET] = gBattlerTarget;
gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_SIZE_LO] = alignedSize;
gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_SIZE_HI] = (alignedSize & 0x0000FF00) >> 8;
- gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ABSENT_BANK_FLAGS] = gAbsentBankFlags;
- gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_EFFECT_BANK] = gEffectBank;
+ gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ABSENT_BANK_FLAGS] = gAbsentBattlerFlags;
+ gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_EFFECT_BANK] = gEffectBattler;
for (i = 0; i < size; i++)
gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_DATA + i] = data[i];
@@ -782,7 +753,7 @@ static void Task_HandleSendLinkBuffersData(u8 taskId)
gTasks[taskId].data[11]++;
break;
case 2:
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
{
gTasks[taskId].data[11]++;
}
@@ -793,9 +764,9 @@ static void Task_HandleSendLinkBuffersData(u8 taskId)
else
var = (gBattleTypeFlags & BATTLE_TYPE_MULTI) ? 4 : 2;
- if (sub_800ABAC() >= var)
+ if (GetLinkPlayerCount_2() >= var)
{
- if (sub_800ABBC())
+ if (IsLinkMaster())
{
sub_800A620();
gTasks[taskId].data[11]++;
@@ -895,7 +866,7 @@ void sub_8033648(void)
static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId)
{
u16 blockSize;
- u8 bank;
+ u8 battlerId;
u8 var;
if (gTasks[taskId].data[15] != gTasks[taskId].data[14])
@@ -906,32 +877,32 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId)
gTasks[taskId].data[12] = 0;
gTasks[taskId].data[15] = 0;
}
- bank = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ACTIVE_BANK];
+ battlerId = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ACTIVE_BANK];
blockSize = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8);
switch (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 0])
{
case 0:
- if (gBattleExecBuffer & gBitTable[bank])
+ if (gBattleControllerExecFlags & gBitTable[battlerId])
return;
- memcpy(gBattleBufferA[bank], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 8], blockSize);
- sub_803F850(bank);
+ memcpy(gBattleBufferA[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 8], blockSize);
+ sub_803F850(battlerId);
if (!(gBattleTypeFlags & BATTLE_TYPE_WILD))
{
- gBankAttacker = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 2];
- gBankTarget = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 3];
- gAbsentBankFlags = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 6];
- gEffectBank = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 7];
+ gBattlerAttacker = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 2];
+ gBattlerTarget = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 3];
+ gAbsentBattlerFlags = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 6];
+ gEffectBattler = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 7];
}
break;
case 1:
- memcpy(gBattleBufferB[bank], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 8], blockSize);
+ memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 8], blockSize);
break;
case 2:
var = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA];
- gBattleExecBuffer &= ~(gBitTable[bank] << (var * 4));
+ gBattleControllerExecFlags &= ~(gBitTable[battlerId] << (var * 4));
break;
}
@@ -939,197 +910,197 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId)
}
}
-void EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck)
+void BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck)
{
- gBattleBuffersTransferData[0] = CONTROLLER_GETMONDATA;
- gBattleBuffersTransferData[1] = requestId;
- gBattleBuffersTransferData[2] = monToCheck;
- gBattleBuffersTransferData[3] = 0;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_GETMONDATA;
+ sBattleBuffersTransferData[1] = requestId;
+ sBattleBuffersTransferData[2] = monToCheck;
+ sBattleBuffersTransferData[3] = 0;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes)
+void BtlController_EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes)
{
- gBattleBuffersTransferData[0] = CONTROLLER_GETRAWMONDATA;
- gBattleBuffersTransferData[1] = monId;
- gBattleBuffersTransferData[2] = bytes;
- gBattleBuffersTransferData[3] = 0;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_GETRAWMONDATA;
+ sBattleBuffersTransferData[1] = monId;
+ sBattleBuffersTransferData[2] = bytes;
+ sBattleBuffersTransferData[3] = 0;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data)
+void BtlController_EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_SETMONDATA;
- gBattleBuffersTransferData[1] = requestId;
- gBattleBuffersTransferData[2] = monToCheck;
+ sBattleBuffersTransferData[0] = CONTROLLER_SETMONDATA;
+ sBattleBuffersTransferData[1] = requestId;
+ sBattleBuffersTransferData[2] = monToCheck;
for (i = 0; i < bytes; i++)
- gBattleBuffersTransferData[3 + i] = *(u8*)(data++);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 3 + bytes);
+ sBattleBuffersTransferData[3 + i] = *(u8*)(data++);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 3 + bytes);
}
-void EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data)
+void BtlController_EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_SETRAWMONDATA;
- gBattleBuffersTransferData[1] = monId;
- gBattleBuffersTransferData[2] = bytes;
+ sBattleBuffersTransferData[0] = CONTROLLER_SETRAWMONDATA;
+ sBattleBuffersTransferData[1] = monId;
+ sBattleBuffersTransferData[2] = bytes;
for (i = 0; i < bytes; i++)
- gBattleBuffersTransferData[3 + i] = *(u8*)(data++);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, bytes + 3);
+ sBattleBuffersTransferData[3 + i] = *(u8*)(data++);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, bytes + 3);
}
-void EmitLoadMonSprite(u8 bufferId)
+void BtlController_EmitLoadMonSprite(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_LOADMONSPRITE;
- gBattleBuffersTransferData[1] = CONTROLLER_LOADMONSPRITE;
- gBattleBuffersTransferData[2] = CONTROLLER_LOADMONSPRITE;
- gBattleBuffersTransferData[3] = CONTROLLER_LOADMONSPRITE;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_LOADMONSPRITE;
+ sBattleBuffersTransferData[1] = CONTROLLER_LOADMONSPRITE;
+ sBattleBuffersTransferData[2] = CONTROLLER_LOADMONSPRITE;
+ sBattleBuffersTransferData[3] = CONTROLLER_LOADMONSPRITE;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit)
+void BtlController_EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit)
{
- gBattleBuffersTransferData[0] = CONTROLLER_SWITCHINANIM;
- gBattleBuffersTransferData[1] = partyId;
- gBattleBuffersTransferData[2] = dontClearSubstituteBit;
- gBattleBuffersTransferData[3] = 5;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_SWITCHINANIM;
+ sBattleBuffersTransferData[1] = partyId;
+ sBattleBuffersTransferData[2] = dontClearSubstituteBit;
+ sBattleBuffersTransferData[3] = 5;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitReturnMonToBall(u8 bufferId, u8 arg1)
+void BtlController_EmitReturnMonToBall(u8 bufferId, u8 arg1)
{
- gBattleBuffersTransferData[0] = CONTROLLER_RETURNMONTOBALL;
- gBattleBuffersTransferData[1] = arg1;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
+ sBattleBuffersTransferData[0] = CONTROLLER_RETURNMONTOBALL;
+ sBattleBuffersTransferData[1] = arg1;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);
}
-void EmitDrawTrainerPic(u8 bufferId)
+void BtlController_EmitDrawTrainerPic(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_DRAWTRAINERPIC;
- gBattleBuffersTransferData[1] = CONTROLLER_DRAWTRAINERPIC;
- gBattleBuffersTransferData[2] = CONTROLLER_DRAWTRAINERPIC;
- gBattleBuffersTransferData[3] = CONTROLLER_DRAWTRAINERPIC;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_DRAWTRAINERPIC;
+ sBattleBuffersTransferData[1] = CONTROLLER_DRAWTRAINERPIC;
+ sBattleBuffersTransferData[2] = CONTROLLER_DRAWTRAINERPIC;
+ sBattleBuffersTransferData[3] = CONTROLLER_DRAWTRAINERPIC;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitTrainerSlide(u8 bufferId)
+void BtlController_EmitTrainerSlide(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDE;
- gBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDE;
- gBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDE;
- gBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDE;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDE;
+ sBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDE;
+ sBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDE;
+ sBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDE;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitTrainerSlideBack(u8 bufferId)
+void BtlController_EmitTrainerSlideBack(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDEBACK;
- gBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDEBACK;
- gBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDEBACK;
- gBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDEBACK;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDEBACK;
+ sBattleBuffersTransferData[1] = CONTROLLER_TRAINERSLIDEBACK;
+ sBattleBuffersTransferData[2] = CONTROLLER_TRAINERSLIDEBACK;
+ sBattleBuffersTransferData[3] = CONTROLLER_TRAINERSLIDEBACK;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitFaintAnimation(u8 bufferId)
+void BtlController_EmitFaintAnimation(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_FAINTANIMATION;
- gBattleBuffersTransferData[1] = CONTROLLER_FAINTANIMATION;
- gBattleBuffersTransferData[2] = CONTROLLER_FAINTANIMATION;
- gBattleBuffersTransferData[3] = CONTROLLER_FAINTANIMATION;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_FAINTANIMATION;
+ sBattleBuffersTransferData[1] = CONTROLLER_FAINTANIMATION;
+ sBattleBuffersTransferData[2] = CONTROLLER_FAINTANIMATION;
+ sBattleBuffersTransferData[3] = CONTROLLER_FAINTANIMATION;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitPaletteFade(u8 bufferId)
+void BtlController_EmitPaletteFade(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_PALETTEFADE;
- gBattleBuffersTransferData[1] = CONTROLLER_PALETTEFADE;
- gBattleBuffersTransferData[2] = CONTROLLER_PALETTEFADE;
- gBattleBuffersTransferData[3] = CONTROLLER_PALETTEFADE;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_PALETTEFADE;
+ sBattleBuffersTransferData[1] = CONTROLLER_PALETTEFADE;
+ sBattleBuffersTransferData[2] = CONTROLLER_PALETTEFADE;
+ sBattleBuffersTransferData[3] = CONTROLLER_PALETTEFADE;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitSuccessBallThrowAnim(u8 bufferId)
+void BtlController_EmitSuccessBallThrowAnim(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_SUCCESSBALLTHROWANIM;
- gBattleBuffersTransferData[1] = CONTROLLER_SUCCESSBALLTHROWANIM;
- gBattleBuffersTransferData[2] = CONTROLLER_SUCCESSBALLTHROWANIM;
- gBattleBuffersTransferData[3] = CONTROLLER_SUCCESSBALLTHROWANIM;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_SUCCESSBALLTHROWANIM;
+ sBattleBuffersTransferData[1] = CONTROLLER_SUCCESSBALLTHROWANIM;
+ sBattleBuffersTransferData[2] = CONTROLLER_SUCCESSBALLTHROWANIM;
+ sBattleBuffersTransferData[3] = CONTROLLER_SUCCESSBALLTHROWANIM;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitBallThrowAnim(u8 bufferId, u8 caseId)
+void BtlController_EmitBallThrowAnim(u8 bufferId, u8 caseId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_BALLTHROWANIM;
- gBattleBuffersTransferData[1] = caseId;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
+ sBattleBuffersTransferData[0] = CONTROLLER_BALLTHROWANIM;
+ sBattleBuffersTransferData[1] = caseId;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);
}
-void EmitPause(u8 bufferId, u8 toWait, void *data)
+void BtlController_EmitPause(u8 bufferId, u8 toWait, void *data)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_PAUSE;
- gBattleBuffersTransferData[1] = toWait;
+ sBattleBuffersTransferData[0] = CONTROLLER_PAUSE;
+ sBattleBuffersTransferData[1] = toWait;
for (i = 0; i < toWait * 3; i++)
- gBattleBuffersTransferData[2 + i] = *(u8*)(data++);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, toWait * 3 + 2);
-}
-
-void EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr, u8 multihit)
-{
- gBattleBuffersTransferData[0] = CONTROLLER_MOVEANIMATION;
- gBattleBuffersTransferData[1] = move;
- gBattleBuffersTransferData[2] = (move & 0xFF00) >> 8;
- gBattleBuffersTransferData[3] = turnOfMove;
- gBattleBuffersTransferData[4] = movePower;
- gBattleBuffersTransferData[5] = (movePower & 0xFF00) >> 8;
- gBattleBuffersTransferData[6] = dmg;
- gBattleBuffersTransferData[7] = (dmg & 0x0000FF00) >> 8;
- gBattleBuffersTransferData[8] = (dmg & 0x00FF0000) >> 16;
- gBattleBuffersTransferData[9] = (dmg & 0xFF000000) >> 24;
- gBattleBuffersTransferData[10] = friendship;
- gBattleBuffersTransferData[11] = multihit;
+ sBattleBuffersTransferData[2 + i] = *(u8*)(data++);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, toWait * 3 + 2);
+}
+
+void BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr, u8 multihit)
+{
+ sBattleBuffersTransferData[0] = CONTROLLER_MOVEANIMATION;
+ sBattleBuffersTransferData[1] = move;
+ sBattleBuffersTransferData[2] = (move & 0xFF00) >> 8;
+ sBattleBuffersTransferData[3] = turnOfMove;
+ sBattleBuffersTransferData[4] = movePower;
+ sBattleBuffersTransferData[5] = (movePower & 0xFF00) >> 8;
+ sBattleBuffersTransferData[6] = dmg;
+ sBattleBuffersTransferData[7] = (dmg & 0x0000FF00) >> 8;
+ sBattleBuffersTransferData[8] = (dmg & 0x00FF0000) >> 16;
+ sBattleBuffersTransferData[9] = (dmg & 0xFF000000) >> 24;
+ sBattleBuffersTransferData[10] = friendship;
+ sBattleBuffersTransferData[11] = multihit;
if (WEATHER_HAS_EFFECT2)
{
- gBattleBuffersTransferData[12] = gBattleWeather;
- gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8;
+ sBattleBuffersTransferData[12] = gBattleWeather;
+ sBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8;
}
else
{
- gBattleBuffersTransferData[12] = 0;
- gBattleBuffersTransferData[13] = 0;
+ sBattleBuffersTransferData[12] = 0;
+ sBattleBuffersTransferData[13] = 0;
}
- gBattleBuffersTransferData[14] = 0;
- gBattleBuffersTransferData[15] = 0;
- memcpy(&gBattleBuffersTransferData[16], disableStructPtr, sizeof(struct DisableStruct));
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 16 + sizeof(struct DisableStruct));
+ sBattleBuffersTransferData[14] = 0;
+ sBattleBuffersTransferData[15] = 0;
+ memcpy(&sBattleBuffersTransferData[16], disableStructPtr, sizeof(struct DisableStruct));
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 16 + sizeof(struct DisableStruct));
}
-void EmitPrintString(u8 bufferId, u16 stringID)
+void BtlController_EmitPrintString(u8 bufferId, u16 stringID)
{
s32 i;
- struct StringInfoBattle* stringInfo;
+ struct BattleMsgData* stringInfo;
- gBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRING;
- gBattleBuffersTransferData[1] = gBattleOutcome;
- gBattleBuffersTransferData[2] = stringID;
- gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8;
+ sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRING;
+ sBattleBuffersTransferData[1] = gBattleOutcome;
+ sBattleBuffersTransferData[2] = stringID;
+ sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8;
- stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]);
+ stringInfo = (struct BattleMsgData*)(&sBattleBuffersTransferData[4]);
stringInfo->currentMove = gCurrentMove;
- stringInfo->lastMove = gLastUsedMove;
+ stringInfo->originallyUsedMove = gChosenMove;
stringInfo->lastItem = gLastUsedItem;
stringInfo->lastAbility = gLastUsedAbility;
- stringInfo->scrActive = gBattleScripting.bank;
+ stringInfo->scrActive = gBattleScripting.battler;
stringInfo->unk1605E = gBattleStruct->field_52;
stringInfo->hpScale = gBattleStruct->hpScale;
- stringInfo->StringBank = gStringBank;
+ stringInfo->itemEffectBattler = gPotentialItemEffectBattler;
stringInfo->moveType = gBattleMoves[gCurrentMove].type;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
stringInfo->abilities[i] = gBattleMons[i].ability;
for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)
{
@@ -1137,28 +1108,28 @@ void EmitPrintString(u8 bufferId, u16 stringID)
stringInfo->textBuffs[1][i] = gBattleTextBuff2[i];
stringInfo->textBuffs[2][i] = gBattleTextBuff3[i];
}
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4);
}
-void EmitPrintStringPlayerOnly(u8 bufferId, u16 stringID)
+void BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringID)
{
s32 i;
- struct StringInfoBattle* stringInfo;
+ struct BattleMsgData *stringInfo;
- gBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRINGPLAYERONLY;
- gBattleBuffersTransferData[1] = CONTROLLER_PRINTSTRINGPLAYERONLY;
- gBattleBuffersTransferData[2] = stringID;
- gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8;
+ sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRINGPLAYERONLY;
+ sBattleBuffersTransferData[1] = CONTROLLER_PRINTSTRINGPLAYERONLY;
+ sBattleBuffersTransferData[2] = stringID;
+ sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8;
- stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]);
+ stringInfo = (struct BattleMsgData*)(&sBattleBuffersTransferData[4]);
stringInfo->currentMove = gCurrentMove;
- stringInfo->lastMove = gLastUsedMove;
+ stringInfo->originallyUsedMove = gChosenMove;
stringInfo->lastItem = gLastUsedItem;
stringInfo->lastAbility = gLastUsedAbility;
- stringInfo->scrActive = gBattleScripting.bank;
+ stringInfo->scrActive = gBattleScripting.battler;
stringInfo->unk1605E = gBattleStruct->field_52;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
stringInfo->abilities[i] = gBattleMons[i].ability;
for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)
{
@@ -1166,386 +1137,386 @@ void EmitPrintStringPlayerOnly(u8 bufferId, u16 stringID)
stringInfo->textBuffs[1][i] = gBattleTextBuff2[i];
stringInfo->textBuffs[2][i] = gBattleTextBuff3[i];
}
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4);
}
-void EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2)
+void BtlController_EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2)
{
- gBattleBuffersTransferData[0] = CONTROLLER_CHOOSEACTION;
- gBattleBuffersTransferData[1] = arg1;
- gBattleBuffersTransferData[2] = arg2;
- gBattleBuffersTransferData[3] = (arg2 & 0xFF00) >> 8;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEACTION;
+ sBattleBuffersTransferData[1] = arg1;
+ sBattleBuffersTransferData[2] = arg2;
+ sBattleBuffersTransferData[3] = (arg2 & 0xFF00) >> 8;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitUnknownYesNoBox(u8 bufferId)
+void BtlController_EmitUnknownYesNoBox(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_UNKNOWNYESNOBOX;
- gBattleBuffersTransferData[1] = CONTROLLER_UNKNOWNYESNOBOX;
- gBattleBuffersTransferData[2] = CONTROLLER_UNKNOWNYESNOBOX;
- gBattleBuffersTransferData[3] = CONTROLLER_UNKNOWNYESNOBOX;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_UNKNOWNYESNOBOX;
+ sBattleBuffersTransferData[1] = CONTROLLER_UNKNOWNYESNOBOX;
+ sBattleBuffersTransferData[2] = CONTROLLER_UNKNOWNYESNOBOX;
+ sBattleBuffersTransferData[3] = CONTROLLER_UNKNOWNYESNOBOX;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData)
+void BtlController_EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_CHOOSEMOVE;
- gBattleBuffersTransferData[1] = isDoubleBattle;
- gBattleBuffersTransferData[2] = NoPpNumber;
- gBattleBuffersTransferData[3] = 0;
+ sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEMOVE;
+ sBattleBuffersTransferData[1] = isDoubleBattle;
+ sBattleBuffersTransferData[2] = NoPpNumber;
+ sBattleBuffersTransferData[3] = 0;
for (i = 0; i < sizeof(*movePpData); i++)
- gBattleBuffersTransferData[4 + i] = *((u8*)(movePpData) + i);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(*movePpData) + 4);
+ sBattleBuffersTransferData[4 + i] = *((u8*)(movePpData) + i);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(*movePpData) + 4);
}
-void EmitChooseItem(u8 bufferId, u8 *arg1)
+void BtlController_EmitChooseItem(u8 bufferId, u8 *arg1)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_OPENBAG;
+ sBattleBuffersTransferData[0] = CONTROLLER_OPENBAG;
for (i = 0; i < 3; i++)
- gBattleBuffersTransferData[1 + i] = arg1[i];
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[1 + i] = arg1[i];
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8* arg4)
+void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8 *arg4)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_CHOOSEPOKEMON;
- gBattleBuffersTransferData[1] = caseId;
- gBattleBuffersTransferData[2] = arg2;
- gBattleBuffersTransferData[3] = abilityId;
+ sBattleBuffersTransferData[0] = CONTROLLER_CHOOSEPOKEMON;
+ sBattleBuffersTransferData[1] = caseId;
+ sBattleBuffersTransferData[2] = arg2;
+ sBattleBuffersTransferData[3] = abilityId;
for (i = 0; i < 3; i++)
- gBattleBuffersTransferData[4 + i] = arg4[i];
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 8); // but only 7 bytes were written
+ sBattleBuffersTransferData[4 + i] = arg4[i];
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 8); // Only 7 bytes were written.
}
-void EmitCmd23(u8 bufferId)
+void BtlController_EmitCmd23(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_23;
- gBattleBuffersTransferData[1] = CONTROLLER_23;
- gBattleBuffersTransferData[2] = CONTROLLER_23;
- gBattleBuffersTransferData[3] = CONTROLLER_23;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_23;
+ sBattleBuffersTransferData[1] = CONTROLLER_23;
+ sBattleBuffersTransferData[2] = CONTROLLER_23;
+ sBattleBuffersTransferData[3] = CONTROLLER_23;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
// why is the argument u16 if it's being cast to s16 anyway?
-void EmitHealthBarUpdate(u8 bufferId, u16 hpValue)
+void BtlController_EmitHealthBarUpdate(u8 bufferId, u16 hpValue)
{
- gBattleBuffersTransferData[0] = CONTROLLER_HEALTHBARUPDATE;
- gBattleBuffersTransferData[1] = 0;
- gBattleBuffersTransferData[2] = (s16)hpValue;
- gBattleBuffersTransferData[3] = ((s16)hpValue & 0xFF00) >> 8;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_HEALTHBARUPDATE;
+ sBattleBuffersTransferData[1] = 0;
+ sBattleBuffersTransferData[2] = (s16)hpValue;
+ sBattleBuffersTransferData[3] = ((s16)hpValue & 0xFF00) >> 8;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
// why is the argument u16 if it's being cast to s16 anyway?
-void EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints)
+void BtlController_EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints)
{
- gBattleBuffersTransferData[0] = CONTROLLER_EXPUPDATE;
- gBattleBuffersTransferData[1] = partyId;
- gBattleBuffersTransferData[2] = (s16)expPoints;
- gBattleBuffersTransferData[3] = ((s16)expPoints & 0xFF00) >> 8;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_EXPUPDATE;
+ sBattleBuffersTransferData[1] = partyId;
+ sBattleBuffersTransferData[2] = (s16)expPoints;
+ sBattleBuffersTransferData[3] = ((s16)expPoints & 0xFF00) >> 8;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2)
+void BtlController_EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2)
{
- gBattleBuffersTransferData[0] = CONTROLLER_STATUSICONUPDATE;
- gBattleBuffersTransferData[1] = status1;
- gBattleBuffersTransferData[2] = (status1 & 0x0000FF00) >> 8;
- gBattleBuffersTransferData[3] = (status1 & 0x00FF0000) >> 16;
- gBattleBuffersTransferData[4] = (status1 & 0xFF000000) >> 24;
- gBattleBuffersTransferData[5] = status2;
- gBattleBuffersTransferData[6] = (status2 & 0x0000FF00) >> 8;
- gBattleBuffersTransferData[7] = (status2 & 0x00FF0000) >> 16;
- gBattleBuffersTransferData[8] = (status2 & 0xFF000000) >> 24;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 9);
+ sBattleBuffersTransferData[0] = CONTROLLER_STATUSICONUPDATE;
+ sBattleBuffersTransferData[1] = status1;
+ sBattleBuffersTransferData[2] = (status1 & 0x0000FF00) >> 8;
+ sBattleBuffersTransferData[3] = (status1 & 0x00FF0000) >> 16;
+ sBattleBuffersTransferData[4] = (status1 & 0xFF000000) >> 24;
+ sBattleBuffersTransferData[5] = status2;
+ sBattleBuffersTransferData[6] = (status2 & 0x0000FF00) >> 8;
+ sBattleBuffersTransferData[7] = (status2 & 0x00FF0000) >> 16;
+ sBattleBuffersTransferData[8] = (status2 & 0xFF000000) >> 24;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 9);
}
-void EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status)
+void BtlController_EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status)
{
- gBattleBuffersTransferData[0] = CONTROLLER_STATUSANIMATION;
- gBattleBuffersTransferData[1] = status2;
- gBattleBuffersTransferData[2] = status;
- gBattleBuffersTransferData[3] = (status & 0x0000FF00) >> 8;
- gBattleBuffersTransferData[4] = (status & 0x00FF0000) >> 16;
- gBattleBuffersTransferData[5] = (status & 0xFF000000) >> 24;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 6);
+ sBattleBuffersTransferData[0] = CONTROLLER_STATUSANIMATION;
+ sBattleBuffersTransferData[1] = status2;
+ sBattleBuffersTransferData[2] = status;
+ sBattleBuffersTransferData[3] = (status & 0x0000FF00) >> 8;
+ sBattleBuffersTransferData[4] = (status & 0x00FF0000) >> 16;
+ sBattleBuffersTransferData[5] = (status & 0xFF000000) >> 24;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 6);
}
-void EmitStatusXor(u8 bufferId, u8 b)
+void BtlController_EmitStatusXor(u8 bufferId, u8 b)
{
- gBattleBuffersTransferData[0] = CONTROLLER_STATUSXOR;
- gBattleBuffersTransferData[1] = b;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
+ sBattleBuffersTransferData[0] = CONTROLLER_STATUSXOR;
+ sBattleBuffersTransferData[1] = b;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);
}
-void EmitDataTransfer(u8 bufferId, u16 size, void *data)
+void BtlController_EmitDataTransfer(u8 bufferId, u16 size, void *data)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_DATATRANSFER;
- gBattleBuffersTransferData[1] = CONTROLLER_DATATRANSFER;
- gBattleBuffersTransferData[2] = size;
- gBattleBuffersTransferData[3] = (size & 0xFF00) >> 8;
+ sBattleBuffersTransferData[0] = CONTROLLER_DATATRANSFER;
+ sBattleBuffersTransferData[1] = CONTROLLER_DATATRANSFER;
+ sBattleBuffersTransferData[2] = size;
+ sBattleBuffersTransferData[3] = (size & 0xFF00) >> 8;
for (i = 0; i < size; i++)
- gBattleBuffersTransferData[4 + i] = *(u8*)(data++);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, size + 4);
+ sBattleBuffersTransferData[4 + i] = *(u8*)(data++);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 4);
}
-void EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data)
+void BtlController_EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_DMA3TRANSFER;
- gBattleBuffersTransferData[1] = (u32)(dst);
- gBattleBuffersTransferData[2] = ((u32)(dst) & 0x0000FF00) >> 8;
- gBattleBuffersTransferData[3] = ((u32)(dst) & 0x00FF0000) >> 16;
- gBattleBuffersTransferData[4] = ((u32)(dst) & 0xFF000000) >> 24;
- gBattleBuffersTransferData[5] = size;
- gBattleBuffersTransferData[6] = (size & 0xFF00) >> 8;
+ sBattleBuffersTransferData[0] = CONTROLLER_DMA3TRANSFER;
+ sBattleBuffersTransferData[1] = (u32)(dst);
+ sBattleBuffersTransferData[2] = ((u32)(dst) & 0x0000FF00) >> 8;
+ sBattleBuffersTransferData[3] = ((u32)(dst) & 0x00FF0000) >> 16;
+ sBattleBuffersTransferData[4] = ((u32)(dst) & 0xFF000000) >> 24;
+ sBattleBuffersTransferData[5] = size;
+ sBattleBuffersTransferData[6] = (size & 0xFF00) >> 8;
for (i = 0; i < size; i++)
- gBattleBuffersTransferData[7 + i] = *(u8*)(data++);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, size + 7);
+ sBattleBuffersTransferData[7 + i] = *(u8*)(data++);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 7);
}
-void EmitPlayBGM(u8 bufferId, u16 songId, void *unusedDumbDataParameter)
+void BtlController_EmitPlayBGM(u8 bufferId, u16 songId, void *unusedDumbDataParameter)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_31;
- gBattleBuffersTransferData[1] = songId;
- gBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;
+ sBattleBuffersTransferData[0] = CONTROLLER_31;
+ sBattleBuffersTransferData[1] = songId;
+ sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;
for (i = 0; i < songId; i++) // ????
- gBattleBuffersTransferData[3 + i] = *(u8*)(unusedDumbDataParameter++);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, songId + 3);
+ sBattleBuffersTransferData[3 + i] = *(u8*)(unusedDumbDataParameter++);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, songId + 3);
}
-void EmitCmd32(u8 bufferId, u16 size, void *data)
+void BtlController_EmitCmd32(u8 bufferId, u16 size, void *data)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_32;
- gBattleBuffersTransferData[1] = size;
- gBattleBuffersTransferData[2] = (size & 0xFF00) >> 8;
+ sBattleBuffersTransferData[0] = CONTROLLER_32;
+ sBattleBuffersTransferData[1] = size;
+ sBattleBuffersTransferData[2] = (size & 0xFF00) >> 8;
for (i = 0; i < size; i++)
- gBattleBuffersTransferData[3 + i] = *(u8*)(data++);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, size + 3);
+ sBattleBuffersTransferData[3 + i] = *(u8*)(data++);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, size + 3);
}
-void EmitTwoReturnValues(u8 bufferId, u8 arg1, u16 arg2)
+void BtlController_EmitTwoReturnValues(u8 bufferId, u8 arg1, u16 arg2)
{
- gBattleBuffersTransferData[0] = CONTROLLER_TWORETURNVALUES;
- gBattleBuffersTransferData[1] = arg1;
- gBattleBuffersTransferData[2] = arg2;
- gBattleBuffersTransferData[3] = (arg2 & 0xFF00) >> 8;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_TWORETURNVALUES;
+ sBattleBuffersTransferData[1] = arg1;
+ sBattleBuffersTransferData[2] = arg2;
+ sBattleBuffersTransferData[3] = (arg2 & 0xFF00) >> 8;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitChosenMonReturnValue(u8 bufferId, u8 b, u8 *c)
+void BtlController_EmitChosenMonReturnValue(u8 bufferId, u8 b, u8 *c)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_CHOSENMONRETURNVALUE;
- gBattleBuffersTransferData[1] = b;
+ sBattleBuffersTransferData[0] = CONTROLLER_CHOSENMONRETURNVALUE;
+ sBattleBuffersTransferData[1] = b;
for (i = 0; i < 3; i++)
- gBattleBuffersTransferData[2 + i] = c[i];
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 5);
+ sBattleBuffersTransferData[2 + i] = c[i];
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 5);
}
-void EmitOneReturnValue(u8 bufferId, u16 arg1)
+void BtlController_EmitOneReturnValue(u8 bufferId, u16 arg1)
{
- gBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE;
- gBattleBuffersTransferData[1] = arg1;
- gBattleBuffersTransferData[2] = (arg1 & 0xFF00) >> 8;
- gBattleBuffersTransferData[3] = 0;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE;
+ sBattleBuffersTransferData[1] = arg1;
+ sBattleBuffersTransferData[2] = (arg1 & 0xFF00) >> 8;
+ sBattleBuffersTransferData[3] = 0;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitOneReturnValue_Duplicate(u8 bufferId, u16 b)
+void BtlController_EmitOneReturnValue_Duplicate(u8 bufferId, u16 b)
{
- gBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE_DUPLICATE;
- gBattleBuffersTransferData[1] = b;
- gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8;
- gBattleBuffersTransferData[3] = 0;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_ONERETURNVALUE_DUPLICATE;
+ sBattleBuffersTransferData[1] = b;
+ sBattleBuffersTransferData[2] = (b & 0xFF00) >> 8;
+ sBattleBuffersTransferData[3] = 0;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitCmd37(u8 bufferId)
+void BtlController_EmitCmd37(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_37;
- gBattleBuffersTransferData[1] = CONTROLLER_37;
- gBattleBuffersTransferData[2] = CONTROLLER_37;
- gBattleBuffersTransferData[3] = CONTROLLER_37;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_37;
+ sBattleBuffersTransferData[1] = CONTROLLER_37;
+ sBattleBuffersTransferData[2] = CONTROLLER_37;
+ sBattleBuffersTransferData[3] = CONTROLLER_37;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitCmd38(u8 bufferId, u8 b)
+void BtlController_EmitCmd38(u8 bufferId, u8 b)
{
- gBattleBuffersTransferData[0] = CONTROLLER_38;
- gBattleBuffersTransferData[1] = b;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
+ sBattleBuffersTransferData[0] = CONTROLLER_38;
+ sBattleBuffersTransferData[1] = b;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);
}
-void EmitCmd39(u8 bufferId)
+void BtlController_EmitCmd39(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_39;
- gBattleBuffersTransferData[1] = CONTROLLER_39;
- gBattleBuffersTransferData[2] = CONTROLLER_39;
- gBattleBuffersTransferData[3] = CONTROLLER_39;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_39;
+ sBattleBuffersTransferData[1] = CONTROLLER_39;
+ sBattleBuffersTransferData[2] = CONTROLLER_39;
+ sBattleBuffersTransferData[3] = CONTROLLER_39;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitCmd40(u8 bufferId)
+void BtlController_EmitCmd40(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_40;
- gBattleBuffersTransferData[1] = CONTROLLER_40;
- gBattleBuffersTransferData[2] = CONTROLLER_40;
- gBattleBuffersTransferData[3] = CONTROLLER_40;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_40;
+ sBattleBuffersTransferData[1] = CONTROLLER_40;
+ sBattleBuffersTransferData[2] = CONTROLLER_40;
+ sBattleBuffersTransferData[3] = CONTROLLER_40;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitHitAnimation(u8 bufferId)
+void BtlController_EmitHitAnimation(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_HITANIMATION;
- gBattleBuffersTransferData[1] = CONTROLLER_HITANIMATION;
- gBattleBuffersTransferData[2] = CONTROLLER_HITANIMATION;
- gBattleBuffersTransferData[3] = CONTROLLER_HITANIMATION;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_HITANIMATION;
+ sBattleBuffersTransferData[1] = CONTROLLER_HITANIMATION;
+ sBattleBuffersTransferData[2] = CONTROLLER_HITANIMATION;
+ sBattleBuffersTransferData[3] = CONTROLLER_HITANIMATION;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitCmd42(u8 bufferId)
+void BtlController_EmitCmd42(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_42;
- gBattleBuffersTransferData[1] = CONTROLLER_42;
- gBattleBuffersTransferData[2] = CONTROLLER_42;
- gBattleBuffersTransferData[3] = CONTROLLER_42;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_42;
+ sBattleBuffersTransferData[1] = CONTROLLER_42;
+ sBattleBuffersTransferData[2] = CONTROLLER_42;
+ sBattleBuffersTransferData[3] = CONTROLLER_42;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitEffectivenessSound(u8 bufferId, u16 songId)
+void BtlController_EmitPlaySE(u8 bufferId, u16 songId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_EFFECTIVENESSSOUND;
- gBattleBuffersTransferData[1] = songId;
- gBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;
- gBattleBuffersTransferData[3] = 0;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_EFFECTIVENESSSOUND;
+ sBattleBuffersTransferData[1] = songId;
+ sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;
+ sBattleBuffersTransferData[3] = 0;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitPlayFanfareOrBGM(u8 bufferId, u16 songId, bool8 playBGM)
+void BtlController_EmitPlayFanfareOrBGM(u8 bufferId, u16 songId, bool8 playBGM)
{
- gBattleBuffersTransferData[0] = CONTROLLER_PLAYFANFAREORBGM;
- gBattleBuffersTransferData[1] = songId;
- gBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;
- gBattleBuffersTransferData[3] = playBGM;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_PLAYFANFAREORBGM;
+ sBattleBuffersTransferData[1] = songId;
+ sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8;
+ sBattleBuffersTransferData[3] = playBGM;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitFaintingCry(u8 bufferId)
+void BtlController_EmitFaintingCry(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_FAINTINGCRY;
- gBattleBuffersTransferData[1] = CONTROLLER_FAINTINGCRY;
- gBattleBuffersTransferData[2] = CONTROLLER_FAINTINGCRY;
- gBattleBuffersTransferData[3] = CONTROLLER_FAINTINGCRY;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_FAINTINGCRY;
+ sBattleBuffersTransferData[1] = CONTROLLER_FAINTINGCRY;
+ sBattleBuffersTransferData[2] = CONTROLLER_FAINTINGCRY;
+ sBattleBuffersTransferData[3] = CONTROLLER_FAINTINGCRY;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitIntroSlide(u8 bufferId, u8 terrainId)
+void BtlController_EmitIntroSlide(u8 bufferId, u8 terrainId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_INTROSLIDE;
- gBattleBuffersTransferData[1] = terrainId;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
+ sBattleBuffersTransferData[0] = CONTROLLER_INTROSLIDE;
+ sBattleBuffersTransferData[1] = terrainId;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);
}
-void EmitIntroTrainerBallThrow(u8 bufferId)
+void BtlController_EmitIntroTrainerBallThrow(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_INTROTRAINERBALLTHROW;
- gBattleBuffersTransferData[1] = CONTROLLER_INTROTRAINERBALLTHROW;
- gBattleBuffersTransferData[2] = CONTROLLER_INTROTRAINERBALLTHROW;
- gBattleBuffersTransferData[3] = CONTROLLER_INTROTRAINERBALLTHROW;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_INTROTRAINERBALLTHROW;
+ sBattleBuffersTransferData[1] = CONTROLLER_INTROTRAINERBALLTHROW;
+ sBattleBuffersTransferData[2] = CONTROLLER_INTROTRAINERBALLTHROW;
+ sBattleBuffersTransferData[3] = CONTROLLER_INTROTRAINERBALLTHROW;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 arg2)
+void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 arg2)
{
s32 i;
- gBattleBuffersTransferData[0] = CONTROLLER_DRAWPARTYSTATUSSUMMARY;
- gBattleBuffersTransferData[1] = arg2 & 0x7F;
- gBattleBuffersTransferData[2] = (arg2 & 0x80) >> 7;
- gBattleBuffersTransferData[3] = CONTROLLER_DRAWPARTYSTATUSSUMMARY;
- for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * 6); i++)
- gBattleBuffersTransferData[4 + i] = *(i + (u8*)(hpAndStatus));
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(struct HpAndStatus) * 6 + 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_DRAWPARTYSTATUSSUMMARY;
+ sBattleBuffersTransferData[1] = arg2 & 0x7F;
+ sBattleBuffersTransferData[2] = (arg2 & 0x80) >> 7;
+ sBattleBuffersTransferData[3] = CONTROLLER_DRAWPARTYSTATUSSUMMARY;
+ for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * PARTY_SIZE); i++)
+ sBattleBuffersTransferData[4 + i] = *(i + (u8*)(hpAndStatus));
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct HpAndStatus) * PARTY_SIZE + 4);
}
-void EmitCmd49(u8 bufferId)
+void BtlController_EmitHidePartyStatusSummary(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_49;
- gBattleBuffersTransferData[1] = CONTROLLER_49;
- gBattleBuffersTransferData[2] = CONTROLLER_49;
- gBattleBuffersTransferData[3] = CONTROLLER_49;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;
+ sBattleBuffersTransferData[1] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;
+ sBattleBuffersTransferData[2] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;
+ sBattleBuffersTransferData[3] = CONTROLLER_HIDEPARTYSTATUSSUMMARY;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitCmd50(u8 bufferId)
+void BtlController_EmitEndBounceEffect(u8 bufferId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_50;
- gBattleBuffersTransferData[1] = CONTROLLER_50;
- gBattleBuffersTransferData[2] = CONTROLLER_50;
- gBattleBuffersTransferData[3] = CONTROLLER_50;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_ENDBOUNCE;
+ sBattleBuffersTransferData[1] = CONTROLLER_ENDBOUNCE;
+ sBattleBuffersTransferData[2] = CONTROLLER_ENDBOUNCE;
+ sBattleBuffersTransferData[3] = CONTROLLER_ENDBOUNCE;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible)
+void BtlController_EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible)
{
- gBattleBuffersTransferData[0] = CONTROLLER_SPRITEINVISIBILITY;
- gBattleBuffersTransferData[1] = isInvisible;
- gBattleBuffersTransferData[2] = CONTROLLER_SPRITEINVISIBILITY;
- gBattleBuffersTransferData[3] = CONTROLLER_SPRITEINVISIBILITY;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_SPRITEINVISIBILITY;
+ sBattleBuffersTransferData[1] = isInvisible;
+ sBattleBuffersTransferData[2] = CONTROLLER_SPRITEINVISIBILITY;
+ sBattleBuffersTransferData[3] = CONTROLLER_SPRITEINVISIBILITY;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument)
+void BtlController_EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument)
{
- gBattleBuffersTransferData[0] = CONTROLLER_BATTLEANIMATION;
- gBattleBuffersTransferData[1] = animationId;
- gBattleBuffersTransferData[2] = argument;
- gBattleBuffersTransferData[3] = (argument & 0xFF00) >> 8;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4);
+ sBattleBuffersTransferData[0] = CONTROLLER_BATTLEANIMATION;
+ sBattleBuffersTransferData[1] = animationId;
+ sBattleBuffersTransferData[2] = argument;
+ sBattleBuffersTransferData[3] = (argument & 0xFF00) >> 8;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4);
}
-void EmitLinkStandbyMsg(u8 bufferId, u8 arg1, bool32 arg2)
+void BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 arg1, bool32 arg2)
{
bool8 arg2_ = arg2;
- gBattleBuffersTransferData[0] = CONTROLLER_LINKSTANDBYMSG;
- gBattleBuffersTransferData[1] = arg1;
+ sBattleBuffersTransferData[0] = CONTROLLER_LINKSTANDBYMSG;
+ sBattleBuffersTransferData[1] = arg1;
if (arg2_)
- gBattleBuffersTransferData[3] = gBattleBuffersTransferData[2] = sub_81850DC(&gBattleBuffersTransferData[4]);
+ sBattleBuffersTransferData[3] = sBattleBuffersTransferData[2] = sub_81850DC(&sBattleBuffersTransferData[4]);
else
- gBattleBuffersTransferData[3] = gBattleBuffersTransferData[2] = 0;
+ sBattleBuffersTransferData[3] = sBattleBuffersTransferData[2] = 0;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, gBattleBuffersTransferData[2] + 4);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sBattleBuffersTransferData[2] + 4);
}
-void EmitResetActionMoveSelection(u8 bufferId, u8 caseId)
+void BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId)
{
- gBattleBuffersTransferData[0] = CONTROLLER_RESETACTIONMOVESELECTION;
- gBattleBuffersTransferData[1] = caseId;
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2);
+ sBattleBuffersTransferData[0] = CONTROLLER_RESETACTIONMOVESELECTION;
+ sBattleBuffersTransferData[1] = caseId;
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2);
}
-void EmitCmd55(u8 bufferId, u8 arg1)
+void BtlController_EmitCmd55(u8 bufferId, u8 battleOutcome)
{
- gBattleBuffersTransferData[0] = CONTROLLER_55;
- gBattleBuffersTransferData[1] = arg1;
- gBattleBuffersTransferData[2] = gSaveBlock2Ptr->field_CA9_b;
- gBattleBuffersTransferData[3] = gSaveBlock2Ptr->field_CA9_b;
- gBattleBuffersTransferData[5] = gBattleBuffersTransferData[4] = sub_81850DC(&gBattleBuffersTransferData[6]);
- PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, gBattleBuffersTransferData[4] + 6);
+ sBattleBuffersTransferData[0] = CONTROLLER_55;
+ sBattleBuffersTransferData[1] = battleOutcome;
+ sBattleBuffersTransferData[2] = gSaveBlock2Ptr->frontier.field_CA9_b;
+ sBattleBuffersTransferData[3] = gSaveBlock2Ptr->frontier.field_CA9_b;
+ sBattleBuffersTransferData[5] = sBattleBuffersTransferData[4] = sub_81850DC(&sBattleBuffersTransferData[6]);
+ PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sBattleBuffersTransferData[4] + 6);
}
diff --git a/src/battle_data.c b/src/battle_data.c
new file mode 100644
index 000000000..f3719ac2d
--- /dev/null
+++ b/src/battle_data.c
@@ -0,0 +1,13 @@
+#include "global.h"
+#include "battle.h"
+#include "data2.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/species.h"
+#include "constants/trainers.h"
+
+#include "data/trainer_parties.h"
+#include "data/text/trainer_class_names.h"
+#include "data/trainers.h"
+#include "data/text/species_names.h"
+#include "data/text/move_names.h"
diff --git a/src/battle_dome_cards.c b/src/battle_dome_cards.c
index 9385417b4..5e659a2e8 100644
--- a/src/battle_dome_cards.c
+++ b/src/battle_dome_cards.c
@@ -4,7 +4,7 @@
#include "sprite.h"
#include "window.h"
#include "malloc.h"
-#include "species.h"
+#include "constants/species.h"
#include "palette.h"
#include "decompress.h"
#include "battle_dome_cards.h"
@@ -16,14 +16,15 @@ extern const struct CompressedSpriteSheet gTrainerBackPicTable[];
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const union AffineAnimCmd *const gUnknown_082FF618[];
extern const union AffineAnimCmd *const gUnknown_082FF694[];
-extern const union AnimCmd *const gUnknown_082FF70C[];
+extern const union AnimCmd *const gPlayerMonSpriteAnimsTable[];
extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[NUM_SPECIES];
extern const union AnimCmd *const *const gUnknown_0830536C[];
-extern const u8 gUnknown_0831F578[];
+extern const u8 gFacilityClassToPicIndex[];
// Static type declarations
-struct BattleDomeCard {
+struct BattleDomeCard
+{
u8 *frames;
struct SpriteFrameImage *images;
u16 paletteTag;
@@ -41,10 +42,12 @@ static EWRAM_DATA struct BattleDomeCard gUnknown_0203CD04[8] = {};
// .rodata
static const struct BattleDomeCard gUnknown_0860B058 = {};
-static const struct OamData gUnknown_0860B064 = {
+static const struct OamData gUnknown_0860B064 =
+{
.size = 3
};
-static const struct OamData gUnknown_0860B06C = {
+static const struct OamData gUnknown_0860B06C =
+{
.affineMode = 1, .size = 3
};
@@ -158,7 +161,7 @@ static void uns_builder_assign_animtable1(bool8 isTrainer)
{
if (!isTrainer)
{
- gUnknown_0203CCEC.anims = gUnknown_082FF70C;
+ gUnknown_0203CCEC.anims = gPlayerMonSpriteAnimsTable;
}
else
{
@@ -421,9 +424,9 @@ u8 sub_818D97C(u8 a0, u8 a1)
switch (a0)
{
default:
- return gUnknown_0831F578[0x3F];
+ return gFacilityClassToPicIndex[0x3F];
case 0:
- return gUnknown_0831F578[0x3C];
+ return gFacilityClassToPicIndex[0x3C];
}
}
return a0;
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index 99a82f3ca..8f17d488e 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -3,44 +3,34 @@
#include "battle_controllers.h"
#include "battle_ai_script_commands.h"
#include "battle_anim.h"
+#include "constants/battle_anim.h"
#include "battle_interface.h"
#include "main.h"
#include "malloc.h"
-#include "rng.h"
+#include "random.h"
#include "util.h"
#include "pokemon.h"
-#include "moves.h"
+#include "constants/moves.h"
#include "task.h"
#include "sprite.h"
#include "sound.h"
#include "m4a.h"
-#include "species.h"
+#include "constants/species.h"
#include "decompress.h"
#include "data2.h"
#include "palette.h"
#include "blend_palette.h"
#include "contest.h"
-#include "songs.h"
-
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gActiveBank;
-extern u8 gNoOfAllBanks;
-extern u16 gUnknown_020243FC;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT];
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT];
-extern struct MusicPlayerInfo gMPlay_SE1;
-extern struct MusicPlayerInfo gMPlay_SE2;
-extern struct MusicPlayerInfo gMPlay_BGM;
-
-extern const struct BattleMove gBattleMoves[];
+#include "constants/songs.h"
+#include "constants/rgb.h"
+
+extern struct MusicPlayerInfo gMPlayInfo_SE1;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+
extern const u8 gUnknown_0831C604[];
-extern const u8 * const gUnknown_082C9320[];
-extern const u8 * const gUnknown_082C937C[];
+extern const u8 * const gBattleAnims_VariousTable[];
+extern const u8 * const gBattleAnims_Special[];
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
extern const struct CompressedSpriteSheet gMonBackPicTable[];
extern const struct CompressedSpriteSheet gTrainerFrontPicTable[];
@@ -48,7 +38,6 @@ extern const struct CompressedSpriteSheet gTrainerBackPicTable[];
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
extern const union AnimCmd* const * const gMonAnimationsSpriteAnimsPtrTable[];
-extern const struct SpriteTemplate gUnknown_08329D98[4];
extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow;
extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow;
extern const u8 gEnemyMonElevation[];
@@ -63,11 +52,11 @@ extern const u8 gUnknown_08C1F46C[];
extern const u8 gUnknown_08C1F5E8[];
extern const u8 gUnknown_08C1F76C[];
extern const u8 gUnknown_08C1F8E8[];
-extern const u8 gUnknown_08C0237C[];
+extern const u8 gBlankGfxCompressed[];
extern const u16 gBattleInterface_BallStatusBarPal[];
extern const u16 gBattleInterface_BallDisplayPal[];
-extern u8 sub_80688F8(u8, u8 bank);
+extern u8 sub_80688F8(u8, u8 battlerId);
extern u8 pokemon_order_func(u8); // party menu
extern void sub_81B8C68(void);
@@ -78,58 +67,58 @@ static void sub_805D7EC(struct Sprite *sprite);
static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId);
static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId);
static void Task_ClearBitWhenSpecialAnimDone(u8 taskId);
-static void ClearSpritesBankHealthboxAnimData(void);
+static void ClearSpritesBattlerHealthboxAnimData(void);
// const rom data
-static const struct CompressedSpriteSheet gUnknown_0832C0D0 =
+static const struct CompressedSpriteSheet sSpriteSheet_SinglesPlayerHealthbox =
{
gUnknown_08C1F1C8, 0x1000, TAG_HEALTHBOX_PLAYER1_TILE
};
-static const struct CompressedSpriteSheet gUnknown_0832C0D8 =
+static const struct CompressedSpriteSheet sSpriteSheet_SinglesOpponentHealthbox =
{
gUnknown_08C1F46C, 0x1000, TAG_HEALTHBOX_OPPONENT1_TILE
};
-static const struct CompressedSpriteSheet gUnknown_0832C0E0[2] =
+static const struct CompressedSpriteSheet sSpriteSheets_DoublesPlayerHealthbox[2] =
{
{gUnknown_08C1F5E8, 0x800, TAG_HEALTHBOX_PLAYER1_TILE},
{gUnknown_08C1F5E8, 0x800, TAG_HEALTHBOX_PLAYER2_TILE}
};
-static const struct CompressedSpriteSheet gUnknown_0832C0F0[2] =
+static const struct CompressedSpriteSheet sSpriteSheets_DoublesOpponentHealthbox[2] =
{
{gUnknown_08C1F76C, 0x800, TAG_HEALTHBOX_OPPONENT1_TILE},
{gUnknown_08C1F76C, 0x800, TAG_HEALTHBOX_OPPONENT2_TILE}
};
-static const struct CompressedSpriteSheet gUnknown_0832C100 =
+static const struct CompressedSpriteSheet sSpriteSheet_SafariHealthbox =
{
gUnknown_08C1F8E8, 0x1000, TAG_HEALTHBOX_SAFARI_TILE
};
-static const struct CompressedSpriteSheet gUnknown_0832C108[BATTLE_BANKS_COUNT] =
+static const struct CompressedSpriteSheet sSpriteSheets_HealthBar[MAX_BATTLERS_COUNT] =
{
- {gUnknown_08C0237C, 0x0100, 0xd704},
- {gUnknown_08C0237C, 0x0120, 0xd705},
- {gUnknown_08C0237C, 0x0100, 0xd706},
- {gUnknown_08C0237C, 0x0120, 0xd707}
+ {gBlankGfxCompressed, 0x0100, TAG_HEALTHBAR_PLAYER1_TILE},
+ {gBlankGfxCompressed, 0x0120, TAG_HEALTHBAR_OPPONENT1_TILE},
+ {gBlankGfxCompressed, 0x0100, TAG_HEALTHBAR_PLAYER2_TILE},
+ {gBlankGfxCompressed, 0x0120, TAG_HEALTHBAR_OPPONENT2_TILE}
};
-static const struct SpritePalette gUnknown_0832C128[2] =
+static const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] =
{
{gBattleInterface_BallStatusBarPal, TAG_HEALTHBOX_PAL},
- {gBattleInterface_BallDisplayPal, 0xd704}
+ {gBattleInterface_BallDisplayPal, TAG_HEALTHBAR_PAL}
};
// code
void AllocateBattleSpritesData(void)
{
gBattleSpritesDataPtr = AllocZeroed(sizeof(struct BattleSpriteData));
- gBattleSpritesDataPtr->bankData = AllocZeroed(sizeof(struct BattleSpriteInfo) * BATTLE_BANKS_COUNT);
- gBattleSpritesDataPtr->healthBoxesData = AllocZeroed(sizeof(struct BattleHealthboxInfo) * BATTLE_BANKS_COUNT);
+ gBattleSpritesDataPtr->battlerData = AllocZeroed(sizeof(struct BattleSpriteInfo) * MAX_BATTLERS_COUNT);
+ gBattleSpritesDataPtr->healthBoxesData = AllocZeroed(sizeof(struct BattleHealthboxInfo) * MAX_BATTLERS_COUNT);
gBattleSpritesDataPtr->animationData = AllocZeroed(sizeof(struct BattleAnimationInfo));
- gBattleSpritesDataPtr->battleBars = AllocZeroed(sizeof(struct BattleBarInfo) * BATTLE_BANKS_COUNT);
+ gBattleSpritesDataPtr->battleBars = AllocZeroed(sizeof(struct BattleBarInfo) * MAX_BATTLERS_COUNT);
}
void FreeBattleSpritesData(void)
@@ -140,7 +129,7 @@ void FreeBattleSpritesData(void)
FREE_AND_SET_NULL(gBattleSpritesDataPtr->battleBars);
FREE_AND_SET_NULL(gBattleSpritesDataPtr->animationData);
FREE_AND_SET_NULL(gBattleSpritesDataPtr->healthBoxesData);
- FREE_AND_SET_NULL(gBattleSpritesDataPtr->bankData);
+ FREE_AND_SET_NULL(gBattleSpritesDataPtr->battlerData);
FREE_AND_SET_NULL(gBattleSpritesDataPtr);
}
@@ -148,17 +137,17 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
{
s32 i, var1, var2;
s32 chosenMoveId = -1;
- struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
- u8 unusableMovesBits = CheckMoveLimitations(gActiveBank, 0, 0xFF);
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
+ u8 unusableMovesBits = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
s32 percent = Random() % 100;
- i = (gBattleStruct->field_92 & gBitTable[gActiveBank]) ? 2 : 0;
+ i = (gBattleStruct->field_92 & gBitTable[gActiveBattler]) ? 2 : 0;
var2 = i;
var1 = i + 2;
for (; i < var1; i++)
{
- if (gUnknown_0831C494[GetNatureFromPersonality(gBattleMons[gActiveBank].personality)][i] > percent)
+ if (gUnknown_0831C494[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)][i] > percent)
break;
}
@@ -233,13 +222,13 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
if (Random() % 100 > 49)
{
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
return 0;
}
}
else
{
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
return 0;
}
}
@@ -247,7 +236,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
if (moveInfo->moves[chosenMoveId] == MOVE_CURSE)
{
if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST)
- var1 = MOVE_TARGET_x10;
+ var1 = MOVE_TARGET_USER;
else
var1 = MOVE_TARGET_SELECTED;
}
@@ -256,12 +245,12 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
var1 = gBattleMoves[moveInfo->moves[chosenMoveId]].target;
}
- if (var1 & MOVE_TARGET_x10)
- chosenMoveId |= (gActiveBank << 8);
+ if (var1 & MOVE_TARGET_USER)
+ chosenMoveId |= (gActiveBattler << 8);
else if (var1 == MOVE_TARGET_SELECTED)
chosenMoveId |= (BattlePalaceGetTargetRetValue());
else
- chosenMoveId |= (GetBankByIdentity((GetBankIdentity(gActiveBank) & BIT_SIDE) ^ BIT_SIDE) << 8);
+ chosenMoveId |= (GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & BIT_SIDE) ^ BIT_SIDE) << 8);
return chosenMoveId;
}
@@ -271,7 +260,7 @@ static u8 sub_805D4A8(u16 move)
switch (gBattleMoves[move].target)
{
case MOVE_TARGET_SELECTED:
- case MOVE_TARGET_USER:
+ case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_RANDOM:
case MOVE_TARGET_BOTH:
case MOVE_TARGET_FOES_AND_ALLY:
@@ -283,7 +272,7 @@ static u8 sub_805D4A8(u16 move)
case MOVE_TARGET_DEPENDS:
case MOVE_TARGET_OPPONENTS_FIELD:
return 2;
- case MOVE_TARGET_x10:
+ case MOVE_TARGET_USER:
return 1;
default:
return 0;
@@ -296,21 +285,21 @@ static u16 BattlePalaceGetTargetRetValue(void)
{
u8 opposing1, opposing2;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
- opposing1 = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- opposing2 = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ opposing1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ opposing2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
}
else
{
- opposing1 = GetBankByIdentity(IDENTITY_PLAYER_MON1);
- opposing2 = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ opposing1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ opposing2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
}
if (gBattleMons[opposing1].hp == gBattleMons[opposing2].hp)
- return (((gActiveBank & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8;
+ return (((gActiveBattler & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8;
- switch (gUnknown_0831C604[GetNatureFromPersonality(gBattleMons[gActiveBank].personality)])
+ switch (gUnknown_0831C604[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)])
{
case 0:
if (gBattleMons[opposing1].hp > gBattleMons[opposing2].hp)
@@ -323,16 +312,16 @@ static u16 BattlePalaceGetTargetRetValue(void)
else
return opposing2 << 8;
case 2:
- return (((gActiveBank & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8;
+ return (((gActiveBattler & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8;
}
}
- return (gActiveBank ^ BIT_SIDE) << 8;
+ return (gActiveBattler ^ BIT_SIDE) << 8;
}
void sub_805D714(struct Sprite *sprite)
{
- u8 spriteId = sprite->data1;
+ u8 spriteId = sprite->data[1];
if (!gSprites[spriteId].affineAnimEnded)
return;
@@ -365,9 +354,9 @@ void sub_805D770(struct Sprite *sprite, bool8 arg1)
void sub_805D7AC(struct Sprite *sprite)
{
- if (!(gUnknown_020243FC & 1))
+ if (!(gIntroSlideFlags & 1))
{
- sprite->pos2.x += sprite->data0;
+ sprite->pos2.x += sprite->data[0];
if (sprite->pos2.x == 0)
{
if (sprite->pos2.y != 0)
@@ -387,71 +376,71 @@ static void sub_805D7EC(struct Sprite *sprite)
void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status)
{
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive = 1;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 1;
if (!isStatus2)
{
- if (status == STATUS_FREEZE)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_FRZ);
- else if (status == STATUS_POISON || status & STATUS_TOXIC_POISON)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_PSN);
- else if (status == STATUS_BURN)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_BRN);
- else if (status & STATUS_SLEEP)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_SLP);
- else if (status == STATUS_PARALYSIS)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_PRZ);
+ if (status == STATUS1_FREEZE)
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_FRZ);
+ else if (status == STATUS1_POISON || status & STATUS1_TOXIC_POISON)
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_PSN);
+ else if (status == STATUS1_BURN)
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_BRN);
+ else if (status & STATUS1_SLEEP)
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_SLP);
+ else if (status == STATUS1_PARALYSIS)
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_PRZ);
else // no animation
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 0;
}
else
{
if (status & STATUS2_INFATUATION)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_INFATUATION);
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_INFATUATION);
else if (status & STATUS2_CONFUSION)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_CONFUSION);
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_CONFUSION);
else if (status & STATUS2_CURSED)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_CURSED);
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_CURSED);
else if (status & STATUS2_NIGHTMARE)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_NIGHTMARE);
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_NIGHTMARE);
else if (status & STATUS2_WRAPPED)
- LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_WRAPPED);
+ LaunchStatusAnimation(gActiveBattler, B_ANIM_STATUS_WRAPPED); // this animation doesn't actually exist
else // no animation
- gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 0;
}
}
-#define tBank data[0]
+#define tBattlerId data[0]
-bool8 TryHandleLaunchBattleTableAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId, u16 argument)
+bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId, u16 argument)
{
u8 taskId;
if (tableId == B_ANIM_CASTFORM_CHANGE && (argument & 0x80))
{
- gBattleMonForms[activeBank] = (argument & ~(0x80));
+ gBattleMonForms[activeBattler] = (argument & ~(0x80));
return TRUE;
}
- if (gBattleSpritesDataPtr->bankData[activeBank].behindSubstitute
+ if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute
&& !ShouldAnimBeDoneRegardlessOfSubsitute(tableId))
{
return TRUE;
}
- if (gBattleSpritesDataPtr->bankData[activeBank].behindSubstitute
+ if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute
&& tableId == B_ANIM_SUBSTITUTE_FADE
- && gSprites[gBankSpriteIds[activeBank]].invisible)
+ && gSprites[gBattlerSpriteIds[activeBattler]].invisible)
{
- LoadBattleMonGfxAndAnimate(activeBank, TRUE, gBankSpriteIds[activeBank]);
- ClearBehindSubstituteBit(activeBank);
+ LoadBattleMonGfxAndAnimate(activeBattler, TRUE, gBattlerSpriteIds[activeBattler]);
+ ClearBehindSubstituteBit(activeBattler);
return TRUE;
}
- gAnimBankAttacker = atkBank;
- gAnimBankTarget = defBank;
+ gBattleAnimAttacker = atkBattler;
+ gBattleAnimTarget = defBattler;
gBattleSpritesDataPtr->animationData->animArg = argument;
- LaunchBattleAnimation(gUnknown_082C9320, tableId, FALSE);
+ LaunchBattleAnimation(gBattleAnims_VariousTable, tableId, FALSE);
taskId = CreateTask(Task_ClearBitWhenBattleTableAnimDone, 10);
- gTasks[taskId].tBank = activeBank;
- gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].animFromTableActive = 1;
+ gTasks[taskId].tBattlerId = activeBattler;
+ gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].animFromTableActive = 1;
return FALSE;
}
@@ -461,12 +450,12 @@ static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId)
gAnimScriptCallback();
if (!gAnimScriptActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].animFromTableActive = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].animFromTableActive = 0;
DestroyTask(taskId);
}
}
-#undef tBank
+#undef tBattlerId
static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId)
{
@@ -484,18 +473,18 @@ static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId)
}
}
-#define tBank data[0]
+#define tBattlerId data[0]
-void InitAndLaunchSpecialAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId)
+void InitAndLaunchSpecialAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId)
{
u8 taskId;
- gAnimBankAttacker = atkBank;
- gAnimBankTarget = defBank;
- LaunchBattleAnimation(gUnknown_082C937C, tableId, FALSE);
+ gBattleAnimAttacker = atkBattler;
+ gBattleAnimTarget = defBattler;
+ LaunchBattleAnimation(gBattleAnims_Special, tableId, FALSE);
taskId = CreateTask(Task_ClearBitWhenSpecialAnimDone, 10);
- gTasks[taskId].tBank = activeBank;
- gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].specialAnimActive = 1;
+ gTasks[taskId].tBattlerId = activeBattler;
+ gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].specialAnimActive = 1;
}
static void Task_ClearBitWhenSpecialAnimDone(u8 taskId)
@@ -503,153 +492,153 @@ static void Task_ClearBitWhenSpecialAnimDone(u8 taskId)
gAnimScriptCallback();
if (!gAnimScriptActive)
{
- gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].specialAnimActive = 0;
+ gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].specialAnimActive = 0;
DestroyTask(taskId);
}
}
-#undef tBank
+#undef tBattlerId
-// great function to include newly added moves that don't have animation yet
+// Great function to include newly added moves that don't have animation yet.
bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn)
{
return FALSE;
}
-bool8 mplay_80342A4(u8 bank)
+bool8 mplay_80342A4(u8 battlerId)
{
u8 zero = 0;
if (IsSEPlaying())
{
- gBattleSpritesDataPtr->healthBoxesData[bank].field_8++;
- if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_8 < 30)
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].field_8++;
+ if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_8 < 30)
return TRUE;
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
}
if (zero == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[bank].field_8 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].field_8 = 0;
return FALSE;
}
return TRUE;
}
-void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 bank)
+void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId)
{
u32 monsPersonality, currentPersonality, otId;
u16 species;
- u8 identity;
+ u8 position;
u16 paletteOffset;
const void *lzPaletteData;
monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY);
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE)
+ if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)
{
species = GetMonData(mon, MON_DATA_SPECIES);
currentPersonality = monsPersonality;
}
else
{
- species = gBattleSpritesDataPtr->bankData[bank].transformSpecies;
- currentPersonality = gTransformedPersonalities[bank];
+ species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies;
+ currentPersonality = gTransformedPersonalities[battlerId];
}
otId = GetMonData(mon, MON_DATA_OT_ID);
- identity = GetBankIdentity(bank);
+ position = GetBattlerPosition(battlerId);
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species],
- gMonSpritesGfxPtr->sprites[identity],
+ gMonSpritesGfxPtr->sprites[position],
species, currentPersonality);
- paletteOffset = 0x100 + bank * 16;
+ paletteOffset = 0x100 + battlerId * 16;
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE)
+ if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)
lzPaletteData = GetMonFrontSpritePal(mon);
else
lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);
LZDecompressWram(lzPaletteData, gDecompressionBuffer);
LoadPalette(gDecompressionBuffer, paletteOffset, 0x20);
- LoadPalette(gDecompressionBuffer, 0x80 + bank * 16, 0x20);
+ LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20);
if (species == SPECIES_CASTFORM)
{
- paletteOffset = 0x100 + bank * 16;
+ paletteOffset = 0x100 + battlerId * 16;
LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);
- LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[bank]], paletteOffset, 0x20);
+ LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, 0x20);
}
// transform's pink color
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE)
+ if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)
{
- BlendPalette(paletteOffset, 16, 6, 0x7FFF);
+ BlendPalette(paletteOffset, 16, 6, RGB_WHITE);
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32);
}
}
-void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 bank)
+void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId)
{
u32 monsPersonality, currentPersonality, otId;
u16 species;
- u8 identity;
+ u8 position;
u16 paletteOffset;
const void *lzPaletteData;
monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY);
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE)
+ if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)
{
species = GetMonData(mon, MON_DATA_SPECIES);
currentPersonality = monsPersonality;
}
else
{
- species = gBattleSpritesDataPtr->bankData[bank].transformSpecies;
- currentPersonality = gTransformedPersonalities[bank];
+ species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies;
+ currentPersonality = gTransformedPersonalities[battlerId];
}
otId = GetMonData(mon, MON_DATA_OT_ID);
- identity = GetBankIdentity(bank);
+ position = GetBattlerPosition(battlerId);
- if (sub_80688F8(1, bank) == 1 || gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE)
+ if (sub_80688F8(1, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)
{
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species],
- gMonSpritesGfxPtr->sprites[identity],
+ gMonSpritesGfxPtr->sprites[position],
species, currentPersonality);
}
else
{
HandleLoadSpecialPokePic(&gMonBackPicTable[species],
- gMonSpritesGfxPtr->sprites[identity],
+ gMonSpritesGfxPtr->sprites[position],
species, currentPersonality);
}
- paletteOffset = 0x100 + bank * 16;
+ paletteOffset = 0x100 + battlerId * 16;
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE)
+ if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)
lzPaletteData = GetMonFrontSpritePal(mon);
else
lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);
LZDecompressWram(lzPaletteData, gDecompressionBuffer);
LoadPalette(gDecompressionBuffer, paletteOffset, 0x20);
- LoadPalette(gDecompressionBuffer, 0x80 + bank * 16, 0x20);
+ LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20);
if (species == SPECIES_CASTFORM)
{
- paletteOffset = 0x100 + bank * 16;
+ paletteOffset = 0x100 + battlerId * 16;
LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);
- LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[bank]], paletteOffset, 0x20);
+ LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, 0x20);
}
// transform's pink color
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE)
+ if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)
{
- BlendPalette(paletteOffset, 16, 6, 0x7FFF);
+ BlendPalette(paletteOffset, 16, 6, RGB_WHITE);
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32);
}
}
@@ -662,23 +651,23 @@ void nullsub_24(u16 species)
{
}
-void DecompressTrainerFrontPic(u16 frontPicId, u8 bank)
+void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId)
{
- u8 identity = GetBankIdentity(bank);
+ u8 position = GetBattlerPosition(battlerId);
DecompressPicFromTable_2(&gTrainerFrontPicTable[frontPicId],
- gMonSpritesGfxPtr->sprites[identity],
+ gMonSpritesGfxPtr->sprites[position],
SPECIES_NONE);
LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[frontPicId]);
}
-void DecompressTrainerBackPic(u16 backPicId, u8 bank)
+void DecompressTrainerBackPic(u16 backPicId, u8 battlerId)
{
- u8 identity = GetBankIdentity(bank);
+ u8 position = GetBattlerPosition(battlerId);
DecompressPicFromTable_2(&gTrainerBackPicTable[backPicId],
- gMonSpritesGfxPtr->sprites[identity],
+ gMonSpritesGfxPtr->sprites[position],
SPECIES_NONE);
LoadCompressedPalette(gTrainerBackPicPaletteTable[backPicId].data,
- 0x100 + 16 * bank, 0x20);
+ 0x100 + 16 * battlerId, 0x20);
}
void nullsub_25(u8 arg0)
@@ -690,29 +679,30 @@ void FreeTrainerFrontPicPalette(u16 frontPicId)
FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[frontPicId].tag);
}
-void sub_805DFFC(void)
+// Unused.
+void BattleLoadAllHealthBoxesGfxAtOnce(void)
{
- u8 numberOfBanks = 0;
+ u8 numberOfBattlers = 0;
u8 i;
- LoadSpritePalette(&gUnknown_0832C128[0]);
- LoadSpritePalette(&gUnknown_0832C128[1]);
+ LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]);
+ LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]);
if (!IsDoubleBattle())
{
- LoadCompressedObjectPic(&gUnknown_0832C0D0);
- LoadCompressedObjectPic(&gUnknown_0832C0D8);
- numberOfBanks = 2;
+ LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox);
+ LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox);
+ numberOfBattlers = 2;
}
else
{
- LoadCompressedObjectPic(&gUnknown_0832C0E0[0]);
- LoadCompressedObjectPic(&gUnknown_0832C0E0[1]);
- LoadCompressedObjectPic(&gUnknown_0832C0F0[0]);
- LoadCompressedObjectPic(&gUnknown_0832C0F0[1]);
- numberOfBanks = 4;
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]);
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]);
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]);
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]);
+ numberOfBattlers = 4;
}
- for (i = 0; i < numberOfBanks; i++)
- LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[i]]);
+ for (i = 0; i < numberOfBattlers; i++)
+ LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[i]]);
}
bool8 BattleLoadAllHealthBoxesGfx(u8 state)
@@ -723,45 +713,45 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state)
{
if (state == 1)
{
- LoadSpritePalette(&gUnknown_0832C128[0]);
- LoadSpritePalette(&gUnknown_0832C128[1]);
+ LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]);
+ LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]);
}
else if (!IsDoubleBattle())
{
if (state == 2)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- LoadCompressedObjectPic(&gUnknown_0832C100);
+ LoadCompressedObjectPic(&sSpriteSheet_SafariHealthbox);
else
- LoadCompressedObjectPic(&gUnknown_0832C0D0);
+ LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox);
}
else if (state == 3)
- LoadCompressedObjectPic(&gUnknown_0832C0D8);
+ LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox);
else if (state == 4)
- LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[0]]);
+ LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);
else if (state == 5)
- LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[1]]);
+ LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);
else
retVal = TRUE;
}
else
{
if (state == 2)
- LoadCompressedObjectPic(&gUnknown_0832C0E0[0]);
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]);
else if (state == 3)
- LoadCompressedObjectPic(&gUnknown_0832C0E0[1]);
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]);
else if (state == 4)
- LoadCompressedObjectPic(&gUnknown_0832C0F0[0]);
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]);
else if (state == 5)
- LoadCompressedObjectPic(&gUnknown_0832C0F0[1]);
+ LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]);
else if (state == 6)
- LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[0]]);
+ LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);
else if (state == 7)
- LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[1]]);
+ LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);
else if (state == 8)
- LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[2]]);
+ LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[2]]);
else if (state == 9)
- LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[3]]);
+ LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[3]]);
else
retVal = TRUE;
}
@@ -775,24 +765,24 @@ void LoadBattleBarGfx(u8 arg0)
LZDecompressWram(gUnknown_08C093F0, gMonSpritesGfxPtr->barFontGfx);
}
-bool8 BattleInitAllSprites(u8 *state1, u8 *bank)
+bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId)
{
bool8 retVal = FALSE;
switch (*state1)
{
case 0:
- ClearSpritesBankHealthboxAnimData();
+ ClearSpritesBattlerHealthboxAnimData();
(*state1)++;
break;
case 1:
- if (!BattleLoadAllHealthBoxesGfx(*bank))
+ if (!BattleLoadAllHealthBoxesGfx(*battlerId))
{
- (*bank)++;
+ (*battlerId)++;
}
else
{
- *bank = 0;
+ *battlerId = 0;
(*state1)++;
}
break;
@@ -800,47 +790,47 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *bank)
(*state1)++;
break;
case 3:
- if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && *bank == 0)
- gHealthBoxesIds[*bank] = CreateSafariPlayerHealthboxSprites();
+ if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && *battlerId == 0)
+ gHealthboxSpriteIds[*battlerId] = CreateSafariPlayerHealthboxSprites();
else
- gHealthBoxesIds[*bank] = CreateBankHealthboxSprites(*bank);
+ gHealthboxSpriteIds[*battlerId] = CreateBattlerHealthboxSprites(*battlerId);
- (*bank)++;
- if (*bank == gNoOfAllBanks)
+ (*battlerId)++;
+ if (*battlerId == gBattlersCount)
{
- *bank = 0;
+ *battlerId = 0;
(*state1)++;
}
break;
case 4:
- SetBankHealthboxSpritePos(*bank);
- if (gBanksByIdentity[*bank] <= 1)
- DummyBattleInterfaceFunc(gHealthBoxesIds[*bank], FALSE);
+ InitBattlerHealthboxCoords(*battlerId);
+ if (gBattlerPositions[*battlerId] <= 1)
+ DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], FALSE);
else
- DummyBattleInterfaceFunc(gHealthBoxesIds[*bank], TRUE);
+ DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], TRUE);
- (*bank)++;
- if (*bank == gNoOfAllBanks)
+ (*battlerId)++;
+ if (*battlerId == gBattlersCount)
{
- *bank = 0;
+ *battlerId = 0;
(*state1)++;
}
break;
case 5:
- if (GetBankSide(*bank) == SIDE_PLAYER)
+ if (GetBattlerSide(*battlerId) == B_SIDE_PLAYER)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
- UpdateHealthboxAttribute(gHealthBoxesIds[*bank], &gPlayerParty[gBattlePartyID[*bank]], HEALTHBOX_ALL);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gPlayerParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL);
}
else
{
- UpdateHealthboxAttribute(gHealthBoxesIds[*bank], &gEnemyParty[gBattlePartyID[*bank]], HEALTHBOX_ALL);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gEnemyParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL);
}
- SetHealthboxSpriteInvisible(gHealthBoxesIds[*bank]);
- (*bank)++;
- if (*bank == gNoOfAllBanks)
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[*battlerId]);
+ (*battlerId)++;
+ if (*battlerId == gBattlersCount)
{
- *bank = 0;
+ *battlerId = 0;
(*state1)++;
}
break;
@@ -856,49 +846,49 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *bank)
void ClearSpritesHealthboxAnimData(void)
{
- memset(gBattleSpritesDataPtr->healthBoxesData, 0, sizeof(struct BattleHealthboxInfo) * BATTLE_BANKS_COUNT);
+ memset(gBattleSpritesDataPtr->healthBoxesData, 0, sizeof(struct BattleHealthboxInfo) * MAX_BATTLERS_COUNT);
memset(gBattleSpritesDataPtr->animationData, 0, sizeof(struct BattleAnimationInfo));
}
-static void ClearSpritesBankHealthboxAnimData(void)
+static void ClearSpritesBattlerHealthboxAnimData(void)
{
ClearSpritesHealthboxAnimData();
- memset(gBattleSpritesDataPtr->bankData, 0, sizeof(struct BattleSpriteInfo) * BATTLE_BANKS_COUNT);
+ memset(gBattleSpritesDataPtr->battlerData, 0, sizeof(struct BattleSpriteInfo) * MAX_BATTLERS_COUNT);
}
void CopyAllBattleSpritesInvisibilities(void)
{
s32 i;
- for (i = 0; i < gNoOfAllBanks; i++)
- gBattleSpritesDataPtr->bankData[i].invisible = gSprites[gBankSpriteIds[i]].invisible;
+ for (i = 0; i < gBattlersCount; i++)
+ gBattleSpritesDataPtr->battlerData[i].invisible = gSprites[gBattlerSpriteIds[i]].invisible;
}
-void CopyBattleSpriteInvisibility(u8 bank)
+void CopyBattleSpriteInvisibility(u8 battlerId)
{
- gBattleSpritesDataPtr->bankData[bank].invisible = gSprites[gBankSpriteIds[bank]].invisible;
+ gBattleSpritesDataPtr->battlerData[battlerId].invisible = gSprites[gBattlerSpriteIds[battlerId]].invisible;
}
-void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform)
+void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform)
{
u16 paletteOffset;
u32 personalityValue;
u32 otId;
- u8 identity;
+ u8 position;
const u8 *lzPaletteData;
if (notTransform)
{
- StartSpriteAnim(&gSprites[gBankSpriteIds[bankAtk]], gBattleSpritesDataPtr->animationData->animArg);
- paletteOffset = 0x100 + bankAtk * 16;
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleSpritesDataPtr->animationData->animArg);
+ paletteOffset = 0x100 + battlerAtk * 16;
LoadPalette(gBattleStruct->castformPalette[gBattleSpritesDataPtr->animationData->animArg], paletteOffset, 32);
- gBattleMonForms[bankAtk] = gBattleSpritesDataPtr->animationData->animArg;
- if (gBattleSpritesDataPtr->bankData[bankAtk].transformSpecies != SPECIES_NONE)
+ gBattleMonForms[battlerAtk] = gBattleSpritesDataPtr->animationData->animArg;
+ if (gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies != SPECIES_NONE)
{
- BlendPalette(paletteOffset, 16, 6, 0x7FFF);
+ BlendPalette(paletteOffset, 16, 6, RGB_WHITE);
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32);
}
- gSprites[gBankSpriteIds[bankAtk]].pos1.y = GetBankSpriteDefault_Y(bankAtk);
+ gSprites[gBattlerSpriteIds[battlerAtk]].pos1.y = GetBattlerSpriteDefault_Y(battlerAtk);
}
else
{
@@ -908,7 +898,7 @@ void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform)
if (IsContest())
{
- identity = 0;
+ position = 0;
targetSpecies = gContestResources->field_18->field_2;
personalityValue = gContestResources->field_18->field_8;
otId = gContestResources->field_18->field_C;
@@ -920,67 +910,67 @@ void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform)
}
else
{
- identity = GetBankIdentity(bankAtk);
+ position = GetBattlerPosition(battlerAtk);
- if (GetBankSide(bankDef) == SIDE_OPPONENT)
- targetSpecies = GetMonData(&gEnemyParty[gBattlePartyID[bankDef]], MON_DATA_SPECIES);
+ if (GetBattlerSide(battlerDef) == B_SIDE_OPPONENT)
+ targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES);
else
- targetSpecies = GetMonData(&gPlayerParty[gBattlePartyID[bankDef]], MON_DATA_SPECIES);
+ targetSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES);
- if (GetBankSide(bankAtk) == SIDE_PLAYER)
+ if (GetBattlerSide(battlerAtk) == B_SIDE_PLAYER)
{
- personalityValue = GetMonData(&gPlayerParty[gBattlePartyID[bankAtk]], MON_DATA_PERSONALITY);
- otId = GetMonData(&gPlayerParty[gBattlePartyID[bankAtk]], MON_DATA_OT_ID);
+ personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID);
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies],
- gMonSpritesGfxPtr->sprites[identity],
+ gMonSpritesGfxPtr->sprites[position],
targetSpecies,
- gTransformedPersonalities[bankAtk]);
+ gTransformedPersonalities[battlerAtk]);
}
else
{
- personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[bankAtk]], MON_DATA_PERSONALITY);
- otId = GetMonData(&gEnemyParty[gBattlePartyID[bankAtk]], MON_DATA_OT_ID);
+ personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID);
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies],
- gMonSpritesGfxPtr->sprites[identity],
+ gMonSpritesGfxPtr->sprites[position],
targetSpecies,
- gTransformedPersonalities[bankAtk]);
+ gTransformedPersonalities[battlerAtk]);
}
}
- src = gMonSpritesGfxPtr->sprites[identity];
- dst = (void *)(VRAM + 0x10000 + gSprites[gBankSpriteIds[bankAtk]].oam.tileNum * 32);
+ src = gMonSpritesGfxPtr->sprites[position];
+ dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32);
DmaCopy32(3, src, dst, 0x800);
- paletteOffset = 0x100 + bankAtk * 16;
+ paletteOffset = 0x100 + battlerAtk * 16;
lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue);
LZDecompressWram(lzPaletteData, gDecompressionBuffer);
LoadPalette(gDecompressionBuffer, paletteOffset, 32);
if (targetSpecies == SPECIES_CASTFORM)
{
- gSprites[gBankSpriteIds[bankAtk]].anims = gMonAnimationsSpriteAnimsPtrTable[targetSpecies];
+ gSprites[gBattlerSpriteIds[battlerAtk]].anims = gMonAnimationsSpriteAnimsPtrTable[targetSpecies];
LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);
- LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[bankDef] * 16, paletteOffset, 32);
+ LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[battlerDef] * 16, paletteOffset, 32);
}
- BlendPalette(paletteOffset, 16, 6, 0x7FFF);
+ BlendPalette(paletteOffset, 16, 6, RGB_WHITE);
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32);
if (!IsContest())
{
- gBattleSpritesDataPtr->bankData[bankAtk].transformSpecies = targetSpecies;
- gBattleMonForms[bankAtk] = gBattleMonForms[bankDef];
+ gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies = targetSpecies;
+ gBattleMonForms[battlerAtk] = gBattleMonForms[battlerDef];
}
- gSprites[gBankSpriteIds[bankAtk]].pos1.y = GetBankSpriteDefault_Y(bankAtk);
- StartSpriteAnim(&gSprites[gBankSpriteIds[bankAtk]], gBattleMonForms[bankAtk]);
+ gSprites[gBattlerSpriteIds[battlerAtk]].pos1.y = GetBattlerSpriteDefault_Y(battlerAtk);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleMonForms[battlerAtk]);
}
}
-void BattleLoadSubstituteOrMonSpriteGfx(u8 bank, bool8 loadMonSprite)
+void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite)
{
- u8 identity;
+ u8 position;
s32 i;
u32 var;
const void *substitutePal;
@@ -988,23 +978,23 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 bank, bool8 loadMonSprite)
if (!loadMonSprite)
{
if (IsContest())
- identity = 0;
+ position = 0;
else
- identity = GetBankIdentity(bank);
+ position = GetBattlerPosition(battlerId);
if (IsContest())
- LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[identity]);
- else if (GetBankSide(bank) != SIDE_PLAYER)
- LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites[identity]);
+ LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[position]);
+ else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites[position]);
else
- LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[identity]);
+ LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[position]);
i = 1;
- var = bank * 16;
+ var = battlerId * 16;
substitutePal = gSubstituteDollPal;
for (; i < 4; i++)
{
- register void *dmaSrc asm("r0") = gMonSpritesGfxPtr->sprites[identity];
+ register void *dmaSrc asm("r0") = gMonSpritesGfxPtr->sprites[position];
void *dmaDst = (i * 0x800) + dmaSrc;
u32 dmaSize = 0x800;
DmaCopy32(3, dmaSrc, dmaDst, dmaSize);
@@ -1017,59 +1007,59 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 bank, bool8 loadMonSprite)
{
if (!IsContest())
{
- if (GetBankSide(bank) != SIDE_PLAYER)
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank);
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId);
else
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank);
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId);
}
}
}
-void LoadBattleMonGfxAndAnimate(u8 bank, bool8 loadMonSprite, u8 spriteId)
+void LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId)
{
- BattleLoadSubstituteOrMonSpriteGfx(bank, loadMonSprite);
- StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[bank]);
+ BattleLoadSubstituteOrMonSpriteGfx(battlerId, loadMonSprite);
+ StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[battlerId]);
if (!loadMonSprite)
- gSprites[spriteId].pos1.y = GetSubstituteSpriteDefault_Y(bank);
+ gSprites[spriteId].pos1.y = GetSubstituteSpriteDefault_Y(battlerId);
else
- gSprites[spriteId].pos1.y = GetBankSpriteDefault_Y(bank);
+ gSprites[spriteId].pos1.y = GetBattlerSpriteDefault_Y(battlerId);
}
-void TrySetBehindSubstituteSpriteBit(u8 bank, u16 move)
+void TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move)
{
if (move == MOVE_SUBSTITUTE)
- gBattleSpritesDataPtr->bankData[bank].behindSubstitute = 1;
+ gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 1;
}
-void ClearBehindSubstituteBit(u8 bank)
+void ClearBehindSubstituteBit(u8 battlerId)
{
- gBattleSpritesDataPtr->bankData[bank].behindSubstitute = 0;
+ gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 0;
}
-void HandleLowHpMusicChange(struct Pokemon *mon, u8 bank)
+void HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId)
{
u16 hp = GetMonData(mon, MON_DATA_HP);
u16 maxHP = GetMonData(mon, MON_DATA_MAX_HP);
if (GetHPBarLevel(hp, maxHP) == HP_BAR_RED)
{
- if (!gBattleSpritesDataPtr->bankData[bank].lowHpSong)
+ if (!gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong)
{
- if (!gBattleSpritesDataPtr->bankData[bank ^ BIT_MON].lowHpSong)
+ if (!gBattleSpritesDataPtr->battlerData[battlerId ^ BIT_FLANK].lowHpSong)
PlaySE(SE_HINSI);
- gBattleSpritesDataPtr->bankData[bank].lowHpSong = 1;
+ gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 1;
}
}
else
{
- gBattleSpritesDataPtr->bankData[bank].lowHpSong = 0;
+ gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 0;
if (!IsDoubleBattle())
{
m4aSongNumStop(SE_HINSI);
return;
}
- if (IsDoubleBattle() && !gBattleSpritesDataPtr->bankData[bank ^ BIT_MON].lowHpSong)
+ if (IsDoubleBattle() && !gBattleSpritesDataPtr->battlerData[battlerId ^ BIT_FLANK].lowHpSong)
{
m4aSongNumStop(SE_HINSI);
return;
@@ -1079,11 +1069,11 @@ void HandleLowHpMusicChange(struct Pokemon *mon, u8 bank)
void BattleStopLowHpSound(void)
{
- u8 playerBank = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ u8 playerBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
- gBattleSpritesDataPtr->bankData[playerBank].lowHpSong = 0;
+ gBattleSpritesDataPtr->battlerData[playerBattler].lowHpSong = 0;
if (IsDoubleBattle())
- gBattleSpritesDataPtr->bankData[playerBank ^ BIT_MON].lowHpSong = 0;
+ gBattleSpritesDataPtr->battlerData[playerBattler ^ BIT_FLANK].lowHpSong = 0;
m4aSongNumStop(SE_HINSI);
}
@@ -1096,19 +1086,19 @@ u8 GetMonHPBarLevel(struct Pokemon *mon)
return GetHPBarLevel(hp, maxHP);
}
-void sub_805EAE8(void)
+void HandleBattleLowHpMusicChange(void)
{
if (gMain.inBattle)
{
- u8 playerBank1 = GetBankByIdentity(IDENTITY_PLAYER_MON1);
- u8 playerBank2 = GetBankByIdentity(IDENTITY_PLAYER_MON2);
- u8 bank1PartyId = pokemon_order_func(gBattlePartyID[playerBank1]);
- u8 bank2PartyId = pokemon_order_func(gBattlePartyID[playerBank2]);
-
- if (GetMonData(&gPlayerParty[bank1PartyId], MON_DATA_HP) != 0)
- HandleLowHpMusicChange(&gPlayerParty[bank1PartyId], playerBank1);
- if (IsDoubleBattle() && GetMonData(&gPlayerParty[bank2PartyId], MON_DATA_HP) != 0)
- HandleLowHpMusicChange(&gPlayerParty[bank2PartyId], playerBank2);
+ u8 playerBattler1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ u8 playerBattler2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
+ u8 battler1PartyId = pokemon_order_func(gBattlerPartyIndexes[playerBattler1]);
+ u8 battler2PartyId = pokemon_order_func(gBattlerPartyIndexes[playerBattler2]);
+
+ if (GetMonData(&gPlayerParty[battler1PartyId], MON_DATA_HP) != 0)
+ HandleLowHpMusicChange(&gPlayerParty[battler1PartyId], playerBattler1);
+ if (IsDoubleBattle() && GetMonData(&gPlayerParty[battler2PartyId], MON_DATA_HP) != 0)
+ HandleLowHpMusicChange(&gPlayerParty[battler2PartyId], playerBattler2);
}
}
@@ -1116,93 +1106,94 @@ void sub_805EB9C(u8 affineMode)
{
s32 i;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (IsBankSpritePresent(i))
+ if (IsBattlerSpritePresent(i))
{
- gSprites[gBankSpriteIds[i]].oam.affineMode = affineMode;
+ gSprites[gBattlerSpriteIds[i]].oam.affineMode = affineMode;
if (affineMode == 0)
{
- gBattleSpritesDataPtr->healthBoxesData[i].field_6 = gSprites[gBankSpriteIds[i]].oam.matrixNum;
- gSprites[gBankSpriteIds[i]].oam.matrixNum = 0;
+ gBattleSpritesDataPtr->healthBoxesData[i].field_6 = gSprites[gBattlerSpriteIds[i]].oam.matrixNum;
+ gSprites[gBattlerSpriteIds[i]].oam.matrixNum = 0;
}
else
{
- gSprites[gBankSpriteIds[i]].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[i].field_6;
+ gSprites[gBattlerSpriteIds[i]].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[i].field_6;
}
}
}
}
-#define tBank data0
+#define tBattlerId data[0]
void LoadAndCreateEnemyShadowSprites(void)
{
- u8 bank;
+ u8 battlerId;
LoadCompressedObjectPic(&gSpriteSheet_EnemyShadow);
- bank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, sub_80A5C6C(bank, 0), sub_80A5C6C(bank, 1) + 29, 0xC8);
- gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data0 = bank;
+ battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, 0), GetBattlerSpriteCoord(battlerId, 1) + 29, 0xC8);
+ gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId;
if (IsDoubleBattle())
{
- bank = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
- gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, sub_80A5C6C(bank, 0), sub_80A5C6C(bank, 1) + 29, 0xC8);
- gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data0 = bank;
+ battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, 0), GetBattlerSpriteCoord(battlerId, 1) + 29, 0xC8);
+ gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId;
}
}
void SpriteCB_EnemyShadow(struct Sprite *shadowSprite)
{
bool8 invisible = FALSE;
- u8 bank = shadowSprite->tBank;
- struct Sprite *bankSprite = &gSprites[gBankSpriteIds[bank]];
+ u8 battlerId = shadowSprite->tBattlerId;
+ struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battlerId]];
- if (!bankSprite->inUse || !IsBankSpritePresent(bank))
+ if (!battlerSprite->inUse || !IsBattlerSpritePresent(battlerId))
{
shadowSprite->callback = SpriteCB_SetInvisible;
return;
}
- if (gAnimScriptActive || bankSprite->invisible)
+ if (gAnimScriptActive || battlerSprite->invisible)
invisible = TRUE;
- else if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE
- && gEnemyMonElevation[gBattleSpritesDataPtr->bankData[bank].transformSpecies] == 0)
+ else if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE
+ && gEnemyMonElevation[gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies] == 0)
invisible = TRUE;
- if (gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
+ if (gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute)
invisible = TRUE;
- shadowSprite->pos1.x = bankSprite->pos1.x;
- shadowSprite->pos2.x = bankSprite->pos2.x;
+ shadowSprite->pos1.x = battlerSprite->pos1.x;
+ shadowSprite->pos2.x = battlerSprite->pos2.x;
shadowSprite->invisible = invisible;
}
-#undef tBank
+#undef tBattlerId
void SpriteCB_SetInvisible(struct Sprite *sprite)
{
sprite->invisible = 1;
}
-void SetBankEnemyShadowSpriteCallback(u8 bank, u16 species)
+void SetBattlerShadowSpriteCallback(u8 battlerId, u16 species)
{
- if (GetBankSide(bank) == SIDE_PLAYER)
+ // The player's shadow is never seen.
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
return;
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE)
- species = gBattleSpritesDataPtr->bankData[bank].transformSpecies;
+ if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)
+ species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies;
if (gEnemyMonElevation[species] != 0)
- gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].callback = SpriteCB_EnemyShadow;
+ gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_EnemyShadow;
else
- gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].callback = SpriteCB_SetInvisible;
+ gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible;
}
-void EnemyShadowCallbackToSetInvisible(u8 bank)
+void HideBattlerShadowSprite(u8 battlerId)
{
- gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].callback = SpriteCB_SetInvisible;
+ gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible;
}
void sub_805EF14(void)
@@ -1228,12 +1219,12 @@ void sub_805EF14(void)
}
}
-void ClearTemporarySpeciesSpriteData(u8 bank, bool8 dontClearSubstitute)
+void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute)
{
- gBattleSpritesDataPtr->bankData[bank].transformSpecies = SPECIES_NONE;
- gBattleMonForms[bank] = 0;
+ gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE;
+ gBattleMonForms[battlerId] = 0;
if (!dontClearSubstitute)
- ClearBehindSubstituteBit(bank);
+ ClearBehindSubstituteBit(battlerId);
}
void AllocateMonSpritesGfx(void)
@@ -1244,7 +1235,7 @@ void AllocateMonSpritesGfx(void)
gMonSpritesGfxPtr = AllocZeroed(sizeof(*gMonSpritesGfxPtr));
gMonSpritesGfxPtr->firstDecompressed = AllocZeroed(0x8000);
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
gMonSpritesGfxPtr->sprites[i] = gMonSpritesGfxPtr->firstDecompressed + (i * 0x2000);
*(gMonSpritesGfxPtr->templates + i) = gUnknown_08329D98[i];
@@ -1280,12 +1271,12 @@ void FreeMonSpritesGfx(void)
FREE_AND_SET_NULL(gMonSpritesGfxPtr);
}
-bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon)
+bool32 ShouldPlayNormalMonCry(struct Pokemon *mon)
{
s16 hp, maxHP;
s32 barLevel;
- if (GetMonData(mon, MON_DATA_STATUS) & (STATUS_ANY | STATUS_TOXIC_COUNTER))
+ if (GetMonData(mon, MON_DATA_STATUS) & (STATUS1_ANY | STATUS1_TOXIC_COUNTER))
return FALSE;
hp = GetMonData(mon, MON_DATA_HP);
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 240c64862..278edb6f4 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -8,23 +8,25 @@
#include "string_util.h"
#include "text.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "decompress.h"
#include "task.h"
#include "util.h"
#include "gpu_regs.h"
#include "battle_message.h"
-#include "species.h"
+#include "constants/species.h"
#include "pokedex.h"
#include "palette.h"
#include "international_string_util.h"
#include "safari_zone.h"
#include "battle_anim.h"
+#include "constants/rgb.h"
+#include "data2.h"
struct TestingBar
{
s32 maxValue;
- s32 currValue;
+ s32 oldValue;
s32 receivedValue;
u32 unkC_0:5;
u32 unk10;
@@ -35,7 +37,7 @@ enum
HEALTHBOX_GFX_0,
HEALTHBOX_GFX_1,
HEALTHBOX_GFX_2,
- HEALTHBOX_GFX_3,
+ HEALTHBOX_GFX_HP_BAR_GREEN,
HEALTHBOX_GFX_4,
HEALTHBOX_GFX_5,
HEALTHBOX_GFX_6,
@@ -53,19 +55,19 @@ enum
HEALTHBOX_GFX_18,
HEALTHBOX_GFX_19,
HEALTHBOX_GFX_20,
- HEALTHBOX_GFX_STATUS_PSN_BANK0,
+ HEALTHBOX_GFX_STATUS_PSN_BATTLER0,
HEALTHBOX_GFX_22,
HEALTHBOX_GFX_23,
- HEALTHBOX_GFX_STATUS_PRZ_BANK0,
+ HEALTHBOX_GFX_STATUS_PRZ_BATTLER0,
HEALTHBOX_GFX_25,
HEALTHBOX_GFX_26,
- HEALTHBOX_GFX_STATUS_SLP_BANK0,
+ HEALTHBOX_GFX_STATUS_SLP_BATTLER0,
HEALTHBOX_GFX_28,
HEALTHBOX_GFX_29,
- HEALTHBOX_GFX_STATUS_FRZ_BANK0,
+ HEALTHBOX_GFX_STATUS_FRZ_BATTLER0,
HEALTHBOX_GFX_31,
HEALTHBOX_GFX_32,
- HEALTHBOX_GFX_STATUS_BRN_BANK0,
+ HEALTHBOX_GFX_STATUS_BRN_BATTLER0,
HEALTHBOX_GFX_34,
HEALTHBOX_GFX_35,
HEALTHBOX_GFX_36,
@@ -79,7 +81,7 @@ enum
HEALTHBOX_GFX_44,
HEALTHBOX_GFX_45,
HEALTHBOX_GFX_46,
- HEALTHBOX_GFX_47,
+ HEALTHBOX_GFX_HP_BAR_YELLOW,
HEALTHBOX_GFX_48,
HEALTHBOX_GFX_49,
HEALTHBOX_GFX_50,
@@ -88,7 +90,7 @@ enum
HEALTHBOX_GFX_53,
HEALTHBOX_GFX_54,
HEALTHBOX_GFX_55,
- HEALTHBOX_GFX_56,
+ HEALTHBOX_GFX_HP_BAR_RED,
HEALTHBOX_GFX_57,
HEALTHBOX_GFX_58,
HEALTHBOX_GFX_59,
@@ -103,62 +105,56 @@ enum
HEALTHBOX_GFX_68,
HEALTHBOX_GFX_69,
HEALTHBOX_GFX_70,
- HEALTHBOX_GFX_STATUS_PSN_BANK1,
+ HEALTHBOX_GFX_STATUS_PSN_BATTLER1,
HEALTHBOX_GFX_72,
HEALTHBOX_GFX_73,
- HEALTHBOX_GFX_STATUS_PRZ_BANK1,
+ HEALTHBOX_GFX_STATUS_PRZ_BATTLER1,
HEALTHBOX_GFX_75,
HEALTHBOX_GFX_76,
- HEALTHBOX_GFX_STATUS_SLP_BANK1,
+ HEALTHBOX_GFX_STATUS_SLP_BATTLER1,
HEALTHBOX_GFX_78,
HEALTHBOX_GFX_79,
- HEALTHBOX_GFX_STATUS_FRZ_BANK1,
+ HEALTHBOX_GFX_STATUS_FRZ_BATTLER1,
HEALTHBOX_GFX_81,
HEALTHBOX_GFX_82,
- HEALTHBOX_GFX_STATUS_BRN_BANK1,
+ HEALTHBOX_GFX_STATUS_BRN_BATTLER1,
HEALTHBOX_GFX_84,
HEALTHBOX_GFX_85,
- HEALTHBOX_GFX_STATUS_PSN_BANK2,
+ HEALTHBOX_GFX_STATUS_PSN_BATTLER2,
HEALTHBOX_GFX_87,
HEALTHBOX_GFX_88,
- HEALTHBOX_GFX_STATUS_PRZ_BANK2,
+ HEALTHBOX_GFX_STATUS_PRZ_BATTLER2,
HEALTHBOX_GFX_90,
HEALTHBOX_GFX_91,
- HEALTHBOX_GFX_STATUS_SLP_BANK2,
+ HEALTHBOX_GFX_STATUS_SLP_BATTLER2,
HEALTHBOX_GFX_93,
HEALTHBOX_GFX_94,
- HEALTHBOX_GFX_STATUS_FRZ_BANK2,
+ HEALTHBOX_GFX_STATUS_FRZ_BATTLER2,
HEALTHBOX_GFX_96,
HEALTHBOX_GFX_97,
- HEALTHBOX_GFX_STATUS_BRN_BANK2,
+ HEALTHBOX_GFX_STATUS_BRN_BATTLER2,
HEALTHBOX_GFX_99,
HEALTHBOX_GFX_100,
- HEALTHBOX_GFX_STATUS_PSN_BANK3,
+ HEALTHBOX_GFX_STATUS_PSN_BATTLER3,
HEALTHBOX_GFX_102,
HEALTHBOX_GFX_103,
- HEALTHBOX_GFX_STATUS_PRZ_BANK3,
+ HEALTHBOX_GFX_STATUS_PRZ_BATTLER3,
HEALTHBOX_GFX_105,
HEALTHBOX_GFX_106,
- HEALTHBOX_GFX_STATUS_SLP_BANK3,
+ HEALTHBOX_GFX_STATUS_SLP_BATTLER3,
HEALTHBOX_GFX_108,
HEALTHBOX_GFX_109,
- HEALTHBOX_GFX_STATUS_FRZ_BANK3,
+ HEALTHBOX_GFX_STATUS_FRZ_BATTLER3,
HEALTHBOX_GFX_111,
HEALTHBOX_GFX_112,
- HEALTHBOX_GFX_STATUS_BRN_BANK3,
+ HEALTHBOX_GFX_STATUS_BRN_BATTLER3,
HEALTHBOX_GFX_114,
HEALTHBOX_GFX_115,
HEALTHBOX_GFX_116,
HEALTHBOX_GFX_117,
};
-extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT];
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-
-extern const u8 * const gNatureNamePointers[];
-extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
+extern const u8 *const gNatureNamePointers[];
// strings
extern const u8 gText_Slash[];
@@ -166,8 +162,6 @@ extern const u8 gText_HighlightDarkGrey[];
extern const u8 gText_DynColor2[];
extern const u8 gText_DynColor2Male[];
extern const u8 gText_DynColor1Female[];
-extern const u8 gText_SafariBalls[];
-extern const u8 gText_SafariBallLeft[];
// graphics
extern const u8 gBattleInterface_BallStatusBarGfx[];
@@ -176,10 +170,6 @@ extern const u16 gBattleInterface_BallStatusBarPal[];
extern const u16 gBattleInterface_BallDisplayPal[];
extern const u8 gHealthboxElementsGfxTable[][32];
-// functions
-extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, const u8 *str); // menu.h
-extern void LoadBattleBarGfx(u8 arg0);
-
// this file's functions
static const u8 *GetHealthboxElementGfxPtr(u8 elementId);
@@ -189,28 +179,28 @@ static void RemoveWindowOnHealthbox(u32 windowId);
static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent);
static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId);
-static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2);
-static void sub_80751E4(void *dest, u8 *windowTileData, u32 arg2);
-static void sub_8075170(void *dest, u8 *windowTileData, u32 arg2);
-static void sub_807513C(void *dest, u32 arg1, u32 arg2);
+static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 arg2);
+static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2);
+static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2);
+static void FillHealthboxObject(void *dest, u32 arg1, u32 arg2);
static void sub_8073E08(u8 taskId);
static void sub_8073F98(u8 taskId);
static void sub_8073E64(u8 taskId);
-static void sub_8072924(struct Sprite *sprite);
-static void sub_80728B4(struct Sprite *sprite);
+static void SpriteCB_HealthBoxOther(struct Sprite *sprite);
+static void SpriteCB_HealthBar(struct Sprite *sprite);
static void sub_8074158(struct Sprite *sprite);
static void sub_8074090(struct Sprite *sprite);
static void SpriteCB_StatusSummaryBar(struct Sprite *sprite);
static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite);
static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite);
-static u8 GetStatusIconForBankId(u8 statusElementId, u8 bank);
-static s32 sub_8074DB8(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5);
+static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId);
+static s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5);
static u8 GetScaledExpFraction(s32 currValue, s32 receivedValue, s32 maxValue, u8 scale);
-static void sub_8074B9C(u8 bank, u8 whichBar);
-static u8 sub_8074E8C(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 *arg4, u8 arg5);
+static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar);
+static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale);
static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2);
// const rom data
@@ -286,7 +276,7 @@ static const struct SpriteTemplate sHealthboxSafariSpriteTemplate =
.callback = SpriteCallbackDummy
};
-static const struct OamData sUnknown_0832C1B8 =
+static const struct OamData sOamData_Healthbar =
{
.y = 0,
.affineMode = 0,
@@ -303,43 +293,43 @@ static const struct OamData sUnknown_0832C1B8 =
.affineParam = 0,
};
-static const struct SpriteTemplate sUnknown_0832C1C0[4] =
+static const struct SpriteTemplate sHealthbarSpriteTemplates[MAX_BATTLERS_COUNT] =
{
{
- .tileTag = 0xd704,
- .paletteTag = 0xd704,
- .oam = &sUnknown_0832C1B8,
+ .tileTag = TAG_HEALTHBAR_PLAYER1_TILE,
+ .paletteTag = TAG_HEALTHBAR_PAL,
+ .oam = &sOamData_Healthbar,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80728B4
+ .callback = SpriteCB_HealthBar
},
{
- .tileTag = 0xd705,
- .paletteTag = 0xd704,
- .oam = &sUnknown_0832C1B8,
+ .tileTag = TAG_HEALTHBAR_OPPONENT1_TILE,
+ .paletteTag = TAG_HEALTHBAR_PAL,
+ .oam = &sOamData_Healthbar,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80728B4
+ .callback = SpriteCB_HealthBar
},
{
- .tileTag = 0xd706,
- .paletteTag = 0xd704,
- .oam = &sUnknown_0832C1B8,
+ .tileTag = TAG_HEALTHBAR_PLAYER2_TILE,
+ .paletteTag = TAG_HEALTHBAR_PAL,
+ .oam = &sOamData_Healthbar,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80728B4
+ .callback = SpriteCB_HealthBar
},
{
- .tileTag = 0xd707,
- .paletteTag = 0xd704,
- .oam = &sUnknown_0832C1B8,
+ .tileTag = TAG_HEALTHBAR_OPPONENT2_TILE,
+ .paletteTag = TAG_HEALTHBAR_PAL,
+ .oam = &sOamData_Healthbar,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80728B4
+ .callback = SpriteCB_HealthBar
}
};
@@ -556,13 +546,13 @@ enum
PAL_STATUS_BRN
};
-static const u16 sStatusIconPalettes[] =
+static const u16 sStatusIconColors[] =
{
- 0x6198, // PAL_STATUS_PSN
- 0xEF7, // PAL_STATUS_PAR
- 0x4694, // PAL_STATUS_SLP
- 0x72D1, // PAL_STATUS_FRZ
- 0x29DC // PAL_STATUS_BRN
+ RGB(24, 12, 24), // PAL_STATUS_PSN
+ RGB(23, 23, 3), // PAL_STATUS_PAR
+ RGB(20, 20, 17), // PAL_STATUS_SLP
+ RGB(17, 22, 28), // PAL_STATUS_FRZ
+ RGB(28, 14, 10) // PAL_STATUS_BRN
};
static const struct WindowTemplate sHealthboxWindowTemplate = {0, 0, 0, 8, 2, 0, 0}; // width = 8, height = 2
@@ -658,7 +648,7 @@ static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2)
}
#else
-__attribute__((naked))
+NAKED
static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2)
{
asm(".syntax unified\n\
@@ -893,112 +883,126 @@ void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2)
sub_8072308(arg0, arg2 + 5, 1);
}
-// because the healthbox is too large to fit into one sprite, it is divided into two sprites
-// healthboxSpriteId_1 or healthboxSpriteId refers to the 'main' healthbox
-// healthboxSpriteId_2 refers to the other part
-// there's also one other sprite that appears to be a black square? dont fully understand its role
+// Because the healthbox is too large to fit into one sprite, it is divided into two sprites.
+// healthboxLeft or healthboxMain is the left part that is used as the 'main' sprite.
+// healthboxRight or healthboxOther is the right part of the healthbox.
+// There's also the third sprite under name of healthbarSprite that refers to the healthbar visible on the healtbox.
+
+// data fields for healthboxMain
+// oam.affineParam holds healthboxRight spriteId
+#define hMain_HealthBarSpriteId data[5]
+#define hMain_Battler data[6]
+#define hMain_Data7 data[7]
+
+// data fields for healthboxRight
+#define hOther_HealthBoxSpriteId data[5]
-u8 CreateBankHealthboxSprites(u8 bank)
+// data fields for healthbar
+#define hBar_HealthBoxSpriteId data[5]
+#define hBar_Data6 data[6]
+
+u8 CreateBattlerHealthboxSprites(u8 battlerId)
{
s16 data6 = 0;
- u8 healthboxSpriteId_1, healthboxSpriteId_2;
- u8 unkSpriteId;
- struct Sprite *unkSpritePtr;
+ u8 healthboxLeftSpriteId, healthboxRightSpriteId;
+ u8 healthbarSpriteId;
+ struct Sprite *healthBarSpritePtr;
if (!IsDoubleBattle())
{
- if (GetBankSide(bank) == SIDE_PLAYER)
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
{
- healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
- healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
+ healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
+ healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
- gSprites[healthboxSpriteId_1].oam.shape = 0;
+ gSprites[healthboxLeftSpriteId].oam.shape = 0;
- gSprites[healthboxSpriteId_2].oam.shape = 0;
- gSprites[healthboxSpriteId_2].oam.tileNum += 64;
+ gSprites[healthboxRightSpriteId].oam.shape = 0;
+ gSprites[healthboxRightSpriteId].oam.tileNum += 64;
}
else
{
- healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1);
- healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1);
+ healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1);
+ healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1);
- gSprites[healthboxSpriteId_2].oam.tileNum += 32;
+ gSprites[healthboxRightSpriteId].oam.tileNum += 32;
data6 = 2;
}
- gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
- gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
- gSprites[healthboxSpriteId_2].callback = sub_8072924;
+ gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId;
+
+ gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId;
+ gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther;
}
else
{
- if (GetBankSide(bank) == SIDE_PLAYER)
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
{
- healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
- healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
+ healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);
+ healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);
- gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
+ gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId;
- gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
- gSprites[healthboxSpriteId_2].oam.tileNum += 32;
- gSprites[healthboxSpriteId_2].callback = sub_8072924;
+ gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId;
+ gSprites[healthboxRightSpriteId].oam.tileNum += 32;
+ gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther;
data6 = 1;
}
else
{
- healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
- healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
+ healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);
+ healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1);
- gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
+ gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId;
- gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
- gSprites[healthboxSpriteId_2].oam.tileNum += 32;
- gSprites[healthboxSpriteId_2].callback = sub_8072924;
+ gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId;
+ gSprites[healthboxRightSpriteId].oam.tileNum += 32;
+ gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther;
data6 = 2;
}
}
- unkSpriteId = CreateSpriteAtEnd(&sUnknown_0832C1C0[gBanksByIdentity[bank]], 140, 60, 0);
- unkSpritePtr = &gSprites[unkSpriteId];
- SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBankSide(bank)]);
- unkSpritePtr->subspriteMode = 2;
- unkSpritePtr->oam.priority = 1;
+ healthbarSpriteId = CreateSpriteAtEnd(&sHealthbarSpriteTemplates[gBattlerPositions[battlerId]], 140, 60, 0);
+ healthBarSpritePtr = &gSprites[healthbarSpriteId];
+ SetSubspriteTables(healthBarSpritePtr, &sUnknown_0832C28C[GetBattlerSide(battlerId)]);
+ healthBarSpritePtr->subspriteMode = 2;
+ healthBarSpritePtr->oam.priority = 1;
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + healthBarSpritePtr->oam.tileNum * 32), 64);
- gSprites[healthboxSpriteId_1].data5 = unkSpriteId;
- gSprites[healthboxSpriteId_1].data6 = bank;
- gSprites[healthboxSpriteId_1].invisible = 1;
+ gSprites[healthboxLeftSpriteId].hMain_HealthBarSpriteId = healthbarSpriteId;
+ gSprites[healthboxLeftSpriteId].hMain_Battler = battlerId;
+ gSprites[healthboxLeftSpriteId].invisible = 1;
- gSprites[healthboxSpriteId_2].invisible = 1;
+ gSprites[healthboxRightSpriteId].invisible = 1;
- unkSpritePtr->data5 = healthboxSpriteId_1;
- unkSpritePtr->data6 = data6;
- unkSpritePtr->invisible = 1;
+ healthBarSpritePtr->hBar_HealthBoxSpriteId = healthboxLeftSpriteId;
+ healthBarSpritePtr->hBar_Data6 = data6;
+ healthBarSpritePtr->invisible = 1;
- return healthboxSpriteId_1;
+ return healthboxLeftSpriteId;
}
u8 CreateSafariPlayerHealthboxSprites(void)
{
- u8 healthboxSpriteId_1, healthboxSpriteId_2;
+ u8 healthboxLeftSpriteId, healthboxRightSpriteId;
- healthboxSpriteId_1 = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1);
- healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1);
+ healthboxLeftSpriteId = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1);
+ healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1);
- gSprites[healthboxSpriteId_1].oam.shape = 0;
- gSprites[healthboxSpriteId_2].oam.shape = 0;
+ gSprites[healthboxLeftSpriteId].oam.shape = 0;
+ gSprites[healthboxRightSpriteId].oam.shape = 0;
- gSprites[healthboxSpriteId_2].oam.tileNum += 64;
+ gSprites[healthboxRightSpriteId].oam.tileNum += 64;
- gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
- gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
+ gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId;
+ gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId;
- gSprites[healthboxSpriteId_2].callback = sub_8072924;
+ gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther;
- return healthboxSpriteId_1;
+ return healthboxLeftSpriteId;
}
static const u8 *GetHealthboxElementGfxPtr(u8 elementId)
@@ -1006,62 +1010,63 @@ static const u8 *GetHealthboxElementGfxPtr(u8 elementId)
return gHealthboxElementsGfxTable[elementId];
}
-static void sub_80728B4(struct Sprite *sprite)
+// Syncs the position of healthbar accordingly with the healthbox.
+static void SpriteCB_HealthBar(struct Sprite *sprite)
{
- u8 var = sprite->data5;
+ u8 healthboxSpriteId = sprite->hBar_HealthBoxSpriteId;
- switch (sprite->data6)
+ switch (sprite->hBar_Data6)
{
case 0:
- sprite->pos1.x = gSprites[var].pos1.x + 16;
- sprite->pos1.y = gSprites[var].pos1.y;
+ sprite->pos1.x = gSprites[healthboxSpriteId].pos1.x + 16;
+ sprite->pos1.y = gSprites[healthboxSpriteId].pos1.y;
break;
case 1:
- sprite->pos1.x = gSprites[var].pos1.x + 16;
- sprite->pos1.y = gSprites[var].pos1.y;
+ sprite->pos1.x = gSprites[healthboxSpriteId].pos1.x + 16;
+ sprite->pos1.y = gSprites[healthboxSpriteId].pos1.y;
break;
case 2:
default:
- sprite->pos1.x = gSprites[var].pos1.x + 8;
- sprite->pos1.y = gSprites[var].pos1.y;
+ sprite->pos1.x = gSprites[healthboxSpriteId].pos1.x + 8;
+ sprite->pos1.y = gSprites[healthboxSpriteId].pos1.y;
break;
}
- sprite->pos2.x = gSprites[var].pos2.x;
- sprite->pos2.y = gSprites[var].pos2.y;
+ sprite->pos2.x = gSprites[healthboxSpriteId].pos2.x;
+ sprite->pos2.y = gSprites[healthboxSpriteId].pos2.y;
}
-static void sub_8072924(struct Sprite *sprite)
+static void SpriteCB_HealthBoxOther(struct Sprite *sprite)
{
- u8 otherSpriteId = sprite->data5;
+ u8 healthboxMainSpriteId = sprite->hOther_HealthBoxSpriteId;
- sprite->pos1.x = gSprites[otherSpriteId].pos1.x + 64;
- sprite->pos1.y = gSprites[otherSpriteId].pos1.y;
+ sprite->pos1.x = gSprites[healthboxMainSpriteId].pos1.x + 64;
+ sprite->pos1.y = gSprites[healthboxMainSpriteId].pos1.y;
- sprite->pos2.x = gSprites[otherSpriteId].pos2.x;
- sprite->pos2.y = gSprites[otherSpriteId].pos2.y;
+ sprite->pos2.x = gSprites[healthboxMainSpriteId].pos2.x;
+ sprite->pos2.y = gSprites[healthboxMainSpriteId].pos2.y;
}
-void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 receivedValue)
+void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldVal, s32 receivedValue)
{
- gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId = healthboxSpriteId;
- gBattleSpritesDataPtr->battleBars[bank].maxValue = maxVal;
- gBattleSpritesDataPtr->battleBars[bank].currentValue = currVal;
- gBattleSpritesDataPtr->battleBars[bank].receivedValue = receivedValue;
- gBattleSpritesDataPtr->battleBars[bank].field_10 = -32768;
+ gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId = healthboxSpriteId;
+ gBattleSpritesDataPtr->battleBars[battlerId].maxValue = maxVal;
+ gBattleSpritesDataPtr->battleBars[battlerId].oldValue = oldVal;
+ gBattleSpritesDataPtr->battleBars[battlerId].receivedValue = receivedValue;
+ gBattleSpritesDataPtr->battleBars[battlerId].currValue = -32768;
}
void SetHealthboxSpriteInvisible(u8 healthboxSpriteId)
{
gSprites[healthboxSpriteId].invisible = 1;
- gSprites[gSprites[healthboxSpriteId].data5].invisible = 1;
+ gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = 1;
gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 1;
}
void SetHealthboxSpriteVisible(u8 healthboxSpriteId)
{
gSprites[healthboxSpriteId].invisible = 0;
- gSprites[gSprites[healthboxSpriteId].data5].invisible = 0;
+ gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = 0;
gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 0;
}
@@ -1074,11 +1079,11 @@ static void UpdateSpritePos(u8 spriteId, s16 x, s16 y)
void DestoryHealthboxSprite(u8 healthboxSpriteId)
{
DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]);
- DestroySprite(&gSprites[gSprites[healthboxSpriteId].data5]);
+ DestroySprite(&gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId]);
DestroySprite(&gSprites[healthboxSpriteId]);
}
-void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly)
+void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBattlerOnly)
{
}
@@ -1087,49 +1092,49 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority)
{
s32 i;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- u8 healthboxSpriteId_1 = gHealthBoxesIds[i];
- u8 healthboxSpriteId_2 = gSprites[gHealthBoxesIds[i]].oam.affineParam;
- u8 healthboxSpriteId_3 = gSprites[gHealthBoxesIds[i]].data5;
+ u8 healthboxLeftSpriteId = gHealthboxSpriteIds[i];
+ u8 healthboxRightSpriteId = gSprites[gHealthboxSpriteIds[i]].oam.affineParam;
+ u8 healthbarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId;
- gSprites[healthboxSpriteId_1].oam.priority = priority;
- gSprites[healthboxSpriteId_2].oam.priority = priority;
- gSprites[healthboxSpriteId_3].oam.priority = priority;
+ gSprites[healthboxLeftSpriteId].oam.priority = priority;
+ gSprites[healthboxRightSpriteId].oam.priority = priority;
+ gSprites[healthbarSpriteId].oam.priority = priority;
}
}
-void SetBankHealthboxSpritePos(u8 bank)
+void InitBattlerHealthboxCoords(u8 battler)
{
s16 x = 0, y = 0;
if (!IsDoubleBattle())
{
- if (GetBankSide(bank) != SIDE_PLAYER)
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
x = 44, y = 30;
else
x = 158, y = 88;
}
else
{
- switch (GetBankIdentity(bank))
+ switch (GetBattlerPosition(battler))
{
- case IDENTITY_PLAYER_MON1:
+ case B_POSITION_PLAYER_LEFT:
x = 159, y = 76;
break;
- case IDENTITY_PLAYER_MON2:
+ case B_POSITION_PLAYER_RIGHT:
x = 171, y = 101;
break;
- case IDENTITY_OPPONENT_MON1:
+ case B_POSITION_OPPONENT_LEFT:
x = 44, y = 19;
break;
- case IDENTITY_OPPONENT_MON2:
+ case B_POSITION_OPPONENT_RIGHT:
x = 32, y = 44;
break;
}
}
- UpdateSpritePos(gHealthBoxesIds[bank], x, y);
+ UpdateSpritePos(gHealthboxSpriteIds[battler], x, y);
}
static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
@@ -1156,7 +1161,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId);
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
- if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
+ if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER)
{
objVram = (void*)(OBJ_VRAM0);
if (!IsDoubleBattle())
@@ -1169,7 +1174,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
objVram = (void*)(OBJ_VRAM0);
objVram += spriteTileNum + 0x400;
}
- sub_8075198(objVram, windowTileData, 3);
+ TextIntoHealthboxObject(objVram, windowTileData, 3);
RemoveWindowOnHealthbox(windowId);
}
@@ -1180,7 +1185,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
u8 text[32];
void *objVram;
- if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER && !IsDoubleBattle())
+ if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER && !IsDoubleBattle())
{
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
if (maxOrCurrent != HP_CURRENT) // singles, max
@@ -1189,7 +1194,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 2, &windowId);
objVram = (void*)(OBJ_VRAM0);
objVram += spriteTileNum + 0xB40;
- sub_8075170(objVram, windowTileData, 2);
+ HpTextIntoHealthboxObject(objVram, windowTileData, 2);
RemoveWindowOnHealthbox(windowId);
}
else // singles, current
@@ -1200,21 +1205,20 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, 2, &windowId);
objVram = (void*)(OBJ_VRAM0);
objVram += spriteTileNum + 0x3E0;
- sub_8075170(objVram, windowTileData, 1);
+ HpTextIntoHealthboxObject(objVram, windowTileData, 1);
objVram = (void*)(OBJ_VRAM0);
objVram += spriteTileNum + 0xB00;
- sub_8075170(objVram, windowTileData + 0x20, 2);
+ HpTextIntoHealthboxObject(objVram, windowTileData + 0x20, 2);
RemoveWindowOnHealthbox(windowId);
}
-
}
else
{
- u8 bank;
+ u8 battler;
memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4));
- bank = gSprites[healthboxSpriteId].data6;
- if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT)
+ battler = gSprites[healthboxSpriteId].hMain_Battler;
+ if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent);
}
@@ -1223,7 +1227,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
u32 var;
u8 i;
- if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
+ if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
if (maxOrCurrent == HP_CURRENT)
var = 29;
@@ -1258,18 +1262,18 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
u8 text[32];
void *objVram;
- if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
+ if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER)
{
- if (gBattleSpritesDataPtr->bankData[gSprites[healthboxSpriteId].data6].hpNumbersNoBars) // don't print text if only bars are visible
+ if (gBattleSpritesDataPtr->battlerData[gSprites[healthboxSpriteId].data[6]].hpNumbersNoBars) // don't print text if only bars are visible
{
- spriteTileNum = gSprites[gSprites[healthboxSpriteId].data5].oam.tileNum * 32;
+ spriteTileNum = gSprites[gSprites[healthboxSpriteId].data[5]].oam.tileNum * 32;
objVram = (void*)(OBJ_VRAM0) + spriteTileNum;
if (maxOrCurrent != HP_CURRENT) // doubles, max hp
{
ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3);
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 0, &windowId);
- sub_8075170((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2);
+ HpTextIntoHealthboxObject((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2);
RemoveWindowOnHealthbox(windowId);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116),
(void*)(OBJ_VRAM0 + 0x680) + (gSprites[healthboxSpriteId].oam.tileNum * 32),
@@ -1281,20 +1285,20 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
text[3] = CHAR_SLASH;
text[4] = EOS;
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, 0, &windowId);
- sub_807513C(objVram, 0, 3);
- sub_8075170((void*)(OBJ_VRAM0 + 0x60) + spriteTileNum, windowTileData, 3);
+ FillHealthboxObject(objVram, 0, 3); // Erases HP bar leftover.
+ HpTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x60) + spriteTileNum, windowTileData, 3);
RemoveWindowOnHealthbox(windowId);
}
}
}
else
{
- u8 bank;
+ u8 battlerId;
memcpy(text, sUnknown_0832C3D8, sizeof(sUnknown_0832C3D8));
- bank = gSprites[healthboxSpriteId].data6;
+ battlerId = gSprites[healthboxSpriteId].hMain_Battler;
- if (gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) // don't print text if only bars are visible
+ if (gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) // don't print text if only bars are visible
{
u8 var = 4;
u8 r7;
@@ -1304,7 +1308,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
if (maxOrCurrent == HP_CURRENT)
var = 0;
- r7 = gSprites[healthboxSpriteId].data5;
+ r7 = gSprites[healthboxSpriteId].data[5];
txtPtr = ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3);
if (!maxOrCurrent)
StringCopy(txtPtr, gText_Slash);
@@ -1335,7 +1339,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
}
else
{
- if (GetBankSide(bank) == SIDE_PLAYER) // impossible to reach part, because the bank is from the opponent's side
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) // Impossible to reach part, because the battlerId is from the opponent's side.
{
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116),
(void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * 32),
@@ -1346,15 +1350,16 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
}
}
-static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon)
+// Prints mon's nature, catch and flee rate. Probably used to test pokeblock-related features.
+static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon)
{
u8 text[20];
s32 j, var2;
u8 *barFontGfx;
- u8 i, var, nature, healthboxSpriteId_2;
+ u8 i, var, nature, healthBarSpriteId;
memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4));
- barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBankIdentity(gSprites[healthboxSpriteId].data6) * 384)];
+ barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].hMain_Battler) * 384)];
var = 5;
nature = GetNature(mon);
StringCopy(text + 6, gNatureNamePointers[nature]);
@@ -1385,26 +1390,26 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon)
barFontGfx += 0x20;
}
- healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5;
- ConvertIntToDecimalStringN(text + 6, gBattleStruct->field_7C, STR_CONV_MODE_RIGHT_ALIGN, 2);
- ConvertIntToDecimalStringN(text + 9, gBattleStruct->field_7B, STR_CONV_MODE_RIGHT_ALIGN, 2);
+ healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId;
+ ConvertIntToDecimalStringN(text + 6, gBattleStruct->safariCatchFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);
+ ConvertIntToDecimalStringN(text + 9, gBattleStruct->safariEscapeFactor, STR_CONV_MODE_RIGHT_ALIGN, 2);
text[5] = CHAR_SPACE;
text[8] = CHAR_SLASH;
RenderTextFont9(gMonSpritesGfxPtr->barFontGfx, 9, text);
- j = healthboxSpriteId_2; // needed to match for some reason
+ j = healthBarSpriteId; // Needed to match for some reason.
for (j = 0; j < 5; j++)
{
if (j <= 1)
{
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],
- (void*)(OBJ_VRAM0) + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + j) * 32,
+ (void*)(OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum + 2 + j) * 32,
32);
}
else
{
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],
- (void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthboxSpriteId_2].oam.tileNum) * 32,
+ (void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthBarSpriteId].oam.tileNum) * 32,
32);
}
}
@@ -1413,19 +1418,19 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon)
void SwapHpBarsWithHpText(void)
{
s32 i;
- u8 spriteId;
+ u8 healthBarSpriteId;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gSprites[gHealthBoxesIds[i]].callback == SpriteCallbackDummy
- && GetBankSide(i) != SIDE_OPPONENT
- && (IsDoubleBattle() || GetBankSide(i) != SIDE_PLAYER))
+ if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy
+ && GetBattlerSide(i) != B_SIDE_OPPONENT
+ && (IsDoubleBattle() || GetBattlerSide(i) != B_SIDE_PLAYER))
{
bool8 noBars;
- gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars ^= 1;
- noBars = gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars;
- if (GetBankSide(i) == SIDE_PLAYER)
+ gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars ^= 1;
+ noBars = gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars;
+ if (GetBattlerSide(i) == B_SIDE_PLAYER)
{
if (!IsDoubleBattle())
continue;
@@ -1434,17 +1439,17 @@ void SwapHpBarsWithHpText(void)
if (noBars == TRUE) // bars to text
{
- spriteId = gSprites[gHealthBoxesIds[i]].data5;
+ healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId;
- CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100);
- UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT);
- UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX);
+ CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 0x100);
+ UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);
+ UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);
}
else // text to bars
{
- UpdateStatusIconInHealthbox(gHealthBoxesIds[i]);
- UpdateHealthboxAttribute(gHealthBoxesIds[i], &gPlayerParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR);
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthBoxesIds[i]].oam.tileNum * 32), 32);
+ UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gPlayerParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * 32), 32);
}
}
else
@@ -1453,42 +1458,49 @@ void SwapHpBarsWithHpText(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
{
- sub_80730D4(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]]);
+ // Most likely a debug function.
+ PrintSafariMonInfo(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]]);
}
else
{
- spriteId = gSprites[gHealthBoxesIds[i]].data5;
+ healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId;
- CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100);
- UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT);
- UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX);
+ CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 0x100);
+ UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);
+ UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);
}
}
else // text to bars
{
- UpdateStatusIconInHealthbox(gHealthBoxesIds[i]);
- UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR);
+ UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_NICK);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_NICK);
}
}
- gSprites[gHealthBoxesIds[i]].data7 ^= 1;
+ gSprites[gHealthboxSpriteIds[i]].hMain_Data7 ^= 1;
}
}
}
-u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart)
+#define tBattler data[0]
+#define tSummaryBarSpriteId data[1]
+#define tBallIconSpriteId(n) data[3 + n]
+#define tIsBattleStart data[10]
+#define tData15 data[15]
+
+u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart)
{
bool8 isOpponent;
s16 bar_X, bar_Y, bar_pos2_X, bar_data0;
s32 i, j, var;
- u8 barSpriteId;
- u8 ballIconSpritesIds[6];
+ u8 summaryBarSpriteId;
+ u8 ballIconSpritesIds[PARTY_SIZE];
u8 taskId;
- if (!arg2 || GetBankIdentity(bank) != IDENTITY_OPPONENT_MON2)
+ if (!arg2 || GetBattlerPosition(battlerId) != B_POSITION_OPPONENT_RIGHT)
{
- if (GetBankSide(bank) == SIDE_PLAYER)
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
{
isOpponent = FALSE;
bar_X = 136, bar_Y = 96;
@@ -1521,22 +1533,22 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
LoadSpritePalette(&sStatusSummaryBarSpritePal);
LoadSpritePalette(&sStatusSummaryBallsSpritePal);
- barSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10);
- SetSubspriteTables(&gSprites[barSpriteId], sStatusSummaryBar_SubspriteTable);
- gSprites[barSpriteId].pos2.x = bar_pos2_X;
- gSprites[barSpriteId].data0 = bar_data0;
+ summaryBarSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10);
+ SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable);
+ gSprites[summaryBarSpriteId].pos2.x = bar_pos2_X;
+ gSprites[summaryBarSpriteId].data[0] = bar_data0;
if (isOpponent)
{
- gSprites[barSpriteId].pos1.x -= 96;
- gSprites[barSpriteId].oam.matrixNum = 8;
+ gSprites[summaryBarSpriteId].pos1.x -= 96;
+ gSprites[summaryBarSpriteId].oam.matrixNum = 8;
}
else
{
- gSprites[barSpriteId].pos1.x += 96;
+ gSprites[summaryBarSpriteId].pos1.x += 96;
}
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
ballIconSpritesIds[i] = CreateSpriteAtEnd(&sStatusSummaryBallsSpriteTemplates[isOpponent], bar_X, bar_Y - 4, 9);
@@ -1549,34 +1561,34 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
gSprites[ballIconSpritesIds[i]].pos2.y = 0;
}
- gSprites[ballIconSpritesIds[i]].data0 = barSpriteId;
+ gSprites[ballIconSpritesIds[i]].data[0] = summaryBarSpriteId;
if (!isOpponent)
{
gSprites[ballIconSpritesIds[i]].pos1.x += 10 * i + 24;
- gSprites[ballIconSpritesIds[i]].data1 = i * 7 + 10;
+ gSprites[ballIconSpritesIds[i]].data[1] = i * 7 + 10;
gSprites[ballIconSpritesIds[i]].pos2.x = 120;
}
else
{
gSprites[ballIconSpritesIds[i]].pos1.x -= 10 * (5 - i) + 24;
- gSprites[ballIconSpritesIds[i]].data1 = (6 - i) * 7 + 10;
+ gSprites[ballIconSpritesIds[i]].data[1] = (6 - i) * 7 + 10;
gSprites[ballIconSpritesIds[i]].pos2.x = -120;
}
- gSprites[ballIconSpritesIds[i]].data2 = isOpponent;
+ gSprites[ballIconSpritesIds[i]].data[2] = isOpponent;
}
- if (GetBankSide(bank) == SIDE_PLAYER)
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;
- gSprites[ballIconSpritesIds[i]].data7 = 1;
+ gSprites[ballIconSpritesIds[i]].data[7] = 1;
}
else if (partyInfo[i].hp == 0) // fainted mon
{
@@ -1590,12 +1602,12 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
}
else
{
- for (i = 0, var = 5, j = 0; j < 6; j++)
+ for (i = 0, var = 5, j = 0; j < PARTY_SIZE; j++)
{
if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[var]].oam.tileNum += 1;
- gSprites[ballIconSpritesIds[var]].data7 = 1;
+ gSprites[ballIconSpritesIds[var]].data[7] = 1;
var--;
continue;
}
@@ -1619,12 +1631,12 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
{
if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS))
{
- for (var = 5, i = 0; i < 6; i++)
+ for (var = 5, i = 0; i < PARTY_SIZE; i++)
{
if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[var]].oam.tileNum += 1;
- gSprites[ballIconSpritesIds[var]].data7 = 1;
+ gSprites[ballIconSpritesIds[var]].data[7] = 1;
}
else if (partyInfo[i].hp == 0) // fainted mon
{
@@ -1639,12 +1651,12 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
}
else
{
- for (var = 0, i = 0, j = 0; j < 6; j++)
+ for (var = 0, i = 0, j = 0; j < PARTY_SIZE; j++)
{
if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;
- gSprites[ballIconSpritesIds[i]].data7 = 1;
+ gSprites[ballIconSpritesIds[i]].data[7] = 1;
i++;
continue;
}
@@ -1666,13 +1678,13 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
}
taskId = CreateTask(TaskDummy, 5);
- gTasks[taskId].data[0] = bank;
- gTasks[taskId].data[1] = barSpriteId;
+ gTasks[taskId].tBattler = battlerId;
+ gTasks[taskId].tSummaryBarSpriteId = summaryBarSpriteId;
- for (i = 0; i < 6; i++)
- gTasks[taskId].data[3 + i] = ballIconSpritesIds[i];
+ for (i = 0; i < PARTY_SIZE; i++)
+ gTasks[taskId].tBallIconSpriteId(i) = ballIconSpritesIds[i];
- gTasks[taskId].data[10] = isBattleStart;
+ gTasks[taskId].tIsBattleStart = isBattleStart;
if (isBattleStart)
{
@@ -1683,54 +1695,54 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
return taskId;
}
-void sub_8073C30(u8 taskId)
+void Task_HidePartyStatusSummary(u8 taskId)
{
- u8 sp[6];
- u8 r7;
- u8 r10;
- u8 bank;
+ u8 ballIconSpriteIds[PARTY_SIZE];
+ bool8 isBattleStart;
+ u8 summaryBarSpriteId;
+ u8 battlerId;
s32 i;
- r7 = gTasks[taskId].data[10];
- r10 = gTasks[taskId].data[1];
- bank = gTasks[taskId].data[0];
+ isBattleStart = gTasks[taskId].tIsBattleStart;
+ summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;
+ battlerId = gTasks[taskId].tBattler;
- for (i = 0; i < 6; i++)
- sp[i] = gTasks[taskId].data[3 + i];
+ for (i = 0; i < PARTY_SIZE; i++)
+ ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i);
- SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x10);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
- gTasks[taskId].data[15] = 16;
+ gTasks[taskId].tData15 = 16;
- for (i = 0; i < 6; i++)
- gSprites[sp[i]].oam.objMode = 1;
+ for (i = 0; i < PARTY_SIZE; i++)
+ gSprites[ballIconSpriteIds[i]].oam.objMode = 1;
- gSprites[r10].oam.objMode = 1;
+ gSprites[summaryBarSpriteId].oam.objMode = 1;
- if (r7 != 0)
+ if (isBattleStart)
{
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
- if (GetBankSide(bank) != SIDE_PLAYER)
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
{
- gSprites[sp[5 - i]].data1 = 7 * i;
- gSprites[sp[5 - i]].data3 = 0;
- gSprites[sp[5 - i]].data4 = 0;
- gSprites[sp[5 - i]].callback = sub_8074158;
+ gSprites[ballIconSpriteIds[5 - i]].data[1] = 7 * i;
+ gSprites[ballIconSpriteIds[5 - i]].data[3] = 0;
+ gSprites[ballIconSpriteIds[5 - i]].data[4] = 0;
+ gSprites[ballIconSpriteIds[5 - i]].callback = sub_8074158;
}
else
{
- gSprites[sp[i]].data1 = 7 * i;
- gSprites[sp[i]].data3 = 0;
- gSprites[sp[i]].data4 = 0;
- gSprites[sp[i]].callback = sub_8074158;
+ gSprites[ballIconSpriteIds[i]].data[1] = 7 * i;
+ gSprites[ballIconSpriteIds[i]].data[3] = 0;
+ gSprites[ballIconSpriteIds[i]].data[4] = 0;
+ gSprites[ballIconSpriteIds[i]].callback = sub_8074158;
}
}
- gSprites[r10].data0 /= 2;
- gSprites[r10].data1 = 0;
- gSprites[r10].callback = sub_8074090;
- SetSubspriteTables(&gSprites[r10], sUnknown_0832C2CC);
+ gSprites[summaryBarSpriteId].data[0] /= 2;
+ gSprites[summaryBarSpriteId].data[1] = 0;
+ gSprites[summaryBarSpriteId].callback = sub_8074090;
+ SetSubspriteTables(&gSprites[summaryBarSpriteId], sUnknown_0832C2CC);
gTasks[taskId].func = sub_8073E08;
}
else
@@ -1741,54 +1753,50 @@ void sub_8073C30(u8 taskId)
static void sub_8073E08(u8 taskId)
{
- u16 temp = gTasks[taskId].data[11]++;
-
- if (!(temp & 1))
+ if ((gTasks[taskId].data[11]++ % 2) == 0)
{
- gTasks[taskId].data[15]--;
- if (gTasks[taskId].data[15] < 0)
+ if (--gTasks[taskId].tData15 < 0)
return;
SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8));
}
- if (gTasks[taskId].data[15] == 0)
+ if (gTasks[taskId].tData15 == 0)
gTasks[taskId].func = sub_8073E64;
}
static void sub_8073E64(u8 taskId)
{
- u8 sp[6];
+ u8 ballIconSpriteIds[PARTY_SIZE];
s32 i;
- u8 bank = gTasks[taskId].data[0];
- gTasks[taskId].data[15]--;
- if (gTasks[taskId].data[15] == -1)
+ u8 battlerId = gTasks[taskId].tBattler;
+ if (--gTasks[taskId].tData15 == -1)
{
- u8 var = gTasks[taskId].data[1];
+ u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;
- for (i = 0; i < 6; i++)
- sp[i] = gTasks[taskId].data[3 + i];
+ for (i = 0; i < PARTY_SIZE; i++)
+ ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i);
gBattleSpritesDataPtr->animationData->field_9_x1C--;
- if (!gBattleSpritesDataPtr->animationData->field_9_x1C)
+ if (gBattleSpritesDataPtr->animationData->field_9_x1C == 0)
{
- DestroySpriteAndFreeResources(&gSprites[var]);
- DestroySpriteAndFreeResources(&gSprites[sp[0]]);
+ DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]);
+ DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]);
}
else
{
- FreeSpriteOamMatrix(&gSprites[var]);
- DestroySprite(&gSprites[var]);
- FreeSpriteOamMatrix(&gSprites[sp[0]]);
- DestroySprite(&gSprites[sp[0]]);
+ FreeSpriteOamMatrix(&gSprites[summaryBarSpriteId]);
+ DestroySprite(&gSprites[summaryBarSpriteId]);
+ FreeSpriteOamMatrix(&gSprites[ballIconSpriteIds[0]]);
+ DestroySprite(&gSprites[ballIconSpriteIds[0]]);
}
- for (i = 1; i < 6; i++)
- DestroySprite(&gSprites[sp[i]]);
+ for (i = 1; i < PARTY_SIZE; i++)
+ DestroySprite(&gSprites[ballIconSpriteIds[i]]);
}
- else if (gTasks[taskId].data[15] == -3)
+ else if (gTasks[taskId].tData15 == -3)
{
- gBattleSpritesDataPtr->healthBoxesData[bank].flag_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0;
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
DestroyTask(taskId);
@@ -1797,51 +1805,56 @@ static void sub_8073E64(u8 taskId)
static void sub_8073F98(u8 taskId)
{
- u8 sp[6];
+ u8 ballIconSpriteIds[PARTY_SIZE];
s32 i;
+ u8 battlerId = gTasks[taskId].tBattler;
- u8 bank = gTasks[taskId].data[0];
- gTasks[taskId].data[15]--;
- if (gTasks[taskId].data[15] >= 0)
+ if (--gTasks[taskId].tData15 >= 0)
{
- SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8));
+ SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tData15) | ((16 - gTasks[taskId].tData15) << 8));
}
- else if (gTasks[taskId].data[15] == -1)
+ else if (gTasks[taskId].tData15 == -1)
{
- u8 var = gTasks[taskId].data[1];
+ u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId;
- for (i = 0; i < 6; i++)
- sp[i] = gTasks[taskId].data[3 + i];
+ for (i = 0; i < PARTY_SIZE; i++)
+ ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i);
- DestroySpriteAndFreeResources(&gSprites[var]);
- DestroySpriteAndFreeResources(&gSprites[sp[0]]);
+ DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]);
+ DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]);
- for (i = 1; i < 6; i++)
- DestroySprite(&gSprites[sp[i]]);
+ for (i = 1; i < PARTY_SIZE; i++)
+ DestroySprite(&gSprites[ballIconSpriteIds[i]]);
}
- else if (gTasks[taskId].data[15] == -3)
+ else if (gTasks[taskId].tData15 == -3)
{
- gBattleSpritesDataPtr->healthBoxesData[bank].flag_x1 = 0;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0;
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
DestroyTask(taskId);
}
}
+#undef tBattler
+#undef tSummaryBarSpriteId
+#undef tBallIconSpriteId
+#undef tIsBattleStart
+#undef tData15
+
static void SpriteCB_StatusSummaryBar(struct Sprite *sprite)
{
if (sprite->pos2.x != 0)
- sprite->pos2.x += sprite->data0;
+ sprite->pos2.x += sprite->data[0];
}
static void sub_8074090(struct Sprite *sprite)
{
- sprite->data1 += 32;
- if (sprite->data0 > 0)
- sprite->pos2.x += sprite->data1 >> 4;
+ sprite->data[1] += 32;
+ if (sprite->data[0] > 0)
+ sprite->pos2.x += sprite->data[1] >> 4;
else
- sprite->pos2.x -= sprite->data1 >> 4;
- sprite->data1 &= 0xF;
+ sprite->pos2.x -= sprite->data[1] >> 4;
+ sprite->data[1] &= 0xF;
}
static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
@@ -1850,16 +1863,16 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
u16 var2;
s8 pan;
- if (sprite->data1 > 0)
+ if (sprite->data[1] > 0)
{
- sprite->data1--;
+ sprite->data[1]--;
return;
}
- var1 = sprite->data2;
- var2 = sprite->data3;
+ var1 = sprite->data[2];
+ var2 = sprite->data[3];
var2 += 56;
- sprite->data3 = var2 & 0xFFF0;
+ sprite->data[3] = var2 & 0xFFF0;
if (var1 != 0)
{
@@ -1880,7 +1893,7 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
if (var1 != 0)
pan = PAN_SIDE_PLAYER;
- if (sprite->data7 != 0)
+ if (sprite->data[7] != 0)
PlaySE2WithPanning(SE_TB_KARA, pan);
else
PlaySE1WithPanning(SE_TB_KON, pan);
@@ -1894,15 +1907,15 @@ static void sub_8074158(struct Sprite *sprite)
u8 var1;
u16 var2;
- if (sprite->data1 > 0)
+ if (sprite->data[1] > 0)
{
- sprite->data1--;
+ sprite->data[1]--;
return;
}
- var1 = sprite->data2;
- var2 = sprite->data3;
+ var1 = sprite->data[2];
+ var2 = sprite->data[3];
var2 += 56;
- sprite->data3 = var2 & 0xFFF0;
+ sprite->data[3] = var2 & 0xFFF0;
if (var1 != 0)
sprite->pos2.x += var2 >> 4;
else
@@ -1917,7 +1930,7 @@ static void sub_8074158(struct Sprite *sprite)
static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite)
{
- u8 barSpriteId = sprite->data0;
+ u8 barSpriteId = sprite->data[0];
sprite->pos2.x = gSprites[barSpriteId].pos2.x;
sprite->pos2.y = gSprites[barSpriteId].pos2.y;
@@ -1964,19 +1977,19 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
- if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
+ if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
- sub_8075198((void*)(0x6010040 + spriteTileNum), windowTileData, 6);
+ TextIntoHealthboxObject((void*)(VRAM + 0x10040 + spriteTileNum), windowTileData, 6);
ptr = (void*)(OBJ_VRAM0);
if (!IsDoubleBattle())
ptr += spriteTileNum + 0x800;
else
ptr += spriteTileNum + 0x400;
- sub_8075198(ptr, windowTileData + 0xC0, 1);
+ TextIntoHealthboxObject(ptr, windowTileData + 0xC0, 1);
}
else
{
- sub_8075198((void*)(0x6010020 + spriteTileNum), windowTileData, 7);
+ TextIntoHealthboxObject((void*)(VRAM + 0x10020 + spriteTileNum), windowTileData, 7);
}
RemoveWindowOnHealthbox(windowId);
@@ -1984,41 +1997,41 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus)
{
- u8 bank, healthboxSpriteId_2;
+ u8 battlerId, healthBarSpriteId;
if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
return;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
return;
- bank = gSprites[healthboxSpriteId].data6;
- if (GetBankSide(bank) == SIDE_PLAYER)
+ battlerId = gSprites[healthboxSpriteId].hMain_Battler;
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
return;
- if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT))
+ if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT))
return;
- healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5;
+ healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId;
if (noStatus)
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * 32), 32);
else
- CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32);
+ CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * 32), 32);
}
static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
{
s32 i;
- u8 bank, healthboxSpriteId_2;
+ u8 battlerId, healthBarSpriteId;
u32 status, pltAdder;
const u8 *statusGfxPtr;
s16 tileNumAdder;
u8 statusPalId;
- bank = gSprites[healthboxSpriteId].data6;
- healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5;
- if (GetBankSide(bank) == SIDE_PLAYER)
+ battlerId = gSprites[healthboxSpriteId].hMain_Battler;
+ healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId;
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
{
- status = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_STATUS);
+ status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS);
if (!IsDoubleBattle())
tileNumAdder = 0x1A;
else
@@ -2026,33 +2039,33 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
}
else
{
- status = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_STATUS);
+ status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS);
tileNumAdder = 0x11;
}
- if (status & STATUS_SLEEP)
+ if (status & STATUS1_SLEEP)
{
- statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_SLP_BANK0, bank));
+ statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_SLP_BATTLER0, battlerId));
statusPalId = PAL_STATUS_SLP;
}
- else if (status & STATUS_PSN_ANY)
+ else if (status & STATUS1_PSN_ANY)
{
- statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PSN_BANK0, bank));
+ statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PSN_BATTLER0, battlerId));
statusPalId = PAL_STATUS_PSN;
}
- else if (status & STATUS_BURN)
+ else if (status & STATUS1_BURN)
{
- statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_BRN_BANK0, bank));
+ statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_BRN_BATTLER0, battlerId));
statusPalId = PAL_STATUS_BRN;
}
- else if (status & STATUS_FREEZE)
+ else if (status & STATUS1_FREEZE)
{
- statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_FRZ_BANK0, bank));
+ statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_FRZ_BATTLER0, battlerId));
statusPalId = PAL_STATUS_FRZ;
}
- else if (status & STATUS_PARALYSIS)
+ else if (status & STATUS1_PARALYSIS)
{
- statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PRZ_BANK0, bank));
+ statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PRZ_BATTLER0, battlerId));
statusPalId = PAL_STATUS_PAR;
}
else
@@ -2062,85 +2075,85 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
for (i = 0; i < 3; i++)
CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * 32), 32);
- if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars)
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 64);
+ if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 64);
TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE);
return;
}
pltAdder = gSprites[healthboxSpriteId].oam.paletteNum * 16;
- pltAdder += bank + 12;
+ pltAdder += battlerId + 12;
- FillPalette(sStatusIconPalettes[statusPalId], pltAdder + 0x100, 2);
+ FillPalette(sStatusIconColors[statusPalId], pltAdder + 0x100, 2);
CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2);
CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * 32), 96);
- if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT)
+ if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT)
{
- if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars)
+ if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)
{
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 32);
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 1) * 32), 32);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 32);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * 32), 32);
}
}
TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE);
}
-static u8 GetStatusIconForBankId(u8 statusElementId, u8 bank)
+static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId)
{
u8 ret = statusElementId;
switch (statusElementId)
{
- case HEALTHBOX_GFX_STATUS_PSN_BANK0:
- if (bank == 0)
- ret = HEALTHBOX_GFX_STATUS_PSN_BANK0;
- else if (bank == 1)
- ret = HEALTHBOX_GFX_STATUS_PSN_BANK1;
- else if (bank == 2)
- ret = HEALTHBOX_GFX_STATUS_PSN_BANK2;
+ case HEALTHBOX_GFX_STATUS_PSN_BATTLER0:
+ if (battlerId == 0)
+ ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER0;
+ else if (battlerId == 1)
+ ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER1;
+ else if (battlerId == 2)
+ ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER2;
else
- ret = HEALTHBOX_GFX_STATUS_PSN_BANK3;
+ ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER3;
break;
- case HEALTHBOX_GFX_STATUS_PRZ_BANK0:
- if (bank == 0)
- ret = HEALTHBOX_GFX_STATUS_PRZ_BANK0;
- else if (bank == 1)
- ret = HEALTHBOX_GFX_STATUS_PRZ_BANK1;
- else if (bank == 2)
- ret = HEALTHBOX_GFX_STATUS_PRZ_BANK2;
+ case HEALTHBOX_GFX_STATUS_PRZ_BATTLER0:
+ if (battlerId == 0)
+ ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER0;
+ else if (battlerId == 1)
+ ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER1;
+ else if (battlerId == 2)
+ ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER2;
else
- ret = HEALTHBOX_GFX_STATUS_PRZ_BANK3;
+ ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER3;
break;
- case HEALTHBOX_GFX_STATUS_SLP_BANK0:
- if (bank == 0)
- ret = HEALTHBOX_GFX_STATUS_SLP_BANK0;
- else if (bank == 1)
- ret = HEALTHBOX_GFX_STATUS_SLP_BANK1;
- else if (bank == 2)
- ret = HEALTHBOX_GFX_STATUS_SLP_BANK2;
+ case HEALTHBOX_GFX_STATUS_SLP_BATTLER0:
+ if (battlerId == 0)
+ ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER0;
+ else if (battlerId == 1)
+ ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER1;
+ else if (battlerId == 2)
+ ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER2;
else
- ret = HEALTHBOX_GFX_STATUS_SLP_BANK3;
+ ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER3;
break;
- case HEALTHBOX_GFX_STATUS_FRZ_BANK0:
- if (bank == 0)
- ret = HEALTHBOX_GFX_STATUS_FRZ_BANK0;
- else if (bank == 1)
- ret = HEALTHBOX_GFX_STATUS_FRZ_BANK1;
- else if (bank == 2)
- ret = HEALTHBOX_GFX_STATUS_FRZ_BANK2;
+ case HEALTHBOX_GFX_STATUS_FRZ_BATTLER0:
+ if (battlerId == 0)
+ ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER0;
+ else if (battlerId == 1)
+ ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER1;
+ else if (battlerId == 2)
+ ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER2;
else
- ret = HEALTHBOX_GFX_STATUS_FRZ_BANK3;
+ ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER3;
break;
- case HEALTHBOX_GFX_STATUS_BRN_BANK0:
- if (bank == 0)
- ret = HEALTHBOX_GFX_STATUS_BRN_BANK0;
- else if (bank == 1)
- ret = HEALTHBOX_GFX_STATUS_BRN_BANK1;
- else if (bank == 2)
- ret = HEALTHBOX_GFX_STATUS_BRN_BANK2;
+ case HEALTHBOX_GFX_STATUS_BRN_BATTLER0:
+ if (battlerId == 0)
+ ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER0;
+ else if (battlerId == 1)
+ ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER1;
+ else if (battlerId == 2)
+ ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER2;
else
- ret = HEALTHBOX_GFX_STATUS_BRN_BANK3;
+ ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER3;
break;
}
return ret;
@@ -2153,8 +2166,8 @@ static void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId)
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, 2, &windowId);
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
- sub_8075198((void*)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6);
- sub_8075198((void*)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2);
+ TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6);
+ TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2);
RemoveWindowOnHealthbox(windowId);
}
@@ -2170,20 +2183,20 @@ static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId)
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, GetStringRightAlignXOffset(0, text, 0x2F), 3, 2, &windowId);
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
- sub_80751E4((void*)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2);
- sub_80751E4((void*)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4);
+ SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2);
+ SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4);
RemoveWindowOnHealthbox(windowId);
}
void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId)
{
s32 maxHp, currHp;
- u8 bank = gSprites[healthboxSpriteId].data6;
+ u8 battlerId = gSprites[healthboxSpriteId].hMain_Battler;
if (elementId == HEALTHBOX_ALL && !IsDoubleBattle())
- GetBankSide(bank); // pointless function call
+ GetBattlerSide(battlerId); // Pointless function call.
- if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
+ if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER)
{
u8 isDoubles;
@@ -2198,8 +2211,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem
LoadBattleBarGfx(0);
maxHp = GetMonData(mon, MON_DATA_MAX_HP);
currHp = GetMonData(mon, MON_DATA_HP);
- SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, 0);
- sub_8074AA0(bank, healthboxSpriteId, HEALTH_BAR, 0);
+ SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0);
+ MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0);
}
isDoubles = IsDoubleBattle();
if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL))
@@ -2216,8 +2229,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem
currLevelExp = gExperienceTables[gBaseStats[species].growthRate][level];
currExpBarValue = exp - currLevelExp;
maxExpBarValue = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp;
- SetBattleBarStruct(bank, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles);
- sub_8074AA0(bank, healthboxSpriteId, EXP_BAR, 0);
+ SetBattleBarStruct(battlerId, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles);
+ MoveBattleBar(battlerId, healthboxSpriteId, EXP_BAR, 0);
}
if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL)
UpdateNickInHealthbox(healthboxSpriteId, mon);
@@ -2237,8 +2250,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem
LoadBattleBarGfx(0);
maxHp = GetMonData(mon, MON_DATA_MAX_HP);
currHp = GetMonData(mon, MON_DATA_HP);
- SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, 0);
- sub_8074AA0(bank, healthboxSpriteId, HEALTH_BAR, 0);
+ SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0);
+ MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0);
}
if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL)
UpdateNickInHealthbox(healthboxSpriteId, mon);
@@ -2247,83 +2260,87 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem
}
}
-s32 sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3)
+#define B_EXPBAR_PIXELS 64
+#define B_HEALTHBAR_PIXELS 48
+
+s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused)
{
- s32 var;
+ s32 currentBarValue;
if (whichBar == HEALTH_BAR) // health bar
{
- var = sub_8074DB8(gBattleSpritesDataPtr->battleBars[bank].maxValue,
- gBattleSpritesDataPtr->battleBars[bank].currentValue,
- gBattleSpritesDataPtr->battleBars[bank].receivedValue,
- &gBattleSpritesDataPtr->battleBars[bank].field_10,
- 6, 1);
+ currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].oldValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,
+ &gBattleSpritesDataPtr->battleBars[battlerId].currValue,
+ B_HEALTHBAR_PIXELS / 8, 1);
}
else // exp bar
{
- u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[bank].currentValue,
- gBattleSpritesDataPtr->battleBars[bank].receivedValue,
- gBattleSpritesDataPtr->battleBars[bank].maxValue, 8);
+ u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[battlerId].oldValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].maxValue, 8);
if (expFraction == 0)
expFraction = 1;
- expFraction = abs(gBattleSpritesDataPtr->battleBars[bank].receivedValue / expFraction);
+ expFraction = abs(gBattleSpritesDataPtr->battleBars[battlerId].receivedValue / expFraction);
- var = sub_8074DB8(gBattleSpritesDataPtr->battleBars[bank].maxValue,
- gBattleSpritesDataPtr->battleBars[bank].currentValue,
- gBattleSpritesDataPtr->battleBars[bank].receivedValue,
- &gBattleSpritesDataPtr->battleBars[bank].field_10,
- 8, expFraction);
+ currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].oldValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,
+ &gBattleSpritesDataPtr->battleBars[battlerId].currValue,
+ B_EXPBAR_PIXELS / 8, expFraction);
}
- if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars))
- sub_8074B9C(bank, whichBar);
+ if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars))
+ MoveBattleBarGraphically(battlerId, whichBar);
- if (var == -1)
- gBattleSpritesDataPtr->battleBars[bank].field_10 = 0;
+ if (currentBarValue == -1)
+ gBattleSpritesDataPtr->battleBars[battlerId].currValue = 0;
- return var;
+ return currentBarValue;
}
-static void sub_8074B9C(u8 bank, u8 whichBar)
+static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar)
{
u8 array[8];
- u8 subRet, level;
+ u8 filledPixelsCount, level;
u8 barElementId;
u8 i;
switch (whichBar)
{
case HEALTH_BAR:
- subRet = sub_8074E8C(gBattleSpritesDataPtr->battleBars[bank].maxValue,
- gBattleSpritesDataPtr->battleBars[bank].currentValue,
- gBattleSpritesDataPtr->battleBars[bank].receivedValue,
- &gBattleSpritesDataPtr->battleBars[bank].field_10,
- array, 6);
- barElementId = 3;
- if (subRet <= 0x18)
- {
- barElementId = 0x38;
- if (subRet > 9)
- barElementId = 0x2F;
- }
+ filledPixelsCount = CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].oldValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,
+ &gBattleSpritesDataPtr->battleBars[battlerId].currValue,
+ array, B_HEALTHBAR_PIXELS / 8);
+
+ if (filledPixelsCount > (B_HEALTHBAR_PIXELS * 50 / 100)) // more than 50 % hp
+ barElementId = HEALTHBOX_GFX_HP_BAR_GREEN;
+ else if (filledPixelsCount > (B_HEALTHBAR_PIXELS * 20 / 100)) // more than 20% hp
+ barElementId = HEALTHBOX_GFX_HP_BAR_YELLOW;
+ else
+ barElementId = HEALTHBOX_GFX_HP_BAR_RED; // 20 % or less
+
for (i = 0; i < 6; i++)
{
- u8 healthboxSpriteId_2 = gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].data5;
+ u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].hMain_HealthBarSpriteId;
if (i < 2)
CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32,
- (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + i) * 32), 32);
+ (void*)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * 32), 32);
else
CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32,
- (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthboxSpriteId_2].oam.tileNum) * 32), 32);
+ (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthbarSpriteId].oam.tileNum) * 32), 32);
}
break;
case EXP_BAR:
- sub_8074E8C(gBattleSpritesDataPtr->battleBars[bank].maxValue,
- gBattleSpritesDataPtr->battleBars[bank].currentValue,
- gBattleSpritesDataPtr->battleBars[bank].receivedValue,
- &gBattleSpritesDataPtr->battleBars[bank].field_10,
- array, 8);
- level = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_LEVEL);
+ CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].oldValue,
+ gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,
+ &gBattleSpritesDataPtr->battleBars[battlerId].currValue,
+ array, B_EXPBAR_PIXELS / 8);
+ level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_LEVEL);
if (level == MAX_MON_LEVEL)
{
for (i = 0; i < 8; i++)
@@ -2333,175 +2350,171 @@ static void sub_8074B9C(u8 bank, u8 whichBar)
{
if (i < 4)
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32,
- (void*)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].oam.tileNum + 0x24 + i) * 32), 32);
+ (void*)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum + 0x24 + i) * 32), 32);
else
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32,
- (void*)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].oam.tileNum) * 32), 32);
+ (void*)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum) * 32), 32);
}
break;
}
}
-static s32 sub_8074DB8(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5)
+static s32 CalcNewBarValue(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 scale, u16 toAdd)
{
- s32 r6;
- s32 ret;
- arg4 <<= 3;
+ s32 ret, newValue;
+ scale *= 8;
- if (*arg3 == -32768)
+ if (*currValue == -32768) // first function call
{
- if (maxValue < arg4)
- *arg3 = currValue << 8;
+ if (maxValue < scale)
+ *currValue = Q_24_8(oldValue);
else
- *arg3 = currValue;
+ *currValue = oldValue;
}
- currValue -= receivedValue;
- if (currValue < 0)
- currValue = 0;
- else if (currValue > maxValue)
- currValue = maxValue;
+ newValue = oldValue - receivedValue;
+ if (newValue < 0)
+ newValue = 0;
+ else if (newValue > maxValue)
+ newValue = maxValue;
- if (maxValue < arg4)
+ if (maxValue < scale)
{
- s32 var = *arg3 >> 8;
-
- r6 = *arg3;
- if (currValue == var && (r6 & 0xFF) == 0)
+ if (newValue == Q_24_8_TO_INT(*currValue) && (*currValue & 0xFF) == 0)
return -1;
}
else
{
- r6 = *arg3;
- if (currValue == r6)
+ if (newValue == *currValue) // we're done, the bar's value has been updated
return -1;
}
- if (maxValue < arg4)
+ if (maxValue < scale) // handle cases of max var having less pixels than the whole bar
{
- s32 var = (maxValue << 8) / arg4;
+ s32 toAdd = Q_24_8(maxValue) / scale;
- if (receivedValue < 0)
+ if (receivedValue < 0) // fill bar right
{
- *arg3 = r6 + var;
- ret = *arg3 >> 8;
- if (ret >= currValue)
+ *currValue += toAdd;
+ ret = Q_24_8_TO_INT(*currValue);
+ if (ret >= newValue)
{
- *arg3 = currValue << 8;
- ret = currValue;
+ *currValue = Q_24_8(newValue);
+ ret = newValue;
}
}
- else
+ else // move bar left
{
- *arg3 = r6 - var;
- ret = *arg3 >> 8;
- if ((*arg3 & 0xFF) > 0)
+ *currValue -= toAdd;
+ ret = Q_24_8_TO_INT(*currValue);
+ // try round up
+ if ((*currValue & 0xFF) > 0)
ret++;
- if (ret <= currValue)
+ if (ret <= newValue)
{
- *arg3 = currValue << 8;
- ret = currValue;
+ *currValue = Q_24_8(newValue);
+ ret = newValue;
}
}
}
else
{
- if (receivedValue < 0)
+ if (receivedValue < 0) // fill bar right
{
- *arg3 += arg5;
- if (*arg3 > currValue)
- *arg3 = currValue;
- ret = *arg3;
+ *currValue += toAdd;
+ if (*currValue > newValue)
+ *currValue = newValue;
+ ret = *currValue;
}
- else
+ else // move bar left
{
- *arg3 -= arg5;
- if (*arg3 < currValue)
- *arg3 = currValue;
- ret = *arg3;
+ *currValue -= toAdd;
+ if (*currValue < newValue)
+ *currValue = newValue;
+ ret = *currValue;
}
}
return ret;
}
-static u8 sub_8074E8C(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 *arg4, u8 arg5)
+static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale)
{
- s32 r5 = currValue - receivedValue;
- u8 ret;
+ u8 pixels, filledPixels, totalPixels;
u8 i;
- u8 r2;
- if (r5 < 0)
- r5 = 0;
- else if (r5 > maxValue)
- r5 = maxValue;
+ s32 newValue = oldValue - receivedValue;
+ if (newValue < 0)
+ newValue = 0;
+ else if (newValue > maxValue)
+ newValue = maxValue;
- ret = arg5 << 3;
+ totalPixels = scale * 8;
- for (i = 0; i < arg5; i++)
+ for (i = 0; i < scale; i++)
arg4[i] = 0;
- if (maxValue < ret)
- r2 = (*arg3 * ret / maxValue) >> 8;
+ if (maxValue < totalPixels)
+ pixels = (*currValue * totalPixels / maxValue) >> 8;
else
- r2 = *arg3 * ret / maxValue;
+ pixels = *currValue * totalPixels / maxValue;
- ret = r2;
+ filledPixels = pixels;
- if (ret == 0 && r5 > 0)
+ if (filledPixels == 0 && newValue > 0)
{
arg4[0] = 1;
- ret = 1;
+ filledPixels = 1;
}
else
{
- for (i = 0; i < arg5; i++)
+ for (i = 0; i < scale; i++)
{
- if (r2 >= 8)
+ if (pixels >= 8)
{
arg4[i] = 8;
}
else
{
- arg4[i] = r2;
+ arg4[i] = pixels;
break;
}
- r2 -= 8;
+ pixels -= 8;
}
}
- return ret;
+ return filledPixels;
}
-static s16 sub_8074F28(struct TestingBar *barInfo, s32 *arg1, u16 *arg2, s32 arg3)
+// These two functions seem as if they were made for testing the health bar.
+static s16 sub_8074F28(struct TestingBar *barInfo, s32 *currValue, u16 *arg2, s32 arg3)
{
s16 ret, var;
- ret = sub_8074DB8(barInfo->maxValue,
- barInfo->currValue,
+ ret = CalcNewBarValue(barInfo->maxValue,
+ barInfo->oldValue,
barInfo->receivedValue,
- arg1, 6, 1);
- sub_8074F88(barInfo, arg1, arg2);
+ currValue, B_HEALTHBAR_PIXELS / 8, 1);
+ sub_8074F88(barInfo, currValue, arg2);
- if (barInfo->maxValue < 0x30)
- var = *arg1 >> 8;
+ if (barInfo->maxValue < B_HEALTHBAR_PIXELS)
+ var = *currValue >> 8;
else
- var = *arg1;
+ var = *currValue;
DummiedOutFunction(barInfo->maxValue, var, arg3);
return ret;
}
-static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2)
+static void sub_8074F88(struct TestingBar *barInfo, s32 *currValue, u16 *arg2)
{
u8 sp8[6];
u16 sp10[6];
u8 i;
- sub_8074E8C(barInfo->maxValue, barInfo->currValue,
- barInfo->receivedValue, arg1, sp8, 6);
+ CalcBarFilledPixels(barInfo->maxValue, barInfo->oldValue,
+ barInfo->receivedValue, currValue, sp8, B_HEALTHBAR_PIXELS / 8);
for (i = 0; i < 6; i++)
sp10[i] = (barInfo->unkC_0 << 12) | (barInfo->unk10 + sp8[i]);
@@ -2509,22 +2522,22 @@ static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2)
CpuCopy16(sp10, arg2, sizeof(sp10));
}
-static u8 GetScaledExpFraction(s32 currValue, s32 receivedValue, s32 maxValue, u8 scale)
+static u8 GetScaledExpFraction(s32 oldValue, s32 receivedValue, s32 maxValue, u8 scale)
{
- s32 r5, result;
- s8 r4, r0;
+ s32 newVal, result;
+ s8 oldToMax, newToMax;
scale *= 8;
- r5 = currValue - receivedValue;
+ newVal = oldValue - receivedValue;
- if (r5 < 0)
- r5 = 0;
- else if (r5 > maxValue)
- r5 = maxValue;
+ if (newVal < 0)
+ newVal = 0;
+ else if (newVal > maxValue)
+ newVal = maxValue;
- r4 = currValue * scale / maxValue;
- r0 = r5 * scale / maxValue;
- result = r4 - r0;
+ oldToMax = oldValue * scale / maxValue;
+ newToMax = newVal * scale / maxValue;
+ result = oldToMax - newToMax;
return abs(result);
}
@@ -2541,7 +2554,7 @@ u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale)
u8 GetHPBarLevel(s16 hp, s16 maxhp)
{
- s32 result;
+ u8 result;
if (hp == maxhp)
{
@@ -2549,10 +2562,10 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp)
}
else
{
- u8 fraction = GetScaledHPFraction(hp, maxhp, 48);
- if (fraction > 24)
+ u8 fraction = GetScaledHPFraction(hp, maxhp, B_HEALTHBAR_PIXELS);
+ if (fraction > (B_HEALTHBAR_PIXELS * 50 / 100)) // more than 50 % hp
result = HP_BAR_GREEN;
- else if (fraction > 9)
+ else if (fraction > (B_HEALTHBAR_PIXELS * 20 / 100)) // more than 20% hp
result = HP_BAR_YELLOW;
else if (fraction > 0)
result = HP_BAR_RED;
@@ -2566,17 +2579,17 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp)
static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId)
{
u16 winId;
- struct TextColor color;
+ u8 color[3];
struct WindowTemplate winTemplate = sHealthboxWindowTemplate;
winId = AddWindow(&winTemplate);
FillWindowPixelBuffer(winId, (arg3 << 4) | (arg3));
- color.fgColor = arg3;
- color.bgColor = 1;
- color.shadowColor = 3;
+ color[0] = arg3;
+ color[1] = 1;
+ color[2] = 3;
- AddTextPrinterParametrized2(winId, 0, x, y, 0, 0, &color, -1, str);
+ AddTextPrinterParameterized2(winId, 0, x, y, 0, 0, color, -1, str);
*windowId = winId;
return (u8*)(GetWindowAttribute(winId, WINDOW_TILE_DATA));
@@ -2587,17 +2600,17 @@ static void RemoveWindowOnHealthbox(u32 windowId)
RemoveWindow(windowId);
}
-static void sub_807513C(void *dest, u32 arg1, u32 arg2)
+static void FillHealthboxObject(void *dest, u32 arg1, u32 arg2)
{
CpuFill32(0x11111111 * arg1, dest, arg2 * 32);
}
-static void sub_8075170(void *dest, u8 *windowTileData, u32 arg2)
+static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2)
{
CpuCopy32(windowTileData + 256, dest, arg2 * 32);
}
-static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2)
+static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 arg2)
{
CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32);
@@ -2606,13 +2619,13 @@ static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2)
do
{
CpuCopy32(windowTileData + 20, dest + 20, 12);
- dest += 32, windowTileData+= 32;
+ dest += 32, windowTileData += 32;
arg2--;
} while (arg2 != 0);
}
}
-static void sub_80751E4(void *dest, u8 *windowTileData, u32 arg2)
+static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2)
{
CpuCopy32(windowTileData, dest, arg2 * 32);
CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32);
diff --git a/src/battle_2.c b/src/battle_main.c
index 2be6f9d77..86937f85f 100644
--- a/src/battle_2.c
+++ b/src/battle_main.c
@@ -4,19 +4,23 @@
#include "main.h"
#include "load_save.h"
#include "gpu_regs.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "battle_setup.h"
+#include "battle_scripts.h"
+#include "battle_interface.h"
#include "pokemon.h"
#include "palette.h"
#include "task.h"
#include "event_data.h"
-#include "species.h"
+#include "constants/species.h"
#include "berry.h"
#include "text.h"
#include "item.h"
-#include "items.h"
-#include "hold_effects.h"
+#include "constants/items.h"
+#include "constants/hold_effects.h"
+#include "constants/trainers.h"
#include "link.h"
+#include "link_rfu.h"
#include "bg.h"
#include "dma3.h"
#include "string_util.h"
@@ -24,35 +28,32 @@
#include "event_data.h"
#include "m4a.h"
#include "window.h"
-#include "rng.h"
-#include "songs.h"
+#include "random.h"
+#include "constants/songs.h"
#include "sound.h"
#include "battle_message.h"
#include "sprite.h"
#include "util.h"
#include "trig.h"
#include "battle_ai_script_commands.h"
-#include "battle_move_effects.h"
+#include "constants/battle_move_effects.h"
#include "battle_controllers.h"
#include "pokedex.h"
-#include "abilities.h"
-#include "moves.h"
-#include "trainer_classes.h"
+#include "constants/abilities.h"
+#include "constants/moves.h"
+#include "constants/rgb.h"
#include "evolution_scene.h"
#include "roamer.h"
#include "tv.h"
#include "safari_zone.h"
-#include "battle_string_ids.h"
+#include "constants/battle_string_ids.h"
#include "data2.h"
+#include "decompress.h"
+#include "international_string_util.h"
+#include "pokeball.h"
+#include "party_menu.h"
-struct UnknownStruct6
-{
- u16 unk0[0xA0];
- u8 fillerA0[0x640];
- u16 unk780[0xA0];
-};
-
-struct UnknownPokemonStruct2
+struct UnknownPokemonStruct4
{
/*0x00*/ u16 species;
/*0x02*/ u16 heldItem;
@@ -66,8 +67,6 @@ struct UnknownPokemonStruct2
/*0x1D*/ u8 language;
};
-extern u8 gBattleCommunication[];
-extern u8 gBattleTerrain;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
extern u16 gBattle_BG1_X;
@@ -76,100 +75,28 @@ extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
-extern u16 gPartnerTrainerId;
extern u16 gBattle_WIN0H;
extern u16 gBattle_WIN0V;
extern u16 gBattle_WIN1H;
extern u16 gBattle_WIN1V;
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
-extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
-extern void (*gPreBattleCallback1)(void);
-extern void (*gBattleMainFunc)(void);
-extern void (*gCB2_AfterEvolution)(void);
-extern struct UnknownPokemonStruct2 gUnknown_02022FF8[3]; // what is it used for?
-extern struct UnknownPokemonStruct2* gUnknown_02023058; // what is it used for?
-extern u8 gUnknown_02039B28[]; // possibly a struct?
-extern struct UnknownStruct6 gUnknown_02038C28; // todo: identify & document
-extern struct MusicPlayerInfo gMPlay_SE1;
-extern struct MusicPlayerInfo gMPlay_SE2;
-extern u8 gDecompressionBuffer[];
-extern u16 gUnknown_020243FC;
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern u8 gStringBank;
-extern u32 gUnknown_02022F88;
-extern u32 gHitMarker;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u16 gPaydayMoney;
-extern u16 gBattleWeather;
-extern u16 gPauseCounterBattle;
-extern u16 gRandomTurnNumber;
-extern u8 gActiveBank;
-extern u8 gNoOfAllBanks;
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-extern u8 gLeveledUpInBattle;
-extern u8 gAbsentBankFlags;
-extern u32 gBattleExecBuffer;
-extern u8 gMultiHitCounter;
-extern u8 gBattleMoveFlags;
-extern s32 gBattleMoveDamage;
-extern const u8* gUnknown_02024230[BATTLE_BANKS_COUNT];
-extern u16 gUnknownMovesUsedByBanks[BATTLE_BANKS_COUNT];
-extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT];
-extern u16 gUnknown_02024250[BATTLE_BANKS_COUNT];
-extern u16 gUnknown_02024258[BATTLE_BANKS_COUNT];
-extern u16 gUnknown_02024260[BATTLE_BANKS_COUNT];
-extern u16 gLockedMoves[BATTLE_BANKS_COUNT];
-extern u8 gUnknown_02024270[BATTLE_BANKS_COUNT];
-extern u8 gUnknown_02024284[BATTLE_BANKS_COUNT];
-extern u32 gStatuses3[BATTLE_BANKS_COUNT];
-extern u16 gSideAffecting[2];
-extern u16 gCurrentMove;
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u8 gBanksByTurnOrder[BATTLE_BANKS_COUNT];
-extern u8 gActionForBanks[BATTLE_BANKS_COUNT];
-extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
-extern u8 gCurrentActionFuncId;
-extern u8 gLastUsedAbility;
+extern struct MusicPlayerInfo gMPlayInfo_SE1;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern u8 gUnknown_0203CF00[];
-extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT];
-extern const u8* gBattlescriptCurrInstr;
-extern u8 gActionsByTurnOrder[BATTLE_BANKS_COUNT];
-extern u8 gCurrentTurnActionNumber;
-extern u16 gDynamicBasePower;
-extern u8 gCritMultiplier;
-extern u8 gCurrMovePos;
-extern u8 gUnknown_020241E9;
-extern u16 gLastUsedMove;
-
-extern const struct BattleMove gBattleMoves[];
-extern const u16 gUnknown_08C004E0[]; // battle textbox palette
-extern const struct BgTemplate gUnknown_0831AA08[];
-extern const struct WindowTemplate * const gUnknown_0831ABA0[];
-extern const u8 gUnknown_0831ACE0[];
-extern const u8 gStatStageRatios[][2];
-extern const u8 * const gBattleScriptsForMoveEffects[];
-extern const u8 * const gBattlescriptsForBallThrow[];
-extern const u8 * const gBattlescriptsForRunningByItem[];
-extern const u8 * const gUnknown_082DBD3C[];
-extern const u8 * const gBattlescriptsForSafariActions[];
+
+extern const u16 gBattleTextboxPalette[];
+extern const struct BgTemplate gBattleBgTemplates[];
+extern const struct WindowTemplate *const gBattleWindowTemplates[];
+extern const u8 *const gBattleScriptsForMoveEffects[];
+extern const u8 *const gBattlescriptsForBallThrow[];
+extern const u8 *const gBattlescriptsForRunningByItem[];
+extern const u8 *const gBattlescriptsForUsingItem[];
+extern const u8 *const gBattlescriptsForSafariActions[];
+extern const struct ScanlineEffectParams gUnknown_0831AC70;
// strings
extern const u8 gText_LinkStandby3[];
-extern const u8 gText_RecordBattleToPass[];
-extern const u8 gText_BattleYesNoChoice[];
extern const u8 gText_BattleRecordCouldntBeSaved[];
-extern const u8 gText_BattleRecordedOnPass[];
extern const u8 gText_ShedinjaJapaneseName[];
-extern const u8 gText_EmptyString3[];
extern const u8 gText_Poison[];
extern const u8 gText_Sleep[];
extern const u8 gText_Paralysis[];
@@ -178,46 +105,15 @@ extern const u8 gText_Ice[];
extern const u8 gText_Confusion[];
extern const u8 gText_Love[];
-// battlescripts
-extern const u8 gUnknown_082DB8BE[];
-extern const u8 gUnknown_082DB881[];
-extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];
-extern const u8 gUnknown_082DAB11[];
-extern const u8 gUnknown_082DB9BA[];
-extern const u8 gUnknown_082DAAFE[];
-extern const u8 gUnknown_082DAB0B[];
-extern const u8 BattleScript_FocusPunchSetUp[];
-extern const u8 BattleScript_LinkBattleWonOrLost[];
-extern const u8 BattleScript_FrontierTrainerBattleWon[];
-extern const u8 BattleScript_LocalTrainerBattleWon[];
-extern const u8 BattleScript_PayDayMoneyAndPickUpItems[];
-extern const u8 BattleScript_LocalBattleLost[];
-extern const u8 gUnknown_082DB9C8[];
-extern const u8 gUnknown_082DAA0B[];
-extern const u8 gUnknown_082DB9C1[];
-extern const u8 BattleScript_RanAwayUsingMonAbility[];
-extern const u8 BattleScript_SmokeBallEscape[];
-extern const u8 BattleScript_GotAwaySafely[];
-extern const u8 BattleScript_WildMonFled[];
-extern const u8 BattleScript_MoveUsedLoafingAround[];
-extern const u8 BattleScript_ActionSwitch[];
-extern const u8 BattleScript_PrintFailedToRunString[];
-
// functions
-extern void dp12_8087EA4(void);
-extern void sub_80356D0(void);
extern void GetFrontierTrainerName(u8* dst, u16 trainerId); // battle tower
extern void sub_8166188(void); // battle tower, sets link battle mons level but why?
extern void sub_8165B88(u8* dst, u16 trainerId); // battle tower, gets language
-extern void sub_81DB4DC(u8* dst, u8 arg2); //
extern void sub_81B9150(void);
-extern void sub_800AC34(void);
extern void sub_80B3AF8(u8 taskId); // cable club
-extern void sub_8076918(u8 bank);
-extern void SetHealthboxSpriteVisible(u8 healthoxSpriteId);
extern void sub_81A56B4(void); // battle frontier 2
extern u8 sub_81A9E28(void); // battle frontier 2
-extern void sub_81A56E8(u8 bank); // battle frontier 2
+extern void sub_81A56E8(u8 battlerId); // battle frontier 2
extern void sub_81B8FB0(u8, u8); // party menu
extern u8 pokemon_order_func(u8); // party menu
extern bool8 InBattlePyramid(void);
@@ -242,13 +138,13 @@ static void sub_803980C(struct Sprite *sprite);
static void sub_8039838(struct Sprite *sprite);
static void sub_8039894(struct Sprite *sprite);
static void sub_80398D0(struct Sprite *sprite);
-static void sub_8039A48(struct Sprite *sprite);
+static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite);
static void sub_8039AF4(struct Sprite *sprite);
static void SpriteCallbackDummy_3(struct Sprite *sprite);
static void oac_poke_ally_(struct Sprite *sprite);
static void SpecialStatusesClear(void);
static void TurnValuesCleanUp(bool8 var0);
-static void SpriteCB_HealthBoxBounce(struct Sprite *sprite);
+static void SpriteCB_BounceEffect(struct Sprite *sprite);
static void BattleStartClearSetData(void);
static void BattleIntroGetMonsData(void);
static void BattleIntroPrepareBackgroundSlide(void);
@@ -265,9 +161,9 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void);
static void TryDoEventsBeforeFirstTurn(void);
static void HandleTurnActionSelectionState(void);
static void RunTurnActionsFunctions(void);
-static void SetActionsAndBanksTurnOrder(void);
+static void SetActionsAndBattlersTurnOrder(void);
static void sub_803CDF8(void);
-static bool8 sub_803CDB8(void);
+static bool8 AllAtActionConfirmed(void);
static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void);
static void FreeResetData_ReturnToOvOrDoEvolutions(void);
static void ReturnFromBattleToOverworld(void);
@@ -288,43 +184,363 @@ static void HandleAction_SafariZoneBallThrow(void);
static void HandleAction_ThrowPokeblock(void);
static void HandleAction_GoNear(void);
static void HandleAction_SafriZoneRun(void);
-static void HandleAction_Action9(void);
+static void HandleAction_WallyBallThrow(void);
static void HandleAction_Action11(void);
static void HandleAction_NothingIsFainted(void);
static void HandleAction_ActionFinished(void);
+// EWRAM vars
+EWRAM_DATA u8 gDisplayedStringBattle[300] = {0};
+EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0};
+EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0};
+EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0};
+EWRAM_DATA static u32 sUnusedUnknownArray[25] = {0};
+EWRAM_DATA u32 gBattleTypeFlags = 0;
+EWRAM_DATA u8 gBattleTerrain = 0;
+EWRAM_DATA u32 gUnknown_02022FF4 = 0;
+EWRAM_DATA struct UnknownPokemonStruct4 gUnknown_02022FF8[3] = {0}; // what is it used for?
+EWRAM_DATA struct UnknownPokemonStruct4* gUnknown_02023058 = NULL; // what is it used for?
+EWRAM_DATA u8 *gUnknown_0202305C = NULL;
+EWRAM_DATA u8 *gUnknown_02023060 = NULL;
+EWRAM_DATA u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200] = {0};
+EWRAM_DATA u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200] = {0};
+EWRAM_DATA u8 gActiveBattler = 0;
+EWRAM_DATA u32 gBattleControllerExecFlags = 0;
+EWRAM_DATA u8 gBattlersCount = 0;
+EWRAM_DATA u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gBattlerPositions[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gCurrentTurnActionNumber = 0;
+EWRAM_DATA u8 gCurrentActionFuncId = 0;
+EWRAM_DATA struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gCurrMovePos = 0;
+EWRAM_DATA u8 gChosenMovePos = 0;
+EWRAM_DATA u16 gCurrentMove = 0;
+EWRAM_DATA u16 gChosenMove = 0;
+EWRAM_DATA u16 gRandomMove = 0;
+EWRAM_DATA s32 gBattleMoveDamage = 0;
+EWRAM_DATA s32 gHpDealt = 0;
+EWRAM_DATA s32 gTakenDmg[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gLastUsedItem = 0;
+EWRAM_DATA u8 gLastUsedAbility = 0;
+EWRAM_DATA u8 gBattlerAttacker = 0;
+EWRAM_DATA u8 gBattlerTarget = 0;
+EWRAM_DATA u8 gBattlerFainted = 0;
+EWRAM_DATA u8 gEffectBattler = 0;
+EWRAM_DATA u8 gPotentialItemEffectBattler = 0;
+EWRAM_DATA u8 gAbsentBattlerFlags = 0;
+EWRAM_DATA u8 gCritMultiplier = 0;
+EWRAM_DATA u8 gMultiHitCounter = 0;
+EWRAM_DATA const u8 *gBattlescriptCurrInstr = NULL;
+EWRAM_DATA u32 gUnusedBattleMainVar = 0;
+EWRAM_DATA u8 gChosenActionByBattler[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT] = {NULL};
+EWRAM_DATA const u8 *gPalaceSelectionBattleScripts[MAX_BATTLERS_COUNT] = {NULL};
+EWRAM_DATA u16 gLastPrintedMoves[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gLastMoves[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gLastLandedMoves[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gLastHitByType[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gLastResultingMoves[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gMoveResultFlags = 0;
+EWRAM_DATA u32 gHitMarker = 0;
+EWRAM_DATA static u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gUnknown_0202428C = 0;
+EWRAM_DATA u16 gSideStatuses[2] = {0};
+EWRAM_DATA struct SideTimer gSideTimers[2] = {0};
+EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gPauseCounterBattle = 0;
+EWRAM_DATA u16 gPaydayMoney = 0;
+EWRAM_DATA u16 gRandomTurnNumber = 0;
+EWRAM_DATA u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT] = {0};
+EWRAM_DATA u8 gBattleOutcome = 0;
+EWRAM_DATA struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u16 gBattleWeather = 0;
+EWRAM_DATA struct WishFutureKnock gWishFutureKnock = {0};
+EWRAM_DATA u16 gIntroSlideFlags = 0;
+EWRAM_DATA u8 gSentPokesToOpponent[2] = {0};
+EWRAM_DATA u16 gDynamicBasePower = 0;
+EWRAM_DATA u16 gExpShareExp = 0;
+EWRAM_DATA struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA struct BattleScripting gBattleScripting = {0};
+EWRAM_DATA struct BattleStruct *gBattleStruct = NULL;
+EWRAM_DATA u8 *gLinkBattleSendBuffer = NULL;
+EWRAM_DATA u8 *gLinkBattleRecvBuffer = NULL;
+EWRAM_DATA struct BattleResources *gBattleResources = NULL;
+EWRAM_DATA u8 gActionSelectionCursor[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gBattlerInMenuId = 0;
+EWRAM_DATA bool8 gDoingBattleAnim = FALSE;
+EWRAM_DATA u32 gTransformedPersonalities[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gPlayerDpadHoldFrames = 0;
+EWRAM_DATA struct BattleSpriteData *gBattleSpritesDataPtr = NULL;
+EWRAM_DATA struct MonSpritesGfx *gMonSpritesGfxPtr = NULL;
+EWRAM_DATA struct BattleHealthboxInfo *gUnknown_020244D8 = NULL;
+EWRAM_DATA struct BattleHealthboxInfo *gUnknown_020244DC = NULL;
+EWRAM_DATA u16 gBattleMovePower = 0;
+EWRAM_DATA u16 gMoveToLearn = 0;
+EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0};
+
+// IWRAM common vars
+void (*gPreBattleCallback1)(void);
+void (*gBattleMainFunc)(void);
+struct BattleResults gBattleResults;
+u8 gLeveledUpInBattle;
+void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);
+u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
+u8 gMultiUsePlayerCursor;
+u8 gNumberOfMovesToChoose;
+u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT];
+
// rom const data
+static const s8 gUnknown_0831ACE0[] ={-32, -16, -16, -32, -32, 0, 0, 0};
+
+// format: attacking type, defending type, damage multiplier
+// the multiplier is a (decimal) fixed-point number:
+// 20 is ×2.0 TYPE_MUL_SUPER_EFFECTIVE
+// 10 is ×1.0 TYPE_MUL_NORMAL
+// 05 is ×0.5 TYPE_MUL_NOT_EFFECTIVE
+// 00 is ×0.0 TYPE_MUL_NO_EFFECT
+const u8 gTypeEffectiveness[336] =
+{
+ TYPE_NORMAL, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_NORMAL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIRE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIRE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIRE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FIRE, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FIRE, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FIRE, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIRE, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIRE, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_WATER, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_WATER, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_WATER, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_WATER, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_WATER, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_WATER, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ELECTRIC, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ELECTRIC, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ELECTRIC, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ELECTRIC, TYPE_GROUND, TYPE_MUL_NO_EFFECT,
+ TYPE_ELECTRIC, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ELECTRIC, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GRASS, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GRASS, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GRASS, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GRASS, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GRASS, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GRASS, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GRASS, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GRASS, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GRASS, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GRASS, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ICE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ICE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ICE, TYPE_ICE, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ICE, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ICE, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ICE, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ICE, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ICE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_NORMAL, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FIGHTING, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_POISON, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_POISON, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_POISON, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_POISON, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_POISON, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_POISON, TYPE_STEEL, TYPE_MUL_NO_EFFECT,
+ TYPE_GROUND, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GROUND, TYPE_ELECTRIC, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GROUND, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GROUND, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GROUND, TYPE_FLYING, TYPE_MUL_NO_EFFECT,
+ TYPE_GROUND, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GROUND, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GROUND, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FLYING, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FLYING, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FLYING, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FLYING, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_FLYING, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FLYING, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_PSYCHIC, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_PSYCHIC, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_PSYCHIC, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_PSYCHIC, TYPE_DARK, TYPE_MUL_NO_EFFECT,
+ TYPE_PSYCHIC, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_BUG, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_BUG, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_BUG, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_BUG, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_BUG, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_BUG, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_BUG, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_BUG, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_BUG, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ROCK, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ROCK, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ROCK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ROCK, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_ROCK, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ROCK, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_ROCK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GHOST, TYPE_NORMAL, TYPE_MUL_NO_EFFECT,
+ TYPE_GHOST, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_GHOST, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GHOST, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_GHOST, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_DRAGON, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_DRAGON, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_DARK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_DARK, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_DARK, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_DARK, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_DARK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_STEEL, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_STEEL, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_STEEL, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_STEEL, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_STEEL, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
+ TYPE_STEEL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
+ TYPE_FORESIGHT, TYPE_FORESIGHT, TYPE_MUL_NO_EFFECT,
+ TYPE_NORMAL, TYPE_GHOST, TYPE_MUL_NO_EFFECT,
+ TYPE_FIGHTING, TYPE_GHOST, TYPE_MUL_NO_EFFECT,
+ TYPE_ENDTABLE, TYPE_ENDTABLE, TYPE_MUL_NO_EFFECT
+};
+
+const u8 gTypeNames[][TYPE_NAME_LENGTH + 1] =
+{
+ _("NORMAL"),
+ _("FIGHT"),
+ _("FLYING"),
+ _("POISON"),
+ _("GROUND"),
+ _("ROCK"),
+ _("BUG"),
+ _("GHOST"),
+ _("STEEL"),
+ _("???"),
+ _("FIRE"),
+ _("WATER"),
+ _("GRASS"),
+ _("ELECTR"),
+ _("PSYCHC"),
+ _("ICE"),
+ _("DRAGON"),
+ _("DARK"),
+};
+
+// This is a factor in how much money you get for beating a trainer.
+const struct TrainerMoney gTrainerMoneyTable[] =
+{
+ {TRAINER_CLASS_TEAM_AQUA, 5},
+ {TRAINER_CLASS_AQUA_ADMIN, 10},
+ {TRAINER_CLASS_AQUA_LEADER, 20},
+ {TRAINER_CLASS_AROMA_LADY, 10},
+ {TRAINER_CLASS_RUIN_MANIAC, 15},
+ {TRAINER_CLASS_INTERVIEWER, 12},
+ {TRAINER_CLASS_TUBER_1, 1},
+ {TRAINER_CLASS_TUBER_2, 1},
+ {TRAINER_CLASS_SIS_AND_BRO, 3},
+ {TRAINER_CLASS_COOLTRAINER_1, 12},
+ {TRAINER_CLASS_HEX_MANIAC, 6},
+ {TRAINER_CLASS_LADY, 50},
+ {TRAINER_CLASS_BEAUTY, 20},
+ {TRAINER_CLASS_RICH_BOY, 50},
+ {TRAINER_CLASS_POKEMANIAC, 15},
+ {TRAINER_CLASS_SWIMMER_M, 2},
+ {TRAINER_CLASS_BLACK_BELT, 8},
+ {TRAINER_CLASS_GUITARIST, 8},
+ {TRAINER_CLASS_KINDLER, 8},
+ {TRAINER_CLASS_CAMPER, 4},
+ {TRAINER_CLASS_OLD_COUPLE, 10},
+ {TRAINER_CLASS_BUG_MANIAC, 15},
+ {TRAINER_CLASS_PSYCHIC, 6},
+ {TRAINER_CLASS_GENTLEMAN, 20},
+ {TRAINER_CLASS_ELITE_FOUR, 25},
+ {TRAINER_CLASS_LEADER, 25},
+ {TRAINER_CLASS_SCHOOL_KID, 5},
+ {TRAINER_CLASS_SR_AND_JR, 4},
+ {TRAINER_CLASS_POKEFAN, 20},
+ {TRAINER_CLASS_EXPERT, 10},
+ {TRAINER_CLASS_YOUNGSTER, 4},
+ {TRAINER_CLASS_CHAMPION, 50},
+ {TRAINER_CLASS_FISHERMAN, 10},
+ {TRAINER_CLASS_TRIATHLETE, 10},
+ {TRAINER_CLASS_DRAGON_TAMER, 12},
+ {TRAINER_CLASS_BIRD_KEEPER, 8},
+ {TRAINER_CLASS_NINJA_BOY, 3},
+ {TRAINER_CLASS_BATTLE_GIRL, 6},
+ {TRAINER_CLASS_PARASOL_LADY, 10},
+ {TRAINER_CLASS_SWIMMER_F, 2},
+ {TRAINER_CLASS_PICNICKER, 4},
+ {TRAINER_CLASS_TWINS, 3},
+ {TRAINER_CLASS_SAILOR, 8},
+ {TRAINER_CLASS_COLLECTOR, 15},
+ {TRAINER_CLASS_PKMN_TRAINER_3, 15},
+ {TRAINER_CLASS_PKMN_BREEDER, 10},
+ {TRAINER_CLASS_PKMN_RANGER, 12},
+ {TRAINER_CLASS_TEAM_MAGMA, 5},
+ {TRAINER_CLASS_MAGMA_ADMIN, 10},
+ {TRAINER_CLASS_MAGMA_LEADER, 20},
+ {TRAINER_CLASS_LASS, 4},
+ {TRAINER_CLASS_BUG_CATCHER, 4},
+ {TRAINER_CLASS_HIKER, 10},
+ {TRAINER_CLASS_YOUNG_COUPLE, 8},
+ {TRAINER_CLASS_WINSTRATE, 10},
+ {0xFF, 5},
+};
+
+#include "data/text/abilities.h"
+
static void (* const sTurnActionsFuncsTable[])(void) =
{
- HandleAction_UseMove, // ACTION_USE_MOVE
- HandleAction_UseItem, // ACTION_USE_ITEM
- HandleAction_Switch, // ACTION_SWITCH
- HandleAction_Run, // ACTION_RUN
- HandleAction_WatchesCarefully, // ACTION_WATCHES_CAREFULLY
- HandleAction_SafariZoneBallThrow, // ACTION_SAFARI_ZONE_BALL
- HandleAction_ThrowPokeblock, // ACTION_POKEBLOCK_CASE
- HandleAction_GoNear, // ACTION_GO_NEAR
- HandleAction_SafriZoneRun, // ACTION_SAFARI_ZONE_RUN
- HandleAction_Action9, // ACTION_9
- HandleAction_RunBattleScript, // ACTION_RUN_BATTLESCRIPT
+ HandleAction_UseMove, // B_ACTION_USE_MOVE
+ HandleAction_UseItem, // B_ACTION_USE_ITEM
+ HandleAction_Switch, // B_ACTION_SWITCH
+ HandleAction_Run, // B_ACTION_RUN
+ HandleAction_WatchesCarefully, // B_ACTION_SAFARI_WATCH_CAREFULLY
+ HandleAction_SafariZoneBallThrow, // B_ACTION_SAFARI_BALL
+ HandleAction_ThrowPokeblock, // B_ACTION_SAFARI_POKEBLOCK
+ HandleAction_GoNear, // B_ACTION_SAFARI_GO_NEAR
+ HandleAction_SafriZoneRun, // B_ACTION_SAFARI_RUN
+ HandleAction_WallyBallThrow, // B_ACTION_WALLY_THROW
+ HandleAction_RunBattleScript, // B_ACTION_EXEC_SCRIPT
HandleAction_Action11, // not sure about this one
- HandleAction_ActionFinished, // ACTION_FINISHED
- HandleAction_NothingIsFainted, // ACTION_NOTHING_FAINTED
+ HandleAction_ActionFinished, // B_ACTION_FINISHED
+ HandleAction_NothingIsFainted, // B_ACTION_NOTHING_FAINTED
};
static void (* const sEndTurnFuncsTable[])(void) =
{
HandleEndTurn_ContinueBattle, // battle outcome 0
- HandleEndTurn_BattleWon, // BATTLE_WON
- HandleEndTurn_BattleLost, // BATTLE_LOST
- HandleEndTurn_BattleLost, // BATTLE_DREW
- HandleEndTurn_RanFromBattle, // BATTLE_RAN
- HandleEndTurn_FinishBattle, // BATTLE_PLAYER_TELEPORTED
- HandleEndTurn_MonFled, // BATTLE_POKE_FLED
- HandleEndTurn_FinishBattle, // BATTLE_CAUGHT
- HandleEndTurn_FinishBattle, // battle outcome 8
- HandleEndTurn_FinishBattle, // BATTLE_FORFEITED
- HandleEndTurn_FinishBattle, // BATTLE_OPPONENT_TELEPORTED
+ HandleEndTurn_BattleWon, // B_OUTCOME_WON
+ HandleEndTurn_BattleLost, // B_OUTCOME_LOST
+ HandleEndTurn_BattleLost, // B_OUTCOME_DREW
+ HandleEndTurn_RanFromBattle, // B_OUTCOME_RAN
+ HandleEndTurn_FinishBattle, // B_OUTCOME_PLAYER_TELEPORTED
+ HandleEndTurn_MonFled, // B_OUTCOME_MON_FLED
+ HandleEndTurn_FinishBattle, // B_OUTCOME_CAUGHT
+ HandleEndTurn_FinishBattle, // B_OUTCOME_NO_SAFARI_BALLS
+ HandleEndTurn_FinishBattle, // B_OUTCOME_FORFEITED
+ HandleEndTurn_FinishBattle, // B_OUTCOME_MON_TELEPORTED
};
const u8 gStatusConditionString_PoisonJpn[8] = _("どく$$$$$");
@@ -346,10 +562,11 @@ const u8 * const gStatusConditionStringsTable[7][2] =
{gStatusConditionString_LoveJpn, gText_Love}
};
-static const u8 sUnknown_0831BCE0[][3] = {{0, 0, 0}, {3, 5, 0}, {2, 3, 0}, {1, 2, 0}, {1, 1, 0}};
-static const u8 sUnknown_0831BCEF[] = {4, 3, 2, 1};
-static const u8 sUnknown_0831BCF3[] = {4, 4, 4, 4};
+static const u8 sPkblToEscapeFactor[][3] = {{0, 0, 0}, {3, 5, 0}, {2, 3, 0}, {1, 2, 0}, {1, 1, 0}};
+static const u8 sGoNearCounterToCatchFactor[] = {4, 3, 2, 1};
+static const u8 sGoNearCounterToEscapeFactor[] = {4, 4, 4, 4};
+// code
void CB2_InitBattle(void)
{
MoveSaveBlocks_ResetHeap();
@@ -398,7 +615,7 @@ static void CB2_InitBattleInternal(void)
gBattle_WIN0H = 240;
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != STEVEN_PARTNER_ID)
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER)
{
gBattle_WIN0V = 159;
gBattle_WIN1H = 240;
@@ -407,24 +624,21 @@ static void CB2_InitBattleInternal(void)
else
{
gBattle_WIN0V = 0x5051;
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 80; i++)
{
- gUnknown_02038C28.unk0[i] = 0xF0;
- gUnknown_02038C28.unk780[i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0xF0;
}
for (i = 80; i < 160; i++)
{
- #ifndef NONMATCHING
- asm(""::"r"(i)); // needed to match
- #endif // NONMATCHING
-
- gUnknown_02038C28.unk0[i] = 0xFF10;
- gUnknown_02038C28.unk780[i] = 0xFF10;
+ asm(""::"r"(i));
+ gScanlineEffectRegBuffers[0][i] = 0xFF10;
+ gScanlineEffectRegBuffers[1][i] = 0xFF10;
}
- sub_80BA038(gUnknown_0831AC70);
+ ScanlineEffect_SetParams(gUnknown_0831AC70);
}
ResetPaletteFade();
@@ -439,13 +653,13 @@ static void CB2_InitBattleInternal(void)
gBattleTerrain = BattleSetup_GetTerrainId();
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
- gBattleTerrain = BATTLE_TERRAIN_INSIDE;
+ gBattleTerrain = BATTLE_TERRAIN_BUILDING;
sub_80356D0();
LoadBattleTextboxAndBackground();
ResetSpriteData();
ResetTasks();
- LoadBattleEntryBackground();
+ DrawBattleEntryBackground();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(VBlankCB_Battle);
@@ -469,9 +683,9 @@ static void CB2_InitBattleInternal(void)
}
gMain.inBattle = TRUE;
- gSaveBlock2Ptr->field_CA9_b = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 0;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
AdjustFriendship(&gPlayerParty[i], 3);
gBattleCommunication[MULTIUSE_STATE] = 0;
@@ -485,7 +699,7 @@ static void sub_8036A5C(void)
u32 status = 0;
s32 i;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
@@ -532,7 +746,7 @@ static void SetPlayerBerryDataInBattleStruct(void)
}
else
{
- const struct Berry* berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY));
+ const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY));
for (i = 0; i < BERRY_NAME_COUNT - 1; i++)
battleBerry->name[i] = berryData->name[i];
@@ -576,7 +790,7 @@ static void SetAllPlayersBerryData(void)
}
else
{
- const struct Berry* berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY));
+ const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY));
for (i = 0; i < BERRY_NAME_COUNT - 1; i++)
{
@@ -602,7 +816,7 @@ static void SetAllPlayersBerryData(void)
{
s32 numPlayers;
struct BattleEnigmaBerry *src;
- u8 r4;
+ u8 battlerId;
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@@ -614,17 +828,17 @@ static void SetAllPlayersBerryData(void)
for (i = 0; i < numPlayers; i++)
{
src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2);
- r4 = gLinkPlayers[i].lp_field_18;
+ battlerId = gLinkPlayers[i].id;
for (j = 0; j < BERRY_NAME_COUNT - 1; j++)
- gEnigmaBerries[r4].name[j] = src->name[j];
- gEnigmaBerries[r4].name[j] = EOS;
+ gEnigmaBerries[battlerId].name[j] = src->name[j];
+ gEnigmaBerries[battlerId].name[j] = EOS;
for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++)
- gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j];
+ gEnigmaBerries[battlerId].itemEffect[j] = src->itemEffect[j];
- gEnigmaBerries[r4].holdEffect = src->holdEffect;
- gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam;
+ gEnigmaBerries[battlerId].holdEffect = src->holdEffect;
+ gEnigmaBerries[battlerId].holdEffectParam = src->holdEffectParam;
}
}
else
@@ -734,7 +948,7 @@ static void CB2_HandleStartBattle(void)
sub_805EF14();
gBattleCommunication[MULTIUSE_STATE] = 1;
}
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
sub_800E0E8();
break;
case 1:
@@ -751,15 +965,15 @@ static void CB2_HandleStartBattle(void)
if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
{
- gLinkPlayers[0].lp_field_18 = 0;
- gLinkPlayers[1].lp_field_18 = 1;
+ gLinkPlayers[0].id = 0;
+ gLinkPlayers[1].id = 1;
}
SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
gBattleCommunication[MULTIUSE_STATE] = 2;
}
- if (gLinkVSyncDisabled)
- sub_800DFB4(0, 0);
+ if (gWirelessCommType)
+ CreateWirelessStatusIndicatorSprite(0, 0);
}
}
else
@@ -778,7 +992,7 @@ static void CB2_HandleStartBattle(void)
ResetBlockReceivedFlags();
sub_8036EB8(2, playerMultiplayerId);
SetAllPlayersBerryData();
- taskId = CreateTask(task00_0800F6FC, 0);
+ taskId = CreateTask(sub_8035D74, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 0;
@@ -786,7 +1000,7 @@ static void CB2_HandleStartBattle(void)
gTasks[taskId].data[4] = gBlockRecvBuffer[enemyMultiplayerId][1];
sub_8185F90(gBlockRecvBuffer[playerMultiplayerId][1]);
sub_8185F90(gBlockRecvBuffer[enemyMultiplayerId][1]);
- sub_8068AA4();
+ SetDeoxysStats();
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -929,7 +1143,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
sub_805EF14();
gBattleCommunication[MULTIUSE_STATE] = 1;
}
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
sub_800E0E8();
// fall through
case 1:
@@ -939,10 +1153,10 @@ static void CB2_HandleStartMultiPartnerBattle(void)
{
u8 language;
- gLinkPlayers[0].lp_field_18 = 0;
- gLinkPlayers[1].lp_field_18 = 2;
- gLinkPlayers[2].lp_field_18 = 1;
- gLinkPlayers[3].lp_field_18 = 3;
+ gLinkPlayers[0].id = 0;
+ gLinkPlayers[1].id = 2;
+ gLinkPlayers[2].id = 1;
+ gLinkPlayers[3].id = 3;
GetFrontierTrainerName(gLinkPlayers[2].name, gTrainerBattleOpponent_A);
GetFrontierTrainerName(gLinkPlayers[3].name, gTrainerBattleOpponent_B);
sub_8165B88(&language, gTrainerBattleOpponent_A);
@@ -960,8 +1174,8 @@ static void CB2_HandleStartMultiPartnerBattle(void)
gBattleCommunication[MULTIUSE_STATE] = 2;
}
- if (gLinkVSyncDisabled)
- sub_800DFB4(0, 0);
+ if (gWirelessCommType)
+ CreateWirelessStatusIndicatorSprite(0, 0);
}
}
else
@@ -980,7 +1194,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
ResetBlockReceivedFlags();
sub_8036EB8(2, playerMultiplayerId);
SetAllPlayersBerryData();
- taskId = CreateTask(task00_0800F6FC, 0);
+ taskId = CreateTask(sub_8035D74, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 0;
@@ -1000,7 +1214,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
if ((GetBlockReceivedStatus() & 3) == 3)
{
ResetBlockReceivedFlags();
- if (gLinkPlayers[playerMultiplayerId].lp_field_18 != 0)
+ if (gLinkPlayers[playerMultiplayerId].id != 0)
{
memcpy(gPlayerParty, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
memcpy(gPlayerParty + 3, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon) * 2);
@@ -1024,7 +1238,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
if ((GetBlockReceivedStatus() & 3) == 3)
{
ResetBlockReceivedFlags();
- if (gLinkPlayers[playerMultiplayerId].lp_field_18 != 0)
+ if (gLinkPlayers[playerMultiplayerId].id != 0)
{
memcpy(gPlayerParty + 2, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon));
memcpy(gPlayerParty + 5, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon));
@@ -1164,7 +1378,7 @@ static void sub_80379F8(u8 arrayIdPlus)
gUnknown_02022FF8[i].gender = GetMonGender(&gPlayerParty[arrayIdPlus + i]);
StripExtCtrlCodes(gUnknown_02022FF8[i].nickname);
if (GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE)
- sub_81DB4DC(gUnknown_02022FF8[i].nickname, 0);
+ PadNameString(gUnknown_02022FF8[i].nickname, CHAR_SPACE);
}
memcpy(gUnknown_02023058, gUnknown_02022FF8, sizeof(gUnknown_02022FF8));
}
@@ -1175,7 +1389,7 @@ static void CB2_PreInitMultiBattle(void)
u8 playerMultiplierId;
s32 numPlayers = 4;
u8 r4 = 0xF;
- u32* savedBattleTypeFlags;
+ u32 *savedBattleTypeFlags;
void (**savedCallback)(void);
if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
@@ -1198,9 +1412,9 @@ static void CB2_PreInitMultiBattle(void)
case 0:
if (gReceivedRemoteLinkPlayers != 0 && sub_800A520())
{
- gUnknown_02023058 = Alloc(sizeof(struct UnknownPokemonStruct2) * 3);
+ gUnknown_02023058 = Alloc(sizeof(struct UnknownPokemonStruct4) * 3);
sub_80379F8(0);
- SendBlock(bitmask_all_link_players_but_self(), gUnknown_02023058, sizeof(struct UnknownPokemonStruct2) * 3);
+ SendBlock(bitmask_all_link_players_but_self(), gUnknown_02023058, sizeof(struct UnknownPokemonStruct4) * 3);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -1215,15 +1429,15 @@ static void CB2_PreInitMultiBattle(void)
if (numPlayers == 4)
{
- if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerMultiplierId].lp_field_18 & 1))
- || (gLinkPlayers[i].lp_field_18 & 1 && gLinkPlayers[playerMultiplierId].lp_field_18 & 1))
+ if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[playerMultiplierId].id & 1))
+ || (gLinkPlayers[i].id & 1 && gLinkPlayers[playerMultiplierId].id & 1))
{
- memcpy(gUnknown_02022FF8, gBlockRecvBuffer[i], sizeof(struct UnknownPokemonStruct2) * 3);
+ memcpy(gUnknown_02022FF8, gBlockRecvBuffer[i], sizeof(struct UnknownPokemonStruct4) * 3);
}
}
else
{
- memcpy(gUnknown_02022FF8, gBlockRecvBuffer[i], sizeof(struct UnknownPokemonStruct2) * 3);
+ memcpy(gUnknown_02022FF8, gBlockRecvBuffer[i], sizeof(struct UnknownPokemonStruct4) * 3);
}
}
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1237,14 +1451,14 @@ static void CB2_PreInitMultiBattle(void)
if (sub_800A520() && !gPaletteFade.active)
{
gBattleCommunication[MULTIUSE_STATE]++;
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
sub_800ADF8();
else
sub_800AC34();
}
break;
case 3:
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
{
if (sub_8010500())
{
@@ -1269,7 +1483,7 @@ static void CB2_PreInitMultiBattle(void)
static void CB2_PreInitIngamePlayerPartnerBattle(void)
{
- u32* savedBattleTypeFlags;
+ u32 *savedBattleTypeFlags;
void (**savedCallback)(void);
savedCallback = &gBattleStruct->savedCallback;
@@ -1282,7 +1496,7 @@ static void CB2_PreInitIngamePlayerPartnerBattle(void)
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
- gUnknown_02023058 = Alloc(sizeof(struct UnknownPokemonStruct2) * 3);
+ gUnknown_02023058 = Alloc(sizeof(struct UnknownPokemonStruct4) * 3);
sub_80379F8(3);
gBattleCommunication[MULTIUSE_STATE]++;
*savedCallback = gMain.savedCallback;
@@ -1329,7 +1543,7 @@ static void CB2_HandleStartMultiBattle(void)
sub_805EF14();
gBattleCommunication[MULTIUSE_STATE] = 1;
}
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
sub_800E0E8();
break;
case 1:
@@ -1347,8 +1561,8 @@ static void CB2_HandleStartMultiBattle(void)
SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
gBattleCommunication[MULTIUSE_STATE]++;
}
- if (gLinkVSyncDisabled)
- sub_800DFB4(0, 0);
+ if (gWirelessCommType)
+ CreateWirelessStatusIndicatorSprite(0, 0);
}
}
else
@@ -1365,8 +1579,8 @@ static void CB2_HandleStartMultiBattle(void)
ResetBlockReceivedFlags();
sub_8036EB8(4, playerMultiplayerId);
SetAllPlayersBerryData();
- sub_8068AA4();
- var = CreateTask(task00_0800F6FC, 0);
+ SetDeoxysStats();
+ var = CreateTask(sub_8035D74, 0);
gTasks[var].data[1] = 0x10E;
gTasks[var].data[2] = 0x5A;
gTasks[var].data[5] = 0;
@@ -1376,7 +1590,7 @@ static void CB2_HandleStartMultiBattle(void)
for (id = 0; id < MAX_LINK_PLAYERS; id++)
{
sub_8185F90(gBlockRecvBuffer[id][1]);
- switch (gLinkPlayers[id].lp_field_18)
+ switch (gLinkPlayers[id].id)
{
case 0:
gTasks[var].data[3] |= gBlockRecvBuffer[id][1] & 0x3F;
@@ -1413,7 +1627,7 @@ static void CB2_HandleStartMultiBattle(void)
{
if (id == playerMultiplayerId)
{
- switch (gLinkPlayers[id].lp_field_18)
+ switch (gLinkPlayers[id].id)
{
case 0:
case 3:
@@ -1427,10 +1641,10 @@ static void CB2_HandleStartMultiBattle(void)
}
else
{
- if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerMultiplayerId].lp_field_18 & 1))
- || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerMultiplayerId].lp_field_18 & 1)))
+ if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1))
+ || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1)))
{
- switch (gLinkPlayers[id].lp_field_18)
+ switch (gLinkPlayers[id].id)
{
case 0:
case 3:
@@ -1444,7 +1658,7 @@ static void CB2_HandleStartMultiBattle(void)
}
else
{
- switch (gLinkPlayers[id].lp_field_18)
+ switch (gLinkPlayers[id].id)
{
case 0:
case 3:
@@ -1476,7 +1690,7 @@ static void CB2_HandleStartMultiBattle(void)
{
if (id == playerMultiplayerId)
{
- switch (gLinkPlayers[id].lp_field_18)
+ switch (gLinkPlayers[id].id)
{
case 0:
case 3:
@@ -1490,10 +1704,10 @@ static void CB2_HandleStartMultiBattle(void)
}
else
{
- if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerMultiplayerId].lp_field_18 & 1))
- || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerMultiplayerId].lp_field_18 & 1)))
+ if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1))
+ || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1)))
{
- switch (gLinkPlayers[id].lp_field_18)
+ switch (gLinkPlayers[id].id)
{
case 0:
case 3:
@@ -1507,7 +1721,7 @@ static void CB2_HandleStartMultiBattle(void)
}
else
{
- switch (gLinkPlayers[id].lp_field_18)
+ switch (gLinkPlayers[id].id)
{
case 0:
case 3:
@@ -1592,7 +1806,7 @@ static void CB2_HandleStartMultiBattle(void)
SetMainCallback2(BattleMainCB2);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- gTrainerBattleOpponent_A = TRAINER_OPPONENT_800;
+ gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
gBattleTypeFlags |= BATTLE_TYPE_20;
}
}
@@ -1610,9 +1824,9 @@ void BattleMainCB2(void)
if (gMain.heldKeys & B_BUTTON && gBattleTypeFlags & BATTLE_TYPE_RECORDED && sub_8186450())
{
- gSpecialVar_Result = gBattleOutcome = BATTLE_PLAYER_TELEPORTED;
+ gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED;
ResetPaletteFadeControl();
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
SetMainCallback2(CB2_QuitRecordedBattle);
}
}
@@ -1620,10 +1834,10 @@ void BattleMainCB2(void)
static void FreeRestoreBattleData(void)
{
gMain.callback1 = gPreBattleCallback1;
- gUnknown_02039B28[0x15] = 3;
+ gScanlineEffect.state = 3;
gMain.inBattle = 0;
ZeroEnemyPartyMons();
- m4aSongNumStop(0x5A);
+ m4aSongNumStop(SE_HINSI);
FreeMonSpritesGfx();
FreeBattleSpritesData();
FreeBattleResources();
@@ -1634,8 +1848,8 @@ void CB2_QuitRecordedBattle(void)
UpdatePaletteFade();
if (!gPaletteFade.active)
{
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
FreeRestoreBattleData();
FreeAllWindowBuffers();
SetMainCallback2(gMain.savedCallback);
@@ -1644,7 +1858,7 @@ void CB2_QuitRecordedBattle(void)
void sub_8038528(struct Sprite* sprite)
{
- sprite->data0 = 0;
+ sprite->data[0] = 0;
sprite->callback = sub_8038538;
}
@@ -1652,42 +1866,42 @@ static void sub_8038538(struct Sprite *sprite)
{
u16 *arr = (u16*)(gDecompressionBuffer);
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
- sprite->data0++;
- sprite->data1 = 0;
- sprite->data2 = 0x281;
- sprite->data3 = 0;
- sprite->data4 = 1;
+ sprite->data[0]++;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0x281;
+ sprite->data[3] = 0;
+ sprite->data[4] = 1;
// fall through
case 1:
- sprite->data4--;
- if (sprite->data4 == 0)
+ sprite->data[4]--;
+ if (sprite->data[4] == 0)
{
s32 i;
s32 r2;
s32 r0;
- sprite->data4 = 2;
- r2 = sprite->data1 + sprite->data3 * 32;
- r0 = sprite->data2 - sprite->data3 * 32;
+ sprite->data[4] = 2;
+ r2 = sprite->data[1] + sprite->data[3] * 32;
+ r0 = sprite->data[2] - sprite->data[3] * 32;
for (i = 0; i < 29; i += 2)
{
arr[r2 + i] = 0x3D;
arr[r0 + i] = 0x3D;
}
- sprite->data3++;
- if (sprite->data3 == 21)
+ sprite->data[3]++;
+ if (sprite->data[3] == 21)
{
- sprite->data0++;
- sprite->data1 = 32;
+ sprite->data[0]++;
+ sprite->data[1] = 32;
}
}
break;
case 2:
- sprite->data1--;
- if (sprite->data1 == 20)
+ sprite->data[1]--;
+ if (sprite->data[1] == 20)
SetMainCallback2(CB2_InitBattle);
break;
}
@@ -1701,7 +1915,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
s32 i, j;
u8 monsCount;
- if (trainerNum == SECRET_BASE_OPPONENT)
+ if (trainerNum == TRAINER_SECRET_BASE)
return 0;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER
@@ -1733,7 +1947,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
else
personalityValue = 0x88;
- for (j = 0; gTrainers[trainerNum].trainerName[j] != 0xFF; j++)
+ for (j = 0; gTrainers[trainerNum].trainerName[j] != EOS; j++)
nameHash += gTrainers[trainerNum].trainerName[j];
switch (gTrainers[trainerNum].partyFlags)
@@ -1742,7 +1956,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
{
const struct TrainerMonNoItemDefaultMoves *partyData = gTrainers[trainerNum].party.NoItemDefaultMoves;
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
@@ -1750,11 +1964,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
break;
}
- case PARTY_FLAG_CUSTOM_MOVES:
+ case F_TRAINER_PARTY_CUSTOM_MOVESET:
{
const struct TrainerMonNoItemCustomMoves *partyData = gTrainers[trainerNum].party.NoItemCustomMoves;
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
@@ -1768,11 +1982,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
}
break;
}
- case PARTY_FLAG_HAS_ITEM:
+ case F_TRAINER_PARTY_HELD_ITEM:
{
const struct TrainerMonItemDefaultMoves *partyData = gTrainers[trainerNum].party.ItemDefaultMoves;
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
@@ -1782,11 +1996,11 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
break;
}
- case PARTY_FLAG_CUSTOM_MOVES | PARTY_FLAG_HAS_ITEM:
+ case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:
{
const struct TrainerMonItemCustomMoves *partyData = gTrainers[trainerNum].party.ItemCustomMoves;
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != EOS; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
@@ -1819,7 +2033,7 @@ void sub_8038A04(void) // unused
void VBlankCB_Battle(void)
{
- // change gRngSeed every vblank unless the battle could be recorded
+ // Change gRngSeed every vblank unless the battle could be recorded.
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED)))
Random();
@@ -1838,7 +2052,7 @@ void VBlankCB_Battle(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
void nullsub_17(void)
@@ -1848,12 +2062,12 @@ void nullsub_17(void)
static void sub_8038B04(struct Sprite *sprite)
{
- if (sprite->data0 != 0)
- sprite->pos1.x = sprite->data1 + ((sprite->data2 & 0xFF00) >> 8);
+ if (sprite->data[0] != 0)
+ sprite->pos1.x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8);
else
- sprite->pos1.x = sprite->data1 - ((sprite->data2 & 0xFF00) >> 8);
+ sprite->pos1.x = sprite->data[1] - ((sprite->data[2] & 0xFF00) >> 8);
- sprite->data2 += 0x180;
+ sprite->data[2] += 0x180;
if (sprite->affineAnimEnded)
{
@@ -1881,7 +2095,7 @@ static void sub_8038B94(u8 taskId)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- switch (gLinkPlayers[r2].lp_field_18)
+ switch (gLinkPlayers[r2].id)
{
case 0:
case 2:
@@ -1902,7 +2116,7 @@ static void sub_8038B94(u8 taskId)
}
r7 = 0;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2);
u16 hp = GetMonData(&sp4[i], MON_DATA_HP);
@@ -1926,7 +2140,7 @@ static void sub_8038B94(u8 taskId)
gTasks[taskId].data[3] = r7;
r7 = 0;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2);
u16 hp = GetMonData(&sp8[i], MON_DATA_HP);
@@ -1976,18 +2190,18 @@ void sub_8038D64(void)
SetGpuReg(REG_OFFSET_WINOUT, 0);
gBattle_WIN0H = 0xF0;
gBattle_WIN0V = 0x5051;
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 80; i++)
{
- gUnknown_02038C28.unk0[i] = 0xF0;
- gUnknown_02038C28.unk780[i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0xF0;
}
for (i = 80; i < 160; i++)
{
- asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
- gUnknown_02038C28.unk0[i] = 0xFF10;
- gUnknown_02038C28.unk780[i] = 0xFF10;
+ asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter.
+ gScanlineEffectRegBuffers[0][i] = 0xFF10;
+ gScanlineEffectRegBuffers[1][i] = 0xFF10;
}
ResetPaletteFade();
@@ -2002,17 +2216,17 @@ void sub_8038D64(void)
gBattle_BG3_Y = 0;
sub_80356D0();
- LoadCompressedPalette(gUnknown_08C004E0, 0, 64);
- ApplyPlayerChosenFrameToBattleMenu();
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 64);
+ LoadBattleMenuWindowGfx();
ResetSpriteData();
ResetTasks();
- LoadBattleEntryBackground();
+ DrawBattleEntryBackground();
SetGpuReg(REG_OFFSET_WINOUT, 0x37);
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(VBlankCB_Battle);
- taskId = CreateTask(task00_0800F6FC, 0);
+ taskId = CreateTask(sub_8035D74, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 1;
@@ -2048,7 +2262,7 @@ static void sub_8038F34(void)
case 1:
if (--gBattleCommunication[1] == 0)
{
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -2066,7 +2280,7 @@ static void sub_8038F34(void)
for (i = 0; i < monsCount && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
- if (!gSaveBlock2Ptr->field_CA9_b && i == monsCount)
+ if (!gSaveBlock2Ptr->frontier.field_CA9_b && i == monsCount)
{
if (FlagGet(FLAG_SYS_FRONTIER_PASS))
{
@@ -2105,7 +2319,7 @@ static void sub_8038F34(void)
for (i = 0; i < 2; i++)
LoadChosenBattleElement(i);
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 4:
@@ -2120,7 +2334,7 @@ static void sub_8038F34(void)
if (sub_800A520() == TRUE)
{
sub_800ADF8();
- BattleHandleAddTextPrinter(gText_LinkStandby3, 0);
+ BattlePutTextOnWindow(gText_LinkStandby3, 0);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -2132,12 +2346,12 @@ static void sub_8038F34(void)
}
break;
case 8:
- if (!gLinkVSyncDisabled)
+ if (!gWirelessCommType)
sub_800AC34();
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 9:
- if (!gMain.field_439_x4 || gLinkVSyncDisabled || gReceivedRemoteLinkPlayers != 1)
+ if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
gMain.field_439_x4 = 0;
SetMainCallback2(gMain.savedCallback);
@@ -2156,25 +2370,25 @@ u32 sub_80391E0(u8 arrayId, u8 caseId)
switch (caseId)
{
case 0:
- ret = gUnknown_0831AA08[arrayId].bg;
+ ret = gBattleBgTemplates[arrayId].bg;
break;
case 1:
- ret = gUnknown_0831AA08[arrayId].charBaseIndex;
+ ret = gBattleBgTemplates[arrayId].charBaseIndex;
break;
case 2:
- ret = gUnknown_0831AA08[arrayId].mapBaseIndex;
+ ret = gBattleBgTemplates[arrayId].mapBaseIndex;
break;
case 3:
- ret = gUnknown_0831AA08[arrayId].screenSize;
+ ret = gBattleBgTemplates[arrayId].screenSize;
break;
case 4:
- ret = gUnknown_0831AA08[arrayId].paletteMode;
+ ret = gBattleBgTemplates[arrayId].paletteMode;
break;
case 5:
- ret = gUnknown_0831AA08[arrayId].priority;
+ ret = gBattleBgTemplates[arrayId].priority;
break;
case 6:
- ret = gUnknown_0831AA08[arrayId].baseTile;
+ ret = gBattleBgTemplates[arrayId].baseTile;
break;
}
@@ -2199,7 +2413,7 @@ static void sub_80392A8(void)
gBattle_BG3_Y = 0;
sub_80356D0();
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
- ApplyPlayerChosenFrameToBattleMenu();
+ LoadBattleMenuWindowGfx();
for (i = 0; i < 2; i++)
LoadChosenBattleElement(i);
@@ -2210,7 +2424,7 @@ static void sub_80392A8(void)
gReservedSpritePaletteCount = 4;
SetVBlankCallback(VBlankCB_Battle);
SetMainCallback2(sub_803937C);
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE] = 0;
}
@@ -2246,7 +2460,7 @@ static void sub_803939C(void)
case 3:
if (!gPaletteFade.active)
{
- BattleHandleAddTextPrinter(gText_RecordBattleToPass, 0);
+ BattlePutTextOnWindow(gText_RecordBattleToPass, 0);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -2254,7 +2468,7 @@ static void sub_803939C(void)
if (!IsTextPrinterActive(0))
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
- BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC);
+ BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC);
gBattleCommunication[CURSOR_POSITION] = 1;
BattleCreateYesNoCursorAt(1);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -2308,7 +2522,7 @@ static void sub_803939C(void)
if (gMain.field_439_x4)
{
sub_800ADF8();
- BattleHandleAddTextPrinter(gText_LinkStandby3, 0);
+ BattlePutTextOnWindow(gText_LinkStandby3, 0);
}
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -2316,13 +2530,13 @@ static void sub_803939C(void)
case 8:
if (--gBattleCommunication[1] == 0)
{
- if (gMain.field_439_x4 && !gLinkVSyncDisabled)
+ if (gMain.field_439_x4 && !gWirelessCommType)
sub_800AC34();
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 9:
- if (!gMain.field_439_x4 || gLinkVSyncDisabled || gReceivedRemoteLinkPlayers != 1)
+ if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
gMain.field_439_x4 = 0;
if (!gPaletteFade.active)
@@ -2339,14 +2553,14 @@ static void sub_803939C(void)
{
PlaySE(SE_SAVE);
BattleStringExpandPlaceholdersToDisplayedString(gText_BattleRecordedOnPass);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gBattleCommunication[1] = 0x80;
gBattleCommunication[MULTIUSE_STATE]++;
}
else
{
BattleStringExpandPlaceholdersToDisplayedString(gText_BattleRecordCouldntBeSaved);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gBattleCommunication[1] = 0x80;
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -2357,7 +2571,7 @@ static void sub_803939C(void)
if (gMain.field_439_x4)
{
sub_800ADF8();
- BattleHandleAddTextPrinter(gText_LinkStandby3, 0);
+ BattlePutTextOnWindow(gText_LinkStandby3, 0);
}
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -2370,7 +2584,7 @@ static void sub_803939C(void)
{
if (sub_800A520() == TRUE)
{
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
gBattleCommunication[1] = 0x20;
gBattleCommunication[MULTIUSE_STATE] = 8;
}
@@ -2378,7 +2592,7 @@ static void sub_803939C(void)
}
else
{
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
gBattleCommunication[1] = 0x20;
gBattleCommunication[MULTIUSE_STATE] = 8;
}
@@ -2403,22 +2617,22 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon)
u32 sub_80397C4(u32 setId, u32 tableId)
{
- return gUnknown_0831ABA0[setId][tableId].width * 8;
+ return gBattleWindowTemplates[setId][tableId].width * 8;
}
-#define tBank data0
-#define tSpeciesId data2
+#define sBattler data[0]
+#define sSpeciesId data[2]
void oac_poke_opponent(struct Sprite *sprite)
{
sprite->callback = sub_803980C;
StartSpriteAnimIfDifferent(sprite, 0);
- BeginNormalPaletteFade(0x20000, 0, 10, 10, 0x2108);
+ BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8));
}
static void sub_803980C(struct Sprite *sprite)
{
- if ((gUnknown_020243FC & 1) == 0)
+ if ((gIntroSlideFlags & 1) == 0)
{
sprite->pos2.x += 2;
if (sprite->pos2.x == 0)
@@ -2432,11 +2646,11 @@ static void sub_8039838(struct Sprite *sprite)
{
if (sprite->animEnded)
{
- sub_8076918(sprite->tBank);
- SetHealthboxSpriteVisible(gHealthBoxesIds[sprite->tBank]);
+ sub_8076918(sprite->sBattler);
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]);
sprite->callback = sub_8039894;
StartSpriteAnimIfDifferent(sprite, 0);
- BeginNormalPaletteFade(0x20000, 0, 10, 0, 0x2108);
+ BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8));
}
}
@@ -2444,7 +2658,7 @@ static void sub_8039894(struct Sprite *sprite)
{
if (!gPaletteFade.active)
{
- BattleAnimateFrontSprite(sprite, sprite->tSpeciesId, FALSE, 1);
+ BattleAnimateFrontSprite(sprite, sprite->sSpeciesId, FALSE, 1);
}
}
@@ -2455,24 +2669,24 @@ void SpriteCallbackDummy_2(struct Sprite *sprite)
static void sub_80398BC(struct Sprite *sprite) // unused?
{
- sprite->data3 = 6;
- sprite->data4 = 1;
+ sprite->data[3] = 6;
+ sprite->data[4] = 1;
sprite->callback = sub_80398D0;
}
static void sub_80398D0(struct Sprite *sprite)
{
- sprite->data4--;
- if (sprite->data4 == 0)
+ sprite->data[4]--;
+ if (sprite->data[4] == 0)
{
- sprite->data4 = 8;
+ sprite->data[4] = 8;
sprite->invisible ^= 1;
- sprite->data3--;
- if (sprite->data3 == 0)
+ sprite->data[3]--;
+ if (sprite->data[3] == 0)
{
sprite->invisible = FALSE;
sprite->callback = SpriteCallbackDummy_2;
- gUnknown_02022F88 = 0;
+ sUnusedUnknownArray[0] = 0;
}
}
}
@@ -2480,35 +2694,35 @@ static void sub_80398D0(struct Sprite *sprite)
extern const struct MonCoords gMonFrontPicCoords[];
extern const struct MonCoords gCastformFrontSpriteCoords[];
-void sub_8039934(struct Sprite *sprite)
+void SpriteCB_FaintOpponentMon(struct Sprite *sprite)
{
- u8 bank = sprite->tBank;
+ u8 battler = sprite->sBattler;
u16 species;
u8 yOffset;
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != 0)
- species = gBattleSpritesDataPtr->bankData[bank].transformSpecies;
+ if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != 0)
+ species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies;
else
- species = sprite->tSpeciesId;
+ species = sprite->sSpeciesId;
- GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_PERSONALITY); // Unused return value
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); // Unused return value.
if (species == SPECIES_UNOWN)
{
- u32 personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_PERSONALITY);
+ u32 personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY);
u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C);
u16 unownSpecies;
if (unownForm == 0)
- unownSpecies = SPECIES_UNOWN; // Use the A Unown form
+ unownSpecies = SPECIES_UNOWN; // Use the A Unown form.
else
- unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters
+ unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters.
yOffset = gMonFrontPicCoords[unownSpecies].y_offset;
}
else if (species == SPECIES_CASTFORM)
{
- yOffset = gCastformFrontSpriteCoords[gBattleMonForms[bank]].y_offset;
+ yOffset = gCastformFrontSpriteCoords[gBattleMonForms[battler]].y_offset;
}
else if (species > NUM_SPECIES)
{
@@ -2519,59 +2733,57 @@ void sub_8039934(struct Sprite *sprite)
yOffset = gMonFrontPicCoords[species].y_offset;
}
- sprite->data3 = 8 - yOffset / 8;
- sprite->data4 = 1;
- sprite->callback = sub_8039A48;
+ sprite->data[3] = 8 - yOffset / 8;
+ sprite->data[4] = 1;
+ sprite->callback = SpriteCB_AnimFaintOpponent;
}
-static void sub_8039A48(struct Sprite *sprite)
+static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite)
{
s32 i;
- sprite->data4--;
- if (sprite->data4 == 0)
+ if (--sprite->data[4] == 0)
{
- sprite->data4 = 2;
- sprite->pos2.y += 8;
- sprite->data3--;
- if (sprite->data3 < 0)
+ sprite->data[4] = 2;
+ sprite->pos2.y += 8; // Move the sprite down.
+ if (--sprite->data[3] < 0)
{
FreeSpriteOamMatrix(sprite);
DestroySprite(sprite);
}
- else
+ else // Erase bottom part of the sprite to create a smooth illusion of mon falling down.
{
- u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBankIdentity(sprite->tBank)] + (gBattleMonForms[sprite->tBank] << 11) + (sprite->data3 << 8);
+ u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8);
for (i = 0; i < 0x100; i++)
*(dst++) = 0;
- StartSpriteAnim(sprite, gBattleMonForms[sprite->tBank]);
+ StartSpriteAnim(sprite, gBattleMonForms[sprite->sBattler]);
}
}
}
void sub_8039AD8(struct Sprite *sprite)
{
- sprite->data3 = 8;
- sprite->data4 = sprite->invisible;
+ sprite->data[3] = 8;
+ sprite->data[4] = sprite->invisible;
sprite->callback = sub_8039AF4;
}
static void sub_8039AF4(struct Sprite *sprite)
{
- sprite->data3--;
- if (sprite->data3 == 0)
+ sprite->data[3]--;
+ if (sprite->data[3] == 0)
{
sprite->invisible ^= 1;
- sprite->data3 = 8;
+ sprite->data[3] = 8;
}
}
void sub_8039B2C(struct Sprite *sprite)
{
- sprite->invisible = sprite->data4;
- sprite->data4 = FALSE;
+ sprite->invisible = sprite->data[4];
+ sprite->data[4] = FALSE;
sprite->callback = SpriteCallbackDummy_2;
}
@@ -2581,10 +2793,10 @@ void sub_8039B58(struct Sprite *sprite)
{
if (!(gHitMarker & HITMARKER_NO_ANIMATIONS) || gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
{
- if (HasTwoFramesAnimation(sprite->tSpeciesId))
+ if (HasTwoFramesAnimation(sprite->sSpeciesId))
StartSpriteAnim(sprite, 1);
}
- BattleAnimateFrontSprite(sprite, sprite->tSpeciesId, TRUE, 1);
+ BattleAnimateFrontSprite(sprite, sprite->sSpeciesId, TRUE, 1);
}
}
@@ -2595,13 +2807,13 @@ void sub_8039BB4(struct Sprite *sprite)
static void oac_poke_ally_(struct Sprite *sprite)
{
- if ((gUnknown_020243FC & 1) == 0)
+ if (!(gIntroSlideFlags & 1))
{
sprite->pos2.x -= 2;
if (sprite->pos2.x == 0)
{
sprite->callback = SpriteCallbackDummy_3;
- sprite->data1 = 0;
+ sprite->data[1] = 0;
}
}
}
@@ -2617,96 +2829,111 @@ static void SpriteCallbackDummy_3(struct Sprite *sprite)
void sub_8039C00(struct Sprite *sprite)
{
- if (!(gUnknown_020243FC & 1))
+ if (!(gIntroSlideFlags & 1))
{
- sprite->pos2.x += sprite->data1;
- sprite->pos2.y += sprite->data2;
+ sprite->pos2.x += sprite->data[1];
+ sprite->pos2.y += sprite->data[2];
}
}
-void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d)
+#define sSinIndex data[0]
+#define sDelta data[1]
+#define sAmplitude data[2]
+#define sBouncerSpriteId data[3]
+#define sWhich data[4]
+
+void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude)
{
- u8 bounceHealthBoxSpriteId;
- u8 spriteId2;
+ u8 invisibleSpriteId;
+ u8 bouncerSpriteId;
- if (b)
+ switch (which)
{
- if (gBattleSpritesDataPtr->healthBoxesData[bank].flag_x2)
+ case BOUNCE_HEALTHBOX:
+ default:
+ if (gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing)
return;
- }
- else
- {
- if (gBattleSpritesDataPtr->healthBoxesData[bank].flag_x4)
+ break;
+ case BOUNCE_MON:
+ if (gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing)
return;
+ break;
}
- bounceHealthBoxSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HealthBoxBounce);
- if (b == TRUE)
+ invisibleSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_BounceEffect);
+ if (which == BOUNCE_HEALTHBOX)
{
- spriteId2 = gHealthBoxesIds[bank];
- gBattleSpritesDataPtr->healthBoxesData[bank].field_2 = bounceHealthBoxSpriteId;
- gBattleSpritesDataPtr->healthBoxesData[bank].flag_x2 = 1;
- gSprites[bounceHealthBoxSpriteId].data0 = 0x80;
+ bouncerSpriteId = gHealthboxSpriteIds[battler];
+ gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId = invisibleSpriteId;
+ gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 1;
+ gSprites[invisibleSpriteId].sSinIndex = 128; // 0
}
else
{
- spriteId2 = gBankSpriteIds[bank];
- gBattleSpritesDataPtr->healthBoxesData[bank].field_3 = bounceHealthBoxSpriteId;
- gBattleSpritesDataPtr->healthBoxesData[bank].flag_x4 = 1;
- gSprites[bounceHealthBoxSpriteId].data0 = 0xC0;
- }
- gSprites[bounceHealthBoxSpriteId].data1 = c;
- gSprites[bounceHealthBoxSpriteId].data2 = d;
- gSprites[bounceHealthBoxSpriteId].data3 = spriteId2;
- gSprites[bounceHealthBoxSpriteId].data4 = b;
- gSprites[spriteId2].pos2.x = 0;
- gSprites[spriteId2].pos2.y = 0;
+ bouncerSpriteId = gBattlerSpriteIds[battler];
+ gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId = invisibleSpriteId;
+ gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 1;
+ gSprites[invisibleSpriteId].sSinIndex = 192; // -1
+ }
+ gSprites[invisibleSpriteId].sDelta = delta;
+ gSprites[invisibleSpriteId].sAmplitude = amplitude;
+ gSprites[invisibleSpriteId].sBouncerSpriteId = bouncerSpriteId;
+ gSprites[invisibleSpriteId].sWhich = which;
+ gSprites[bouncerSpriteId].pos2.x = 0;
+ gSprites[bouncerSpriteId].pos2.y = 0;
}
-void dp11b_obj_free(u8 bank, bool8 b)
+void EndBounceEffect(u8 battler, u8 which)
{
- u8 r4;
+ u8 bouncerSpriteId;
- if (b == TRUE)
+ if (which == BOUNCE_HEALTHBOX)
{
- if (!gBattleSpritesDataPtr->healthBoxesData[bank].flag_x2)
+ if (!gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing)
return;
- r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_2].data3;
- DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_2]);
- gBattleSpritesDataPtr->healthBoxesData[bank].flag_x2 = 0;
+ bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId].sBouncerSpriteId;
+ DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId]);
+ gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 0;
}
else
{
- if (!gBattleSpritesDataPtr->healthBoxesData[bank].flag_x4)
+ if (!gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing)
return;
- r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_3].data3;
- DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].field_3]);
- gBattleSpritesDataPtr->healthBoxesData[bank].flag_x4 = 0;
+ bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId].sBouncerSpriteId;
+ DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId]);
+ gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 0;
}
- gSprites[r4].pos2.x = 0;
- gSprites[r4].pos2.y = 0;
+
+ gSprites[bouncerSpriteId].pos2.x = 0;
+ gSprites[bouncerSpriteId].pos2.y = 0;
}
-static void SpriteCB_HealthBoxBounce(struct Sprite *sprite)
+static void SpriteCB_BounceEffect(struct Sprite *sprite)
{
- u8 spriteId = sprite->data3;
- s32 var;
+ u8 bouncerSpriteId = sprite->sBouncerSpriteId;
+ s32 index;
- if (sprite->data4 == 1)
- var = sprite->data0;
+ if (sprite->sWhich == BOUNCE_HEALTHBOX)
+ index = sprite->sSinIndex;
else
- var = sprite->data0;
+ index = sprite->sSinIndex;
- gSprites[spriteId].pos2.y = Sin(var, sprite->data2) + sprite->data2;
- sprite->data0 = (sprite->data0 + sprite->data1) & 0xFF;
+ gSprites[bouncerSpriteId].pos2.y = Sin(index, sprite->sAmplitude) + sprite->sAmplitude;
+ sprite->sSinIndex = (sprite->sSinIndex + sprite->sDelta) & 0xFF;
}
+#undef sSinIndex
+#undef sDelta
+#undef sAmplitude
+#undef sBouncerSpriteId
+#undef sWhich
+
void sub_8039E44(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
- BattleAnimateBackSprite(sprite, sprite->tSpeciesId);
+ BattleAnimateBackSprite(sprite, sprite->sSpeciesId);
}
void sub_8039E60(struct Sprite *sprite)
@@ -2744,8 +2971,8 @@ static void BattleMainCB1(void)
{
gBattleMainFunc();
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- gBattleBankFunc[gActiveBank]();
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
+ gBattlerControllerFuncs[gActiveBattler]();
}
static void BattleStartClearSetData(void)
@@ -2757,7 +2984,7 @@ static void BattleStartClearSetData(void)
TurnValuesCleanUp(FALSE);
SpecialStatusesClear();
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
gStatuses3[i] = 0;
@@ -2765,30 +2992,30 @@ static void BattleStartClearSetData(void)
for (j = 0; j < sizeof(struct DisableStruct); j++)
dataPtr[j] = 0;
- gDisableStructs[i].isFirstTurn= 2;
- gUnknown_02024284[i] = 0;
- gLastUsedMovesByBanks[i] = 0;
- gUnknown_02024250[i] = 0;
- gUnknown_02024258[i] = 0;
- gUnknown_02024260[i] = 0;
- gUnknown_02024270[i] = 0xFF;
+ gDisableStructs[i].isFirstTurn = 2;
+ sUnusedBattlersArray[i] = 0;
+ gLastMoves[i] = 0;
+ gLastLandedMoves[i] = 0;
+ gLastHitByType[i] = 0;
+ gLastResultingMoves[i] = 0;
+ gLastHitBy[i] = 0xFF;
gLockedMoves[i] = 0;
- gUnknownMovesUsedByBanks[i] = 0;
+ gLastPrintedMoves[i] = 0;
gBattleResources->flags->flags[i] = 0;
- gUnknown_02024230[i] = 0;
+ gPalaceSelectionBattleScripts[i] = 0;
}
for (i = 0; i < 2; i++)
{
- gSideAffecting[i] = 0;
+ gSideStatuses[i] = 0;
dataPtr = (u8 *)&gSideTimers[i];
for (j = 0; j < sizeof(struct SideTimer); j++)
dataPtr[j] = 0;
}
- gBankAttacker = 0;
- gBankTarget = 0;
+ gBattlerAttacker = 0;
+ gBattlerTarget = 0;
gBattleWeather = 0;
dataPtr = (u8 *)&gWishFutureKnock;
@@ -2809,7 +3036,7 @@ static void BattleStartClearSetData(void)
gMultiHitCounter = 0;
gBattleOutcome = 0;
- gBattleExecBuffer = 0;
+ gBattleControllerExecFlags = 0;
gPaydayMoney = 0;
gBattleResources->battleScriptsStack->size = 0;
gBattleResources->battleCallbackStack->size = 0;
@@ -2819,16 +3046,16 @@ static void BattleStartClearSetData(void)
gPauseCounterBattle = 0;
gBattleMoveDamage = 0;
- gUnknown_020243FC = 0;
+ gIntroSlideFlags = 0;
gBattleScripting.animTurn = 0;
gBattleScripting.animTargetsHit = 0;
gLeveledUpInBattle = 0;
- gAbsentBankFlags = 0;
+ gAbsentBattlerFlags = 0;
gBattleStruct->runTries = 0;
- gBattleStruct->field_79 = 0;
- gBattleStruct->field_7A = 0;
- *(&gBattleStruct->field_7C) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;
- gBattleStruct->field_7B = 3;
+ gBattleStruct->safariGoNearCounter = 0;
+ gBattleStruct->safariPkblThrowCounter = 0;
+ *(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;
+ gBattleStruct->safariEscapeFactor = 3;
gBattleStruct->wildVictorySong = 0;
gBattleStruct->moneyMultiplier = 1;
@@ -2844,9 +3071,9 @@ static void BattleStartClearSetData(void)
*(i + 3 * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
}
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- *(gBattleStruct->AI_monToSwitchIntoId + i) = 6;
+ *(gBattleStruct->AI_monToSwitchIntoId + i) = PARTY_SIZE;
}
gBattleStruct->field_DF = 0;
@@ -2858,7 +3085,7 @@ static void BattleStartClearSetData(void)
for (i = 0; i < sizeof(struct BattleResults); i++)
dataPtr[i] = 0;
- gBattleResults.unk5_6 = IsMonShiny(&gEnemyParty[0]);
+ gBattleResults.shinyWildMon = IsMonShiny(&gEnemyParty[0]);
gBattleStruct->field_2A0 = 0;
gBattleStruct->field_2A1 = 0;
@@ -2866,114 +3093,114 @@ static void BattleStartClearSetData(void)
void SwitchInClearSetData(void)
{
- struct DisableStruct disableStructCopy = gDisableStructs[gActiveBank];
+ struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler];
s32 i;
u8 *ptr;
if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS)
{
for (i = 0; i < BATTLE_STATS_NO; i++)
- gBattleMons[gActiveBank].statStages[i] = 6;
- for (i = 0; i < gNoOfAllBanks; i++)
+ gBattleMons[gActiveBattler].statStages[i] = 6;
+ for (i = 0; i < gBattlersCount; i++)
{
- if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBank)
+ if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler)
gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION;
- if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].bankWithSureHit == gActiveBank)
+ if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].battlerWithSureHit == gActiveBattler)
{
gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;
- gDisableStructs[i].bankWithSureHit = 0;
+ gDisableStructs[i].battlerWithSureHit = 0;
}
}
}
if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
{
- gBattleMons[gActiveBank].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED);
- gStatuses3[gActiveBank] &= (STATUS3_LEECHSEED_BANK | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT);
+ gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED);
+ gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT);
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (GetBankSide(gActiveBank) != GetBankSide(i)
+ if (GetBattlerSide(gActiveBattler) != GetBattlerSide(i)
&& (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0
- && (gDisableStructs[i].bankWithSureHit == gActiveBank))
+ && (gDisableStructs[i].battlerWithSureHit == gActiveBattler))
{
- gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;
+ gStatuses3[i] &= ~(STATUS3_ALWAYS_HITS);
gStatuses3[i] |= 0x10;
}
}
}
else
{
- gBattleMons[gActiveBank].status2 = 0;
- gStatuses3[gActiveBank] = 0;
+ gBattleMons[gActiveBattler].status2 = 0;
+ gStatuses3[gActiveBattler] = 0;
}
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBank))
- gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBank));
- if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBank)
+ if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler))
+ gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBattler));
+ if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler)
gBattleMons[i].status2 &= ~(STATUS2_WRAPPED);
}
- gActionSelectionCursor[gActiveBank] = 0;
- gMoveSelectionCursor[gActiveBank] = 0;
+ gActionSelectionCursor[gActiveBattler] = 0;
+ gMoveSelectionCursor[gActiveBattler] = 0;
- ptr = (u8 *)&gDisableStructs[gActiveBank];
+ ptr = (u8 *)&gDisableStructs[gActiveBattler];
for (i = 0; i < sizeof(struct DisableStruct); i++)
ptr[i] = 0;
if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
{
- gDisableStructs[gActiveBank].substituteHP = disableStructCopy.substituteHP;
- gDisableStructs[gActiveBank].bankWithSureHit = disableStructCopy.bankWithSureHit;
- gDisableStructs[gActiveBank].perishSongTimer1 = disableStructCopy.perishSongTimer1;
- gDisableStructs[gActiveBank].perishSongTimer2 = disableStructCopy.perishSongTimer2;
- gDisableStructs[gActiveBank].bankPreventingEscape = disableStructCopy.bankPreventingEscape;
+ gDisableStructs[gActiveBattler].substituteHP = disableStructCopy.substituteHP;
+ gDisableStructs[gActiveBattler].battlerWithSureHit = disableStructCopy.battlerWithSureHit;
+ gDisableStructs[gActiveBattler].perishSongTimer1 = disableStructCopy.perishSongTimer1;
+ gDisableStructs[gActiveBattler].perishSongTimer2 = disableStructCopy.perishSongTimer2;
+ gDisableStructs[gActiveBattler].battlerPreventingEscape = disableStructCopy.battlerPreventingEscape;
}
- gBattleMoveFlags = 0;
- gDisableStructs[gActiveBank].isFirstTurn= 2;
- gDisableStructs[gActiveBank].truantUnknownBit = disableStructCopy.truantUnknownBit;
- gLastUsedMovesByBanks[gActiveBank] = 0;
- gUnknown_02024250[gActiveBank] = 0;
- gUnknown_02024258[gActiveBank] = 0;
- gUnknown_02024260[gActiveBank] = 0;
- gUnknownMovesUsedByBanks[gActiveBank] = 0;
- gUnknown_02024270[gActiveBank] = 0xFF;
+ gMoveResultFlags = 0;
+ gDisableStructs[gActiveBattler].isFirstTurn = 2;
+ gDisableStructs[gActiveBattler].truantUnknownBit = disableStructCopy.truantUnknownBit;
+ gLastMoves[gActiveBattler] = 0;
+ gLastLandedMoves[gActiveBattler] = 0;
+ gLastHitByType[gActiveBattler] = 0;
+ gLastResultingMoves[gActiveBattler] = 0;
+ gLastPrintedMoves[gActiveBattler] = 0;
+ gLastHitBy[gActiveBattler] = 0xFF;
- *(gBattleStruct->mirrorMoves + gActiveBank * 2 + 0) = 0;
- *(gBattleStruct->mirrorMoves + gActiveBank * 2 + 1) = 0;
- *(0 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(0 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
- *(1 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(1 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
- *(2 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(2 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
- *(3 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(3 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(gBattleStruct->mirrorMoves + gActiveBattler * 2 + 0) = 0;
+ *(gBattleStruct->mirrorMoves + gActiveBattler * 2 + 1) = 0;
+ *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
- gBattleStruct->field_92 &= ~(gBitTable[gActiveBank]);
+ gBattleStruct->field_92 &= ~(gBitTable[gActiveBattler]);
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (i != gActiveBank && GetBankSide(i) != GetBankSide(gActiveBank))
+ if (i != gActiveBattler && GetBattlerSide(i) != GetBattlerSide(gActiveBattler))
{
*(gBattleStruct->mirrorMoves + i * 2 + 0) = 0;
*(gBattleStruct->mirrorMoves + i * 2 + 1) = 0;
}
- *(i * 8 + gActiveBank * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(i * 8 + gActiveBank * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
}
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBank]) + 0) = 0;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBank]) + 1) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = 0;
- gBattleResources->flags->flags[gActiveBank] = 0;
+ gBattleResources->flags->flags[gActiveBattler] = 0;
gCurrentMove = 0;
gBattleStruct->field_DA = 0xFF;
- ClearBankMoveHistory(gActiveBank);
- ClearBankAbilityHistory(gActiveBank);
+ ClearBattlerMoveHistory(gActiveBattler);
+ ClearBattlerAbilityHistory(gActiveBattler);
}
void FaintClearSetData(void)
@@ -2982,91 +3209,91 @@ void FaintClearSetData(void)
u8 *ptr;
for (i = 0; i < BATTLE_STATS_NO; i++)
- gBattleMons[gActiveBank].statStages[i] = 6;
+ gBattleMons[gActiveBattler].statStages[i] = 6;
- gBattleMons[gActiveBank].status2 = 0;
- gStatuses3[gActiveBank] = 0;
+ gBattleMons[gActiveBattler].status2 = 0;
+ gStatuses3[gActiveBattler] = 0;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBank)
+ if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].battlerPreventingEscape == gActiveBattler)
gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION;
- if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBank))
- gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBank));
- if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBank)
+ if (gBattleMons[i].status2 & STATUS2_INFATUATED_WITH(gActiveBattler))
+ gBattleMons[i].status2 &= ~(STATUS2_INFATUATED_WITH(gActiveBattler));
+ if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && *(gBattleStruct->wrappedBy + i) == gActiveBattler)
gBattleMons[i].status2 &= ~(STATUS2_WRAPPED);
}
- gActionSelectionCursor[gActiveBank] = 0;
- gMoveSelectionCursor[gActiveBank] = 0;
+ gActionSelectionCursor[gActiveBattler] = 0;
+ gMoveSelectionCursor[gActiveBattler] = 0;
- ptr = (u8 *)&gDisableStructs[gActiveBank];
+ ptr = (u8 *)&gDisableStructs[gActiveBattler];
for (i = 0; i < sizeof(struct DisableStruct); i++)
ptr[i] = 0;
- gProtectStructs[gActiveBank].protected = 0;
- gProtectStructs[gActiveBank].endured = 0;
- gProtectStructs[gActiveBank].onlyStruggle = 0;
- gProtectStructs[gActiveBank].helpingHand = 0;
- gProtectStructs[gActiveBank].bounceMove = 0;
- gProtectStructs[gActiveBank].stealMove = 0;
- gProtectStructs[gActiveBank].flag0Unknown = 0;
- gProtectStructs[gActiveBank].prlzImmobility = 0;
- gProtectStructs[gActiveBank].confusionSelfDmg = 0;
- gProtectStructs[gActiveBank].targetNotAffected = 0;
- gProtectStructs[gActiveBank].chargingTurn = 0;
- gProtectStructs[gActiveBank].fleeFlag = 0;
- gProtectStructs[gActiveBank].usedImprisionedMove = 0;
- gProtectStructs[gActiveBank].loveImmobility = 0;
- gProtectStructs[gActiveBank].usedDisabledMove = 0;
- gProtectStructs[gActiveBank].usedTauntedMove = 0;
- gProtectStructs[gActiveBank].flag2Unknown = 0;
- gProtectStructs[gActiveBank].flinchImmobility = 0;
- gProtectStructs[gActiveBank].notFirstStrike = 0;
-
- gDisableStructs[gActiveBank].isFirstTurn = 2;
-
- gLastUsedMovesByBanks[gActiveBank] = 0;
- gUnknown_02024250[gActiveBank] = 0;
- gUnknown_02024258[gActiveBank] = 0;
- gUnknown_02024260[gActiveBank] = 0;
- gUnknownMovesUsedByBanks[gActiveBank] = 0;
- gUnknown_02024270[gActiveBank] = 0xFF;
-
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBank]) + 0) = 0;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBank]) + 1) = 0;
-
- *(gBattleStruct->mirrorMoves + gActiveBank * 2 + 0) = 0;
- *(gBattleStruct->mirrorMoves + gActiveBank * 2 + 1) = 0;
- *(0 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(0 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
- *(1 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(1 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
- *(2 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(2 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
- *(3 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(3 * 2 + gActiveBank * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
-
- gBattleStruct->field_92 &= ~(gBitTable[gActiveBank]);
-
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- if (i != gActiveBank && GetBankSide(i) != GetBankSide(gActiveBank))
+ gProtectStructs[gActiveBattler].protected = 0;
+ gProtectStructs[gActiveBattler].endured = 0;
+ gProtectStructs[gActiveBattler].noValidMoves = 0;
+ gProtectStructs[gActiveBattler].helpingHand = 0;
+ gProtectStructs[gActiveBattler].bounceMove = 0;
+ gProtectStructs[gActiveBattler].stealMove = 0;
+ gProtectStructs[gActiveBattler].flag0Unknown = 0;
+ gProtectStructs[gActiveBattler].prlzImmobility = 0;
+ gProtectStructs[gActiveBattler].confusionSelfDmg = 0;
+ gProtectStructs[gActiveBattler].targetNotAffected = 0;
+ gProtectStructs[gActiveBattler].chargingTurn = 0;
+ gProtectStructs[gActiveBattler].fleeFlag = 0;
+ gProtectStructs[gActiveBattler].usedImprisionedMove = 0;
+ gProtectStructs[gActiveBattler].loveImmobility = 0;
+ gProtectStructs[gActiveBattler].usedDisabledMove = 0;
+ gProtectStructs[gActiveBattler].usedTauntedMove = 0;
+ gProtectStructs[gActiveBattler].flag2Unknown = 0;
+ gProtectStructs[gActiveBattler].flinchImmobility = 0;
+ gProtectStructs[gActiveBattler].notFirstStrike = 0;
+
+ gDisableStructs[gActiveBattler].isFirstTurn = 2;
+
+ gLastMoves[gActiveBattler] = 0;
+ gLastLandedMoves[gActiveBattler] = 0;
+ gLastHitByType[gActiveBattler] = 0;
+ gLastResultingMoves[gActiveBattler] = 0;
+ gLastPrintedMoves[gActiveBattler] = 0;
+ gLastHitBy[gActiveBattler] = 0xFF;
+
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = 0;
+
+ *(gBattleStruct->mirrorMoves + gActiveBattler * 2 + 0) = 0;
+ *(gBattleStruct->mirrorMoves + gActiveBattler * 2 + 1) = 0;
+ *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+
+ gBattleStruct->field_92 &= ~(gBitTable[gActiveBattler]);
+
+ for (i = 0; i < gBattlersCount; i++)
+ {
+ if (i != gActiveBattler && GetBattlerSide(i) != GetBattlerSide(gActiveBattler))
{
*(gBattleStruct->mirrorMoves + i * 2 + 0) = 0;
*(gBattleStruct->mirrorMoves + i * 2 + 1) = 0;
}
- *(i * 8 + gActiveBank * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
- *(i * 8 + gActiveBank * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
+ *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = 0;
+ *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = 0;
}
- gBattleResources->flags->flags[gActiveBank] = 0;
+ gBattleResources->flags->flags[gActiveBattler] = 0;
- gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1;
- gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2;
+ gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1;
+ gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2;
- ClearBankMoveHistory(gActiveBank);
- ClearBankAbilityHistory(gActiveBank);
+ ClearBattlerMoveHistory(gActiveBattler);
+ ClearBattlerAbilityHistory(gActiveBattler);
}
static void BattleIntroGetMonsData(void)
@@ -3074,16 +3301,16 @@ static void BattleIntroGetMonsData(void)
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
- gActiveBank = gBattleCommunication[1];
- EmitGetMonData(0, 0, 0);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattleCommunication[1];
+ BtlController_EmitGetMonData(0, 0, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 1:
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
gBattleCommunication[1]++;
- if (gBattleCommunication[1] == gNoOfAllBanks)
+ if (gBattleCommunication[1] == gBattlersCount)
gBattleMainFunc = BattleIntroPrepareBackgroundSlide;
else
gBattleCommunication[MULTIUSE_STATE] = 0;
@@ -3094,11 +3321,11 @@ static void BattleIntroGetMonsData(void)
static void BattleIntroPrepareBackgroundSlide(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = GetBankByIdentity(0);
- EmitIntroSlide(0, gBattleTerrain);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerAtPosition(0);
+ BtlController_EmitIntroSlide(0, gBattleTerrain);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites;
gBattleCommunication[0] = 0;
gBattleCommunication[1] = 0;
@@ -3110,15 +3337,15 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
u8 *ptr;
s32 i;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- && GetBankSide(gActiveBank) == SIDE_PLAYER)
+ && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
- ptr = (u8 *)&gBattleMons[gActiveBank];
+ ptr = (u8 *)&gBattleMons[gActiveBattler];
for (i = 0; i < sizeof(struct BattlePokemon); i++)
ptr[i] = 0;
}
@@ -3126,46 +3353,46 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
{
u16* hpOnSwitchout;
- ptr = (u8 *)&gBattleMons[gActiveBank];
+ ptr = (u8 *)&gBattleMons[gActiveBattler];
for (i = 0; i < sizeof(struct BattlePokemon); i++)
- ptr[i] = gBattleBufferB[gActiveBank][4 + i];
+ ptr[i] = gBattleBufferB[gActiveBattler][4 + i];
- gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1;
- gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2;
- gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility);
- hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBankSide(gActiveBank)];
- *hpOnSwitchout = gBattleMons[gActiveBank].hp;
+ gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1;
+ gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2;
+ gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].altAbility);
+ hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)];
+ *hpOnSwitchout = gBattleMons[gActiveBattler].hp;
for (i = 0; i < BATTLE_STATS_NO; i++)
- gBattleMons[gActiveBank].statStages[i] = 6;
- gBattleMons[gActiveBank].status2 = 0;
+ gBattleMons[gActiveBattler].statStages[i] = 6;
+ gBattleMons[gActiveBattler].status2 = 0;
}
- if (GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON1)
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT)
{
- EmitDrawTrainerPic(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitDrawTrainerPic(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
- if (GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON1)
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT)
{
- EmitDrawTrainerPic(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitDrawTrainerPic(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT
&& !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_LINK
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_x4000000)))
{
- HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), FLAG_SET_SEEN, gBattleMons[gActiveBank].personality);
+ HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);
}
}
else
{
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
{
if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
@@ -3173,28 +3400,28 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_x4000000)))
{
- HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), FLAG_SET_SEEN, gBattleMons[gActiveBank].personality);
+ HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);
}
- EmitLoadMonSprite(0);
- MarkBufferBankForExecution(gActiveBank);
- gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES, NULL);
+ BtlController_EmitLoadMonSprite(0);
+ MarkBattlerForControllerExec(gActiveBattler);
+ gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL);
}
}
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- if (GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON2
- || GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON2)
+ if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT
+ || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)
{
- EmitDrawTrainerPic(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitDrawTrainerPic(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
- if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBankIdentity(gActiveBank) == IDENTITY_OPPONENT_MON2)
+ if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)
{
- EmitDrawTrainerPic(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitDrawTrainerPic(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
@@ -3206,14 +3433,14 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
static void BattleIntroDrawPartySummaryScreens(void)
{
s32 i;
- struct HpAndStatus hpStatus[6];
+ struct HpAndStatus hpStatus[PARTY_SIZE];
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
@@ -3227,11 +3454,11 @@ static void BattleIntroDrawPartySummaryScreens(void)
hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS);
}
}
- gActiveBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- EmitDrawPartyStatusSummary(0, hpStatus, 0x80);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80);
+ MarkBattlerForControllerExec(gActiveBattler);
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
@@ -3245,9 +3472,9 @@ static void BattleIntroDrawPartySummaryScreens(void)
hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
}
}
- gActiveBank = GetBankByIdentity(IDENTITY_PLAYER_MON1);
- EmitDrawPartyStatusSummary(0, hpStatus, 0x80);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle;
}
@@ -3257,7 +3484,7 @@ static void BattleIntroDrawPartySummaryScreens(void)
// wild battles don't show the party summary.
// Still, there's no point in having dead code.
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
@@ -3279,17 +3506,17 @@ static void BattleIntroDrawPartySummaryScreens(void)
static void BattleIntroPrintTrainerWantsToBattle(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- PrepareStringBattle(STRINGID_INTROMSG, gActiveBank);
+ gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ PrepareStringBattle(STRINGID_INTROMSG, gActiveBattler);
gBattleMainFunc = BattleIntroPrintOpponentSendsOut;
}
}
static void BattleIntroPrintWildMonAttacked(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
gBattleMainFunc = BattleIntroPrintPlayerSendsOut;
PrepareStringBattle(STRINGID_INTROMSG, 0);
@@ -3298,49 +3525,49 @@ static void BattleIntroPrintWildMonAttacked(void)
static void BattleIntroPrintOpponentSendsOut(void)
{
- u32 identity;
+ u32 position;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
else
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
}
else
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
- PrepareStringBattle(STRINGID_INTROSENDOUT, GetBankByIdentity(identity));
+ PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(position));
gBattleMainFunc = BattleIntroOpponent1SendsOutMonAnimation;
}
static void BattleIntroOpponent2SendsOutMonAnimation(void)
{
- u32 identity;
+ u32 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
- identity = IDENTITY_OPPONENT_MON2;
+ position = B_POSITION_OPPONENT_RIGHT;
else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
- identity = IDENTITY_OPPONENT_MON2;
+ position = B_POSITION_OPPONENT_RIGHT;
else
- identity = IDENTITY_PLAYER_MON2;
+ position = B_POSITION_PLAYER_RIGHT;
}
else
- identity = IDENTITY_OPPONENT_MON2;
+ position = B_POSITION_OPPONENT_RIGHT;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankIdentity(gActiveBank) == identity)
+ if (GetBattlerPosition(gActiveBattler) == position)
{
- EmitIntroTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitIntroTrainerBallThrow(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
@@ -3350,29 +3577,29 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void)
#ifdef NONMATCHING
static void BattleIntroOpponent1SendsOutMonAnimation(void)
{
- u32 identity;
+ u32 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
else
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
}
else
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankIdentity(gActiveBank) == identity)
+ if (GetBattlerPosition(gActiveBattler) == position)
{
- EmitIntroTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitIntroTrainerBallThrow(0);
+ MarkBattlerForControllerExec(gActiveBattler);
if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS))
{
gBattleMainFunc = BattleIntroOpponent2SendsOutMonAnimation;
@@ -3383,9 +3610,8 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void)
gBattleMainFunc = BattleIntroRecordMonsToDex;
}
-
#else
-__attribute__((naked))
+NAKED
static void BattleIntroOpponent1SendsOutMonAnimation(void)
{
asm(".syntax unified\n\
@@ -3418,13 +3644,13 @@ _0803B288:\n\
_0803B298:\n\
movs r5, 0x1\n\
_0803B29A:\n\
- ldr r0, =gBattleExecBuffer\n\
+ ldr r0, =gBattleControllerExecFlags\n\
ldr r2, [r0]\n\
cmp r2, 0\n\
bne _0803B2F2\n\
- ldr r0, =gActiveBank\n\
+ ldr r0, =gActiveBattler\n\
strb r2, [r0]\n\
- ldr r1, =gNoOfAllBanks\n\
+ ldr r1, =gBattlersCount\n\
adds r4, r0, 0\n\
ldrb r1, [r1]\n\
cmp r2, r1\n\
@@ -3432,15 +3658,15 @@ _0803B29A:\n\
adds r6, r4, 0\n\
_0803B2B2:\n\
ldrb r0, [r4]\n\
- bl GetBankIdentity\n\
+ bl GetBattlerPosition\n\
lsls r0, 24\n\
lsrs r0, 24\n\
cmp r0, r5\n\
bne _0803B2D8\n\
movs r0, 0\n\
- bl EmitIntroTrainerBallThrow\n\
+ bl BtlController_EmitIntroTrainerBallThrow\n\
ldrb r0, [r4]\n\
- bl MarkBufferBankForExecution\n\
+ bl MarkBattlerForControllerExec\n\
ldr r0, =gBattleTypeFlags\n\
ldr r0, [r0]\n\
ldr r1, =0x00008040\n\
@@ -3451,10 +3677,10 @@ _0803B2D8:\n\
ldrb r0, [r6]\n\
adds r0, 0x1\n\
strb r0, [r6]\n\
- ldr r1, =gNoOfAllBanks\n\
+ ldr r1, =gBattlersCount\n\
lsls r0, 24\n\
lsrs r0, 24\n\
- ldr r4, =gActiveBank\n\
+ ldr r4, =gActiveBattler\n\
ldrb r1, [r1]\n\
cmp r0, r1\n\
bcc _0803B2B2\n\
@@ -3470,23 +3696,22 @@ _0803B2F2:\n\
.pool\n\
.syntax divided");
}
-
#endif // NONMATCHING
static void BattleIntroRecordMonsToDex(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT
&& !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_LINK
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_x4000000)))
{
- HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), FLAG_SET_SEEN, gBattleMons[gActiveBank].personality);
+ HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);
}
}
gBattleMainFunc = BattleIntroPrintPlayerSendsOut;
@@ -3495,30 +3720,30 @@ static void BattleIntroRecordMonsToDex(void)
void sub_803B3AC(void) // unused
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
gBattleMainFunc = BattleIntroPrintPlayerSendsOut;
}
static void BattleIntroPrintPlayerSendsOut(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- u8 identity;
+ u8 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
else
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
}
else
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
- PrepareStringBattle(STRINGID_INTROSENDOUT, GetBankByIdentity(identity));
+ PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(position));
gBattleMainFunc = BattleIntroPlayer1SendsOutMonAnimation;
}
@@ -3526,26 +3751,26 @@ static void BattleIntroPrintPlayerSendsOut(void)
static void BattleIntroPlayer2SendsOutMonAnimation(void)
{
- u32 identity;
+ u32 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
- identity = IDENTITY_PLAYER_MON2;
+ position = B_POSITION_PLAYER_RIGHT;
else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
- identity = IDENTITY_PLAYER_MON2;
+ position = B_POSITION_PLAYER_RIGHT;
else
- identity = IDENTITY_OPPONENT_MON2;
+ position = B_POSITION_OPPONENT_RIGHT;
}
else
- identity = IDENTITY_PLAYER_MON2;
+ position = B_POSITION_PLAYER_RIGHT;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankIdentity(gActiveBank) == identity)
+ if (GetBattlerPosition(gActiveBattler) == position)
{
- EmitIntroTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitIntroTrainerBallThrow(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
@@ -3558,29 +3783,29 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void)
static void BattleIntroPlayer1SendsOutMonAnimation(void)
{
- u32 identity;
+ u32 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
else
- identity = IDENTITY_OPPONENT_MON1;
+ position = B_POSITION_OPPONENT_LEFT;
}
else
- identity = IDENTITY_PLAYER_MON1;
+ position = B_POSITION_PLAYER_LEFT;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankIdentity(gActiveBank) == identity)
+ if (GetBattlerPosition(gActiveBattler) == position)
{
- EmitIntroTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitIntroTrainerBallThrow(0);
+ MarkBattlerForControllerExec(gActiveBattler);
if (gBattleTypeFlags & (BATTLE_TYPE_MULTI))
{
gBattleMainFunc = BattleIntroPlayer2SendsOutMonAnimation;
@@ -3598,14 +3823,14 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void)
void sub_803B598(void) // unused
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
- EmitSwitchInAnim(0, gBattlePartyID[gActiveBank], FALSE);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSwitchInAnim(0, gBattlerPartyIndexes[gActiveBattler], FALSE);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
@@ -3623,18 +3848,18 @@ static void TryDoEventsBeforeFirstTurn(void)
s32 j;
u8 effect = 0;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
if (gBattleStruct->switchInAbilitiesCounter == 0)
{
- for (i = 0; i < gNoOfAllBanks; i++)
- gBanksByTurnOrder[i] = i;
- for (i = 0; i < gNoOfAllBanks - 1; i++)
+ for (i = 0; i < gBattlersCount; i++)
+ gBattlerByTurnOrder[i] = i;
+ for (i = 0; i < gBattlersCount - 1; i++)
{
- for (j = i + 1; j < gNoOfAllBanks; j++)
+ for (j = i + 1; j < gBattlersCount; j++)
{
- if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], TRUE) != 0)
+ if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) != 0)
SwapTurnOrder(i, j);
}
}
@@ -3645,10 +3870,10 @@ static void TryDoEventsBeforeFirstTurn(void)
gBattleStruct->overworldWeatherDone = TRUE;
return;
}
- // check all switch in abilities happening from the fastest mon to slowest
- while (gBattleStruct->switchInAbilitiesCounter < gNoOfAllBanks)
+ // Check all switch in abilities happening from the fastest mon to slowest.
+ while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount)
{
- if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBanksByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0)
+ if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0)
effect++;
gBattleStruct->switchInAbilitiesCounter++;
@@ -3660,10 +3885,10 @@ static void TryDoEventsBeforeFirstTurn(void)
return;
if (AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) != 0)
return;
- // check all switch in items having effect from the fastest mon to slowest
- while (gBattleStruct->switchInItemsCounter < gNoOfAllBanks)
+ // Check all switch in items having effect from the fastest mon to slowest.
+ while (gBattleStruct->switchInItemsCounter < gBattlersCount)
{
- if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBanksByTurnOrder[gBattleStruct->switchInItemsCounter], 0) != 0)
+ if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter], 0) != 0)
effect++;
gBattleStruct->switchInItemsCounter++;
@@ -3671,40 +3896,40 @@ static void TryDoEventsBeforeFirstTurn(void)
if (effect)
return;
}
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- *(gBattleStruct->monToSwitchIntoId + i) = 6;
- gActionForBanks[i] = ACTION_INIT_VALUE;
- gChosenMovesByBanks[i] = MOVE_NONE;
+ *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE;
+ gChosenActionByBattler[i] = B_ACTION_NONE;
+ gChosenMoveByBattler[i] = MOVE_NONE;
}
TurnValuesCleanUp(FALSE);
SpecialStatusesClear();
- *(&gBattleStruct->field_91) = gAbsentBankFlags;
- BattleHandleAddTextPrinter(gText_EmptyString3, 0);
+ *(&gBattleStruct->field_91) = gAbsentBattlerFlags;
+ BattlePutTextOnWindow(gText_EmptyString3, 0);
gBattleMainFunc = HandleTurnActionSelectionState;
ResetSentPokesToOpponentValue();
for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++)
gBattleCommunication[i] = 0;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
gBattleMons[i].status2 &= ~(STATUS2_FLINCHED);
*(&gBattleStruct->turnEffectsTracker) = 0;
- *(&gBattleStruct->turnEffectsBank) = 0;
- *(&gBattleStruct->field_1A0) = 0;
- *(&gBattleStruct->field_1A1) = 0;
+ *(&gBattleStruct->turnEffectsBattlerId) = 0;
+ *(&gBattleStruct->wishPerishSongState) = 0;
+ *(&gBattleStruct->wishPerishSongBattlerId) = 0;
gBattleScripting.atk49_state = 0;
- gBattleStruct->field_4D = 0;
- gBattleStruct->turncountersTracker = 0;
- gBattleMoveFlags = 0;
+ gBattleStruct->faintedActionsState = 0;
+ gBattleStruct->turnCountersTracker = 0;
+ gMoveResultFlags = 0;
gRandomTurnNumber = Random();
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
{
StopCryAndClearCrySongs();
- BattleScriptExecute(gUnknown_082DB8BE);
+ BattleScriptExecute(BattleScript_82DB8BE);
}
}
@@ -3712,23 +3937,23 @@ static void HandleEndTurn_ContinueBattle(void)
{
s32 i;
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
gBattleMainFunc = BattleTurnPassed;
for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++)
gBattleCommunication[i] = 0;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
gBattleMons[i].status2 &= ~(STATUS2_FLINCHED);
- if ((gBattleMons[i].status1 & STATUS_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS))
+ if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS))
CancelMultiTurnMoves(i);
}
gBattleStruct->turnEffectsTracker = 0;
- gBattleStruct->turnEffectsBank = 0;
- gBattleStruct->field_1A0 = 0;
- gBattleStruct->field_1A1 = 0;
- gBattleStruct->turncountersTracker = 0;
- gBattleMoveFlags = 0;
+ gBattleStruct->turnEffectsBattlerId = 0;
+ gBattleStruct->wishPerishSongState = 0;
+ gBattleStruct->wishPerishSongBattlerId = 0;
+ gBattleStruct->turnCountersTracker = 0;
+ gMoveResultFlags = 0;
}
}
@@ -3739,15 +3964,15 @@ void BattleTurnPassed(void)
TurnValuesCleanUp(TRUE);
if (gBattleOutcome == 0)
{
- if (UpdateTurnCounters() != 0)
+ if (DoFieldEndTurnEffects())
return;
- if (TurnBasedEffects() != 0)
+ if (DoBattlerEndTurnEffects())
return;
}
- if (sub_8041728() != 0)
+ if (HandleFaintedMonActions())
return;
- gBattleStruct->field_4D = 0;
- if (sub_8041364() != 0)
+ gBattleStruct->faintedActionsState = 0;
+ if (HandleWishPerishSongOnTurnEnd())
return;
TurnValuesCleanUp(FALSE);
@@ -3759,7 +3984,7 @@ void BattleTurnPassed(void)
gBattleScripting.animTargetsHit = 0;
gBattleScripting.atk49_state = 0;
gBattleMoveDamage = 0;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
for (i = 0; i < 5; i++)
gBattleCommunication[i] = 0;
@@ -3777,24 +4002,24 @@ void BattleTurnPassed(void)
gBattleStruct->field_DA++;
}
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- gActionForBanks[i] = ACTION_INIT_VALUE;
- gChosenMovesByBanks[i] = MOVE_NONE;
+ gChosenActionByBattler[i] = B_ACTION_NONE;
+ gChosenMoveByBattler[i] = MOVE_NONE;
}
- for (i = 0; i < 4; i++)
- *(gBattleStruct->monToSwitchIntoId + i) = 6;
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
+ *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE;
- *(&gBattleStruct->field_91) = gAbsentBankFlags;
- BattleHandleAddTextPrinter(gText_EmptyString3, 0);
+ *(&gBattleStruct->field_91) = gAbsentBattlerFlags;
+ BattlePutTextOnWindow(gText_EmptyString3, 0);
gBattleMainFunc = HandleTurnActionSelectionState;
gRandomTurnNumber = Random();
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
- BattleScriptExecute(gUnknown_082DB881);
+ BattleScriptExecute(BattleScript_82DB881);
else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_DA == 0)
- BattleScriptExecute(gUnknown_082DB8BE);
+ BattleScriptExecute(BattleScript_82DB8BE);
}
u8 IsRunningFromBattleImpossible(void)
@@ -3803,54 +4028,53 @@ u8 IsRunningFromBattleImpossible(void)
u8 side;
s32 i;
- if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY)
- holdEffect = gEnigmaBerries[gActiveBank].holdEffect;
+ if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY)
+ holdEffect = gEnigmaBerries[gActiveBattler].holdEffect;
else
- holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item);
- gStringBank = gActiveBank;
+ gPotentialItemEffectBattler = gActiveBattler;
if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN)
return 0;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
return 0;
- if (gBattleMons[gActiveBank].ability == ABILITY_RUN_AWAY)
+ if (gBattleMons[gActiveBattler].ability == ABILITY_RUN_AWAY)
return 0;
- side = GetBankSide(gActiveBank);
+ side = GetBattlerSide(gActiveBattler);
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (side != GetBankSide(i)
+ if (side != GetBattlerSide(i)
&& gBattleMons[i].ability == ABILITY_SHADOW_TAG)
{
- gBattleScripting.bank = i;
+ gBattleScripting.battler = i;
gLastUsedAbility = gBattleMons[i].ability;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
return 2;
}
- if (side != GetBankSide(i)
- && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE
- && gBattleMons[gActiveBank].type1 != TYPE_FLYING
- && gBattleMons[gActiveBank].type2 != TYPE_FLYING
+ if (side != GetBattlerSide(i)
+ && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE
+ && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING)
&& gBattleMons[i].ability == ABILITY_ARENA_TRAP)
{
- gBattleScripting.bank = i;
+ gBattleScripting.battler = i;
gLastUsedAbility = gBattleMons[i].ability;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
return 2;
}
}
- i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK, gActiveBank, ABILITY_MAGNET_PULL, 0, 0);
- if (i != 0 && (gBattleMons[gActiveBank].type1 == TYPE_STEEL || gBattleMons[gActiveBank].type2 == TYPE_STEEL))
+ i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0);
+ if (i != 0 && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))
{
- gBattleScripting.bank = i - 1;
+ gBattleScripting.battler = i - 1;
gLastUsedAbility = gBattleMons[i - 1].ability;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
return 2;
}
- if ((gBattleMons[gActiveBank].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))
- || (gStatuses3[gActiveBank] & STATUS3_ROOTED))
+ if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))
+ || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
return 1;
@@ -3863,34 +4087,34 @@ u8 IsRunningFromBattleImpossible(void)
return 0;
}
-void sub_803BDA0(u8 bank)
+void sub_803BDA0(u8 battler)
{
s32 i;
u8 r4;
u8 r1;
- // gBattleStruct->field_60[bank][i]
+ // gBattleStruct->field_60[battler][i]
for (i = 0; i < 3; i++)
- gUnknown_0203CF00[i] = *(bank * 3 + i + (u8*)(gBattleStruct->field_60));
+ gUnknown_0203CF00[i] = *(battler * 3 + i + (u8*)(gBattleStruct->field_60));
- r4 = pokemon_order_func(gBattlePartyID[bank]);
- r1 = pokemon_order_func(*(gBattleStruct->monToSwitchIntoId + bank));
+ r4 = pokemon_order_func(gBattlerPartyIndexes[battler]);
+ r1 = pokemon_order_func(*(gBattleStruct->monToSwitchIntoId + battler));
sub_81B8FB0(r4, r1);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
for (i = 0; i < 3; i++)
{
- *(bank * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
- *((bank ^ BIT_MON) * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
+ *(battler * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
+ *(BATTLE_PARTNER(battler) * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
}
}
else
{
for (i = 0; i < 3; i++)
{
- *(bank * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
+ *(battler * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
}
}
}
@@ -3913,235 +4137,233 @@ static void HandleTurnActionSelectionState(void)
s32 i;
gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- u8 identity = GetBankIdentity(gActiveBank);
- switch (gBattleCommunication[gActiveBank])
+ u8 position = GetBattlerPosition(gActiveBattler);
+ switch (gBattleCommunication[gActiveBattler])
{
- case STATE_TURN_START_RECORD: // recorded battle related on start of every turn
- RecordedBattle_CopyBankMoves();
- gBattleCommunication[gActiveBank] = STATE_BEFORE_ACTION_CHOSEN;
+ case STATE_TURN_START_RECORD: // Recorded battle related action on start of every turn.
+ RecordedBattle_CopyBattlerMoves();
+ gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
break;
- case STATE_BEFORE_ACTION_CHOSEN: // choose an action
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = 6;
+ case STATE_BEFORE_ACTION_CHOSEN: // Choose an action.
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE;
if (gBattleTypeFlags & BATTLE_TYPE_MULTI
- || !(identity & BIT_MON)
- || gBattleStruct->field_91 & gBitTable[GetBankByIdentity(identity ^ BIT_MON)]
- || gBattleCommunication[GetBankByIdentity(identity ^ BIT_MON)] == 5)
+ || (position & BIT_FLANK) == B_FLANK_LEFT
+ || gBattleStruct->field_91 & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))]
+ || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED)
{
- if (gBattleStruct->field_91 & gBitTable[gActiveBank])
+ if (gBattleStruct->field_91 & gBitTable[gActiveBattler])
{
- gActionForBanks[gActiveBank] = ACTION_NOTHING_FAINTED;
+ gChosenActionByBattler[gActiveBattler] = B_ACTION_NOTHING_FAINTED;
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
- gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED;
+ gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED;
else
- gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
+ gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
}
else
{
- if (gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS
- || gBattleMons[gActiveBank].status2 & STATUS2_RECHARGE)
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS
+ || gBattleMons[gActiveBattler].status2 & STATUS2_RECHARGE)
{
- gActionForBanks[gActiveBank] = ACTION_USE_MOVE;
- gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
+ gChosenActionByBattler[gActiveBattler] = B_ACTION_USE_MOVE;
+ gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
}
else
{
- EmitChooseAction(0, gActionForBanks[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8));
- MarkBufferBankForExecution(gActiveBank);
- gBattleCommunication[gActiveBank]++;
+ BtlController_EmitChooseAction(0, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8));
+ MarkBattlerForControllerExec(gActiveBattler);
+ gBattleCommunication[gActiveBattler]++;
}
}
}
break;
- case STATE_WAIT_ACTION_CHOSEN: // try to perform an action
- if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
+ case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action.
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
{
- RecordedBattle_SetBankAction(gActiveBank, gBattleBufferB[gActiveBank][1]);
- gActionForBanks[gActiveBank] = gBattleBufferB[gActiveBank][1];
+ RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]);
+ gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1];
- switch (gBattleBufferB[gActiveBank][1])
+ switch (gBattleBufferB[gActiveBattler][1])
{
- case ACTION_USE_MOVE:
+ case B_ACTION_USE_MOVE:
if (AreAllMovesUnusable())
{
- gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
- *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
- *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
- *(gBattleStruct->moveTarget + gActiveBank) = gBattleBufferB[gActiveBank][3];
+ gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
+ *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3];
return;
}
- else if (gDisableStructs[gActiveBank].encoredMove != 0)
+ else if (gDisableStructs[gActiveBattler].encoredMove != 0)
{
- gChosenMovesByBanks[gActiveBank] = gDisableStructs[gActiveBank].encoredMove;
- *(gBattleStruct->chosenMovePositions + gActiveBank) = gDisableStructs[gActiveBank].encoredMovePos;
- gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
+ gChosenMoveByBattler[gActiveBattler] = gDisableStructs[gActiveBattler].encoredMove;
+ *(gBattleStruct->chosenMovePositions + gActiveBattler) = gDisableStructs[gActiveBattler].encoredMovePos;
+ gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
return;
}
else
{
struct ChooseMoveStruct moveInfo;
- moveInfo.species = gBattleMons[gActiveBank].species;
- moveInfo.monType1 = gBattleMons[gActiveBank].type1;
- moveInfo.monType2 = gBattleMons[gActiveBank].type2;
+ moveInfo.species = gBattleMons[gActiveBattler].species;
+ moveInfo.monType1 = gBattleMons[gActiveBattler].type1;
+ moveInfo.monType2 = gBattleMons[gActiveBattler].type2;
for (i = 0; i < 4; i++)
{
- moveInfo.moves[i] = gBattleMons[gActiveBank].moves[i];
- moveInfo.currentPp[i] = gBattleMons[gActiveBank].pp[i];
+ moveInfo.moves[i] = gBattleMons[gActiveBattler].moves[i];
+ moveInfo.currentPp[i] = gBattleMons[gActiveBattler].pp[i];
moveInfo.maxPp[i] = CalculatePPWithBonus(
- gBattleMons[gActiveBank].moves[i],
- gBattleMons[gActiveBank].ppBonuses,
+ gBattleMons[gActiveBattler].moves[i],
+ gBattleMons[gActiveBattler].ppBonuses,
i);
}
- EmitChooseMove(0, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitChooseMove(0, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo);
+ MarkBattlerForControllerExec(gActiveBattler);
}
break;
- case ACTION_USE_ITEM:
+ case B_ACTION_USE_ITEM:
if (gBattleTypeFlags & (BATTLE_TYPE_LINK
| BATTLE_TYPE_FRONTIER_NO_PYRAMID
| BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_x2000000))
{
- RecordedBattle_ClearBankAction(gActiveBank, 1);
- gBattlescriptPtrsForSelection[gActiveBank] = BattleScript_ActionSelectionItemsCantBeUsed;
- gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
- *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
- *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
+ RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed;
+ gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else
{
- EmitChooseItem(0, gBattleStruct->field_60[gActiveBank]);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitChooseItem(0, gBattleStruct->field_60[gActiveBattler]);
+ MarkBattlerForControllerExec(gActiveBattler);
}
break;
- case ACTION_SWITCH:
- *(gBattleStruct->field_58 + gActiveBank) = gBattlePartyID[gActiveBank];
- if (gBattleMons[gActiveBank].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)
+ case B_ACTION_SWITCH:
+ *(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
+ if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)
|| gBattleTypeFlags & BATTLE_TYPE_ARENA
- || gStatuses3[gActiveBank] & STATUS3_ROOTED)
+ || gStatuses3[gActiveBattler] & STATUS3_ROOTED)
{
- EmitChoosePokemon(0, 2, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBank]);
+ BtlController_EmitChoosePokemon(0, PARTY_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
}
- else if ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_SHADOW_TAG, 0, 0))
- || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_ARENA_TRAP, 0, 0))
- && gBattleMons[gActiveBank].type1 != TYPE_FLYING
- && gBattleMons[gActiveBank].type2 != TYPE_FLYING
- && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE)
- || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK, gActiveBank, ABILITY_MAGNET_PULL, 0, 0))
- && (gBattleMons[gActiveBank].type1 == TYPE_STEEL
- || gBattleMons[gActiveBank].type2 == TYPE_STEEL)))
+ else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG))
+ || ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP))
+ && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING)
+ && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE)
+ || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0))
+ && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL)))
{
- EmitChoosePokemon(0, ((i - 1) << 4) | 4, 6, gLastUsedAbility, gBattleStruct->field_60[gActiveBank]);
+ BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->field_60[gActiveBattler]);
}
else
{
- if (gActiveBank == 2 && gActionForBanks[0] == ACTION_SWITCH)
- EmitChoosePokemon(0, 0, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->field_60[gActiveBank]);
- else if (gActiveBank == 3 && gActionForBanks[1] == ACTION_SWITCH)
- EmitChoosePokemon(0, 0, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->field_60[gActiveBank]);
+ if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH)
+ BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
+ else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH)
+ BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
else
- EmitChoosePokemon(0, 0, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBank]);
+ BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]);
}
- MarkBufferBankForExecution(gActiveBank);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
- case ACTION_SAFARI_ZONE_BALL:
+ case B_ACTION_SAFARI_BALL:
if (IsPlayerPartyAndPokemonStorageFull())
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAB11;
- gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
- *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
- *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintFullBox;
+ gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
break;
- case ACTION_POKEBLOCK_CASE:
- EmitChooseItem(0, gBattleStruct->field_60[gActiveBank]);
- MarkBufferBankForExecution(gActiveBank);
+ case B_ACTION_SAFARI_POKEBLOCK:
+ BtlController_EmitChooseItem(0, gBattleStruct->field_60[gActiveBattler]);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
- case ACTION_CANCEL_PARTNER:
- gBattleCommunication[gActiveBank] = 7;
- gBattleCommunication[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] = 1;
- RecordedBattle_ClearBankAction(gActiveBank, 1);
- if (gBattleMons[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].status2 & STATUS2_MULTIPLETURNS
- || gBattleMons[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].status2 & STATUS2_RECHARGE)
+ case B_ACTION_CANCEL_PARTNER:
+ gBattleCommunication[gActiveBattler] = STATE_WAIT_SET_BEFORE_ACTION;
+ gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] = STATE_BEFORE_ACTION_CHOSEN;
+ RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
+ if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_MULTIPLETURNS
+ || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_RECHARGE)
{
- EmitCmd50(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitEndBounceEffect(0);
+ MarkBattlerForControllerExec(gActiveBattler);
return;
}
- else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_SWITCH)
+ else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] == B_ACTION_SWITCH)
{
- RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 2);
+ RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 2);
}
- else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_RUN)
+ else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] == B_ACTION_RUN)
{
- RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 1);
+ RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 1);
}
- else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_USE_MOVE
- && (gProtectStructs[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].onlyStruggle
- || gDisableStructs[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].encoredMove))
+ else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] == B_ACTION_USE_MOVE
+ && (gProtectStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].noValidMoves
+ || gDisableStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].encoredMove))
{
- RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 1);
+ RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 1);
}
else if (gBattleTypeFlags & BATTLE_TYPE_PALACE
- && gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_USE_MOVE)
+ && gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] == B_ACTION_USE_MOVE)
{
gRngValue = gBattlePalaceMoveSelectionRngValue;
- RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 1);
+ RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 1);
}
else
{
- RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 3);
+ RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3);
}
- EmitCmd50(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitEndBounceEffect(0);
+ MarkBattlerForControllerExec(gActiveBattler);
return;
}
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER
&& gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_x4000000)
- && gBattleBufferB[gActiveBank][1] == ACTION_RUN)
+ && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN)
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB9BA;
- gBattleCommunication[gActiveBank] = 8;
- *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
- *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_AskIfWantsToForfeitMatch;
+ gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT_MAY_RUN;
+ *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER
&& !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
- && gBattleBufferB[gActiveBank][1] == ACTION_RUN)
+ && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN)
{
- BattleScriptExecute(gUnknown_082DAAFE);
- gBattleCommunication[gActiveBank] = 1;
+ BattleScriptExecute(BattleScript_PrintCantRunFromTrainer);
+ gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
}
- else if (IsRunningFromBattleImpossible() != 0
- && gBattleBufferB[gActiveBank][1] == ACTION_RUN)
+ else if (IsRunningFromBattleImpossible()
+ && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN)
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAB0B;
- gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
- *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
- *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintCantEscapeFromBattle;
+ gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else
{
- gBattleCommunication[gActiveBank]++;
+ gBattleCommunication[gActiveBattler]++;
}
}
break;
case STATE_WAIT_ACTION_CASE_CHOSEN:
- if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
{
- switch (gActionForBanks[gActiveBank])
+ switch (gChosenActionByBattler[gActiveBattler])
{
- case ACTION_USE_MOVE:
- switch (gBattleBufferB[gActiveBank][1])
+ case B_ACTION_USE_MOVE:
+ switch (gBattleBufferB[gActiveBattler][1])
{
case 3:
case 4:
@@ -4150,203 +4372,206 @@ static void HandleTurnActionSelectionState(void)
case 7:
case 8:
case 9:
- gActionForBanks[gActiveBank] = gBattleBufferB[gActiveBank][1];
+ gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1];
return;
case 15:
- gActionForBanks[gActiveBank] = ACTION_SWITCH;
+ gChosenActionByBattler[gActiveBattler] = B_ACTION_SWITCH;
sub_803CDF8();
return;
default:
sub_818603C(2);
- if ((gBattleBufferB[gActiveBank][2] | (gBattleBufferB[gActiveBank][3] << 8)) == 0xFFFF)
+ if ((gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)) == 0xFFFF)
{
- gBattleCommunication[gActiveBank] = 1;
- RecordedBattle_ClearBankAction(gActiveBank, 1);
+ gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
+ RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
}
else if (TrySetCantSelectMoveBattleScript())
{
- RecordedBattle_ClearBankAction(gActiveBank, 1);
- gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
- *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
- gBattleBufferB[gActiveBank][1] = 0;
- *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_WAIT_ACTION_CHOSEN;
+ RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
+ gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE;
+ gBattleBufferB[gActiveBattler][1] = 0;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CHOSEN;
return;
}
else
{
if (!(gBattleTypeFlags & BATTLE_TYPE_PALACE))
{
- RecordedBattle_SetBankAction(gActiveBank, gBattleBufferB[gActiveBank][2]);
- RecordedBattle_SetBankAction(gActiveBank, gBattleBufferB[gActiveBank][3]);
+ RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][2]);
+ RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][3]);
}
- *(gBattleStruct->chosenMovePositions + gActiveBank) = gBattleBufferB[gActiveBank][2];
- gChosenMovesByBanks[gActiveBank] = gBattleMons[gActiveBank].moves[*(gBattleStruct->chosenMovePositions + gActiveBank)];
- *(gBattleStruct->moveTarget + gActiveBank) = gBattleBufferB[gActiveBank][3];
- gBattleCommunication[gActiveBank]++;
+ *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2];
+ gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)];
+ *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3];
+ gBattleCommunication[gActiveBattler]++;
}
break;
}
break;
- case ACTION_USE_ITEM:
- if ((gBattleBufferB[gActiveBank][1] | (gBattleBufferB[gActiveBank][2] << 8)) == 0)
+ case B_ACTION_USE_ITEM:
+ if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) == 0)
{
- gBattleCommunication[gActiveBank] = 1;
+ gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
}
else
{
- gLastUsedItem = (gBattleBufferB[gActiveBank][1] | (gBattleBufferB[gActiveBank][2] << 8));
- gBattleCommunication[gActiveBank]++;
+ gLastUsedItem = (gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8));
+ gBattleCommunication[gActiveBattler]++;
}
break;
- case ACTION_SWITCH:
- if (gBattleBufferB[gActiveBank][1] == 6)
+ case B_ACTION_SWITCH:
+ if (gBattleBufferB[gActiveBattler][1] == PARTY_SIZE)
{
- gBattleCommunication[gActiveBank] = 1;
- RecordedBattle_ClearBankAction(gActiveBank, 1);
+ gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
+ RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
}
else
{
sub_803CDF8();
- gBattleCommunication[gActiveBank]++;
+ gBattleCommunication[gActiveBattler]++;
}
break;
- case ACTION_RUN:
+ case B_ACTION_RUN:
gHitMarker |= HITMARKER_RUN;
- gBattleCommunication[gActiveBank]++;
+ gBattleCommunication[gActiveBattler]++;
break;
- case ACTION_WATCHES_CAREFULLY:
- gBattleCommunication[gActiveBank]++;
+ case B_ACTION_SAFARI_WATCH_CAREFULLY:
+ gBattleCommunication[gActiveBattler]++;
break;
- case ACTION_SAFARI_ZONE_BALL:
- gBattleCommunication[gActiveBank]++;
+ case B_ACTION_SAFARI_BALL:
+ gBattleCommunication[gActiveBattler]++;
break;
- case ACTION_POKEBLOCK_CASE:
- if ((gBattleBufferB[gActiveBank][1] | (gBattleBufferB[gActiveBank][2] << 8)) != 0)
+ case B_ACTION_SAFARI_POKEBLOCK:
+ if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) != 0)
{
- gBattleCommunication[gActiveBank]++;
+ gBattleCommunication[gActiveBattler]++;
}
else
{
- gBattleCommunication[gActiveBank] = STATE_BEFORE_ACTION_CHOSEN;
+ gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
}
break;
- case ACTION_GO_NEAR:
- gBattleCommunication[gActiveBank]++;
+ case B_ACTION_SAFARI_GO_NEAR:
+ gBattleCommunication[gActiveBattler]++;
break;
- case ACTION_SAFARI_ZONE_RUN:
+ case B_ACTION_SAFARI_RUN:
gHitMarker |= HITMARKER_RUN;
- gBattleCommunication[gActiveBank]++;
+ gBattleCommunication[gActiveBattler]++;
break;
- case ACTION_9:
- gBattleCommunication[gActiveBank]++;
+ case B_ACTION_WALLY_THROW:
+ gBattleCommunication[gActiveBattler]++;
break;
}
}
break;
case STATE_WAIT_ACTION_CONFIRMED_STANDBY:
- if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
{
- i = (sub_803CDB8() != 0);
+ if (AllAtActionConfirmed())
+ i = TRUE;
+ else
+ i = FALSE;
if (((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) != BATTLE_TYPE_DOUBLE)
- || (identity & BIT_MON)
- || (*(&gBattleStruct->field_91) & gBitTable[GetBankByIdentity(identity ^ BIT_MON)]))
+ || (position & BIT_FLANK) != B_FLANK_LEFT
+ || (*(&gBattleStruct->field_91) & gBitTable[GetBattlerAtPosition(position ^ BIT_FLANK)]))
{
- EmitLinkStandbyMsg(0, 0, i);
+ BtlController_EmitLinkStandbyMsg(0, 0, i);
}
else
{
- EmitLinkStandbyMsg(0, 1, i);
+ BtlController_EmitLinkStandbyMsg(0, 1, i);
}
- MarkBufferBankForExecution(gActiveBank);
- gBattleCommunication[gActiveBank]++;
+ MarkBattlerForControllerExec(gActiveBattler);
+ gBattleCommunication[gActiveBattler]++;
}
break;
case STATE_WAIT_ACTION_CONFIRMED:
- if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
{
gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++;
}
break;
case STATE_SELECTION_SCRIPT:
- if (*(gBattleStruct->selectionScriptFinished + gActiveBank))
+ if (*(gBattleStruct->selectionScriptFinished + gActiveBattler))
{
- gBattleCommunication[gActiveBank] = *(gBattleStruct->stateIdAfterSelScript + gActiveBank);
+ gBattleCommunication[gActiveBattler] = *(gBattleStruct->stateIdAfterSelScript + gActiveBattler);
}
else
{
- gBankAttacker = gActiveBank;
- gBattlescriptCurrInstr = gBattlescriptPtrsForSelection[gActiveBank];
- if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
+ gBattlerAttacker = gActiveBattler;
+ gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler];
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
{
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
- gBattlescriptPtrsForSelection[gActiveBank] = gBattlescriptCurrInstr;
+ gSelectionBattleScripts[gActiveBattler] = gBattlescriptCurrInstr;
}
break;
case STATE_WAIT_SET_BEFORE_ACTION:
- if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
{
- gBattleCommunication[gActiveBank] = 1;
+ gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
}
break;
case STATE_SELECTION_SCRIPT_MAY_RUN:
- if (*(gBattleStruct->selectionScriptFinished + gActiveBank))
+ if (*(gBattleStruct->selectionScriptFinished + gActiveBattler))
{
- if (gBattleBufferB[gActiveBank][1] == 13)
+ if (gBattleBufferB[gActiveBattler][1] == 13)
{
gHitMarker |= HITMARKER_RUN;
- gActionForBanks[gActiveBank] = ACTION_RUN;
- gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
+ gChosenActionByBattler[gActiveBattler] = B_ACTION_RUN;
+ gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
}
else
{
- RecordedBattle_ClearBankAction(gActiveBank, 1);
- gBattleCommunication[gActiveBank] = *(gBattleStruct->stateIdAfterSelScript + gActiveBank);
+ RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
+ gBattleCommunication[gActiveBattler] = *(gBattleStruct->stateIdAfterSelScript + gActiveBattler);
}
}
else
{
- gBankAttacker = gActiveBank;
- gBattlescriptCurrInstr = gBattlescriptPtrsForSelection[gActiveBank];
- if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
+ gBattlerAttacker = gActiveBattler;
+ gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler];
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
{
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
- gBattlescriptPtrsForSelection[gActiveBank] = gBattlescriptCurrInstr;
+ gSelectionBattleScripts[gActiveBattler] = gBattlescriptCurrInstr;
}
break;
}
}
- // check if everyone chose actions
- if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gNoOfAllBanks)
+ // Check if everyone chose actions.
+ if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gBattlersCount)
{
sub_818603C(1);
- gBattleMainFunc = SetActionsAndBanksTurnOrder;
+ gBattleMainFunc = SetActionsAndBattlersTurnOrder;
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gActionForBanks[i] == ACTION_SWITCH)
+ if (gChosenActionByBattler[i] == B_ACTION_SWITCH)
sub_80571DC(i, *(gBattleStruct->monToSwitchIntoId + i));
}
}
}
}
-static bool8 sub_803CDB8(void)
+static bool8 AllAtActionConfirmed(void)
{
- s32 i, var;
+ s32 i, count;
- for (var = 0, i = 0; i < gNoOfAllBanks; i++)
+ for (count = 0, i = 0; i < gBattlersCount; i++)
{
- if (gBattleCommunication[i] == 5)
- var++;
+ if (gBattleCommunication[i] == STATE_WAIT_ACTION_CONFIRMED)
+ count++;
}
- if (var + 1 == gNoOfAllBanks)
+ if (count + 1 == gBattlersCount)
return TRUE;
else
return FALSE;
@@ -4354,18 +4579,18 @@ static bool8 sub_803CDB8(void)
static void sub_803CDF8(void)
{
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = gBattleBufferB[gActiveBank][1];
- RecordedBattle_SetBankAction(gActiveBank, gBattleBufferB[gActiveBank][1]);
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1];
+ RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]);
if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF;
- *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0);
- *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBank][3];
+ *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF;
+ *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0);
+ *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBattler][3];
- *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0);
- *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4;
- *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBank][3];
+ *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0);
+ *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;
+ *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBattler][3];
}
}
@@ -4375,257 +4600,257 @@ void SwapTurnOrder(u8 id1, u8 id2)
gActionsByTurnOrder[id1] = gActionsByTurnOrder[id2];
gActionsByTurnOrder[id2] = temp;
- temp = gBanksByTurnOrder[id1];
- gBanksByTurnOrder[id1] = gBanksByTurnOrder[id2];
- gBanksByTurnOrder[id2] = temp;
+ temp = gBattlerByTurnOrder[id1];
+ gBattlerByTurnOrder[id1] = gBattlerByTurnOrder[id2];
+ gBattlerByTurnOrder[id2] = temp;
}
-u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreChosenMoves)
+u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)
{
u8 strikesFirst = 0;
- u8 speedMultiplierBank1 = 0, speedMultiplierBank2 = 0;
- u32 speedBank1 = 0, speedBank2 = 0;
+ u8 speedMultiplierBattler1 = 0, speedMultiplierBattler2 = 0;
+ u32 speedBattler1 = 0, speedBattler2 = 0;
u8 holdEffect = 0;
u8 holdEffectParam = 0;
- u16 moveBank1 = 0, moveBank2 = 0;
+ u16 moveBattler1 = 0, moveBattler2 = 0;
if (WEATHER_HAS_EFFECT)
{
- if ((gBattleMons[bank1].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY)
- || (gBattleMons[bank1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY))
- speedMultiplierBank1 = 2;
+ if ((gBattleMons[battler1].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY)
+ || (gBattleMons[battler1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY))
+ speedMultiplierBattler1 = 2;
else
- speedMultiplierBank1 = 1;
+ speedMultiplierBattler1 = 1;
- if ((gBattleMons[bank2].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY)
- || (gBattleMons[bank2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY))
- speedMultiplierBank2 = 2;
+ if ((gBattleMons[battler2].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY)
+ || (gBattleMons[battler2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY))
+ speedMultiplierBattler2 = 2;
else
- speedMultiplierBank2 = 1;
+ speedMultiplierBattler2 = 1;
}
else
{
- speedMultiplierBank1 = 1;
- speedMultiplierBank2 = 1;
+ speedMultiplierBattler1 = 1;
+ speedMultiplierBattler2 = 1;
}
- speedBank1 = (gBattleMons[bank1].speed * speedMultiplierBank1)
- * (gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][0])
- / (gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][1]);
+ speedBattler1 = (gBattleMons[battler1].speed * speedMultiplierBattler1)
+ * (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][0])
+ / (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][1]);
- if (gBattleMons[bank1].item == ITEM_ENIGMA_BERRY)
+ if (gBattleMons[battler1].item == ITEM_ENIGMA_BERRY)
{
- holdEffect = gEnigmaBerries[bank1].holdEffect;
- holdEffectParam = gEnigmaBerries[bank1].holdEffectParam;
+ holdEffect = gEnigmaBerries[battler1].holdEffect;
+ holdEffectParam = gEnigmaBerries[battler1].holdEffectParam;
}
else
{
- holdEffect = ItemId_GetHoldEffect(gBattleMons[bank1].item);
- holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank1].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[battler1].item);
+ holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler1].item);
}
// badge boost
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
&& FlagGet(FLAG_BADGE03_GET)
- && GetBankSide(bank1) == SIDE_PLAYER)
+ && GetBattlerSide(battler1) == B_SIDE_PLAYER)
{
- speedBank1 = (speedBank1 * 110) / 100;
+ speedBattler1 = (speedBattler1 * 110) / 100;
}
if (holdEffect == HOLD_EFFECT_MACHO_BRACE)
- speedBank1 /= 2;
+ speedBattler1 /= 2;
- if (gBattleMons[bank1].status1 & STATUS_PARALYSIS)
- speedBank1 /= 4;
+ if (gBattleMons[battler1].status1 & STATUS1_PARALYSIS)
+ speedBattler1 /= 4;
if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100)
- speedBank1 = UINT_MAX;
+ speedBattler1 = UINT_MAX;
- // check second bank's speed
+ // check second battlerId's speed
- speedBank2 = (gBattleMons[bank2].speed * speedMultiplierBank2)
- * (gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][0])
- / (gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][1]);
+ speedBattler2 = (gBattleMons[battler2].speed * speedMultiplierBattler2)
+ * (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][0])
+ / (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][1]);
- if (gBattleMons[bank2].item == ITEM_ENIGMA_BERRY)
+ if (gBattleMons[battler2].item == ITEM_ENIGMA_BERRY)
{
- holdEffect = gEnigmaBerries[bank2].holdEffect;
- holdEffectParam = gEnigmaBerries[bank2].holdEffectParam;
+ holdEffect = gEnigmaBerries[battler2].holdEffect;
+ holdEffectParam = gEnigmaBerries[battler2].holdEffectParam;
}
else
{
- holdEffect = ItemId_GetHoldEffect(gBattleMons[bank2].item);
- holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank2].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[battler2].item);
+ holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler2].item);
}
// badge boost
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
&& FlagGet(FLAG_BADGE03_GET)
- && GetBankSide(bank2) == SIDE_PLAYER)
+ && GetBattlerSide(battler2) == B_SIDE_PLAYER)
{
- speedBank2 = (speedBank2 * 110) / 100;
+ speedBattler2 = (speedBattler2 * 110) / 100;
}
if (holdEffect == HOLD_EFFECT_MACHO_BRACE)
- speedBank2 /= 2;
+ speedBattler2 /= 2;
- if (gBattleMons[bank2].status1 & STATUS_PARALYSIS)
- speedBank2 /= 4;
+ if (gBattleMons[battler2].status1 & STATUS1_PARALYSIS)
+ speedBattler2 /= 4;
if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100)
- speedBank2 = UINT_MAX;
+ speedBattler2 = UINT_MAX;
if (ignoreChosenMoves)
{
- moveBank1 = MOVE_NONE;
- moveBank2 = MOVE_NONE;
+ moveBattler1 = MOVE_NONE;
+ moveBattler2 = MOVE_NONE;
}
else
{
- if (gActionForBanks[bank1] == ACTION_USE_MOVE)
+ if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE)
{
- if (gProtectStructs[bank1].onlyStruggle)
- moveBank1 = MOVE_STRUGGLE;
+ if (gProtectStructs[battler1].noValidMoves)
+ moveBattler1 = MOVE_STRUGGLE;
else
- moveBank1 = gBattleMons[bank1].moves[*(gBattleStruct->chosenMovePositions + bank1)];
+ moveBattler1 = gBattleMons[battler1].moves[*(gBattleStruct->chosenMovePositions + battler1)];
}
else
- moveBank1 = MOVE_NONE;
+ moveBattler1 = MOVE_NONE;
- if (gActionForBanks[bank2] == ACTION_USE_MOVE)
+ if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE)
{
- if (gProtectStructs[bank2].onlyStruggle)
- moveBank2 = MOVE_STRUGGLE;
+ if (gProtectStructs[battler2].noValidMoves)
+ moveBattler2 = MOVE_STRUGGLE;
else
- moveBank2 = gBattleMons[bank2].moves[*(gBattleStruct->chosenMovePositions + bank2)];
+ moveBattler2 = gBattleMons[battler2].moves[*(gBattleStruct->chosenMovePositions + battler2)];
}
else
- moveBank2 = MOVE_NONE;
+ moveBattler2 = MOVE_NONE;
}
// both move priorities are different than 0
- if (gBattleMoves[moveBank1].priority != 0 || gBattleMoves[moveBank2].priority != 0)
+ if (gBattleMoves[moveBattler1].priority != 0 || gBattleMoves[moveBattler2].priority != 0)
{
// both priorities are the same
- if (gBattleMoves[moveBank1].priority == gBattleMoves[moveBank2].priority)
+ if (gBattleMoves[moveBattler1].priority == gBattleMoves[moveBattler2].priority)
{
- if (speedBank1 == speedBank2 && Random() & 1)
+ if (speedBattler1 == speedBattler2 && Random() & 1)
strikesFirst = 2; // same speeds, same priorities
- else if (speedBank1 < speedBank2)
- strikesFirst = 1; // bank2 has more speed
+ else if (speedBattler1 < speedBattler2)
+ strikesFirst = 1; // battler2 has more speed
- // else bank1 has more speed
+ // else battler1 has more speed
}
- else if (gBattleMoves[moveBank1].priority < gBattleMoves[moveBank2].priority)
- strikesFirst = 1; // bank2's move has greater priority
+ else if (gBattleMoves[moveBattler1].priority < gBattleMoves[moveBattler2].priority)
+ strikesFirst = 1; // battler2's move has greater priority
- // else bank1's move has greater priority
+ // else battler1's move has greater priority
}
// both priorities are equal to 0
else
{
- if (speedBank1 == speedBank2 && Random() & 1)
+ if (speedBattler1 == speedBattler2 && Random() & 1)
strikesFirst = 2; // same speeds, same priorities
- else if (speedBank1 < speedBank2)
- strikesFirst = 1; // bank2 has more speed
+ else if (speedBattler1 < speedBattler2)
+ strikesFirst = 1; // battler2 has more speed
- // else bank1 has more speed
+ // else battler1 has more speed
}
return strikesFirst;
}
-static void SetActionsAndBanksTurnOrder(void)
+static void SetActionsAndBattlersTurnOrder(void)
{
- s32 var = 0;
+ s32 turnOrderId = 0;
s32 i, j;
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
- gBanksByTurnOrder[var] = gActiveBank;
- var++;
+ gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler];
+ gBattlerByTurnOrder[turnOrderId] = gActiveBattler;
+ turnOrderId++;
}
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (gActionForBanks[gActiveBank] == ACTION_RUN)
+ if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN)
{
- var = 5;
+ turnOrderId = 5;
break;
}
}
}
else
{
- if (gActionForBanks[0] == ACTION_RUN)
+ if (gChosenActionByBattler[0] == B_ACTION_RUN)
{
- gActiveBank = 0;
- var = 5;
+ gActiveBattler = 0;
+ turnOrderId = 5;
}
- if (gActionForBanks[2] == ACTION_RUN)
+ if (gChosenActionByBattler[2] == B_ACTION_RUN)
{
- gActiveBank = 2;
- var = 5;
+ gActiveBattler = 2;
+ turnOrderId = 5;
}
}
- if (var == 5)
+ if (turnOrderId == 5) // One of battlers wants to run.
{
- gActionsByTurnOrder[0] = gActionForBanks[gActiveBank];
- gBanksByTurnOrder[0] = gActiveBank;
- var = 1;
- for (i = 0; i < gNoOfAllBanks; i++)
+ gActionsByTurnOrder[0] = gChosenActionByBattler[gActiveBattler];
+ gBattlerByTurnOrder[0] = gActiveBattler;
+ turnOrderId = 1;
+ for (i = 0; i < gBattlersCount; i++)
{
- if (i != gActiveBank)
+ if (i != gActiveBattler)
{
- gActionsByTurnOrder[var] = gActionForBanks[i];
- gBanksByTurnOrder[var] = i;
- var++;
+ gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[i];
+ gBattlerByTurnOrder[turnOrderId] = i;
+ turnOrderId++;
}
}
gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;
- gBattleStruct->focusPunchBank = 0;
+ gBattleStruct->focusPunchBattlerId = 0;
return;
}
else
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (gActionForBanks[gActiveBank] == ACTION_USE_ITEM || gActionForBanks[gActiveBank] == ACTION_SWITCH)
+ if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_ITEM || gChosenActionByBattler[gActiveBattler] == B_ACTION_SWITCH)
{
- gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
- gBanksByTurnOrder[var] = gActiveBank;
- var++;
+ gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler];
+ gBattlerByTurnOrder[turnOrderId] = gActiveBattler;
+ turnOrderId++;
}
}
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (gActionForBanks[gActiveBank] != ACTION_USE_ITEM && gActionForBanks[gActiveBank] != ACTION_SWITCH)
+ if (gChosenActionByBattler[gActiveBattler] != B_ACTION_USE_ITEM && gChosenActionByBattler[gActiveBattler] != B_ACTION_SWITCH)
{
- gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
- gBanksByTurnOrder[var] = gActiveBank;
- var++;
+ gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler];
+ gBattlerByTurnOrder[turnOrderId] = gActiveBattler;
+ turnOrderId++;
}
}
- for (i = 0; i < gNoOfAllBanks - 1; i++)
+ for (i = 0; i < gBattlersCount - 1; i++)
{
- for (j = i + 1; j < gNoOfAllBanks; j++)
+ for (j = i + 1; j < gBattlersCount; j++)
{
- u8 bank1 = gBanksByTurnOrder[i];
- u8 bank2 = gBanksByTurnOrder[j];
- if (gActionsByTurnOrder[i] != ACTION_USE_ITEM
- && gActionsByTurnOrder[j] != ACTION_USE_ITEM
- && gActionsByTurnOrder[i] != ACTION_SWITCH
- && gActionsByTurnOrder[j] != ACTION_SWITCH)
+ u8 battler1 = gBattlerByTurnOrder[i];
+ u8 battler2 = gBattlerByTurnOrder[j];
+ if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM
+ && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM
+ && gActionsByTurnOrder[i] != B_ACTION_SWITCH
+ && gActionsByTurnOrder[j] != B_ACTION_SWITCH)
{
- if (GetWhoStrikesFirst(bank1, bank2, FALSE))
+ if (GetWhoStrikesFirst(battler1, battler2, FALSE))
SwapTurnOrder(i, j);
}
}
@@ -4633,7 +4858,7 @@ static void SetActionsAndBanksTurnOrder(void)
}
}
gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;
- gBattleStruct->focusPunchBank = 0;
+ gBattleStruct->focusPunchBattlerId = 0;
}
static void TurnValuesCleanUp(bool8 var0)
@@ -4641,32 +4866,32 @@ static void TurnValuesCleanUp(bool8 var0)
s32 i;
u8 *dataPtr;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
if (var0)
{
- gProtectStructs[gActiveBank].protected = 0;
- gProtectStructs[gActiveBank].endured = 0;
+ gProtectStructs[gActiveBattler].protected = 0;
+ gProtectStructs[gActiveBattler].endured = 0;
}
else
{
- dataPtr = (u8*)(&gProtectStructs[gActiveBank]);
+ dataPtr = (u8*)(&gProtectStructs[gActiveBattler]);
for (i = 0; i < sizeof(struct ProtectStruct); i++)
dataPtr[i] = 0;
- if (gDisableStructs[gActiveBank].isFirstTurn)
- gDisableStructs[gActiveBank].isFirstTurn--;
+ if (gDisableStructs[gActiveBattler].isFirstTurn)
+ gDisableStructs[gActiveBattler].isFirstTurn--;
- if (gDisableStructs[gActiveBank].rechargeCounter)
+ if (gDisableStructs[gActiveBattler].rechargeCounter)
{
- gDisableStructs[gActiveBank].rechargeCounter--;
- if (gDisableStructs[gActiveBank].rechargeCounter == 0)
- gBattleMons[gActiveBank].status2 &= ~(STATUS2_RECHARGE);
+ gDisableStructs[gActiveBattler].rechargeCounter--;
+ if (gDisableStructs[gActiveBattler].rechargeCounter == 0)
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_RECHARGE);
}
}
- if (gDisableStructs[gActiveBank].substituteHP == 0)
- gBattleMons[gActiveBank].status2 &= ~(STATUS2_SUBSTITUTE);
+ if (gDisableStructs[gActiveBattler].substituteHP == 0)
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE);
}
gSideTimers[0].followmeTimer = 0;
@@ -4675,10 +4900,10 @@ static void TurnValuesCleanUp(bool8 var0)
static void SpecialStatusesClear(void)
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
s32 i;
- u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBank]);
+ u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBattler]);
for (i = 0; i < sizeof(struct SpecialStatus); i++)
dataPtr[i] = 0;
@@ -4689,14 +4914,14 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
{
if (!(gHitMarker & HITMARKER_RUN))
{
- while (gBattleStruct->focusPunchBank < gNoOfAllBanks)
+ while (gBattleStruct->focusPunchBattlerId < gBattlersCount)
{
- gActiveBank = gBankAttacker = gBattleStruct->focusPunchBank;
- gBattleStruct->focusPunchBank++;
- if (gChosenMovesByBanks[gActiveBank] == MOVE_FOCUS_PUNCH
- && !(gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
- && !(gDisableStructs[gBankAttacker].truantCounter)
- && !(gProtectStructs[gActiveBank].onlyStruggle))
+ gActiveBattler = gBattlerAttacker = gBattleStruct->focusPunchBattlerId;
+ gBattleStruct->focusPunchBattlerId++;
+ if (gChosenMoveByBattler[gActiveBattler] == MOVE_FOCUS_PUNCH
+ && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
+ && !(gDisableStructs[gBattlerAttacker].truantCounter)
+ && !(gProtectStructs[gActiveBattler].noValidMoves))
{
BattleScriptExecute(BattleScript_FocusPunchSetUp);
return;
@@ -4716,7 +4941,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
gBattleMainFunc = RunTurnActionsFunctions;
gBattleCommunication[3] = 0;
gBattleCommunication[4] = 0;
- gBattleScripting.field_16 = 0;
+ gBattleScripting.multihitMoveEffect = 0;
gBattleResources->battleScriptsStack->size = 0;
}
@@ -4725,17 +4950,17 @@ static void RunTurnActionsFunctions(void)
if (gBattleOutcome != 0)
gCurrentActionFuncId = 12;
- *(&gBattleStruct->field_4B) = gCurrentTurnActionNumber;
+ *(&gBattleStruct->savedTurnActionNumber) = gCurrentTurnActionNumber;
sTurnActionsFuncsTable[gCurrentActionFuncId]();
- if (gCurrentTurnActionNumber >= gNoOfAllBanks) // everyone did their actions, turn finished
+ if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished
{
gHitMarker &= ~(HITMARKER_x100000);
gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F];
}
else
{
- if (gBattleStruct->field_4B != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another bank
+ if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battlerId
{
gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING);
gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE);
@@ -4751,9 +4976,9 @@ static void HandleEndTurn_BattleWon(void)
{
gSpecialVar_Result = gBattleOutcome;
gBattleTextBuff1[0] = gBattleOutcome;
- gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost;
- gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80);
+ gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN);
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER
&& gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_x4000000 | BATTLE_TYPE_EREADER_TRAINER))
@@ -4761,10 +4986,10 @@ static void HandleEndTurn_BattleWon(void)
BattleStopLowHpSound();
gBattlescriptCurrInstr = BattleScript_FrontierTrainerBattleWon;
- if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
- PlayBGM(BGM_KACHI3);
+ if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
+ PlayBGM(MUS_KACHI3);
else
- PlayBGM(BGM_KACHI1);
+ PlayBGM(MUS_KACHI1);
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK))
{
@@ -4773,23 +4998,23 @@ static void HandleEndTurn_BattleWon(void)
switch (gTrainers[gTrainerBattleOpponent_A].trainerClass)
{
- case CLASS_ELITE_FOUR:
- case CLASS_CHAMPION:
- PlayBGM(BGM_KACHI5);
+ case TRAINER_CLASS_ELITE_FOUR:
+ case TRAINER_CLASS_CHAMPION:
+ PlayBGM(MUS_KACHI5);
break;
- case CLASS_TEAM_AQUA:
- case CLASS_TEAM_MAGMA:
- case CLASS_AQUA_ADMIN:
- case CLASS_AQUA_LEADER:
- case CLASS_MAGMA_ADMIN:
- case CLASS_MAGMA_LEADER:
- PlayBGM(BGM_KACHI4);
+ case TRAINER_CLASS_TEAM_AQUA:
+ case TRAINER_CLASS_TEAM_MAGMA:
+ case TRAINER_CLASS_AQUA_ADMIN:
+ case TRAINER_CLASS_AQUA_LEADER:
+ case TRAINER_CLASS_MAGMA_ADMIN:
+ case TRAINER_CLASS_MAGMA_LEADER:
+ PlayBGM(MUS_KACHI4);
break;
- case CLASS_LEADER:
- PlayBGM(BGM_KACHI3);
+ case TRAINER_CLASS_LEADER:
+ PlayBGM(MUS_KACHI3);
break;
default:
- PlayBGM(BGM_KACHI1);
+ PlayBGM(MUS_KACHI1);
break;
}
}
@@ -4809,24 +5034,24 @@ static void HandleEndTurn_BattleLost(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
{
- if (gBattleOutcome & BATTLE_OUTCOME_BIT_x80)
+ if (gBattleOutcome & B_OUTCOME_LINK_BATTLE_RAN)
{
- gBattlescriptCurrInstr = gUnknown_082DB9C8;
- gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80);
- gSaveBlock2Ptr->field_CA9_b = 1;
+ gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeitedLinkBattle;
+ gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN);
+ gSaveBlock2Ptr->frontier.field_CA9_b = 1;
}
else
{
- gBattlescriptCurrInstr = gUnknown_082DAA0B;
- gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80);
+ gBattlescriptCurrInstr = BattleScript_82DAA0B;
+ gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN);
}
}
else
{
gBattleTextBuff1[0] = gBattleOutcome;
- gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost;
- gBattleOutcome &= ~(BATTLE_OUTCOME_BIT_x80);
+ gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN);
}
}
else
@@ -4843,18 +5068,18 @@ static void HandleEndTurn_RanFromBattle(void)
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER && gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
- gBattlescriptCurrInstr = gUnknown_082DB9C1;
- gBattleOutcome = BATTLE_FORFEITED;
- gSaveBlock2Ptr->field_CA9_b = 1;
+ gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeited;
+ gBattleOutcome = B_OUTCOME_FORFEITED;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 1;
}
else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
{
- gBattlescriptCurrInstr = gUnknown_082DB9C1;
- gBattleOutcome = BATTLE_FORFEITED;
+ gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeited;
+ gBattleOutcome = B_OUTCOME_FORFEITED;
}
else
{
- switch (gProtectStructs[gBankAttacker].fleeFlag)
+ switch (gProtectStructs[gBattlerAttacker].fleeFlag)
{
default:
gBattlescriptCurrInstr = BattleScript_GotAwaySafely;
@@ -4875,7 +5100,7 @@ static void HandleEndTurn_MonFled(void)
{
gCurrentActionFuncId = 0;
- PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker]);
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]);
gBattlescriptCurrInstr = BattleScript_WildMonFled;
gBattleMainFunc = HandleEndTurn_FinishBattle;
@@ -4893,19 +5118,19 @@ static void HandleEndTurn_FinishBattle(void)
| BATTLE_TYPE_WALLY_TUTORIAL
| BATTLE_TYPE_FRONTIER)))
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
if (gBattleResults.playerMon1Species == SPECIES_NONE)
{
- gBattleResults.playerMon1Species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES, NULL);
- GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_NICKNAME, gBattleResults.playerMon1Name);
+ gBattleResults.playerMon1Species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL);
+ GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_NICKNAME, gBattleResults.playerMon1Name);
}
else
{
- gBattleResults.playerMon2Species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES, NULL);
- GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_NICKNAME, gBattleResults.playerMon2Name);
+ gBattleResults.playerMon2Species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL);
+ GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_NICKNAME, gBattleResults.playerMon2Name);
}
}
}
@@ -4920,7 +5145,7 @@ static void HandleEndTurn_FinishBattle(void)
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_WALLY_TUTORIAL))
- && gBattleResults.unk5_6)
+ && gBattleResults.shinyWildMon)
{
sub_80EE184();
}
@@ -4933,7 +5158,7 @@ static void HandleEndTurn_FinishBattle(void)
}
else
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
}
@@ -4943,7 +5168,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void)
if (!gPaletteFade.active)
{
ResetSpriteData();
- if (gLeveledUpInBattle == 0 || gBattleOutcome != BATTLE_WON)
+ if (gLeveledUpInBattle == 0 || gBattleOutcome != B_OUTCOME_WON)
{
gBattleMainFunc = ReturnFromBattleToOverworld;
return;
@@ -4969,7 +5194,7 @@ static void TryEvolvePokemon(void)
while (gLeveledUpInBattle != 0)
{
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (gLeveledUpInBattle & gBitTable[i])
{
@@ -5018,11 +5243,11 @@ static void ReturnFromBattleToOverworld(void)
if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
{
UpdateRoamerHPStatus(&gEnemyParty[0]);
- if ((gBattleOutcome & BATTLE_WON) || gBattleOutcome == BATTLE_CAUGHT)
+ if ((gBattleOutcome & B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT)
SetRoamerInactive();
}
- m4aSongNumStop(0x5A);
+ m4aSongNumStop(SE_HINSI);
SetMainCallback2(gMain.savedCallback);
}
@@ -5030,20 +5255,20 @@ void RunBattleScriptCommands_PopCallbacksStack(void)
{
if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC)
{
- if (BATTLE_CALLBACKS_STACK->size != 0)
- BATTLE_CALLBACKS_STACK->size--;
- gBattleMainFunc = BATTLE_CALLBACKS_STACK->function[BATTLE_CALLBACKS_STACK->size];
+ if (gBattleResources->battleCallbackStack->size != 0)
+ gBattleResources->battleCallbackStack->size--;
+ gBattleMainFunc = gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size];
}
else
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
}
void RunBattleScriptCommands(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
@@ -5052,200 +5277,200 @@ static void HandleAction_UseMove(void)
u8 side;
u8 var = 4;
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
- if (*(&gBattleStruct->field_91) & gBitTable[gBankAttacker])
+ if (*(&gBattleStruct->field_91) & gBitTable[gBattlerAttacker])
{
- gCurrentActionFuncId = ACTION_FINISHED;
+ gCurrentActionFuncId = B_ACTION_FINISHED;
return;
}
gCritMultiplier = 1;
gBattleScripting.dmgMultiplier = 1;
gBattleStruct->atkCancellerTracker = 0;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gMultiHitCounter = 0;
gBattleCommunication[6] = 0;
- gCurrMovePos = gUnknown_020241E9 = *(gBattleStruct->chosenMovePositions + gBankAttacker);
+ gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker);
// choose move
- if (gProtectStructs[gBankAttacker].onlyStruggle)
+ if (gProtectStructs[gBattlerAttacker].noValidMoves)
{
- gProtectStructs[gBankAttacker].onlyStruggle = 0;
- gCurrentMove = gLastUsedMove = MOVE_STRUGGLE;
+ gProtectStructs[gBattlerAttacker].noValidMoves = 0;
+ gCurrentMove = gChosenMove = MOVE_STRUGGLE;
gHitMarker |= HITMARKER_NO_PPDEDUCT;
- *(gBattleStruct->moveTarget + gBankAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0);
}
- else if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE)
+ else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)
{
- gCurrentMove = gLastUsedMove = gLockedMoves[gBankAttacker];
+ gCurrentMove = gChosenMove = gLockedMoves[gBattlerAttacker];
}
// encore forces you to use the same move
- else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE
- && gDisableStructs[gBankAttacker].encoredMove == gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos])
+ else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE
+ && gDisableStructs[gBattlerAttacker].encoredMove == gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos])
{
- gCurrentMove = gLastUsedMove = gDisableStructs[gBankAttacker].encoredMove;
- gCurrMovePos = gUnknown_020241E9 = gDisableStructs[gBankAttacker].encoredMovePos;
- *(gBattleStruct->moveTarget + gBankAttacker) = GetMoveTarget(gCurrentMove, 0);
+ gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove;
+ gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos;
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
}
// check if the encored move wasn't overwritten
- else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE
- && gDisableStructs[gBankAttacker].encoredMove != gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos])
+ else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE
+ && gDisableStructs[gBattlerAttacker].encoredMove != gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos])
{
- gCurrMovePos = gUnknown_020241E9 = gDisableStructs[gBankAttacker].encoredMovePos;
- gCurrentMove = gLastUsedMove = gBattleMons[gBankAttacker].moves[gCurrMovePos];
- gDisableStructs[gBankAttacker].encoredMove = MOVE_NONE;
- gDisableStructs[gBankAttacker].encoredMovePos = 0;
- gDisableStructs[gBankAttacker].encoreTimer1 = 0;
- *(gBattleStruct->moveTarget + gBankAttacker) = GetMoveTarget(gCurrentMove, 0);
+ gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos;
+ gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
+ gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE;
+ gDisableStructs[gBattlerAttacker].encoredMovePos = 0;
+ gDisableStructs[gBattlerAttacker].encoreTimer1 = 0;
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
}
- else if (gBattleMons[gBankAttacker].moves[gCurrMovePos] != gChosenMovesByBanks[gBankAttacker])
+ else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker])
{
- gCurrentMove = gLastUsedMove = gBattleMons[gBankAttacker].moves[gCurrMovePos];
- *(gBattleStruct->moveTarget + gBankAttacker) = GetMoveTarget(gCurrentMove, 0);
+ gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
}
else
{
- gCurrentMove = gLastUsedMove = gBattleMons[gBankAttacker].moves[gCurrMovePos];
+ gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
}
- if (gBattleMons[gBankAttacker].hp != 0)
+ if (gBattleMons[gBattlerAttacker].hp != 0)
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
gBattleResults.lastUsedMovePlayer = gCurrentMove;
else
gBattleResults.lastUsedMoveOpponent = gCurrentMove;
}
// choose target
- side = GetBankSide(gBankAttacker) ^ BIT_SIDE;
+ side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;
if (gSideTimers[side].followmeTimer != 0
&& gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED
- && GetBankSide(gBankAttacker) != GetBankSide(gSideTimers[side].followmeTarget)
+ && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget)
&& gBattleMons[gSideTimers[side].followmeTarget].hp != 0)
{
- gBankTarget = gSideTimers[side].followmeTarget;
+ gBattlerTarget = gSideTimers[side].followmeTarget;
}
else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
&& gSideTimers[side].followmeTimer == 0
&& (gBattleMoves[gCurrentMove].power != 0
- || gBattleMoves[gCurrentMove].target != MOVE_TARGET_x10)
- && gBattleMons[*(gBattleStruct->moveTarget + gBankAttacker)].ability != ABILITY_LIGHTNING_ROD
+ || gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER)
+ && gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD
&& gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
{
- side = GetBankSide(gBankAttacker);
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ side = GetBattlerSide(gBattlerAttacker);
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (side != GetBankSide(gActiveBank)
- && *(gBattleStruct->moveTarget + gBankAttacker) != gActiveBank
- && gBattleMons[gActiveBank].ability == ABILITY_LIGHTNING_ROD
- && BankGetTurnOrder(gActiveBank) < var)
+ if (side != GetBattlerSide(gActiveBattler)
+ && *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler
+ && gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD
+ && GetBattlerTurnOrderNum(gActiveBattler) < var)
{
- var = BankGetTurnOrder(gActiveBank);
+ var = GetBattlerTurnOrderNum(gActiveBattler);
}
}
if (var == 4)
{
- if (gBattleMoves[gLastUsedMove].target & MOVE_TARGET_RANDOM)
+ if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM)
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
{
if (Random() & 1)
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
else
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
}
else
{
if (Random() & 1)
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
else
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
}
}
else
{
- gBankTarget = *(gBattleStruct->moveTarget + gBankAttacker);
+ gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker);
}
- if (gAbsentBankFlags & gBitTable[gBankTarget])
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
{
- if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget))
+ if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))
{
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);
}
else
{
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE);
- if (gAbsentBankFlags & gBitTable[gBankTarget])
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE);
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);
}
}
}
else
{
- gActiveBank = gBanksByTurnOrder[var];
- RecordAbilityBattle(gActiveBank, gBattleMons[gActiveBank].ability);
- gSpecialStatuses[gActiveBank].lightningRodRedirected = 1;
- gBankTarget = gActiveBank;
+ gActiveBattler = gBattlerByTurnOrder[var];
+ RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
+ gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1;
+ gBattlerTarget = gActiveBattler;
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && gBattleMoves[gLastUsedMove].target & MOVE_TARGET_RANDOM)
+ && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM)
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
{
if (Random() & 1)
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
else
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
}
else
{
if (Random() & 1)
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
else
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
}
- if (gAbsentBankFlags & gBitTable[gBankTarget]
- && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget))
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]
+ && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))
{
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);
}
}
else
{
- gBankTarget = *(gBattleStruct->moveTarget + gBankAttacker);
- if (gAbsentBankFlags & gBitTable[gBankTarget])
+ gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker);
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
{
- if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget))
+ if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))
{
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);
}
else
{
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE);
- if (gAbsentBankFlags & gBitTable[gBankTarget])
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE);
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK);
}
}
}
// choose battlescript
if (gBattleTypeFlags & BATTLE_TYPE_PALACE
- && gProtectStructs[gBankAttacker].flag_x10)
+ && gProtectStructs[gBattlerAttacker].flag_x10)
{
- if (gBattleMons[gBankAttacker].hp == 0)
+ if (gBattleMons[gBattlerAttacker].hp == 0)
{
- gCurrentActionFuncId = 12;
+ gCurrentActionFuncId = B_ACTION_FINISHED;
return;
}
- else if (gUnknown_02024230[gBankAttacker] != NULL)
+ else if (gPalaceSelectionBattleScripts[gBattlerAttacker] != NULL)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
- gBattlescriptCurrInstr = gUnknown_02024230[gBankAttacker];
- gUnknown_02024230[gBankAttacker] = NULL;
+ gBattlescriptCurrInstr = gPalaceSelectionBattleScripts[gBattlerAttacker];
+ gPalaceSelectionBattleScripts[gBattlerAttacker] = NULL;
}
else
{
@@ -5259,24 +5484,24 @@ static void HandleAction_UseMove(void)
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
- sub_81A56E8(gBankAttacker);
+ sub_81A56E8(gBattlerAttacker);
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
static void HandleAction_Switch(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- gActionSelectionCursor[gBankAttacker] = 0;
- gMoveSelectionCursor[gBankAttacker] = 0;
+ gActionSelectionCursor[gBattlerAttacker] = 0;
+ gMoveSelectionCursor[gBattlerAttacker] = 0;
- PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, *(gBattleStruct->field_58 + gBankAttacker))
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, *(gBattleStruct->field_58 + gBattlerAttacker))
- gBattleScripting.bank = gBankAttacker;
+ gBattleScripting.battler = gBattlerAttacker;
gBattlescriptCurrInstr = BattleScript_ActionSwitch;
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
if (gBattleResults.playerSwitchesCounter < 255)
gBattleResults.playerSwitchesCounter++;
@@ -5284,11 +5509,11 @@ static void HandleAction_Switch(void)
static void HandleAction_UseItem(void)
{
- gBankAttacker = gBankTarget = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- ClearFuryCutterDestinyBondGrudge(gBankAttacker);
- gLastUsedItem = gBattleBufferB[gBankAttacker][1] | (gBattleBufferB[gBankAttacker][2] << 8);
+ ClearFuryCutterDestinyBondGrudge(gBattlerAttacker);
+ gLastUsedItem = gBattleBufferB[gBattlerAttacker][1] | (gBattleBufferB[gBattlerAttacker][2] << 8);
if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball
{
@@ -5298,38 +5523,38 @@ static void HandleAction_UseItem(void)
{
gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0];
}
- else if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
{
- gBattlescriptCurrInstr = gUnknown_082DBD3C[0];
+ gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0];
}
else
{
- gBattleScripting.bank = gBankAttacker;
+ gBattleScripting.battler = gBattlerAttacker;
- switch (*(gBattleStruct->AI_itemType + (gBankAttacker >> 1)))
+ switch (*(gBattleStruct->AI_itemType + (gBattlerAttacker >> 1)))
{
case AI_ITEM_FULL_RESTORE:
case AI_ITEM_HEAL_HP:
break;
case AI_ITEM_CURE_CONDITION:
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- if (*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 1)
+ if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)
{
- if (*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 0x3E)
+ if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E)
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
else
{
- while (!(*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 1))
+ while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1))
{
- *(gBattleStruct->AI_itemFlags + gBankAttacker / 2) >>= 1;
+ *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1;
gBattleCommunication[MULTISTRING_CHOOSER]++;
}
}
break;
case AI_ITEM_X_STAT:
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
- if (*(gBattleStruct->AI_itemFlags + (gBankAttacker >> 1)) & 0x80)
+ if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 0x80)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
@@ -5338,9 +5563,9 @@ static void HandleAction_UseItem(void)
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK)
PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2)
- while (!((*(gBattleStruct->AI_itemFlags + (gBankAttacker >> 1))) & 1))
+ while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1))
{
- *(gBattleStruct->AI_itemFlags + gBankAttacker / 2) >>= 1;
+ *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1;
gBattleTextBuff1[2]++;
}
@@ -5356,49 +5581,49 @@ static void HandleAction_UseItem(void)
break;
}
- gBattlescriptCurrInstr = gUnknown_082DBD3C[*(gBattleStruct->AI_itemType + gBankAttacker / 2)];
+ gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + gBattlerAttacker / 2)];
}
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
-bool8 TryRunFromBattle(u8 bank)
+bool8 TryRunFromBattle(u8 battler)
{
bool8 effect = FALSE;
u8 holdEffect;
u8 pyramidMultiplier;
u8 speedVar;
- if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY)
- holdEffect = gEnigmaBerries[bank].holdEffect;
+ if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY)
+ holdEffect = gEnigmaBerries[battler].holdEffect;
else
- holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[battler].item);
- gStringBank = bank;
+ gPotentialItemEffectBattler = battler;
if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN)
{
- gLastUsedItem = gBattleMons[bank].item ;
- gProtectStructs[bank].fleeFlag = 1;
+ gLastUsedItem = gBattleMons[battler].item ;
+ gProtectStructs[battler].fleeFlag = 1;
effect++;
}
- else if (gBattleMons[bank].ability == ABILITY_RUN_AWAY)
+ else if (gBattleMons[battler].ability == ABILITY_RUN_AWAY)
{
if (InBattlePyramid())
{
gBattleStruct->runTries++;
pyramidMultiplier = sub_81A9E28();
- speedVar = (gBattleMons[bank].speed * pyramidMultiplier) / (gBattleMons[bank ^ BIT_SIDE].speed) + (gBattleStruct->runTries * 30);
+ speedVar = (gBattleMons[battler].speed * pyramidMultiplier) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30);
if (speedVar > (Random() & 0xFF))
{
gLastUsedAbility = ABILITY_RUN_AWAY;
- gProtectStructs[bank].fleeFlag = 2;
+ gProtectStructs[battler].fleeFlag = 2;
effect++;
}
}
else
{
gLastUsedAbility = ABILITY_RUN_AWAY;
- gProtectStructs[bank].fleeFlag = 2;
+ gProtectStructs[battler].fleeFlag = 2;
effect++;
}
}
@@ -5413,13 +5638,13 @@ bool8 TryRunFromBattle(u8 bank)
if (InBattlePyramid())
{
pyramidMultiplier = sub_81A9E28();
- speedVar = (gBattleMons[bank].speed * pyramidMultiplier) / (gBattleMons[bank ^ BIT_SIDE].speed) + (gBattleStruct->runTries * 30);
+ speedVar = (gBattleMons[battler].speed * pyramidMultiplier) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30);
if (speedVar > (Random() & 0xFF))
effect++;
}
- else if (gBattleMons[bank].speed < gBattleMons[bank ^ BIT_SIDE].speed)
+ else if (gBattleMons[battler].speed < gBattleMons[BATTLE_OPPOSITE(battler)].speed)
{
- speedVar = (gBattleMons[bank].speed * 128) / (gBattleMons[bank ^ BIT_SIDE].speed) + (gBattleStruct->runTries * 30);
+ speedVar = (gBattleMons[battler].speed * 128) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30);
if (speedVar > (Random() & 0xFF))
effect++;
}
@@ -5434,8 +5659,8 @@ bool8 TryRunFromBattle(u8 bank)
if (effect)
{
- gCurrentTurnActionNumber = gNoOfAllBanks;
- gBattleOutcome = BATTLE_RAN;
+ gCurrentTurnActionNumber = gBattlersCount;
+ gBattleOutcome = B_OUTCOME_RAN;
}
return effect;
@@ -5443,53 +5668,53 @@ bool8 TryRunFromBattle(u8 bank)
static void HandleAction_Run(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
{
- gCurrentTurnActionNumber = gNoOfAllBanks;
+ gCurrentTurnActionNumber = gBattlersCount;
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
- if (gActionForBanks[gActiveBank] == ACTION_RUN)
- gBattleOutcome |= BATTLE_LOST;
+ if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN)
+ gBattleOutcome |= B_OUTCOME_LOST;
}
else
{
- if (gActionForBanks[gActiveBank] == ACTION_RUN)
- gBattleOutcome |= BATTLE_WON;
+ if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN)
+ gBattleOutcome |= B_OUTCOME_WON;
}
}
- gBattleOutcome |= BATTLE_OUTCOME_BIT_x80;
- gSaveBlock2Ptr->field_CA9_b = 1;
+ gBattleOutcome |= B_OUTCOME_LINK_BATTLE_RAN;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 1;
}
else
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
{
- if (!TryRunFromBattle(gBankAttacker)) // failed to run away
+ if (!TryRunFromBattle(gBattlerAttacker)) // failed to run away
{
- ClearFuryCutterDestinyBondGrudge(gBankAttacker);
+ ClearFuryCutterDestinyBondGrudge(gBattlerAttacker);
gBattleCommunication[MULTISTRING_CHOOSER] = 3;
gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString;
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
}
else
{
- if (gBattleMons[gBankAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
+ if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
{
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString;
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
else
{
- gCurrentTurnActionNumber = gNoOfAllBanks;
- gBattleOutcome = BATTLE_POKE_FLED;
+ gCurrentTurnActionNumber = gBattlersCount;
+ gBattleOutcome = B_OUTCOME_MON_FLED;
}
}
}
@@ -5497,102 +5722,102 @@ static void HandleAction_Run(void)
static void HandleAction_WatchesCarefully(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0];
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
static void HandleAction_SafariZoneBallThrow(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
gNumSafariBalls--;
gLastUsedItem = ITEM_SAFARI_BALL;
gBattlescriptCurrInstr = gBattlescriptsForBallThrow[ITEM_SAFARI_BALL];
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
static void HandleAction_ThrowPokeblock(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBankAttacker][1] - 1;
- gLastUsedItem = gBattleBufferB[gBankAttacker][2];
+ gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBattlerAttacker][1] - 1;
+ gLastUsedItem = gBattleBufferB[gBattlerAttacker][2];
- if (gBattleResults.field_1F < 0xFF)
- gBattleResults.field_1F++;
- if (gBattleStruct->field_7A < 3)
- gBattleStruct->field_7A++;
- if (gBattleStruct->field_7B > 1)
+ if (gBattleResults.pokeblockThrows < 0xFF)
+ gBattleResults.pokeblockThrows++;
+ if (gBattleStruct->safariPkblThrowCounter < 3)
+ gBattleStruct->safariPkblThrowCounter++;
+ if (gBattleStruct->safariEscapeFactor > 1)
{
- if (gBattleStruct->field_7B < sUnknown_0831BCE0[gBattleStruct->field_7A][gBattleCommunication[MULTISTRING_CHOOSER]])
- gBattleStruct->field_7B = 1;
+ if (gBattleStruct->safariEscapeFactor < sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]])
+ gBattleStruct->safariEscapeFactor = 1;
else
- gBattleStruct->field_7B -= sUnknown_0831BCE0[gBattleStruct->field_7A][gBattleCommunication[MULTISTRING_CHOOSER]];
+ gBattleStruct->safariEscapeFactor -= sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]];
}
gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2];
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
static void HandleAction_GoNear(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- gBattleStruct->field_7C += sUnknown_0831BCEF[gBattleStruct->field_79];
- if (gBattleStruct->field_7C > 20)
- gBattleStruct->field_7C = 20;
+ gBattleStruct->safariCatchFactor += sGoNearCounterToCatchFactor[gBattleStruct->safariGoNearCounter];
+ if (gBattleStruct->safariCatchFactor > 20)
+ gBattleStruct->safariCatchFactor = 20;
- gBattleStruct->field_7B +=sUnknown_0831BCF3[gBattleStruct->field_79];
- if (gBattleStruct->field_7B > 20)
- gBattleStruct->field_7B = 20;
+ gBattleStruct->safariEscapeFactor += sGoNearCounterToEscapeFactor[gBattleStruct->safariGoNearCounter];
+ if (gBattleStruct->safariEscapeFactor > 20)
+ gBattleStruct->safariEscapeFactor = 20;
- if (gBattleStruct->field_79 < 3)
+ if (gBattleStruct->safariGoNearCounter < 3)
{
- gBattleStruct->field_79++;
+ gBattleStruct->safariGoNearCounter++;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
else
{
- gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ gBattleCommunication[MULTISTRING_CHOOSER] = 1; // Can't get closer.
}
gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1];
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
static void HandleAction_SafriZoneRun(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
PlaySE(SE_NIGERU);
- gCurrentTurnActionNumber = gNoOfAllBanks;
- gBattleOutcome = BATTLE_RAN;
+ gCurrentTurnActionNumber = gBattlersCount;
+ gBattleOutcome = B_OUTCOME_RAN;
}
-static void HandleAction_Action9(void)
+static void HandleAction_WallyBallThrow(void)
{
- gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
- PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker])
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])
gBattlescriptCurrInstr = gBattlescriptsForSafariActions[3];
- gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
- gActionsByTurnOrder[1] = ACTION_FINISHED;
+ gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
+ gActionsByTurnOrder[1] = B_ACTION_FINISHED;
}
static void HandleAction_Action11(void)
{
- if (!sub_8041728())
+ if (!HandleFaintedMonActions())
{
- gBattleStruct->field_4D = 0;
- gCurrentActionFuncId = ACTION_FINISHED;
+ gBattleStruct->faintedActionsState = 0;
+ gCurrentActionFuncId = B_ACTION_FINISHED;
}
}
@@ -5609,7 +5834,7 @@ static void HandleAction_NothingIsFainted(void)
static void HandleAction_ActionFinished(void)
{
- *(gBattleStruct->monToSwitchIntoId + gBanksByTurnOrder[gCurrentTurnActionNumber]) = 6;
+ *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = 6;
gCurrentTurnActionNumber++;
gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];
SpecialStatusesClear();
@@ -5621,16 +5846,16 @@ static void HandleAction_ActionFinished(void)
gCurrentMove = 0;
gBattleMoveDamage = 0;
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gBattleScripting.animTurn = 0;
gBattleScripting.animTargetsHit = 0;
- gUnknown_02024250[gBankAttacker] = 0;
- gUnknown_02024258[gBankAttacker] = 0;
+ gLastLandedMoves[gBattlerAttacker] = 0;
+ gLastHitByType[gBattlerAttacker] = 0;
gBattleStruct->dynamicMoveType = 0;
gDynamicBasePower = 0;
gBattleScripting.atk49_state = 0;
gBattleCommunication[3] = 0;
gBattleCommunication[4] = 0;
- gBattleScripting.field_16 = 0;
+ gBattleScripting.multihitMoveEffect = 0;
gBattleResources->battleScriptsStack->size = 0;
}
diff --git a/src/battle_message.c b/src/battle_message.c
index 9c37cf646..13502d6f2 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -1,41 +1,41 @@
#include "global.h"
#include "battle.h"
#include "battle_message.h"
-#include "battle_string_ids.h"
-#include "moves.h"
+#include "constants/battle_string_ids.h"
+#include "constants/moves.h"
#include "text.h"
#include "string_util.h"
-#include "items.h"
+#include "constants/items.h"
+#include "constants/trainers.h"
#include "event_data.h"
#include "link.h"
#include "item.h"
#include "window.h"
#include "palette.h"
#include "battle_controllers.h"
+#include "battle_setup.h"
+#include "menu.h"
+#include "recorded_battle.h"
+#include "international_string_util.h"
+
+struct BattleWindowText
+{
+ u8 fillValue;
+ u8 fontId;
+ u8 x;
+ u8 y;
+ u8 letterSpacing;
+ u8 lineSpacing;
+ u8 speed;
+ u8 fgColor;
+ u8 bgColor;
+ u8 shadowColor;
+};
-extern u16 gLastUsedItem;
-extern u8 gLastUsedAbility;
-extern u8 gActiveBank;
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-extern u8 gStringBank;
-extern u8 gEffectBank;
-extern u8 gAbilitiesPerBank[BATTLE_BANKS_COUNT];
-extern u32 gBattleTypeFlags;
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
-extern u16 gPartnerTrainerId;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
-extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
extern u8 gUnknown_0203C7B4;
-extern struct StringInfoBattle *gStringInfo;
-extern const u8 gMoveNames[LAST_MOVE_INDEX + 1][13];
-extern const u8 gAbilityNames[][13];
+extern const u8 gMoveNames[MOVES_COUNT][13];
extern const u8 gTrainerClassNames[][13];
-extern const u8 gTypeNames[][7];
extern const u16 gUnknown_08D85620[];
// strings
@@ -44,863 +44,855 @@ extern const u8 gText_PkmnBoxLanettesPCFull[];
extern const u8 gText_PkmnTransferredSomeonesPC[];
extern const u8 gText_PkmnTransferredLanettesPC[];
-extern u16 sub_8068BB0(void); // pokemon_1
-extern u8 sub_81A4D00(void); // battle_frontier_2
+extern u8 GetFrontierBrainTrainerClass(void); // battle_frontier_2
extern u8 GetFrontierOpponentClass(u16 trainerId); // battle_tower
extern u8 sub_81D5530(u16 trainerId); // pokenav
extern u8 GetEreaderTrainerClassId(void); // battle_tower
-extern void sub_81A4D50(u8 *txtPtr); // battle_frontier_2
+extern void CopyFrontierBrainTrainerName(u8 *txtPtr); // battle_frontier_2
extern void sub_81D5554(u8 *txtPtr, u16 trainerId); // pokenav
extern void GetEreaderTrainerName(u8 *txtPtr);
extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2
extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav
-extern const u8* GetTrainer1LoseText(void); // battle_setup
-extern const u8* GetTrainer2LoseText(void); // battle_setup
extern void GetFrontierTrainerName(u8 *dst, u16 trainerId);
-extern s32 GetStringCenterAlignXOffsetWithLetterSpacing(u8 fontId, const u8 *str, s32 totalWidth, s16 letterSpacing);
-extern u8 GetTextSpeedInRecordedBattle(void);
-extern u8 sav2_get_text_speed(void);
// this file's functions
-static void sub_814F8F8(u8 *textPtr);
-static void sub_814F950(u8 *dst);
+static void ChooseMoveUsedParticle(u8 *textPtr);
+static void ChooseTypeOfMoveUsedString(u8 *dst);
static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst);
-// ewram variables
-EWRAM_DATA u8 gDisplayedStringBattle[300] = {0};
-EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0};
-EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0};
-EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0};
+// EWRAM vars
+static EWRAM_DATA u8 sBattlerAbilities[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA struct BattleMsgData *gBattleMsgDataPtr = NULL;
// const rom data
// todo: make some of those names less vague: attacker/target vs pkmn, etc.
-const u8 gText_Trainer1LoseText[] = _("{B_TRAINER1_LOSE_TEXT}");
-const u8 gText_PkmnGainedEXP[] = _("{B_BUFF1} gained{B_BUFF2}\n{B_BUFF3} EXP. Points!\p");
-const u8 gText_EmptyString4[] = _("");
-const u8 gText_ABoosted[] = _(" a boosted");
-const u8 gText_PkmnGrewToLv[] = _("{B_BUFF1} grew to\nLV. {B_BUFF2}!{UNKNOWN_A}\p");
-const u8 gText_PkmnLearnedMove[] = _("{B_BUFF1} learned\n{B_BUFF2}!{UNKNOWN_A}\p");
-const u8 gText_TryToLearnMove1[] = _("{B_BUFF1} is trying to\nlearn {B_BUFF2}.\p");
-const u8 gText_TryToLearnMove2[] = _("But, {B_BUFF1} can’t learn\nmore than four moves.\p");
-const u8 gText_TryToLearnMove3[] = _("Delete a move to make\nroom for {B_BUFF2}?");
-const u8 gText_PkmnForgotMove[] = _("{B_BUFF1} forgot\n{B_BUFF2}.\p");
-const u8 gText_StopLearningMove[] = _("{PAUSE 32}Stop learning\n{B_BUFF2}?");
-const u8 gText_DidNotLearnMove[] = _("{B_BUFF1} did not learn\n{B_BUFF2}.\p");
-const u8 gText_UseNextPkmn[] = _("Use next POKéMON?");
-const u8 gText_AttackMissed[] = _("{B_ATK_NAME_WITH_PREFIX}’s\nattack missed!");
-const u8 gText_PkmnProtectedItself[] = _("{B_DEF_NAME_WITH_PREFIX}\nprotected itself!");
-const u8 gText_AvoidedDamage[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\ndamage with {B_DEF_ABILITY}!");
-const u8 gText_PkmnMakesGroundMiss[] = _("{B_DEF_NAME_WITH_PREFIX} makes GROUND\nmoves miss with {B_DEF_ABILITY}!");
-const u8 gText_PkmnAvoidedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\nthe attack!");
-const u8 gText_ItDoesntAffect[] = _("It doesn’t affect\n{B_DEF_NAME_WITH_PREFIX}…");
-const u8 gText_AttackerFainted[] = _("{B_ATK_NAME_WITH_PREFIX}\nfainted!\p");
-const u8 gText_TargetFainted[] = _("{B_DEF_NAME_WITH_PREFIX}\nfainted!\p");
-const u8 gText_PlayerGotMoney[] = _("{B_PLAYER_NAME} got ¥{B_BUFF1}\nfor winning!\p");
-const u8 gText_PlayerWhiteout[] = _("{B_PLAYER_NAME} is out of\nusable POKéMON!\p");
-const u8 gText_PlayerWhiteout2[] = _("{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}");
-const u8 gText_PreventsEscape[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents\nescape with {B_SCR_ACTIVE_ABILITY}!\p");
-const u8 gText_CantEscape2[] = _("Can’t escape!\p");
-const u8 gText_AttackerCantEscape[] = _("{B_ATK_NAME_WITH_PREFIX} can’t escape!");
-const u8 gText_HitXTimes[] = _("Hit {B_BUFF1} time(s)!");
-const u8 gText_PkmnFellAsleep[] = _("{B_EFF_NAME_WITH_PREFIX}\nfell asleep!");
-const u8 gText_PkmnMadeSleep[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade {B_EFF_NAME_WITH_PREFIX} sleep!");
-const u8 gText_PkmnAlreadyAsleep[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready asleep!");
-const u8 gText_PkmnAlreadyAsleep2[] = _("{B_ATK_NAME_WITH_PREFIX} is\nalready asleep!");
-const u8 gText_PkmnWasntAffected[] = _("{B_DEF_NAME_WITH_PREFIX}\nwasn’t affected!");
-const u8 gText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX}\nwas poisoned!");
-const u8 gText_PkmnPoisonedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\npoisoned {B_EFF_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnHurtByPoison[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby poison!");
-const u8 gText_PkmnAlreadyPoisoned[] = _("{B_DEF_NAME_WITH_PREFIX} is already\npoisoned.");
-const u8 gText_PkmnBadlyPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} is badly\npoisoned!");
-const u8 gText_PkmnEnergyDrained[] = _("{B_DEF_NAME_WITH_PREFIX} had its\nenergy drained!");
-const u8 gText_PkmnWasBurned[] = _("{B_EFF_NAME_WITH_PREFIX} was burned!");
-const u8 gText_PkmnBurnedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nburned {B_EFF_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnHurtByBurn[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby its burn!");
-const u8 gText_PkmnAlreadyHasBurn[] = _("{B_DEF_NAME_WITH_PREFIX} already\nhas a burn.");
-const u8 gText_PkmnWasFrozen[] = _("{B_EFF_NAME_WITH_PREFIX} was\nfrozen solid!");
-const u8 gText_PkmnFrozenBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nfroze {B_EFF_NAME_WITH_PREFIX} solid!");
-const u8 gText_PkmnIsFrozen[] = _("{B_ATK_NAME_WITH_PREFIX} is\nfrozen solid!");
-const u8 gText_PkmnWasDefrosted[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndefrosted!");
-const u8 gText_PkmnWasDefrosted2[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted!");
-const u8 gText_PkmnWasDefrostedBy[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted by {B_CURRENT_MOVE}!");
-const u8 gText_PkmnWasParalyzed[] = _("{B_EFF_NAME_WITH_PREFIX} is paralyzed!\nIt may be unable to move!");
-const u8 gText_PkmnWasParalyzedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nparalyzed {B_EFF_NAME_WITH_PREFIX}!\lIt may be unable to move!");
-const u8 gText_PkmnIsParalyzed[] = _("{B_ATK_NAME_WITH_PREFIX} is paralyzed!\nIt can’t move!");
-const u8 gText_PkmnIsAlreadyParalyzed[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready paralyzed!");
-const u8 gText_PkmnHealedParalysis[] = _("{B_DEF_NAME_WITH_PREFIX} was\nhealed of paralysis!");
-const u8 gText_PkmnDreamEaten[] = _("{B_DEF_NAME_WITH_PREFIX}’s\ndream was eaten!");
-const u8 gText_StatsWontIncrease[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\nwon’t go higher!");
-const u8 gText_StatsWontDecrease[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\nwon’t go lower!");
-const u8 gText_TeamStoppedWorking[] = _("Your team’s {B_BUFF1}\nstopped working!");
-const u8 gText_FoeStoppedWorking[] = _("The foe’s {B_BUFF1}\nstopped working!");
-const u8 gText_PkmnIsConfused[] = _("{B_ATK_NAME_WITH_PREFIX} is\nconfused!");
-const u8 gText_PkmnHealedConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} snapped\nout of confusion!");
-const u8 gText_PkmnWasConfused[] = _("{B_EFF_NAME_WITH_PREFIX} became\nconfused!");
-const u8 gText_PkmnAlreadyConfused[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready confused!");
-const u8 gText_PkmnFellInLove[] = _("{B_DEF_NAME_WITH_PREFIX}\nfell in love!");
-const u8 gText_PkmnInLove[] = _("{B_ATK_NAME_WITH_PREFIX} is in love\nwith {B_SCR_ACTIVE_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnImmobilizedByLove[] = _("{B_ATK_NAME_WITH_PREFIX} is\nimmobilized by love!");
-const u8 gText_PkmnBlownAway[] = _("{B_DEF_NAME_WITH_PREFIX} was\nblown away!");
-const u8 gText_PkmnChangedType[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto the {B_BUFF1} type!");
-const u8 gText_PkmnFlinched[] = _("{B_ATK_NAME_WITH_PREFIX} flinched!");
-const u8 gText_PkmnRegainedHealth[] = _("{B_DEF_NAME_WITH_PREFIX} regained\nhealth!");
-const u8 gText_PkmnHPFull[] = _("{B_DEF_NAME_WITH_PREFIX}’s\nHP is full!");
-const u8 gText_PkmnRaisedSpDef[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised SP. DEF!");
-const u8 gText_PkmnRaisedSpDefALittle[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised SP. DEF a little!");
-const u8 gText_PkmnRaisedDef[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised DEFENSE!");
-const u8 gText_PkmnRaisedDefALittle[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised DEFENSE a little!");
-const u8 gText_PkmnCoveredByVeil[] = _("{B_ATK_PREFIX2}’s party is covered\nby a veil!");
-const u8 gText_PkmnUsedSafeguard[] = _("{B_DEF_NAME_WITH_PREFIX}’s party is protected\nby SAFEGUARD!");
-const u8 gText_PkmnSafeguardExpired[] = _("{B_ATK_PREFIX3}’s party is no longer\nprotected by SAFEGUARD!");
-const u8 gText_PkmnWentToSleep[] = _("{B_ATK_NAME_WITH_PREFIX} went\nto sleep!");
-const u8 gText_PkmnSleptHealthy[] = _("{B_ATK_NAME_WITH_PREFIX} slept and\nbecame healthy!");
-const u8 gText_PkmnWhippedWhirlwind[] = _("{B_ATK_NAME_WITH_PREFIX} whipped\nup a whirlwind!");
-const u8 gText_PkmnTookSunlight[] = _("{B_ATK_NAME_WITH_PREFIX} took\nin sunlight!");
-const u8 gText_PkmnLoweredHead[] = _("{B_ATK_NAME_WITH_PREFIX} lowered\nits head!");
-const u8 gText_PkmnIsGlowing[] = _("{B_ATK_NAME_WITH_PREFIX} is glowing!");
-const u8 gText_PkmnFlewHigh[] = _("{B_ATK_NAME_WITH_PREFIX} flew\nup high!");
-const u8 gText_PkmnDugHole[] = _("{B_ATK_NAME_WITH_PREFIX} dug a hole!");
-const u8 gText_PkmnHidUnderwater[] = _("{B_ATK_NAME_WITH_PREFIX} hid\nunderwater!");
-const u8 gText_PkmnSprangUp[] = _("{B_ATK_NAME_WITH_PREFIX} sprang up!");
-const u8 gText_PkmnSqueezedByBind[] = _("{B_DEF_NAME_WITH_PREFIX} was squeezed by\n{B_ATK_NAME_WITH_PREFIX}’s BIND!");
-const u8 gText_PkmnTrappedInVortex[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nin the vortex!");
-const u8 gText_PkmnTrappedBySandTomb[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nby SAND TOMB!");
-const u8 gText_PkmnWrappedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was WRAPPED by\n{B_ATK_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnClamped[] = _("{B_ATK_NAME_WITH_PREFIX} CLAMPED\n{B_DEF_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnHurtBy[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby {B_BUFF1}!");
-const u8 gText_PkmnFreedFrom[] = _("{B_ATK_NAME_WITH_PREFIX} was freed\nfrom {B_BUFF1}!");
-const u8 gText_PkmnCrashed[] = _("{B_ATK_NAME_WITH_PREFIX} kept going\nand crashed!");
+static const u8 sText_Trainer1LoseText[] = _("{B_TRAINER1_LOSE_TEXT}");
+static const u8 sText_PkmnGainedEXP[] = _("{B_BUFF1} gained{B_BUFF2}\n{B_BUFF3} EXP. Points!\p");
+static const u8 sText_EmptyString4[] = _("");
+static const u8 sText_ABoosted[] = _(" a boosted");
+static const u8 sText_PkmnGrewToLv[] = _("{B_BUFF1} grew to\nLV. {B_BUFF2}!{UNKNOWN_A}\p");
+static const u8 sText_PkmnLearnedMove[] = _("{B_BUFF1} learned\n{B_BUFF2}!{UNKNOWN_A}\p");
+static const u8 sText_TryToLearnMove1[] = _("{B_BUFF1} is trying to\nlearn {B_BUFF2}.\p");
+static const u8 sText_TryToLearnMove2[] = _("But, {B_BUFF1} can’t learn\nmore than four moves.\p");
+static const u8 sText_TryToLearnMove3[] = _("Delete a move to make\nroom for {B_BUFF2}?");
+static const u8 sText_PkmnForgotMove[] = _("{B_BUFF1} forgot\n{B_BUFF2}.\p");
+static const u8 sText_StopLearningMove[] = _("{PAUSE 32}Stop learning\n{B_BUFF2}?");
+static const u8 sText_DidNotLearnMove[] = _("{B_BUFF1} did not learn\n{B_BUFF2}.\p");
+static const u8 sText_UseNextPkmn[] = _("Use next POKéMON?");
+static const u8 sText_AttackMissed[] = _("{B_ATK_NAME_WITH_PREFIX}’s\nattack missed!");
+static const u8 sText_PkmnProtectedItself[] = _("{B_DEF_NAME_WITH_PREFIX}\nprotected itself!");
+static const u8 sText_AvoidedDamage[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\ndamage with {B_DEF_ABILITY}!");
+static const u8 sText_PkmnMakesGroundMiss[] = _("{B_DEF_NAME_WITH_PREFIX} makes GROUND\nmoves miss with {B_DEF_ABILITY}!");
+static const u8 sText_PkmnAvoidedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\nthe attack!");
+static const u8 sText_ItDoesntAffect[] = _("It doesn’t affect\n{B_DEF_NAME_WITH_PREFIX}…");
+static const u8 sText_AttackerFainted[] = _("{B_ATK_NAME_WITH_PREFIX}\nfainted!\p");
+static const u8 sText_TargetFainted[] = _("{B_DEF_NAME_WITH_PREFIX}\nfainted!\p");
+static const u8 sText_PlayerGotMoney[] = _("{B_PLAYER_NAME} got ¥{B_BUFF1}\nfor winning!\p");
+static const u8 sText_PlayerWhiteout[] = _("{B_PLAYER_NAME} is out of\nusable POKéMON!\p");
+static const u8 sText_PlayerWhiteout2[] = _("{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}");
+static const u8 sText_PreventsEscape[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents\nescape with {B_SCR_ACTIVE_ABILITY}!\p");
+static const u8 sText_CantEscape2[] = _("Can’t escape!\p");
+static const u8 sText_AttackerCantEscape[] = _("{B_ATK_NAME_WITH_PREFIX} can’t escape!");
+static const u8 sText_HitXTimes[] = _("Hit {B_BUFF1} time(s)!");
+static const u8 sText_PkmnFellAsleep[] = _("{B_EFF_NAME_WITH_PREFIX}\nfell asleep!");
+static const u8 sText_PkmnMadeSleep[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade {B_EFF_NAME_WITH_PREFIX} sleep!");
+static const u8 sText_PkmnAlreadyAsleep[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready asleep!");
+static const u8 sText_PkmnAlreadyAsleep2[] = _("{B_ATK_NAME_WITH_PREFIX} is\nalready asleep!");
+static const u8 sText_PkmnWasntAffected[] = _("{B_DEF_NAME_WITH_PREFIX}\nwasn’t affected!");
+static const u8 sText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX}\nwas poisoned!");
+static const u8 sText_PkmnPoisonedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\npoisoned {B_EFF_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnHurtByPoison[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby poison!");
+static const u8 sText_PkmnAlreadyPoisoned[] = _("{B_DEF_NAME_WITH_PREFIX} is already\npoisoned.");
+static const u8 sText_PkmnBadlyPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} is badly\npoisoned!");
+static const u8 sText_PkmnEnergyDrained[] = _("{B_DEF_NAME_WITH_PREFIX} had its\nenergy drained!");
+static const u8 sText_PkmnWasBurned[] = _("{B_EFF_NAME_WITH_PREFIX} was burned!");
+static const u8 sText_PkmnBurnedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nburned {B_EFF_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnHurtByBurn[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby its burn!");
+static const u8 sText_PkmnAlreadyHasBurn[] = _("{B_DEF_NAME_WITH_PREFIX} already\nhas a burn.");
+static const u8 sText_PkmnWasFrozen[] = _("{B_EFF_NAME_WITH_PREFIX} was\nfrozen solid!");
+static const u8 sText_PkmnFrozenBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nfroze {B_EFF_NAME_WITH_PREFIX} solid!");
+static const u8 sText_PkmnIsFrozen[] = _("{B_ATK_NAME_WITH_PREFIX} is\nfrozen solid!");
+static const u8 sText_PkmnWasDefrosted[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndefrosted!");
+static const u8 sText_PkmnWasDefrosted2[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted!");
+static const u8 sText_PkmnWasDefrostedBy[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted by {B_CURRENT_MOVE}!");
+static const u8 sText_PkmnWasParalyzed[] = _("{B_EFF_NAME_WITH_PREFIX} is paralyzed!\nIt may be unable to move!");
+static const u8 sText_PkmnWasParalyzedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nparalyzed {B_EFF_NAME_WITH_PREFIX}!\lIt may be unable to move!");
+static const u8 sText_PkmnIsParalyzed[] = _("{B_ATK_NAME_WITH_PREFIX} is paralyzed!\nIt can’t move!");
+static const u8 sText_PkmnIsAlreadyParalyzed[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready paralyzed!");
+static const u8 sText_PkmnHealedParalysis[] = _("{B_DEF_NAME_WITH_PREFIX} was\nhealed of paralysis!");
+static const u8 sText_PkmnDreamEaten[] = _("{B_DEF_NAME_WITH_PREFIX}’s\ndream was eaten!");
+static const u8 sText_StatsWontIncrease[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\nwon’t go higher!");
+static const u8 sText_StatsWontDecrease[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\nwon’t go lower!");
+static const u8 sText_TeamStoppedWorking[] = _("Your team’s {B_BUFF1}\nstopped working!");
+static const u8 sText_FoeStoppedWorking[] = _("The foe’s {B_BUFF1}\nstopped working!");
+static const u8 sText_PkmnIsConfused[] = _("{B_ATK_NAME_WITH_PREFIX} is\nconfused!");
+static const u8 sText_PkmnHealedConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} snapped\nout of confusion!");
+static const u8 sText_PkmnWasConfused[] = _("{B_EFF_NAME_WITH_PREFIX} became\nconfused!");
+static const u8 sText_PkmnAlreadyConfused[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready confused!");
+static const u8 sText_PkmnFellInLove[] = _("{B_DEF_NAME_WITH_PREFIX}\nfell in love!");
+static const u8 sText_PkmnInLove[] = _("{B_ATK_NAME_WITH_PREFIX} is in love\nwith {B_SCR_ACTIVE_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnImmobilizedByLove[] = _("{B_ATK_NAME_WITH_PREFIX} is\nimmobilized by love!");
+static const u8 sText_PkmnBlownAway[] = _("{B_DEF_NAME_WITH_PREFIX} was\nblown away!");
+static const u8 sText_PkmnChangedType[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto the {B_BUFF1} type!");
+static const u8 sText_PkmnFlinched[] = _("{B_ATK_NAME_WITH_PREFIX} flinched!");
+static const u8 sText_PkmnRegainedHealth[] = _("{B_DEF_NAME_WITH_PREFIX} regained\nhealth!");
+static const u8 sText_PkmnHPFull[] = _("{B_DEF_NAME_WITH_PREFIX}’s\nHP is full!");
+static const u8 sText_PkmnRaisedSpDef[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised SP. DEF!");
+static const u8 sText_PkmnRaisedSpDefALittle[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised SP. DEF a little!");
+static const u8 sText_PkmnRaisedDef[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised DEFENSE!");
+static const u8 sText_PkmnRaisedDefALittle[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised DEFENSE a little!");
+static const u8 sText_PkmnCoveredByVeil[] = _("{B_ATK_PREFIX2}’s party is covered\nby a veil!");
+static const u8 sText_PkmnUsedSafeguard[] = _("{B_DEF_NAME_WITH_PREFIX}’s party is protected\nby SAFEGUARD!");
+static const u8 sText_PkmnSafeguardExpired[] = _("{B_ATK_PREFIX3}’s party is no longer\nprotected by SAFEGUARD!");
+static const u8 sText_PkmnWentToSleep[] = _("{B_ATK_NAME_WITH_PREFIX} went\nto sleep!");
+static const u8 sText_PkmnSleptHealthy[] = _("{B_ATK_NAME_WITH_PREFIX} slept and\nbecame healthy!");
+static const u8 sText_PkmnWhippedWhirlwind[] = _("{B_ATK_NAME_WITH_PREFIX} whipped\nup a whirlwind!");
+static const u8 sText_PkmnTookSunlight[] = _("{B_ATK_NAME_WITH_PREFIX} took\nin sunlight!");
+static const u8 sText_PkmnLoweredHead[] = _("{B_ATK_NAME_WITH_PREFIX} lowered\nits head!");
+static const u8 sText_PkmnIsGlowing[] = _("{B_ATK_NAME_WITH_PREFIX} is glowing!");
+static const u8 sText_PkmnFlewHigh[] = _("{B_ATK_NAME_WITH_PREFIX} flew\nup high!");
+static const u8 sText_PkmnDugHole[] = _("{B_ATK_NAME_WITH_PREFIX} dug a hole!");
+static const u8 sText_PkmnHidUnderwater[] = _("{B_ATK_NAME_WITH_PREFIX} hid\nunderwater!");
+static const u8 sText_PkmnSprangUp[] = _("{B_ATK_NAME_WITH_PREFIX} sprang up!");
+static const u8 sText_PkmnSqueezedByBind[] = _("{B_DEF_NAME_WITH_PREFIX} was squeezed by\n{B_ATK_NAME_WITH_PREFIX}’s BIND!");
+static const u8 sText_PkmnTrappedInVortex[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nin the vortex!");
+static const u8 sText_PkmnTrappedBySandTomb[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nby SAND TOMB!");
+static const u8 sText_PkmnWrappedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was WRAPPED by\n{B_ATK_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnClamped[] = _("{B_ATK_NAME_WITH_PREFIX} CLAMPED\n{B_DEF_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnHurtBy[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby {B_BUFF1}!");
+static const u8 sText_PkmnFreedFrom[] = _("{B_ATK_NAME_WITH_PREFIX} was freed\nfrom {B_BUFF1}!");
+static const u8 sText_PkmnCrashed[] = _("{B_ATK_NAME_WITH_PREFIX} kept going\nand crashed!");
const u8 gText_PkmnShroudedInMist[] = _("{B_ATK_PREFIX2} became\nshrouded in MIST!");
-const u8 gText_PkmnProtectedByMist[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected\nby MIST!");
+static const u8 sText_PkmnProtectedByMist[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected\nby MIST!");
const u8 gText_PkmnGettingPumped[] = _("{B_ATK_NAME_WITH_PREFIX} is getting\npumped!");
-const u8 gText_PkmnHitWithRecoil[] = _("{B_ATK_NAME_WITH_PREFIX} is hit\nwith recoil!");
-const u8 gText_PkmnProtectedItself2[] = _("{B_ATK_NAME_WITH_PREFIX} protected\nitself!");
-const u8 gText_PkmnBuffetedBySandstorm[] = _("{B_ATK_NAME_WITH_PREFIX} is buffeted\nby the sandstorm!");
-const u8 gText_PkmnPeltedByHail[] = _("{B_ATK_NAME_WITH_PREFIX} is pelted\nby HAIL!");
-const u8 gText_PkmnsXWoreOff[] = _("{B_ATK_PREFIX1}’s {B_BUFF1}\nwore off!");
-const u8 gText_PkmnSeeded[] = _("{B_DEF_NAME_WITH_PREFIX} was seeded!");
-const u8 gText_PkmnEvadedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} evaded\nthe attack!");
-const u8 gText_PkmnSappedByLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX}’s health is\nsapped by LEECH SEED!");
-const u8 gText_PkmnFastAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} is fast\nasleep.");
-const u8 gText_PkmnWokeUp[] = _("{B_ATK_NAME_WITH_PREFIX} woke up!");
-const u8 gText_PkmnUproarKeptAwake[] = _("But {B_SCR_ACTIVE_NAME_WITH_PREFIX}’s UPROAR\nkept it awake!");
-const u8 gText_PkmnWokeUpInUproar[] = _("{B_ATK_NAME_WITH_PREFIX} woke up\nin the UPROAR!");
-const u8 gText_PkmnCausedUproar[] = _("{B_ATK_NAME_WITH_PREFIX} caused\nan UPROAR!");
-const u8 gText_PkmnMakingUproar[] = _("{B_ATK_NAME_WITH_PREFIX} is making\nan UPROAR!");
-const u8 gText_PkmnCalmedDown[] = _("{B_ATK_NAME_WITH_PREFIX} calmed down.");
-const u8 gText_PkmnCantSleepInUproar[] = _("But {B_DEF_NAME_WITH_PREFIX} can’t\nsleep in an UPROAR!");
-const u8 gText_PkmnStockpiled[] = _("{B_ATK_NAME_WITH_PREFIX} STOCKPILED\n{B_BUFF1}!");
-const u8 gText_PkmnCantStockpile[] = _("{B_ATK_NAME_WITH_PREFIX} can’t\nSTOCKPILE any more!");
-const u8 gText_PkmnCantSleepInUproar2[] = _("But {B_DEF_NAME_WITH_PREFIX} can’t\nsleep in an UPROAR!");
-const u8 gText_UproarKeptPkmnAwake[] = _("But the UPROAR kept\n{B_DEF_NAME_WITH_PREFIX} awake!");
-const u8 gText_PkmnStayedAwakeUsing[] = _("{B_DEF_NAME_WITH_PREFIX} stayed awake\nusing its {B_DEF_ABILITY}!");
-const u8 gText_PkmnStoringEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} is storing\nenergy!");
-const u8 gText_PkmnUnleashedEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} unleashed\nenergy!");
-const u8 gText_PkmnFatigueConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} became\nconfused due to fatigue!");
-const u8 gText_PkmnPickedUpItem[] = _("{B_PLAYER_NAME} picked up\n¥{B_BUFF1}!\p");
-const u8 gText_PkmnUnaffected[] = _("{B_DEF_NAME_WITH_PREFIX} is\nunaffected!");
-const u8 gText_PkmnTransformedInto[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto {B_BUFF1}!");
-const u8 gText_PkmnMadeSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} made\na SUBSTITUTE!");
-const u8 gText_PkmnHasSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} already\nhas a SUBSTITUTE!");
-const u8 gText_SubstituteDamaged[] = _("The SUBSTITUTE took damage\nfor {B_DEF_NAME_WITH_PREFIX}!\p");
-const u8 gText_PkmnSubstituteFaded[] = _("{B_DEF_NAME_WITH_PREFIX}’s\nSUBSTITUTE faded!\p");
-const u8 gText_PkmnMustRecharge[] = _("{B_ATK_NAME_WITH_PREFIX} must\nrecharge!");
-const u8 gText_PkmnRageBuilding[] = _("{B_DEF_NAME_WITH_PREFIX}’s RAGE\nis building!");
-const u8 gText_PkmnMoveWasDisabled[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\nwas disabled!");
-const u8 gText_PkmnMoveDisabledNoMore[] = _("{B_ATK_NAME_WITH_PREFIX} is disabled\nno more!");
-const u8 gText_PkmnGotEncore[] = _("{B_DEF_NAME_WITH_PREFIX} got\nan ENCORE!");
-const u8 gText_PkmnEncoreEnded[] = _("{B_ATK_NAME_WITH_PREFIX}’s ENCORE\nended!");
-const u8 gText_PkmnTookAim[] = _("{B_ATK_NAME_WITH_PREFIX} took aim\nat {B_DEF_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnSketchedMove[] = _("{B_ATK_NAME_WITH_PREFIX} SKETCHED\n{B_BUFF1}!");
-const u8 gText_PkmnTryingToTakeFoe[] = _("{B_ATK_NAME_WITH_PREFIX} is trying\nto take its foe with it!");
-const u8 gText_PkmnTookFoe[] = _("{B_DEF_NAME_WITH_PREFIX} took\n{B_ATK_NAME_WITH_PREFIX} with it!");
-const u8 gText_PkmnReducedPP[] = _("Reduced {B_DEF_NAME_WITH_PREFIX}’s\n{B_BUFF1} by {B_BUFF2}!");
-const u8 gText_PkmnStoleItem[] = _("{B_ATK_NAME_WITH_PREFIX} stole\n{B_DEF_NAME_WITH_PREFIX}’s {B_LAST_ITEM}!");
-const u8 gText_TargetCantEscapeNow[] = _("{B_DEF_NAME_WITH_PREFIX} can’t\nescape now!");
-const u8 gText_PkmnFellIntoNightmare[] = _("{B_DEF_NAME_WITH_PREFIX} fell into\na NIGHTMARE!");
-const u8 gText_PkmnLockedInNightmare[] = _("{B_ATK_NAME_WITH_PREFIX} is locked\nin a NIGHTMARE!");
-const u8 gText_PkmnLaidCurse[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP and\nlaid a CURSE on {B_DEF_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnAfflictedByCurse[] = _("{B_ATK_NAME_WITH_PREFIX} is afflicted\nby the CURSE!");
-const u8 gText_SpikesScattered[] = _("SPIKES were scattered all around\nthe opponent’s side!");
-const u8 gText_PkmnHurtBySpikes[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is hurt\nby SPIKES!");
-const u8 gText_PkmnIdentified[] = _("{B_ATK_NAME_WITH_PREFIX} identified\n{B_DEF_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnPerishCountFell[] = _("{B_ATK_NAME_WITH_PREFIX}’s PERISH count\nfell to {B_BUFF1}!");
-const u8 gText_PkmnBracedItself[] = _("{B_ATK_NAME_WITH_PREFIX} braced\nitself!");
-const u8 gText_PkmnEnduredHit[] = _("{B_DEF_NAME_WITH_PREFIX} ENDURED\nthe hit!");
-const u8 gText_MagnitudeStrength[] = _("MAGNITUDE {B_BUFF1}!");
-const u8 gText_PkmnCutHPMaxedAttack[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP\nand maximized ATTACK!");
-const u8 gText_PkmnCopiedStatChanges[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}’s stat changes!");
-const u8 gText_PkmnGotFree[] = _("{B_ATK_NAME_WITH_PREFIX} got free of\n{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}!");
-const u8 gText_PkmnShedLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX} shed\nLEECH SEED!");
-const u8 gText_PkmnBlewAwaySpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSPIKES!");
-const u8 gText_PkmnFledFromBattle[] = _("{B_ATK_NAME_WITH_PREFIX} fled from\nbattle!");
-const u8 gText_PkmnForesawAttack[] = _("{B_ATK_NAME_WITH_PREFIX} foresaw\nan attack!");
-const u8 gText_PkmnTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX} took the\n{B_BUFF1} attack!");
-const u8 gText_PkmnChoseXAsDestiny[] = _("{B_ATK_NAME_WITH_PREFIX} chose\n{B_CURRENT_MOVE} as its destiny!");
-const u8 gText_PkmnAttack[] = _("{B_BUFF1}’s attack!");
-const u8 gText_PkmnCenterAttention[] = _("{B_ATK_NAME_WITH_PREFIX} became the\ncenter of attention!");
-const u8 gText_PkmnChargingPower[] = _("{B_ATK_NAME_WITH_PREFIX} began\ncharging power!");
-const u8 gText_NaturePowerTurnedInto[] = _("NATURE POWER turned into\n{B_CURRENT_MOVE}!");
-const u8 gText_PkmnStatusNormal[] = _("{B_ATK_NAME_WITH_PREFIX}’s status\nreturned to normal!");
-const u8 gText_PkmnSubjectedToTorment[] = _("{B_DEF_NAME_WITH_PREFIX} was subjected\nto TORMENT!");
-const u8 gText_PkmnTighteningFocus[] = _("{B_ATK_NAME_WITH_PREFIX} is tightening\nits focus!");
-const u8 gText_PkmnFellForTaunt[] = _("{B_DEF_NAME_WITH_PREFIX} fell for\nthe TAUNT!");
-const u8 gText_PkmnReadyToHelp[] = _("{B_ATK_NAME_WITH_PREFIX} is ready to\nhelp {B_DEF_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnSwitchedItems[] = _("{B_ATK_NAME_WITH_PREFIX} switched\nitems with its opponent!");
-const u8 gText_PkmnObtainedX[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}.");
-const u8 gText_PkmnObtainedX2[] = _("{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}.");
-const u8 gText_PkmnObtainedXYObtainedZ[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}.\p{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}.");
-const u8 gText_PkmnCopiedFoe[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}!");
-const u8 gText_PkmnMadeWish[] = _("{B_ATK_NAME_WITH_PREFIX} made a WISH!");
-const u8 gText_PkmnWishCameTrue[] = _("{B_BUFF1}’s WISH\ncame true!");
-const u8 gText_PkmnPlantedRoots[] = _("{B_ATK_NAME_WITH_PREFIX} planted its roots!");
-const u8 gText_PkmnAbsorbedNutrients[] = _("{B_ATK_NAME_WITH_PREFIX} absorbed\nnutrients with its roots!");
-const u8 gText_PkmnAnchoredItself[] = _("{B_DEF_NAME_WITH_PREFIX} anchored\nitself with its roots!");
-const u8 gText_PkmnWasMadeDrowsy[] = _("{B_ATK_NAME_WITH_PREFIX} made\n{B_DEF_NAME_WITH_PREFIX} drowsy!");
-const u8 gText_PkmnKnockedOff[] = _("{B_ATK_NAME_WITH_PREFIX} knocked off\n{B_DEF_NAME_WITH_PREFIX}’s {B_LAST_ITEM}!");
-const u8 gText_PkmnSwappedAbilities[] = _("{B_ATK_NAME_WITH_PREFIX} swapped abilities\nwith its opponent!");
-const u8 gText_PkmnSealedOpponentMove[] = _("{B_ATK_NAME_WITH_PREFIX} sealed the\nopponent’s move(s)!");
-const u8 gText_PkmnWantsGrudge[] = _("{B_ATK_NAME_WITH_PREFIX} wants the\nopponent to bear a GRUDGE!");
-const u8 gText_PkmnLostPPGrudge[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1} lost\nall its PP due to the GRUDGE!");
-const u8 gText_PkmnShroudedItself[] = _("{B_ATK_NAME_WITH_PREFIX} shrouded\nitself in {B_CURRENT_MOVE}!");
-const u8 gText_PkmnMoveBounced[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_CURRENT_MOVE}\nwas bounced back by MAGIC COAT!");
-const u8 gText_PkmnWaitsForTarget[] = _("{B_ATK_NAME_WITH_PREFIX} waits for a target\nto make a move!");
-const u8 gText_PkmnSnatchedMove[] = _("{B_DEF_NAME_WITH_PREFIX} SNATCHED\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s move!");
-const u8 gText_ElectricityWeakened[] = _("Electricity’s power was\nweakened!");
-const u8 gText_FireWeakened[] = _("Fire’s power was\nweakened!");
-const u8 gText_XFoundOneY[] = _("{B_ATK_NAME_WITH_PREFIX} found\none {B_LAST_ITEM}!");
-const u8 gText_SoothingAroma[] = _("A soothing aroma wafted\nthrough the area!");
-const u8 gText_ItemsCantBeUsedNow[] = _("Items can’t be used now.{PAUSE 64}");
-const u8 gText_ForXCommaYZ[] = _("For {B_SCR_ACTIVE_NAME_WITH_PREFIX},\n{B_LAST_ITEM} {B_BUFF1}");
-const u8 gText_PkmnUsedXToGetPumped[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used\n{B_LAST_ITEM} to get pumped!");
-const u8 gText_PkmnLostFocus[] = _("{B_ATK_NAME_WITH_PREFIX} lost its\nfocus and couldn’t move!");
-const u8 gText_PkmnWasDraggedOut[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndragged out!\p");
-const u8 gText_TheWallShattered[] = _("The wall shattered!");
-const u8 gText_ButNoEffect[] = _("But it had no effect!");
-const u8 gText_PkmnHasNoMovesLeft[] = _("{B_ACTIVE_NAME_WITH_PREFIX} has no\nmoves left!\p");
-const u8 gText_PkmnMoveIsDisabled[] = _("{B_ACTIVE_NAME_WITH_PREFIX}’s {B_CURRENT_MOVE}\nis disabled!\p");
-const u8 gText_PkmnCantUseMoveTorment[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use the same\nmove in a row due to the TORMENT!\p");
-const u8 gText_PkmnCantUseMoveTaunt[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use\n{B_CURRENT_MOVE} after the TAUNT!\p");
-const u8 gText_PkmnCantUseMoveSealed[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use the\nsealed {B_CURRENT_MOVE}!\p");
-const u8 gText_PkmnMadeItRain[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade it rain!");
-const u8 gText_PkmnRaisedSpeed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nraised its SPEED!");
-const u8 gText_PkmnProtectedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was protected\nby {B_DEF_ABILITY}!");
-const u8 gText_PkmnPreventsUsage[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents {B_ATK_NAME_WITH_PREFIX}\lfrom using {B_CURRENT_MOVE}!");
-const u8 gText_PkmnRestoredHPUsing[] = _("{B_DEF_NAME_WITH_PREFIX} restored HP\nusing its {B_DEF_ABILITY}!");
-const u8 gText_PkmnsXMadeYUseless[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} useless!");
-const u8 gText_PkmnChangedTypeWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade it the {B_BUFF1} type!");
-const u8 gText_PkmnPreventsParalysisWith[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents paralysis!");
-const u8 gText_PkmnPreventsRomanceWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents romance!");
-const u8 gText_PkmnPreventsPoisoningWith[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents poisoning!");
-const u8 gText_PkmnPreventsConfusionWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents confusion!");
-const u8 gText_PkmnRaisedFirePowerWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nraised its FIRE power!");
-const u8 gText_PkmnAnchorsItselfWith[] = _("{B_DEF_NAME_WITH_PREFIX} anchors\nitself with {B_DEF_ABILITY}!");
-const u8 gText_PkmnCutsAttackWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncuts {B_DEF_NAME_WITH_PREFIX}’s ATTACK!");
-const u8 gText_PkmnPreventsStatLossWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nprevents stat loss!");
-const u8 gText_PkmnHurtsWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nhurt {B_ATK_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnTraced[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} TRACED\n{B_BUFF1}’s {B_BUFF2}!");
-const u8 gText_PkmnsXPreventsBurns[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_EFF_ABILITY}\nprevents burns!");
-const u8 gText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nblocks {B_CURRENT_MOVE}!");
-const u8 gText_PkmnsXBlocksY2[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nblocks {B_CURRENT_MOVE}!");
-const u8 gText_PkmnsXRestoredHPALittle2[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\nrestored its HP a little!");
-const u8 gText_PkmnsXWhippedUpSandstorm[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nwhipped up a sandstorm!");
-const u8 gText_PkmnsXIntensifiedSun[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nintensified the sun’s rays!");
-const u8 gText_PkmnsXPreventsYLoss[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nprevents {B_BUFF1} loss!");
-const u8 gText_PkmnsXInfatuatedY[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\ninfatuated {B_ATK_NAME_WITH_PREFIX}!");
-const u8 gText_PkmnsXMadeYIneffective[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} ineffective!");
-const u8 gText_PkmnsXCuredYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!");
-const u8 gText_ItSuckedLiquidOoze[] = _("It sucked up the\nLIQUID OOZE!");
-const u8 gText_PkmnTransformed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} transformed!");
-const u8 gText_PkmnsXTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\ntook the attack!");
+static const u8 sText_PkmnHitWithRecoil[] = _("{B_ATK_NAME_WITH_PREFIX} is hit\nwith recoil!");
+static const u8 sText_PkmnProtectedItself2[] = _("{B_ATK_NAME_WITH_PREFIX} protected\nitself!");
+static const u8 sText_PkmnBuffetedBySandstorm[] = _("{B_ATK_NAME_WITH_PREFIX} is buffeted\nby the sandstorm!");
+static const u8 sText_PkmnPeltedByHail[] = _("{B_ATK_NAME_WITH_PREFIX} is pelted\nby HAIL!");
+static const u8 sText_PkmnsXWoreOff[] = _("{B_ATK_PREFIX1}’s {B_BUFF1}\nwore off!");
+static const u8 sText_PkmnSeeded[] = _("{B_DEF_NAME_WITH_PREFIX} was seeded!");
+static const u8 sText_PkmnEvadedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} evaded\nthe attack!");
+static const u8 sText_PkmnSappedByLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX}’s health is\nsapped by LEECH SEED!");
+static const u8 sText_PkmnFastAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} is fast\nasleep.");
+static const u8 sText_PkmnWokeUp[] = _("{B_ATK_NAME_WITH_PREFIX} woke up!");
+static const u8 sText_PkmnUproarKeptAwake[] = _("But {B_SCR_ACTIVE_NAME_WITH_PREFIX}’s UPROAR\nkept it awake!");
+static const u8 sText_PkmnWokeUpInUproar[] = _("{B_ATK_NAME_WITH_PREFIX} woke up\nin the UPROAR!");
+static const u8 sText_PkmnCausedUproar[] = _("{B_ATK_NAME_WITH_PREFIX} caused\nan UPROAR!");
+static const u8 sText_PkmnMakingUproar[] = _("{B_ATK_NAME_WITH_PREFIX} is making\nan UPROAR!");
+static const u8 sText_PkmnCalmedDown[] = _("{B_ATK_NAME_WITH_PREFIX} calmed down.");
+static const u8 sText_PkmnCantSleepInUproar[] = _("But {B_DEF_NAME_WITH_PREFIX} can’t\nsleep in an UPROAR!");
+static const u8 sText_PkmnStockpiled[] = _("{B_ATK_NAME_WITH_PREFIX} STOCKPILED\n{B_BUFF1}!");
+static const u8 sText_PkmnCantStockpile[] = _("{B_ATK_NAME_WITH_PREFIX} can’t\nSTOCKPILE any more!");
+static const u8 sText_PkmnCantSleepInUproar2[] = _("But {B_DEF_NAME_WITH_PREFIX} can’t\nsleep in an UPROAR!");
+static const u8 sText_UproarKeptPkmnAwake[] = _("But the UPROAR kept\n{B_DEF_NAME_WITH_PREFIX} awake!");
+static const u8 sText_PkmnStayedAwakeUsing[] = _("{B_DEF_NAME_WITH_PREFIX} stayed awake\nusing its {B_DEF_ABILITY}!");
+static const u8 sText_PkmnStoringEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} is storing\nenergy!");
+static const u8 sText_PkmnUnleashedEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} unleashed\nenergy!");
+static const u8 sText_PkmnFatigueConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} became\nconfused due to fatigue!");
+static const u8 sText_PkmnPickedUpItem[] = _("{B_PLAYER_NAME} picked up\n¥{B_BUFF1}!\p");
+static const u8 sText_PkmnUnaffected[] = _("{B_DEF_NAME_WITH_PREFIX} is\nunaffected!");
+static const u8 sText_PkmnTransformedInto[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto {B_BUFF1}!");
+static const u8 sText_PkmnMadeSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} made\na SUBSTITUTE!");
+static const u8 sText_PkmnHasSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} already\nhas a SUBSTITUTE!");
+static const u8 sText_SubstituteDamaged[] = _("The SUBSTITUTE took damage\nfor {B_DEF_NAME_WITH_PREFIX}!\p");
+static const u8 sText_PkmnSubstituteFaded[] = _("{B_DEF_NAME_WITH_PREFIX}’s\nSUBSTITUTE faded!\p");
+static const u8 sText_PkmnMustRecharge[] = _("{B_ATK_NAME_WITH_PREFIX} must\nrecharge!");
+static const u8 sText_PkmnRageBuilding[] = _("{B_DEF_NAME_WITH_PREFIX}’s RAGE\nis building!");
+static const u8 sText_PkmnMoveWasDisabled[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\nwas disabled!");
+static const u8 sText_PkmnMoveDisabledNoMore[] = _("{B_ATK_NAME_WITH_PREFIX} is disabled\nno more!");
+static const u8 sText_PkmnGotEncore[] = _("{B_DEF_NAME_WITH_PREFIX} got\nan ENCORE!");
+static const u8 sText_PkmnEncoreEnded[] = _("{B_ATK_NAME_WITH_PREFIX}’s ENCORE\nended!");
+static const u8 sText_PkmnTookAim[] = _("{B_ATK_NAME_WITH_PREFIX} took aim\nat {B_DEF_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnSketchedMove[] = _("{B_ATK_NAME_WITH_PREFIX} SKETCHED\n{B_BUFF1}!");
+static const u8 sText_PkmnTryingToTakeFoe[] = _("{B_ATK_NAME_WITH_PREFIX} is trying\nto take its foe with it!");
+static const u8 sText_PkmnTookFoe[] = _("{B_DEF_NAME_WITH_PREFIX} took\n{B_ATK_NAME_WITH_PREFIX} with it!");
+static const u8 sText_PkmnReducedPP[] = _("Reduced {B_DEF_NAME_WITH_PREFIX}’s\n{B_BUFF1} by {B_BUFF2}!");
+static const u8 sText_PkmnStoleItem[] = _("{B_ATK_NAME_WITH_PREFIX} stole\n{B_DEF_NAME_WITH_PREFIX}’s {B_LAST_ITEM}!");
+static const u8 sText_TargetCantEscapeNow[] = _("{B_DEF_NAME_WITH_PREFIX} can’t\nescape now!");
+static const u8 sText_PkmnFellIntoNightmare[] = _("{B_DEF_NAME_WITH_PREFIX} fell into\na NIGHTMARE!");
+static const u8 sText_PkmnLockedInNightmare[] = _("{B_ATK_NAME_WITH_PREFIX} is locked\nin a NIGHTMARE!");
+static const u8 sText_PkmnLaidCurse[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP and\nlaid a CURSE on {B_DEF_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnAfflictedByCurse[] = _("{B_ATK_NAME_WITH_PREFIX} is afflicted\nby the CURSE!");
+static const u8 sText_SpikesScattered[] = _("SPIKES were scattered all around\nthe opponent’s side!");
+static const u8 sText_PkmnHurtBySpikes[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is hurt\nby SPIKES!");
+static const u8 sText_PkmnIdentified[] = _("{B_ATK_NAME_WITH_PREFIX} identified\n{B_DEF_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnPerishCountFell[] = _("{B_ATK_NAME_WITH_PREFIX}’s PERISH count\nfell to {B_BUFF1}!");
+static const u8 sText_PkmnBracedItself[] = _("{B_ATK_NAME_WITH_PREFIX} braced\nitself!");
+static const u8 sText_PkmnEnduredHit[] = _("{B_DEF_NAME_WITH_PREFIX} ENDURED\nthe hit!");
+static const u8 sText_MagnitudeStrength[] = _("MAGNITUDE {B_BUFF1}!");
+static const u8 sText_PkmnCutHPMaxedAttack[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP\nand maximized ATTACK!");
+static const u8 sText_PkmnCopiedStatChanges[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}’s stat changes!");
+static const u8 sText_PkmnGotFree[] = _("{B_ATK_NAME_WITH_PREFIX} got free of\n{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}!");
+static const u8 sText_PkmnShedLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX} shed\nLEECH SEED!");
+static const u8 sText_PkmnBlewAwaySpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSPIKES!");
+static const u8 sText_PkmnFledFromBattle[] = _("{B_ATK_NAME_WITH_PREFIX} fled from\nbattle!");
+static const u8 sText_PkmnForesawAttack[] = _("{B_ATK_NAME_WITH_PREFIX} foresaw\nan attack!");
+static const u8 sText_PkmnTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX} took the\n{B_BUFF1} attack!");
+static const u8 sText_PkmnChoseXAsDestiny[] = _("{B_ATK_NAME_WITH_PREFIX} chose\n{B_CURRENT_MOVE} as its destiny!");
+static const u8 sText_PkmnAttack[] = _("{B_BUFF1}’s attack!");
+static const u8 sText_PkmnCenterAttention[] = _("{B_ATK_NAME_WITH_PREFIX} became the\ncenter of attention!");
+static const u8 sText_PkmnChargingPower[] = _("{B_ATK_NAME_WITH_PREFIX} began\ncharging power!");
+static const u8 sText_NaturePowerTurnedInto[] = _("NATURE POWER turned into\n{B_CURRENT_MOVE}!");
+static const u8 sText_PkmnStatusNormal[] = _("{B_ATK_NAME_WITH_PREFIX}’s status\nreturned to normal!");
+static const u8 sText_PkmnSubjectedToTorment[] = _("{B_DEF_NAME_WITH_PREFIX} was subjected\nto TORMENT!");
+static const u8 sText_PkmnTighteningFocus[] = _("{B_ATK_NAME_WITH_PREFIX} is tightening\nits focus!");
+static const u8 sText_PkmnFellForTaunt[] = _("{B_DEF_NAME_WITH_PREFIX} fell for\nthe TAUNT!");
+static const u8 sText_PkmnReadyToHelp[] = _("{B_ATK_NAME_WITH_PREFIX} is ready to\nhelp {B_DEF_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnSwitchedItems[] = _("{B_ATK_NAME_WITH_PREFIX} switched\nitems with its opponent!");
+static const u8 sText_PkmnObtainedX[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}.");
+static const u8 sText_PkmnObtainedX2[] = _("{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}.");
+static const u8 sText_PkmnObtainedXYObtainedZ[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}.\p{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}.");
+static const u8 sText_PkmnCopiedFoe[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}!");
+static const u8 sText_PkmnMadeWish[] = _("{B_ATK_NAME_WITH_PREFIX} made a WISH!");
+static const u8 sText_PkmnWishCameTrue[] = _("{B_BUFF1}’s WISH\ncame true!");
+static const u8 sText_PkmnPlantedRoots[] = _("{B_ATK_NAME_WITH_PREFIX} planted its roots!");
+static const u8 sText_PkmnAbsorbedNutrients[] = _("{B_ATK_NAME_WITH_PREFIX} absorbed\nnutrients with its roots!");
+static const u8 sText_PkmnAnchoredItself[] = _("{B_DEF_NAME_WITH_PREFIX} anchored\nitself with its roots!");
+static const u8 sText_PkmnWasMadeDrowsy[] = _("{B_ATK_NAME_WITH_PREFIX} made\n{B_DEF_NAME_WITH_PREFIX} drowsy!");
+static const u8 sText_PkmnKnockedOff[] = _("{B_ATK_NAME_WITH_PREFIX} knocked off\n{B_DEF_NAME_WITH_PREFIX}’s {B_LAST_ITEM}!");
+static const u8 sText_PkmnSwappedAbilities[] = _("{B_ATK_NAME_WITH_PREFIX} swapped abilities\nwith its opponent!");
+static const u8 sText_PkmnSealedOpponentMove[] = _("{B_ATK_NAME_WITH_PREFIX} sealed the\nopponent’s move(s)!");
+static const u8 sText_PkmnWantsGrudge[] = _("{B_ATK_NAME_WITH_PREFIX} wants the\nopponent to bear a GRUDGE!");
+static const u8 sText_PkmnLostPPGrudge[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1} lost\nall its PP due to the GRUDGE!");
+static const u8 sText_PkmnShroudedItself[] = _("{B_ATK_NAME_WITH_PREFIX} shrouded\nitself in {B_CURRENT_MOVE}!");
+static const u8 sText_PkmnMoveBounced[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_CURRENT_MOVE}\nwas bounced back by MAGIC COAT!");
+static const u8 sText_PkmnWaitsForTarget[] = _("{B_ATK_NAME_WITH_PREFIX} waits for a target\nto make a move!");
+static const u8 sText_PkmnSnatchedMove[] = _("{B_DEF_NAME_WITH_PREFIX} SNATCHED\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s move!");
+static const u8 sText_ElectricityWeakened[] = _("Electricity’s power was\nweakened!");
+static const u8 sText_FireWeakened[] = _("Fire’s power was\nweakened!");
+static const u8 sText_XFoundOneY[] = _("{B_ATK_NAME_WITH_PREFIX} found\none {B_LAST_ITEM}!");
+static const u8 sText_SoothingAroma[] = _("A soothing aroma wafted\nthrough the area!");
+static const u8 sText_ItemsCantBeUsedNow[] = _("Items can’t be used now.{PAUSE 64}");
+static const u8 sText_ForXCommaYZ[] = _("For {B_SCR_ACTIVE_NAME_WITH_PREFIX},\n{B_LAST_ITEM} {B_BUFF1}");
+static const u8 sText_PkmnUsedXToGetPumped[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used\n{B_LAST_ITEM} to get pumped!");
+static const u8 sText_PkmnLostFocus[] = _("{B_ATK_NAME_WITH_PREFIX} lost its\nfocus and couldn’t move!");
+static const u8 sText_PkmnWasDraggedOut[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndragged out!\p");
+static const u8 sText_TheWallShattered[] = _("The wall shattered!");
+static const u8 sText_ButNoEffect[] = _("But it had no effect!");
+static const u8 sText_PkmnHasNoMovesLeft[] = _("{B_ACTIVE_NAME_WITH_PREFIX} has no\nmoves left!\p");
+static const u8 sText_PkmnMoveIsDisabled[] = _("{B_ACTIVE_NAME_WITH_PREFIX}’s {B_CURRENT_MOVE}\nis disabled!\p");
+static const u8 sText_PkmnCantUseMoveTorment[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use the same\nmove in a row due to the TORMENT!\p");
+static const u8 sText_PkmnCantUseMoveTaunt[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use\n{B_CURRENT_MOVE} after the TAUNT!\p");
+static const u8 sText_PkmnCantUseMoveSealed[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use the\nsealed {B_CURRENT_MOVE}!\p");
+static const u8 sText_PkmnMadeItRain[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade it rain!");
+static const u8 sText_PkmnRaisedSpeed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nraised its SPEED!");
+static const u8 sText_PkmnProtectedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was protected\nby {B_DEF_ABILITY}!");
+static const u8 sText_PkmnPreventsUsage[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents {B_ATK_NAME_WITH_PREFIX}\lfrom using {B_CURRENT_MOVE}!");
+static const u8 sText_PkmnRestoredHPUsing[] = _("{B_DEF_NAME_WITH_PREFIX} restored HP\nusing its {B_DEF_ABILITY}!");
+static const u8 sText_PkmnsXMadeYUseless[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} useless!");
+static const u8 sText_PkmnChangedTypeWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade it the {B_BUFF1} type!");
+static const u8 sText_PkmnPreventsParalysisWith[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents paralysis!");
+static const u8 sText_PkmnPreventsRomanceWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents romance!");
+static const u8 sText_PkmnPreventsPoisoningWith[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents poisoning!");
+static const u8 sText_PkmnPreventsConfusionWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents confusion!");
+static const u8 sText_PkmnRaisedFirePowerWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nraised its FIRE power!");
+static const u8 sText_PkmnAnchorsItselfWith[] = _("{B_DEF_NAME_WITH_PREFIX} anchors\nitself with {B_DEF_ABILITY}!");
+static const u8 sText_PkmnCutsAttackWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncuts {B_DEF_NAME_WITH_PREFIX}’s ATTACK!");
+static const u8 sText_PkmnPreventsStatLossWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nprevents stat loss!");
+static const u8 sText_PkmnHurtsWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nhurt {B_ATK_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnTraced[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} TRACED\n{B_BUFF1}’s {B_BUFF2}!");
+static const u8 sText_PkmnsXPreventsBurns[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_EFF_ABILITY}\nprevents burns!");
+static const u8 sText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nblocks {B_CURRENT_MOVE}!");
+static const u8 sText_PkmnsXBlocksY2[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nblocks {B_CURRENT_MOVE}!");
+static const u8 sText_PkmnsXRestoredHPALittle2[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\nrestored its HP a little!");
+static const u8 sText_PkmnsXWhippedUpSandstorm[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nwhipped up a sandstorm!");
+static const u8 sText_PkmnsXIntensifiedSun[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nintensified the sun’s rays!");
+static const u8 sText_PkmnsXPreventsYLoss[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nprevents {B_BUFF1} loss!");
+static const u8 sText_PkmnsXInfatuatedY[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\ninfatuated {B_ATK_NAME_WITH_PREFIX}!");
+static const u8 sText_PkmnsXMadeYIneffective[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} ineffective!");
+static const u8 sText_PkmnsXCuredYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!");
+static const u8 sText_ItSuckedLiquidOoze[] = _("It sucked up the\nLIQUID OOZE!");
+static const u8 sText_PkmnTransformed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} transformed!");
+static const u8 sText_PkmnsXTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\ntook the attack!");
const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1}’s {B_LAST_ABILITY}\nprevents switching!\p");
-const u8 gText_PreventedFromWorking[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevented {B_SCR_ACTIVE_NAME_WITH_PREFIX}’s\l{B_BUFF1} from working!");
-const u8 gText_PkmnsXMadeItIneffective[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade it ineffective!");
-const u8 gText_PkmnsXPreventsFlinching[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_EFF_ABILITY}\nprevents flinching!");
-const u8 gText_PkmnsXPreventsYsZ[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\nprevents {B_DEF_NAME_WITH_PREFIX}’s\l{B_DEF_ABILITY} from working!");
-const u8 gText_PkmnsXCuredItsYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!");
-const u8 gText_PkmnsXHadNoEffectOnY[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nhad no effect on {B_EFF_NAME_WITH_PREFIX}!");
-const u8 gText_StatSharply[] = _("sharply ");
+static const u8 sText_PreventedFromWorking[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevented {B_SCR_ACTIVE_NAME_WITH_PREFIX}’s\l{B_BUFF1} from working!");
+static const u8 sText_PkmnsXMadeItIneffective[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade it ineffective!");
+static const u8 sText_PkmnsXPreventsFlinching[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_EFF_ABILITY}\nprevents flinching!");
+static const u8 sText_PkmnsXPreventsYsZ[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\nprevents {B_DEF_NAME_WITH_PREFIX}’s\l{B_DEF_ABILITY} from working!");
+static const u8 sText_PkmnsXCuredItsYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!");
+static const u8 sText_PkmnsXHadNoEffectOnY[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nhad no effect on {B_EFF_NAME_WITH_PREFIX}!");
+static const u8 sText_StatSharply[] = _("sharply ");
const u8 gText_StatRose[] = _("rose!");
-const u8 gText_StatHarshly[] = _("harshly ");
-const u8 gText_StatFell[] = _("fell!");
-const u8 gText_PkmnsStatChanged[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
+static const u8 sText_StatHarshly[] = _("harshly ");
+static const u8 sText_StatFell[] = _("fell!");
+static const u8 sText_PkmnsStatChanged[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
const u8 gText_PkmnsStatChanged2[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
-const u8 gText_UsingXTheYOfZN[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}");
-const u8 gText_PkmnsStatChanged3[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
-const u8 gText_PkmnsStatChanged4[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
-const u8 gText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}’s stats won’t\ngo any higher!");
-const u8 gText_StatsWontDecrease2[] = _("{B_DEF_NAME_WITH_PREFIX}’s stats won’t\ngo any lower!");
-const u8 gText_CriticalHit[] = _("A critical hit!");
-const u8 gText_OneHitKO[] = _("It’s a one-hit KO!");
-const u8 gText_123Poof[] = _("{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p");
-const u8 gText_AndEllipsis[] = _("And…\p");
-const u8 gText_HMMovesCantBeForgotten[] = _("HM moves can’t be\nforgotten now.\p");
-const u8 gText_NotVeryEffective[] = _("It’s not very effective…");
-const u8 gText_SuperEffective[] = _("It’s super effective!");
-const u8 gText_GotAwaySafely[] = _("{PLAY_SE 0x0011}Got away safely!\p");
-const u8 gText_PkmnFledUsingIts[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing its {B_LAST_ITEM}!\p");
-const u8 gText_PkmnFledUsing[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing {B_ATK_ABILITY}!\p");
-const u8 gText_WildPkmnFled[] = _("{PLAY_SE 0x0011}Wild {B_BUFF1} fled!");
-const u8 gText_PlayerDefeatedLinkTrainer[] = _("Player defeated\n{B_20}!");
-const u8 gText_TwoLinkTrainersDefeated[] = _("Player beat {B_20}\nand {B_21}!");
-const u8 gText_PlayerLostAgainstLinkTrainer[] = _("Player lost against\n{B_20}!");
-const u8 gText_PlayerLostToTwo[] = _("Player lost to {B_20}\nand {B_21}!");
-const u8 gText_PlayerBattledToDrawLinkTrainer[] = _("Player battled to a draw against\n{B_20}!");
-const u8 gText_PlayerBattledToDrawVsTwo[] = _("Player battled to a draw against\n{B_20} and {B_21}!");
-const u8 gText_WildFled[] = _("{PLAY_SE 0x0011}{B_20} fled!");
-const u8 gText_TwoWildFled[] = _("{PLAY_SE 0x0011}{B_20} and\n{B_21} fled!");
-const u8 gText_NoRunningFromTrainers[] = _("No! There’s no running\nfrom a TRAINER battle!\p");
-const u8 gText_CantEscape[] = _("Can’t escape!\p");
-const u8 gText_DontLeaveBirch[] = _("PROF. BIRCH: Don’t leave me like this!\p");
-const u8 gText_ButNothingHappened[] = _("But nothing happened!");
-const u8 gText_ButItFailed[] = _("But it failed!");
-const u8 gText_ItHurtConfusion[] = _("It hurt itself in its\nconfusion!");
-const u8 gText_MirrorMoveFailed[] = _("The MIRROR MOVE failed!");
-const u8 gText_StartedToRain[] = _("It started to rain!");
-const u8 gText_DownpourStarted[] = _("A downpour started!");
-const u8 gText_RainContinues[] = _("Rain continues to fall.");
-const u8 gText_DownpourContinues[] = _("The downpour continues.");
-const u8 gText_RainStopped[] = _("The rain stopped.");
-const u8 gText_SandstormBrewed[] = _("A sandstorm brewed!");
-const u8 gText_SandstormRages[] = _("The sandstorm rages.");
-const u8 gText_SandstormSubsided[] = _("The sandstorm subsided.");
-const u8 gText_SunlightGotBright[] = _("The sunlight got bright!");
-const u8 gText_SunlightStrong[] = _("The sunlight is strong.");
-const u8 gText_SunlightFaded[] = _("The sunlight faded.");
-const u8 gText_StartedHail[] = _("It started to hail!");
-const u8 gText_HailContinues[] = _("Hail continues to fall.");
-const u8 gText_HailStopped[] = _("The hail stopped.");
-const u8 gText_FailedToSpitUp[] = _("But it failed to SPIT UP\na thing!");
-const u8 gText_FailedToSwallow[] = _("But it failed to SWALLOW\na thing!");
-const u8 gText_WindBecameHeatWave[] = _("The wind turned into a\nHEAT WAVE!");
-const u8 gText_StatChangesGone[] = _("All stat changes were\neliminated!");
-const u8 gText_CoinsScattered[] = _("Coins scattered everywhere!");
-const u8 gText_TooWeakForSubstitute[] = _("It was too weak to make\na SUBSTITUTE!");
-const u8 gText_SharedPain[] = _("The battlers shared\ntheir pain!");
-const u8 gText_BellChimed[] = _("A bell chimed!");
-const u8 gText_FaintInThree[] = _("All affected POKéMON will\nfaint in three turns!");
-const u8 gText_NoPPLeft[] = _("There’s no PP left for\nthis move!\p");
-const u8 gText_ButNoPPLeft[] = _("But there was no PP left\nfor the move!");
-const u8 gText_PkmnIgnoresAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders while asleep!");
-const u8 gText_PkmnIgnoredOrders[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders!");
-const u8 gText_PkmnBeganToNap[] = _("{B_ATK_NAME_WITH_PREFIX} began to nap!");
-const u8 gText_PkmnLoafing[] = _("{B_ATK_NAME_WITH_PREFIX} is\nloafing around!");
-const u8 gText_PkmnWontObey[] = _("{B_ATK_NAME_WITH_PREFIX} won’t\nobey!");
-const u8 gText_PkmnTurnedAway[] = _("{B_ATK_NAME_WITH_PREFIX} turned away!");
-const u8 gText_PkmnPretendNotNotice[] = _("{B_ATK_NAME_WITH_PREFIX} pretended\nnot to notice!");
-const u8 gText_EnemyAboutToSwitchPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} is\nabout to use {B_BUFF2}.\pWill {B_PLAYER_NAME} change\nPOKéMON?");
-const u8 gText_PkmnLearnedMove2[] = _("{B_ATK_NAME_WITH_PREFIX} learned\n{B_BUFF1}!");
-const u8 gText_PlayerDefeatedLinkTrainerTrainer1[] = _("Player defeated\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!\p");
-const u8 gText_CreptCloser[] = _("{B_PLAYER_NAME} crept closer to\n{B_OPPONENT_MON1_NAME}!");
-const u8 gText_CantGetCloser[] = _("{B_PLAYER_NAME} can’t get any closer!");
-const u8 gText_PkmnWatchingCarefully[] = _("{B_OPPONENT_MON1_NAME} is watching\ncarefully!");
-const u8 gText_PkmnCuriousAboutX[] = _("{B_OPPONENT_MON1_NAME} is curious about\nthe {B_BUFF1}!");
-const u8 gText_PkmnEnthralledByX[] = _("{B_OPPONENT_MON1_NAME} is enthralled by\nthe {B_BUFF1}!");
-const u8 gText_PkmnIgnoredX[] = _("{B_OPPONENT_MON1_NAME} completely ignored\nthe {B_BUFF1}!");
-const u8 gText_ThrewPokeblockAtPkmn[] = _("{B_PLAYER_NAME} threw a {POKEBLOCK}\nat the {B_OPPONENT_MON1_NAME}!");
-const u8 gText_OutOfSafariBalls[] = _("{PLAY_SE 0x0049}ANNOUNCER: You’re out of\nSAFARI BALLS! Game over!\p");
-const u8 gText_OpponentMon1Appeared[] = _("{B_OPPONENT_MON1_NAME} appeared!\p");
-const u8 gText_WildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
-const u8 gText_WildPkmnAppeared2[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
-const u8 gText_WildPkmnAppearedPause[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!{PAUSE 127}");
-const u8 gText_TwoWildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} and\n{B_OPPONENT_MON2_NAME} appeared!\p");
-const u8 gText_Trainer1WantsToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwould like to battle!\p");
-const u8 gText_LinkTrainerWantsToBattle[] = _("{B_20}\nwants to battle!");
-const u8 gText_TwoLinkTrainersWantToBattle[] = _("{B_20} and {B_21}\nwant to battle!");
-const u8 gText_Trainer1SentOutPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME}!");
-const u8 gText_Trainer1SentOutTwoPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!");
-const u8 gText_Trainer1SentOutPkmn2[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_BUFF1}!");
-const u8 gText_LinkTrainerSentOutPkmn[] = _("{B_20} sent out\n{B_OPPONENT_MON1_NAME}!");
-const u8 gText_LinkTrainerSentOutTwoPkmn[] = _("{B_20} sent out\n{B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!");
-const u8 gText_TwoLinkTrainersSentOutPkmn[] = _("{B_20} sent out {B_LINK_OPPONENT_MON1_NAME}!\n{B_21} sent out {B_LINK_OPPONENT_MON2_NAME}!");
-const u8 gText_LinkTrainerSentOutPkmn2[] = _("{B_20} sent out\n{B_BUFF1}!");
-const u8 gText_LinkTrainerMultiSentOutPkmn[] = _("{B_22} sent out\n{B_BUFF1}!");
-const u8 gText_GoPkmn[] = _("Go! {B_PLAYER_MON1_NAME}!");
-const u8 gText_GoTwoPkmn[] = _("Go! {B_PLAYER_MON1_NAME} and\n{B_PLAYER_MON2_NAME}!");
-const u8 gText_GoPkmn2[] = _("Go! {B_BUFF1}!");
-const u8 gText_DoItPkmn[] = _("Do it! {B_BUFF1}!");
-const u8 gText_GoForItPkmn[] = _("Go for it, {B_BUFF1}!");
-const u8 gText_YourFoesWeakGetEmPkmn[] = _("Your foe’s weak!\nGet ’em, {B_BUFF1}!");
-const u8 gText_LinkPartnerSentOutPkmnGoPkmn[] = _("{B_1F} sent out {B_LINK_PLAYER_MON2_NAME}!\nGo! {B_LINK_PLAYER_MON1_NAME}!");
-const u8 gText_PkmnThatsEnough[] = _("{B_BUFF1}, that’s enough!\nCome back!");
-const u8 gText_PkmnComeBack[] = _("{B_BUFF1}, come back!");
-const u8 gText_PkmnOkComeBack[] = _("{B_BUFF1}, OK!\nCome back!");
-const u8 gText_PkmnGoodComeBack[] = _("{B_BUFF1}, good!\nCome back!");
-const u8 gText_Trainer1WithdrewPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwithdrew {B_BUFF1}!");
-const u8 gText_LinkTrainer1WithdrewPkmn[] = _("{B_20} withdrew\n{B_BUFF1}!");
-const u8 gText_LinkTrainer2WithdrewPkmn[] = _("{B_22} withdrew\n{B_BUFF1}!");
-const u8 gText_WildPkmnPrefix[] = _("Wild ");
-const u8 gText_FoePkmnPrefix[] = _("Foe ");
-const u8 gText_EmptyString8[] = _( "");
-const u8 gText_FoePkmnPrefix2[] = _("Foe");
-const u8 gText_AllyPkmnPrefix[] = _("Ally");
-const u8 gText_FoePkmnPrefix3[] = _("Foe");
-const u8 gText_AllyPkmnPrefix2[] = _("Ally");
-const u8 gText_FoePkmnPrefix4[] = _("Foe");
-const u8 gText_AllyPkmnPrefix3[] = _("Ally");
-const u8 gText_AttackerUsedX[] = _("{B_ATK_NAME_WITH_PREFIX} used\n{B_BUFF2}");
-const u8 gText_ExclamationMark[] = _("!");
-const u8 gText_ExclamationMark2[] = _("!");
-const u8 gText_ExclamationMark3[] = _("!");
-const u8 gText_ExclamationMark4[] = _("!");
-const u8 gText_ExclamationMark5[] = _("!");
-const u8 gText_HP2[] = _("HP");
-const u8 gText_Attack2[] = _("ATTACK");
-const u8 gText_Defense2[] = _("DEFENSE");
-const u8 gText_Speed[] = _("SPEED");
-const u8 gText_SpAtk2[] = _("SP. ATK");
-const u8 gText_SpDef2[] = _("SP. DEF");
-const u8 gText_Accuracy[] = _("accuracy");
-const u8 gText_Evasiveness[] = _("evasiveness");
+static const u8 sText_UsingXTheYOfZN[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}");
+static const u8 sText_PkmnsStatChanged3[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
+static const u8 sText_PkmnsStatChanged4[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
+static const u8 sText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}’s stats won’t\ngo any higher!");
+static const u8 sText_StatsWontDecrease2[] = _("{B_DEF_NAME_WITH_PREFIX}’s stats won’t\ngo any lower!");
+static const u8 sText_CriticalHit[] = _("A critical hit!");
+static const u8 sText_OneHitKO[] = _("It’s a one-hit KO!");
+static const u8 sText_123Poof[] = _("{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p");
+static const u8 sText_AndEllipsis[] = _("And…\p");
+static const u8 sText_HMMovesCantBeForgotten[] = _("HM moves can’t be\nforgotten now.\p");
+static const u8 sText_NotVeryEffective[] = _("It’s not very effective…");
+static const u8 sText_SuperEffective[] = _("It’s super effective!");
+static const u8 sText_GotAwaySafely[] = _("{PLAY_SE 0x0011}Got away safely!\p");
+static const u8 sText_PkmnFledUsingIts[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing its {B_LAST_ITEM}!\p");
+static const u8 sText_PkmnFledUsing[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing {B_ATK_ABILITY}!\p");
+static const u8 sText_WildPkmnFled[] = _("{PLAY_SE 0x0011}Wild {B_BUFF1} fled!");
+static const u8 sText_PlayerDefeatedLinkTrainer[] = _("Player defeated\n{B_20}!");
+static const u8 sText_TwoLinkTrainersDefeated[] = _("Player beat {B_20}\nand {B_21}!");
+static const u8 sText_PlayerLostAgainstLinkTrainer[] = _("Player lost against\n{B_20}!");
+static const u8 sText_PlayerLostToTwo[] = _("Player lost to {B_20}\nand {B_21}!");
+static const u8 sText_PlayerBattledToDrawLinkTrainer[] = _("Player battled to a draw against\n{B_20}!");
+static const u8 sText_PlayerBattledToDrawVsTwo[] = _("Player battled to a draw against\n{B_20} and {B_21}!");
+static const u8 sText_WildFled[] = _("{PLAY_SE 0x0011}{B_20} fled!");
+static const u8 sText_TwoWildFled[] = _("{PLAY_SE 0x0011}{B_20} and\n{B_21} fled!");
+static const u8 sText_NoRunningFromTrainers[] = _("No! There’s no running\nfrom a TRAINER battle!\p");
+static const u8 sText_CantEscape[] = _("Can’t escape!\p");
+static const u8 sText_DontLeaveBirch[] = _("PROF. BIRCH: Don’t leave me like this!\p");
+static const u8 sText_ButNothingHappened[] = _("But nothing happened!");
+static const u8 sText_ButItFailed[] = _("But it failed!");
+static const u8 sText_ItHurtConfusion[] = _("It hurt itself in its\nconfusion!");
+static const u8 sText_MirrorMoveFailed[] = _("The MIRROR MOVE failed!");
+static const u8 sText_StartedToRain[] = _("It started to rain!");
+static const u8 sText_DownpourStarted[] = _("A downpour started!");
+static const u8 sText_RainContinues[] = _("Rain continues to fall.");
+static const u8 sText_DownpourContinues[] = _("The downpour continues.");
+static const u8 sText_RainStopped[] = _("The rain stopped.");
+static const u8 sText_SandstormBrewed[] = _("A sandstorm brewed!");
+static const u8 sText_SandstormRages[] = _("The sandstorm rages.");
+static const u8 sText_SandstormSubsided[] = _("The sandstorm subsided.");
+static const u8 sText_SunlightGotBright[] = _("The sunlight got bright!");
+static const u8 sText_SunlightStrong[] = _("The sunlight is strong.");
+static const u8 sText_SunlightFaded[] = _("The sunlight faded.");
+static const u8 sText_StartedHail[] = _("It started to hail!");
+static const u8 sText_HailContinues[] = _("Hail continues to fall.");
+static const u8 sText_HailStopped[] = _("The hail stopped.");
+static const u8 sText_FailedToSpitUp[] = _("But it failed to SPIT UP\na thing!");
+static const u8 sText_FailedToSwallow[] = _("But it failed to SWALLOW\na thing!");
+static const u8 sText_WindBecameHeatWave[] = _("The wind turned into a\nHEAT WAVE!");
+static const u8 sText_StatChangesGone[] = _("All stat changes were\neliminated!");
+static const u8 sText_CoinsScattered[] = _("Coins scattered everywhere!");
+static const u8 sText_TooWeakForSubstitute[] = _("It was too weak to make\na SUBSTITUTE!");
+static const u8 sText_SharedPain[] = _("The battlers shared\ntheir pain!");
+static const u8 sText_BellChimed[] = _("A bell chimed!");
+static const u8 sText_FaintInThree[] = _("All affected POKéMON will\nfaint in three turns!");
+static const u8 sText_NoPPLeft[] = _("There’s no PP left for\nthis move!\p");
+static const u8 sText_ButNoPPLeft[] = _("But there was no PP left\nfor the move!");
+static const u8 sText_PkmnIgnoresAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders while asleep!");
+static const u8 sText_PkmnIgnoredOrders[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders!");
+static const u8 sText_PkmnBeganToNap[] = _("{B_ATK_NAME_WITH_PREFIX} began to nap!");
+static const u8 sText_PkmnLoafing[] = _("{B_ATK_NAME_WITH_PREFIX} is\nloafing around!");
+static const u8 sText_PkmnWontObey[] = _("{B_ATK_NAME_WITH_PREFIX} won’t\nobey!");
+static const u8 sText_PkmnTurnedAway[] = _("{B_ATK_NAME_WITH_PREFIX} turned away!");
+static const u8 sText_PkmnPretendNotNotice[] = _("{B_ATK_NAME_WITH_PREFIX} pretended\nnot to notice!");
+static const u8 sText_EnemyAboutToSwitchPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} is\nabout to use {B_BUFF2}.\pWill {B_PLAYER_NAME} change\nPOKéMON?");
+static const u8 sText_PkmnLearnedMove2[] = _("{B_ATK_NAME_WITH_PREFIX} learned\n{B_BUFF1}!");
+static const u8 sText_PlayerDefeatedLinkTrainerTrainer1[] = _("Player defeated\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!\p");
+static const u8 sText_CreptCloser[] = _("{B_PLAYER_NAME} crept closer to\n{B_OPPONENT_MON1_NAME}!");
+static const u8 sText_CantGetCloser[] = _("{B_PLAYER_NAME} can’t get any closer!");
+static const u8 sText_PkmnWatchingCarefully[] = _("{B_OPPONENT_MON1_NAME} is watching\ncarefully!");
+static const u8 sText_PkmnCuriousAboutX[] = _("{B_OPPONENT_MON1_NAME} is curious about\nthe {B_BUFF1}!");
+static const u8 sText_PkmnEnthralledByX[] = _("{B_OPPONENT_MON1_NAME} is enthralled by\nthe {B_BUFF1}!");
+static const u8 sText_PkmnIgnoredX[] = _("{B_OPPONENT_MON1_NAME} completely ignored\nthe {B_BUFF1}!");
+static const u8 sText_ThrewPokeblockAtPkmn[] = _("{B_PLAYER_NAME} threw a {POKEBLOCK}\nat the {B_OPPONENT_MON1_NAME}!");
+static const u8 sText_OutOfSafariBalls[] = _("{PLAY_SE 0x0049}ANNOUNCER: You’re out of\nSAFARI BALLS! Game over!\p");
+static const u8 sText_OpponentMon1Appeared[] = _("{B_OPPONENT_MON1_NAME} appeared!\p");
+static const u8 sText_WildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
+static const u8 sText_WildPkmnAppeared2[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
+static const u8 sText_WildPkmnAppearedPause[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!{PAUSE 127}");
+static const u8 sText_TwoWildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} and\n{B_OPPONENT_MON2_NAME} appeared!\p");
+static const u8 sText_Trainer1WantsToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwould like to battle!\p");
+static const u8 sText_LinkTrainerWantsToBattle[] = _("{B_20}\nwants to battle!");
+static const u8 sText_TwoLinkTrainersWantToBattle[] = _("{B_20} and {B_21}\nwant to battle!");
+static const u8 sText_Trainer1SentOutPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME}!");
+static const u8 sText_Trainer1SentOutTwoPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!");
+static const u8 sText_Trainer1SentOutPkmn2[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_BUFF1}!");
+static const u8 sText_LinkTrainerSentOutPkmn[] = _("{B_20} sent out\n{B_OPPONENT_MON1_NAME}!");
+static const u8 sText_LinkTrainerSentOutTwoPkmn[] = _("{B_20} sent out\n{B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!");
+static const u8 sText_TwoLinkTrainersSentOutPkmn[] = _("{B_20} sent out {B_LINK_OPPONENT_MON1_NAME}!\n{B_21} sent out {B_LINK_OPPONENT_MON2_NAME}!");
+static const u8 sText_LinkTrainerSentOutPkmn2[] = _("{B_20} sent out\n{B_BUFF1}!");
+static const u8 sText_LinkTrainerMultiSentOutPkmn[] = _("{B_22} sent out\n{B_BUFF1}!");
+static const u8 sText_GoPkmn[] = _("Go! {B_PLAYER_MON1_NAME}!");
+static const u8 sText_GoTwoPkmn[] = _("Go! {B_PLAYER_MON1_NAME} and\n{B_PLAYER_MON2_NAME}!");
+static const u8 sText_GoPkmn2[] = _("Go! {B_BUFF1}!");
+static const u8 sText_DoItPkmn[] = _("Do it! {B_BUFF1}!");
+static const u8 sText_GoForItPkmn[] = _("Go for it, {B_BUFF1}!");
+static const u8 sText_YourFoesWeakGetEmPkmn[] = _("Your foe’s weak!\nGet ’em, {B_BUFF1}!");
+static const u8 sText_LinkPartnerSentOutPkmnGoPkmn[] = _("{B_1F} sent out {B_LINK_PLAYER_MON2_NAME}!\nGo! {B_LINK_PLAYER_MON1_NAME}!");
+static const u8 sText_PkmnThatsEnough[] = _("{B_BUFF1}, that’s enough!\nCome back!");
+static const u8 sText_PkmnComeBack[] = _("{B_BUFF1}, come back!");
+static const u8 sText_PkmnOkComeBack[] = _("{B_BUFF1}, OK!\nCome back!");
+static const u8 sText_PkmnGoodComeBack[] = _("{B_BUFF1}, good!\nCome back!");
+static const u8 sText_Trainer1WithdrewPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwithdrew {B_BUFF1}!");
+static const u8 sText_LinkTrainer1WithdrewPkmn[] = _("{B_20} withdrew\n{B_BUFF1}!");
+static const u8 sText_LinkTrainer2WithdrewPkmn[] = _("{B_22} withdrew\n{B_BUFF1}!");
+static const u8 sText_WildPkmnPrefix[] = _("Wild ");
+static const u8 sText_FoePkmnPrefix[] = _("Foe ");
+static const u8 sText_EmptyString8[] = _( "");
+static const u8 sText_FoePkmnPrefix2[] = _("Foe");
+static const u8 sText_AllyPkmnPrefix[] = _("Ally");
+static const u8 sText_FoePkmnPrefix3[] = _("Foe");
+static const u8 sText_AllyPkmnPrefix2[] = _("Ally");
+static const u8 sText_FoePkmnPrefix4[] = _("Foe");
+static const u8 sText_AllyPkmnPrefix3[] = _("Ally");
+static const u8 sText_AttackerUsedX[] = _("{B_ATK_NAME_WITH_PREFIX} used\n{B_BUFF2}");
+static const u8 sText_ExclamationMark[] = _("!");
+static const u8 sText_ExclamationMark2[] = _("!");
+static const u8 sText_ExclamationMark3[] = _("!");
+static const u8 sText_ExclamationMark4[] = _("!");
+static const u8 sText_ExclamationMark5[] = _("!");
+static const u8 sText_HP2[] = _("HP");
+static const u8 sText_Attack2[] = _("ATTACK");
+static const u8 sText_Defense2[] = _("DEFENSE");
+static const u8 sText_Speed[] = _("SPEED");
+static const u8 sText_SpAtk2[] = _("SP. ATK");
+static const u8 sText_SpDef2[] = _("SP. DEF");
+static const u8 sText_Accuracy[] = _("accuracy");
+static const u8 sText_Evasiveness[] = _("evasiveness");
const u8 * const gStatNamesTable[] =
{
- gText_HP2, gText_Attack2, gText_Defense2,
- gText_Speed, gText_SpAtk2, gText_SpDef2,
- gText_Accuracy, gText_Evasiveness
+ sText_HP2, sText_Attack2, sText_Defense2,
+ sText_Speed, sText_SpAtk2, sText_SpDef2,
+ sText_Accuracy, sText_Evasiveness
};
-const u8 gText_PokeblockWasTooSpicy[] = _("was too spicy!");
-const u8 gText_PokeblockWasTooDry[] = _("was too dry!");
-const u8 gText_PokeblockWasTooSweet[] = _("was too sweet!");
-const u8 gText_PokeblockWasTooBitter[] = _("was too bitter!");
-const u8 gText_PokeblockWasTooSour[] = _("was too sour!");
+static const u8 sText_PokeblockWasTooSpicy[] = _("was too spicy!");
+static const u8 sText_PokeblockWasTooDry[] = _("was too dry!");
+static const u8 sText_PokeblockWasTooSweet[] = _("was too sweet!");
+static const u8 sText_PokeblockWasTooBitter[] = _("was too bitter!");
+static const u8 sText_PokeblockWasTooSour[] = _("was too sour!");
const u8 * const gPokeblockWasTooXStringTable[] =
{
- gText_PokeblockWasTooSpicy, gText_PokeblockWasTooDry,
- gText_PokeblockWasTooSweet, gText_PokeblockWasTooBitter,
- gText_PokeblockWasTooSour
+ sText_PokeblockWasTooSpicy, sText_PokeblockWasTooDry,
+ sText_PokeblockWasTooSweet, sText_PokeblockWasTooBitter,
+ sText_PokeblockWasTooSour
};
-const u8 gText_PlayerUsedItem[] = _("{B_PLAYER_NAME} used\n{B_LAST_ITEM}!");
-const u8 gText_WallyUsedItem[] = _("WALLY used\n{B_LAST_ITEM}!");
-const u8 gText_Trainer1UsedItem[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nused {B_LAST_ITEM}!");
-const u8 gText_TrainerBlockedBall[] = _("The TRAINER blocked the BALL!");
-const u8 gText_DontBeAThief[] = _("Don’t be a thief!");
-const u8 gText_ItDodgedBall[] = _("It dodged the thrown BALL!\nThis POKéMON can’t be caught!");
-const u8 gText_YouMissedPkmn[] = _("You missed the POKéMON!");
-const u8 gText_PkmnBrokeFree[] = _("Oh, no!\nThe POKéMON broke free!");
-const u8 gText_ItAppearedCaught[] = _("Aww!\nIt appeared to be caught!");
-const u8 gText_AarghAlmostHadIt[] = _("Aargh!\nAlmost had it!");
-const u8 gText_ShootSoClose[] = _("Shoot!\nIt was so close, too!");
-const u8 gText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}\p");
-const u8 gText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}{PAUSE 127}");
-const u8 gText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_OPPONENT_MON1_NAME}?");
-const u8 gText_PkmnSentToPC[] = _("{B_OPPONENT_MON1_NAME} was sent to\n{B_PC_CREATOR_NAME} PC.");
-const u8 gText_Someones[] = _("someone’s");
-const u8 gText_Lanettes[] = _("LANETTE’s");
-const u8 gText_PkmnDataAddedToDex[] = _("{B_OPPONENT_MON1_NAME}’s data was\nadded to the POKéDEX.\p");
-const u8 gText_ItIsRaining[] = _("It is raining.");
-const u8 gText_SandstormIsRaging[] = _("A sandstorm is raging.");
-const u8 gText_BoxIsFull[] = _("The BOX is full!\nYou can’t catch any more!\p");
-const u8 gText_EnigmaBerry[] = _("ENIGMA BERRY");
-const u8 gText_BerrySuffix[] = _(" BERRY");
-const u8 gText_PkmnsItemCuredParalysis[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured paralysis!");
-const u8 gText_PkmnsItemCuredPoison[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured poison!");
-const u8 gText_PkmnsItemHealedBurn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nhealed its burn!");
-const u8 gText_PkmnsItemDefrostedIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ndefrosted it!");
-const u8 gText_PkmnsItemWokeIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nwoke it from its sleep!");
-const u8 gText_PkmnsItemSnappedOut[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nsnapped it out of confusion!");
-const u8 gText_PkmnsItemCuredProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured its {B_BUFF1} problem!");
-const u8 gText_PkmnsItemNormalizedStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nnormalized its status!");
-const u8 gText_PkmnsItemRestoredHealth[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored health!");
-const u8 gText_PkmnsItemRestoredPP[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored {B_BUFF1}’s PP!");
-const u8 gText_PkmnsItemRestoredStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored its status!");
-const u8 gText_PkmnsItemRestoredHPALittle[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored its HP a little!");
-const u8 gText_ItemAllowsOnlyYMove[] = _("{B_LAST_ITEM} allows the\nuse of only {B_CURRENT_MOVE}!\p");
-const u8 gText_PkmnHungOnWithX[] = _("{B_DEF_NAME_WITH_PREFIX} hung on\nusing its {B_LAST_ITEM}!");
+static const u8 sText_PlayerUsedItem[] = _("{B_PLAYER_NAME} used\n{B_LAST_ITEM}!");
+static const u8 sText_WallyUsedItem[] = _("WALLY used\n{B_LAST_ITEM}!");
+static const u8 sText_Trainer1UsedItem[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nused {B_LAST_ITEM}!");
+static const u8 sText_TrainerBlockedBall[] = _("The TRAINER blocked the BALL!");
+static const u8 sText_DontBeAThief[] = _("Don’t be a thief!");
+static const u8 sText_ItDodgedBall[] = _("It dodged the thrown BALL!\nThis POKéMON can’t be caught!");
+static const u8 sText_YouMissedPkmn[] = _("You missed the POKéMON!");
+static const u8 sText_PkmnBrokeFree[] = _("Oh, no!\nThe POKéMON broke free!");
+static const u8 sText_ItAppearedCaught[] = _("Aww!\nIt appeared to be caught!");
+static const u8 sText_AarghAlmostHadIt[] = _("Aargh!\nAlmost had it!");
+static const u8 sText_ShootSoClose[] = _("Shoot!\nIt was so close, too!");
+static const u8 sText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}\p");
+static const u8 sText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}{PAUSE 127}");
+static const u8 sText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_OPPONENT_MON1_NAME}?");
+static const u8 sText_PkmnSentToPC[] = _("{B_OPPONENT_MON1_NAME} was sent to\n{B_PC_CREATOR_NAME} PC.");
+static const u8 sText_Someones[] = _("someone’s");
+static const u8 sText_Lanettes[] = _("LANETTE’s");
+static const u8 sText_PkmnDataAddedToDex[] = _("{B_OPPONENT_MON1_NAME}’s data was\nadded to the POKéDEX.\p");
+static const u8 sText_ItIsRaining[] = _("It is raining.");
+static const u8 sText_SandstormIsRaging[] = _("A sandstorm is raging.");
+static const u8 sText_BoxIsFull[] = _("The BOX is full!\nYou can’t catch any more!\p");
+static const u8 sText_EnigmaBerry[] = _("ENIGMA BERRY");
+static const u8 sText_BerrySuffix[] = _(" BERRY");
+static const u8 sText_PkmnsItemCuredParalysis[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured paralysis!");
+static const u8 sText_PkmnsItemCuredPoison[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured poison!");
+static const u8 sText_PkmnsItemHealedBurn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nhealed its burn!");
+static const u8 sText_PkmnsItemDefrostedIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ndefrosted it!");
+static const u8 sText_PkmnsItemWokeIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nwoke it from its sleep!");
+static const u8 sText_PkmnsItemSnappedOut[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nsnapped it out of confusion!");
+static const u8 sText_PkmnsItemCuredProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured its {B_BUFF1} problem!");
+static const u8 sText_PkmnsItemNormalizedStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nnormalized its status!");
+static const u8 sText_PkmnsItemRestoredHealth[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored health!");
+static const u8 sText_PkmnsItemRestoredPP[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored {B_BUFF1}’s PP!");
+static const u8 sText_PkmnsItemRestoredStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored its status!");
+static const u8 sText_PkmnsItemRestoredHPALittle[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored its HP a little!");
+static const u8 sText_ItemAllowsOnlyYMove[] = _("{B_LAST_ITEM} allows the\nuse of only {B_CURRENT_MOVE}!\p");
+static const u8 sText_PkmnHungOnWithX[] = _("{B_DEF_NAME_WITH_PREFIX} hung on\nusing its {B_LAST_ITEM}!");
const u8 gText_EmptyString3[] = _("");
-const u8 gText_YouThrowABallNowRight[] = _("You throw a BALL now, right?\nI… I’ll do my best!");
+static const u8 sText_YouThrowABallNowRight[] = _("You throw a BALL now, right?\nI… I’ll do my best!");
// early declaration of strings
-const u8 gText_PkmnIncapableOfPower[];
-const u8 gText_GlintAppearsInEye[];
-const u8 gText_PkmnGettingIntoPosition[];
-const u8 gText_PkmnBeganGrowlingDeeply[];
-const u8 gText_PkmnEagerForMore[];
-const u8 gText_DefeatedOpponentByReferee[];
-const u8 gText_LostToOpponentByReferee[];
-const u8 gText_TiedOpponentByReferee[];
-const u8 gText_QuestionForfeitMatch[];
-const u8 gText_ForfeitedMatch[];
-const u8 gText_Trainer1WinText[];
-const u8 gText_Trainer2WinText[];
-const u8 gText_TwoInGameTrainersDefeated[];
-const u8 gText_Trainer2LoseText[];
+static const u8 sText_PkmnIncapableOfPower[];
+static const u8 sText_GlintAppearsInEye[];
+static const u8 sText_PkmnGettingIntoPosition[];
+static const u8 sText_PkmnBeganGrowlingDeeply[];
+static const u8 sText_PkmnEagerForMore[];
+static const u8 sText_DefeatedOpponentByReferee[];
+static const u8 sText_LostToOpponentByReferee[];
+static const u8 sText_TiedOpponentByReferee[];
+static const u8 sText_QuestionForfeitMatch[];
+static const u8 sText_ForfeitedMatch[];
+static const u8 sText_Trainer1WinText[];
+static const u8 sText_Trainer2WinText[];
+static const u8 sText_TwoInGameTrainersDefeated[];
+static const u8 sText_Trainer2LoseText[];
const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] =
{
- gText_Trainer1LoseText,
- gText_PkmnGainedEXP,
- gText_PkmnGrewToLv,
- gText_PkmnLearnedMove,
- gText_TryToLearnMove1,
- gText_TryToLearnMove2,
- gText_TryToLearnMove3,
- gText_PkmnForgotMove,
- gText_StopLearningMove,
- gText_DidNotLearnMove,
- gText_PkmnLearnedMove2,
- gText_AttackMissed,
- gText_PkmnProtectedItself,
- gText_StatsWontIncrease2,
- gText_AvoidedDamage,
- gText_ItDoesntAffect,
- gText_AttackerFainted,
- gText_TargetFainted,
- gText_PlayerGotMoney,
- gText_PlayerWhiteout,
- gText_PlayerWhiteout2,
- gText_PreventsEscape,
- gText_HitXTimes,
- gText_PkmnFellAsleep,
- gText_PkmnMadeSleep,
- gText_PkmnAlreadyAsleep,
- gText_PkmnAlreadyAsleep2,
- gText_PkmnWasntAffected,
- gText_PkmnWasPoisoned,
- gText_PkmnPoisonedBy,
- gText_PkmnHurtByPoison,
- gText_PkmnAlreadyPoisoned,
- gText_PkmnBadlyPoisoned,
- gText_PkmnEnergyDrained,
- gText_PkmnWasBurned,
- gText_PkmnBurnedBy,
- gText_PkmnHurtByBurn,
- gText_PkmnWasFrozen,
- gText_PkmnFrozenBy,
- gText_PkmnIsFrozen,
- gText_PkmnWasDefrosted,
- gText_PkmnWasDefrosted2,
- gText_PkmnWasDefrostedBy,
- gText_PkmnWasParalyzed,
- gText_PkmnWasParalyzedBy,
- gText_PkmnIsParalyzed,
- gText_PkmnIsAlreadyParalyzed,
- gText_PkmnHealedParalysis,
- gText_PkmnDreamEaten,
- gText_StatsWontIncrease,
- gText_StatsWontDecrease,
- gText_TeamStoppedWorking,
- gText_FoeStoppedWorking,
- gText_PkmnIsConfused,
- gText_PkmnHealedConfusion,
- gText_PkmnWasConfused,
- gText_PkmnAlreadyConfused,
- gText_PkmnFellInLove,
- gText_PkmnInLove,
- gText_PkmnImmobilizedByLove,
- gText_PkmnBlownAway,
- gText_PkmnChangedType,
- gText_PkmnFlinched,
- gText_PkmnRegainedHealth,
- gText_PkmnHPFull,
- gText_PkmnRaisedSpDef,
- gText_PkmnRaisedDef,
- gText_PkmnCoveredByVeil,
- gText_PkmnUsedSafeguard,
- gText_PkmnSafeguardExpired,
- gText_PkmnWentToSleep,
- gText_PkmnSleptHealthy,
- gText_PkmnWhippedWhirlwind,
- gText_PkmnTookSunlight,
- gText_PkmnLoweredHead,
- gText_PkmnIsGlowing,
- gText_PkmnFlewHigh,
- gText_PkmnDugHole,
- gText_PkmnSqueezedByBind,
- gText_PkmnTrappedInVortex,
- gText_PkmnWrappedBy,
- gText_PkmnClamped,
- gText_PkmnHurtBy,
- gText_PkmnFreedFrom,
- gText_PkmnCrashed,
- gText_PkmnShroudedInMist,
- gText_PkmnProtectedByMist,
- gText_PkmnGettingPumped,
- gText_PkmnHitWithRecoil,
- gText_PkmnProtectedItself2,
- gText_PkmnBuffetedBySandstorm,
- gText_PkmnPeltedByHail,
- gText_PkmnSeeded,
- gText_PkmnEvadedAttack,
- gText_PkmnSappedByLeechSeed,
- gText_PkmnFastAsleep,
- gText_PkmnWokeUp,
- gText_PkmnUproarKeptAwake,
- gText_PkmnWokeUpInUproar,
- gText_PkmnCausedUproar,
- gText_PkmnMakingUproar,
- gText_PkmnCalmedDown,
- gText_PkmnCantSleepInUproar,
- gText_PkmnStockpiled,
- gText_PkmnCantStockpile,
- gText_PkmnCantSleepInUproar2,
- gText_UproarKeptPkmnAwake,
- gText_PkmnStayedAwakeUsing,
- gText_PkmnStoringEnergy,
- gText_PkmnUnleashedEnergy,
- gText_PkmnFatigueConfusion,
- gText_PkmnPickedUpItem,
- gText_PkmnUnaffected,
- gText_PkmnTransformedInto,
- gText_PkmnMadeSubstitute,
- gText_PkmnHasSubstitute,
- gText_SubstituteDamaged,
- gText_PkmnSubstituteFaded,
- gText_PkmnMustRecharge,
- gText_PkmnRageBuilding,
- gText_PkmnMoveWasDisabled,
- gText_PkmnMoveIsDisabled,
- gText_PkmnMoveDisabledNoMore,
- gText_PkmnGotEncore,
- gText_PkmnEncoreEnded,
- gText_PkmnTookAim,
- gText_PkmnSketchedMove,
- gText_PkmnTryingToTakeFoe,
- gText_PkmnTookFoe,
- gText_PkmnReducedPP,
- gText_PkmnStoleItem,
- gText_TargetCantEscapeNow,
- gText_PkmnFellIntoNightmare,
- gText_PkmnLockedInNightmare,
- gText_PkmnLaidCurse,
- gText_PkmnAfflictedByCurse,
- gText_SpikesScattered,
- gText_PkmnHurtBySpikes,
- gText_PkmnIdentified,
- gText_PkmnPerishCountFell,
- gText_PkmnBracedItself,
- gText_PkmnEnduredHit,
- gText_MagnitudeStrength,
- gText_PkmnCutHPMaxedAttack,
- gText_PkmnCopiedStatChanges,
- gText_PkmnGotFree,
- gText_PkmnShedLeechSeed,
- gText_PkmnBlewAwaySpikes,
- gText_PkmnFledFromBattle,
- gText_PkmnForesawAttack,
- gText_PkmnTookAttack,
- gText_PkmnAttack,
- gText_PkmnCenterAttention,
- gText_PkmnChargingPower,
- gText_NaturePowerTurnedInto,
- gText_PkmnStatusNormal,
- gText_PkmnHasNoMovesLeft,
- gText_PkmnSubjectedToTorment,
- gText_PkmnCantUseMoveTorment,
- gText_PkmnTighteningFocus,
- gText_PkmnFellForTaunt,
- gText_PkmnCantUseMoveTaunt,
- gText_PkmnReadyToHelp,
- gText_PkmnSwitchedItems,
- gText_PkmnCopiedFoe,
- gText_PkmnMadeWish,
- gText_PkmnWishCameTrue,
- gText_PkmnPlantedRoots,
- gText_PkmnAbsorbedNutrients,
- gText_PkmnAnchoredItself,
- gText_PkmnWasMadeDrowsy,
- gText_PkmnKnockedOff,
- gText_PkmnSwappedAbilities,
- gText_PkmnSealedOpponentMove,
- gText_PkmnCantUseMoveSealed,
- gText_PkmnWantsGrudge,
- gText_PkmnLostPPGrudge,
- gText_PkmnShroudedItself,
- gText_PkmnMoveBounced,
- gText_PkmnWaitsForTarget,
- gText_PkmnSnatchedMove,
- gText_PkmnMadeItRain,
- gText_PkmnRaisedSpeed,
- gText_PkmnProtectedBy,
- gText_PkmnPreventsUsage,
- gText_PkmnRestoredHPUsing,
- gText_PkmnChangedTypeWith,
- gText_PkmnPreventsParalysisWith,
- gText_PkmnPreventsRomanceWith,
- gText_PkmnPreventsPoisoningWith,
- gText_PkmnPreventsConfusionWith,
- gText_PkmnRaisedFirePowerWith,
- gText_PkmnAnchorsItselfWith,
- gText_PkmnCutsAttackWith,
- gText_PkmnPreventsStatLossWith,
- gText_PkmnHurtsWith,
- gText_PkmnTraced,
- gText_StatSharply,
- gText_StatRose,
- gText_StatHarshly,
- gText_StatFell,
- gText_PkmnsStatChanged,
- gText_PkmnsStatChanged2,
- gText_PkmnsStatChanged3,
- gText_PkmnsStatChanged4,
- gText_CriticalHit,
- gText_OneHitKO,
- gText_123Poof,
- gText_AndEllipsis,
- gText_NotVeryEffective,
- gText_SuperEffective,
- gText_GotAwaySafely,
- gText_WildPkmnFled,
- gText_NoRunningFromTrainers,
- gText_CantEscape,
- gText_DontLeaveBirch,
- gText_ButNothingHappened,
- gText_ButItFailed,
- gText_ItHurtConfusion,
- gText_MirrorMoveFailed,
- gText_StartedToRain,
- gText_DownpourStarted,
- gText_RainContinues,
- gText_DownpourContinues,
- gText_RainStopped,
- gText_SandstormBrewed,
- gText_SandstormRages,
- gText_SandstormSubsided,
- gText_SunlightGotBright,
- gText_SunlightStrong,
- gText_SunlightFaded,
- gText_StartedHail,
- gText_HailContinues,
- gText_HailStopped,
- gText_FailedToSpitUp,
- gText_FailedToSwallow,
- gText_WindBecameHeatWave,
- gText_StatChangesGone,
- gText_CoinsScattered,
- gText_TooWeakForSubstitute,
- gText_SharedPain,
- gText_BellChimed,
- gText_FaintInThree,
- gText_NoPPLeft,
- gText_ButNoPPLeft,
- gText_PlayerUsedItem,
- gText_WallyUsedItem,
- gText_TrainerBlockedBall,
- gText_DontBeAThief,
- gText_ItDodgedBall,
- gText_YouMissedPkmn,
- gText_PkmnBrokeFree,
- gText_ItAppearedCaught,
- gText_AarghAlmostHadIt,
- gText_ShootSoClose,
- gText_GotchaPkmnCaught,
- gText_GotchaPkmnCaught2,
- gText_GiveNicknameCaptured,
- gText_PkmnSentToPC,
- gText_PkmnDataAddedToDex,
- gText_ItIsRaining,
- gText_SandstormIsRaging,
- gText_CantEscape2,
- gText_PkmnIgnoresAsleep,
- gText_PkmnIgnoredOrders,
- gText_PkmnBeganToNap,
- gText_PkmnLoafing,
- gText_PkmnWontObey,
- gText_PkmnTurnedAway,
- gText_PkmnPretendNotNotice,
- gText_EnemyAboutToSwitchPkmn,
- gText_CreptCloser,
- gText_CantGetCloser,
- gText_PkmnWatchingCarefully,
- gText_PkmnCuriousAboutX,
- gText_PkmnEnthralledByX,
- gText_PkmnIgnoredX,
- gText_ThrewPokeblockAtPkmn,
- gText_OutOfSafariBalls,
- gText_PkmnsItemCuredParalysis,
- gText_PkmnsItemCuredPoison,
- gText_PkmnsItemHealedBurn,
- gText_PkmnsItemDefrostedIt,
- gText_PkmnsItemWokeIt,
- gText_PkmnsItemSnappedOut,
- gText_PkmnsItemCuredProblem,
- gText_PkmnsItemRestoredHealth,
- gText_PkmnsItemRestoredPP,
- gText_PkmnsItemRestoredStatus,
- gText_PkmnsItemRestoredHPALittle,
- gText_ItemAllowsOnlyYMove,
- gText_PkmnHungOnWithX,
- gText_EmptyString3,
- gText_PkmnsXPreventsBurns,
- gText_PkmnsXBlocksY,
- gText_PkmnsXRestoredHPALittle2,
- gText_PkmnsXWhippedUpSandstorm,
- gText_PkmnsXPreventsYLoss,
- gText_PkmnsXInfatuatedY,
- gText_PkmnsXMadeYIneffective,
- gText_PkmnsXCuredYProblem,
- gText_ItSuckedLiquidOoze,
- gText_PkmnTransformed,
- gText_ElectricityWeakened,
- gText_FireWeakened,
- gText_PkmnHidUnderwater,
- gText_PkmnSprangUp,
- gText_HMMovesCantBeForgotten,
- gText_XFoundOneY,
- gText_PlayerDefeatedLinkTrainerTrainer1,
- gText_SoothingAroma,
- gText_ItemsCantBeUsedNow,
- gText_ForXCommaYZ,
- gText_UsingXTheYOfZN,
- gText_PkmnUsedXToGetPumped,
- gText_PkmnsXMadeYUseless,
- gText_PkmnTrappedBySandTomb,
- gText_EmptyString4,
- gText_ABoosted,
- gText_PkmnsXIntensifiedSun,
- gText_PkmnMakesGroundMiss,
- gText_YouThrowABallNowRight,
- gText_PkmnsXTookAttack,
- gText_PkmnChoseXAsDestiny,
- gText_PkmnLostFocus,
- gText_UseNextPkmn,
- gText_PkmnFledUsingIts,
- gText_PkmnFledUsing,
- gText_PkmnWasDraggedOut,
- gText_PreventedFromWorking,
- gText_PkmnsItemNormalizedStatus,
- gText_Trainer1UsedItem,
- gText_BoxIsFull,
- gText_PkmnAvoidedAttack,
- gText_PkmnsXMadeItIneffective,
- gText_PkmnsXPreventsFlinching,
- gText_PkmnAlreadyHasBurn,
- gText_StatsWontDecrease2,
- gText_PkmnsXBlocksY2,
- gText_PkmnsXWoreOff,
- gText_PkmnRaisedDefALittle,
- gText_PkmnRaisedSpDefALittle,
- gText_TheWallShattered,
- gText_PkmnsXPreventsYsZ,
- gText_PkmnsXCuredItsYProblem,
- gText_AttackerCantEscape,
- gText_PkmnObtainedX,
- gText_PkmnObtainedX2,
- gText_PkmnObtainedXYObtainedZ,
- gText_ButNoEffect,
- gText_PkmnsXHadNoEffectOnY,
- gText_TwoInGameTrainersDefeated,
- gText_Trainer2LoseText,
- gText_PkmnIncapableOfPower,
- gText_GlintAppearsInEye,
- gText_PkmnGettingIntoPosition,
- gText_PkmnBeganGrowlingDeeply,
- gText_PkmnEagerForMore,
- gText_DefeatedOpponentByReferee,
- gText_LostToOpponentByReferee,
- gText_TiedOpponentByReferee,
- gText_QuestionForfeitMatch,
- gText_ForfeitedMatch,
- gText_PkmnTransferredSomeonesPC,
- gText_PkmnTransferredLanettesPC,
- gText_PkmnBoxSomeonesPCFull,
- gText_PkmnBoxLanettesPCFull,
- gText_Trainer1WinText,
- gText_Trainer2WinText,
+ sText_Trainer1LoseText, // 12
+ sText_PkmnGainedEXP, // 13
+ sText_PkmnGrewToLv, // 14
+ sText_PkmnLearnedMove, // 15
+ sText_TryToLearnMove1, // 16
+ sText_TryToLearnMove2, // 17
+ sText_TryToLearnMove3, // 18
+ sText_PkmnForgotMove, // 19
+ sText_StopLearningMove, // 20
+ sText_DidNotLearnMove, // 21
+ sText_PkmnLearnedMove2, // 22
+ sText_AttackMissed, // 23
+ sText_PkmnProtectedItself, // 24
+ sText_StatsWontIncrease2, // 25
+ sText_AvoidedDamage, // 26
+ sText_ItDoesntAffect, // 27
+ sText_AttackerFainted, // 28
+ sText_TargetFainted, // 29
+ sText_PlayerGotMoney, // 30
+ sText_PlayerWhiteout, // 31
+ sText_PlayerWhiteout2, // 32
+ sText_PreventsEscape, // 33
+ sText_HitXTimes, // 34
+ sText_PkmnFellAsleep, // 35
+ sText_PkmnMadeSleep, // 36
+ sText_PkmnAlreadyAsleep, // 37
+ sText_PkmnAlreadyAsleep2, // 38
+ sText_PkmnWasntAffected, // 39
+ sText_PkmnWasPoisoned, // 40
+ sText_PkmnPoisonedBy, // 41
+ sText_PkmnHurtByPoison, // 42
+ sText_PkmnAlreadyPoisoned, // 43
+ sText_PkmnBadlyPoisoned, // 44
+ sText_PkmnEnergyDrained, // 45
+ sText_PkmnWasBurned, // 46
+ sText_PkmnBurnedBy, // 47
+ sText_PkmnHurtByBurn, // 48
+ sText_PkmnWasFrozen, // 49
+ sText_PkmnFrozenBy, // 50
+ sText_PkmnIsFrozen, // 51
+ sText_PkmnWasDefrosted, // 52
+ sText_PkmnWasDefrosted2, // 53
+ sText_PkmnWasDefrostedBy, // 54
+ sText_PkmnWasParalyzed, // 55
+ sText_PkmnWasParalyzedBy, // 56
+ sText_PkmnIsParalyzed, // 57
+ sText_PkmnIsAlreadyParalyzed, // 58
+ sText_PkmnHealedParalysis, // 59
+ sText_PkmnDreamEaten, // 60
+ sText_StatsWontIncrease, // 61
+ sText_StatsWontDecrease, // 62
+ sText_TeamStoppedWorking, // 63
+ sText_FoeStoppedWorking, // 64
+ sText_PkmnIsConfused, // 65
+ sText_PkmnHealedConfusion, // 66
+ sText_PkmnWasConfused, // 67
+ sText_PkmnAlreadyConfused, // 68
+ sText_PkmnFellInLove, // 69
+ sText_PkmnInLove, // 70
+ sText_PkmnImmobilizedByLove, // 71
+ sText_PkmnBlownAway, // 72
+ sText_PkmnChangedType, // 73
+ sText_PkmnFlinched, // 74
+ sText_PkmnRegainedHealth, // 75
+ sText_PkmnHPFull, // 76
+ sText_PkmnRaisedSpDef, // 77
+ sText_PkmnRaisedDef, // 78
+ sText_PkmnCoveredByVeil, // 79
+ sText_PkmnUsedSafeguard, // 80
+ sText_PkmnSafeguardExpired, // 81
+ sText_PkmnWentToSleep, // 82
+ sText_PkmnSleptHealthy, // 83
+ sText_PkmnWhippedWhirlwind, // 84
+ sText_PkmnTookSunlight, // 85
+ sText_PkmnLoweredHead, // 86
+ sText_PkmnIsGlowing, // 87
+ sText_PkmnFlewHigh, // 88
+ sText_PkmnDugHole, // 89
+ sText_PkmnSqueezedByBind, // 90
+ sText_PkmnTrappedInVortex, // 91
+ sText_PkmnWrappedBy, // 92
+ sText_PkmnClamped, // 93
+ sText_PkmnHurtBy, // 94
+ sText_PkmnFreedFrom, // 95
+ sText_PkmnCrashed, // 96
+ gText_PkmnShroudedInMist, // 97
+ sText_PkmnProtectedByMist, // 98
+ gText_PkmnGettingPumped, // 99
+ sText_PkmnHitWithRecoil, // 100
+ sText_PkmnProtectedItself2, // 101
+ sText_PkmnBuffetedBySandstorm, // 102
+ sText_PkmnPeltedByHail, // 103
+ sText_PkmnSeeded, // 104
+ sText_PkmnEvadedAttack, // 105
+ sText_PkmnSappedByLeechSeed, // 106
+ sText_PkmnFastAsleep, // 107
+ sText_PkmnWokeUp, // 108
+ sText_PkmnUproarKeptAwake, // 109
+ sText_PkmnWokeUpInUproar, // 110
+ sText_PkmnCausedUproar, // 111
+ sText_PkmnMakingUproar, // 112
+ sText_PkmnCalmedDown, // 113
+ sText_PkmnCantSleepInUproar, // 114
+ sText_PkmnStockpiled, // 115
+ sText_PkmnCantStockpile, // 116
+ sText_PkmnCantSleepInUproar2, // 117
+ sText_UproarKeptPkmnAwake, // 118
+ sText_PkmnStayedAwakeUsing, // 119
+ sText_PkmnStoringEnergy, // 120
+ sText_PkmnUnleashedEnergy, // 121
+ sText_PkmnFatigueConfusion, // 122
+ sText_PkmnPickedUpItem, // 123
+ sText_PkmnUnaffected, // 124
+ sText_PkmnTransformedInto, // 125
+ sText_PkmnMadeSubstitute, // 126
+ sText_PkmnHasSubstitute, // 127
+ sText_SubstituteDamaged, // 128
+ sText_PkmnSubstituteFaded, // 129
+ sText_PkmnMustRecharge, // 130
+ sText_PkmnRageBuilding, // 131
+ sText_PkmnMoveWasDisabled, // 132
+ sText_PkmnMoveIsDisabled, // 133
+ sText_PkmnMoveDisabledNoMore, // 134
+ sText_PkmnGotEncore, // 135
+ sText_PkmnEncoreEnded, // 136
+ sText_PkmnTookAim, // 137
+ sText_PkmnSketchedMove, // 138
+ sText_PkmnTryingToTakeFoe, // 139
+ sText_PkmnTookFoe, // 140
+ sText_PkmnReducedPP, // 141
+ sText_PkmnStoleItem, // 142
+ sText_TargetCantEscapeNow, // 143
+ sText_PkmnFellIntoNightmare, // 144
+ sText_PkmnLockedInNightmare, // 145
+ sText_PkmnLaidCurse, // 146
+ sText_PkmnAfflictedByCurse, // 147
+ sText_SpikesScattered, // 148
+ sText_PkmnHurtBySpikes, // 149
+ sText_PkmnIdentified, // 150
+ sText_PkmnPerishCountFell, // 151
+ sText_PkmnBracedItself, // 152
+ sText_PkmnEnduredHit, // 153
+ sText_MagnitudeStrength, // 154
+ sText_PkmnCutHPMaxedAttack, // 155
+ sText_PkmnCopiedStatChanges, // 156
+ sText_PkmnGotFree, // 157
+ sText_PkmnShedLeechSeed, // 158
+ sText_PkmnBlewAwaySpikes, // 159
+ sText_PkmnFledFromBattle, // 160
+ sText_PkmnForesawAttack, // 161
+ sText_PkmnTookAttack, // 162
+ sText_PkmnAttack, // 163
+ sText_PkmnCenterAttention, // 164
+ sText_PkmnChargingPower, // 165
+ sText_NaturePowerTurnedInto, // 166
+ sText_PkmnStatusNormal, // 167
+ sText_PkmnHasNoMovesLeft, // 168
+ sText_PkmnSubjectedToTorment, // 169
+ sText_PkmnCantUseMoveTorment, // 170
+ sText_PkmnTighteningFocus, // 171
+ sText_PkmnFellForTaunt, // 172
+ sText_PkmnCantUseMoveTaunt, // 173
+ sText_PkmnReadyToHelp, // 174
+ sText_PkmnSwitchedItems, // 175
+ sText_PkmnCopiedFoe, // 176
+ sText_PkmnMadeWish, // 177
+ sText_PkmnWishCameTrue, // 178
+ sText_PkmnPlantedRoots, // 179
+ sText_PkmnAbsorbedNutrients, // 180
+ sText_PkmnAnchoredItself, // 181
+ sText_PkmnWasMadeDrowsy, // 182
+ sText_PkmnKnockedOff, // 183
+ sText_PkmnSwappedAbilities, // 184
+ sText_PkmnSealedOpponentMove, // 185
+ sText_PkmnCantUseMoveSealed, // 186
+ sText_PkmnWantsGrudge, // 187
+ sText_PkmnLostPPGrudge, // 188
+ sText_PkmnShroudedItself, // 189
+ sText_PkmnMoveBounced, // 190
+ sText_PkmnWaitsForTarget, // 191
+ sText_PkmnSnatchedMove, // 192
+ sText_PkmnMadeItRain, // 193
+ sText_PkmnRaisedSpeed, // 194
+ sText_PkmnProtectedBy, // 195
+ sText_PkmnPreventsUsage, // 196
+ sText_PkmnRestoredHPUsing, // 197
+ sText_PkmnChangedTypeWith, // 198
+ sText_PkmnPreventsParalysisWith, // 199
+ sText_PkmnPreventsRomanceWith, // 200
+ sText_PkmnPreventsPoisoningWith, // 201
+ sText_PkmnPreventsConfusionWith, // 202
+ sText_PkmnRaisedFirePowerWith, // 203
+ sText_PkmnAnchorsItselfWith, // 204
+ sText_PkmnCutsAttackWith, // 205
+ sText_PkmnPreventsStatLossWith, // 206
+ sText_PkmnHurtsWith, // 207
+ sText_PkmnTraced, // 208
+ sText_StatSharply, // 209
+ gText_StatRose, // 210
+ sText_StatHarshly, // 211
+ sText_StatFell, // 212
+ sText_PkmnsStatChanged, // 213
+ gText_PkmnsStatChanged2, // 214
+ sText_PkmnsStatChanged3, // 215
+ sText_PkmnsStatChanged4, // 216
+ sText_CriticalHit, // 217
+ sText_OneHitKO, // 218
+ sText_123Poof, // 219
+ sText_AndEllipsis, // 220
+ sText_NotVeryEffective, // 221
+ sText_SuperEffective, // 222
+ sText_GotAwaySafely, // 223
+ sText_WildPkmnFled, // 224
+ sText_NoRunningFromTrainers, // 225
+ sText_CantEscape, // 226
+ sText_DontLeaveBirch, // 227
+ sText_ButNothingHappened, // 228
+ sText_ButItFailed, // 229
+ sText_ItHurtConfusion, // 230
+ sText_MirrorMoveFailed, // 231
+ sText_StartedToRain, // 232
+ sText_DownpourStarted, // 233
+ sText_RainContinues, // 234
+ sText_DownpourContinues, // 235
+ sText_RainStopped, // 236
+ sText_SandstormBrewed, // 237
+ sText_SandstormRages, // 238
+ sText_SandstormSubsided, // 239
+ sText_SunlightGotBright, // 240
+ sText_SunlightStrong, // 241
+ sText_SunlightFaded, // 242
+ sText_StartedHail, // 243
+ sText_HailContinues, // 244
+ sText_HailStopped, // 245
+ sText_FailedToSpitUp, // 246
+ sText_FailedToSwallow, // 247
+ sText_WindBecameHeatWave, // 248
+ sText_StatChangesGone, // 249
+ sText_CoinsScattered, // 250
+ sText_TooWeakForSubstitute, // 251
+ sText_SharedPain, // 252
+ sText_BellChimed, // 253
+ sText_FaintInThree, // 254
+ sText_NoPPLeft, // 255
+ sText_ButNoPPLeft, // 256
+ sText_PlayerUsedItem, // 257
+ sText_WallyUsedItem, // 258
+ sText_TrainerBlockedBall, // 259
+ sText_DontBeAThief, // 260
+ sText_ItDodgedBall, // 261
+ sText_YouMissedPkmn, // 262
+ sText_PkmnBrokeFree, // 263
+ sText_ItAppearedCaught, // 264
+ sText_AarghAlmostHadIt, // 265
+ sText_ShootSoClose, // 266
+ sText_GotchaPkmnCaught, // 267
+ sText_GotchaPkmnCaught2, // 268
+ sText_GiveNicknameCaptured, // 269
+ sText_PkmnSentToPC, // 270
+ sText_PkmnDataAddedToDex, // 271
+ sText_ItIsRaining, // 272
+ sText_SandstormIsRaging, // 273
+ sText_CantEscape2, // 274
+ sText_PkmnIgnoresAsleep, // 275
+ sText_PkmnIgnoredOrders, // 276
+ sText_PkmnBeganToNap, // 277
+ sText_PkmnLoafing, // 278
+ sText_PkmnWontObey, // 279
+ sText_PkmnTurnedAway, // 280
+ sText_PkmnPretendNotNotice, // 281
+ sText_EnemyAboutToSwitchPkmn, // 282
+ sText_CreptCloser, // 283
+ sText_CantGetCloser, // 284
+ sText_PkmnWatchingCarefully, // 285
+ sText_PkmnCuriousAboutX, // 286
+ sText_PkmnEnthralledByX, // 287
+ sText_PkmnIgnoredX, // 288
+ sText_ThrewPokeblockAtPkmn, // 289
+ sText_OutOfSafariBalls, // 290
+ sText_PkmnsItemCuredParalysis, // 291
+ sText_PkmnsItemCuredPoison, // 292
+ sText_PkmnsItemHealedBurn, // 293
+ sText_PkmnsItemDefrostedIt, // 294
+ sText_PkmnsItemWokeIt, // 295
+ sText_PkmnsItemSnappedOut, // 296
+ sText_PkmnsItemCuredProblem, // 297
+ sText_PkmnsItemRestoredHealth, // 298
+ sText_PkmnsItemRestoredPP, // 299
+ sText_PkmnsItemRestoredStatus, // 300
+ sText_PkmnsItemRestoredHPALittle, // 301
+ sText_ItemAllowsOnlyYMove, // 302
+ sText_PkmnHungOnWithX, // 303
+ gText_EmptyString3, // 304
+ sText_PkmnsXPreventsBurns, // 305
+ sText_PkmnsXBlocksY, // 306
+ sText_PkmnsXRestoredHPALittle2, // 307
+ sText_PkmnsXWhippedUpSandstorm, // 308
+ sText_PkmnsXPreventsYLoss, // 309
+ sText_PkmnsXInfatuatedY, // 310
+ sText_PkmnsXMadeYIneffective, // 311
+ sText_PkmnsXCuredYProblem, // 312
+ sText_ItSuckedLiquidOoze, // 313
+ sText_PkmnTransformed, // 314
+ sText_ElectricityWeakened, // 315
+ sText_FireWeakened, // 316
+ sText_PkmnHidUnderwater, // 317
+ sText_PkmnSprangUp, // 318
+ sText_HMMovesCantBeForgotten, // 319
+ sText_XFoundOneY, // 320
+ sText_PlayerDefeatedLinkTrainerTrainer1, // 321
+ sText_SoothingAroma, // 322
+ sText_ItemsCantBeUsedNow, // 323
+ sText_ForXCommaYZ, // 324
+ sText_UsingXTheYOfZN, // 325
+ sText_PkmnUsedXToGetPumped, // 326
+ sText_PkmnsXMadeYUseless, // 327
+ sText_PkmnTrappedBySandTomb, // 328
+ sText_EmptyString4, // 329
+ sText_ABoosted, // 330
+ sText_PkmnsXIntensifiedSun, // 331
+ sText_PkmnMakesGroundMiss, // 332
+ sText_YouThrowABallNowRight, // 333
+ sText_PkmnsXTookAttack, // 334
+ sText_PkmnChoseXAsDestiny, // 335
+ sText_PkmnLostFocus, // 336
+ sText_UseNextPkmn, // 337
+ sText_PkmnFledUsingIts, // 338
+ sText_PkmnFledUsing, // 339
+ sText_PkmnWasDraggedOut, // 340
+ sText_PreventedFromWorking, // 341
+ sText_PkmnsItemNormalizedStatus, // 342
+ sText_Trainer1UsedItem, // 343
+ sText_BoxIsFull, // 344
+ sText_PkmnAvoidedAttack, // 345
+ sText_PkmnsXMadeItIneffective, // 346
+ sText_PkmnsXPreventsFlinching, // 347
+ sText_PkmnAlreadyHasBurn, // 348
+ sText_StatsWontDecrease2, // 349
+ sText_PkmnsXBlocksY2, // 350
+ sText_PkmnsXWoreOff, // 351
+ sText_PkmnRaisedDefALittle, // 352
+ sText_PkmnRaisedSpDefALittle, // 353
+ sText_TheWallShattered, // 354
+ sText_PkmnsXPreventsYsZ, // 355
+ sText_PkmnsXCuredItsYProblem, // 356
+ sText_AttackerCantEscape, // 357
+ sText_PkmnObtainedX, // 358
+ sText_PkmnObtainedX2, // 359
+ sText_PkmnObtainedXYObtainedZ, // 360
+ sText_ButNoEffect, // 361
+ sText_PkmnsXHadNoEffectOnY, // 362
+ sText_TwoInGameTrainersDefeated, // 363
+ sText_Trainer2LoseText, // 364
+ sText_PkmnIncapableOfPower, // 365
+ sText_GlintAppearsInEye, // 366
+ sText_PkmnGettingIntoPosition, // 367
+ sText_PkmnBeganGrowlingDeeply, // 368
+ sText_PkmnEagerForMore, // 369
+ sText_DefeatedOpponentByReferee, // 370
+ sText_LostToOpponentByReferee, // 371
+ sText_TiedOpponentByReferee, // 372
+ sText_QuestionForfeitMatch, // 373
+ sText_ForfeitedMatch, // 374
+ gText_PkmnTransferredSomeonesPC, // 375
+ gText_PkmnTransferredLanettesPC, // 376
+ gText_PkmnBoxSomeonesPCFull, // 377
+ gText_PkmnBoxLanettesPCFull, // 378
+ sText_Trainer1WinText, // 379
+ sText_Trainer2WinText, // 380
};
const u16 gMissStringIds[] =
@@ -932,58 +924,237 @@ const u16 gSandStormHailDmgStringIds[] =
STRINGID_PKMNBUFFETEDBYSANDSTORM, STRINGID_PKMNPELTEDBYHAIL
};
-// todo once battlescripts are dumped
-const u16 gTooLazyToSplitThemStringIds[] =
+const u16 gSandStormHailEndStringIds[] =
+{
+ STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED
+};
+
+const u16 gRainContinuesStringIds[] =
+{
+ STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES, STRINGID_RAINSTOPPED
+};
+
+const u16 gProtectLikeUsedStringIds[] =
{
- STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED, STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES,
- STRINGID_RAINSTOPPED, STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF,
- STRINGID_BUTITFAILED, STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF,
- STRINGID_PKMNRAISEDDEFALITTLE, STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE,
- STRINGID_PKMNCOVEREDBYVEIL, STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK,
+ STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED
+};
+
+const u16 gReflectLightScreenSafeguardStringIds[] =
+{
+ STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF, STRINGID_PKMNRAISEDDEFALITTLE,
+ STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE, STRINGID_PKMNCOVEREDBYVEIL
+};
+
+const u16 gLeechSeedStringIds[] =
+{
+ STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK,
STRINGID_ITDOESNTAFFECT, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_ITSUCKEDLIQUIDOOZE,
- STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY, STRINGID_PKMNMAKINGUPROAR,
- STRINGID_PKMNCALMEDDOWN, STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE,
- STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR, STRINGID_FAILEDTOSWALLOW,
- STRINGID_PKMNHPFULL, STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE,
- STRINGID_PKMNSTAYEDAWAKEUSING, STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2,
- STRINGID_STATSWONTINCREASE, STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN,
- STRINGID_PKMNUSEDXTOGETPUMPED, STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4,
- STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3, STRINGID_PKMNWHIPPEDWHIRLWIND,
- STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING,
- STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER,
- STRINGID_PKMNSPRANGUP, STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY,
- STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX,
- STRINGID_PKMNTRAPPEDBYSANDTOMB, STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED,
- STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED, STRINGID_PKMNTRANSFORMEDINTO,
- STRINGID_BUTITFAILED, STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE,
- STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY, STRINGID_PKMNWASPARALYZED,
- STRINGID_PKMNWASPARALYZEDBY, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP,
- STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY, STRINGID_PKMNWASFROZEN,
- STRINGID_PKMNFROZENBY, STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY,
- STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED, STRINGID_PKMNFELLINLOVE,
- STRINGID_PKMNSXINFATUATEDY, STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE,
- STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED, STRINGID_BELLCHIMED,
- STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED,
- STRINGID_SOOTHINGAROMA, STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY,
- STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT,
- STRINGID_SHOOTSOCLOSE, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
+};
+
+const u16 gRestUsedStringIds[] =
+{
+ STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY
+};
+
+const u16 gUproarOverTurnStringIds[] =
+{
+ STRINGID_PKMNMAKINGUPROAR, STRINGID_PKMNCALMEDDOWN
+};
+
+const u16 gStockpileUsedStringIds[] =
+{
+ STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE,
+};
+
+const u16 gWokeUpStringIds[] =
+{
+ STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR
+};
+
+const u16 gSwallowFailStringIds[] =
+{
+ STRINGID_FAILEDTOSWALLOW, STRINGID_PKMNHPFULL
+};
+
+const u16 gUproarAwakeStringIds[] =
+{
+ STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE, STRINGID_PKMNSTAYEDAWAKEUSING
+};
+
+const u16 gStatUpStringIds[] =
+{
+ STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2, STRINGID_STATSWONTINCREASE,
+ STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN, STRINGID_PKMNUSEDXTOGETPUMPED
+};
+
+const u16 gStatDownStringIds[] =
+{
+ STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4, STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3
+};
+
+const u16 gFirstTurnOfTwoStringIds[] =
+{
+ STRINGID_PKMNWHIPPEDWHIRLWIND, STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING,
+ STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP
+};
+
+const u16 gWrappedStringIds[] =
+{
+ STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY, STRINGID_PKMNTRAPPEDINVORTEX,
+ STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNTRAPPEDBYSANDTOMB
+};
+
+const u16 gMistUsedStringIds[] =
+{
+ STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED
+};
+
+const u16 gFocusEnergyUsedStringIds[] =
+{
+ STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED
+};
+
+const u16 gTransformUsedStringIds[] =
+{
+ STRINGID_PKMNTRANSFORMEDINTO, STRINGID_BUTITFAILED
+};
+
+const u16 gSubsituteUsedStringIds[] =
+{
+ STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE
+};
+
+const u16 gGotPoisonedStringIds[] =
+{
+ STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY
+};
+
+const u16 gGotParalyzedStringIds[] =
+{
+ STRINGID_PKMNWASPARALYZED, STRINGID_PKMNWASPARALYZEDBY
+};
+
+const u16 gFellAsleepStringIds[] =
+{
+ STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP,
+};
+
+const u16 gGotBurnedStringIds[] =
+{
+ STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY
+};
+
+const u16 gGotFrozenStringIds[] =
+{
+ STRINGID_PKMNWASFROZEN, STRINGID_PKMNFROZENBY
+};
+
+const u16 gGotDefrostedStringIds[] =
+{
+ STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY
+};
+
+const u16 gKOFailedStringIds[] =
+{
+ STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED
+};
+
+const u16 gAttractUsedStringIds[] =
+{
+ STRINGID_PKMNFELLINLOVE, STRINGID_PKMNSXINFATUATEDY
+};
+
+const u16 gLeechSeedDrainStringIds[] =
+{
+ STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE
+};
+
+const u16 gSportsUsedStringIds[] =
+{
+ STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED
+};
+
+const u16 gPartyStatusHealStringIds[] =
+{
+ STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED,
+ // interesting how there are four instances of the same string
+ STRINGID_SOOTHINGAROMA
+};
+
+const u16 gFutureMoveUsedStringIds[] =
+{
+ STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY
+};
+
+const u16 gBallEscapeStringIds[] =
+{
+ STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT, STRINGID_SHOOTSOCLOSE
+};
+
+const u16 gWeatherContinuesStringIds[] =
+{
+ STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
+ STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_SANDSTORMISRAGING,
STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
- STRINGID_SANDSTORMISRAGING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
- STRINGID_ITISRAINING, STRINGID_SUNLIGHTSTRONG, STRINGID_ITISRAINING,
- STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_PKMNLOAFING,
- STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY, STRINGID_PKMNPRETENDNOTNOTICE,
- STRINGID_PKMNINCAPABLEOFPOWER, STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER,
- STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX,
+ STRINGID_SUNLIGHTSTRONG, STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING
+};
+
+const u16 gInobedientStringIds[] =
+{
+ STRINGID_PKMNLOAFING, STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY,
+ STRINGID_PKMNPRETENDNOTNOTICE, STRINGID_PKMNINCAPABLEOFPOWER
+};
+
+const u16 gSafariGetNearStringIds[] =
+{
+ STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER
+};
+
+const u16 gSafariPokeblockResultStringIds[] =
+{
+ STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX
+};
+
+const u16 gTrainerItemCuredStatusStringIds[] =
+{
STRINGID_PKMNSITEMSNAPPEDOUT, STRINGID_PKMNSITEMCUREDPARALYSIS, STRINGID_PKMNSITEMDEFROSTEDIT,
- STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT,
- STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS, STRINGID_PKMNSXPREVENTSBURNS,
- STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPARALYSISWITH,
- STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPOISONINGWITH,
- STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNOBTAINEDX,
- STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ, STRINGID_PKMNRAISEDFIREPOWERWITH,
- STRINGID_PKMNSXMADEYINEFFECTIVE, STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC,
- STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL,
+ STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT
+};
+
+const u16 gBerryEffectStringIds[] =
+{
+ STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS
+};
+
+const u16 gBRNPreventionStringIds[] =
+{
+ STRINGID_PKMNSXPREVENTSBURNS, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY
+};
+
+const u16 gPRLZPreventionStringIds[] =
+{
+ STRINGID_PKMNPREVENTSPARALYSISWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY
+};
+
+const u16 gPSNPreventionStringIds[] =
+{
+ STRINGID_PKMNPREVENTSPOISONINGWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY
+};
+
+const u16 gItemSwapStringIds[] =
+{
+ STRINGID_PKMNOBTAINEDX, STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ
+};
+
+const u16 gFlashFireStringIds[] =
+{
+ STRINGID_PKMNRAISEDFIREPOWERWITH, STRINGID_PKMNSXMADEYINEFFECTIVE
+};
+
+const u16 gCaughtMonStringIds[] =
+{
+ STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC, STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL,
};
const u16 gTrappingMoves[] =
@@ -1013,20 +1184,27 @@ const u8 gText_BattleSwitchWhich3[] = _("{UP_ARROW}");
const u8 gText_BattleSwitchWhich4[] = _("{ESCAPE 4}");
const u8 gText_BattleSwitchWhich5[] = _("-");
-const u8 gText_HP[] = _("HP");
-const u8 gText_Attack[] = _("ATTACK");
-const u8 gText_Defense[] = _("DEFENSE");
-const u8 gText_SpAtk[] = _("SP. ATK");
-const u8 gText_SpDef[] = _("SP. DEF");
+static const u8 sText_HP[] = _("HP");
+static const u8 sText_Attack[] = _("ATTACK");
+static const u8 sText_Defense[] = _("DEFENSE");
+static const u8 sText_SpAtk[] = _("SP. ATK");
+static const u8 sText_SpDef[] = _("SP. DEF");
const u8 * const gStatNamesTable2[] =
{
- gText_HP, gText_SpAtk, gText_Attack,
- gText_SpDef, gText_Defense, gText_Speed
+ sText_HP, sText_SpAtk, sText_Attack,
+ sText_SpDef, sText_Defense, sText_Speed
};
const u8 gText_SafariBalls[] = _("{HIGHLIGHT DARK_GREY}SAFARI BALLS");
-const u8 gText_SafariBallLeft[] = _("{HIGHLIGHT DARK_GREY}Left: $" "{HIGHLIGHT DARK_GREY}");const u8 gText_Sleep[] = _( "sleep");const u8 gText_Poison[] = _( "poison");const u8 gText_Burn[] = _( "burn");const u8 gText_Paralysis[] = _( "paralysis");const u8 gText_Ice[] = _( "ice");const u8 gText_Confusion[] = _( "confusion");const u8 gText_Love[] = _( "love");
+const u8 gText_SafariBallLeft[] = _("{HIGHLIGHT DARK_GREY}Left: $" "{HIGHLIGHT DARK_GREY}");
+const u8 gText_Sleep[] = _("sleep");
+const u8 gText_Poison[] = _("poison");
+const u8 gText_Burn[] = _("burn");
+const u8 gText_Paralysis[] = _("paralysis");
+const u8 gText_Ice[] = _("ice");
+const u8 gText_Confusion[] = _("confusion");
+const u8 gText_Love[] = _("love");
const u8 gText_SpaceAndSpace[] = _(" and ");
const u8 gText_CommaSpace[] = _(", ");
const u8 gText_Space2[] = _(" ");
@@ -1039,10 +1217,10 @@ const u8 gText_BattleWallyName[] = _("WALLY");
const u8 gText_Win[] = _("{HIGHLIGHT TRANSPARENT}Win");
const u8 gText_Loss[] = _("{HIGHLIGHT TRANSPARENT}Loss");
const u8 gText_Draw[] = _("{HIGHLIGHT TRANSPARENT}Draw");
-const u8 gText_SpaceIs[] = _(" is");
-const u8 gText_ApostropheS[] = _("’s");
+static const u8 sText_SpaceIs[] = _(" is");
+static const u8 sText_ApostropheS[] = _("’s");
-const u8 gText_UnknownMoveTypes[][17] =
+static const u8 sATypeMove_Table[][17] =
{
_("a NORMAL move"),
_("a FIGHTING move"),
@@ -1065,17 +1243,17 @@ const u8 gText_UnknownMoveTypes[][17] =
};
const u8 gText_BattleTourney[] = _("BATTLE TOURNEY");
-const u8 gText_Round1[] = _("Round 1");
-const u8 gText_Round2[] = _("Round 2");
-const u8 gText_Semifinal[] = _("Semifinal");
-const u8 gText_Final[] = _("Final");
+static const u8 sText_Round1[] = _("Round 1");
+static const u8 sText_Round2[] = _("Round 2");
+static const u8 sText_Semifinal[] = _("Semifinal");
+static const u8 sText_Final[] = _("Final");
const u8 * const gRoundsStringTable[] =
{
- gText_Round1,
- gText_Round2,
- gText_Semifinal,
- gText_Final
+ sText_Round1,
+ sText_Round2,
+ sText_Semifinal,
+ sText_Final
};
const u8 gText_TheGreatNewHope[] = _("The great new hope!\p");
@@ -1090,62 +1268,65 @@ const u8 gText_Mind[] = _("Mind");
const u8 gText_Skill[] = _("Skill");
const u8 gText_Body[] = _("Body");
const u8 gText_Judgement[] = _("{B_BUFF1}{CLEAR 13}Judgment{CLEAR 13}{B_BUFF2}");
-const u8 gText_TwoTrainersSentPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME}!\p{B_TRAINER2_CLASS} {B_TRAINER2_NAME} sent\nout {B_OPPONENT_MON2_NAME}!");
-const u8 gText_Trainer2SentOutPkmn[] = _("{B_TRAINER2_CLASS} {B_TRAINER2_NAME} sent\nout {B_BUFF1}!");
-const u8 gText_TwoTrainersWantToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} and\n{B_TRAINER2_CLASS} {B_TRAINER2_NAME}\lwant to battle!\p");
-const u8 gText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_CLASS} {B_PARTNER_NAME} sent\nout {B_PLAYER_MON2_NAME}!\lGo, {B_PLAYER_MON1_NAME}!");
-const u8 gText_TwoInGameTrainersDefeated[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} and\n{B_TRAINER2_CLASS} {B_TRAINER2_NAME}\lwere defeated!\p");
-const u8 gText_Trainer2LoseText[] = _("{B_TRAINER2_LOSE_TEXT}");
-const u8 gText_PkmnIncapableOfPower[] = _("{B_ATK_NAME_WITH_PREFIX} appears incapable\nof using its power!");
-const u8 gText_GlintAppearsInEye[] = _("A glint appears in\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s eyes!");
-const u8 gText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is getting into\nposition!");
-const u8 gText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!");
-const u8 gText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!");
-
-const u16 gUnknown_085CCF0A[] =
-{
- 0x016E, 0x016F, 0x0170, 0x0171
+static const u8 sText_TwoTrainersSentPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME}!\p{B_TRAINER2_CLASS} {B_TRAINER2_NAME} sent\nout {B_OPPONENT_MON2_NAME}!");
+static const u8 sText_Trainer2SentOutPkmn[] = _("{B_TRAINER2_CLASS} {B_TRAINER2_NAME} sent\nout {B_BUFF1}!");
+static const u8 sText_TwoTrainersWantToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} and\n{B_TRAINER2_CLASS} {B_TRAINER2_NAME}\lwant to battle!\p");
+static const u8 sText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_CLASS} {B_PARTNER_NAME} sent\nout {B_PLAYER_MON2_NAME}!\lGo, {B_PLAYER_MON1_NAME}!");
+static const u8 sText_TwoInGameTrainersDefeated[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} and\n{B_TRAINER2_CLASS} {B_TRAINER2_NAME}\lwere defeated!\p");
+static const u8 sText_Trainer2LoseText[] = _("{B_TRAINER2_LOSE_TEXT}");
+static const u8 sText_PkmnIncapableOfPower[] = _("{B_ATK_NAME_WITH_PREFIX} appears incapable\nof using its power!");
+static const u8 sText_GlintAppearsInEye[] = _("A glint appears in\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s eyes!");
+static const u8 sText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is getting into\nposition!");
+static const u8 sText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!");
+static const u8 sText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!");
+
+const u16 gStringIds_85CCF0A[] =
+{
+ STRINGID_GLINTAPPEARSINEYE, STRINGID_PKMNGETTINGINTOPOSITION,
+ STRINGID_PKMNBEGANGROWLINGDEEPLY, STRINGID_PKMNEAGERFORMORE
};
-const u8 gText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!");
-const u8 gText_RefThatsIt[] = _("REFEREE: That’s it! We will now go to\njudging to determine the winner!");
-const u8 gText_RefJudgeMind[] = _("REFEREE: Judging category 1, Mind!\nThe POKéMON showing the most guts!\p");
-const u8 gText_RefJudgeSkill[] = _("REFEREE: Judging category 2, Skill!\nThe POKéMON using moves the best!\p");
-const u8 gText_RefJudgeBody[] = _("REFEREE: Judging category 3, Body!\nThe POKéMON with the most vitality!\p");
-const u8 gText_RefJudgement1[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_PLAYER_NAME}’s {B_PLAYER_MON1_NAME}!\p");
-const u8 gText_RefJudgement2[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_TRAINER1_NAME}’s {B_OPPONENT_MON1_NAME}!\p");
-const u8 gText_RefJudgement3[] = _("REFEREE: Judgment: 3 to 3!\nWe have a draw!\p");
-const u8 gText_DefeatedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} defeated the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
-const u8 gText_LostToOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} lost to the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
-const u8 gText_TiedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} tied the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
-const u8 gText_RefCommenceBattle[] = _("REFEREE: {B_PLAYER_MON1_NAME} VS {B_OPPONENT_MON1_NAME}!\nCommence battling!");
+static const u8 sText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!");
+static const u8 sText_RefThatsIt[] = _("REFEREE: That’s it! We will now go to\njudging to determine the winner!");
+static const u8 sText_RefJudgeMind[] = _("REFEREE: Judging category 1, Mind!\nThe POKéMON showing the most guts!\p");
+static const u8 sText_RefJudgeSkill[] = _("REFEREE: Judging category 2, Skill!\nThe POKéMON using moves the best!\p");
+static const u8 sText_RefJudgeBody[] = _("REFEREE: Judging category 3, Body!\nThe POKéMON with the most vitality!\p");
+static const u8 sText_RefJudgement1[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_PLAYER_NAME}’s {B_PLAYER_MON1_NAME}!\p");
+static const u8 sText_RefJudgement2[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_TRAINER1_NAME}’s {B_OPPONENT_MON1_NAME}!\p");
+static const u8 sText_RefJudgement3[] = _("REFEREE: Judgment: 3 to 3!\nWe have a draw!\p");
+static const u8 sText_DefeatedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} defeated the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
+static const u8 sText_LostToOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} lost to the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
+static const u8 sText_TiedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} tied the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
+static const u8 sText_RefCommenceBattle[] = _("REFEREE: {B_PLAYER_MON1_NAME} VS {B_OPPONENT_MON1_NAME}!\nCommence battling!");
const u8 * const gRefereeStringsTable[] =
{
- gText_RefIfNothingIsDecided,
- gText_RefThatsIt,
- gText_RefJudgeMind,
- gText_RefJudgeSkill,
- gText_RefJudgeBody,
- gText_RefJudgement1,
- gText_RefJudgement2,
- gText_RefJudgement3,
- gText_RefCommenceBattle,
+ sText_RefIfNothingIsDecided,
+ sText_RefThatsIt,
+ sText_RefJudgeMind,
+ sText_RefJudgeSkill,
+ sText_RefJudgeBody,
+ sText_RefJudgement1,
+ sText_RefJudgement2,
+ sText_RefJudgement3,
+ sText_RefCommenceBattle,
};
-const u8 gText_QuestionForfeitMatch[] = _("Would you like to forfeit the match\nand quit now?");
-const u8 gText_ForfeitedMatch[] = _("{B_PLAYER_NAME} forfeited the match!");
-const u8 gText_Trainer1WinText[] = _("{B_TRAINER1_WIN_TEXT}");
-const u8 gText_Trainer2WinText[] = _("{B_TRAINER2_WIN_TEXT}");
-const u8 gText_Trainer1Fled[] = _( "{PLAY_SE 0x0011}{B_TRAINER1_CLASS} {B_TRAINER1_NAME} fled!");
-const u8 gText_PlayerLostAgainstTrainer1[] = _("Player lost against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
-const u8 gText_PlayerBattledToDrawTrainer1[] = _("Player battled to a draw against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
+static const u8 sText_QuestionForfeitMatch[] = _("Would you like to forfeit the match\nand quit now?");
+static const u8 sText_ForfeitedMatch[] = _("{B_PLAYER_NAME} forfeited the match!");
+static const u8 sText_Trainer1WinText[] = _("{B_TRAINER1_WIN_TEXT}");
+static const u8 sText_Trainer2WinText[] = _("{B_TRAINER2_WIN_TEXT}");
+static const u8 sText_Trainer1Fled[] = _( "{PLAY_SE 0x0011}{B_TRAINER1_CLASS} {B_TRAINER1_NAME} fled!");
+static const u8 sText_PlayerLostAgainstTrainer1[] = _("Player lost against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
+static const u8 sText_PlayerBattledToDrawTrainer1[] = _("Player battled to a draw against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
const u8 gText_RecordBattleToPass[] = _("Would you like to record your battle\non your FRONTIER PASS?");
const u8 gText_BattleRecordedOnPass[] = _("{B_PLAYER_NAME}’s battle result was recorded\non the FRONTIER PASS.");
-const u8 gText_LinkTrainerWantsToBattlePause[] = _("{B_20}\nwants to battle!{PAUSE 49}");
-const u8 gText_TwoLinkTrainersWantToBattlePause[] = _("{B_20} and {B_21}\nwant to battle!{PAUSE 49}");
+static const u8 sText_LinkTrainerWantsToBattlePause[] = _("{B_20}\nwants to battle!{PAUSE 49}");
+static const u8 sText_TwoLinkTrainersWantToBattlePause[] = _("{B_20} and {B_21}\nwant to battle!{PAUSE 49}");
-static const u16 sUnknownMoveTable[] =
+// This is four lists of moves which use a different attack string in Japanese
+// to the default. See the documentation for ChooseTypeOfMoveUsedString for more detail.
+static const u16 sGrammarMoveUsedTable[] =
{
MOVE_SWORDS_DANCE, MOVE_STRENGTH, MOVE_GROWTH,
MOVE_HARDEN, MOVE_MINIMIZE, MOVE_SMOKESCREEN,
@@ -1159,16 +1340,16 @@ static const u16 sUnknownMoveTable[] =
MOVE_TRICK, MOVE_ASSIST, MOVE_INGRAIN, MOVE_KNOCK_OFF,
MOVE_CAMOUFLAGE, MOVE_ASTONISH, MOVE_ODOR_SLEUTH,
MOVE_GRASS_WHISTLE, MOVE_SHEER_COLD, MOVE_MUDDY_WATER,
- MOVE_IRON_DEFENSE, MOVE_BOUNCE, MOVE_NONE,
+ MOVE_IRON_DEFENSE, MOVE_BOUNCE, 0,
MOVE_TELEPORT, MOVE_RECOVER, MOVE_BIDE, MOVE_AMNESIA,
- MOVE_FLAIL, MOVE_TAUNT, MOVE_BULK_UP, MOVE_NONE,
+ MOVE_FLAIL, MOVE_TAUNT, MOVE_BULK_UP, 0,
MOVE_MEDITATE, MOVE_AGILITY, MOVE_MIMIC, MOVE_DOUBLE_TEAM,
MOVE_BARRAGE, MOVE_TRANSFORM, MOVE_STRUGGLE, MOVE_SCARY_FACE,
MOVE_CHARGE, MOVE_WISH, MOVE_BRICK_BREAK, MOVE_YAWN,
MOVE_FEATHER_DANCE, MOVE_TEETER_DANCE, MOVE_MUD_SPORT,
- MOVE_FAKE_TEARS, MOVE_WATER_SPORT, MOVE_CALM_MIND, MOVE_NONE,
+ MOVE_FAKE_TEARS, MOVE_WATER_SPORT, MOVE_CALM_MIND, 0,
MOVE_POUND, MOVE_SCRATCH, MOVE_VICE_GRIP,
MOVE_WING_ATTACK, MOVE_FLY, MOVE_BIND, MOVE_SLAM,
@@ -1182,91 +1363,614 @@ static const u16 sUnknownMoveTable[] =
MOVE_FORESIGHT, MOVE_CHARM, MOVE_ATTRACT, MOVE_ROCK_SMASH,
MOVE_UPROAR, MOVE_SPIT_UP, MOVE_SWALLOW, MOVE_TORMENT,
MOVE_FLATTER, MOVE_ROLE_PLAY, MOVE_ENDEAVOR, MOVE_TICKLE,
- MOVE_COVET, MOVE_NONE
+ MOVE_COVET, 0
};
static const u8 sDummyWeirdStatusString[] = {EOS, EOS, EOS, EOS, EOS, EOS, EOS, EOS, 0, 0};
-static const u8 gUnknown_085CD42C[] =
-{
- 0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1,
- 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0,
- 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0,
- 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
- 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE,
- 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF,
- 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0,
- 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
- 0x1, 0x2, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, 0xEE, 0x7, 0x0,
- 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0,
- 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0,
- 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
- 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0x20, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2,
- 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0,
- 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0,
- 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
- 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1,
- 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF,
- 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0,
- 0x0, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0,
- 0x6, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0
+static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
+{
+ { // 0
+ .fillValue = 0xFF,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 1,
+ .fgColor = 1,
+ .bgColor = 15,
+ .shadowColor = 6,
+ },
+ { // 1
+ .fillValue = 0xFF,
+ .fontId = 1,
+ .x = 1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 15,
+ .shadowColor = 6,
+ },
+ { // 2
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 3
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 4
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 5
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 6
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 7
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 12,
+ .bgColor = 14,
+ .shadowColor = 11,
+ },
+ { // 8
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 9
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 2,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 12,
+ .bgColor = 14,
+ .shadowColor = 11,
+ },
+ { // 10
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 11
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 12
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 13
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 14
+ .fillValue = 0x0,
+ .fontId = 1,
+ .x = 32,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 0,
+ .shadowColor = 2,
+ },
+ { // 15
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 16
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 17
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 18
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 19
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 20
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 21
+ .fillValue = 0x0,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 0,
+ .shadowColor = 6,
+ },
+ { // 22
+ .fillValue = 0x0,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 0,
+ .shadowColor = 6,
+ },
+ { // 23
+ .fillValue = 0x0,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 0,
+ .shadowColor = 6,
+ },
};
-static const u8 gUnknown_085CD54C[] =
-{
- 0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1,
- 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0,
- 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0,
- 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
- 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE,
- 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF,
- 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0,
- 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
- 0x1, 0x2, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, 0xEE, 0x7, 0x0,
- 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0,
- 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0,
- 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
- 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0x20, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2,
- 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0xE, 0xF, 0x0,
- 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0,
- 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
- 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1,
- 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF,
- 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1,
- 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0x11, 0x1, 0x0, 0x1, 0x0, 0x0,
- 0x1, 0x2, 0x1, 0x3, 0x0, 0x0
+static const struct BattleWindowText sTextOnWindowsInfo_Arena[] =
+{
+ { // 0
+ .fillValue = 0xFF,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 1,
+ .fgColor = 1,
+ .bgColor = 15,
+ .shadowColor = 6,
+ },
+ { // 1
+ .fillValue = 0xFF,
+ .fontId = 1,
+ .x = 1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 15,
+ .shadowColor = 6,
+ },
+ { // 2
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 3
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 4
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 5
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 6
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 7
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 12,
+ .bgColor = 14,
+ .shadowColor = 11,
+ },
+ { // 8
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 9
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 2,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 12,
+ .bgColor = 14,
+ .shadowColor = 11,
+ },
+ { // 10
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 11
+ .fillValue = 0xEE,
+ .fontId = 7,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 12
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 13
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 14
+ .fillValue = 0x0,
+ .fontId = 1,
+ .x = 32,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 0,
+ .shadowColor = 2,
+ },
+ { // 15
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 1,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 16
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 17
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 18
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 19
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 20
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 21
+ .fillValue = 0xEE,
+ .fontId = 1,
+ .x = -1,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 0,
+ .fgColor = 13,
+ .bgColor = 14,
+ .shadowColor = 15,
+ },
+ { // 22
+ .fillValue = 0x11,
+ .fontId = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .speed = 1,
+ .fgColor = 2,
+ .bgColor = 1,
+ .shadowColor = 3,
+ },
};
-static const u8 * const gUnknown_085CD660[] =
+static const struct BattleWindowText *const sBattleTextOnWindowsInfo[] =
{
- gUnknown_085CD42C, gUnknown_085CD54C
+ sTextOnWindowsInfo_Normal, sTextOnWindowsInfo_Arena
};
static const u8 sRecordedBattleTextSpeeds[] = {8, 4, 1, 0};
+// code
void BufferStringBattle(u16 stringID)
{
s32 i;
- const u8* stringPtr = NULL;
-
- gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBank][4]);
- gLastUsedItem = gStringInfo->lastItem;
- gLastUsedAbility = gStringInfo->lastAbility;
- gBattleScripting.bank = gStringInfo->scrActive;
- *(&gBattleStruct->field_52) = gStringInfo->unk1605E;
- *(&gBattleStruct->hpScale) = gStringInfo->hpScale;
- gStringBank = gStringInfo->StringBank;
- *(&gBattleStruct->stringMoveType) = gStringInfo->moveType;
-
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ const u8 *stringPtr = NULL;
+
+ gBattleMsgDataPtr = (struct BattleMsgData*)(&gBattleBufferA[gActiveBattler][4]);
+ gLastUsedItem = gBattleMsgDataPtr->lastItem;
+ gLastUsedAbility = gBattleMsgDataPtr->lastAbility;
+ gBattleScripting.battler = gBattleMsgDataPtr->scrActive;
+ *(&gBattleStruct->field_52) = gBattleMsgDataPtr->unk1605E;
+ *(&gBattleStruct->hpScale) = gBattleMsgDataPtr->hpScale;
+ gPotentialItemEffectBattler = gBattleMsgDataPtr->itemEffectBattler;
+ *(&gBattleStruct->stringMoveType) = gBattleMsgDataPtr->moveType;
+
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- gAbilitiesPerBank[i] = gStringInfo->abilities[i];
+ sBattlerAbilities[i] = gBattleMsgDataPtr->abilities[i];
}
for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)
{
- gBattleTextBuff1[i] = gStringInfo->textBuffs[0][i];
- gBattleTextBuff2[i] = gStringInfo->textBuffs[1][i];
- gBattleTextBuff3[i] = gStringInfo->textBuffs[2][i];
+ gBattleTextBuff1[i] = gBattleMsgDataPtr->textBuffs[0][i];
+ gBattleTextBuff2[i] = gBattleMsgDataPtr->textBuffs[1][i];
+ gBattleTextBuff3[i] = gBattleMsgDataPtr->textBuffs[2][i];
}
switch (stringID)
@@ -1278,64 +1982,64 @@ void BufferStringBattle(u16 stringID)
{
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
{
- stringPtr = gText_TwoTrainersWantToBattle;
+ stringPtr = sText_TwoTrainersWantToBattle;
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
- stringPtr = gText_TwoLinkTrainersWantToBattlePause;
+ stringPtr = sText_TwoLinkTrainersWantToBattlePause;
else
- stringPtr = gText_TwoLinkTrainersWantToBattle;
+ stringPtr = sText_TwoLinkTrainersWantToBattle;
}
else
{
if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
- stringPtr = gText_Trainer1WantsToBattle;
+ stringPtr = sText_Trainer1WantsToBattle;
else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
- stringPtr = gText_LinkTrainerWantsToBattlePause;
+ stringPtr = sText_LinkTrainerWantsToBattlePause;
else
- stringPtr = gText_LinkTrainerWantsToBattle;
+ stringPtr = sText_LinkTrainerWantsToBattle;
}
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
- stringPtr = gText_TwoTrainersWantToBattle;
+ stringPtr = sText_TwoTrainersWantToBattle;
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
- stringPtr = gText_TwoTrainersWantToBattle;
+ stringPtr = sText_TwoTrainersWantToBattle;
else
- stringPtr = gText_Trainer1WantsToBattle;
+ stringPtr = sText_Trainer1WantsToBattle;
}
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
- stringPtr = gText_WildPkmnAppeared2;
+ stringPtr = sText_WildPkmnAppeared2;
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles
- stringPtr = gText_TwoWildPkmnAppeared;
+ stringPtr = sText_TwoWildPkmnAppeared;
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
- stringPtr = gText_WildPkmnAppearedPause;
+ stringPtr = sText_WildPkmnAppearedPause;
else
- stringPtr = gText_WildPkmnAppeared;
+ stringPtr = sText_WildPkmnAppeared;
}
break;
case STRINGID_INTROSENDOUT: // poke first send-out
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
- stringPtr = gText_InGamePartnerSentOutZGoN;
+ stringPtr = sText_InGamePartnerSentOutZGoN;
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
- stringPtr = gText_GoTwoPkmn;
+ stringPtr = sText_GoTwoPkmn;
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gText_LinkPartnerSentOutPkmnGoPkmn;
+ stringPtr = sText_LinkPartnerSentOutPkmnGoPkmn;
else
- stringPtr = gText_GoTwoPkmn;
+ stringPtr = sText_GoTwoPkmn;
}
else
{
- stringPtr = gText_GoPkmn;
+ stringPtr = sText_GoPkmn;
}
}
else
@@ -1343,65 +2047,65 @@ void BufferStringBattle(u16 stringID)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
- stringPtr = gText_TwoTrainersSentPkmn;
+ stringPtr = sText_TwoTrainersSentPkmn;
else if (gBattleTypeFlags & BATTLE_TYPE_x800000)
- stringPtr = gText_TwoTrainersSentPkmn;
+ stringPtr = sText_TwoTrainersSentPkmn;
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gText_TwoLinkTrainersSentOutPkmn;
+ stringPtr = sText_TwoLinkTrainersSentOutPkmn;
else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
- stringPtr = gText_LinkTrainerSentOutTwoPkmn;
+ stringPtr = sText_LinkTrainerSentOutTwoPkmn;
else
- stringPtr = gText_Trainer1SentOutTwoPkmn;
+ stringPtr = sText_Trainer1SentOutTwoPkmn;
}
else
{
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
- stringPtr = gText_Trainer1SentOutPkmn;
+ stringPtr = sText_Trainer1SentOutPkmn;
else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
- stringPtr = gText_Trainer1SentOutPkmn;
+ stringPtr = sText_Trainer1SentOutPkmn;
else
- stringPtr = gText_LinkTrainerSentOutPkmn;
+ stringPtr = sText_LinkTrainerSentOutPkmn;
}
}
break;
case STRINGID_RETURNMON: // sending poke to ball msg
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
if (*(&gBattleStruct->hpScale) == 0)
- stringPtr = gText_PkmnThatsEnough;
+ stringPtr = sText_PkmnThatsEnough;
else if (*(&gBattleStruct->hpScale) == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- stringPtr = gText_PkmnComeBack;
+ stringPtr = sText_PkmnComeBack;
else if (*(&gBattleStruct->hpScale) == 2)
- stringPtr = gText_PkmnOkComeBack;
+ stringPtr = sText_PkmnOkComeBack;
else
- stringPtr = gText_PkmnGoodComeBack;
+ stringPtr = sText_PkmnGoodComeBack;
}
else
{
- if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_800 || gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_x2000000)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gText_LinkTrainer2WithdrewPkmn;
+ stringPtr = sText_LinkTrainer2WithdrewPkmn;
else
- stringPtr = gText_LinkTrainer1WithdrewPkmn;
+ stringPtr = sText_LinkTrainer1WithdrewPkmn;
}
else
{
- stringPtr = gText_Trainer1WithdrewPkmn;
+ stringPtr = sText_Trainer1WithdrewPkmn;
}
}
break;
case STRINGID_SWITCHINMON: // switch-in msg
- if (GetBankSide(gBattleScripting.bank) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattleScripting.battler) == B_SIDE_PLAYER)
{
if (*(&gBattleStruct->hpScale) == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- stringPtr = gText_GoPkmn2;
+ stringPtr = sText_GoPkmn2;
else if (*(&gBattleStruct->hpScale) == 1)
- stringPtr = gText_DoItPkmn;
+ stringPtr = sText_DoItPkmn;
else if (*(&gBattleStruct->hpScale) == 2)
- stringPtr = gText_GoForItPkmn;
+ stringPtr = sText_GoForItPkmn;
else
- stringPtr = gText_YourFoesWeakGetEmPkmn;
+ stringPtr = sText_YourFoesWeakGetEmPkmn;
}
else
{
@@ -1409,82 +2113,82 @@ void BufferStringBattle(u16 stringID)
{
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
{
- if (gBattleScripting.bank == 1)
- stringPtr = gText_Trainer1SentOutPkmn2;
+ if (gBattleScripting.battler == 1)
+ stringPtr = sText_Trainer1SentOutPkmn2;
else
- stringPtr = gText_Trainer2SentOutPkmn;
+ stringPtr = sText_Trainer2SentOutPkmn;
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gText_LinkTrainerMultiSentOutPkmn;
+ stringPtr = sText_LinkTrainerMultiSentOutPkmn;
else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
- stringPtr = gText_Trainer1SentOutPkmn2;
+ stringPtr = sText_Trainer1SentOutPkmn2;
else
- stringPtr = gText_LinkTrainerSentOutPkmn2;
+ stringPtr = sText_LinkTrainerSentOutPkmn2;
}
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
- if (gBattleScripting.bank == 1)
- stringPtr = gText_Trainer1SentOutPkmn2;
+ if (gBattleScripting.battler == 1)
+ stringPtr = sText_Trainer1SentOutPkmn2;
else
- stringPtr = gText_Trainer2SentOutPkmn;
+ stringPtr = sText_Trainer2SentOutPkmn;
}
else
{
- stringPtr = gText_Trainer1SentOutPkmn2;
+ stringPtr = sText_Trainer1SentOutPkmn2;
}
}
}
break;
case STRINGID_USEDMOVE: // pokemon used a move msg
- sub_814F8F8(gBattleTextBuff1); // buff1 doesn't appear in the string, leftover from japanese move names?
+ ChooseMoveUsedParticle(gBattleTextBuff1); // buff1 doesn't appear in the string, leftover from japanese move names
- if (gStringInfo->currentMove > LAST_MOVE_INDEX)
- StringCopy(gBattleTextBuff2, gText_UnknownMoveTypes[*(&gBattleStruct->stringMoveType)]);
+ if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT)
+ StringCopy(gBattleTextBuff2, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]);
else
- StringCopy(gBattleTextBuff2, gMoveNames[gStringInfo->currentMove]);
+ StringCopy(gBattleTextBuff2, gMoveNames[gBattleMsgDataPtr->currentMove]);
- sub_814F950(gBattleTextBuff2);
- stringPtr = gText_AttackerUsedX;
+ ChooseTypeOfMoveUsedString(gBattleTextBuff2);
+ stringPtr = sText_AttackerUsedX;
break;
case STRINGID_BATTLEEND: // battle end
- if (gBattleTextBuff1[0] & BATTLE_OUTCOME_BIT_x80)
+ if (gBattleTextBuff1[0] & B_OUTCOME_LINK_BATTLE_RAN)
{
- gBattleTextBuff1[0] &= ~(BATTLE_OUTCOME_BIT_x80);
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
- gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
+ gBattleTextBuff1[0] &= ~(B_OUTCOME_LINK_BATTLE_RAN);
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)
+ gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);
- if (gBattleTextBuff1[0] == BATTLE_LOST || gBattleTextBuff1[0] == BATTLE_DREW)
- stringPtr = gText_GotAwaySafely;
+ if (gBattleTextBuff1[0] == B_OUTCOME_LOST || gBattleTextBuff1[0] == B_OUTCOME_DREW)
+ stringPtr = sText_GotAwaySafely;
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gText_TwoWildFled;
+ stringPtr = sText_TwoWildFled;
else
- stringPtr = gText_WildFled;
+ stringPtr = sText_WildFled;
}
else
{
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
- gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)
+ gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
switch (gBattleTextBuff1[0])
{
- case BATTLE_WON:
+ case B_OUTCOME_WON:
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
- stringPtr = gText_TwoInGameTrainersDefeated;
+ stringPtr = sText_TwoInGameTrainersDefeated;
else
- stringPtr = gText_TwoLinkTrainersDefeated;
+ stringPtr = sText_TwoLinkTrainersDefeated;
break;
- case BATTLE_LOST:
- stringPtr = gText_PlayerLostToTwo;
+ case B_OUTCOME_LOST:
+ stringPtr = sText_PlayerLostToTwo;
break;
- case BATTLE_DREW:
- stringPtr = gText_PlayerBattledToDrawVsTwo;
+ case B_OUTCOME_DREW:
+ stringPtr = sText_PlayerBattledToDrawVsTwo;
break;
}
}
@@ -1492,14 +2196,14 @@ void BufferStringBattle(u16 stringID)
{
switch (gBattleTextBuff1[0])
{
- case BATTLE_WON:
- stringPtr = gText_PlayerDefeatedLinkTrainerTrainer1;
+ case B_OUTCOME_WON:
+ stringPtr = sText_PlayerDefeatedLinkTrainerTrainer1;
break;
- case BATTLE_LOST:
- stringPtr = gText_PlayerLostAgainstTrainer1;
+ case B_OUTCOME_LOST:
+ stringPtr = sText_PlayerLostAgainstTrainer1;
break;
- case BATTLE_DREW:
- stringPtr = gText_PlayerBattledToDrawTrainer1;
+ case B_OUTCOME_DREW:
+ stringPtr = sText_PlayerBattledToDrawTrainer1;
break;
}
}
@@ -1507,14 +2211,14 @@ void BufferStringBattle(u16 stringID)
{
switch (gBattleTextBuff1[0])
{
- case BATTLE_WON:
- stringPtr = gText_PlayerDefeatedLinkTrainer;
+ case B_OUTCOME_WON:
+ stringPtr = sText_PlayerDefeatedLinkTrainer;
break;
- case BATTLE_LOST:
- stringPtr = gText_PlayerLostAgainstLinkTrainer;
+ case B_OUTCOME_LOST:
+ stringPtr = sText_PlayerLostAgainstLinkTrainer;
break;
- case BATTLE_DREW:
- stringPtr = gText_PlayerBattledToDrawLinkTrainer;
+ case B_OUTCOME_DREW:
+ stringPtr = sText_PlayerBattledToDrawLinkTrainer;
break;
}
}
@@ -1541,7 +2245,7 @@ u32 BattleStringExpandPlaceholdersToDisplayedString(const u8* src)
BattleStringExpandPlaceholders(src, gDisplayedStringBattle);
}
-static const u8* TryGetStatusString(u8* src)
+static const u8* TryGetStatusString(u8 *src)
{
u32 i;
u8 status[8];
@@ -1572,13 +2276,13 @@ static const u8* TryGetStatusString(u8* src)
return NULL;
}
-#define HANDLE_NICKNAME_STRING_CASE(bank, monIndex) \
- if (GetBankSide(bank) != SIDE_PLAYER) \
+#define HANDLE_NICKNAME_STRING_CASE(battlerId, monIndex) \
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) \
{ \
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \
- toCpy = gText_FoePkmnPrefix; \
+ toCpy = sText_FoePkmnPrefix; \
else \
- toCpy = gText_WildPkmnPrefix; \
+ toCpy = sText_WildPkmnPrefix; \
while (*toCpy != EOS) \
{ \
dst[dstID] = *toCpy; \
@@ -1594,10 +2298,10 @@ static const u8* TryGetStatusString(u8* src)
StringGetEnd10(text); \
toCpy = text;
-u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
+u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
{
u32 dstID = 0; // if they used dstID, why not use srcID as well?
- const u8* toCpy = NULL;
+ const u8 *toCpy = NULL;
u8 text[30];
u8 multiplayerID;
s32 i;
@@ -1655,92 +2359,92 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gStringVar3;
break;
case B_TXT_PLAYER_MON1_NAME: // first player poke name
- GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON1)]],
+ GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_OPPONENT_MON1_NAME: // first enemy poke name
- GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON1)]],
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_PLAYER_MON2_NAME: // second player poke name
- GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON2)]],
+ GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_OPPONENT_MON2_NAME: // second enemy poke name
- GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON2)]],
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name
- GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18]],
+ GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name
- GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]],
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 1]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name
- GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]],
+ GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 2]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name
- GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]],
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 3]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
- case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only bank 0/1
- HANDLE_NICKNAME_STRING_CASE(gBankAttacker,
- gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker))])
+ case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only battlerId 0/1
+ HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker,
+ gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker))])
break;
case B_TXT_ATK_PARTNER_NAME: // attacker partner name
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text);
else
- GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_ATK_NAME_WITH_PREFIX: // attacker name with prefix
- HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[gBankAttacker])
+ HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])
break;
case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix
- HANDLE_NICKNAME_STRING_CASE(gBankTarget, gBattlePartyID[gBankTarget])
+ HANDLE_NICKNAME_STRING_CASE(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget])
break;
- case B_TXT_EFF_NAME_WITH_PREFIX: // effect bank name with prefix
- HANDLE_NICKNAME_STRING_CASE(gEffectBank, gBattlePartyID[gEffectBank])
+ case B_TXT_EFF_NAME_WITH_PREFIX: // effect battlerId name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gEffectBattler, gBattlerPartyIndexes[gEffectBattler])
break;
- case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active bank name with prefix
- HANDLE_NICKNAME_STRING_CASE(gActiveBank, gBattlePartyID[gActiveBank])
+ case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active battlerId name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gActiveBattler, gBattlerPartyIndexes[gActiveBattler])
break;
- case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active bank name with prefix
- HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, gBattlePartyID[gBattleScripting.bank])
+ case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active battlerId name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler])
break;
case B_TXT_CURRENT_MOVE: // current move name
- if (gStringInfo->currentMove > LAST_MOVE_INDEX)
- toCpy = gText_UnknownMoveTypes[gBattleStruct->stringMoveType];
+ if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT)
+ toCpy = sATypeMove_Table[gBattleStruct->stringMoveType];
else
- toCpy = gMoveNames[gStringInfo->currentMove];
+ toCpy = gMoveNames[gBattleMsgDataPtr->currentMove];
break;
- case B_TXT_LAST_MOVE: // last used move name
- if (gStringInfo->lastMove > LAST_MOVE_INDEX)
- toCpy = gText_UnknownMoveTypes[gBattleStruct->stringMoveType];
+ case B_TXT_LAST_MOVE: // originally used move name
+ if (gBattleMsgDataPtr->originallyUsedMove >= MOVES_COUNT)
+ toCpy = sATypeMove_Table[gBattleStruct->stringMoveType];
else
- toCpy = gMoveNames[gStringInfo->lastMove];
+ toCpy = gMoveNames[gBattleMsgDataPtr->originallyUsedMove];
break;
case B_TXT_LAST_ITEM: // last used item
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
@@ -1749,28 +2453,28 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- if ((gBattleScripting.multiplayerId != 0 && (gStringBank & BIT_SIDE))
- || (gBattleScripting.multiplayerId == 0 && !(gStringBank & BIT_SIDE)))
+ if ((gBattleScripting.multiplayerId != 0 && (gPotentialItemEffectBattler & BIT_SIDE))
+ || (gBattleScripting.multiplayerId == 0 && !(gPotentialItemEffectBattler & BIT_SIDE)))
{
- StringCopy(text, gEnigmaBerries[gStringBank].name);
- StringAppend(text, gText_BerrySuffix);
+ StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);
+ StringAppend(text, sText_BerrySuffix);
toCpy = text;
}
else
{
- toCpy = gText_EnigmaBerry;
+ toCpy = sText_EnigmaBerry;
}
}
else
{
- if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
+ if (gLinkPlayers[gBattleScripting.multiplayerId].id == gPotentialItemEffectBattler)
{
- StringCopy(text, gEnigmaBerries[gStringBank].name);
- StringAppend(text, gText_BerrySuffix);
+ StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);
+ StringAppend(text, sText_BerrySuffix);
toCpy = text;
}
else
- toCpy = gText_EnigmaBerry;
+ toCpy = sText_EnigmaBerry;
}
}
else
@@ -1789,24 +2493,24 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gAbilityNames[gLastUsedAbility];
break;
case B_TXT_ATK_ABILITY: // attacker ability
- toCpy = gAbilityNames[gAbilitiesPerBank[gBankAttacker]];
+ toCpy = gAbilityNames[sBattlerAbilities[gBattlerAttacker]];
break;
case B_TXT_DEF_ABILITY: // target ability
- toCpy = gAbilityNames[gAbilitiesPerBank[gBankTarget]];
+ toCpy = gAbilityNames[sBattlerAbilities[gBattlerTarget]];
break;
case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability
- toCpy = gAbilityNames[gAbilitiesPerBank[gBattleScripting.bank]];
+ toCpy = gAbilityNames[sBattlerAbilities[gBattleScripting.battler]];
break;
- case B_TXT_EFF_ABILITY: // effect bank ability
- toCpy = gAbilityNames[gAbilitiesPerBank[gEffectBank]];
+ case B_TXT_EFF_ABILITY: // effect battlerId ability
+ toCpy = gAbilityNames[sBattlerAbilities[gEffectBattler]];
break;
case B_TXT_TRAINER1_CLASS: // trainer class name
if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
- toCpy = gTrainerClassNames[GetSecretBaseTrainerNameIndex()];
+ toCpy = gTrainerClassNames[GetSecretBaseTrainerClass()];
else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
toCpy = gTrainerClassNames[sub_8068BB0()];
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
- toCpy = gTrainerClassNames[sub_81A4D00()];
+ else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
+ toCpy = gTrainerClassNames[GetFrontierBrainTrainerClass()];
else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
toCpy = gTrainerClassNames[GetFrontierOpponentClass(gTrainerBattleOpponent_A)];
else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
@@ -1829,9 +2533,9 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
{
toCpy = gLinkPlayers[multiplayerID ^ BIT_SIDE].name;
}
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
+ else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
{
- sub_81A4D50(text);
+ CopyFrontierBrainTrainerName(text);
toCpy = text;
}
else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
@@ -1858,16 +2562,16 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gLinkPlayers[multiplayerID].name;
break;
case B_TXT_1F: // link partner name?
- toCpy = gLinkPlayers[GetBankMultiplayerId(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
+ toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerID].id)].name;
break;
case B_TXT_20: // link opponent 1 name?
- toCpy = gLinkPlayers[GetBankMultiplayerId(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
+ toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerID].id)].name;
break;
case B_TXT_21: // link opponent 2 name?
- toCpy = gLinkPlayers[GetBankMultiplayerId(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
+ toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerID].id)].name;
break;
case B_TXT_22: // link scripting active name
- toCpy = gLinkPlayers[GetBankMultiplayerId(gBattleScripting.bank)].name;
+ toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name;
break;
case B_TXT_PLAYER_NAME: // player name
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
@@ -1888,7 +2592,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
else
{
- toCpy = GetTrainer1LoseText();
+ toCpy = GetTrainerALoseText();
}
break;
case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text
@@ -1904,49 +2608,49 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
break;
case B_TXT_26: // ?
- HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, *(&gBattleStruct->field_52))
+ HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->field_52))
break;
case B_TXT_PC_CREATOR_NAME: // lanette pc
if (FlagGet(FLAG_SYS_PC_LANETTE))
- toCpy = gText_Lanettes;
+ toCpy = sText_Lanettes;
else
- toCpy = gText_Someones;
+ toCpy = sText_Someones;
break;
case B_TXT_ATK_PREFIX2:
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- toCpy = gText_AllyPkmnPrefix2;
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ toCpy = sText_AllyPkmnPrefix2;
else
- toCpy = gText_FoePkmnPrefix3;
+ toCpy = sText_FoePkmnPrefix3;
break;
case B_TXT_DEF_PREFIX2:
- if (GetBankSide(gBankTarget) == SIDE_PLAYER)
- toCpy = gText_AllyPkmnPrefix2;
+ if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
+ toCpy = sText_AllyPkmnPrefix2;
else
- toCpy = gText_FoePkmnPrefix3;
+ toCpy = sText_FoePkmnPrefix3;
break;
case B_TXT_ATK_PREFIX1:
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- toCpy = gText_AllyPkmnPrefix;
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ toCpy = sText_AllyPkmnPrefix;
else
- toCpy = gText_FoePkmnPrefix2;
+ toCpy = sText_FoePkmnPrefix2;
break;
case B_TXT_DEF_PREFIX1:
- if (GetBankSide(gBankTarget) == SIDE_PLAYER)
- toCpy = gText_AllyPkmnPrefix;
+ if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
+ toCpy = sText_AllyPkmnPrefix;
else
- toCpy = gText_FoePkmnPrefix2;
+ toCpy = sText_FoePkmnPrefix2;
break;
case B_TXT_ATK_PREFIX3:
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- toCpy = gText_AllyPkmnPrefix3;
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ toCpy = sText_AllyPkmnPrefix3;
else
- toCpy = gText_FoePkmnPrefix4;
+ toCpy = sText_FoePkmnPrefix4;
break;
case B_TXT_DEF_PREFIX3:
- if (GetBankSide(gBankTarget) == SIDE_PLAYER)
- toCpy = gText_AllyPkmnPrefix3;
+ if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
+ toCpy = sText_AllyPkmnPrefix3;
else
- toCpy = gText_FoePkmnPrefix4;
+ toCpy = sText_FoePkmnPrefix4;
break;
case B_TXT_TRAINER2_CLASS:
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
@@ -1985,7 +2689,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
else
{
- toCpy = GetTrainer2LoseText();
+ toCpy = GetTrainerBLoseText();
}
break;
case B_TXT_TRAINER2_WIN_TEXT:
@@ -2039,10 +2743,6 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
return dstID;
}
-// TODO: move these to a general header like util.h
-#define ByteRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
-#define ByteRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
-
static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
{
u32 srcID = 1;
@@ -2056,7 +2756,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
switch (src[srcID])
{
case B_BUFF_STRING: // battle string
- hword = ByteRead16(&src[srcID + 1]);
+ hword = T1_READ_16(&src[srcID + 1]);
StringAppend(dst, gBattleStringsTable[hword - BATTLESTRINGS_ID_ADDER]);
srcID += 3;
break;
@@ -2067,17 +2767,17 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
value = src[srcID + 3];
break;
case 2:
- value = ByteRead16(&src[srcID + 3]);
+ value = T1_READ_16(&src[srcID + 3]);
break;
case 4:
- value = ByteRead32(&src[srcID + 3]);
+ value = T1_READ_32(&src[srcID + 3]);
break;
}
ConvertIntToDecimalStringN(dst, value, 0, src[srcID + 2]);
srcID += src[srcID + 1] + 3;
break;
case B_BUFF_MOVE: // move name
- StringAppend(dst, gMoveNames[ByteRead16(&src[srcID + 1])]);
+ StringAppend(dst, gMoveNames[T1_READ_16(&src[srcID + 1])]);
srcID += 3;
break;
case B_BUFF_TYPE: // type name
@@ -2085,16 +2785,16 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
srcID += 2;
break;
case B_BUFF_MON_NICK_WITH_PREFIX: // poke nick with prefix
- if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
+ if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER)
{
GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, text);
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- StringAppend(dst, gText_FoePkmnPrefix);
+ StringAppend(dst, sText_FoePkmnPrefix);
else
- StringAppend(dst, gText_WildPkmnPrefix);
+ StringAppend(dst, sText_WildPkmnPrefix);
GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, text);
}
@@ -2107,18 +2807,18 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
srcID += 2;
break;
case B_BUFF_SPECIES: // species name
- GetSpeciesName(dst, ByteRead16(&src[srcID + 1]));
+ GetSpeciesName(dst, T1_READ_16(&src[srcID + 1]));
srcID += 3;
break;
case B_BUFF_MON_NICK: // poke nick without prefix
- if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
+ if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER)
GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
else
GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
StringGetEnd10(dst);
srcID += 3;
break;
- case B_BUFF_NEGATIVE_FLAVOUR: // flavour table
+ case B_BUFF_NEGATIVE_FLAVOR: // flavor table
StringAppend(dst, gPokeblockWasTooXStringTable[src[srcID + 1]]);
srcID += 2;
break;
@@ -2127,53 +2827,81 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
srcID += 2;
break;
case B_BUFF_ITEM: // item name
- hword = ByteRead16(&src[srcID + 1]);
+ hword = T1_READ_16(&src[srcID + 1]);
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
{
if (hword == ITEM_ENIGMA_BERRY)
{
- if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
+ if (gLinkPlayers[gBattleScripting.multiplayerId].id == gPotentialItemEffectBattler)
{
- StringCopy(dst, gEnigmaBerries[gStringBank].name);
- StringAppend(dst, gText_BerrySuffix);
+ StringCopy(dst, gEnigmaBerries[gPotentialItemEffectBattler].name);
+ StringAppend(dst, sText_BerrySuffix);
}
else
- StringAppend(dst, gText_EnigmaBerry);
+ {
+ StringAppend(dst, sText_EnigmaBerry);
+ }
}
else
+ {
CopyItemName(hword, dst);
+ }
}
else
+ {
CopyItemName(hword, dst);
+ }
srcID += 3;
break;
}
}
}
-static void sub_814F8F8(u8* textBuff)
+// Loads one of two text strings into the provided buffer. This is functionally
+// unused, since the value loaded into the buffer is not read; it loaded one of
+// two particles (either "は" or "の") which works in tandem with ChooseTypeOfMoveUsedString
+// below to effect changes in the meaning of the line.
+static void ChooseMoveUsedParticle(u8* textBuff)
{
s32 counter = 0;
u32 i = 0;
while (counter != 4)
{
- if (sUnknownMoveTable[i] == MOVE_NONE)
+ if (sGrammarMoveUsedTable[i] == 0)
counter++;
- if (sUnknownMoveTable[i++] == gStringInfo->currentMove)
+ if (sGrammarMoveUsedTable[i++] == gBattleMsgDataPtr->currentMove)
break;
}
if (counter >= 0)
{
if (counter <= 2)
- StringCopy(textBuff, gText_SpaceIs); // is
+ StringCopy(textBuff, sText_SpaceIs); // is
else if (counter <= 4)
- StringCopy(textBuff, gText_ApostropheS); // 's
+ StringCopy(textBuff, sText_ApostropheS); // 's
}
}
-static void sub_814F950(u8* dst)
+// Appends "!" to the text buffer `dst`. In the original Japanese this looked
+// into the table of moves at sGrammarMoveUsedTable and varied the line accordingly.
+//
+// sText_ExclamationMark was a plain "!", used for any attack not on the list.
+// It resulted in the translation "<NAME>'s <ATTACK>!".
+//
+// sText_ExclamationMark2 was "を つかった!". This resulted in the translation
+// "<NAME> used <ATTACK>!", which was used for all attacks in English.
+//
+// sText_ExclamationMark3 was "した!". This was used for those moves whose
+// names were verbs, such as Recover, and resulted in translations like "<NAME>
+// recovered itself!".
+//
+// sText_ExclamationMark4 was "を した!" This resulted in a translation of
+// "<NAME> did an <ATTACK>!".
+//
+// sText_ExclamationMark5 was " こうげき!" This resulted in a translation of
+// "<NAME>'s <ATTACK> attack!".
+static void ChooseTypeOfMoveUsedString(u8* dst)
{
s32 counter = 0;
s32 i = 0;
@@ -2183,73 +2911,72 @@ static void sub_814F950(u8* dst)
while (counter != 4)
{
- if (sUnknownMoveTable[i] == MOVE_NONE)
+ if (sGrammarMoveUsedTable[i] == MOVE_NONE)
counter++;
- if (sUnknownMoveTable[i++] == gStringInfo->currentMove)
+ if (sGrammarMoveUsedTable[i++] == gBattleMsgDataPtr->currentMove)
break;
}
switch (counter)
{
case 0:
- StringCopy(dst, gText_ExclamationMark);
+ StringCopy(dst, sText_ExclamationMark);
break;
case 1:
- StringCopy(dst, gText_ExclamationMark2);
+ StringCopy(dst, sText_ExclamationMark2);
break;
case 2:
- StringCopy(dst, gText_ExclamationMark3);
+ StringCopy(dst, sText_ExclamationMark3);
break;
case 3:
- StringCopy(dst, gText_ExclamationMark4);
+ StringCopy(dst, sText_ExclamationMark4);
break;
case 4:
- StringCopy(dst, gText_ExclamationMark5);
+ StringCopy(dst, sText_ExclamationMark5);
break;
}
}
-void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
+void BattlePutTextOnWindow(const u8 *text, u8 windowId)
{
- const u8 *r8 = gUnknown_085CD660[gBattleScripting.field_24];
- bool32 r9;
+ const struct BattleWindowText *textInfo = sBattleTextOnWindowsInfo[gBattleScripting.windowsType];
+ bool32 copyToVram;
struct TextSubPrinter textSubPrinter;
u8 speed;
- if (arg1 & 0x80)
+ if (windowId & 0x80)
{
- arg1 &= ~(0x80);
- r9 = FALSE;
+ windowId &= ~(0x80);
+ copyToVram = FALSE;
}
else
{
- FillWindowPixelBuffer(arg1, r8[12 * arg1]);
- r9 = TRUE;
+ FillWindowPixelBuffer(windowId, textInfo[windowId].fillValue);
+ copyToVram = TRUE;
}
textSubPrinter.current_text_offset = text;
- textSubPrinter.windowId = arg1;
- textSubPrinter.fontId = r8[(12 * arg1) + 1];
- textSubPrinter.x = r8[(12 * arg1) + 2];
- textSubPrinter.y = r8[(12 * arg1) + 3];
+ textSubPrinter.windowId = windowId;
+ textSubPrinter.fontId = textInfo[windowId].fontId;
+ textSubPrinter.x = textInfo[windowId].x;
+ textSubPrinter.y = textInfo[windowId].y;
textSubPrinter.currentX = textSubPrinter.x;
textSubPrinter.currentY = textSubPrinter.y;
- textSubPrinter.letterSpacing = r8[(12 * arg1) + 4];
- textSubPrinter.lineSpacing = r8[(12 * arg1) + 5];
+ textSubPrinter.letterSpacing = textInfo[windowId].letterSpacing;
+ textSubPrinter.lineSpacing = textInfo[windowId].lineSpacing;
textSubPrinter.fontColor_l = 0;
- textSubPrinter.fontColor_h = r8[(12 * arg1) + 7];
- textSubPrinter.bgColor = r8[(12 * arg1) + 8];
- textSubPrinter.shadowColor = r8[(12 * arg1) + 9];
+ textSubPrinter.fgColor = textInfo[windowId].fgColor;
+ textSubPrinter.bgColor = textInfo[windowId].bgColor;
+ textSubPrinter.shadowColor = textInfo[windowId].shadowColor;
if (textSubPrinter.x == 0xFF)
{
- s32 var2;
- u32 var = sub_80397C4(gBattleScripting.field_24, arg1);
- var2 = GetStringCenterAlignXOffsetWithLetterSpacing(textSubPrinter.fontId, textSubPrinter.current_text_offset, var, textSubPrinter.letterSpacing);
- textSubPrinter.x = textSubPrinter.currentX = var2;
+ u32 width = sub_80397C4(gBattleScripting.windowsType, windowId);
+ s32 alignX = GetStringCenterAlignXOffsetWithLetterSpacing(textSubPrinter.fontId, textSubPrinter.current_text_offset, width, textSubPrinter.letterSpacing);
+ textSubPrinter.x = textSubPrinter.currentX = alignX;
}
- if (arg1 == 0x16)
+ if (windowId == 0x16)
gTextFlags.flag_1 = 0;
else
gTextFlags.flag_1 = 1;
@@ -2259,38 +2986,38 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
else
gTextFlags.flag_2 = 0;
- if (arg1 == 0 || arg1 == 0x16)
+ if (windowId == 0 || windowId == 0x16)
{
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
speed = 1;
else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
speed = sRecordedBattleTextSpeeds[GetTextSpeedInRecordedBattle()];
else
- speed = sav2_get_text_speed();
+ speed = GetPlayerTextSpeed();
gTextFlags.flag_0 = 1;
}
else
{
- speed = r8[(12 * arg1) + 6];
+ speed = textInfo[windowId].speed;
gTextFlags.flag_0 = 0;
}
AddTextPrinter(&textSubPrinter, speed, NULL);
- if (r9)
+ if (copyToVram)
{
- PutWindowTilemap(arg1);
- CopyWindowToVram(arg1, 3);
+ PutWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 3);
}
}
void SetPpNumbersPaletteInMoveSelection(void)
{
- struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
const u16 *palPtr = gUnknown_08D85620;
- u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBank]],
- chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBank]]);
+ u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBattler]],
+ chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBattler]]);
gPlttBufferUnfaded[92] = palPtr[(var * 2) + 0];
gPlttBufferUnfaded[91] = palPtr[(var * 2) + 1];
diff --git a/src/battle_records.c b/src/battle_records.c
new file mode 100644
index 000000000..8e9d045cb
--- /dev/null
+++ b/src/battle_records.c
@@ -0,0 +1,510 @@
+#include "global.h"
+#include "battle_records.h"
+#include "bg.h"
+#include "window.h"
+#include "link.h"
+#include "battle.h"
+#include "overworld.h"
+#include "text.h"
+#include "text_window.h"
+#include "strings.h"
+#include "string_util.h"
+#include "trainer_card.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "palette.h"
+#include "main.h"
+#include "scanline_effect.h"
+#include "international_string_util.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "constants/game_stat.h"
+
+extern void PrintOnTrainerHillRecordsWindow(void); // pokenav.s
+
+// this file's functions
+static void Task_CloseTrainerHillRecordsOnButton(u8 taskId);
+static void Task_BeginPaletteFade(u8 taskId);
+static void Task_ExitTrainerHillRecords(u8 taskId);
+static void RemoveTrainerHillRecordsWindow(u8 windowId);
+static void CB2_ShowTrainerHillRecords(void);
+
+// EWRAM variables
+EWRAM_DATA u8 gRecordsWindowId = 0;
+EWRAM_DATA static u8 *sTilemapBuffer = NULL;
+
+// const rom data
+static const u32 sTrainerHillWindowTileset[] = INCBIN_U32("graphics/unknown/unknown_5B3484.4bpp");
+static const u16 sTrainerHillWindowPalette[] = INCBIN_U16("graphics/unknown/unknown_5B3484.gbapal");
+static const u32 sTrainerHillWindowTilemap[] = INCBIN_U32("graphics/unknown/unknown_5B3564.bin");
+
+static const struct BgTemplate sTrainerHillRecordsBgTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const struct WindowTemplate sTrainerHillRecordsWindowTemplates[] =
+{
+ {0x0, 0x2, 0x1, 0x1A, 0x12, 0xF, 0x14},
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate sLinkBattleRecordsWindow = {0x0, 0x2, 0x1, 0x1A, 0x11, 0xF, 0x1};
+
+static const u8 sText_DashesNoPlayer[] = _("-------");
+static const u8 sText_DashesNoScore[] = _("----");
+
+// code
+static void ClearLinkBattleRecord(struct LinkBattleRecord *record)
+{
+ CpuFill16(0, record, sizeof(struct LinkBattleRecord));
+ record->name[0] = EOS;
+ record->trainerId = 0;
+ record->wins = 0;
+ record->losses = 0;
+ record->draws = 0;
+}
+
+static void ClearLinkBattleRecords(struct LinkBattleRecord *records)
+{
+ s32 i;
+ for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
+ {
+ ClearLinkBattleRecord(records + i);
+ }
+ SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0);
+ SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0);
+ SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0);
+}
+
+static s32 GetLinkBattleRecordTotalBattles(struct LinkBattleRecord *record)
+{
+ return record->wins + record->losses + record->draws;
+}
+
+static s32 FindLinkBattleRecord(struct LinkBattleRecord *records, const u8 *name, u16 trainerId)
+{
+ s32 i;
+
+ for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
+ {
+ if (!StringCompareN(records[i].name, name, OT_NAME_LENGTH) && records[i].trainerId == trainerId)
+ return i;
+ }
+
+ return LINK_B_RECORDS_COUNT;
+}
+
+static void SortLinkBattleRecords(struct LinkBattleRecords *records)
+{
+ s32 i, j;
+
+ for (i = LINK_B_RECORDS_COUNT - 1; i > 0; i--)
+ {
+ for (j = i - 1; j >= 0; j--)
+ {
+ s32 totalBattlesI = GetLinkBattleRecordTotalBattles(&records->entries[i]);
+ s32 totalBattlesJ = GetLinkBattleRecordTotalBattles(&records->entries[j]);
+
+ if (totalBattlesI > totalBattlesJ)
+ {
+ struct LinkBattleRecord temp1;
+ u8 temp2;
+
+ temp1 = records->entries[i];
+ records->entries[i] = records->entries[j];
+ records->entries[j] = temp1;
+
+ temp2 = records->languages[i];
+ records->languages[i] = records->languages[j];
+ records->languages[j] = temp2;
+ }
+ }
+ }
+}
+
+static void UpdateLinkBattleRecord(struct LinkBattleRecord *record, s32 battleOutcome)
+{
+ switch (battleOutcome)
+ {
+ case B_OUTCOME_WON:
+ record->wins++;
+ if (record->wins > 9999)
+ record->wins = 9999;
+ break;
+ case B_OUTCOME_LOST:
+ record->losses++;
+ if (record->losses > 9999)
+ record->losses = 9999;
+ break;
+ case B_OUTCOME_DREW:
+ record->draws++;
+ if (record->draws > 9999)
+ record->draws = 9999;
+ break;
+ }
+}
+
+static void UpdateLinkBattleGameStats(s32 battleOutcome)
+{
+ u8 stat;
+
+ switch (battleOutcome)
+ {
+ case B_OUTCOME_WON:
+ stat = GAME_STAT_LINK_BATTLE_WINS;
+ break;
+ case B_OUTCOME_LOST:
+ stat = GAME_STAT_LINK_BATTLE_LOSSES;
+ break;
+ case B_OUTCOME_DREW:
+ stat = GAME_STAT_LINK_BATTLE_DRAWS;
+ break;
+ default:
+ return;
+ }
+
+ if (GetGameStat(stat) < 9999)
+ IncrementGameStat(stat);
+}
+
+static void UpdateLinkBattleRecords(struct LinkBattleRecords *records, const u8 *name, u16 trainerId, s32 battleOutcome, u8 battlerId)
+{
+ s32 index;
+
+ UpdateLinkBattleGameStats(battleOutcome);
+ SortLinkBattleRecords(records);
+ index = FindLinkBattleRecord(records->entries, name, trainerId);
+ if (index == LINK_B_RECORDS_COUNT)
+ {
+ index = LINK_B_RECORDS_COUNT - 1;
+ ClearLinkBattleRecord(&records->entries[index]);
+ StringCopyN(records->entries[index].name, name, OT_NAME_LENGTH);
+ records->entries[index].trainerId = trainerId;
+ records->languages[index] = gLinkPlayers[battlerId].language;
+ }
+ UpdateLinkBattleRecord(&records->entries[index], battleOutcome);
+ SortLinkBattleRecords(records);
+}
+
+void ClearPlayerLinkBattleRecords(void)
+{
+ ClearLinkBattleRecords(gSaveBlock1Ptr->linkBattleRecords.entries);
+}
+
+static void IncTrainerCardWins(s32 battlerId)
+{
+ u16 *wins = &gTrainerCards[battlerId].linkBattleWins;
+ (*wins)++;
+ if (*wins > 9999)
+ *wins = 9999;
+}
+
+static void IncTrainerCardLosses(s32 battlerId)
+{
+ u16 *losses = &gTrainerCards[battlerId].linkBattleLosses;
+ (*losses)++;
+ if (*losses > 9999)
+ *losses = 9999;
+}
+
+static void UpdateTrainerCardWinsLosses(s32 battlerId)
+{
+ switch (gBattleOutcome)
+ {
+ case B_OUTCOME_WON:
+ IncTrainerCardWins(BATTLE_OPPOSITE(battlerId));
+ IncTrainerCardLosses(battlerId);
+ break;
+ case B_OUTCOME_LOST:
+ IncTrainerCardLosses(BATTLE_OPPOSITE(battlerId));
+ IncTrainerCardWins(battlerId);
+ break;
+ }
+}
+
+void UpdatePlayerLinkBattleRecords(s32 battlerId)
+{
+ if (InUnionRoom() != TRUE)
+ {
+ UpdateTrainerCardWinsLosses(battlerId);
+ UpdateLinkBattleRecords(
+ &gSaveBlock1Ptr->linkBattleRecords,
+ gTrainerCards[battlerId].playerName,
+ gTrainerCards[battlerId].trainerId,
+ gBattleOutcome,
+ battlerId);
+ }
+}
+
+static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records)
+{
+ s32 x;
+
+ ConvertIntToDecimalStringN(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_LEFT_ALIGN, 4);
+ ConvertIntToDecimalStringN(gStringVar2, GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES), STR_CONV_MODE_LEFT_ALIGN, 4);
+ ConvertIntToDecimalStringN(gStringVar3, GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS), STR_CONV_MODE_LEFT_ALIGN, 4);
+ StringExpandPlaceholders(gStringVar4, gText_TotalRecordWLD);
+
+ x = GetStringCenterAlignXOffset(1, gStringVar4, 0xD0);
+ PrintTextOnWindow(gRecordsWindowId, 1, gStringVar4, x, 0x11, 0, NULL);
+}
+
+static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y, s32 language)
+{
+ if (record->wins == 0 && record->losses == 0 && record->draws == 0)
+ {
+ // empty slot
+ PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoPlayer, 8, (y * 8) + 1, 0, NULL);
+ PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoScore, 80, (y * 8) + 1, 0, NULL);
+ PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoScore, 128, (y * 8) + 1, 0, NULL);
+ PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoScore, 176, (y * 8) + 1, 0, NULL);
+ }
+ else
+ {
+ StringFillWithTerminator(gStringVar1, 8);
+ StringCopyN(gStringVar1, record->name, 7);
+ ConvertInternationalString(gStringVar1, language);
+
+ PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 8, (y * 8) + 1, 0, NULL);
+
+ ConvertIntToDecimalStringN(gStringVar1, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 80, (y * 8) + 1, 0, NULL);
+
+ ConvertIntToDecimalStringN(gStringVar1, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 128, (y * 8) + 1, 0, NULL);
+
+ ConvertIntToDecimalStringN(gStringVar1, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 176, (y * 8) + 1, 0, NULL);
+ }
+}
+
+void ShowLinkBattleRecords(void)
+{
+ s32 i, x;
+
+ gRecordsWindowId = AddWindow(&sLinkBattleRecordsWindow);
+ NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE);
+ FillWindowPixelBuffer(gRecordsWindowId, 0x11);
+ StringExpandPlaceholders(gStringVar4, gText_PlayersBattleResults);
+
+ x = GetStringCenterAlignXOffset(1, gStringVar4, 208);
+ PrintTextOnWindow(gRecordsWindowId, 1, gStringVar4, x, 1, 0, NULL);
+ PrintLinkBattleWinsLossesDraws(gSaveBlock1Ptr->linkBattleRecords.entries);
+
+ StringExpandPlaceholders(gStringVar4, gText_WinLoseDraw);
+ PrintTextOnWindow(gRecordsWindowId, 1, gStringVar4, 0, 41, 0, NULL);
+
+ for (i = 0; i < LINK_B_RECORDS_COUNT; i++)
+ {
+ PrintLinkBattleRecord(&gSaveBlock1Ptr->linkBattleRecords.entries[i], 7 + (i * 2), gSaveBlock1Ptr->linkBattleRecords.languages[i]);
+ }
+
+ PutWindowTilemap(gRecordsWindowId);
+ CopyWindowToVram(gRecordsWindowId, 3);
+}
+
+void RemoveRecordsWindow(void)
+{
+ sub_819746C(gRecordsWindowId, FALSE);
+ RemoveWindow(gRecordsWindowId);
+}
+
+static void Task_TrainerHillWaitForPaletteFade(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ gTasks[taskId].func = Task_CloseTrainerHillRecordsOnButton;
+}
+
+static void Task_CloseTrainerHillRecordsOnButton(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ task->func = Task_BeginPaletteFade;
+ }
+}
+
+static void Task_BeginPaletteFade(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_ExitTrainerHillRecords;
+}
+
+static void Task_ExitTrainerHillRecords(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ Free(sTilemapBuffer);
+ RemoveTrainerHillRecordsWindow(0);
+ FreeAllWindowBuffers();
+ DestroyTask(taskId);
+ }
+}
+
+static void RemoveTrainerHillRecordsWindow(u8 windowId)
+{
+ FillWindowPixelBuffer(windowId, 0);
+ ClearWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 2);
+ RemoveWindow(windowId);
+}
+
+static void ClearVramOamPlttRegs(void)
+{
+ DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000);
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+}
+
+static void ClearTasksAndGraphicalStructs(void)
+{
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+}
+
+static void ResetBgCoordinates(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+}
+
+static void SetDispcntReg(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_1D_MAP);
+}
+
+static void LoadTrainerHillRecordsWindowGfx(u8 bgId)
+{
+ LoadBgTiles(bgId, sTrainerHillWindowTileset, sizeof(sTrainerHillWindowTileset), 0);
+ CopyToBgTilemapBufferRect(bgId, sTrainerHillWindowTilemap, 0, 0, 0x20, 0x20);
+ LoadPalette(sTrainerHillWindowPalette, 0, 0x20);
+}
+
+static void VblankCB_TrainerHillRecords(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void MainCB2_TrainerHillRecords(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void ShowTrainerHillRecords(void)
+{
+ SetVBlankCallback(NULL);
+ SetMainCallback2(CB2_ShowTrainerHillRecords);
+}
+
+static void CB2_ShowTrainerHillRecords(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ClearVramOamPlttRegs();
+ gMain.state++;
+ break;
+ case 1:
+ ClearTasksAndGraphicalStructs();
+ gMain.state++;
+ break;
+ case 2:
+ sTilemapBuffer = AllocZeroed(0x800);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sTrainerHillRecordsBgTemplates, ARRAY_COUNT(sTrainerHillRecordsBgTemplates));
+ SetBgTilemapBuffer(3, sTilemapBuffer);
+ ResetBgCoordinates();
+ gMain.state++;
+ break;
+ case 3:
+ LoadTrainerHillRecordsWindowGfx(3);
+ LoadPalette(stdpal_get(0), 0xF0, 0x20);
+ gMain.state++;
+ break;
+ case 4:
+ if (IsDma3ManagerBusyWithBgCopy() != TRUE)
+ {
+ ShowBg(0);
+ ShowBg(3);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ }
+ break;
+ case 5:
+ InitWindows(sTrainerHillRecordsWindowTemplates);
+ DeactivateAllTextPrinters();
+ gMain.state++;
+ break;
+ case 6:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ gMain.state++;
+ break;
+ case 7:
+ SetDispcntReg();
+ SetVBlankCallback(VblankCB_TrainerHillRecords);
+ PrintOnTrainerHillRecordsWindow();
+ CreateTask(Task_TrainerHillWaitForPaletteFade, 8);
+ SetMainCallback2(MainCB2_TrainerHillRecords);
+ gMain.state = 0;
+ break;
+ }
+}
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 6409ff56e..5c0b78240 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -1,21 +1,25 @@
#include "global.h"
#include "battle.h"
-#include "battle_move_effects.h"
+#include "constants/battle_move_effects.h"
+#include "constants/battle_script_commands.h"
#include "battle_message.h"
#include "battle_ai_script_commands.h"
-#include "moves.h"
-#include "abilities.h"
+#include "battle_scripts.h"
+#include "constants/moves.h"
+#include "constants/abilities.h"
#include "item.h"
-#include "items.h"
-#include "hold_effects.h"
+#include "constants/items.h"
+#include "constants/hold_effects.h"
#include "util.h"
#include "pokemon.h"
-#include "calculate_base_damage.h"
-#include "rng.h"
+#include "random.h"
#include "battle_controllers.h"
#include "battle_interface.h"
-#include "species.h"
-#include "songs.h"
+#include "constants/species.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
+#include "constants/battle_anim.h"
+#include "constants/map_types.h"
#include "text.h"
#include "sound.h"
#include "pokedex.h"
@@ -28,107 +32,31 @@
#include "bg.h"
#include "string_util.h"
#include "pokemon_icon.h"
-#include "pokemon_item_effects.h"
#include "m4a.h"
#include "mail.h"
#include "event_data.h"
#include "pokemon_storage_system.h"
#include "task.h"
#include "naming_screen.h"
-#include "battle_string_ids.h"
-
-// variables
-
-extern u8 gCritMultiplier;
-extern s32 gBattleMoveDamage;
-extern u32 gStatuses3[BATTLE_BANKS_COUNT];
-extern u32 gBattleTypeFlags;
-extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u8 gActiveBank;
-extern u32 gBattleExecBuffer;
-extern u8 gNoOfAllBanks;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBanksByTurnOrder[BATTLE_BANKS_COUNT];
-extern u8 gActionsByTurnOrder[BATTLE_BANKS_COUNT];
-extern u16 gCurrentMove;
-extern u8 gLastUsedAbility;
-extern u16 gBattleWeather;
-extern u8 gStringBank;
-extern u8 gEffectBank;
-extern u8 gAbsentBankFlags;
-extern u8 gMultiHitCounter;
-extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
-extern u16 gSideAffecting[2];
-extern u16 gPauseCounterBattle;
-extern u16 gPaydayMoney;
-extern u16 gRandomTurnNumber;
-extern u8 gBattleOutcome;
-extern u8 gBattleTerrain;
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-extern const u8* gBattlescriptCurrInstr;
-extern u8 gCurrMovePos;
-extern u8 gCurrentActionFuncId;
-extern u32 gHitMarker;
-extern u8 gBattleMoveFlags;
-extern u8 gBattleCommunication[];
-extern u16 gUnknown_02024250[4];
-extern u16 gUnknown_02024258[4];
-extern u16 gUnknown_02024260[4];
-extern u8 gUnknown_02024270[4];
-extern u8 gStringBank;
-extern u16 gDynamicBasePower;
-extern u16 gLastUsedItem;
-extern u16 gBattleMovePower;
-extern s32 gHpDealt;
-extern s32 gTakenDmg[BATTLE_BANKS_COUNT];
-extern u8 gTakenDmgBanks[BATTLE_BANKS_COUNT];
-extern u8 gSentPokesToOpponent[2];
-extern u8 gBank1;
-extern u16 gExpShareExp;
-extern u8 gLeveledUpInBattle;
-extern void (*gBattleMainFunc)(void);
-extern u8 gPlayerPartyCount;
-extern u16 gMoveToLearn;
-extern u16 gRandomMove;
-extern u8 gBankInMenu;
-extern u8 gActionForBanks[BATTLE_BANKS_COUNT];
-extern u8 gCurrentTurnActionNumber;
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern u16 gLockedMoves[BATTLE_BANKS_COUNT];
-extern u16 gPartnerTrainerId;
-extern u16 gLastUsedMove;
-extern u16 gUnknownMovesUsedByBanks[BATTLE_BANKS_COUNT];
-extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT];
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
-extern u8 gUnknown_020241E9;
+#include "constants/battle_string_ids.h"
+#include "battle_setup.h"
+#include "overworld.h"
+#include "party_menu.h"
+
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
-extern struct MusicPlayerInfo gMPlay_BGM;
-
-struct TrainerMoney
-{
- u8 classId;
- u8 value;
-};
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
-extern const struct BattleMove gBattleMoves[];
-extern const struct BaseStats gBaseStats[];
-extern const u8 gTypeEffectiveness[336];
-extern const struct TrainerMoney gTrainerMoneyTable[];
extern const u8* const gBattleScriptsForMoveEffects[];
// functions
-extern void sub_81A5718(u8 bank); // battle frontier 2
+extern void sub_81A5718(u8 battlerId); // battle frontier 2
extern void sub_81A56B4(void); // battle frontier 2
extern void sub_81BFA38(struct Pokemon* party, u8 monPartyId, u8 monCount, void (*callback)(void), u16 move); // pokemon summary screen
extern u8 sub_81C1B94(void); // pokemon summary screen
-extern void IncrementGameStat(u8 statId); // rom_4
extern void sub_81D388C(struct Pokemon* mon, void* statStoreLocation); // pokenav.s
extern void sub_81D3640(u8 arg0, void* statStoreLocation1, void* statStoreLocation2, u8 arg3, u8 arg4, u8 arg5); // pokenav.s
extern void sub_81D3784(u8 arg0, void* statStoreLocation1, u8 arg2, u8 arg3, u8 arg4); // pokenav.s
@@ -136,119 +64,20 @@ extern u8* GetMonNickname(struct Pokemon* mon, u8* dst); // party_menu
extern u8 sub_81A5258(u8* arg0); // battle frontier 2
extern void sub_81A5BF8(void); // battle frontier 2
extern void sub_81A5D44(void); // battle frontier 2
-extern void sub_81B8E80(u8 bank, u8, u8); // party menu
+extern void sub_81B8E80(u8 battlerId, u8, u8); // party menu
extern bool8 sub_81B1250(void); // ?
extern bool8 InBattlePike(void);
extern bool8 InBattlePyramid(void);
extern u16 GetBattlePyramidPickupItemId(void);
-extern u8 sav1_map_get_light_level(void);
extern u8 sub_813B21C(void);
extern u16 get_unknown_box_id(void);
-extern void sub_80356D0(void);
-
-// BattleScripts
-extern const u8 BattleScript_MoveEnd[];
-extern const u8 BattleScript_NoPPForMove[];
-extern const u8 BattleScript_MagicCoatBounce[];
-extern const u8 BattleScript_TookAttack[];
-extern const u8 BattleScript_SnatchedMove[];
-extern const u8 BattleScript_Pausex20[];
-extern const u8 BattleScript_SubstituteFade[];
-extern const u8 BattleScript_HangedOnMsg[];
-extern const u8 BattleScript_OneHitKOMsg[];
-extern const u8 BattleScript_EnduredMsg[];
-extern const u8 BattleScript_PSNPrevention[];
-extern const u8 BattleScript_BRNPrevention[];
-extern const u8 BattleScript_PRLZPrevention[];
-extern const u8 BattleScript_FlinchPrevention[];
-extern const u8 BattleScript_StatUp[];
-extern const u8 BattleScript_StatDown[];
-extern const u8 BattleScript_NoItemSteal[];
-extern const u8 BattleScript_ItemSteal[];
-extern const u8 BattleScript_RapidSpinAway[];
-extern const u8 BattleScript_TargetPRLZHeal[];
-extern const u8 BattleScript_KnockedOff[];
-extern const u8 BattleScript_StickyHoldActivates[];
-extern const u8 BattleScript_AllStatsUp[];
-extern const u8 BattleScript_AtkDefDown[];
-extern const u8 BattleScript_SAtkDown2[];
-extern const u8 BattleScript_LevelUp[];
-extern const u8 BattleScript_WrapFree[];
-extern const u8 BattleScript_LeechSeedFree[];
-extern const u8 BattleScript_SpikesFree[];
-extern const u8 BattleScript_ButItFailed[];
-extern const u8 BattleScript_ObliviousPreventsAttraction[];
-extern const u8 BattleScript_MistProtected[];
-extern const u8 BattleScript_AbilityNoStatLoss[];
-extern const u8 BattleScript_AbilityNoSpecificStatLoss[];
-extern const u8 BattleScript_TrainerBallBlock[];
-extern const u8 BattleScript_WallyBallThrow[];
-extern const u8 BattleScript_SuccessBallThrow[];
-extern const u8 BattleScript_ShakeBallThrow[];
-extern const u8 BattleScript_FaintAttacker[];
-extern const u8 BattleScript_FaintTarget[];
-extern const u8 BattleScript_DestinyBondTakesLife[];
-extern const u8 BattleScript_GrudgeTakesPp[];
-extern const u8 BattleScript_RageIsBuilding[];
-extern const u8 BattleScript_DefrostedViaFireMove[];
-extern const u8 gUnknown_082DB87D[];
-extern const u8 gUnknown_082DAE90[];
-extern const u8 gUnknown_082DAE59[];
-extern const u8 gUnknown_082DAEC7[];
-extern const u8 BattleScript_MoveEffectSleep[];
-extern const u8 BattleScript_MoveEffectPoison[];
-extern const u8 BattleScript_MoveEffectBurn[];
-extern const u8 BattleScript_MoveEffectFreeze[];
-extern const u8 BattleScript_MoveEffectParalysis[];
-extern const u8 BattleScript_MoveEffectToxic[];
-extern const u8 BattleScript_MoveEffectConfusion[];
-extern const u8 BattleScript_MoveEffectUproar[];
-extern const u8 BattleScript_MoveEffectPayDay[];
-extern const u8 BattleScript_MoveEffectWrap[];
-extern const u8 BattleScript_MoveEffectRecoil33[];
-extern const u8 BattleScript_DampStopsExplosion[];
-extern const u8 BattleScript_MistProtected[];
-extern const u8 BattleScript_AbilityNoStatLoss[];
-extern const u8 BattleScript_AbilityNoSpecificStatLoss[];
-extern const u8 BattleScript_ButItFailed[];
-extern const u8 gUnknown_082DADD8[];
-extern const u8 BattleScript_PrintPayDayMoneyString[];
-extern const u8 BattleScript_SturdyPreventsOHKO[];
-extern const u8 BattleScript_ObliviousPreventsAttraction[];
-extern const u8 BattleScript_PauseEffectivenessSoundResultMsgEndMove[];
-extern const u8 BattleScript_CastformChange[];
-extern const u8 BattleScript_TrainerBallBlock[];
-extern const u8 BattleScript_WallyBallThrow[];
-extern const u8 BattleScript_SuccessBallThrow[];
-extern const u8 BattleScript_ShakeBallThrow[];
-extern const u8 BattleScript_PresentDamageTarget[];
-extern const u8 BattleScript_AlreadyAtFullHp[];
-extern const u8 BattleScript_PresentHealTarget[];
-extern const u8 BattleScript_WrapFree[];
-extern const u8 BattleScript_LeechSeedFree[];
-extern const u8 BattleScript_SpikesFree[];
-
-// strings
-extern const u8 gText_BattleYesNoChoice[];
-
-// read via orr
-#define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
-#define BSScriptRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
-#define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr))
-
-// read via add
-#define BS2ScriptRead32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
-#define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8))
-#define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr))
-
-#define TARGET_PROTECT_AFFECTED ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED))
-
-#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)))
+
+#define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED))
// this file's functions
static bool8 IsTwoTurnsMove(u16 move);
-static void DestinyBondFlagUpdate(void);
-static u8 AttacksThisTurn(u8 bank, u16 move); // Note: returns 1 if it's a charging turn, otherwise 2.
+static void TrySetDestinyBondToHappen(void);
+static u8 AttacksThisTurn(u8 battlerId, u16 move); // Note: returns 1 if it's a charging turn, otherwise 2.
static void CheckWonderGuardAndLevitate(void);
static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8, const u8* BS_ptr);
static bool32 IsMonGettingExpSentOut(void);
@@ -267,41 +96,41 @@ static void atk01_accuracycheck(void);
static void atk02_attackstring(void);
static void atk03_ppreduce(void);
static void atk04_critcalc(void);
-static void atk05_damagecalc1(void);
+static void atk05_damagecalc(void);
static void atk06_typecalc(void);
-static void atk07_dmg_adjustment(void);
-static void atk08_dmg_adjustment2(void);
+static void atk07_adjustnormaldamage(void);
+static void atk08_adjustnormaldamage2(void);
static void atk09_attackanimation(void);
static void atk0A_waitanimation(void);
static void atk0B_healthbarupdate(void);
static void atk0C_datahpupdate(void);
static void atk0D_critmessage(void);
-static void atk0E_effectiveness_sound(void);
+static void atk0E_effectivenesssound(void);
static void atk0F_resultmessage(void);
static void atk10_printstring(void);
-static void atk11_printstring_playeronly(void);
+static void atk11_printselectionstring(void);
static void atk12_waitmessage(void);
static void atk13_printfromtable(void);
-static void atk14_printfromtable_playeronly(void);
+static void atk14_printselectionstringfromtable(void);
static void atk15_seteffectwithchance(void);
static void atk16_seteffectprimary(void);
static void atk17_seteffectsecondary(void);
-static void atk18_status_effect_clear(void);
-static void atk19_faint_pokemon(void);
-static void atk1A_faint_animation(void);
-static void atk1B_faint_effects_clear(void);
+static void atk18_clearstatusfromeffect(void);
+static void atk19_tryfaintmon(void);
+static void atk1A_dofaintanimation(void);
+static void atk1B_cleareffectsonfaint(void);
static void atk1C_jumpifstatus(void);
static void atk1D_jumpifstatus2(void);
static void atk1E_jumpifability(void);
static void atk1F_jumpifsideaffecting(void);
static void atk20_jumpifstat(void);
-static void atk21_jumpifstatus3(void);
+static void atk21_jumpifstatus3condition(void);
static void atk22_jumpiftype(void);
static void atk23_getexp(void);
static void atk24(void);
-static void atk25_move_values_cleanup(void);
-static void atk26_set_multihit(void);
-static void atk27_decrement_multihit(void);
+static void atk25_movevaluescleanup(void);
+static void atk26_setmultihit(void);
+static void atk27_decrementmultihit(void);
static void atk28_goto(void);
static void atk29_jumpifbyte(void);
static void atk2A_jumpifhalfword(void);
@@ -312,7 +141,7 @@ static void atk2E_setbyte(void);
static void atk2F_addbyte(void);
static void atk30_subbyte(void);
static void atk31_copyarray(void);
-static void atk32_copyarray_withindex(void);
+static void atk32_copyarraywithindex(void);
static void atk33_orbyte(void);
static void atk34_orhalfword(void);
static void atk35_orword(void);
@@ -326,75 +155,75 @@ static void atk3C_return(void);
static void atk3D_end(void);
static void atk3E_end2(void);
static void atk3F_end3(void);
-static void atk40_jump_if_move_affected_by_protect(void);
+static void atk40_jumpifaffectedbyprotect(void);
static void atk41_call(void);
static void atk42_jumpiftype2(void);
static void atk43_jumpifabilitypresent(void);
-static void atk44_end_selection_script(void);
+static void atk44_endselectionscript(void);
static void atk45_playanimation(void);
static void atk46_playanimation2(void);
static void atk47_setgraphicalstatchangevalues(void);
static void atk48_playstatchangeanimation(void);
static void atk49_moveend(void);
static void atk4A_typecalc2(void);
-static void atk4B_return_atk_to_ball(void);
-static void atk4C_get_switched_mon_data(void);
-static void atk4D_switch_data_update(void);
-static void atk4E_switchin_anim(void);
-static void atk4F_jump_if_cannot_switch(void);
+static void atk4B_returnatktoball(void);
+static void atk4C_getswitchedmondata(void);
+static void atk4D_switchindataupdate(void);
+static void atk4E_switchinanim(void);
+static void atk4F_jumpifcantswitch(void);
static void atk50_openpartyscreen(void);
-static void atk51_switch_handle_order(void);
-static void atk52_switch_in_effects(void);
-static void atk53_trainer_slide(void);
-static void atk54_effectiveness_sound(void);
-static void atk55_play_fanfare(void);
-static void atk56_fainting_cry(void);
+static void atk51_switchhandleorder(void);
+static void atk52_switchineffects(void);
+static void atk53_trainerslidein(void);
+static void atk54_playse(void);
+static void atk55_fanfare(void);
+static void atk56_playfaintcry(void);
static void atk57(void);
-static void atk58_return_to_ball(void);
-static void atk59_learnmove_inbattle(void);
+static void atk58_returntoball(void);
+static void atk59_handlelearnnewmove(void);
static void atk5A_yesnoboxlearnmove(void);
static void atk5B_yesnoboxstoplearningmove(void);
static void atk5C_hitanimation(void);
static void atk5D_getmoneyreward(void);
-static void atk5E_8025A70(void);
-static void atk5F_8025B24(void);
-static void atk60_increment_gamestat(void);
-static void atk61_draw_party_status_summary(void);
-static void atk62_08025C6C(void);
+static void atk5E(void);
+static void atk5F_swapattackerwithtarget(void);
+static void atk60_incrementgamestat(void);
+static void atk61_drawpartystatussummary(void);
+static void atk62_hidepartystatussummary(void);
static void atk63_jumptorandomattack(void);
static void atk64_statusanimation(void);
static void atk65_status2animation(void);
static void atk66_chosenstatusanimation(void);
static void atk67_yesnobox(void);
-static void atk68_cancel_everyones_actions(void);
-static void atk69_dmg_adjustment3(void);
+static void atk68_cancelallactions(void);
+static void atk69_adjustsetdamage(void);
static void atk6A_removeitem(void);
static void atk6B_atknameinbuff1(void);
-static void atk6C_draw_lvlupbox(void);
-static void atk6D_reset_sentpokes_value(void);
-static void atk6E_set_atk_to_player0(void);
-static void atk6F_set_visible(void);
-static void atk70_record_last_used_ability(void);
-static void atk71_buffer_move_to_learn(void);
-static void atk72_jump_if_run_attempt_success(void);
-static void atk73_hp_thresholds(void);
-static void atk74_hp_thresholds2(void);
-static void atk75_item_effect_on_opponent(void);
+static void atk6C_drawlvlupbox(void);
+static void atk6D_resetsentmonsvalue(void);
+static void atk6E_setatktoplayer0(void);
+static void atk6F_makevisible(void);
+static void atk70_recordlastability(void);
+static void atk71_buffermovetolearn(void);
+static void atk72_jumpifplayerran(void);
+static void atk73_hpthresholds(void);
+static void atk74_hpthresholds2(void);
+static void atk75_useitemonopponent(void);
static void atk76_various(void);
-static void atk77_set_protect_like(void);
+static void atk77_setprotectlike(void);
static void atk78_faintifabilitynotdamp(void);
static void atk79_setatkhptozero(void);
-static void atk7A_jumpwhiletargetvalid(void);
-static void atk7B_healhalfHP_if_possible(void);
+static void atk7A_jumpifnexttargetvalid(void);
+static void atk7B_tryhealhalfhealth(void);
static void atk7C_trymirrormove(void);
-static void atk7D_set_rain(void);
+static void atk7D_setrain(void);
static void atk7E_setreflect(void);
static void atk7F_setseeded(void);
static void atk80_manipulatedamage(void);
-static void atk81_setrest(void);
+static void atk81_trysetrest(void);
static void atk82_jumpifnotfirstturn(void);
static void atk83_nop(void);
-static void atk84_jump_if_cant_sleep(void);
+static void atk84_jumpifcantmakeasleep(void);
static void atk85_stockpile(void);
static void atk86_stockpiletobasedamage(void);
static void atk87_stockpiletohpheal(void);
@@ -403,22 +232,22 @@ static void atk89_statbuffchange(void);
static void atk8A_normalisebuffs(void);
static void atk8B_setbide(void);
static void atk8C_confuseifrepeatingattackends(void);
-static void atk8D_setmultihit_counter(void);
-static void atk8E_init_multihit_string(void);
+static void atk8D_setmultihitcounter(void);
+static void atk8E_initmultihitstring(void);
static void atk8F_forcerandomswitch(void);
-static void atk90_conversion_type_change(void);
+static void atk90_tryconversiontypechange(void);
static void atk91_givepaydaymoney(void);
static void atk92_setlightscreen(void);
-static void atk93_ko_move(void);
+static void atk93_tryKO(void);
static void atk94_damagetohalftargethp(void);
static void atk95_setsandstorm(void);
static void atk96_weatherdamage(void);
-static void atk97_try_infatuation(void);
-static void atk98_status_icon_update(void);
+static void atk97_tryinfatuating(void);
+static void atk98_updatestatusicon(void);
static void atk99_setmist(void);
-static void atk9A_set_focusenergy(void);
+static void atk9A_setfocusenergy(void);
static void atk9B_transformdataexecution(void);
-static void atk9C_set_substitute(void);
+static void atk9C_setsubstitute(void);
static void atk9D_mimicattackcopy(void);
static void atk9E_metronome(void);
static void atk9F_dmgtolevel(void);
@@ -426,39 +255,39 @@ static void atkA0_psywavedamageeffect(void);
static void atkA1_counterdamagecalculator(void);
static void atkA2_mirrorcoatdamagecalculator(void);
static void atkA3_disablelastusedattack(void);
-static void atkA4_setencore(void);
+static void atkA4_trysetencore(void);
static void atkA5_painsplitdmgcalc(void);
static void atkA6_settypetorandomresistance(void);
static void atkA7_setalwayshitflag(void);
static void atkA8_copymovepermanently(void);
-static void atkA9_sleeptalk_choose_move(void);
-static void atkAA_set_destinybond(void);
-static void atkAB_DestinyBondFlagUpdate(void);
+static void atkA9_trychoosesleeptalkmove(void);
+static void atkAA_setdestinybond(void);
+static void atkAB_trysetdestinybondtohappen(void);
static void atkAC_remaininghptopower(void);
-static void atkAD_spite_ppreduce(void);
-static void atkAE_heal_party_status(void);
+static void atkAD_tryspiteppreduce(void);
+static void atkAE_healpartystatus(void);
static void atkAF_cursetarget(void);
-static void atkB0_set_spikes(void);
-static void atkB1_set_foresight(void);
-static void atkB2_setperishsong(void);
+static void atkB0_trysetspikes(void);
+static void atkB1_setforesight(void);
+static void atkB2_trysetperishsong(void);
static void atkB3_rolloutdamagecalculation(void);
static void atkB4_jumpifconfusedandstatmaxed(void);
static void atkB5_furycuttercalc(void);
static void atkB6_happinesstodamagecalculation(void);
static void atkB7_presentdamagecalculation(void);
-static void atkB8_set_safeguard(void);
+static void atkB8_setsafeguard(void);
static void atkB9_magnitudedamagecalculation(void);
static void atkBA_jumpifnopursuitswitchdmg(void);
static void atkBB_setsunny(void);
static void atkBC_maxattackhalvehp(void);
static void atkBD_copyfoestats(void);
static void atkBE_rapidspinfree(void);
-static void atkBF_set_defense_curl(void);
+static void atkBF_setdefensecurlbit(void);
static void atkC0_recoverbasedonsunlight(void);
-static void atkC1_hidden_power_calc(void);
-static void atkC2_selectnexttarget(void);
-static void atkC3_setfutureattack(void);
-static void atkC4_beat_up(void);
+static void atkC1_hiddenpowercalc(void);
+static void atkC2_selectfirstvalidtarget(void);
+static void atkC3_trysetfutureattack(void);
+static void atkC4_trydobeatup(void);
static void atkC5_setsemiinvulnerablebit(void);
static void atkC6_clearsemiinvulnerablebit(void);
static void atkC7_setminimize(void);
@@ -471,46 +300,46 @@ static void atkCD_cureifburnedparalysedorpoisoned(void);
static void atkCE_settorment(void);
static void atkCF_jumpifnodamage(void);
static void atkD0_settaunt(void);
-static void atkD1_set_helpinghand(void);
-static void atkD2_swap_items(void);
-static void atkD3_copy_ability(void);
-static void atkD4_wish_effect(void);
-static void atkD5_setroots(void);
+static void atkD1_trysethelpinghand(void);
+static void atkD2_tryswapitems(void);
+static void atkD3_trycopyability(void);
+static void atkD4_trywish(void);
+static void atkD5_trysetroots(void);
static void atkD6_doubledamagedealtifdamaged(void);
static void atkD7_setyawn(void);
static void atkD8_setdamagetohealthdifference(void);
static void atkD9_scaledamagebyhealthratio(void);
-static void atkDA_abilityswap(void);
-static void atkDB_imprisoneffect(void);
-static void atkDC_setgrudge(void);
+static void atkDA_tryswapabilities(void);
+static void atkDB_tryimprision(void);
+static void atkDC_trysetgrudge(void);
static void atkDD_weightdamagecalculation(void);
static void atkDE_asistattackselect(void);
-static void atkDF_setmagiccoat(void);
-static void atkE0_setstealstatchange(void);
-static void atkE1_intimidate_string_loader(void);
-static void atkE2_switchout_abilities(void);
+static void atkDF_trysetmagiccoat(void);
+static void atkE0_trysetsnatch(void);
+static void atkE1_trygetintimidatetarget(void);
+static void atkE2_switchoutabilities(void);
static void atkE3_jumpifhasnohp(void);
static void atkE4_getsecretpowereffect(void);
static void atkE5_pickup(void);
-static void atkE6_castform_change_animation(void);
-static void atkE7_castform_data_change(void);
+static void atkE6_docastformchangeanimation(void);
+static void atkE7_trycastformdatachange(void);
static void atkE8_settypebasedhalvers(void);
static void atkE9_setweatherballtype(void);
-static void atkEA_recycleitem(void);
+static void atkEA_tryrecycleitem(void);
static void atkEB_settypetoterrain(void);
-static void atkEC_pursuit_sth(void);
-static void atkED_802B4B4(void);
+static void atkEC_pursuitrelated(void);
+static void atkEF_snatchsetbattlers(void);
static void atkEE_removelightscreenreflect(void);
-static void atkEF_pokeball_catch_calculation(void);
-static void atkF0_give_caught_mon(void);
-static void atkF1_set_caught_mon_dex_flags(void);
-static void atkF2_display_dex_info(void);
-static void atkF3_nickname_caught_poke(void);
+static void atkEF_handleballthrow(void);
+static void atkF0_givecaughtmon(void);
+static void atkF1_trysetcaughtmondexflags(void);
+static void atkF2_displaydexinfo(void);
+static void atkF3_trygivecaughtmonnick(void);
static void atkF4_subattackerhpbydmg(void);
static void atkF5_removeattackerstatus1(void);
-static void atkF6_action_finished(void);
-static void atkF7_turn_finished(void);
-static void atkF8_trainer_slide_back(void);
+static void atkF6_finishaction(void);
+static void atkF7_finishturn(void);
+static void atkF8_trainerslideout(void);
void (* const gBattleScriptingCommandsTable[])(void) =
{
@@ -519,41 +348,41 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atk02_attackstring,
atk03_ppreduce,
atk04_critcalc,
- atk05_damagecalc1,
+ atk05_damagecalc,
atk06_typecalc,
- atk07_dmg_adjustment,
- atk08_dmg_adjustment2,
+ atk07_adjustnormaldamage,
+ atk08_adjustnormaldamage2,
atk09_attackanimation,
atk0A_waitanimation,
atk0B_healthbarupdate,
atk0C_datahpupdate,
atk0D_critmessage,
- atk0E_effectiveness_sound,
+ atk0E_effectivenesssound,
atk0F_resultmessage,
atk10_printstring,
- atk11_printstring_playeronly,
+ atk11_printselectionstring,
atk12_waitmessage,
atk13_printfromtable,
- atk14_printfromtable_playeronly,
+ atk14_printselectionstringfromtable,
atk15_seteffectwithchance,
atk16_seteffectprimary,
atk17_seteffectsecondary,
- atk18_status_effect_clear,
- atk19_faint_pokemon,
- atk1A_faint_animation,
- atk1B_faint_effects_clear,
+ atk18_clearstatusfromeffect,
+ atk19_tryfaintmon,
+ atk1A_dofaintanimation,
+ atk1B_cleareffectsonfaint,
atk1C_jumpifstatus,
atk1D_jumpifstatus2,
atk1E_jumpifability,
atk1F_jumpifsideaffecting,
atk20_jumpifstat,
- atk21_jumpifstatus3,
+ atk21_jumpifstatus3condition,
atk22_jumpiftype,
atk23_getexp,
atk24,
- atk25_move_values_cleanup,
- atk26_set_multihit,
- atk27_decrement_multihit,
+ atk25_movevaluescleanup,
+ atk26_setmultihit,
+ atk27_decrementmultihit,
atk28_goto,
atk29_jumpifbyte,
atk2A_jumpifhalfword,
@@ -564,7 +393,7 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atk2F_addbyte,
atk30_subbyte,
atk31_copyarray,
- atk32_copyarray_withindex,
+ atk32_copyarraywithindex,
atk33_orbyte,
atk34_orhalfword,
atk35_orword,
@@ -578,75 +407,75 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atk3D_end,
atk3E_end2,
atk3F_end3,
- atk40_jump_if_move_affected_by_protect,
+ atk40_jumpifaffectedbyprotect,
atk41_call,
atk42_jumpiftype2,
atk43_jumpifabilitypresent,
- atk44_end_selection_script,
+ atk44_endselectionscript,
atk45_playanimation,
atk46_playanimation2,
atk47_setgraphicalstatchangevalues,
atk48_playstatchangeanimation,
atk49_moveend,
atk4A_typecalc2,
- atk4B_return_atk_to_ball,
- atk4C_get_switched_mon_data,
- atk4D_switch_data_update,
- atk4E_switchin_anim,
- atk4F_jump_if_cannot_switch,
+ atk4B_returnatktoball,
+ atk4C_getswitchedmondata,
+ atk4D_switchindataupdate,
+ atk4E_switchinanim,
+ atk4F_jumpifcantswitch,
atk50_openpartyscreen,
- atk51_switch_handle_order,
- atk52_switch_in_effects,
- atk53_trainer_slide,
- atk54_effectiveness_sound,
- atk55_play_fanfare,
- atk56_fainting_cry,
+ atk51_switchhandleorder,
+ atk52_switchineffects,
+ atk53_trainerslidein,
+ atk54_playse,
+ atk55_fanfare,
+ atk56_playfaintcry,
atk57,
- atk58_return_to_ball,
- atk59_learnmove_inbattle,
+ atk58_returntoball,
+ atk59_handlelearnnewmove,
atk5A_yesnoboxlearnmove,
atk5B_yesnoboxstoplearningmove,
atk5C_hitanimation,
atk5D_getmoneyreward,
- atk5E_8025A70,
- atk5F_8025B24,
- atk60_increment_gamestat,
- atk61_draw_party_status_summary,
- atk62_08025C6C,
+ atk5E,
+ atk5F_swapattackerwithtarget,
+ atk60_incrementgamestat,
+ atk61_drawpartystatussummary,
+ atk62_hidepartystatussummary,
atk63_jumptorandomattack,
atk64_statusanimation,
atk65_status2animation,
atk66_chosenstatusanimation,
atk67_yesnobox,
- atk68_cancel_everyones_actions,
- atk69_dmg_adjustment3,
+ atk68_cancelallactions,
+ atk69_adjustsetdamage,
atk6A_removeitem,
atk6B_atknameinbuff1,
- atk6C_draw_lvlupbox,
- atk6D_reset_sentpokes_value,
- atk6E_set_atk_to_player0,
- atk6F_set_visible,
- atk70_record_last_used_ability,
- atk71_buffer_move_to_learn,
- atk72_jump_if_run_attempt_success,
- atk73_hp_thresholds,
- atk74_hp_thresholds2,
- atk75_item_effect_on_opponent,
+ atk6C_drawlvlupbox,
+ atk6D_resetsentmonsvalue,
+ atk6E_setatktoplayer0,
+ atk6F_makevisible,
+ atk70_recordlastability,
+ atk71_buffermovetolearn,
+ atk72_jumpifplayerran,
+ atk73_hpthresholds,
+ atk74_hpthresholds2,
+ atk75_useitemonopponent,
atk76_various,
- atk77_set_protect_like,
+ atk77_setprotectlike,
atk78_faintifabilitynotdamp,
atk79_setatkhptozero,
- atk7A_jumpwhiletargetvalid,
- atk7B_healhalfHP_if_possible,
+ atk7A_jumpifnexttargetvalid,
+ atk7B_tryhealhalfhealth,
atk7C_trymirrormove,
- atk7D_set_rain,
+ atk7D_setrain,
atk7E_setreflect,
atk7F_setseeded,
atk80_manipulatedamage,
- atk81_setrest,
+ atk81_trysetrest,
atk82_jumpifnotfirstturn,
atk83_nop,
- atk84_jump_if_cant_sleep,
+ atk84_jumpifcantmakeasleep,
atk85_stockpile,
atk86_stockpiletobasedamage,
atk87_stockpiletohpheal,
@@ -655,22 +484,22 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atk8A_normalisebuffs,
atk8B_setbide,
atk8C_confuseifrepeatingattackends,
- atk8D_setmultihit_counter,
- atk8E_init_multihit_string,
+ atk8D_setmultihitcounter,
+ atk8E_initmultihitstring,
atk8F_forcerandomswitch,
- atk90_conversion_type_change,
+ atk90_tryconversiontypechange,
atk91_givepaydaymoney,
atk92_setlightscreen,
- atk93_ko_move,
+ atk93_tryKO,
atk94_damagetohalftargethp,
atk95_setsandstorm,
atk96_weatherdamage,
- atk97_try_infatuation,
- atk98_status_icon_update,
+ atk97_tryinfatuating,
+ atk98_updatestatusicon,
atk99_setmist,
- atk9A_set_focusenergy,
+ atk9A_setfocusenergy,
atk9B_transformdataexecution,
- atk9C_set_substitute,
+ atk9C_setsubstitute,
atk9D_mimicattackcopy,
atk9E_metronome,
atk9F_dmgtolevel,
@@ -678,39 +507,39 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atkA1_counterdamagecalculator,
atkA2_mirrorcoatdamagecalculator,
atkA3_disablelastusedattack,
- atkA4_setencore,
+ atkA4_trysetencore,
atkA5_painsplitdmgcalc,
atkA6_settypetorandomresistance,
atkA7_setalwayshitflag,
atkA8_copymovepermanently,
- atkA9_sleeptalk_choose_move,
- atkAA_set_destinybond,
- atkAB_DestinyBondFlagUpdate,
+ atkA9_trychoosesleeptalkmove,
+ atkAA_setdestinybond,
+ atkAB_trysetdestinybondtohappen,
atkAC_remaininghptopower,
- atkAD_spite_ppreduce,
- atkAE_heal_party_status,
+ atkAD_tryspiteppreduce,
+ atkAE_healpartystatus,
atkAF_cursetarget,
- atkB0_set_spikes,
- atkB1_set_foresight,
- atkB2_setperishsong,
+ atkB0_trysetspikes,
+ atkB1_setforesight,
+ atkB2_trysetperishsong,
atkB3_rolloutdamagecalculation,
atkB4_jumpifconfusedandstatmaxed,
atkB5_furycuttercalc,
atkB6_happinesstodamagecalculation,
atkB7_presentdamagecalculation,
- atkB8_set_safeguard,
+ atkB8_setsafeguard,
atkB9_magnitudedamagecalculation,
atkBA_jumpifnopursuitswitchdmg,
atkBB_setsunny,
atkBC_maxattackhalvehp,
atkBD_copyfoestats,
atkBE_rapidspinfree,
- atkBF_set_defense_curl,
+ atkBF_setdefensecurlbit,
atkC0_recoverbasedonsunlight,
- atkC1_hidden_power_calc,
- atkC2_selectnexttarget,
- atkC3_setfutureattack,
- atkC4_beat_up,
+ atkC1_hiddenpowercalc,
+ atkC2_selectfirstvalidtarget,
+ atkC3_trysetfutureattack,
+ atkC4_trydobeatup,
atkC5_setsemiinvulnerablebit,
atkC6_clearsemiinvulnerablebit,
atkC7_setminimize,
@@ -723,46 +552,46 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atkCE_settorment,
atkCF_jumpifnodamage,
atkD0_settaunt,
- atkD1_set_helpinghand,
- atkD2_swap_items,
- atkD3_copy_ability,
- atkD4_wish_effect,
- atkD5_setroots,
+ atkD1_trysethelpinghand,
+ atkD2_tryswapitems,
+ atkD3_trycopyability,
+ atkD4_trywish,
+ atkD5_trysetroots,
atkD6_doubledamagedealtifdamaged,
atkD7_setyawn,
atkD8_setdamagetohealthdifference,
atkD9_scaledamagebyhealthratio,
- atkDA_abilityswap,
- atkDB_imprisoneffect,
- atkDC_setgrudge,
+ atkDA_tryswapabilities,
+ atkDB_tryimprision,
+ atkDC_trysetgrudge,
atkDD_weightdamagecalculation,
atkDE_asistattackselect,
- atkDF_setmagiccoat,
- atkE0_setstealstatchange,
- atkE1_intimidate_string_loader,
- atkE2_switchout_abilities,
+ atkDF_trysetmagiccoat,
+ atkE0_trysetsnatch,
+ atkE1_trygetintimidatetarget,
+ atkE2_switchoutabilities,
atkE3_jumpifhasnohp,
atkE4_getsecretpowereffect,
atkE5_pickup,
- atkE6_castform_change_animation,
- atkE7_castform_data_change,
+ atkE6_docastformchangeanimation,
+ atkE7_trycastformdatachange,
atkE8_settypebasedhalvers,
atkE9_setweatherballtype,
- atkEA_recycleitem,
+ atkEA_tryrecycleitem,
atkEB_settypetoterrain,
- atkEC_pursuit_sth,
- atkED_802B4B4,
+ atkEC_pursuitrelated,
+ atkEF_snatchsetbattlers,
atkEE_removelightscreenreflect,
- atkEF_pokeball_catch_calculation,
- atkF0_give_caught_mon,
- atkF1_set_caught_mon_dex_flags,
- atkF2_display_dex_info,
- atkF3_nickname_caught_poke,
+ atkEF_handleballthrow,
+ atkF0_givecaughtmon,
+ atkF1_trysetcaughtmondexflags,
+ atkF2_displaydexinfo,
+ atkF3_trygivecaughtmonnick,
atkF4_subattackerhpbydmg,
atkF5_removeattackerstatus1,
- atkF6_action_finished,
- atkF7_turn_finished,
- atkF8_trainer_slide_back
+ atkF6_finishaction,
+ atkF7_finishturn,
+ atkF8_trainerslideout
};
struct StatFractions
@@ -794,12 +623,12 @@ static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
static const u32 sStatusFlagsForMoveEffects[] =
{
0x00000000,
- STATUS_SLEEP,
- STATUS_POISON,
- STATUS_BURN,
- STATUS_FREEZE,
- STATUS_PARALYSIS,
- STATUS_TOXIC_POISON,
+ STATUS1_SLEEP,
+ STATUS1_POISON,
+ STATUS1_BURN,
+ STATUS1_FREEZE,
+ STATUS1_PARALYSIS,
+ STATUS1_TOXIC_POISON,
STATUS2_CONFUSION,
STATUS2_FLINCHED,
0x00000000,
@@ -1035,11 +864,11 @@ static const u16 sRarePickupItems[] =
ITEM_FULL_RESTORE,
ITEM_ETHER,
ITEM_WHITE_HERB,
- ITEM_TM44,
+ ITEM_TM44_REST,
ITEM_ELIXIR,
- ITEM_TM01,
+ ITEM_TM01_FOCUS_PUNCH,
ITEM_LEFTOVERS,
- ITEM_TM26,
+ ITEM_TM26_EARTHQUAKE,
};
static const u8 sPickupProbabilities[] =
@@ -1109,10 +938,10 @@ static void atk00_attackcanceler(void)
if (gBattleOutcome != 0)
{
- gCurrentActionFuncId = ACTION_FINISHED;
+ gCurrentActionFuncId = B_ACTION_FINISHED;
return;
}
- if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING))
+ if (gBattleMons[gBattlerAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING))
{
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
gBattlescriptCurrInstr = BattleScript_MoveEnd;
@@ -1120,21 +949,21 @@ static void atk00_attackcanceler(void)
}
if (AtkCanceller_UnableToUseMove())
return;
- if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBankTarget, 0, 0, 0))
+ if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0))
return;
- if (!gBattleMons[gBankAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200)
- && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS))
+ if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200)
+ && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))
{
gBattlescriptCurrInstr = BattleScript_NoPPForMove;
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
return;
}
gHitMarker &= ~(HITMARKER_x800000);
- if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS))
+ if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))
{
- i = IsPokeDisobedient(); // why use the 'i' variable...?
+ i = IsMonDisobedient(); // why use the 'i' variable...?
switch (i)
{
case 0:
@@ -1143,51 +972,51 @@ static void atk00_attackcanceler(void)
gHitMarker |= HITMARKER_OBEYS;
return;
default:
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
return;
}
}
gHitMarker |= HITMARKER_OBEYS;
- if (gProtectStructs[gBankTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED)
+ if (gProtectStructs[gBattlerTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED)
{
- PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT);
- gProtectStructs[gBankTarget].bounceMove = 0;
+ PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT);
+ gProtectStructs[gBattlerTarget].bounceMove = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MagicCoatBounce;
return;
}
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED)
+ if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED)
{
- PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH);
- gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0;
- gBattleScripting.bank = gBanksByTurnOrder[i];
+ PressurePPLose(gBattlerAttacker, gBattlerByTurnOrder[i], MOVE_SNATCH);
+ gProtectStructs[gBattlerByTurnOrder[i]].stealMove = 0;
+ gBattleScripting.battler = gBattlerByTurnOrder[i];
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SnatchedMove;
return;
}
}
- if (gSpecialStatuses[gBankTarget].lightningRodRedirected)
+ if (gSpecialStatuses[gBattlerTarget].lightningRodRedirected)
{
- gSpecialStatuses[gBankTarget].lightningRodRedirected = 0;
+ gSpecialStatuses[gBattlerTarget].lightningRodRedirected = 0;
gLastUsedAbility = ABILITY_LIGHTNING_ROD;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_TookAttack;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
- else if (TARGET_PROTECT_AFFECTED
- && (gCurrentMove != MOVE_CURSE || (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST))
- && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS))))
+ else if (DEFENDER_IS_PROTECTED
+ && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))
+ && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))))
{
- CancelMultiTurnMoves(gBankAttacker);
- gBattleMoveFlags |= MOVESTATUS_MISSED;
- gUnknown_02024250[gBankTarget] = 0;
- gUnknown_02024258[gBankTarget] = 0;
+ CancelMultiTurnMoves(gBattlerAttacker);
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
+ gLastLandedMoves[gBattlerTarget] = 0;
+ gLastHitByType[gBattlerTarget] = 0;
gBattleCommunication[6] = 1;
gBattlescriptCurrInstr++;
}
@@ -1199,27 +1028,27 @@ static void atk00_attackcanceler(void)
static void JumpIfMoveFailed(u8 adder, u16 move)
{
- const void* BS_ptr = gBattlescriptCurrInstr + adder;
- if (gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ const u8 *BS_ptr = gBattlescriptCurrInstr + adder;
+ if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
{
- gUnknown_02024250[gBankTarget] = 0;
- gUnknown_02024258[gBankTarget] = 0;
- BS_ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gLastLandedMoves[gBattlerTarget] = 0;
+ gLastHitByType[gBattlerTarget] = 0;
+ BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- DestinyBondFlagUpdate();
- if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBankTarget, 0, 0, move))
+ TrySetDestinyBondToHappen();
+ if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, move))
return;
}
gBattlescriptCurrInstr = BS_ptr;
}
-static void atk40_jump_if_move_affected_by_protect(void)
+static void atk40_jumpifaffectedbyprotect(void)
{
- if (TARGET_PROTECT_AFFECTED)
+ if (DEFENDER_IS_PROTECTED)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
JumpIfMoveFailed(5, 0);
gBattleCommunication[6] = 1;
}
@@ -1232,9 +1061,9 @@ static void atk40_jump_if_move_affected_by_protect(void)
bool8 JumpIfMoveAffectedByProtect(u16 move)
{
bool8 affected = FALSE;
- if (TARGET_PROTECT_AFFECTED)
+ if (DEFENDER_IS_PROTECTED)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
JumpIfMoveFailed(7, move);
gBattleCommunication[6] = 1;
affected = TRUE;
@@ -1244,33 +1073,33 @@ bool8 JumpIfMoveAffectedByProtect(u16 move)
static bool8 AccuracyCalcHelper(u16 move)
{
- if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker)
+ if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker)
{
JumpIfMoveFailed(7, move);
return TRUE;
}
- if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBankTarget] & STATUS3_ON_AIR)
+ if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
JumpIfMoveFailed(7, move);
return TRUE;
}
gHitMarker &= ~HITMARKER_IGNORE_ON_AIR;
- if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBankTarget] & STATUS3_UNDERGROUND)
+ if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
JumpIfMoveFailed(7, move);
return TRUE;
}
gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND;
- if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBankTarget] & STATUS3_UNDERWATER)
+ if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
JumpIfMoveFailed(7, move);
return TRUE;
}
@@ -1289,20 +1118,20 @@ static bool8 AccuracyCalcHelper(u16 move)
static void atk01_accuracycheck(void)
{
- u16 move = BS2ScriptRead16(gBattlescriptCurrInstr + 5);
+ u16 move = T2_READ_16(gBattlescriptCurrInstr + 5);
- if (move == 0xFFFE || move == 0xFFFF)
+ if (move == NO_ACC_CALC || move == NO_ACC_CALC_CHECK_LOCK_ON)
{
- if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker)
+ if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && move == NO_ACC_CALC_CHECK_LOCK_ON && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker)
gBattlescriptCurrInstr += 7;
- else if (gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ else if (gStatuses3[gBattlerTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else if (!JumpIfMoveAffectedByProtect(0))
gBattlescriptCurrInstr += 7;
}
else
{
- u8 type, moveAcc, holdEffect, quality;
+ u8 type, moveAcc, holdEffect, param;
s8 buff;
u16 calc;
@@ -1316,15 +1145,15 @@ static void atk01_accuracycheck(void)
if (AccuracyCalcHelper(move))
return;
- if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)
{
- u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC];
+ u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC];
buff = acc;
}
else
{
- u8 acc = gBattleMons[gBankAttacker].statStages[STAT_STAGE_ACC];
- buff = acc + 6 - gBattleMons[gBankTarget].statStages[STAT_STAGE_EVASION];
+ u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC];
+ buff = acc + 6 - gBattleMons[gBattlerTarget].statStages[STAT_EVASION];
}
if (buff < 0)
@@ -1340,33 +1169,33 @@ static void atk01_accuracycheck(void)
calc = sAccuracyStageRatios[buff].dividend * moveAcc;
calc /= sAccuracyStageRatios[buff].divisor;
- if (gBattleMons[gBankAttacker].ability == ABILITY_COMPOUND_EYES)
+ if (gBattleMons[gBattlerAttacker].ability == ABILITY_COMPOUND_EYES)
calc = (calc * 130) / 100; // 1.3 compound eyes boost
- if (WEATHER_HAS_EFFECT && gBattleMons[gBankTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY)
+ if (WEATHER_HAS_EFFECT && gBattleMons[gBattlerTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY)
calc = (calc * 80) / 100; // 1.2 sand veil loss
- if (gBattleMons[gBankAttacker].ability == ABILITY_HUSTLE && type < 9)
+ if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_TYPE_PHYSICAL(type))
calc = (calc * 80) / 100; // 1.2 hustle loss
- if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
+ if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)
{
- holdEffect = gEnigmaBerries[gBankTarget].holdEffect;
- quality = gEnigmaBerries[gBankTarget].holdEffectParam;
+ holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;
+ param = gEnigmaBerries[gBattlerTarget].holdEffectParam;
}
else
{
- holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
- quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);
+ param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);
}
- gStringBank = gBankTarget;
+ gPotentialItemEffectBattler = gBattlerTarget;
if (holdEffect == HOLD_EFFECT_EVASION_UP)
- calc = (calc * (100 - quality)) / 100;
+ calc = (calc * (100 - param)) / 100;
// final calculation
if ((Random() % 100 + 1) > calc)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE &&
(gBattleMoves[move].target == MOVE_TARGET_BOTH || gBattleMoves[move].target == MOVE_TARGET_FOES_AND_ALLY))
gBattleCommunication[6] = 2;
@@ -1381,11 +1210,11 @@ static void atk01_accuracycheck(void)
static void atk02_attackstring(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED)))
{
- PrepareStringBattle(STRINGID_USEDMOVE, gBankAttacker);
+ PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker);
gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED;
}
gBattlescriptCurrInstr++;
@@ -1396,42 +1225,42 @@ static void atk03_ppreduce(void)
{
s32 ppToDeduct = 1;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- if (!gSpecialStatuses[gBankAttacker].flag20)
+ if (!gSpecialStatuses[gBattlerAttacker].flag20)
{
switch (gBattleMoves[gCurrentMove].target)
{
case MOVE_TARGET_FOES_AND_ALLY:
- ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBankAttacker, ABILITY_PRESSURE, 0, 0);
+ ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBattlerAttacker, ABILITY_PRESSURE, 0, 0);
break;
case MOVE_TARGET_BOTH:
case MOVE_TARGET_OPPONENTS_FIELD:
- ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBankAttacker, ABILITY_PRESSURE, 0, 0);
+ ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_PRESSURE, 0, 0);
break;
default:
- if (gBankAttacker != gBankTarget && gBattleMons[gBankTarget].ability == ABILITY_PRESSURE)
+ if (gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerTarget].ability == ABILITY_PRESSURE)
ppToDeduct++;
break;
}
}
- if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBankAttacker].pp[gCurrMovePos])
+ if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos])
{
- gProtectStructs[gBankAttacker].notFirstStrike = 1;
+ gProtectStructs[gBattlerAttacker].notFirstStrike = 1;
- if (gBattleMons[gBankAttacker].pp[gCurrMovePos] > ppToDeduct)
- gBattleMons[gBankAttacker].pp[gCurrMovePos] -= ppToDeduct;
+ if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct)
+ gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct;
else
- gBattleMons[gBankAttacker].pp[gCurrMovePos] = 0;
+ gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0;
- if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED)
- && !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos]))
+ if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED)
+ && !((gDisableStructs[gBattlerAttacker].unk18_b) & gBitTable[gCurrMovePos]))
{
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]);
- MarkBufferBankForExecution(gBankAttacker);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]);
+ MarkBattlerForControllerExec(gBattlerAttacker);
}
}
@@ -1444,29 +1273,29 @@ static void atk04_critcalc(void)
u8 holdEffect;
u16 item, critChance;
- item = gBattleMons[gBankAttacker].item;
+ item = gBattleMons[gBattlerAttacker].item;
if (item == ITEM_ENIGMA_BERRY)
- holdEffect = gEnigmaBerries[gBankAttacker].holdEffect;
+ holdEffect = gEnigmaBerries[gBattlerAttacker].holdEffect;
else
holdEffect = ItemId_GetHoldEffect(item);
- gStringBank = gBankAttacker;
+ gPotentialItemEffectBattler = gBattlerAttacker;
- critChance = 2 * ((gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
+ critChance = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
+ (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)
+ (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK)
+ (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK)
+ (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL)
+ (holdEffect == HOLD_EFFECT_SCOPE_LENS)
- + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBankAttacker].species == SPECIES_CHANSEY)
- + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBankAttacker].species == SPECIES_FARFETCHD);
+ + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY)
+ + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBattlerAttacker].species == SPECIES_FARFETCHD);
if (critChance > 4)
critChance = 4;
- if ((gBattleMons[gBankTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBankTarget].ability != ABILITY_SHELL_ARMOR)
- && !(gStatuses3[gBankAttacker] & STATUS3_CANT_SCORE_A_CRIT)
+ if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR)
+ && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT)
&& !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE))
&& !(Random() % sCriticalHitChance[critChance]))
gCritMultiplier = 2;
@@ -1476,34 +1305,34 @@ static void atk04_critcalc(void)
gBattlescriptCurrInstr++;
}
-static void atk05_damagecalc1(void)
+static void atk05_damagecalc(void)
{
- u16 sideStatus = gSideAffecting[GET_BANK_SIDE(gBankTarget)];
- gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove,
+ u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)];
+ gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove,
sideStatus, gDynamicBasePower,
- gBattleStruct->dynamicMoveType, gBankAttacker, gBankTarget);
+ gBattleStruct->dynamicMoveType, gBattlerAttacker, gBattlerTarget);
gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier;
- if (gStatuses3[gBankAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
+ if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
gBattleMoveDamage *= 2;
- if (gProtectStructs[gBankAttacker].helpingHand)
+ if (gProtectStructs[gBattlerAttacker].helpingHand)
gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
gBattlescriptCurrInstr++;
}
-void AI_CalcDmg(u8 bankAtk, u8 bankDef)
+void AI_CalcDmg(u8 attacker, u8 defender)
{
- u16 sideStatus = gSideAffecting[GET_BANK_SIDE(bankDef)];
- gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[bankAtk], &gBattleMons[bankDef], gCurrentMove,
+ u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(defender)];
+ gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[attacker], &gBattleMons[defender], gCurrentMove,
sideStatus, gDynamicBasePower,
- gBattleStruct->dynamicMoveType, bankAtk, bankDef);
+ gBattleStruct->dynamicMoveType, attacker, defender);
gDynamicBasePower = 0;
gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier;
- if (gStatuses3[bankAtk] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
+ if (gStatuses3[attacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
gBattleMoveDamage *= 2;
- if (gProtectStructs[bankAtk].helpingHand)
+ if (gProtectStructs[attacker].helpingHand)
gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
}
@@ -1516,26 +1345,26 @@ static void ModulateDmgByType(u8 multiplier)
switch (multiplier)
{
case TYPE_MUL_NO_EFFECT:
- gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED;
- gBattleMoveFlags &= ~MOVESTATUS_NOTVERYEFFECTIVE;
- gBattleMoveFlags &= ~MOVESTATUS_SUPEREFFECTIVE;
+ gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
+ gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
+ gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
break;
case TYPE_MUL_NOT_EFFECTIVE:
- if (gBattleMoves[gCurrentMove].power && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
- if (gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE)
- gBattleMoveFlags &= ~MOVESTATUS_SUPEREFFECTIVE;
+ if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)
+ gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
else
- gBattleMoveFlags |= MOVESTATUS_NOTVERYEFFECTIVE;
+ gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
}
break;
case TYPE_MUL_SUPER_EFFECTIVE:
- if (gBattleMoves[gCurrentMove].power && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
- if (gBattleMoveFlags & MOVESTATUS_NOTVERYEFFECTIVE)
- gBattleMoveFlags &= ~MOVESTATUS_NOTVERYEFFECTIVE;
+ if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
+ gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
else
- gBattleMoveFlags |= MOVESTATUS_SUPEREFFECTIVE;
+ gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE;
}
break;
}
@@ -1555,20 +1384,20 @@ static void atk06_typecalc(void)
GET_MOVE_TYPE(gCurrentMove, moveType);
// check stab
- if (gBattleMons[gBankAttacker].type1 == moveType || gBattleMons[gBankAttacker].type2 == moveType)
+ if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType))
{
gBattleMoveDamage = gBattleMoveDamage * 15;
gBattleMoveDamage = gBattleMoveDamage / 10;
}
- if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
{
- gLastUsedAbility = gBattleMons[gBankTarget].ability;
- gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED);
- gUnknown_02024250[gBankTarget] = 0;
- gUnknown_02024258[gBankTarget] = 0;
+ gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
+ gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);
+ gLastLandedMoves[gBattlerTarget] = 0;
+ gLastHitByType[gBattlerTarget] = 0;
gBattleCommunication[6] = moveType;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
else
{
@@ -1576,7 +1405,7 @@ static void atk06_typecalc(void)
{
if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)
{
- if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)
break;
i += 3;
continue;
@@ -1584,30 +1413,30 @@ static void atk06_typecalc(void)
else if (TYPE_EFFECT_ATK_TYPE(i) == moveType)
{
// check type1
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type1)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1)
ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i));
// check type2
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type2 &&
- gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 &&
+ gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2)
ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i));
}
i += 3;
}
}
- if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2
- && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)))
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2
+ && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))
&& gBattleMoves[gCurrentMove].power)
{
gLastUsedAbility = ABILITY_WONDER_GUARD;
- gBattleMoveFlags |= MOVESTATUS_MISSED;
- gUnknown_02024250[gBankTarget] = 0;
- gUnknown_02024258[gBankTarget] = 0;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
+ gLastLandedMoves[gBattlerTarget] = 0;
+ gLastHitByType[gBattlerTarget] = 0;
gBattleCommunication[6] = 3;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
- if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
- gProtectStructs[gBankAttacker].targetNotAffected = 1;
+ if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
+ gProtectStructs[gBattlerAttacker].targetNotAffected = 1;
gBattlescriptCurrInstr++;
}
@@ -1623,11 +1452,11 @@ static void CheckWonderGuardAndLevitate(void)
GET_MOVE_TYPE(gCurrentMove, moveType);
- if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
{
gLastUsedAbility = ABILITY_LEVITATE;
gBattleCommunication[6] = moveType;
- RecordAbilityBattle(gBankTarget, ABILITY_LEVITATE);
+ RecordAbilityBattle(gBattlerTarget, ABILITY_LEVITATE);
return;
}
@@ -1635,7 +1464,7 @@ static void CheckWonderGuardAndLevitate(void)
{
if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)
{
- if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)
break;
i += 3;
continue;
@@ -1643,46 +1472,46 @@ static void CheckWonderGuardAndLevitate(void)
if (TYPE_EFFECT_ATK_TYPE(i) == moveType)
{
// check no effect
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type1
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1
&& TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)
{
- gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED;
- gProtectStructs[gBankAttacker].targetNotAffected = 1;
+ gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
+ gProtectStructs[gBattlerAttacker].targetNotAffected = 1;
}
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type2 &&
- gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2 &&
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 &&
+ gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 &&
TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)
{
- gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED;
- gProtectStructs[gBankAttacker].targetNotAffected = 1;
+ gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
+ gProtectStructs[gBattlerAttacker].targetNotAffected = 1;
}
// check super effective
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 20)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 20)
flags |= 1;
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type2
- && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2
+ && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2
&& TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE)
flags |= 1;
// check not very effective
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 5)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 5)
flags |= 2;
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type2
- && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2
+ && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2
&& TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE)
flags |= 2;
}
i += 3;
}
- if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2)
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2)
{
if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power)
{
gLastUsedAbility = ABILITY_WONDER_GUARD;
gBattleCommunication[6] = 3;
- RecordAbilityBattle(gBankTarget, ABILITY_WONDER_GUARD);
+ RecordAbilityBattle(gBattlerTarget, ABILITY_WONDER_GUARD);
}
}
}
@@ -1696,32 +1525,32 @@ static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) // same as Mo
switch (multiplier)
{
case TYPE_MUL_NO_EFFECT:
- *flags |= MOVESTATUS_NOTAFFECTED;
- *flags &= ~MOVESTATUS_NOTVERYEFFECTIVE;
- *flags &= ~MOVESTATUS_SUPEREFFECTIVE;
+ *flags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
+ *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
+ *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
break;
case TYPE_MUL_NOT_EFFECTIVE:
- if (gBattleMoves[move].power && !(*flags & MOVESTATUS_NOEFFECT))
+ if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT))
{
- if (*flags & MOVESTATUS_SUPEREFFECTIVE)
- *flags &= ~MOVESTATUS_SUPEREFFECTIVE;
+ if (*flags & MOVE_RESULT_SUPER_EFFECTIVE)
+ *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE;
else
- *flags |= MOVESTATUS_NOTVERYEFFECTIVE;
+ *flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
}
break;
case TYPE_MUL_SUPER_EFFECTIVE:
- if (gBattleMoves[move].power && !(*flags & MOVESTATUS_NOEFFECT))
+ if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT))
{
- if (*flags & MOVESTATUS_NOTVERYEFFECTIVE)
- *flags &= ~MOVESTATUS_NOTVERYEFFECTIVE;
+ if (*flags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
+ *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE;
else
- *flags |= MOVESTATUS_SUPEREFFECTIVE;
+ *flags |= MOVE_RESULT_SUPER_EFFECTIVE;
}
break;
}
}
-u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef)
+u8 TypeCalc(u16 move, u8 attacker, u8 defender)
{
s32 i = 0;
u8 flags = 0;
@@ -1733,15 +1562,15 @@ u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef)
moveType = gBattleMoves[move].type;
// check stab
- if (gBattleMons[bankAtk].type1 == moveType || gBattleMons[bankAtk].type2 == moveType)
+ if (IS_BATTLER_OF_TYPE(attacker, moveType))
{
gBattleMoveDamage = gBattleMoveDamage * 15;
gBattleMoveDamage = gBattleMoveDamage / 10;
}
- if (gBattleMons[bankDef].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
+ if (gBattleMons[defender].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
{
- flags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED);
+ flags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);
}
else
{
@@ -1749,7 +1578,7 @@ u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef)
{
if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)
{
- if (gBattleMons[bankDef].status2 & STATUS2_FORESIGHT)
+ if (gBattleMons[defender].status2 & STATUS2_FORESIGHT)
break;
i += 3;
continue;
@@ -1758,23 +1587,23 @@ u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef)
else if (TYPE_EFFECT_ATK_TYPE(i) == moveType)
{
// check type1
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[bankDef].type1)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type1)
ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags);
// check type2
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[bankDef].type2 &&
- gBattleMons[bankDef].type1 != gBattleMons[bankDef].type2)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type2 &&
+ gBattleMons[defender].type1 != gBattleMons[defender].type2)
ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags);
}
i += 3;
}
}
- if (gBattleMons[bankDef].ability == ABILITY_WONDER_GUARD && !(flags & MOVESTATUS_MISSED)
- && AttacksThisTurn(bankAtk, move) == 2
- && (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)))
+ if (gBattleMons[defender].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED)
+ && AttacksThisTurn(attacker, move) == 2
+ && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))
&& gBattleMoves[move].power)
{
- flags |= MOVESTATUS_MISSED;
+ flags |= MOVE_RESULT_MISSED;
}
return flags;
}
@@ -1793,7 +1622,7 @@ u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility)
if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND)
{
- flags = MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED;
+ flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE;
}
else
{
@@ -1817,9 +1646,9 @@ u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility)
}
}
if (targetAbility == ABILITY_WONDER_GUARD
- && (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)))
+ && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))
&& gBattleMoves[move].power)
- flags |= MOVESTATUS_NOTAFFECTED;
+ flags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
return flags;
}
@@ -1843,94 +1672,96 @@ static void Unused_ApplyRandomDmgMultiplier(void)
ApplyRandomDmgMultiplier();
}
-static void atk07_dmg_adjustment(void)
+static void atk07_adjustnormaldamage(void)
{
- u8 holdEffect, quality;
+ u8 holdEffect, param;
ApplyRandomDmgMultiplier();
- if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
+ if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)
{
- holdEffect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
+ holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;
+ param = gEnigmaBerries[gBattlerTarget].holdEffectParam;
}
else
{
- holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
- quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);
+ param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);
}
- gStringBank = gBankTarget;
+ gPotentialItemEffectBattler = gBattlerTarget;
- if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality)
+ if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)
{
- RecordItemEffectBattle(gBankTarget, holdEffect);
- gSpecialStatuses[gBankTarget].focusBanded = 1;
+ RecordItemEffectBattle(gBattlerTarget, holdEffect);
+ gSpecialStatuses[gBattlerTarget].focusBanded = 1;
}
- if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)
goto END;
- if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured
- && !gSpecialStatuses[gBankTarget].focusBanded)
+ if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBattlerTarget].endured
+ && !gSpecialStatuses[gBattlerTarget].focusBanded)
goto END;
- if (gBattleMons[gBankTarget].hp > gBattleMoveDamage)
+ if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
goto END;
- gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;
- if (gProtectStructs[gBankTarget].endured)
+ if (gProtectStructs[gBattlerTarget].endured)
{
- gBattleMoveFlags |= MOVESTATUS_ENDURED;
+ gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;
}
- else if (gSpecialStatuses[gBankTarget].focusBanded)
+ else if (gSpecialStatuses[gBattlerTarget].focusBanded)
{
- gBattleMoveFlags |= MOVESTATUS_HUNGON;
- gLastUsedItem = gBattleMons[gBankTarget].item;
+ gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;
+ gLastUsedItem = gBattleMons[gBattlerTarget].item;
}
END:
gBattlescriptCurrInstr++;
}
-static void atk08_dmg_adjustment2(void) // The same as 0x7 except it doesn't check for false swipe move effect.
+static void atk08_adjustnormaldamage2(void) // The same as 0x7 except it doesn't check for false swipe move effect.
{
- u8 holdEffect, quality;
+ u8 holdEffect, param;
ApplyRandomDmgMultiplier();
- if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
+ if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)
{
- holdEffect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
+ holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;
+ param = gEnigmaBerries[gBattlerTarget].holdEffectParam;
}
else
{
- holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
- quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);
+ param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);
}
- gStringBank = gBankTarget;
+ gPotentialItemEffectBattler = gBattlerTarget;
- if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality)
+ if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)
{
- RecordItemEffectBattle(gBankTarget, holdEffect);
- gSpecialStatuses[gBankTarget].focusBanded = 1;
+ RecordItemEffectBattle(gBattlerTarget, holdEffect);
+ gSpecialStatuses[gBattlerTarget].focusBanded = 1;
}
- if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)
goto END;
- if (!gProtectStructs[gBankTarget].endured && !gSpecialStatuses[gBankTarget].focusBanded)
+ if (!gProtectStructs[gBattlerTarget].endured && !gSpecialStatuses[gBattlerTarget].focusBanded)
goto END;
- if (gBattleMons[gBankTarget].hp > gBattleMoveDamage)
+ if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
goto END;
- gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;
- if (gProtectStructs[gBankTarget].endured)
+ if (gProtectStructs[gBattlerTarget].endured)
{
- gBattleMoveFlags |= MOVESTATUS_ENDURED;
+ gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;
}
- else if (gSpecialStatuses[gBankTarget].focusBanded)
+ else if (gSpecialStatuses[gBattlerTarget].focusBanded)
{
- gBattleMoveFlags |= MOVESTATUS_HUNGON;
- gLastUsedItem = gBattleMons[gBankTarget].item;
+ gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;
+ gLastUsedItem = gBattleMons[gBattlerTarget].item;
}
END:
@@ -1939,7 +1770,7 @@ static void atk08_dmg_adjustment2(void) // The same as 0x7 except it doesn't che
static void atk09_attackanimation(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE))
@@ -1959,17 +1790,17 @@ static void atk09_attackanimation(void)
gBattlescriptCurrInstr++;
return;
}
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
u8 multihit;
- gActiveBank = gBankAttacker;
+ gActiveBattler = gBattlerAttacker;
- if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)
multihit = gMultiHitCounter;
else if (gMultiHitCounter != 0 && gMultiHitCounter != 1)
{
- if (gBattleMons[gBankTarget].hp <= gBattleMoveDamage)
+ if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage)
multihit = 1;
else
multihit = gMultiHitCounter;
@@ -1977,10 +1808,10 @@ static void atk09_attackanimation(void)
else
multihit = gMultiHitCounter;
- EmitMoveAnimation(0, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBankAttacker].friendship, &gDisableStructs[gBankAttacker], multihit);
+ BtlController_EmitMoveAnimation(0, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit);
gBattleScripting.animTurn += 1;
gBattleScripting.animTargetsHit += 1;
- MarkBufferBankForExecution(gBankAttacker);
+ MarkBattlerForControllerExec(gBattlerAttacker);
gBattlescriptCurrInstr++;
}
else
@@ -1993,22 +1824,22 @@ static void atk09_attackanimation(void)
static void atk0A_waitanimation(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
gBattlescriptCurrInstr++;
}
static void atk0B_healthbarupdate(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))
{
- PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBank);
+ PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBattler);
}
else
{
@@ -2022,10 +1853,10 @@ static void atk0B_healthbarupdate(void)
else
healthValue = maxPossibleDmgValue;
- EmitHealthBarUpdate(0, healthValue);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitHealthBarUpdate(0, healthValue);
+ MarkBattlerForControllerExec(gActiveBattler);
- if (GetBankSide(gActiveBank) == SIDE_PLAYER && gBattleMoveDamage > 0)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0)
gBattleResults.unk5_0 = 1;
}
}
@@ -2037,7 +1868,7 @@ static void atk0C_datahpupdate(void)
{
u32 moveType;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
if (gBattleStruct->dynamicMoveType == 0)
@@ -2047,27 +1878,27 @@ static void atk0C_datahpupdate(void)
else
moveType = gBattleMoves[gCurrentMove].type;
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))
{
- if (gDisableStructs[gActiveBank].substituteHP >= gBattleMoveDamage)
+ if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage)
{
- if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0)
- gSpecialStatuses[gActiveBank].moveturnLostHP = gBattleMoveDamage;
- gDisableStructs[gActiveBank].substituteHP -= gBattleMoveDamage;
+ if (gSpecialStatuses[gActiveBattler].dmg == 0)
+ gSpecialStatuses[gActiveBattler].dmg = gBattleMoveDamage;
+ gDisableStructs[gActiveBattler].substituteHP -= gBattleMoveDamage;
gHpDealt = gBattleMoveDamage;
}
else
{
- if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0)
- gSpecialStatuses[gActiveBank].moveturnLostHP = gDisableStructs[gActiveBank].substituteHP;
- gHpDealt = gDisableStructs[gActiveBank].substituteHP;
- gDisableStructs[gActiveBank].substituteHP = 0;
+ if (gSpecialStatuses[gActiveBattler].dmg == 0)
+ gSpecialStatuses[gActiveBattler].dmg = gDisableStructs[gActiveBattler].substituteHP;
+ gHpDealt = gDisableStructs[gActiveBattler].substituteHP;
+ gDisableStructs[gActiveBattler].substituteHP = 0;
}
// check substitute fading
- if (gDisableStructs[gActiveBank].substituteHP == 0)
+ if (gDisableStructs[gActiveBattler].substituteHP == 0)
{
gBattlescriptCurrInstr += 2;
BattleScriptPushCursor();
@@ -2080,9 +1911,9 @@ static void atk0C_datahpupdate(void)
gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE);
if (gBattleMoveDamage < 0) // hp goes up
{
- gBattleMons[gActiveBank].hp -= gBattleMoveDamage;
- if (gBattleMons[gActiveBank].hp > gBattleMons[gActiveBank].maxHP)
- gBattleMons[gActiveBank].hp = gBattleMons[gActiveBank].maxHP;
+ gBattleMons[gActiveBattler].hp -= gBattleMoveDamage;
+ if (gBattleMons[gActiveBattler].hp > gBattleMons[gActiveBattler].maxHP)
+ gBattleMons[gActiveBattler].hp = gBattleMons[gActiveBattler].maxHP;
}
else // hp goes down
@@ -2093,125 +1924,125 @@ static void atk0C_datahpupdate(void)
}
else
{
- gTakenDmg[gActiveBank] += gBattleMoveDamage;
- if (gBattlescriptCurrInstr[1] == BS_GET_TARGET)
- gTakenDmgBanks[gActiveBank] = gBankAttacker;
+ gTakenDmg[gActiveBattler] += gBattleMoveDamage;
+ if (gBattlescriptCurrInstr[1] == BS_TARGET)
+ gTakenDmgByBattler[gActiveBattler] = gBattlerAttacker;
else
- gTakenDmgBanks[gActiveBank] = gBankTarget;
+ gTakenDmgByBattler[gActiveBattler] = gBattlerTarget;
}
- if (gBattleMons[gActiveBank].hp > gBattleMoveDamage)
+ if (gBattleMons[gActiveBattler].hp > gBattleMoveDamage)
{
- gBattleMons[gActiveBank].hp -= gBattleMoveDamage;
+ gBattleMons[gActiveBattler].hp -= gBattleMoveDamage;
gHpDealt = gBattleMoveDamage;
}
else
{
- gHpDealt = gBattleMons[gActiveBank].hp;
- gBattleMons[gActiveBank].hp = 0;
+ gHpDealt = gBattleMons[gActiveBattler].hp;
+ gBattleMons[gActiveBattler].hp = 0;
}
- if (!gSpecialStatuses[gActiveBank].moveturnLostHP && !(gHitMarker & HITMARKER_x100000))
- gSpecialStatuses[gActiveBank].moveturnLostHP = gHpDealt;
+ if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_x100000))
+ gSpecialStatuses[gActiveBattler].dmg = gHpDealt;
- if (moveType <= 8 && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT)
+ if (IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT)
{
- gProtectStructs[gActiveBank].physicalDmg = gHpDealt;
- gSpecialStatuses[gActiveBank].moveturnLostHP_physical = gHpDealt;
- if (gBattlescriptCurrInstr[1] == BS_GET_TARGET)
+ gProtectStructs[gActiveBattler].physicalDmg = gHpDealt;
+ gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt;
+ if (gBattlescriptCurrInstr[1] == BS_TARGET)
{
- gProtectStructs[gActiveBank].physicalBank = gBankAttacker;
- gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankAttacker;
+ gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerAttacker;
+ gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerAttacker;
}
else
{
- gProtectStructs[gActiveBank].physicalBank = gBankTarget;
- gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankTarget;
+ gProtectStructs[gActiveBattler].physicalBattlerId = gBattlerTarget;
+ gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget;
}
}
- else if (moveType > 8 && !(gHitMarker & HITMARKER_x100000))
+ else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000))
{
- gProtectStructs[gActiveBank].specialDmg = gHpDealt;
- gSpecialStatuses[gActiveBank].moveturnLostHP_special = gHpDealt;
- if (gBattlescriptCurrInstr[1] == BS_GET_TARGET)
+ gProtectStructs[gActiveBattler].specialDmg = gHpDealt;
+ gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt;
+ if (gBattlescriptCurrInstr[1] == BS_TARGET)
{
- gProtectStructs[gActiveBank].specialBank = gBankAttacker;
- gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankAttacker;
+ gProtectStructs[gActiveBattler].specialBattlerId = gBattlerAttacker;
+ gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerAttacker;
}
else
{
- gProtectStructs[gActiveBank].specialBank = gBankTarget;
- gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankTarget;
+ gProtectStructs[gActiveBattler].specialBattlerId = gBattlerTarget;
+ gSpecialStatuses[gActiveBattler].specialBattlerId = gBattlerTarget;
}
}
}
gHitMarker &= ~(HITMARKER_x100000);
- EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
else
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0)
- gSpecialStatuses[gActiveBank].moveturnLostHP = 0xFFFF;
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ if (gSpecialStatuses[gActiveBattler].dmg == 0)
+ gSpecialStatuses[gActiveBattler].dmg = 0xFFFF;
}
gBattlescriptCurrInstr += 2;
}
static void atk0D_critmessage(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- if (gCritMultiplier == 2 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (gCritMultiplier == 2 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
- PrepareStringBattle(STRINGID_CRITICALHIT, gBankAttacker);
+ PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker);
gBattleCommunication[MSG_DISPLAY] = 1;
}
gBattlescriptCurrInstr++;
}
}
-static void atk0E_effectiveness_sound(void)
+static void atk0E_effectivenesssound(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = gBankTarget;
- if (!(gBattleMoveFlags & MOVESTATUS_MISSED))
+ gActiveBattler = gBattlerTarget;
+ if (!(gMoveResultFlags & MOVE_RESULT_MISSED))
{
- switch (gBattleMoveFlags & (u8)(~(MOVESTATUS_MISSED)))
+ switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED)))
{
- case MOVESTATUS_SUPEREFFECTIVE:
- EmitEffectivenessSound(0, SE_KOUKA_H);
- MarkBufferBankForExecution(gActiveBank);
+ case MOVE_RESULT_SUPER_EFFECTIVE:
+ BtlController_EmitPlaySE(0, SE_KOUKA_H);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
- case MOVESTATUS_NOTVERYEFFECTIVE:
- EmitEffectivenessSound(0, SE_KOUKA_L);
- MarkBufferBankForExecution(gActiveBank);
+ case MOVE_RESULT_NOT_VERY_EFFECTIVE:
+ BtlController_EmitPlaySE(0, SE_KOUKA_L);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
- case MOVESTATUS_NOTAFFECTED:
- case MOVESTATUS_FAILED:
+ case MOVE_RESULT_DOESNT_AFFECT_FOE:
+ case MOVE_RESULT_FAILED:
// no sound
break;
- case MOVESTATUS_ENDURED:
- case MOVESTATUS_ONEHITKO:
- case MOVESTATUS_HUNGON:
+ case MOVE_RESULT_FOE_ENDURED:
+ case MOVE_RESULT_ONE_HIT_KO:
+ case MOVE_RESULT_FOE_HUNG_ON:
default:
- if (gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE)
+ if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)
{
- EmitEffectivenessSound(0, SE_KOUKA_H);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitPlaySE(0, SE_KOUKA_H);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (gBattleMoveFlags & MOVESTATUS_NOTVERYEFFECTIVE)
+ else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
{
- EmitEffectivenessSound(0, SE_KOUKA_L);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitPlaySE(0, SE_KOUKA_L);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!(gBattleMoveFlags & (MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED)))
+ else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)))
{
- EmitEffectivenessSound(0, SE_KOUKA_M);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitPlaySE(0, SE_KOUKA_M);
+ MarkBattlerForControllerExec(gActiveBattler);
}
break;
}
@@ -2223,10 +2054,10 @@ static void atk0F_resultmessage(void)
{
u32 stringId = 0;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- if (gBattleMoveFlags & MOVESTATUS_MISSED && (!(gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) || gBattleCommunication[6] > 2))
+ if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[6] > 2))
{
stringId = gMissStringIds[gBattleCommunication[6]];
gBattleCommunication[MSG_DISPLAY] = 1;
@@ -2234,64 +2065,64 @@ static void atk0F_resultmessage(void)
else
{
gBattleCommunication[MSG_DISPLAY] = 1;
- switch (gBattleMoveFlags & (u8)(~(MOVESTATUS_MISSED)))
+ switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED)))
{
- case MOVESTATUS_SUPEREFFECTIVE:
+ case MOVE_RESULT_SUPER_EFFECTIVE:
stringId = STRINGID_SUPEREFFECTIVE;
break;
- case MOVESTATUS_NOTVERYEFFECTIVE:
+ case MOVE_RESULT_NOT_VERY_EFFECTIVE:
stringId = STRINGID_NOTVERYEFFECTIVE;
break;
- case MOVESTATUS_ONEHITKO:
+ case MOVE_RESULT_ONE_HIT_KO:
stringId = STRINGID_ONEHITKO;
break;
- case MOVESTATUS_ENDURED:
+ case MOVE_RESULT_FOE_ENDURED:
stringId = STRINGID_PKMNENDUREDHIT;
break;
- case MOVESTATUS_FAILED:
+ case MOVE_RESULT_FAILED:
stringId = STRINGID_BUTITFAILED;
break;
- case MOVESTATUS_NOTAFFECTED:
+ case MOVE_RESULT_DOESNT_AFFECT_FOE:
stringId = STRINGID_ITDOESNTAFFECT;
break;
- case MOVESTATUS_HUNGON:
- gLastUsedItem = gBattleMons[gBankTarget].item;
- gStringBank = gBankTarget;
- gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON);
+ case MOVE_RESULT_FOE_HUNG_ON:
+ gLastUsedItem = gBattleMons[gBattlerTarget].item;
+ gPotentialItemEffectBattler = gBattlerTarget;
+ gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
return;
default:
- if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
+ if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
{
stringId = STRINGID_ITDOESNTAFFECT;
}
- else if (gBattleMoveFlags & MOVESTATUS_ONEHITKO)
+ else if (gMoveResultFlags & MOVE_RESULT_ONE_HIT_KO)
{
- gBattleMoveFlags &= ~(MOVESTATUS_ONEHITKO);
- gBattleMoveFlags &= ~(MOVESTATUS_SUPEREFFECTIVE);
- gBattleMoveFlags &= ~(MOVESTATUS_NOTVERYEFFECTIVE);
+ gMoveResultFlags &= ~(MOVE_RESULT_ONE_HIT_KO);
+ gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE);
+ gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_OneHitKOMsg;
return;
}
- else if (gBattleMoveFlags & MOVESTATUS_ENDURED)
+ else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED)
{
- gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON);
+ gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EnduredMsg;
return;
}
- else if (gBattleMoveFlags & MOVESTATUS_HUNGON)
+ else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON)
{
- gLastUsedItem = gBattleMons[gBankTarget].item;
- gStringBank = gBankTarget;
- gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON);
+ gLastUsedItem = gBattleMons[gBattlerTarget].item;
+ gPotentialItemEffectBattler = gBattlerTarget;
+ gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
return;
}
- else if (gBattleMoveFlags & MOVESTATUS_FAILED)
+ else if (gMoveResultFlags & MOVE_RESULT_FAILED)
{
stringId = STRINGID_BUTITFAILED;
}
@@ -2303,28 +2134,28 @@ static void atk0F_resultmessage(void)
}
if (stringId)
- PrepareStringBattle(stringId, gBankAttacker);
+ PrepareStringBattle(stringId, gBattlerAttacker);
gBattlescriptCurrInstr++;
}
static void atk10_printstring(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- u16 var = BS2ScriptRead16(gBattlescriptCurrInstr + 1);
- PrepareStringBattle(var, gBankAttacker);
+ u16 var = T2_READ_16(gBattlescriptCurrInstr + 1);
+ PrepareStringBattle(var, gBattlerAttacker);
gBattlescriptCurrInstr += 3;
gBattleCommunication[MSG_DISPLAY] = 1;
}
}
-static void atk11_printstring_playeronly(void)
+static void atk11_printselectionstring(void)
{
- gActiveBank = gBankAttacker;
+ gActiveBattler = gBattlerAttacker;
- EmitPrintStringPlayerOnly(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1));
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitPrintSelectionString(0, T2_READ_16(gBattlescriptCurrInstr + 1));
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 3;
gBattleCommunication[MSG_DISPLAY] = 1;
@@ -2332,7 +2163,7 @@ static void atk11_printstring_playeronly(void)
static void atk12_waitmessage(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
if (!gBattleCommunication[MSG_DISPLAY])
{
@@ -2340,7 +2171,7 @@ static void atk12_waitmessage(void)
}
else
{
- u16 toWait = BS2ScriptRead16(gBattlescriptCurrInstr + 1);
+ u16 toWait = T2_READ_16(gBattlescriptCurrInstr + 1);
if (++gPauseCounterBattle >= toWait)
{
gPauseCounterBattle = 0;
@@ -2353,40 +2184,40 @@ static void atk12_waitmessage(void)
static void atk13_printfromtable(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- const u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ const u16 *ptr = (const u16*) T1_READ_PTR(gBattlescriptCurrInstr + 1);
ptr += gBattleCommunication[MULTISTRING_CHOOSER];
- PrepareStringBattle(*ptr, gBankAttacker);
+ PrepareStringBattle(*ptr, gBattlerAttacker);
gBattlescriptCurrInstr += 5;
gBattleCommunication[MSG_DISPLAY] = 1;
}
}
-static void atk14_printfromtable_playeronly(void)
+static void atk14_printselectionstringfromtable(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- const u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ const u16 *ptr = (const u16*) T1_READ_PTR(gBattlescriptCurrInstr + 1);
ptr += gBattleCommunication[MULTISTRING_CHOOSER];
- gActiveBank = gBankAttacker;
- EmitPrintStringPlayerOnly(0, *ptr);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitPrintSelectionString(0, *ptr);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 5;
gBattleCommunication[MSG_DISPLAY] = 1;
}
}
-u8 BankGetTurnOrder(u8 bank)
+u8 GetBattlerTurnOrderNum(u8 battlerId)
{
s32 i;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gBanksByTurnOrder[i] == bank)
+ if (gBattlerByTurnOrder[i] == battlerId)
break;
}
return i;
@@ -2413,67 +2244,67 @@ void SetMoveEffect(bool8 primary, u8 certain)
if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_AFFECTS_USER)
{
- gEffectBank = gBankAttacker; // bank that effects get applied on
+ gEffectBattler = gBattlerAttacker; // battlerId that effects get applied on
gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(MOVE_EFFECT_AFFECTS_USER);
affectsUser = MOVE_EFFECT_AFFECTS_USER;
- gBattleScripting.bank = gBankTarget; // theoretically the attacker
+ gBattleScripting.battler = gBattlerTarget; // theoretically the attacker
}
else
{
- gEffectBank = gBankTarget;
- gBattleScripting.bank = gBankAttacker;
+ gEffectBattler = gBattlerTarget;
+ gBattleScripting.battler = gBattlerAttacker;
}
- if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9)
INCREMENT_RESET_RETURN
- if (gSideAffecting[GET_BANK_SIDE(gEffectBank)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
+ if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7)
INCREMENT_RESET_RETURN
- if (gBattleMons[gEffectBank].hp == 0
+ if (gBattleMons[gEffectBattler].hp == 0
&& gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_PAYDAY
&& gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_STEAL_ITEM)
INCREMENT_RESET_RETURN
- if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER)
+ if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER)
INCREMENT_RESET_RETURN
if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) // status change
{
switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])
{
- case STATUS_SLEEP:
+ case STATUS1_SLEEP:
// check active uproar
- if (gBattleMons[gEffectBank].ability != ABILITY_SOUNDPROOF)
+ if (gBattleMons[gEffectBattler].ability != ABILITY_SOUNDPROOF)
{
- for (gActiveBank = 0;
- gActiveBank < gNoOfAllBanks && !(gBattleMons[gActiveBank].status2 & STATUS2_UPROAR);
- gActiveBank++)
+ for (gActiveBattler = 0;
+ gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR);
+ gActiveBattler++)
{}
}
else
- gActiveBank = gNoOfAllBanks;
+ gActiveBattler = gBattlersCount;
- if (gBattleMons[gEffectBank].status1)
+ if (gBattleMons[gEffectBattler].status1)
break;
- if (gActiveBank != gNoOfAllBanks)
+ if (gActiveBattler != gBattlersCount)
break;
- if (gBattleMons[gEffectBank].ability == ABILITY_VITAL_SPIRIT)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_VITAL_SPIRIT)
break;
- if (gBattleMons[gEffectBank].ability == ABILITY_INSOMNIA)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_INSOMNIA)
break;
- CancelMultiTurnMoves(gEffectBank);
+ CancelMultiTurnMoves(gEffectBattler);
statusChanged = TRUE;
break;
- case STATUS_POISON:
- if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY
+ case STATUS1_POISON:
+ if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
gLastUsedAbility = ABILITY_IMMUNITY;
- RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY);
+ RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_PSNPrevention;
@@ -2489,8 +2320,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
RESET_RETURN
}
- if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON
- || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL)
+ if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
&& (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
@@ -2500,27 +2330,23 @@ void SetMoveEffect(bool8 primary, u8 certain)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
RESET_RETURN
}
- if (gBattleMons[gEffectBank].type1 == TYPE_POISON)
- break;
- if (gBattleMons[gEffectBank].type2 == TYPE_POISON)
+ if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON))
break;
- if (gBattleMons[gEffectBank].type1 == TYPE_STEEL)
+ if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
break;
- if (gBattleMons[gEffectBank].type2 == TYPE_STEEL)
+ if (gBattleMons[gEffectBattler].status1)
break;
- if (gBattleMons[gEffectBank].status1)
- break;
- if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY)
break;
statusChanged = TRUE;
break;
- case STATUS_BURN:
- if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL
+ case STATUS1_BURN:
+ if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
gLastUsedAbility = ABILITY_WATER_VEIL;
- RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL);
+ RecordAbilityBattle(gEffectBattler, ABILITY_WATER_VEIL);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_BRNPrevention;
@@ -2535,8 +2361,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
RESET_RETURN
}
- if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE
- || gBattleMons[gEffectBank].type2 == TYPE_FIRE)
+ if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)
&& (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
@@ -2546,41 +2371,37 @@ void SetMoveEffect(bool8 primary, u8 certain)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
RESET_RETURN
}
- if (gBattleMons[gEffectBank].type1 == TYPE_FIRE)
- break;
- if (gBattleMons[gEffectBank].type2 == TYPE_FIRE)
+ if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE))
break;
- if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL)
break;
- if (gBattleMons[gEffectBank].status1)
+ if (gBattleMons[gEffectBattler].status1)
break;
statusChanged = TRUE;
break;
- case STATUS_FREEZE:
+ case STATUS1_FREEZE:
if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY)
noSunCanFreeze = FALSE;
- if (gBattleMons[gEffectBank].type1 == TYPE_ICE)
+ if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ICE))
break;
- if (gBattleMons[gEffectBank].type2 == TYPE_ICE)
- break;
- if (gBattleMons[gEffectBank].status1)
+ if (gBattleMons[gEffectBattler].status1)
break;
if (noSunCanFreeze == 0)
break;
- if (gBattleMons[gEffectBank].ability == ABILITY_MAGMA_ARMOR)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_MAGMA_ARMOR)
break;
- CancelMultiTurnMoves(gEffectBank);
+ CancelMultiTurnMoves(gEffectBattler);
statusChanged = TRUE;
break;
- case STATUS_PARALYSIS:
- if (gBattleMons[gEffectBank].ability == ABILITY_LIMBER)
+ case STATUS1_PARALYSIS:
+ if (gBattleMons[gEffectBattler].ability == ABILITY_LIMBER)
{
if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)
{
gLastUsedAbility = ABILITY_LIMBER;
- RecordAbilityBattle(gEffectBank, ABILITY_LIMBER);
+ RecordAbilityBattle(gEffectBattler, ABILITY_LIMBER);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_PRLZPrevention;
@@ -2599,16 +2420,16 @@ void SetMoveEffect(bool8 primary, u8 certain)
else
break;
}
- if (gBattleMons[gEffectBank].status1)
+ if (gBattleMons[gEffectBattler].status1)
break;
statusChanged = TRUE;
break;
- case STATUS_TOXIC_POISON:
- if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
+ case STATUS1_TOXIC_POISON:
+ if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
gLastUsedAbility = ABILITY_IMMUNITY;
- RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY);
+ RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_PSNPrevention;
@@ -2624,8 +2445,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
RESET_RETURN
}
- if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON
- || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL)
+ if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
&& (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
@@ -2635,25 +2455,22 @@ void SetMoveEffect(bool8 primary, u8 certain)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
RESET_RETURN
}
- if (gBattleMons[gEffectBank].status1)
+ if (gBattleMons[gEffectBattler].status1)
break;
- if (gBattleMons[gEffectBank].type1 != TYPE_POISON
- && gBattleMons[gEffectBank].type2 != TYPE_POISON
- && gBattleMons[gEffectBank].type1 != TYPE_STEEL
- && gBattleMons[gEffectBank].type2 != TYPE_STEEL)
+ if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL))
{
- if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY)
break;
// It's redundant, because at this point we know the status1 value is 0.
- gBattleMons[gEffectBank].status1 &= ~(STATUS_TOXIC_POISON);
- gBattleMons[gEffectBank].status1 &= ~(STATUS_POISON);
+ gBattleMons[gEffectBattler].status1 &= ~(STATUS1_TOXIC_POISON);
+ gBattleMons[gEffectBattler].status1 &= ~(STATUS1_POISON);
statusChanged = TRUE;
break;
}
else
{
- gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED;
+ gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
}
break;
}
@@ -2661,16 +2478,16 @@ void SetMoveEffect(bool8 primary, u8 certain)
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
- if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP)
- gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2);
+ if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS1_SLEEP)
+ gBattleMons[gEffectBattler].status1 |= ((Random() & 3) + 2);
else
- gBattleMons[gEffectBank].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
+ gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
- gActiveBank = gEffectBank;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gEffectBattler;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
{
@@ -2705,7 +2522,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
else
{
- if (gBattleMons[gEffectBank].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])
+ if (gBattleMons[gEffectBattler].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])
{
gBattlescriptCurrInstr++;
}
@@ -2715,26 +2532,26 @@ void SetMoveEffect(bool8 primary, u8 certain)
switch (gBattleCommunication[MOVE_EFFECT_BYTE])
{
case MOVE_EFFECT_CONFUSION:
- if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO
- || gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_OWN_TEMPO
+ || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION)
{
gBattlescriptCurrInstr++;
}
else
{
- gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2;
+ gBattleMons[gEffectBattler].status2 |= (((Random()) % 0x4)) + 2;
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
}
break;
case MOVE_EFFECT_FLINCH:
- if (gBattleMons[gEffectBank].ability == ABILITY_INNER_FOCUS)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_INNER_FOCUS)
{
if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)
{
gLastUsedAbility = ABILITY_INNER_FOCUS;
- RecordAbilityBattle(gEffectBank, ABILITY_INNER_FOCUS);
+ RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS);
gBattlescriptCurrInstr = BattleScript_FlinchPrevention;
}
else
@@ -2744,18 +2561,18 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
else
{
- if (BankGetTurnOrder(gEffectBank) > gCurrentTurnActionNumber)
- gBattleMons[gEffectBank].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
+ if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber)
+ gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
gBattlescriptCurrInstr++;
}
break;
case MOVE_EFFECT_UPROAR:
- if (!(gBattleMons[gEffectBank].status2 & STATUS2_UPROAR))
+ if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR))
{
- gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMoves[gEffectBank] = gCurrentMove;
- gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4;
+ gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;
+ gLockedMoves[gEffectBattler] = gCurrentMove;
+ gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 2) << 4;
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
@@ -2766,10 +2583,10 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
break;
case MOVE_EFFECT_PAYDAY:
- if (GET_BANK_SIDE(gBankAttacker) == SIDE_PLAYER)
+ if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER)
{
u16 PayDay = gPaydayMoney;
- gPaydayMoney += (gBattleMons[gBankAttacker].level * 5);
+ gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 5);
if (PayDay > gPaydayMoney)
gPaydayMoney = 0xFFFF;
}
@@ -2777,7 +2594,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
break;
case MOVE_EFFECT_TRI_ATTACK:
- if (gBattleMons[gEffectBank].status1)
+ if (gBattleMons[gEffectBattler].status1)
{
gBattlescriptCurrInstr++;
}
@@ -2788,23 +2605,23 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
break;
case MOVE_EFFECT_CHARGING:
- gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMoves[gEffectBank] = gCurrentMove;
- gProtectStructs[gEffectBank].chargingTurn = 1;
+ gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;
+ gLockedMoves[gEffectBattler] = gCurrentMove;
+ gProtectStructs[gEffectBattler].chargingTurn = 1;
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_WRAP:
- if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED)
+ if (gBattleMons[gEffectBattler].status2 & STATUS2_WRAPPED)
{
gBattlescriptCurrInstr++;
}
else
{
- gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 3) << 0xD;
+ gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 3) << 0xD;
- *(gBattleStruct->wrappedMove + gEffectBank * 2 + 0) = gCurrentMove;
- *(gBattleStruct->wrappedMove + gEffectBank * 2 + 1) = gCurrentMove >> 8;
- *(gBattleStruct->wrappedBy + gEffectBank) = gBankAttacker;
+ *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 0) = gCurrentMove;
+ *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 1) = gCurrentMove >> 8;
+ *(gBattleStruct->wrappedBy + gEffectBattler) = gBattlerAttacker;
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
@@ -2911,13 +2728,13 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
break;
case MOVE_EFFECT_RECHARGE:
- gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE;
- gDisableStructs[gEffectBank].rechargeCounter = 2;
- gLockedMoves[gEffectBank] = gCurrentMove;
+ gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE;
+ gDisableStructs[gEffectBattler].rechargeCounter = 2;
+ gLockedMoves[gEffectBattler] = gCurrentMove;
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_RAGE:
- gBattleMons[gBankAttacker].status2 |= STATUS2_RAGE;
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_RAGE;
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_STEAL_ITEM:
@@ -2928,8 +2745,8 @@ void SetMoveEffect(bool8 primary, u8 certain)
break;
}
- side = GetBankSide(gBankAttacker);
- if (GetBankSide(gBankAttacker) == SIDE_OPPONENT
+ side = GetBattlerSide(gBattlerAttacker);
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT
&& !(gBattleTypeFlags &
(BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
@@ -2945,56 +2762,56 @@ void SetMoveEffect(bool8 primary, u8 certain)
| BATTLE_TYPE_LINK
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_SECRET_BASE))
- && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlePartyID[gBankAttacker]]))
+ && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]))
{
gBattlescriptCurrInstr++;
}
- else if (gBattleMons[gBankTarget].item
- && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD)
+ else if (gBattleMons[gBattlerTarget].item
+ && gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD)
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_NoItemSteal;
- gLastUsedAbility = gBattleMons[gBankTarget].ability;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
- else if (gBattleMons[gBankAttacker].item != 0
- || gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY
- || IS_ITEM_MAIL(gBattleMons[gBankTarget].item)
- || gBattleMons[gBankTarget].item == 0)
+ else if (gBattleMons[gBattlerAttacker].item != 0
+ || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY
+ || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item)
+ || gBattleMons[gBattlerTarget].item == 0)
{
gBattlescriptCurrInstr++;
}
else
{
- u16* changedItem = &gBattleStruct->changedItems[gBankAttacker];
- gLastUsedItem = *changedItem = gBattleMons[gBankTarget].item;
- gBattleMons[gBankTarget].item = 0;
+ u16* changedItem = &gBattleStruct->changedItems[gBattlerAttacker];
+ gLastUsedItem = *changedItem = gBattleMons[gBattlerTarget].item;
+ gBattleMons[gBattlerTarget].item = 0;
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem);
- MarkBufferBankForExecution(gBankAttacker);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem);
+ MarkBattlerForControllerExec(gBattlerAttacker);
- gActiveBank = gBankTarget;
- EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item);
- MarkBufferBankForExecution(gBankTarget);
+ gActiveBattler = gBattlerTarget;
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBattlerTarget].item);
+ MarkBattlerForControllerExec(gBattlerTarget);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_ItemSteal;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gBankTarget]) + 0) = 0;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gBankTarget]) + 1) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0;
}
}
break;
case MOVE_EFFECT_PREVENT_ESCAPE:
- gBattleMons[gBankTarget].status2 |= STATUS2_ESCAPE_PREVENTION;
- gDisableStructs[gBankTarget].bankPreventingEscape = gBankAttacker;
+ gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION;
+ gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker;
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_NIGHTMARE:
- gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE;
+ gBattleMons[gBattlerTarget].status2 |= STATUS2_NIGHTMARE;
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_ALL_STATS_UP:
@@ -3006,17 +2823,17 @@ void SetMoveEffect(bool8 primary, u8 certain)
gBattlescriptCurrInstr = BattleScript_RapidSpinAway;
break;
case MOVE_EFFECT_REMOVE_PARALYSIS: // Smelling salts
- if (!(gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS))
+ if (!(gBattleMons[gBattlerTarget].status1 & STATUS1_PARALYSIS))
{
gBattlescriptCurrInstr++;
}
else
{
- gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS);
+ gBattleMons[gBattlerTarget].status1 &= ~(STATUS1_PARALYSIS);
- gActiveBank = gBankTarget;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerTarget;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal;
@@ -3035,21 +2852,21 @@ void SetMoveEffect(bool8 primary, u8 certain)
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
break;
case MOVE_EFFECT_THRASH:
- if (gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)
+ if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE)
{
gBattlescriptCurrInstr++;
}
else
{
- gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMoves[gEffectBank] = gCurrentMove;
- gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA);
+ gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;
+ gLockedMoves[gEffectBattler] = gCurrentMove;
+ gBattleMons[gEffectBattler].status2 |= (((Random() & 1) + 2) << 0xA);
}
break;
case MOVE_EFFECT_KNOCK_OFF:
- if (gBattleMons[gEffectBank].ability == ABILITY_STICKY_HOLD)
+ if (gBattleMons[gEffectBattler].ability == ABILITY_STICKY_HOLD)
{
- if (gBattleMons[gEffectBank].item == 0)
+ if (gBattleMons[gEffectBattler].item == 0)
{
gBattlescriptCurrInstr++;
}
@@ -3057,23 +2874,23 @@ void SetMoveEffect(bool8 primary, u8 certain)
{
gLastUsedAbility = ABILITY_STICKY_HOLD;
gBattlescriptCurrInstr = BattleScript_StickyHoldActivates;
- RecordAbilityBattle(gEffectBank, ABILITY_STICKY_HOLD);
+ RecordAbilityBattle(gEffectBattler, ABILITY_STICKY_HOLD);
}
break;
}
- if (gBattleMons[gEffectBank].item)
+ if (gBattleMons[gEffectBattler].item)
{
- side = GetBankSide(gEffectBank);
+ side = GetBattlerSide(gEffectBattler);
- gLastUsedItem = gBattleMons[gEffectBank].item;
- gBattleMons[gEffectBank].item = 0;
- gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlePartyID[gEffectBank]];
+ gLastUsedItem = gBattleMons[gEffectBattler].item;
+ gBattleMons[gEffectBattler].item = 0;
+ gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]];
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_KnockedOff;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBank]) + 0) = 0;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBank]) + 1) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 0) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 1) = 0;
}
else
{
@@ -3095,20 +2912,20 @@ static void atk15_seteffectwithchance(void)
{
u32 percentChance;
- if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE)
+ if (gBattleMons[gBattlerAttacker].ability == ABILITY_SERENE_GRACE)
percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2;
else
percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance;
if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_CERTAIN
- && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(MOVE_EFFECT_CERTAIN);
SetMoveEffect(0, MOVE_EFFECT_CERTAIN);
}
else if (Random() % 100 < percentChance
&& gBattleCommunication[MOVE_EFFECT_BYTE]
- && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
if (percentChance >= 100)
SetMoveEffect(0, MOVE_EFFECT_CERTAIN);
@@ -3121,7 +2938,7 @@ static void atk15_seteffectwithchance(void)
}
gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
- gBattleScripting.field_16 = 0;
+ gBattleScripting.multihitMoveEffect = 0;
}
static void atk16_seteffectprimary(void)
@@ -3134,34 +2951,34 @@ static void atk17_seteffectsecondary(void)
SetMoveEffect(FALSE, 0);
}
-static void atk18_status_effect_clear(void)
+static void atk18_clearstatusfromeffect(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
if (gBattleCommunication[MOVE_EFFECT_BYTE] <= MOVE_EFFECT_TOXIC)
- gBattleMons[gActiveBank].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
+ gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
else
- gBattleMons[gActiveBank].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
+ gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
gBattlescriptCurrInstr += 2;
- gBattleScripting.field_16 = 0;
+ gBattleScripting.multihitMoveEffect = 0;
}
-static void atk19_faint_pokemon(void)
+static void atk19_tryfaintmon(void)
{
const u8 *BS_ptr;
if (gBattlescriptCurrInstr[2] != 0)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- if (gHitMarker & HITMARKER_FAINTED(gActiveBank))
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))
{
- BS_ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 3);
+ BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
BattleScriptPop();
gBattlescriptCurrInstr = BS_ptr;
- gSideAffecting[GetBankSide(gActiveBank)] &= ~(SIDE_STATUS_SPIKES_DAMAGED);
+ gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED);
}
else
{
@@ -3170,62 +2987,62 @@ static void atk19_faint_pokemon(void)
}
else
{
- u8 bank;
+ u8 battlerId;
- if (gBattlescriptCurrInstr[1] == BS_GET_ATTACKER)
+ if (gBattlescriptCurrInstr[1] == BS_ATTACKER)
{
- gActiveBank = gBankAttacker;
- bank = gBankTarget;
+ gActiveBattler = gBattlerAttacker;
+ battlerId = gBattlerTarget;
BS_ptr = BattleScript_FaintAttacker;
}
else
{
- gActiveBank = gBankTarget;
- bank = gBankAttacker;
+ gActiveBattler = gBattlerTarget;
+ battlerId = gBattlerAttacker;
BS_ptr = BattleScript_FaintTarget;
}
- if (!(gAbsentBankFlags & gBitTable[gActiveBank])
- && gBattleMons[gActiveBank].hp == 0)
+ if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])
+ && gBattleMons[gActiveBattler].hp == 0)
{
- gHitMarker |= HITMARKER_FAINTED(gActiveBank);
+ gHitMarker |= HITMARKER_FAINTED(gActiveBattler);
BattleScriptPush(gBattlescriptCurrInstr + 7);
gBattlescriptCurrInstr = BS_ptr;
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
gHitMarker |= HITMARKER_x400000;
if (gBattleResults.playerFaintCounter < 0xFF)
gBattleResults.playerFaintCounter++;
- AdjustFriendshipOnBattleFaint(gActiveBank);
+ AdjustFriendshipOnBattleFaint(gActiveBattler);
}
else
{
if (gBattleResults.opponentFaintCounter < 0xFF)
gBattleResults.opponentFaintCounter++;
- gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES, NULL);
+ gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL);
}
- if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0)
+ if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0)
{
gHitMarker &= ~(HITMARKER_DESTINYBOND);
BattleScriptPush(gBattlescriptCurrInstr);
- gBattleMoveDamage = gBattleMons[bank].hp;
+ gBattleMoveDamage = gBattleMons[battlerId].hp;
gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife;
}
- if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE)
+ if ((gStatuses3[gBattlerTarget] & STATUS3_GRUDGE)
&& !(gHitMarker & HITMARKER_GRUDGE)
- && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)
- && gBattleMons[gBankAttacker].hp != 0
+ && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)
+ && gBattleMons[gBattlerAttacker].hp != 0
&& gCurrentMove != MOVE_STRUGGLE)
{
- u8 moveIndex = *(gBattleStruct->chosenMovePositions + gBankAttacker);
+ u8 moveIndex = *(gBattleStruct->chosenMovePositions + gBattlerAttacker);
- gBattleMons[gBankAttacker].pp[moveIndex] = 0;
+ gBattleMons[gBattlerAttacker].pp[moveIndex] = 0;
BattleScriptPush(gBattlescriptCurrInstr);
gBattlescriptCurrInstr = BattleScript_GrudgeTakesPp;
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]);
+ MarkBattlerForControllerExec(gActiveBattler);
- PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBankAttacker].moves[moveIndex])
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex])
}
}
else
@@ -3235,28 +3052,28 @@ static void atk19_faint_pokemon(void)
}
}
-static void atk1A_faint_animation(void)
+static void atk1A_dofaintanimation(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- EmitFaintAnimation(0);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ BtlController_EmitFaintAnimation(0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
}
-static void atk1B_faint_effects_clear(void)
+static void atk1B_cleareffectsonfaint(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || gBattleMons[gActiveBank].hp == 0)
+ if (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || gBattleMons[gActiveBattler].hp == 0)
{
- gBattleMons[gActiveBank].status1 = 0;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gBattleMons[gActiveBattler].status1 = 0;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
}
FaintClearSetData(); // Effects like attractions, trapping, etc.
@@ -3266,11 +3083,11 @@ static void atk1B_faint_effects_clear(void)
static void atk1C_jumpifstatus(void)
{
- u8 bank = GetBattleBank(gBattlescriptCurrInstr[1]);
- u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2);
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6);
+ u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6);
- if (gBattleMons[bank].status1 & flags && gBattleMons[bank].hp)
+ if (gBattleMons[battlerId].status1 & flags && gBattleMons[battlerId].hp)
gBattlescriptCurrInstr = jumpPtr;
else
gBattlescriptCurrInstr += 10;
@@ -3278,11 +3095,11 @@ static void atk1C_jumpifstatus(void)
static void atk1D_jumpifstatus2(void)
{
- u8 bank = GetBattleBank(gBattlescriptCurrInstr[1]);
- u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2);
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6);
+ u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6);
- if (gBattleMons[bank].status2 & flags && gBattleMons[bank].hp)
+ if (gBattleMons[battlerId].status2 & flags && gBattleMons[battlerId].hp)
gBattlescriptCurrInstr = jumpPtr;
else
gBattlescriptCurrInstr += 10;
@@ -3290,45 +3107,45 @@ static void atk1D_jumpifstatus2(void)
static void atk1E_jumpifability(void)
{
- u8 bank;
+ u8 battlerId;
u8 ability = gBattlescriptCurrInstr[2];
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3);
- if (gBattlescriptCurrInstr[1] == BS_GET_ATTACKER_SIDE)
+ if (gBattlescriptCurrInstr[1] == BS_ATTACKER_SIDE)
{
- bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBankAttacker, ability, 0, 0);
- if (bank)
+ battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_BATTLER_SIDE, gBattlerAttacker, ability, 0, 0);
+ if (battlerId)
{
gLastUsedAbility = ability;
gBattlescriptCurrInstr = jumpPtr;
- RecordAbilityBattle(bank - 1, gLastUsedAbility);
- gBattleScripting.field_15 = bank - 1;
+ RecordAbilityBattle(battlerId - 1, gLastUsedAbility);
+ gBattleScripting.battlerWithAbility = battlerId - 1;
}
else
gBattlescriptCurrInstr += 7;
}
- else if (gBattlescriptCurrInstr[1] == BS_GET_NOT_ATTACKER_SIDE)
+ else if (gBattlescriptCurrInstr[1] == BS_NOT_ATTACKER_SIDE)
{
- bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBankAttacker, ability, 0, 0);
- if (bank)
+ battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBattlerAttacker, ability, 0, 0);
+ if (battlerId)
{
gLastUsedAbility = ability;
gBattlescriptCurrInstr = jumpPtr;
- RecordAbilityBattle(bank - 1, gLastUsedAbility);
- gBattleScripting.field_15 = bank - 1;
+ RecordAbilityBattle(battlerId - 1, gLastUsedAbility);
+ gBattleScripting.battlerWithAbility = battlerId - 1;
}
else
gBattlescriptCurrInstr += 7;
}
else
{
- bank = GetBattleBank(gBattlescriptCurrInstr[1]);
- if (gBattleMons[bank].ability == ability)
+ battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ if (gBattleMons[battlerId].ability == ability)
{
gLastUsedAbility = ability;
gBattlescriptCurrInstr = jumpPtr;
- RecordAbilityBattle(bank, gLastUsedAbility);
- gBattleScripting.field_15 = bank;
+ RecordAbilityBattle(battlerId, gLastUsedAbility);
+ gBattleScripting.battlerWithAbility = battlerId;
}
else
gBattlescriptCurrInstr += 7;
@@ -3341,15 +3158,15 @@ static void atk1F_jumpifsideaffecting(void)
u16 flags;
const u8* jumpPtr;
- if (gBattlescriptCurrInstr[1] == BS_GET_ATTACKER)
- side = GET_BANK_SIDE(gBankAttacker);
+ if (gBattlescriptCurrInstr[1] == BS_ATTACKER)
+ side = GET_BATTLER_SIDE(gBattlerAttacker);
else
- side = GET_BANK_SIDE(gBankTarget);
+ side = GET_BATTLER_SIDE(gBattlerTarget);
- flags = BS2ScriptRead16(gBattlescriptCurrInstr + 2);
- jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 4);
+ flags = T2_READ_16(gBattlescriptCurrInstr + 2);
+ jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 4);
- if (gSideAffecting[side] & flags)
+ if (gSideStatuses[side] & flags)
gBattlescriptCurrInstr = jumpPtr;
else
gBattlescriptCurrInstr += 8;
@@ -3358,8 +3175,8 @@ static void atk1F_jumpifsideaffecting(void)
static void atk20_jumpifstat(void)
{
u8 ret = 0;
- u8 bank = GetBattleBank(gBattlescriptCurrInstr[1]);
- u8 value = gBattleMons[bank].statStages[gBattlescriptCurrInstr[3]];
+ u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ u8 value = gBattleMons[battlerId].statStages[gBattlescriptCurrInstr[3]];
switch (gBattlescriptCurrInstr[2])
{
@@ -3390,30 +3207,30 @@ static void atk20_jumpifstat(void)
}
if (ret)
- gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5);
+ gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5);
else
gBattlescriptCurrInstr += 9;
}
-static void atk21_jumpifstatus3(void)
+static void atk21_jumpifstatus3condition(void)
{
u32 flags;
- const u8* jumpPtr;
+ const u8 *jumpPtr;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2);
- jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ flags = T2_READ_32(gBattlescriptCurrInstr + 2);
+ jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7);
if (gBattlescriptCurrInstr[6])
{
- if ((gStatuses3[gActiveBank] & flags) != 0)
+ if ((gStatuses3[gActiveBattler] & flags) != 0)
gBattlescriptCurrInstr += 11;
else
gBattlescriptCurrInstr = jumpPtr;
}
else
{
- if ((gStatuses3[gActiveBank] & flags) != 0)
+ if ((gStatuses3[gActiveBattler] & flags) != 0)
gBattlescriptCurrInstr = jumpPtr;
else
gBattlescriptCurrInstr += 11;
@@ -3422,11 +3239,11 @@ static void atk21_jumpifstatus3(void)
static void atk22_jumpiftype(void)
{
- u8 bank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
u8 type = gBattlescriptCurrInstr[2];
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3);
- if (gBattleMons[bank].type1 == type || gBattleMons[bank].type2 == type)
+ if (IS_BATTLER_OF_TYPE(battlerId, type))
gBattlescriptCurrInstr = jumpPtr;
else
gBattlescriptCurrInstr += 7;
@@ -3442,13 +3259,13 @@ static void atk23_getexp(void)
s32 viaExpShare = 0;
u16* exp = &gBattleStruct->expValue;
- gBank1 = GetBattleBank(gBattlescriptCurrInstr[1]);
- sentIn = gSentPokesToOpponent[(gBank1 & 2) >> 1];
+ gBattlerFainted = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ sentIn = gSentPokesToOpponent[(gBattlerFainted & 2) >> 1];
switch (gBattleScripting.atk23_state)
{
case 0: // check if should receive exp at all
- if (GetBankSide(gBank1) != SIDE_OPPONENT || (gBattleTypeFlags &
+ if (GetBattlerSide(gBattlerFainted) != B_SIDE_OPPONENT || (gBattleTypeFlags &
(BATTLE_TYPE_LINK
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_x4000000
@@ -3462,7 +3279,7 @@ static void atk23_getexp(void)
else
{
gBattleScripting.atk23_state++;
- gBattleStruct->field_DF |= gBitTable[gBattlePartyID[gBank1]];
+ gBattleStruct->field_DF |= gBitTable[gBattlerPartyIndexes[gBattlerFainted]];
}
break;
case 1: // calculate experience points to redistribute
@@ -3488,7 +3305,7 @@ static void atk23_getexp(void)
viaExpShare++;
}
- calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7;
+ calculatedExp = gBaseStats[gBattleMons[gBattlerFainted].species].expYield * gBattleMons[gBattlerFainted].level / 7;
if (viaExpShare) // at least one mon is getting exp via exp share
{
@@ -3509,14 +3326,14 @@ static void atk23_getexp(void)
}
gBattleScripting.atk23_state++;
- gBattleStruct->expGetterId = 0;
+ gBattleStruct->expGetterMonId = 0;
gBattleStruct->sentInPokes = sentIn;
}
// fall through
case 2: // set exp value to the poke in expgetter_id and print message
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- item = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_HELD_ITEM);
+ item = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HELD_ITEM);
if (item == ITEM_ENIGMA_BERRY)
holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
@@ -3529,7 +3346,7 @@ static void atk23_getexp(void)
gBattleScripting.atk23_state = 5;
gBattleMoveDamage = 0; // used for exp
}
- else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_LEVEL) == MAX_MON_LEVEL)
+ else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) == MAX_MON_LEVEL)
{
*(&gBattleStruct->sentInPokes) >>= 1;
gBattleScripting.atk23_state = 5;
@@ -3541,11 +3358,11 @@ static void atk23_getexp(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong)
{
BattleStopLowHpSound();
- PlayBGM(0x161);
+ PlayBGM(MUS_KACHI2);
gBattleStruct->wildVictorySong++;
}
- if (GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_HP))
+ if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP))
{
if (gBattleStruct->sentInPokes & 1)
gBattleMoveDamage = *exp;
@@ -3559,10 +3376,10 @@ static void atk23_getexp(void)
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
- if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterId]))
+ if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId]))
{
// check if the pokemon doesn't belong to the player
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gBattleStruct->expGetterId >= 3)
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gBattleStruct->expGetterMonId >= 3)
{
i = 0x149;
}
@@ -3577,31 +3394,31 @@ static void atk23_getexp(void)
i = 0x149;
}
- // get exp getter bank
+ // get exp getter battlerId
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- if (!(gBattlePartyID[2] != gBattleStruct->expGetterId) && !(gAbsentBankFlags & gBitTable[2]))
- gBattleStruct->expGetterBank = 2;
+ if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterMonId) && !(gAbsentBattlerFlags & gBitTable[2]))
+ gBattleStruct->expGetterBattlerId = 2;
else
{
- if (!(gAbsentBankFlags & gBitTable[0]))
- gBattleStruct->expGetterBank = 0;
+ if (!(gAbsentBattlerFlags & gBitTable[0]))
+ gBattleStruct->expGetterBattlerId = 0;
else
- gBattleStruct->expGetterBank = 2;
+ gBattleStruct->expGetterBattlerId = 2;
}
}
else
- gBattleStruct->expGetterBank = 0;
+ gBattleStruct->expGetterBattlerId = 0;
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBank, gBattleStruct->expGetterId)
+ PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBattlerId, gBattleStruct->expGetterMonId)
// buffer 'gained' or 'gained a boosted'
PREPARE_STRING_BUFFER(gBattleTextBuff2, i)
PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage)
- PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank);
- MonGainEVs(&gPlayerParty[gBattleStruct->expGetterId], gBattleMons[gBank1].species);
+ PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBattlerId);
+ MonGainEVs(&gPlayerParty[gBattleStruct->expGetterMonId], gBattleMons[gBattlerFainted].species);
}
gBattleStruct->sentInPokes >>= 1;
gBattleScripting.atk23_state++;
@@ -3609,72 +3426,72 @@ static void atk23_getexp(void)
}
break;
case 3: // Set stats and give exp
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gBattleBufferB[gBattleStruct->expGetterBank][0] = 0;
- if (GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_LEVEL) != MAX_MON_LEVEL)
+ gBattleBufferB[gBattleStruct->expGetterBattlerId][0] = 0;
+ if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) != MAX_MON_LEVEL)
{
- BATTLE_LVLUP_STATS->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_MAX_HP);
- BATTLE_LVLUP_STATS->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_ATK);
- BATTLE_LVLUP_STATS->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_DEF);
- BATTLE_LVLUP_STATS->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED);
- BATTLE_LVLUP_STATS->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPATK);
- BATTLE_LVLUP_STATS->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPDEF);
+ gBattleResources->statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);
+ gBattleResources->statsBeforeLvlUp->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);
+ gBattleResources->statsBeforeLvlUp->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);
+ gBattleResources->statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
+ gBattleResources->statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);
+ gBattleResources->statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);
- gActiveBank = gBattleStruct->expGetterBank;
- EmitExpUpdate(0, gBattleStruct->expGetterId, gBattleMoveDamage);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattleStruct->expGetterBattlerId;
+ BtlController_EmitExpUpdate(0, gBattleStruct->expGetterMonId, gBattleMoveDamage);
+ MarkBattlerForControllerExec(gActiveBattler);
}
gBattleScripting.atk23_state++;
}
break;
case 4: // lvl up if necessary
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = gBattleStruct->expGetterBank;
- if (gBattleBufferB[gActiveBank][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBank][1] == RET_VALUE_LEVELLED_UP)
+ gActiveBattler = gBattleStruct->expGetterBattlerId;
+ if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP)
{
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == gBattleStruct->expGetterId)
- HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId)
+ HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBank, gBattleStruct->expGetterId)
+ PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterMonId)
- PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_LEVEL))
+ PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL))
BattleScriptPushCursor();
- gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterId];
+ gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterMonId];
gBattlescriptCurrInstr = BattleScript_LevelUp;
- gBattleMoveDamage = (gBattleBufferB[gActiveBank][2] | (gBattleBufferB[gActiveBank][3] << 8));
- AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterId], 0);
+ gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8));
+ AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], 0);
// update battle mon structure after level up
- if (gBattlePartyID[0] == gBattleStruct->expGetterId && gBattleMons[0].hp)
+ if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && gBattleMons[0].hp)
{
- gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_LEVEL);
- gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_HP);
- gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_MAX_HP);
- gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_ATK);
- gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_DEF);
+ gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);
+ gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP);
+ gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);
+ gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);
+ gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);
// Why is this duplicated?
- gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED);
- gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED);
+ gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
+ gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
- gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPATK);
- gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPDEF);
+ gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);
+ gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);
}
// What is else if?
- if (gBattlePartyID[2] == gBattleStruct->expGetterId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_LEVEL);
- gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_HP);
- gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_MAX_HP);
- gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_ATK);
- gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_DEF);
+ gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);
+ gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP);
+ gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);
+ gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);
+ gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);
// Duplicated again, but this time there's no Sp Defense
- gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED);
- gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED);
+ gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
+ gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
- gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPATK);
+ gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);
}
gBattleScripting.atk23_state = 5;
}
@@ -3690,19 +3507,19 @@ static void atk23_getexp(void)
gBattleScripting.atk23_state = 3;
else
{
- gBattleStruct->expGetterId++;
- if (gBattleStruct->expGetterId <= 5)
+ gBattleStruct->expGetterMonId++;
+ if (gBattleStruct->expGetterMonId <= 5)
gBattleScripting.atk23_state = 2; // loop again
else
gBattleScripting.atk23_state = 6; // we're done
}
break;
case 6: // increment instruction
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
// not sure why gf clears the item and ability here
- gBattleMons[gBank1].item = 0;
- gBattleMons[gBank1].ability = 0;
+ gBattleMons[gBattlerFainted].item = 0;
+ gBattleMons[gBattlerFainted].ability = 0;
gBattlescriptCurrInstr += 2;
}
break;
@@ -3715,10 +3532,10 @@ static void atk24(void)
u16 HP_count = 0;
s32 i;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId == STEVEN_PARTNER_ID)
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId == TRAINER_STEVEN_PARTNER)
{
for (i = 0; i < 3; i++)
{
@@ -3731,7 +3548,7 @@ static void atk24(void)
for (i = 0; i < 6; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)
- && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->field_2A0 & gBitTable[i])))
+ && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->field_2A0 & gBitTable[i])))
{
HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);
}
@@ -3739,7 +3556,7 @@ static void atk24(void)
}
if (HP_count == 0)
- gBattleOutcome |= BATTLE_LOST;
+ gBattleOutcome |= B_OUTCOME_LOST;
for (HP_count = 0, i = 0; i < 6; i++)
{
@@ -3751,7 +3568,7 @@ static void atk24(void)
}
if (HP_count == 0)
- gBattleOutcome |= BATTLE_WON;
+ gBattleOutcome |= B_OUTCOME_WON;
if (gBattleOutcome == 0 && (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
{
@@ -3759,13 +3576,13 @@ static void atk24(void)
s32 foundOpponent;
// Impossible to decompile loops.
- for (foundPlayer = 0, i = 0; i < gNoOfAllBanks; i += 2)
+ for (foundPlayer = 0, i = 0; i < gBattlersCount; i += 2)
{
if (HITMARKER_UNK(i) & gHitMarker && !gSpecialStatuses[i].flag40)
foundPlayer++;
}
- for (foundOpponent = 0, i = 1; i < gNoOfAllBanks; i += 2)
+ for (foundOpponent = 0, i = 1; i < gBattlersCount; i += 2)
{
if (HITMARKER_UNK(i) & gHitMarker && !gSpecialStatuses[i].flag40)
foundOpponent++;
@@ -3774,14 +3591,14 @@ static void atk24(void)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
if (foundOpponent + foundPlayer > 1)
- gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
}
else
{
if (foundOpponent != 0 && foundPlayer != 0)
- gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
}
@@ -3792,7 +3609,7 @@ static void atk24(void)
}
}
#else
-__attribute__((naked))
+NAKED
static void atk24(void)
{
asm("\n\
@@ -3801,7 +3618,7 @@ static void atk24(void)
mov r7, r8\n\
push {r7}\n\
movs r6, 0\n\
- ldr r0, =gBattleExecBuffer\n\
+ ldr r0, =gBattleControllerExecFlags\n\
ldr r0, [r0]\n\
cmp r0, 0\n\
beq _0804ACE2\n\
@@ -3974,7 +3791,7 @@ static void atk24(void)
beq _0804AF1A\n\
movs r3, 0\n\
movs r5, 0\n\
- ldr r0, =gNoOfAllBanks\n\
+ ldr r0, =gBattlersCount\n\
ldrb r1, [r0]\n\
mov r12, r0\n\
ldr r7, =gBattlescriptCurrInstr\n\
@@ -4089,7 +3906,7 @@ static void atk24(void)
static void MoveValuesCleanUp(void)
{
- gBattleMoveFlags = 0;
+ gMoveResultFlags = 0;
gBattleScripting.dmgMultiplier = 1;
gCritMultiplier = 1;
gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
@@ -4098,37 +3915,37 @@ static void MoveValuesCleanUp(void)
gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
}
-static void atk25_move_values_cleanup(void)
+static void atk25_movevaluescleanup(void)
{
MoveValuesCleanUp();
gBattlescriptCurrInstr += 1;
}
-static void atk26_set_multihit(void)
+static void atk26_setmultihit(void)
{
gMultiHitCounter = gBattlescriptCurrInstr[1];
gBattlescriptCurrInstr += 2;
}
-static void atk27_decrement_multihit(void)
+static void atk27_decrementmultihit(void)
{
if (--gMultiHitCounter == 0)
gBattlescriptCurrInstr += 5;
else
- gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
}
static void atk28_goto(void)
{
- gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1);
}
static void atk29_jumpifbyte(void)
{
u8 caseID = gBattlescriptCurrInstr[1];
- const u8* memByte = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2);
+ const u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 2);
u8 value = gBattlescriptCurrInstr[6];
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 7);
gBattlescriptCurrInstr += 11;
@@ -4164,9 +3981,9 @@ static void atk29_jumpifbyte(void)
static void atk2A_jumpifhalfword(void)
{
u8 caseID = gBattlescriptCurrInstr[1];
- const u16* memHword = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2);
- u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 6);
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 8);
+ const u16* memHword = T2_READ_PTR(gBattlescriptCurrInstr + 2);
+ u16 value = T2_READ_16(gBattlescriptCurrInstr + 6);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 8);
gBattlescriptCurrInstr += 12;
@@ -4202,9 +4019,9 @@ static void atk2A_jumpifhalfword(void)
static void atk2B_jumpifword(void)
{
u8 caseID = gBattlescriptCurrInstr[1];
- const u32* memWord = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2);
- u32 value = BSScriptRead32(gBattlescriptCurrInstr + 6);
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10);
+ const u32* memWord = T2_READ_PTR(gBattlescriptCurrInstr + 2);
+ u32 value = T1_READ_32(gBattlescriptCurrInstr + 6);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10);
gBattlescriptCurrInstr += 14;
@@ -4239,10 +4056,10 @@ static void atk2B_jumpifword(void)
static void atk2C_jumpifarrayequal(void)
{
- const u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- const u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5);
+ const u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ const u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);
u32 size = gBattlescriptCurrInstr[9];
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10);
u8 i;
for (i = 0; i < size; i++)
@@ -4262,10 +4079,10 @@ static void atk2C_jumpifarrayequal(void)
static void atk2D_jumpifarraynotequal(void)
{
u8 equalBytes = 0;
- const u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- const u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5);
+ const u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ const u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5);
u32 size = gBattlescriptCurrInstr[9];
- const u8* jumpPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10);
+ const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 10);
u8 i;
for (i = 0; i < size; i++)
@@ -4285,7 +4102,7 @@ static void atk2D_jumpifarraynotequal(void)
static void atk2E_setbyte(void)
{
- u8* memByte = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);
*memByte = gBattlescriptCurrInstr[5];
gBattlescriptCurrInstr += 6;
@@ -4293,22 +4110,22 @@ static void atk2E_setbyte(void)
static void atk2F_addbyte(void)
{
- u8* memByte = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);
*memByte += gBattlescriptCurrInstr[5];
gBattlescriptCurrInstr += 6;
}
static void atk30_subbyte(void)
{
- u8* memByte = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);
*memByte -= gBattlescriptCurrInstr[5];
gBattlescriptCurrInstr += 6;
}
static void atk31_copyarray(void)
{
- u8* dest = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- const u8* src = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5);
+ u8* dest = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ const u8* src = T2_READ_PTR(gBattlescriptCurrInstr + 5);
s32 size = gBattlescriptCurrInstr[9];
s32 i;
@@ -4320,11 +4137,11 @@ static void atk31_copyarray(void)
gBattlescriptCurrInstr += 10;
}
-static void atk32_copyarray_withindex(void)
+static void atk32_copyarraywithindex(void)
{
- u8* dest = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- const u8* src = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5);
- const u8* index = BS2ScriptReadPtr(gBattlescriptCurrInstr + 9);
+ u8* dest = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ const u8* src = T2_READ_PTR(gBattlescriptCurrInstr + 5);
+ const u8* index = T2_READ_PTR(gBattlescriptCurrInstr + 9);
s32 size = gBattlescriptCurrInstr[13];
s32 i;
@@ -4338,15 +4155,15 @@ static void atk32_copyarray_withindex(void)
static void atk33_orbyte(void)
{
- u8* memByte = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);
*memByte |= gBattlescriptCurrInstr[5];
gBattlescriptCurrInstr += 6;
}
static void atk34_orhalfword(void)
{
- u16* memHword = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5);
+ u16* memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ u16 val = T2_READ_16(gBattlescriptCurrInstr + 5);
*memHword |= val;
gBattlescriptCurrInstr += 7;
@@ -4354,8 +4171,8 @@ static void atk34_orhalfword(void)
static void atk35_orword(void)
{
- u32* memWord = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5);
+ u32* memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ u32 val = T2_READ_32(gBattlescriptCurrInstr + 5);
*memWord |= val;
gBattlescriptCurrInstr += 9;
@@ -4363,15 +4180,15 @@ static void atk35_orword(void)
static void atk36_bicbyte(void)
{
- u8* memByte = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
+ u8* memByte = T2_READ_PTR(gBattlescriptCurrInstr + 1);
*memByte &= ~(gBattlescriptCurrInstr[5]);
gBattlescriptCurrInstr += 6;
}
static void atk37_bichalfword(void)
{
- u16* memHword = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5);
+ u16* memHword = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ u16 val = T2_READ_16(gBattlescriptCurrInstr + 5);
*memHword &= ~val;
gBattlescriptCurrInstr += 7;
@@ -4379,8 +4196,8 @@ static void atk37_bichalfword(void)
static void atk38_bicword(void)
{
- u32* memWord = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1);
- u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5);
+ u32* memWord = T2_READ_PTR(gBattlescriptCurrInstr + 1);
+ u32 val = T2_READ_32(gBattlescriptCurrInstr + 5);
*memWord &= ~val;
gBattlescriptCurrInstr += 9;
@@ -4388,9 +4205,9 @@ static void atk38_bicword(void)
static void atk39_pause(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 1);
+ u16 value = T2_READ_16(gBattlescriptCurrInstr + 1);
if (++gPauseCounterBattle >= value)
{
gPauseCounterBattle = 0;
@@ -4401,19 +4218,19 @@ static void atk39_pause(void)
static void atk3A_waitstate(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
gBattlescriptCurrInstr++;
}
static void atk3B_healthbar_update(void)
{
- if (gBattlescriptCurrInstr[1] == BS_GET_TARGET)
- gActiveBank = gBankTarget;
+ if (gBattlescriptCurrInstr[1] == BS_TARGET)
+ gActiveBattler = gBattlerTarget;
else
- gActiveBank = gBankAttacker;
+ gActiveBattler = gBattlerAttacker;
- EmitHealthBarUpdate(0, gBattleMoveDamage);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitHealthBarUpdate(0, gBattleMoveDamage);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
@@ -4425,39 +4242,39 @@ static void atk3C_return(void)
static void atk3D_end(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
- sub_81A5718(gBankAttacker);
+ sub_81A5718(gBattlerAttacker);
- gBattleMoveFlags = 0;
- gActiveBank = 0;
+ gMoveResultFlags = 0;
+ gActiveBattler = 0;
gCurrentActionFuncId = 0xB;
}
static void atk3E_end2(void)
{
- gActiveBank = 0;
+ gActiveBattler = 0;
gCurrentActionFuncId = 0xB;
}
static void atk3F_end3(void) // pops the main function stack
{
BattleScriptPop();
- if (BATTLE_CALLBACKS_STACK->size)
- BATTLE_CALLBACKS_STACK->size--;
- gBattleMainFunc = BATTLE_CALLBACKS_STACK->function[BATTLE_CALLBACKS_STACK->size];
+ if (gBattleResources->battleCallbackStack->size != 0)
+ gBattleResources->battleCallbackStack->size--;
+ gBattleMainFunc = gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size];
}
static void atk41_call(void)
{
BattleScriptPush(gBattlescriptCurrInstr + 5);
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
static void atk42_jumpiftype2(void)
{
- u8 bank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (gBattlescriptCurrInstr[2] == gBattleMons[bank].type1 || gBattlescriptCurrInstr[2] == gBattleMons[bank].type2)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 3);
+ if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type1 || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type2)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
else
gBattlescriptCurrInstr += 7;
}
@@ -4465,29 +4282,29 @@ static void atk42_jumpiftype2(void)
static void atk43_jumpifabilitypresent(void)
{
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, gBattlescriptCurrInstr[1], 0, 0))
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
-static void atk44_end_selection_script(void)
+static void atk44_endselectionscript(void)
{
- *(gBankAttacker + gBattleStruct->selectionScriptFinished) = TRUE;
+ *(gBattlerAttacker + gBattleStruct->selectionScriptFinished) = TRUE;
}
static void atk45_playanimation(void)
{
const u16* argumentPtr;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3);
if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE
|| gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE
|| gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE)
{
- EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 7;
}
else if (gHitMarker & HITMARKER_NO_ANIMATIONS)
@@ -4500,18 +4317,18 @@ static void atk45_playanimation(void)
|| gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES
|| gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES)
{
- EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 7;
}
- else if (gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE)
+ else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)
{
gBattlescriptCurrInstr += 7;
}
else
{
- EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 7;
}
}
@@ -4521,16 +4338,16 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po
const u16* argumentPtr;
const u8* animationIdPtr;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- animationIdPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2);
- argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ animationIdPtr = T2_READ_PTR(gBattlescriptCurrInstr + 2);
+ argumentPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6);
if (*animationIdPtr == B_ANIM_STATS_CHANGE
|| *animationIdPtr == B_ANIM_SNATCH_MOVE
|| *animationIdPtr == B_ANIM_SUBSTITUTE_FADE)
{
- EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 10;
}
else if (gHitMarker & HITMARKER_NO_ANIMATIONS)
@@ -4542,18 +4359,18 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po
|| *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES
|| *animationIdPtr == B_ANIM_HAIL_CONTINUES)
{
- EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 10;
}
- else if (gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE)
+ else if (gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)
{
gBattlescriptCurrInstr += 10;
}
else
{
- EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 10;
}
}
@@ -4561,70 +4378,73 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po
static void atk47_setgraphicalstatchangevalues(void)
{
u8 value = 0;
- switch (gBattleScripting.statChanger & 0xF0)
+ switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger))
{
- case 0x10: // +1
+ case SET_STAT_BUFF_VALUE(1): // +1
value = 0xF;
break;
- case 0x20: // +2
+ case SET_STAT_BUFF_VALUE(2): // +2
value = 0x27;
break;
- case 0x90: // -1
+ case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1
value = 0x16;
break;
- case 0xA0: // -2
+ case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2
value = 0x2E;
break;
}
- gBattleScripting.animArg1 = (gBattleScripting.statChanger & 0xF) + value - 1;
+ gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1;
gBattleScripting.animArg2 = 0;
gBattlescriptCurrInstr++;
}
-#ifdef NONMATCHING
static void atk48_playstatchangeanimation(void)
{
u32 currStat = 0;
- s16 statAnimId = 0;
- s16 checkingStatAnimId = 0;
- s32 changeableStats = 0;
- u32 statsToCheck = 0;
+ u16 statAnimId = 0;
+ s32 changeableStatsCount = 0;
+ u8 statsToCheck = 0;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
statsToCheck = gBattlescriptCurrInstr[2];
if (gBattlescriptCurrInstr[3] & ATK48_STAT_NEGATIVE) // goes down
{
- checkingStatAnimId = (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) ? 0x2D : 0x15;
+ s16 startingStatAnimId;
+ if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
+ startingStatAnimId = 0x2D;
+ else
+ startingStatAnimId = 0x15;
+
while (statsToCheck != 0)
{
if (statsToCheck & 1)
{
- if (!(gBattlescriptCurrInstr[3] & ATK48_LOWER_FAIL_CHECK))
+ if (gBattlescriptCurrInstr[3] & ATK48_DONT_CHECK_LOWER)
{
- if (gBattleMons[gActiveBank].statStages[currStat] > 0)
+ if (gBattleMons[gActiveBattler].statStages[currStat] > 0)
{
- statAnimId = checkingStatAnimId;
- changeableStats++;
+ statAnimId = startingStatAnimId + currStat;
+ changeableStatsCount++;
}
}
- else if (!gSideTimers[GET_BANK_SIDE(gActiveBank)].mistTimer
- && gBattleMons[gActiveBank].ability != ABILITY_CLEAR_BODY
- && gBattleMons[gActiveBank].ability != ABILITY_WHITE_SMOKE
- && !(gBattleMons[gActiveBank].ability == ABILITY_KEEN_EYE && currStat == STAT_STAGE_ACC)
- && !(gBattleMons[gActiveBank].ability == ABILITY_HYPER_CUTTER && currStat == STAT_STAGE_ATK))
+ else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer
+ && gBattleMons[gActiveBattler].ability != ABILITY_CLEAR_BODY
+ && gBattleMons[gActiveBattler].ability != ABILITY_WHITE_SMOKE
+ && !(gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE && currStat == STAT_ACC)
+ && !(gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK))
{
- if (gBattleMons[gActiveBank].statStages[currStat] > 0)
+ if (gBattleMons[gActiveBattler].statStages[currStat] > 0)
{
- statAnimId = checkingStatAnimId;
- changeableStats++;
+ statAnimId = startingStatAnimId + currStat;
+ changeableStatsCount++;
}
}
}
- statsToCheck >>= 1, checkingStatAnimId++, currStat++;
+ statsToCheck >>= 1, currStat++;
}
- if (changeableStats > 1) // more than one stat, so the color is gray
+ if (changeableStatsCount > 1) // more than one stat, so the color is gray
{
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
statAnimId = 0x3A;
@@ -4634,18 +4454,23 @@ static void atk48_playstatchangeanimation(void)
}
else // goes up
{
- checkingStatAnimId = (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) ? 0x26 : 0xE;
+ s16 startingStatAnimId;
+ if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
+ startingStatAnimId = 0x26;
+ else
+ startingStatAnimId = 0xE;
+
while (statsToCheck != 0)
{
- if (statsToCheck & 1 && gBattleMons[gActiveBank].statStages[currStat] < 0xC)
+ if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < 0xC)
{
- statAnimId = checkingStatAnimId;
- changeableStats++;
+ statAnimId = startingStatAnimId + currStat;
+ changeableStatsCount++;
}
- statsToCheck >>= 1, checkingStatAnimId += 1, currStat++;
+ statsToCheck >>= 1, currStat++;
}
- if (changeableStats > 1) // more than one stat, so the color is gray
+ if (changeableStatsCount > 1) // more than one stat, so the color is gray
{
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
statAnimId = 0x38;
@@ -4654,16 +4479,16 @@ static void atk48_playstatchangeanimation(void)
}
}
- if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStats < 2)
+ if (gBattlescriptCurrInstr[3] & ATK48_ONLY_MULTIPLE && changeableStatsCount < 2)
{
gBattlescriptCurrInstr += 4;
}
- else if (changeableStats != 0 && gBattleScripting.field_1B == 0)
+ else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed)
{
- EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId);
- MarkBufferBankForExecution(gActiveBank);
- if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStats > 1)
- gBattleScripting.field_1B = 1;
+ BtlController_EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId);
+ MarkBattlerForControllerExec(gActiveBattler);
+ if (gBattlescriptCurrInstr[3] & ATK48_ONLY_MULTIPLE && changeableStatsCount > 1)
+ gBattleScripting.statAnimPlayed = TRUE;
gBattlescriptCurrInstr += 4;
}
else
@@ -4671,261 +4496,6 @@ static void atk48_playstatchangeanimation(void)
gBattlescriptCurrInstr += 4;
}
}
-#else
-__attribute__((naked))
-static void atk48_playstatchangeanimation(void)
-{
- asm("\n\
- .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\
- movs r7, 0\n\
- movs r0, 0\n\
- mov r8, r0\n\
- movs r3, 0\n\
- ldr r5, =gBattlescriptCurrInstr\n\
- ldr r0, [r5]\n\
- ldrb r0, [r0, 0x1]\n\
- str r3, [sp]\n\
- bl GetBattleBank\n\
- ldr r2, =gActiveBank\n\
- strb r0, [r2]\n\
- ldr r0, [r5]\n\
- ldrb r4, [r0, 0x2]\n\
- ldrb r1, [r0, 0x3]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- ldr r3, [sp]\n\
- cmp r0, 0\n\
- beq _0804BAEC\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- movs r1, 0x15\n\
- cmp r0, 0\n\
- beq _0804BA18\n\
- movs r1, 0x2D\n\
-_0804BA18:\n\
- cmp r4, 0\n\
- beq _0804BAC0\n\
- movs r0, 0x1\n\
- mov r10, r0\n\
- ldr r0, =gBattleMons + 0x18\n\
- mov r9, r0\n\
- lsls r5, r1, 16\n\
-_0804BA26:\n\
- adds r0, r4, 0\n\
- mov r1, r10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0804BAB2\n\
- ldr r0, =gBattlescriptCurrInstr\n\
- ldr r0, [r0]\n\
- ldrb r1, [r0, 0x3]\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0804BA58\n\
- ldr r0, =gActiveBank\n\
- ldrb r1, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- adds r0, r7, r0\n\
- b _0804BAA0\n\
- .pool\n\
-_0804BA58:\n\
- ldr r6, =gActiveBank\n\
- ldrb r0, [r6]\n\
- str r3, [sp]\n\
- bl GetBankIdentity\n\
- mov r1, r10\n\
- ands r1, r0\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- ldr r1, =gSideTimers\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x4]\n\
- ldr r3, [sp]\n\
- cmp r0, 0\n\
- bne _0804BAB2\n\
- ldr r0, =gBattleMons\n\
- ldrb r2, [r6]\n\
- movs r1, 0x58\n\
- muls r2, r1\n\
- adds r0, r2, r0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x1D\n\
- beq _0804BAB2\n\
- cmp r0, 0x49\n\
- beq _0804BAB2\n\
- cmp r0, 0x33\n\
- bne _0804BA96\n\
- cmp r7, 0x6\n\
- beq _0804BAB2\n\
-_0804BA96:\n\
- cmp r0, 0x34\n\
- bne _0804BA9E\n\
- cmp r7, 0x1\n\
- beq _0804BAB2\n\
-_0804BA9E:\n\
- adds r0, r7, r2\n\
-_0804BAA0:\n\
- add r0, r9\n\
- ldrb r0, [r0]\n\
- lsls r0, 24\n\
- asrs r0, 24\n\
- cmp r0, 0\n\
- ble _0804BAB2\n\
- lsrs r0, r5, 16\n\
- mov r8, r0\n\
- adds r3, 0x1\n\
-_0804BAB2:\n\
- lsrs r4, 1\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- adds r5, r1\n\
- adds r7, 0x1\n\
- cmp r4, 0\n\
- bne _0804BA26\n\
-_0804BAC0:\n\
- ldr r0, =gBattlescriptCurrInstr\n\
- mov r9, r0\n\
- cmp r3, 0x1\n\
- ble _0804BB4E\n\
- ldr r0, [r0]\n\
- ldrb r1, [r0, 0x3]\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- movs r1, 0x39\n\
- mov r8, r1\n\
- cmp r0, 0\n\
- beq _0804BB4E\n\
- movs r0, 0x3A\n\
- b _0804BB4C\n\
- .pool\n\
-_0804BAEC:\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- movs r1, 0xE\n\
- cmp r0, 0\n\
- beq _0804BAF8\n\
- movs r1, 0x26\n\
-_0804BAF8:\n\
- mov r9, r5\n\
- cmp r4, 0\n\
- beq _0804BB34\n\
- ldr r6, =gBattleMons + 0x18\n\
- adds r5, r2, 0\n\
- lsls r2, r1, 16\n\
-_0804BB04:\n\
- movs r0, 0x1\n\
- ands r0, r4\n\
- cmp r0, 0\n\
- beq _0804BB26\n\
- ldrb r1, [r5]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- adds r0, r7, r0\n\
- adds r0, r6\n\
- ldrb r0, [r0]\n\
- lsls r0, 24\n\
- asrs r0, 24\n\
- cmp r0, 0xB\n\
- bgt _0804BB26\n\
- lsrs r1, r2, 16\n\
- mov r8, r1\n\
- adds r3, 0x1\n\
-_0804BB26:\n\
- lsrs r4, 1\n\
- movs r0, 0x80\n\
- lsls r0, 9\n\
- adds r2, r0\n\
- adds r7, 0x1\n\
- cmp r4, 0\n\
- bne _0804BB04\n\
-_0804BB34:\n\
- cmp r3, 0x1\n\
- ble _0804BB4E\n\
- mov r1, r9\n\
- ldr r0, [r1]\n\
- ldrb r1, [r0, 0x3]\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- movs r1, 0x37\n\
- mov r8, r1\n\
- cmp r0, 0\n\
- beq _0804BB4E\n\
- movs r0, 0x38\n\
-_0804BB4C:\n\
- mov r8, r0\n\
-_0804BB4E:\n\
- mov r1, r9\n\
- ldr r2, [r1]\n\
- ldrb r1, [r2, 0x3]\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0804BB6C\n\
- cmp r3, 0x1\n\
- bgt _0804BB6C\n\
- adds r0, r2, 0x4\n\
- mov r1, r9\n\
- b _0804BBBA\n\
- .pool\n\
-_0804BB6C:\n\
- cmp r3, 0\n\
- beq _0804BBB4\n\
- ldr r4, =gBattleScripting\n\
- ldrb r0, [r4, 0x1B]\n\
- cmp r0, 0\n\
- bne _0804BBB4\n\
- movs r0, 0\n\
- movs r1, 0x1\n\
- mov r2, r8\n\
- str r3, [sp]\n\
- bl EmitBattleAnimation\n\
- ldr r0, =gActiveBank\n\
- ldrb r0, [r0]\n\
- bl MarkBufferBankForExecution\n\
- ldr r0, =gBattlescriptCurrInstr\n\
- ldr r0, [r0]\n\
- ldrb r1, [r0, 0x3]\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- ldr r3, [sp]\n\
- cmp r0, 0\n\
- beq _0804BBA4\n\
- cmp r3, 0x1\n\
- ble _0804BBA4\n\
- movs r0, 0x1\n\
- strb r0, [r4, 0x1B]\n\
-_0804BBA4:\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- b _0804BBB6\n\
- .pool\n\
-_0804BBB4:\n\
- mov r1, r9\n\
-_0804BBB6:\n\
- ldr r0, [r1]\n\
- adds r0, 0x4\n\
-_0804BBBA:\n\
- str 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");
-}
-#endif // NONMATCHING
#define ATK49_LAST_CASE 17
@@ -4937,25 +4507,24 @@ static void atk49_moveend(void)
u8 holdEffectAtk;
u16 *choicedMoveAtk;
u8 arg1, arg2;
- u16 lastMove;
+ u16 originallyUsedMove;
effect = FALSE;
- if (gLastUsedMove == 0xFFFF)
- lastMove = 0;
+ if (gChosenMove == 0xFFFF)
+ originallyUsedMove = 0;
else
- lastMove = gLastUsedMove;
+ originallyUsedMove = gChosenMove;
arg1 = gBattlescriptCurrInstr[1];
arg2 = gBattlescriptCurrInstr[2];
- if (gBattleMons[gBankAttacker].item == ITEM_ENIGMA_BERRY)
- holdEffectAtk = gEnigmaBerries[gBankAttacker].holdEffect;
+ if (gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY)
+ holdEffectAtk = gEnigmaBerries[gBattlerAttacker].holdEffect;
else
- holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBankAttacker].item);
-
- choicedMoveAtk = &gBattleStruct->choicedMove[gBankAttacker];
+ holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBattlerAttacker].item);
+ choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker];
GET_MOVE_TYPE(gCurrentMove, moveType);
do
@@ -4963,13 +4532,13 @@ static void atk49_moveend(void)
switch (gBattleScripting.atk49_state)
{
case 0: // rage check
- if (gBattleMons[gBankTarget].status2 & STATUS2_RAGE
- && gBattleMons[gBankTarget].hp != 0 && gBankAttacker != gBankTarget
- && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)
- && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && TARGET_TURN_DAMAGED
- && gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE
+ && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget
+ && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)
+ && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED
+ && gBattleMoves[gCurrentMove].power && gBattleMons[gBattlerTarget].statStages[STAT_ATK] <= 0xB)
{
- gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++;
+ gBattleMons[gBattlerTarget].statStages[STAT_ATK]++;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_RageIsBuilding;
effect = TRUE;
@@ -4977,15 +4546,15 @@ static void atk49_moveend(void)
gBattleScripting.atk49_state++;
break;
case 1: // defrosting check
- if (gBattleMons[gBankTarget].status1 & STATUS_FREEZE
- && gBattleMons[gBankTarget].hp != 0 && gBankAttacker != gBankTarget
- && gSpecialStatuses[gBankTarget].moveturnLostHP_special
- && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && moveType == TYPE_FIRE)
- {
- gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE);
- gActiveBank = gBankTarget;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1);
- MarkBufferBankForExecution(gActiveBank);
+ if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE
+ && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget
+ && gSpecialStatuses[gBattlerTarget].specialDmg
+ && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && moveType == TYPE_FIRE)
+ {
+ gBattleMons[gBattlerTarget].status1 &= ~(STATUS1_FREEZE);
+ gActiveBattler = gBattlerTarget;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerTarget].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove;
effect = TRUE;
@@ -4993,41 +4562,41 @@ static void atk49_moveend(void)
gBattleScripting.atk49_state++;
break;
case 2: // target synchronize
- if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBankTarget, 0, 0, 0))
+ if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0))
effect = TRUE;
gBattleScripting.atk49_state++;
break;
case 3: // contact abilities
- if (AbilityBattleEffects(ABILITYEFFECT_CONTACT, gBankTarget, 0, 0, 0))
+ if (AbilityBattleEffects(ABILITYEFFECT_CONTACT, gBattlerTarget, 0, 0, 0))
effect = TRUE;
gBattleScripting.atk49_state++;
break;
case 4: // status immunities
if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0))
- effect = TRUE; // it loops through all banks, so we increment after its done with all banks
+ effect = TRUE; // it loops through all battlers, so we increment after its done with all battlers
else
gBattleScripting.atk49_state++;
break;
case 5: // attacker synchronize
- if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBankAttacker, 0, 0, 0))
+ if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBattlerAttacker, 0, 0, 0))
effect = TRUE;
gBattleScripting.atk49_state++;
break;
case 6: // update choice band move
if (!(gHitMarker & HITMARKER_OBEYS) || holdEffectAtk != HOLD_EFFECT_CHOICE_BAND
- || gLastUsedMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF))
+ || gChosenMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF))
goto LOOP;
- if (gLastUsedMove == MOVE_BATON_PASS && !(gBattleMoveFlags & MOVESTATUS_FAILED))
+ if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED))
{
gBattleScripting.atk49_state++;
break;
}
- *choicedMoveAtk = gLastUsedMove;
+ *choicedMoveAtk = gChosenMove;
LOOP:
{
for (i = 0; i < 4; i++)
{
- if (gBattleMons[gBankAttacker].moves[i] == *choicedMoveAtk)
+ if (gBattleMons[gBattlerAttacker].moves[i] == *choicedMoveAtk)
break;
}
if (i == 4)
@@ -5037,7 +4606,7 @@ static void atk49_moveend(void)
}
break;
case 7: // changed held items
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
u16* changedItem = &gBattleStruct->changedItems[i];
if (*changedItem != 0)
@@ -5048,7 +4617,7 @@ static void atk49_moveend(void)
}
gBattleScripting.atk49_state++;
break;
- case 11: // item effects for all banks
+ case 11: // item effects for all battlers
if (ItemBattleEffects(3, 0, FALSE))
effect = TRUE;
else
@@ -5060,47 +4629,47 @@ static void atk49_moveend(void)
gBattleScripting.atk49_state++;
break;
case 8: // make attacker sprite invisible
- if (gStatuses3[gBankAttacker] & (STATUS3_SEMI_INVULNERABLE)
+ if (gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE)
&& gHitMarker & HITMARKER_NO_ANIMATIONS)
{
- gActiveBank = gBankAttacker;
- EmitSpriteInvisibility(0, TRUE);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSpriteInvisibility(0, TRUE);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattleScripting.atk49_state++;
return;
}
gBattleScripting.atk49_state++;
break;
case 9: // make attacker sprite visible
- if (gBattleMoveFlags & MOVESTATUS_NOEFFECT
- || !(gStatuses3[gBankAttacker] & (STATUS3_SEMI_INVULNERABLE))
- || WasUnableToUseMove(gBankAttacker))
- {
- gActiveBank = gBankAttacker;
- EmitSpriteInvisibility(0, FALSE);
- MarkBufferBankForExecution(gActiveBank);
- gStatuses3[gBankAttacker] &= ~(STATUS3_SEMI_INVULNERABLE);
- gSpecialStatuses[gBankAttacker].restoredBankSprite = 1;
+ if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT
+ || !(gStatuses3[gBattlerAttacker] & (STATUS3_SEMI_INVULNERABLE))
+ || WasUnableToUseMove(gBattlerAttacker))
+ {
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSpriteInvisibility(0, FALSE);
+ MarkBattlerForControllerExec(gActiveBattler);
+ gStatuses3[gBattlerAttacker] &= ~(STATUS3_SEMI_INVULNERABLE);
+ gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1;
gBattleScripting.atk49_state++;
return;
}
gBattleScripting.atk49_state++;
break;
case 10: // make target sprite visible
- if (!gSpecialStatuses[gBankTarget].restoredBankSprite && gBankTarget < gNoOfAllBanks
- && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE))
+ if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount
+ && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE))
{
- gActiveBank = gBankTarget;
- EmitSpriteInvisibility(0, FALSE);
- MarkBufferBankForExecution(gActiveBank);
- gStatuses3[gBankTarget] &= ~(STATUS3_SEMI_INVULNERABLE);
+ gActiveBattler = gBattlerTarget;
+ BtlController_EmitSpriteInvisibility(0, FALSE);
+ MarkBattlerForControllerExec(gActiveBattler);
+ gStatuses3[gBattlerTarget] &= ~(STATUS3_SEMI_INVULNERABLE);
gBattleScripting.atk49_state++;
return;
}
gBattleScripting.atk49_state++;
break;
case 13: // update substitute
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gDisableStructs[i].substituteHP == 0)
gBattleMons[i].status2 &= ~(STATUS2_SUBSTITUTE);
@@ -5108,89 +4677,89 @@ static void atk49_moveend(void)
gBattleScripting.atk49_state++;
break;
case 14: // This case looks interesting, although I am not certain what it does. Probably fine tunes edge cases.
- if (gHitMarker & HITMARKER_PURSUIT_TRAP)
+ if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET)
{
- gActiveBank = gBankAttacker;
- gBankAttacker = gBankTarget;
- gBankTarget = gActiveBank;
- gHitMarker &= ~(HITMARKER_PURSUIT_TRAP);
+ gActiveBattler = gBattlerAttacker;
+ gBattlerAttacker = gBattlerTarget;
+ gBattlerTarget = gActiveBattler;
+ gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET);
}
if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED)
{
- gUnknownMovesUsedByBanks[gBankAttacker] = gLastUsedMove;
+ gLastPrintedMoves[gBattlerAttacker] = gChosenMove;
}
- if (!(gAbsentBankFlags & gBitTable[gBankAttacker])
- && !(gBattleStruct->field_91 & gBitTable[gBankAttacker])
- && gBattleMoves[lastMove].effect != EFFECT_BATON_PASS)
+ if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker])
+ && !(gBattleStruct->field_91 & gBitTable[gBattlerAttacker])
+ && gBattleMoves[originallyUsedMove].effect != EFFECT_BATON_PASS)
{
if (gHitMarker & HITMARKER_OBEYS)
{
- gLastUsedMovesByBanks[gBankAttacker] = gLastUsedMove;
- gUnknown_02024260[gBankAttacker] = gCurrentMove;
+ gLastMoves[gBattlerAttacker] = gChosenMove;
+ gLastResultingMoves[gBattlerAttacker] = gCurrentMove;
}
else
{
- gLastUsedMovesByBanks[gBankAttacker] = 0xFFFF;
- gUnknown_02024260[gBankAttacker] = 0xFFFF;
+ gLastMoves[gBattlerAttacker] = 0xFFFF;
+ gLastResultingMoves[gBattlerAttacker] = 0xFFFF;
}
- if (!(gHitMarker & HITMARKER_FAINTED(gBankTarget)))
- gUnknown_02024270[gBankTarget] = gBankAttacker;
+ if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget)))
+ gLastHitBy[gBattlerTarget] = gBattlerAttacker;
- if (gHitMarker & HITMARKER_OBEYS && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (gHitMarker & HITMARKER_OBEYS && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
- if (gLastUsedMove == 0xFFFF)
+ if (gChosenMove == 0xFFFF)
{
- gUnknown_02024250[gBankTarget] = gLastUsedMove;
+ gLastLandedMoves[gBattlerTarget] = gChosenMove;
}
else
{
- gUnknown_02024250[gBankTarget] = gCurrentMove;
- GET_MOVE_TYPE(gCurrentMove, gUnknown_02024258[gBankTarget]);
+ gLastLandedMoves[gBattlerTarget] = gCurrentMove;
+ GET_MOVE_TYPE(gCurrentMove, gLastHitByType[gBattlerTarget]);
}
}
else
{
- gUnknown_02024250[gBankTarget] = 0xFFFF;
+ gLastLandedMoves[gBattlerTarget] = 0xFFFF;
}
}
gBattleScripting.atk49_state++;
break;
case 15: // mirror move
- if (!(gAbsentBankFlags & gBitTable[gBankAttacker]) && !(gBattleStruct->field_91 & gBitTable[gBankAttacker])
- && gBattleMoves[lastMove].flags & FLAG_MIRROR_MOVE_AFFECTED && gHitMarker & HITMARKER_OBEYS
- && gBankAttacker != gBankTarget && !(gHitMarker & HITMARKER_FAINTED(gBankTarget))
- && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) && !(gBattleStruct->field_91 & gBitTable[gBattlerAttacker])
+ && gBattleMoves[originallyUsedMove].flags & FLAG_MIRROR_MOVE_AFFECTED && gHitMarker & HITMARKER_OBEYS
+ && gBattlerAttacker != gBattlerTarget && !(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))
+ && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT))
{
u8 target, attacker;
- *(gBattleStruct->mirrorMoves + gBankTarget * 2 + 0) = gLastUsedMove;
- *(gBattleStruct->mirrorMoves + gBankTarget * 2 + 1) = gLastUsedMove >> 8;
+ *(gBattleStruct->mirrorMoves + gBattlerTarget * 2 + 0) = gChosenMove;
+ *(gBattleStruct->mirrorMoves + gBattlerTarget * 2 + 1) = gChosenMove >> 8;
- target = gBankTarget;
- attacker = gBankAttacker;
- *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = gLastUsedMove;
+ target = gBattlerTarget;
+ attacker = gBattlerAttacker;
+ *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0) = gChosenMove;
- target = gBankTarget;
- attacker = gBankAttacker;
- *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = gLastUsedMove >> 8;
+ target = gBattlerTarget;
+ attacker = gBattlerAttacker;
+ *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) = gChosenMove >> 8;
}
gBattleScripting.atk49_state++;
break;
case 16: //
if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && !gProtectStructs[gBankAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH
+ && !gProtectStructs[gBattlerAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH
&& !(gHitMarker & HITMARKER_NO_ATTACKSTRING))
{
- u8 bank = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
- if (gBattleMons[bank].hp != 0)
+ u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget)));
+ if (gBattleMons[battlerId].hp != 0)
{
- gBankTarget = bank;
+ gBattlerTarget = battlerId;
gHitMarker |= HITMARKER_NO_ATTACKSTRING;
gBattleScripting.atk49_state = 0;
MoveValuesCleanUp();
BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);
- gBattlescriptCurrInstr = gUnknown_082DB87D;
+ gBattlescriptCurrInstr = BattleScript_82DB87D;
return;
}
else
@@ -5221,13 +4790,13 @@ static void atk4A_typecalc2(void)
s32 i = 0;
u8 moveType = gBattleMoves[gCurrentMove].type;
- if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
{
- gLastUsedAbility = gBattleMons[gBankTarget].ability;
- gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED);
- gUnknown_02024250[gBankTarget] = 0;
+ gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
+ gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);
+ gLastLandedMoves[gBattlerTarget] = 0;
gBattleCommunication[6] = moveType;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
else
{
@@ -5235,7 +4804,7 @@ static void atk4A_typecalc2(void)
{
if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)
{
- if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT)
{
break;
}
@@ -5249,42 +4818,42 @@ static void atk4A_typecalc2(void)
if (TYPE_EFFECT_ATK_TYPE(i) == moveType)
{
// check type1
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type1)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1)
{
if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)
{
- gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED;
+ gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
break;
}
if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE)
{
- flags |= MOVESTATUS_NOTVERYEFFECTIVE;
+ flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
}
if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE)
{
- flags |= MOVESTATUS_SUPEREFFECTIVE;
+ flags |= MOVE_RESULT_SUPER_EFFECTIVE;
}
}
// check type2
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type2)
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2)
{
- if (gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
+ if (gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2
&& TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT)
{
- gBattleMoveFlags |= MOVESTATUS_NOTAFFECTED;
+ gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
break;
}
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type2
- && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2
+ && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2
&& TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE)
{
- flags |= MOVESTATUS_NOTVERYEFFECTIVE;
+ flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
}
- if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBankTarget].type2
- && gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2
+ if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2
+ && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2
&& TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE)
{
- flags |= MOVESTATUS_SUPEREFFECTIVE;
+ flags |= MOVE_RESULT_SUPER_EFFECTIVE;
}
}
}
@@ -5292,122 +4861,122 @@ static void atk4A_typecalc2(void)
}
}
- if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD
- && !(flags & MOVESTATUS_NOEFFECT)
- && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2
- && (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)))
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD
+ && !(flags & MOVE_RESULT_NO_EFFECT)
+ && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2
+ && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)))
&& gBattleMoves[gCurrentMove].power)
{
gLastUsedAbility = ABILITY_WONDER_GUARD;
- gBattleMoveFlags |= MOVESTATUS_MISSED;
- gUnknown_02024250[gBankTarget] = 0;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
+ gLastLandedMoves[gBattlerTarget] = 0;
gBattleCommunication[6] = 3;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
- if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
- gProtectStructs[gBankAttacker].targetNotAffected = 1;
+ if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
+ gProtectStructs[gBattlerAttacker].targetNotAffected = 1;
gBattlescriptCurrInstr++;
}
-static void atk4B_return_atk_to_ball(void)
+static void atk4B_returnatktoball(void)
{
- gActiveBank = gBankAttacker;
- if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank)))
+ gActiveBattler = gBattlerAttacker;
+ if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler)))
{
- EmitReturnMonToBall(0, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitReturnMonToBall(0, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
gBattlescriptCurrInstr++;
}
-static void atk4C_get_switched_mon_data(void)
+static void atk4C_getswitchedmondata(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- gBattlePartyID[gActiveBank] = *(gBattleStruct->monToSwitchIntoId + gActiveBank);
+ gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler);
- EmitGetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlePartyID[gActiveBank]]);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitGetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
-static void atk4D_switch_data_update(void)
+static void atk4D_switchindataupdate(void)
{
struct BattlePokemon oldData;
s32 i;
u8 *monData;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- oldData = gBattleMons[gActiveBank];
- monData = (u8*)(&gBattleMons[gActiveBank]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ oldData = gBattleMons[gActiveBattler];
+ monData = (u8*)(&gBattleMons[gActiveBattler]);
for (i = 0; i < sizeof(struct BattlePokemon); i++)
{
- monData[i] = gBattleBufferB[gActiveBank][4 + i];
+ monData[i] = gBattleBufferB[gActiveBattler][4 + i];
}
- gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1;
- gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2;
- gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility);
+ gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1;
+ gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2;
+ gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].altAbility);
// check knocked off item
- i = GetBankSide(gActiveBank);
- if (gWishFutureKnock.knockedOffPokes[i] & gBitTable[gBattlePartyID[gActiveBank]])
+ i = GetBattlerSide(gActiveBattler);
+ if (gWishFutureKnock.knockedOffPokes[i] & gBitTable[gBattlerPartyIndexes[gActiveBattler]])
{
- gBattleMons[gActiveBank].item = 0;
+ gBattleMons[gActiveBattler].item = 0;
}
if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
{
for (i = 0; i < BATTLE_STATS_NO; i++)
{
- gBattleMons[gActiveBank].statStages[i] = oldData.statStages[i];
+ gBattleMons[gActiveBattler].statStages[i] = oldData.statStages[i];
}
- gBattleMons[gActiveBank].status2 = oldData.status2;
+ gBattleMons[gActiveBattler].status2 = oldData.status2;
}
SwitchInClearSetData();
- if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gBattleMons[gActiveBank].maxHP / 2 >= gBattleMons[gActiveBank].hp
- && gBattleMons[gActiveBank].hp != 0 && !(gBattleMons[gActiveBank].status1 & STATUS_SLEEP))
+ if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gBattleMons[gActiveBattler].maxHP / 2 >= gBattleMons[gActiveBattler].hp
+ && gBattleMons[gActiveBattler].hp != 0 && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
{
- gBattleStruct->field_92 |= gBitTable[gActiveBank];
+ gBattleStruct->field_92 |= gBitTable[gActiveBattler];
}
- gBattleScripting.bank = gActiveBank;
+ gBattleScripting.battler = gActiveBattler;
- PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBank, gBattlePartyID[gActiveBank]);
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]);
gBattlescriptCurrInstr += 2;
}
-static void atk4E_switchin_anim(void)
+static void atk4E_switchinanim(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT
&& !(gBattleTypeFlags & (BATTLE_TYPE_LINK
| BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_x2000000
| BATTLE_TYPE_x4000000
| BATTLE_TYPE_FRONTIER)))
- HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), FLAG_SET_SEEN, gBattleMons[gActiveBank].personality);
+ HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);
- gAbsentBankFlags &= ~(gBitTable[gActiveBank]);
+ gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]);
- EmitSwitchInAnim(0, gBattlePartyID[gActiveBank], gBattlescriptCurrInstr[2]);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSwitchInAnim(0, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 3;
@@ -5415,46 +4984,45 @@ static void atk4E_switchin_anim(void)
sub_81A56B4();
}
-static void atk4F_jump_if_cannot_switch(void)
+static void atk4F_jumpifcantswitch(void)
{
- s32 val = 0;
- s32 compareVar = 0;
- struct Pokemon *party = NULL;
- s32 r7 = 0;
+ s32 i;
+ s32 lastMonId;
+ struct Pokemon *party;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1] & ~(ATK4F_DONT_CHECK_STATUSES));
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(ATK4F_DONT_CHECK_STATUSES));
if (!(gBattlescriptCurrInstr[1] & ATK4F_DONT_CHECK_STATUSES)
- && ((gBattleMons[gActiveBank].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
- || (gStatuses3[gActiveBank] & STATUS3_ROOTED)))
+ && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
+ || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
}
else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
#ifndef NONMATCHING
asm("":::"r5");
#endif // NONMATCHING
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
party = gEnemyParty;
else
party = gPlayerParty;
- val = 0;
- if (2 & gActiveBank)
- val = 3;
+ i = 0;
+ if (gActiveBattler & 2)
+ i = 3;
- for (compareVar = val + 3; val < compareVar; val++)
+ for (lastMonId = i + 3; i < lastMonId; i++)
{
- if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
- && !GetMonData(&party[val], MON_DATA_IS_EGG)
- && GetMonData(&party[val], MON_DATA_HP) != 0
- && gBattlePartyID[gActiveBank] != val)
+ if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
+ && !GetMonData(&party[i], MON_DATA_IS_EGG)
+ && GetMonData(&party[i], MON_DATA_HP) != 0
+ && gBattlerPartyIndexes[gActiveBattler] != i)
break;
}
- if (val == compareVar)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ if (i == lastMonId)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
@@ -5462,108 +5030,110 @@ static void atk4F_jump_if_cannot_switch(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
{
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
party = gPlayerParty;
- val = 0;
- if (sub_806D82C(GetBankMultiplayerId(gActiveBank)) == TRUE)
- val = 3;
+ i = 0;
+ if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE)
+ i = 3;
}
else
{
party = gEnemyParty;
- if (gActiveBank == 1)
- val = 0;
+ if (gActiveBattler == 1)
+ i = 0;
else
- val = 3;
+ i = 3;
}
}
else
{
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
party = gEnemyParty;
else
party = gPlayerParty;
-
- val = 0;
- if (sub_806D82C(GetBankMultiplayerId(gActiveBank)) == TRUE)
- val = 3;
+ i = 0;
+ if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE)
+ i = 3;
}
- for (compareVar = val + 3; val < compareVar; val++)
+ for (lastMonId = i + 3; i < lastMonId; i++)
{
- if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
- && !GetMonData(&party[val], MON_DATA_IS_EGG)
- && GetMonData(&party[val], MON_DATA_HP) != 0
- && gBattlePartyID[gActiveBank] != val)
+ if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
+ && !GetMonData(&party[i], MON_DATA_IS_EGG)
+ && GetMonData(&party[i], MON_DATA_HP) != 0
+ && gBattlerPartyIndexes[gActiveBattler] != i)
break;
}
- if (val == compareVar)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ if (i == lastMonId)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
- else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBankSide(gActiveBank) == SIDE_OPPONENT)
+ else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
{
party = gEnemyParty;
- val = 0;
- if (gActiveBank == 3)
- val = 3;
+ i = 0;
+ if (gActiveBattler == B_POSITION_OPPONENT_RIGHT)
+ i = 3;
- for (compareVar = val + 3; val < compareVar; val++)
+ for (lastMonId = i + 3; i < lastMonId; i++)
{
- if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
- && !GetMonData(&party[val], MON_DATA_IS_EGG)
- && GetMonData(&party[val], MON_DATA_HP) != 0
- && gBattlePartyID[gActiveBank] != val)
+ if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
+ && !GetMonData(&party[i], MON_DATA_IS_EGG)
+ && GetMonData(&party[i], MON_DATA_HP) != 0
+ && gBattlerPartyIndexes[gActiveBattler] != i)
break;
}
- if (val == compareVar)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ if (i == lastMonId)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
else
{
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT)
+ u8 battlerIn1, battlerIn2;
+
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
{
- r7 = GetBankByIdentity(1);
+ battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- compareVar = GetBankByIdentity(3);
+ battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
else
- compareVar = r7;
+ battlerIn2 = battlerIn1;
party = gEnemyParty;
}
else
{
- r7 = GetBankByIdentity(0);
+ battlerIn1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- compareVar = GetBankByIdentity(2);
+ battlerIn2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
else
- compareVar = r7;
+ battlerIn2 = battlerIn1;
party = gPlayerParty;
}
- for (val = 0; val < 6; val++)
+
+ for (i = 0; i < PARTY_SIZE; i++)
{
- if (GetMonData(&party[val], MON_DATA_HP) != 0
- && GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
- && !GetMonData(&party[val], MON_DATA_IS_EGG)
- && val != gBattlePartyID[r7] && val != gBattlePartyID[compareVar])
+ if (GetMonData(&party[i], MON_DATA_HP) != 0
+ && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
+ && !GetMonData(&party[i], MON_DATA_IS_EGG)
+ && i != gBattlerPartyIndexes[battlerIn1] && i != gBattlerPartyIndexes[battlerIn2])
break;
}
- if (val == 6)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ if (i == 6)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
@@ -5571,50 +5141,50 @@ static void atk4F_jump_if_cannot_switch(void)
static void sub_804CF10(u8 arg0)
{
- *(gBattleStruct->field_58 + gActiveBank) = gBattlePartyID[gActiveBank];
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = 6;
- gBattleStruct->field_93 &= ~(gBitTable[gActiveBank]);
+ *(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6;
+ gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]);
- EmitChoosePokemon(0, 1, arg0, 0, gBattleStruct->field_60[gActiveBank]);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitChoosePokemon(0, PARTY_MUST_CHOOSE_MON, arg0, 0, gBattleStruct->field_60[gActiveBattler]);
+ MarkBattlerForControllerExec(gActiveBattler);
}
static void atk50_openpartyscreen(void)
{
u32 flags;
u8 hitmarkerFaintBits;
- u8 bank;
+ u8 battlerId;
const u8 *jumpPtr;
- bank = 0;
+ battlerId = 0;
flags = 0;
- jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
if (gBattlescriptCurrInstr[1] == 5)
{
if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE)
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (gHitMarker & HITMARKER_FAINTED(gActiveBank))
+ if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))
{
- if (sub_80423F4(gActiveBank, 6, 6))
+ if (HasNoMonsToSwitch(gActiveBattler, 6, 6))
{
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!gSpecialStatuses[gActiveBank].flag40)
+ else if (!gSpecialStatuses[gActiveBattler].flag40)
{
sub_804CF10(6);
- gSpecialStatuses[gActiveBank].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = 1;
}
}
else
{
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
}
@@ -5626,88 +5196,88 @@ static void atk50_openpartyscreen(void)
if (gBitTable[0] & hitmarkerFaintBits)
{
- gActiveBank = 0;
- if (sub_80423F4(0, 6, 6))
+ gActiveBattler = 0;
+ if (HasNoMonsToSwitch(0, 6, 6))
{
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- EmitCmd42(0);
- MarkBufferBankForExecution(gActiveBank);
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ BtlController_EmitCmd42(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!gSpecialStatuses[gActiveBank].flag40)
+ else if (!gSpecialStatuses[gActiveBattler].flag40)
{
sub_804CF10(gBattleStruct->monToSwitchIntoId[2]);
- gSpecialStatuses[gActiveBank].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = 1;
}
else
{
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
flags |= 1;
}
}
if (gBitTable[2] & hitmarkerFaintBits && !(gBitTable[0] & hitmarkerFaintBits))
{
- gActiveBank = 2;
- if (sub_80423F4(2, 6, 6))
+ gActiveBattler = 2;
+ if (HasNoMonsToSwitch(2, 6, 6))
{
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- EmitCmd42(0);
- MarkBufferBankForExecution(gActiveBank);
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ BtlController_EmitCmd42(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!gSpecialStatuses[gActiveBank].flag40)
+ else if (!gSpecialStatuses[gActiveBattler].flag40)
{
sub_804CF10(gBattleStruct->monToSwitchIntoId[0]);
- gSpecialStatuses[gActiveBank].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = 1;
}
else if (!(flags & 1))
{
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
if (gBitTable[1] & hitmarkerFaintBits)
{
- gActiveBank = 1;
- if (sub_80423F4(1, 6, 6))
+ gActiveBattler = 1;
+ if (HasNoMonsToSwitch(1, 6, 6))
{
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- EmitCmd42(0);
- MarkBufferBankForExecution(gActiveBank);
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ BtlController_EmitCmd42(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!gSpecialStatuses[gActiveBank].flag40)
+ else if (!gSpecialStatuses[gActiveBattler].flag40)
{
sub_804CF10(gBattleStruct->monToSwitchIntoId[3]);
- gSpecialStatuses[gActiveBank].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = 1;
}
else
{
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
flags |= 2;
}
}
if (gBitTable[3] & hitmarkerFaintBits && !(gBitTable[1] & hitmarkerFaintBits))
{
- gActiveBank = 3;
- if (sub_80423F4(3, 6, 6))
+ gActiveBattler = 3;
+ if (HasNoMonsToSwitch(3, 6, 6))
{
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- EmitCmd42(0);
- MarkBufferBankForExecution(gActiveBank);
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ BtlController_EmitCmd42(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!gSpecialStatuses[gActiveBank].flag40)
+ else if (!gSpecialStatuses[gActiveBattler].flag40)
{
sub_804CF10(gBattleStruct->monToSwitchIntoId[1]);
- gSpecialStatuses[gActiveBank].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = 1;
}
else if (!(flags & 2))
{
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
@@ -5717,13 +5287,13 @@ static void atk50_openpartyscreen(void)
flag40_2 = gSpecialStatuses[2].flag40;
if (!flag40_2 && hitmarkerFaintBits != 0)
{
- if (gAbsentBankFlags & gBitTable[0])
- gActiveBank = 2;
+ if (gAbsentBattlerFlags & gBitTable[0])
+ gActiveBattler = 2;
else
- gActiveBank = 0;
+ gActiveBattler = 0;
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
@@ -5733,13 +5303,13 @@ static void atk50_openpartyscreen(void)
flag40_3 = gSpecialStatuses[3].flag40;
if (!flag40_3 && hitmarkerFaintBits != 0)
{
- if (gAbsentBankFlags & gBitTable[1])
- gActiveBank = 3;
+ if (gAbsentBattlerFlags & gBitTable[1])
+ gActiveBattler = 3;
else
- gActiveBank = 1;
+ gActiveBattler = 1;
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
}
@@ -5754,34 +5324,34 @@ static void atk50_openpartyscreen(void)
hitmarkerFaintBits = gHitMarker >> 0x1C;
if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits)
{
- gActiveBank = 2;
- if (sub_80423F4(2, gBattleBufferB[0][1], 6))
+ gActiveBattler = 2;
+ if (HasNoMonsToSwitch(2, gBattleBufferB[0][1], 6))
{
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- EmitCmd42(0);
- MarkBufferBankForExecution(gActiveBank);
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ BtlController_EmitCmd42(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!gSpecialStatuses[gActiveBank].flag40)
+ else if (!gSpecialStatuses[gActiveBattler].flag40)
{
sub_804CF10(gBattleStruct->monToSwitchIntoId[0]);
- gSpecialStatuses[gActiveBank].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = 1;
}
}
if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1])
{
- gActiveBank = 3;
- if (sub_80423F4(3, gBattleBufferB[1][1], 6))
+ gActiveBattler = 3;
+ if (HasNoMonsToSwitch(3, gBattleBufferB[1][1], 6))
{
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- EmitCmd42(0);
- MarkBufferBankForExecution(gActiveBank);
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ BtlController_EmitCmd42(0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
- else if (!gSpecialStatuses[gActiveBank].flag40)
+ else if (!gSpecialStatuses[gActiveBattler].flag40)
{
sub_804CF10(gBattleStruct->monToSwitchIntoId[1]);
- gSpecialStatuses[gActiveBank].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = 1;
}
}
gBattlescriptCurrInstr += 6;
@@ -5798,96 +5368,96 @@ static void atk50_openpartyscreen(void)
hitmarkerFaintBits = gHitMarker >> 0x1C;
- gBank1 = 0;
+ gBattlerFainted = 0;
while (1)
{
- if (gBitTable[gBank1] & hitmarkerFaintBits)
+ if (gBitTable[gBattlerFainted] & hitmarkerFaintBits)
break;
- if (gBank1 >= gNoOfAllBanks)
+ if (gBattlerFainted >= gBattlersCount)
break;
- gBank1++;
+ gBattlerFainted++;
}
- if (gBank1 == gNoOfAllBanks)
+ if (gBattlerFainted == gBattlersCount)
gBattlescriptCurrInstr = jumpPtr;
}
else
{
if (gBattlescriptCurrInstr[1] & 0x80)
- hitmarkerFaintBits = 0; // used here as the caseId for the EmitChoose function
+ hitmarkerFaintBits = PARTY_CHOOSE_MON; // Used here as the caseId for the EmitChoose function.
else
- hitmarkerFaintBits = 1;
+ hitmarkerFaintBits = PARTY_MUST_CHOOSE_MON;
- bank = GetBattleBank(gBattlescriptCurrInstr[1] & ~(0x80));
- if (gSpecialStatuses[bank].flag40)
+ battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(0x80));
+ if (gSpecialStatuses[battlerId].flag40)
{
gBattlescriptCurrInstr += 6;
}
- else if (sub_80423F4(bank, 6, 6))
+ else if (HasNoMonsToSwitch(battlerId, 6, 6))
{
- gActiveBank = bank;
- gAbsentBankFlags |= gBitTable[gActiveBank];
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
+ gActiveBattler = battlerId;
+ gAbsentBattlerFlags |= gBitTable[gActiveBattler];
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
gBattlescriptCurrInstr = jumpPtr;
}
else
{
- gActiveBank = bank;
- *(gBattleStruct->field_58 + gActiveBank) = gBattlePartyID[gActiveBank];
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = 6;
- gBattleStruct->field_93 &= ~(gBitTable[gActiveBank]);
+ gActiveBattler = battlerId;
+ *(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler];
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6;
+ gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]);
- EmitChoosePokemon(0, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + (gActiveBank ^ 2)), 0, gBattleStruct->field_60[gActiveBank]);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitChoosePokemon(0, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + (gActiveBattler ^ 2)), 0, gBattleStruct->field_60[gActiveBattler]);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 6;
- if (GetBankIdentity(gActiveBank) == 0 && gBattleResults.playerSwitchesCounter < 0xFF)
+ if (GetBattlerPosition(gActiveBattler) == 0 && gBattleResults.playerSwitchesCounter < 0xFF)
gBattleResults.playerSwitchesCounter++;
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
{
- if (gActiveBank != bank)
+ if (gActiveBattler != battlerId)
{
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
}
else
{
- gActiveBank = GetBankByIdentity(GetBankIdentity(bank) ^ BIT_SIDE);
- if (gAbsentBankFlags & gBitTable[gActiveBank])
- gActiveBank ^= BIT_MON;
+ gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(battlerId) ^ BIT_SIDE);
+ if (gAbsentBattlerFlags & gBitTable[gActiveBattler])
+ gActiveBattler ^= BIT_FLANK;
- EmitLinkStandbyMsg(0, 2, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitLinkStandbyMsg(0, 2, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
}
}
-static void atk51_switch_handle_order(void)
+static void atk51_switchhandleorder(void)
{
s32 i;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
switch (gBattlescriptCurrInstr[2])
{
case 0:
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gBattleBufferB[i][0] == 0x22)
{
*(gBattleStruct->monToSwitchIntoId + i) = gBattleBufferB[i][1];
if (!(gBattleStruct->field_93 & gBitTable[i]))
{
- RecordedBattle_SetBankAction(i, gBattleBufferB[i][1]);
+ RecordedBattle_SetBattlerAction(i, gBattleBufferB[i][1]);
gBattleStruct->field_93 |= gBitTable[i];
}
}
@@ -5895,40 +5465,40 @@ static void atk51_switch_handle_order(void)
break;
case 1:
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
- sub_803BDA0(gActiveBank);
+ sub_803BDA0(gActiveBattler);
break;
case 2:
- if (!(gBattleStruct->field_93 & gBitTable[gActiveBank]))
+ if (!(gBattleStruct->field_93 & gBitTable[gActiveBattler]))
{
- RecordedBattle_SetBankAction(gActiveBank, gBattleBufferB[gActiveBank][1]);
- gBattleStruct->field_93 |= gBitTable[gActiveBank];
+ RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]);
+ gBattleStruct->field_93 |= gBitTable[gActiveBattler];
}
// fall through
case 3:
- gBattleCommunication[0] = gBattleBufferB[gActiveBank][1];
- *(gBattleStruct->monToSwitchIntoId + gActiveBank) = gBattleBufferB[gActiveBank][1];
+ gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1];
+ *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1];
if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF;
- *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0);
- *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBank][3];
+ *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF;
+ *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0);
+ *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBattler][3];
- *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0);
- *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4;
- *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBank][3];
+ *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0);
+ *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4;
+ *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBattler][3];
}
else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
- sub_80571DC(gActiveBank, *(gBattleStruct->monToSwitchIntoId + gActiveBank));
+ sub_80571DC(gActiveBattler, *(gBattleStruct->monToSwitchIntoId + gActiveBattler));
}
else
{
- sub_803BDA0(gActiveBank);
+ sub_803BDA0(gActiveBattler);
}
- PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBankAttacker].species)
- PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBank, gBattleBufferB[gActiveBank][1])
+ PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species)
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleBufferB[gActiveBattler][1])
break;
}
@@ -5936,65 +5506,64 @@ static void atk51_switch_handle_order(void)
gBattlescriptCurrInstr += 3;
}
-static void atk52_switch_in_effects(void)
+static void atk52_switchineffects(void)
{
s32 i;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- sub_803FA70(gActiveBank);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ sub_803FA70(gActiveBattler);
- gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank));
- gSpecialStatuses[gActiveBank].flag40 = 0;
+ gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler));
+ gSpecialStatuses[gActiveBattler].flag40 = 0;
- if (!(gSideAffecting[GetBankSide(gActiveBank)] & SIDE_STATUS_SPIKES_DAMAGED)
- && (gSideAffecting[GetBankSide(gActiveBank)] & SIDE_STATUS_SPIKES)
- && gBattleMons[gActiveBank].type1 != TYPE_FLYING
- && gBattleMons[gActiveBank].type2 != TYPE_FLYING
- && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE)
+ if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED)
+ && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES)
+ && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING)
+ && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE)
{
u8 spikesDmg;
- gSideAffecting[GetBankSide(gActiveBank)] |= SIDE_STATUS_SPIKES_DAMAGED;
+ gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED;
- gBattleMons[gActiveBank].status2 &= ~(STATUS2_DESTINY_BOND);
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_DESTINY_BOND);
gHitMarker &= ~(HITMARKER_DESTINYBOND);
- spikesDmg = (5 - gSideTimers[GetBankSide(gActiveBank)].spikesAmount) * 2;
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / (spikesDmg);
+ spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg);
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- gBattleScripting.bank = gActiveBank;
+ gBattleScripting.battler = gActiveBattler;
BattleScriptPushCursor();
- if (gBattlescriptCurrInstr[1] == 0)
- gBattlescriptCurrInstr = gUnknown_082DAE90;
- else if (gBattlescriptCurrInstr[1] == 1)
- gBattlescriptCurrInstr = gUnknown_082DAE59;
+ if (gBattlescriptCurrInstr[1] == BS_TARGET)
+ gBattlescriptCurrInstr = BattleScript_SpikesOnTarget;
+ else if (gBattlescriptCurrInstr[1] == BS_ATTACKER)
+ gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker;
else
- gBattlescriptCurrInstr = gUnknown_082DAEC7;
+ gBattlescriptCurrInstr = BattleScript_SpikesOnFaintedBattler;
}
else
{
- if (gBattleMons[gActiveBank].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBank].truantUnknownBit)
- gDisableStructs[gActiveBank].truantCounter = 1;
+ if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantUnknownBit)
+ gDisableStructs[gActiveBattler].truantCounter = 1;
- gDisableStructs[gActiveBank].truantUnknownBit = 0;
+ gDisableStructs[gActiveBattler].truantUnknownBit = 0;
- if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBank, 0, 0, 0) == 0 &&
- ItemBattleEffects(0, gActiveBank, 0) == 0)
+ if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0) == 0 &&
+ ItemBattleEffects(0, gActiveBattler, 0) == 0)
{
- gSideAffecting[GetBankSide(gActiveBank)] &= ~(SIDE_STATUS_SPIKES_DAMAGED);
+ gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED);
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gBanksByTurnOrder[i] == gActiveBank)
- gActionsByTurnOrder[i] = ACTION_CANCEL_PARTNER;
+ if (gBattlerByTurnOrder[i] == gActiveBattler)
+ gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER;
}
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- u16* hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBankSide(i)];
+ u16* hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(i)];
*hpOnSwitchout = gBattleMons[i].hp;
}
@@ -6002,14 +5571,14 @@ static void atk52_switch_in_effects(void)
{
u32 hitmarkerFaintBits = gHitMarker >> 0x1C;
- gBank1++;
+ gBattlerFainted++;
while (1)
{
- if (hitmarkerFaintBits & gBitTable[gBank1] && !(gAbsentBankFlags & gBitTable[gBank1]))
+ if (hitmarkerFaintBits & gBitTable[gBattlerFainted] && !(gAbsentBattlerFlags & gBitTable[gBattlerFainted]))
break;
- if (gBank1 >= gNoOfAllBanks)
+ if (gBattlerFainted >= gBattlersCount)
break;
- gBank1++;
+ gBattlerFainted++;
}
}
gBattlescriptCurrInstr += 2;
@@ -6017,68 +5586,68 @@ static void atk52_switch_in_effects(void)
}
}
-static void atk53_trainer_slide(void)
+static void atk53_trainerslidein(void)
{
- gActiveBank = GetBankByIdentity(gBattlescriptCurrInstr[1]);
- EmitTrainerSlide(0);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]);
+ BtlController_EmitTrainerSlide(0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
-static void atk54_effectiveness_sound(void)
+static void atk54_playse(void)
{
- gActiveBank = gBankAttacker;
- EmitEffectivenessSound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1));
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitPlaySE(0, T2_READ_16(gBattlescriptCurrInstr + 1));
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 3;
}
-static void atk55_play_fanfare(void)
+static void atk55_fanfare(void)
{
- gActiveBank = gBankAttacker;
- EmitPlayFanfareOrBGM(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1), FALSE);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitPlayFanfareOrBGM(0, T2_READ_16(gBattlescriptCurrInstr + 1), FALSE);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 3;
}
-static void atk56_fainting_cry(void)
+static void atk56_playfaintcry(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- EmitFaintingCry(0);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ BtlController_EmitFaintingCry(0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
static void atk57(void)
{
- gActiveBank = GetBankByIdentity(0);
- EmitCmd55(0, gBattleOutcome);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ BtlController_EmitCmd55(0, gBattleOutcome);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 1;
}
-static void atk58_return_to_ball(void)
+static void atk58_returntoball(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- EmitReturnMonToBall(0, 1);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ BtlController_EmitReturnMonToBall(0, 1);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
-static void atk59_learnmove_inbattle(void)
+static void atk59_handlelearnnewmove(void)
{
- const u8* jumpPtr1 = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
- const u8* jumpPtr2 = BSScriptReadPtr(gBattlescriptCurrInstr + 5);
+ const u8 *jumpPtr1 = T1_READ_PTR(gBattlescriptCurrInstr + 1);
+ const u8 *jumpPtr2 = T1_READ_PTR(gBattlescriptCurrInstr + 5);
- u16 ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterId], gBattlescriptCurrInstr[9]);
+ u16 ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], gBattlescriptCurrInstr[9]);
while (ret == 0xFFFE)
- ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterId], 0);
+ ret = MonTryLearningNewMove(&gPlayerParty[gBattleStruct->expGetterMonId], 0);
if (ret == 0)
{
@@ -6090,20 +5659,20 @@ static void atk59_learnmove_inbattle(void)
}
else
{
- gActiveBank = GetBankByIdentity(0);
+ gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
- if (gBattlePartyID[gActiveBank] == gBattleStruct->expGetterId
- && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED))
+ if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId
+ && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
{
- GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret);
+ GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret);
}
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- gActiveBank = GetBankByIdentity(2);
- if (gBattlePartyID[gActiveBank] == gBattleStruct->expGetterId
- && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED))
+ gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
+ if (gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId
+ && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
{
- GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret);
+ GiveMoveToBattleMon(&gBattleMons[gActiveBattler], ret);
}
}
@@ -6113,13 +5682,13 @@ static void atk59_learnmove_inbattle(void)
static void atk5A_yesnoboxlearnmove(void)
{
- gActiveBank = 0;
+ gActiveBattler = 0;
switch (gBattleScripting.learnMoveState)
{
case 0:
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
- BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC);
+ BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC);
gBattleScripting.learnMoveState++;
gBattleCommunication[CURSOR_POSITION] = 0;
BattleCreateYesNoCursorAt(0);
@@ -6145,7 +5714,7 @@ static void atk5A_yesnoboxlearnmove(void)
if (gBattleCommunication[1] == 0)
{
HandleBattleWindow(0x18, 0x8, 0x1D, 0xD, WINDOW_CLEAR);
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
gBattleScripting.learnMoveState++;
}
else
@@ -6163,7 +5732,7 @@ static void atk5A_yesnoboxlearnmove(void)
if (!gPaletteFade.active)
{
FreeAllWindowBuffers();
- sub_81BFA38(gPlayerParty, gBattleStruct->expGetterId, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
+ sub_81BFA38(gPlayerParty, gBattleStruct->expGetterMonId, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
gBattleScripting.learnMoveState++;
}
break;
@@ -6183,22 +5752,22 @@ static void atk5A_yesnoboxlearnmove(void)
}
else
{
- u16 moveId = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_MOVE1 + movePosition);
+ u16 moveId = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition);
if (IsHMMove2(moveId))
{
- PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, gActiveBank);
+ PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, gActiveBattler);
gBattleScripting.learnMoveState = 6;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
PREPARE_MOVE_BUFFER(gBattleTextBuff2, moveId)
- RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterId], movePosition);
- SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterId], gMoveToLearn, movePosition);
+ RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterMonId], movePosition);
+ SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterMonId], gMoveToLearn, movePosition);
- if (gBattlePartyID[0] == gBattleStruct->expGetterId
+ if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId
&& !(gBattleMons[0].status2 & STATUS2_TRANSFORMED)
&& !(gDisableStructs[0].unk18_b & gBitTable[movePosition]))
{
@@ -6206,7 +5775,7 @@ static void atk5A_yesnoboxlearnmove(void)
SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, movePosition);
}
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && gBattlePartyID[2] == gBattleStruct->expGetterId
+ && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId
&& !(gBattleMons[2].status2 & STATUS2_TRANSFORMED)
&& !(gDisableStructs[2].unk18_b & gBitTable[movePosition]))
{
@@ -6222,7 +5791,7 @@ static void atk5A_yesnoboxlearnmove(void)
gBattlescriptCurrInstr += 5;
break;
case 6:
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
gBattleScripting.learnMoveState = 2;
}
@@ -6236,7 +5805,7 @@ static void atk5B_yesnoboxstoplearningmove(void)
{
case 0:
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
- BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC);
+ BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC);
gBattleScripting.learnMoveState++;
gBattleCommunication[CURSOR_POSITION] = 0;
BattleCreateYesNoCursorAt(0);
@@ -6261,7 +5830,7 @@ static void atk5B_yesnoboxstoplearningmove(void)
PlaySE(SE_SELECT);
if (gBattleCommunication[1] != 0)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
@@ -6270,7 +5839,7 @@ static void atk5B_yesnoboxstoplearningmove(void)
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
HandleBattleWindow(0x18, 0x8, 0x1D, 0xD, WINDOW_CLEAR);
}
break;
@@ -6279,16 +5848,16 @@ static void atk5B_yesnoboxstoplearningmove(void)
static void atk5C_hitanimation(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
{
gBattlescriptCurrInstr += 2;
}
- else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBank].substituteHP == 0)
+ else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0)
{
- EmitHitAnimation(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitHitAnimation(0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
else
@@ -6303,9 +5872,9 @@ static u32 GetTrainerMoneyToGive(u16 trainerId)
u32 lastMonLevel = 0;
u32 moneyReward = 0;
- if (trainerId == SECRET_BASE_OPPONENT)
+ if (trainerId == TRAINER_SECRET_BASE)
{
- moneyReward = 20 * gBattleResources->secretBase->partyLevels[0] * gBattleStruct->moneyMultiplier;
+ moneyReward = 20 * gBattleResources->secretBase->party.levels[0] * gBattleStruct->moneyMultiplier;
}
else
{
@@ -6317,19 +5886,19 @@ static u32 GetTrainerMoneyToGive(u16 trainerId)
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
}
break;
- case PARTY_FLAG_CUSTOM_MOVES:
+ case F_TRAINER_PARTY_CUSTOM_MOVESET:
{
const struct TrainerMonNoItemCustomMoves *party = gTrainers[trainerId].party.NoItemCustomMoves;
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
}
break;
- case PARTY_FLAG_HAS_ITEM:
+ case F_TRAINER_PARTY_HELD_ITEM:
{
const struct TrainerMonItemDefaultMoves *party = gTrainers[trainerId].party.ItemDefaultMoves;
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
}
break;
- case PARTY_FLAG_CUSTOM_MOVES | PARTY_FLAG_HAS_ITEM:
+ case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:
{
const struct TrainerMonItemCustomMoves *party = gTrainers[trainerId].party.ItemCustomMoves;
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;
@@ -6367,26 +5936,26 @@ static void atk5D_getmoneyreward(void)
gBattlescriptCurrInstr++;
}
-static void atk5E_8025A70(void)
+static void atk5E(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
switch (gBattleCommunication[0])
{
case 0:
- EmitGetMonData(0, REQUEST_ALL_BATTLE, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitGetMonData(0, REQUEST_ALL_BATTLE, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattleCommunication[0]++;
break;
case 1:
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
s32 i;
- struct BattlePokemon* bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBank][4];
+ struct BattlePokemon *bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4];
for (i = 0; i < 4; i++)
{
- gBattleMons[gActiveBank].moves[i] = bufferPoke->moves[i];
- gBattleMons[gActiveBank].pp[i] = bufferPoke->pp[i];
+ gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i];
+ gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i];
}
gBattlescriptCurrInstr += 2;
}
@@ -6394,45 +5963,45 @@ static void atk5E_8025A70(void)
}
}
-static void atk5F_8025B24(void)
+static void atk5F_swapattackerwithtarget(void)
{
- gActiveBank = gBankAttacker;
- gBankAttacker = gBankTarget;
- gBankTarget = gActiveBank;
+ gActiveBattler = gBattlerAttacker;
+ gBattlerAttacker = gBattlerTarget;
+ gBattlerTarget = gActiveBattler;
- if (gHitMarker & HITMARKER_PURSUIT_TRAP)
- gHitMarker &= ~(HITMARKER_PURSUIT_TRAP);
+ if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET)
+ gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET);
else
- gHitMarker |= HITMARKER_PURSUIT_TRAP;
+ gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET;
gBattlescriptCurrInstr++;
}
-static void atk60_increment_gamestat(void)
+static void atk60_incrementgamestat(void)
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
IncrementGameStat(gBattlescriptCurrInstr[1]);
gBattlescriptCurrInstr += 2;
}
-static void atk61_draw_party_status_summary(void)
+static void atk61_drawpartystatussummary(void)
{
s32 i;
- struct Pokemon* party;
- struct HpAndStatus hpStatuses[6];
+ struct Pokemon *party;
+ struct HpAndStatus hpStatuses[PARTY_SIZE];
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
@@ -6447,42 +6016,42 @@ static void atk61_draw_party_status_summary(void)
}
}
- EmitDrawPartyStatusSummary(0, hpStatuses, 1);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitDrawPartyStatusSummary(0, hpStatuses, 1);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
-static void atk62_08025C6C(void)
+static void atk62_hidepartystatussummary(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- EmitCmd49(0);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ BtlController_EmitHidePartyStatusSummary(0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
static void atk63_jumptorandomattack(void)
{
- if (gBattlescriptCurrInstr[1] != 0)
+ if (gBattlescriptCurrInstr[1])
gCurrentMove = gRandomMove;
else
- gLastUsedMove = gCurrentMove = gRandomMove;
+ gChosenMove = gCurrentMove = gRandomMove;
gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
static void atk64_statusanimation(void)
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE)
- && gDisableStructs[gActiveBank].substituteHP == 0
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)
+ && gDisableStructs[gActiveBattler].substituteHP == 0
&& !(gHitMarker & HITMARKER_NO_ANIMATIONS))
{
- EmitStatusAnimation(0, FALSE, gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitStatusAnimation(0, FALSE, gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
}
gBattlescriptCurrInstr += 2;
}
@@ -6492,16 +6061,16 @@ static void atk65_status2animation(void)
{
u32 wantedToAnimate;
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- wantedToAnimate = BSScriptRead32(gBattlescriptCurrInstr + 2);
- if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE)
- && gDisableStructs[gActiveBank].substituteHP == 0
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ wantedToAnimate = T1_READ_32(gBattlescriptCurrInstr + 2);
+ if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)
+ && gDisableStructs[gActiveBattler].substituteHP == 0
&& !(gHitMarker & HITMARKER_NO_ANIMATIONS))
{
- EmitStatusAnimation(0, TRUE, gBattleMons[gActiveBank].status2 & wantedToAnimate);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitStatusAnimation(0, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate);
+ MarkBattlerForControllerExec(gActiveBattler);
}
gBattlescriptCurrInstr += 6;
}
@@ -6511,16 +6080,16 @@ static void atk66_chosenstatusanimation(void)
{
u32 wantedStatus;
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- wantedStatus = BSScriptRead32(gBattlescriptCurrInstr + 3);
- if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE)
- && gDisableStructs[gActiveBank].substituteHP == 0
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ wantedStatus = T1_READ_32(gBattlescriptCurrInstr + 3);
+ if (!(gStatuses3[gActiveBattler] & STATUS3_SEMI_INVULNERABLE)
+ && gDisableStructs[gActiveBattler].substituteHP == 0
&& !(gHitMarker & HITMARKER_NO_ANIMATIONS))
{
- EmitStatusAnimation(0, gBattlescriptCurrInstr[2], wantedStatus);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitStatusAnimation(0, gBattlescriptCurrInstr[2], wantedStatus);
+ MarkBattlerForControllerExec(gActiveBattler);
}
gBattlescriptCurrInstr += 7;
}
@@ -6532,7 +6101,7 @@ static void atk67_yesnobox(void)
{
case 0:
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
- BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC);
+ BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC);
gBattleCommunication[0]++;
gBattleCommunication[CURSOR_POSITION] = 0;
BattleCreateYesNoCursorAt(0);
@@ -6569,56 +6138,57 @@ static void atk67_yesnobox(void)
}
}
-static void atk68_cancel_everyones_actions(void)
+static void atk68_cancelallactions(void)
{
s32 i;
- for (i = 0; i < gNoOfAllBanks; i++)
- gActionsByTurnOrder[i] = ACTION_CANCEL_PARTNER;
+ for (i = 0; i < gBattlersCount; i++)
+ gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER;
gBattlescriptCurrInstr++;
}
-static void atk69_dmg_adjustment3(void) // The same as 0x7, except there's no random damage multiplier.
+static void atk69_adjustsetdamage(void) // The same as 0x7, except there's no random damage multiplier.
{
- u8 holdEffect, quality;
+ u8 holdEffect, param;
- if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
+ if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)
{
- holdEffect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
+ holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;
+ param = gEnigmaBerries[gBattlerTarget].holdEffectParam;
}
else
{
- holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
- quality = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);
+ param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);
}
- gStringBank = gBankTarget;
+ gPotentialItemEffectBattler = gBattlerTarget;
- if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < quality)
+ if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)
{
- RecordItemEffectBattle(gBankTarget, holdEffect);
- gSpecialStatuses[gBankTarget].focusBanded = 1;
+ RecordItemEffectBattle(gBattlerTarget, holdEffect);
+ gSpecialStatuses[gBattlerTarget].focusBanded = 1;
}
- if (gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)
goto END;
- if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBankTarget].endured
- && !gSpecialStatuses[gBankTarget].focusBanded)
+ if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBattlerTarget].endured
+ && !gSpecialStatuses[gBattlerTarget].focusBanded)
goto END;
- if (gBattleMons[gBankTarget].hp > gBattleMoveDamage)
+ if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
goto END;
- gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;
- if (gProtectStructs[gBankTarget].endured)
+ if (gProtectStructs[gBattlerTarget].endured)
{
- gBattleMoveFlags |= MOVESTATUS_ENDURED;
+ gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;
}
- else if (gSpecialStatuses[gBankTarget].focusBanded)
+ else if (gSpecialStatuses[gBattlerTarget].focusBanded)
{
- gBattleMoveFlags |= MOVESTATUS_HUNGON;
- gLastUsedItem = gBattleMons[gBankTarget].item;
+ gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;
+ gLastUsedItem = gBattleMons[gBattlerTarget].item;
}
END:
@@ -6629,26 +6199,26 @@ static void atk6A_removeitem(void)
{
u16* usedHeldItem;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBank];
- *usedHeldItem = gBattleMons[gActiveBank].item;
- gBattleMons[gActiveBank].item = 0;
+ usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler];
+ *usedHeldItem = gBattleMons[gActiveBattler].item;
+ gBattleMons[gActiveBattler].item = 0;
- EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
static void atk6B_atknameinbuff1(void)
{
- PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker])
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])
gBattlescriptCurrInstr++;
}
-static void atk6C_draw_lvlupbox(void)
+static void atk6C_drawlvlupbox(void)
{
if (gBattleScripting.atk6C_state == 0)
{
@@ -6744,7 +6314,7 @@ static void sub_804F100(void)
{
struct StatsArray currentStats;
- sub_81D388C(&gPlayerParty[gBattleStruct->expGetterId], &currentStats);
+ sub_81D388C(&gPlayerParty[gBattleStruct->expGetterMonId], &currentStats);
sub_81D3640(0xD, gBattleResources->statsBeforeLvlUp, &currentStats, 0xE, 0xD, 0xF);
}
@@ -6752,7 +6322,7 @@ static void sub_804F144(void)
{
struct StatsArray currentStats;
- sub_81D388C(&gPlayerParty[gBattleStruct->expGetterId], &currentStats);
+ sub_81D388C(&gPlayerParty[gBattleStruct->expGetterMonId], &currentStats);
sub_81D3784(0xD, &currentStats, 0xE, 0xD, 0xF);
}
@@ -6795,9 +6365,9 @@ static void PutLevelAndGenderOnLvlUpBox(void)
u8 *txtPtr;
u32 var;
- monLevel = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_LEVEL);
- monGender = GetMonGender(&gPlayerParty[gBattleStruct->expGetterId]);
- GetMonNickname(&gPlayerParty[gBattleStruct->expGetterId], gStringVar4);
+ monLevel = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);
+ monGender = GetMonGender(&gPlayerParty[gBattleStruct->expGetterMonId]);
+ GetMonNickname(&gPlayerParty[gBattleStruct->expGetterMonId], gStringVar4);
subPrinter.current_text_offset = gStringVar4;
subPrinter.windowId = 14;
@@ -6809,7 +6379,7 @@ static void PutLevelAndGenderOnLvlUpBox(void)
subPrinter.letterSpacing = 0;
subPrinter.lineSpacing = 0;
subPrinter.fontColor_l = TEXT_COLOR_TRANSPARENT;
- subPrinter.fontColor_h = TEXT_COLOR_WHITE;
+ subPrinter.fgColor = TEXT_COLOR_WHITE;
subPrinter.bgColor = TEXT_COLOR_TRANSPARENT;
subPrinter.shadowColor = TEXT_COLOR_DARK_GREY;
@@ -6863,8 +6433,8 @@ static bool8 sub_804F344(void)
return (gBattle_BG2_X != 0x1A0);
}
-#define sDestroy data0
-#define sSavedLvlUpBoxXPosition data1
+#define sDestroy data[0]
+#define sSavedLvlUpBoxXPosition data[1]
static void PutMonIconOnLvlUpBox(void)
{
@@ -6873,8 +6443,8 @@ static void PutMonIconOnLvlUpBox(void)
struct SpriteSheet iconSheet;
struct SpritePalette iconPalSheet;
- u16 species = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPECIES);
- u32 personality = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_PERSONALITY);
+ u16 species = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPECIES);
+ u32 personality = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_PERSONALITY);
const u8* iconPtr = GetMonIconPtr(species, personality, 1);
iconSheet.data = iconPtr;
@@ -6914,40 +6484,40 @@ static void SpriteCB_MonIconOnLvlUpBox(struct Sprite* sprite)
static bool32 IsMonGettingExpSentOut(void)
{
- if (gBattlePartyID[0] == gBattleStruct->expGetterId)
+ if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId)
return TRUE;
- if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[2] == gBattleStruct->expGetterId)
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId)
return TRUE;
return FALSE;
}
-static void atk6D_reset_sentpokes_value(void)
+static void atk6D_resetsentmonsvalue(void)
{
ResetSentPokesToOpponentValue();
gBattlescriptCurrInstr++;
}
-static void atk6E_set_atk_to_player0(void)
+static void atk6E_setatktoplayer0(void)
{
- gBankAttacker = GetBankByIdentity(0);
+ gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
gBattlescriptCurrInstr++;
}
-static void atk6F_set_visible(void)
+static void atk6F_makevisible(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- EmitSpriteInvisibility(0, FALSE);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ BtlController_EmitSpriteInvisibility(0, FALSE);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
-static void atk70_record_last_used_ability(void)
+static void atk70_recordlastability(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- RecordAbilityBattle(gActiveBank, gLastUsedAbility);
- gBattlescriptCurrInstr += 1; // UB: Should be + 2, one byte for command and one byte for bank argument.
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
+ gBattlescriptCurrInstr += 1; // UB: Should be + 2, one byte for command and one byte for battlerId argument.
}
void BufferMoveToLearnIntoBattleTextBuff2(void)
@@ -6955,29 +6525,29 @@ void BufferMoveToLearnIntoBattleTextBuff2(void)
PREPARE_MOVE_BUFFER(gBattleTextBuff2, gMoveToLearn);
}
-static void atk71_buffer_move_to_learn(void)
+static void atk71_buffermovetolearn(void)
{
BufferMoveToLearnIntoBattleTextBuff2();
gBattlescriptCurrInstr++;
}
-static void atk72_jump_if_run_attempt_success(void)
+static void atk72_jumpifplayerran(void)
{
- if (TryRunFromBattle(gBank1))
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ if (TryRunFromBattle(gBattlerFainted))
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
}
-static void atk73_hp_thresholds(void)
+static void atk73_hpthresholds(void)
{
u8 opposingBank;
s32 result;
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- opposingBank = gActiveBank ^ BIT_SIDE;
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ opposingBank = gActiveBattler ^ BIT_SIDE;
result = gBattleMons[opposingBank].hp * 100 / gBattleMons[opposingBank].maxHP;
if (result == 0)
@@ -6996,7 +6566,7 @@ static void atk73_hp_thresholds(void)
gBattlescriptCurrInstr += 2;
}
-static void atk74_hp_thresholds2(void)
+static void atk74_hpthresholds2(void)
{
u8 opposingBank;
s32 result;
@@ -7004,9 +6574,9 @@ static void atk74_hp_thresholds2(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- opposingBank = gActiveBank ^ BIT_SIDE;
- hpSwitchout = *(gBattleStruct->hpOnSwitchout + GetBankSide(opposingBank));
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ opposingBank = gActiveBattler ^ BIT_SIDE;
+ hpSwitchout = *(gBattleStruct->hpOnSwitchout + GetBattlerSide(opposingBank));
result = (hpSwitchout - gBattleMons[opposingBank].hp) * 100 / hpSwitchout;
if (gBattleMons[opposingBank].hp >= hpSwitchout)
@@ -7022,11 +6592,10 @@ static void atk74_hp_thresholds2(void)
gBattlescriptCurrInstr += 2;
}
-static void atk75_item_effect_on_opponent(void)
+static void atk75_useitemonopponent(void)
{
- gBankInMenu = gBankAttacker;
- ExecuteTableBasedItemEffect(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1);
-
+ gBattlerInMenuId = gBattlerAttacker;
+ PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBattlerAttacker], 0, 1);
gBattlescriptCurrInstr += 1;
}
@@ -7035,52 +6604,52 @@ static void atk76_various(void)
u8 side;
s32 i;
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
switch (gBattlescriptCurrInstr[2])
{
case VARIOUS_CANCEL_MULTI_TURN_MOVES:
- CancelMultiTurnMoves(gActiveBank);
+ CancelMultiTurnMoves(gActiveBattler);
break;
case VARIOUS_SET_MAGIC_COAT_TARGET:
- gBankAttacker = gBankTarget;
- side = GetBankSide(gBankAttacker) ^ 1;
+ gBattlerAttacker = gBattlerTarget;
+ side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;
if (gSideTimers[side].followmeTimer != 0 && gBattleMons[gSideTimers[side].followmeTarget].hp != 0)
- gBankTarget = gSideTimers[side].followmeTarget;
+ gBattlerTarget = gSideTimers[side].followmeTarget;
else
- gBankTarget = gActiveBank;
+ gBattlerTarget = gActiveBattler;
break;
- case VARIOUS_CAN_RUN_FROM_BATTLE:
+ case VARIOUS_IS_RUNNING_IMPOSSIBLE:
gBattleCommunication[0] = IsRunningFromBattleImpossible();
break;
case VARIOUS_GET_MOVE_TARGET:
- gBankTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
break;
case 4:
- if (gHitMarker & HITMARKER_FAINTED(gActiveBank))
+ if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))
gBattleCommunication[0] = 1;
else
gBattleCommunication[0] = 0;
break;
case VARIOUS_RESET_INTIMIDATE_TRACE_BITS:
- gSpecialStatuses[gActiveBank].intimidatedPoke = 0;
- gSpecialStatuses[gActiveBank].traced = 0;
+ gSpecialStatuses[gActiveBattler].intimidatedMon = 0;
+ gSpecialStatuses[gActiveBattler].traced = 0;
break;
case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP:
- if (gBattlePartyID[0] == gBattleStruct->expGetterId || gBattlePartyID[2] == gBattleStruct->expGetterId)
+ if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId)
{
u16 *choicedMove;
- if (gBattlePartyID[0] == gBattleStruct->expGetterId)
- gActiveBank = 0;
+ if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId)
+ gActiveBattler = 0;
else
- gActiveBank = 2;
+ gActiveBattler = 2;
- choicedMove = &gBattleStruct->choicedMove[gActiveBank];
+ choicedMove = &gBattleStruct->choicedMove[gActiveBattler];
for (i = 0; i < 4; i++)
{
- if (gBattleMons[gActiveBank].moves[i] == *choicedMove)
+ if (gBattleMons[gActiveBattler].moves[i] == *choicedMove)
break;
}
if (i == 4)
@@ -7098,15 +6667,15 @@ static void atk76_various(void)
break;
case 8:
gBattleCommunication[0] = 0;
- gBattleScripting.bank = gActiveBank = gBattleCommunication[1];
- if (!(gBattleStruct->field_92 & gBitTable[gActiveBank])
- && gBattleMons[gActiveBank].maxHP / 2 >= gBattleMons[gActiveBank].hp
- && gBattleMons[gActiveBank].hp != 0
- && !(gBattleMons[gActiveBank].status1 & STATUS_SLEEP))
+ gBattleScripting.battler = gActiveBattler = gBattleCommunication[1];
+ if (!(gBattleStruct->field_92 & gBitTable[gActiveBattler])
+ && gBattleMons[gActiveBattler].maxHP / 2 >= gBattleMons[gActiveBattler].hp
+ && gBattleMons[gActiveBattler].hp != 0
+ && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
{
- gBattleStruct->field_92 |= gBitTable[gActiveBank];
+ gBattleStruct->field_92 |= gBitTable[gActiveBattler];
gBattleCommunication[0] = 1;
- gBattleCommunication[MULTISTRING_CHOOSER] = sUnknown_0831C4F8[GetNatureFromPersonality(gBattleMons[gActiveBank].personality)];
+ gBattleCommunication[MULTISTRING_CHOOSER] = sUnknown_0831C4F8[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)];
}
break;
case 9:
@@ -7119,14 +6688,14 @@ static void atk76_various(void)
case 10:
gBattleMons[1].hp = 0;
gHitMarker |= HITMARKER_FAINTED(1);
- gBattleStruct->field_2A1 |= gBitTable[gBattlePartyID[1]];
+ gBattleStruct->field_2A1 |= gBitTable[gBattlerPartyIndexes[1]];
gDisableStructs[1].truantUnknownBit = 1;
break;
case 11:
gBattleMons[0].hp = 0;
gHitMarker |= HITMARKER_FAINTED(0);
gHitMarker |= HITMARKER_x400000;
- gBattleStruct->field_2A0 |= gBitTable[gBattlePartyID[0]];
+ gBattleStruct->field_2A0 |= gBitTable[gBattlerPartyIndexes[0]];
gDisableStructs[0].truantUnknownBit = 1;
break;
case 12:
@@ -7135,14 +6704,14 @@ static void atk76_various(void)
gHitMarker |= HITMARKER_FAINTED(0);
gHitMarker |= HITMARKER_FAINTED(1);
gHitMarker |= HITMARKER_x400000;
- gBattleStruct->field_2A0 |= gBitTable[gBattlePartyID[0]];
- gBattleStruct->field_2A1 |= gBitTable[gBattlePartyID[1]];
+ gBattleStruct->field_2A0 |= gBitTable[gBattlerPartyIndexes[0]];
+ gBattleStruct->field_2A1 |= gBitTable[gBattlerPartyIndexes[1]];
gDisableStructs[0].truantUnknownBit = 1;
gDisableStructs[1].truantUnknownBit = 1;
break;
case VARIOUS_EMIT_YESNOBOX:
- EmitUnknownYesNoBox(0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitUnknownYesNoBox(0);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
case 14:
sub_81A5BF8();
@@ -7152,7 +6721,7 @@ static void atk76_various(void)
break;
case 16:
BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[gBattlescriptCurrInstr[1]]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0x16);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0x16);
break;
case 17:
if (IsTextPrinterActive(0x16))
@@ -7163,82 +6732,82 @@ static void atk76_various(void)
return;
break;
case VARIOUS_RETURN_OPPONENT_MON1:
- gActiveBank = 1;
- if (gBattleMons[gActiveBank].hp != 0)
+ gActiveBattler = 1;
+ if (gBattleMons[gActiveBattler].hp != 0)
{
- EmitReturnMonToBall(0, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitReturnMonToBall(0, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
break;
case VARIOUS_RETURN_OPPONENT_MON2:
- if (gNoOfAllBanks > 3)
+ if (gBattlersCount > 3)
{
- gActiveBank = 3;
- if (gBattleMons[gActiveBank].hp != 0)
+ gActiveBattler = 3;
+ if (gBattleMons[gActiveBattler].hp != 0)
{
- EmitReturnMonToBall(0, 0);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitReturnMonToBall(0, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
break;
case 21:
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x55);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x55);
break;
case 22:
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
break;
case 23:
- gBattleStruct->field_2A2 |= gBitTable[gActiveBank];
+ gBattleStruct->field_2A2 |= gBitTable[gActiveBattler];
break;
case 24:
- if (sub_805725C(gActiveBank))
+ if (sub_805725C(gActiveBattler))
return;
break;
case VARIOUS_SET_TELEPORT_OUTCOME:
- if (GetBankSide(gActiveBank) == SIDE_PLAYER)
- gBattleOutcome = BATTLE_PLAYER_TELEPORTED;
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
+ gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED;
else
- gBattleOutcome = BATTLE_OPPONENT_TELEPORTED;
+ gBattleOutcome = B_OUTCOME_MON_TELEPORTED;
break;
case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC:
- EmitPlayFanfareOrBGM(0, BGM_KACHI1, TRUE);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitPlayFanfareOrBGM(0, MUS_KACHI1, TRUE);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
}
gBattlescriptCurrInstr += 3;
}
-static void atk77_set_protect_like(void) // protect and endure
+static void atk77_setprotectlike(void) // protect and endure
{
bool8 notLastTurn = TRUE;
- u16 lastMove = gUnknown_02024260[gBankAttacker];
+ u16 lastMove = gLastResultingMoves[gBattlerAttacker];
if (lastMove != MOVE_PROTECT && lastMove != MOVE_DETECT && lastMove != MOVE_ENDURE)
- gDisableStructs[gBankAttacker].protectUses = 0;
+ gDisableStructs[gBattlerAttacker].protectUses = 0;
- if (gCurrentTurnActionNumber == (gNoOfAllBanks - 1))
+ if (gCurrentTurnActionNumber == (gBattlersCount - 1))
notLastTurn = FALSE;
- if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] >= Random() && notLastTurn)
+ if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn)
{
if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT)
{
- gProtectStructs[gBankAttacker].protected = 1;
+ gProtectStructs[gBattlerAttacker].protected = 1;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE)
{
- gProtectStructs[gBankAttacker].endured = 1;
+ gProtectStructs[gBattlerAttacker].endured = 1;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
- gDisableStructs[gBankAttacker].protectUses++;
+ gDisableStructs[gBattlerAttacker].protectUses++;
}
else
{
- gDisableStructs[gBankAttacker].protectUses = 0;
+ gDisableStructs[gBattlerAttacker].protectUses = 0;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
}
gBattlescriptCurrInstr++;
@@ -7246,88 +6815,90 @@ static void atk77_set_protect_like(void) // protect and endure
static void atk78_faintifabilitynotdamp(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++)
+ for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
- if (gBattleMons[gBankTarget].ability == ABILITY_DAMP)
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_DAMP)
break;
}
- if (gBankTarget == gNoOfAllBanks)
+ if (gBattlerTarget == gBattlersCount)
{
- gActiveBank = gBankAttacker;
- gBattleMoveDamage = gBattleMons[gActiveBank].hp;
- EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].hp;
+ BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr++;
- for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++)
+ for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
- if (gBankTarget == gBankAttacker)
+ if (gBattlerTarget == gBattlerAttacker)
continue;
- if (!(gAbsentBankFlags & gBitTable[gBankTarget]))
+ if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))
break;
}
}
else
{
gLastUsedAbility = ABILITY_DAMP;
- RecordAbilityBattle(gBankTarget, gBattleMons[gBankTarget].ability);
+ RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability);
gBattlescriptCurrInstr = BattleScript_DampStopsExplosion;
}
}
static void atk79_setatkhptozero(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = gBankAttacker;
- gBattleMons[gActiveBank].hp = 0;
- EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ gBattleMons[gActiveBattler].hp = 0;
+ BtlController_EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBattler].hp);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr++;
}
-static void atk7A_jumpwhiletargetvalid(void) // Used by intimidate to loop through all targets.
+static void atk7A_jumpifnexttargetvalid(void)
{
- const u8* jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- for (gBankTarget++; ; gBankTarget++)
+ for (gBattlerTarget++; ; gBattlerTarget++)
{
- if (gBankTarget == gBankAttacker)
+ if (gBattlerTarget == gBattlerAttacker)
continue;
- if (!(gAbsentBankFlags & gBitTable[gBankTarget]))
+ if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))
break;
}
- if (gBankTarget >= gNoOfAllBanks)
+ if (gBattlerTarget >= gBattlersCount)
gBattlescriptCurrInstr += 5;
else
gBattlescriptCurrInstr = jumpPtr;
}
else
+ {
gBattlescriptCurrInstr += 5;
+ }
}
-static void atk7B_healhalfHP_if_possible(void)
+static void atk7B_tryhealhalfhealth(void)
{
- const u8* failPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ const u8* failPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
- if (gBattlescriptCurrInstr[5] == BS_GET_ATTACKER)
- gBankTarget = gBankAttacker;
+ if (gBattlescriptCurrInstr[5] == BS_ATTACKER)
+ gBattlerTarget = gBattlerAttacker;
- gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
- if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP)
+ if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)
gBattlescriptCurrInstr = failPtr;
else
gBattlescriptCurrInstr += 6;
@@ -7343,12 +6914,12 @@ static void atk7C_trymirrormove(void)
for (i = 0; i < 3; i++)
movesArray[i] = 0;
- for (validMovesCount = 0, i = 0; i < gNoOfAllBanks; i++)
+ for (validMovesCount = 0, i = 0; i < gBattlersCount; i++)
{
- if (i != gBankAttacker)
+ if (i != gBattlerAttacker)
{
- move = *(i * 2 + gBankAttacker * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0)
- | (*(i * 2 + gBankAttacker * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) << 8);
+ move = *(i * 2 + gBattlerAttacker * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 0)
+ | (*(i * 2 + gBattlerAttacker * 8 + (u8*)(gBattleStruct->mirrorMoveArrays) + 1) << 8);
if (move != 0 && move != 0xFFFF)
{
@@ -7358,14 +6929,14 @@ static void atk7C_trymirrormove(void)
}
}
- move = *(gBattleStruct->mirrorMoves + gBankAttacker * 2 + 0)
- | (*(gBattleStruct->mirrorMoves + gBankAttacker * 2 + 1) << 8);
+ move = *(gBattleStruct->mirrorMoves + gBattlerAttacker * 2 + 0)
+ | (*(gBattleStruct->mirrorMoves + gBattlerAttacker * 2 + 1) << 8);
if (move != 0 && move != 0xFFFF)
{
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gCurrentMove = move;
- gBankTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else if (validMovesCount)
@@ -7373,21 +6944,21 @@ static void atk7C_trymirrormove(void)
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
i = Random() % validMovesCount;
gCurrentMove = movesArray[i];
- gBankTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else
{
- gSpecialStatuses[gBankAttacker].flag20 = 1;
+ gSpecialStatuses[gBattlerAttacker].flag20 = 1;
gBattlescriptCurrInstr++;
}
}
-static void atk7D_set_rain(void)
+static void atk7D_setrain(void)
{
if (gBattleWeather & WEATHER_RAIN_ANY)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
}
else
@@ -7401,16 +6972,16 @@ static void atk7D_set_rain(void)
static void atk7E_setreflect(void)
{
- if (gSideAffecting[GET_BANK_SIDE(gBankAttacker)] & SIDE_STATUS_REFLECT)
+ if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_REFLECT)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
else
{
- gSideAffecting[GET_BANK_SIDE(gBankAttacker)] |= SIDE_STATUS_REFLECT;
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].reflectTimer = 5;
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].reflectBank = gBankAttacker;
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_REFLECT;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectTimer = 5;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
@@ -7422,20 +6993,20 @@ static void atk7E_setreflect(void)
static void atk7F_setseeded(void)
{
- if (gBattleMoveFlags & MOVESTATUS_NOEFFECT || gStatuses3[gBankTarget] & STATUS3_LEECHSEED)
+ if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
- else if (gBattleMons[gBankTarget].type1 == TYPE_GRASS || gBattleMons[gBankTarget].type2 == TYPE_GRASS)
+ else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS))
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
}
else
{
- gStatuses3[gBankTarget] |= gBankAttacker;
- gStatuses3[gBankTarget] |= STATUS3_LEECHSEED;
+ gStatuses3[gBattlerTarget] |= gBattlerAttacker;
+ gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
@@ -7453,8 +7024,8 @@ static void atk80_manipulatedamage(void)
gBattleMoveDamage /= 2;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if ((gBattleMons[gBankTarget].maxHP / 2) < gBattleMoveDamage)
- gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2;
+ if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage)
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;
break;
case ATK80_DMG_DOUBLED:
gBattleMoveDamage *= 2;
@@ -7464,35 +7035,35 @@ static void atk80_manipulatedamage(void)
gBattlescriptCurrInstr += 2;
}
-static void atk81_setrest(void)
+static void atk81_trysetrest(void)
{
- const u8* failJump = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
- gActiveBank = gBankTarget = gBankAttacker;
- gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1);
+ const u8 *failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1);
+ gActiveBattler = gBattlerTarget = gBattlerAttacker;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP * (-1);
- if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP)
+ if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)
{
gBattlescriptCurrInstr = failJump;
}
else
{
- if (gBattleMons[gBankTarget].status1 & ((u8)(~STATUS_SLEEP)))
+ if (gBattleMons[gBattlerTarget].status1 & ((u8)(~STATUS1_SLEEP)))
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- gBattleMons[gBankTarget].status1 = 3;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gBattleMons[gBattlerTarget].status1 = 3;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 5;
}
}
static void atk82_jumpifnotfirstturn(void)
{
- const u8* failJump = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ const u8* failJump = T1_READ_PTR(gBattlescriptCurrInstr + 1);
- if (gDisableStructs[gBankAttacker].isFirstTurn)
+ if (gDisableStructs[gBattlerAttacker].isFirstTurn)
gBattlescriptCurrInstr += 5;
else
gBattlescriptCurrInstr = failJump;
@@ -7503,20 +7074,20 @@ static void atk83_nop(void)
gBattlescriptCurrInstr++;
}
-bool8 UproarWakeUpCheck(u8 bank)
+bool8 UproarWakeUpCheck(u8 battlerId)
{
s32 i;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[bank].ability == ABILITY_SOUNDPROOF)
+ if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[battlerId].ability == ABILITY_SOUNDPROOF)
continue;
- gBattleScripting.bank = i;
+ gBattleScripting.battler = i;
- if (gBankTarget == 0xFF)
- gBankTarget = i;
- else if (gBankTarget == i)
+ if (gBattlerTarget == 0xFF)
+ gBattlerTarget = i;
+ else if (gBattlerTarget == i)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
@@ -7524,27 +7095,27 @@ bool8 UproarWakeUpCheck(u8 bank)
break;
}
- if (i == gNoOfAllBanks)
+ if (i == gBattlersCount)
return FALSE;
else
return TRUE;
}
-static void atk84_jump_if_cant_sleep(void)
+static void atk84_jumpifcantmakeasleep(void)
{
- const u8* jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
- if (UproarWakeUpCheck(gBankTarget))
+ if (UproarWakeUpCheck(gBattlerTarget))
{
gBattlescriptCurrInstr = jumpPtr;
}
- else if (gBattleMons[gBankTarget].ability == ABILITY_INSOMNIA
- || gBattleMons[gBankTarget].ability == ABILITY_VITAL_SPIRIT)
+ else if (gBattleMons[gBattlerTarget].ability == ABILITY_INSOMNIA
+ || gBattleMons[gBattlerTarget].ability == ABILITY_VITAL_SPIRIT)
{
- gLastUsedAbility = gBattleMons[gBankTarget].ability;
+ gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
gBattlescriptCurrInstr = jumpPtr;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
else
{
@@ -7554,16 +7125,16 @@ static void atk84_jump_if_cant_sleep(void)
static void atk85_stockpile(void)
{
- if (gDisableStructs[gBankAttacker].stockpileCounter == 3)
+ if (gDisableStructs[gBattlerAttacker].stockpileCounter == 3)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
else
{
- gDisableStructs[gBankAttacker].stockpileCounter++;
+ gDisableStructs[gBattlerAttacker].stockpileCounter++;
- PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBankAttacker].stockpileCounter)
+ PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
@@ -7572,8 +7143,8 @@ static void atk85_stockpile(void)
static void atk86_stockpiletobasedamage(void)
{
- const u8* jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
- if (gDisableStructs[gBankAttacker].stockpileCounter == 0)
+ const u8* jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
+ if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0)
{
gBattlescriptCurrInstr = jumpPtr;
}
@@ -7581,49 +7152,49 @@ static void atk86_stockpiletobasedamage(void)
{
if (gBattleCommunication[6] != 1)
{
- gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove,
- gSideAffecting[GET_BANK_SIDE(gBankTarget)], 0,
- 0, gBankAttacker, gBankTarget)
- * gDisableStructs[gBankAttacker].stockpileCounter;
- gBattleScripting.animTurn = gDisableStructs[gBankAttacker].stockpileCounter;
+ gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove,
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0,
+ 0, gBattlerAttacker, gBattlerTarget)
+ * gDisableStructs[gBattlerAttacker].stockpileCounter;
+ gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter;
- if (gProtectStructs[gBankAttacker].helpingHand)
+ if (gProtectStructs[gBattlerAttacker].helpingHand)
gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
}
- gDisableStructs[gBankAttacker].stockpileCounter = 0;
+ gDisableStructs[gBattlerAttacker].stockpileCounter = 0;
gBattlescriptCurrInstr += 5;
}
}
static void atk87_stockpiletohpheal(void)
{
- const u8* jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ const u8* jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
- if (gDisableStructs[gBankAttacker].stockpileCounter == 0)
+ if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0)
{
gBattlescriptCurrInstr = jumpPtr;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
- else if (gBattleMons[gBankAttacker].maxHP == gBattleMons[gBankAttacker].hp)
+ else if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp)
{
- gDisableStructs[gBankAttacker].stockpileCounter = 0;
+ gDisableStructs[gBattlerAttacker].stockpileCounter = 0;
gBattlescriptCurrInstr = jumpPtr;
- gBankTarget = gBankAttacker;
+ gBattlerTarget = gBattlerAttacker;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
else
{
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / (1 << (3 - gDisableStructs[gBankAttacker].stockpileCounter));
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter));
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
- gBattleScripting.animTurn = gDisableStructs[gBankAttacker].stockpileCounter;
- gDisableStructs[gBankAttacker].stockpileCounter = 0;
+ gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter;
+ gDisableStructs[gBattlerAttacker].stockpileCounter = 0;
gBattlescriptCurrInstr += 5;
- gBankTarget = gBankAttacker;
+ gBattlerTarget = gBattlerAttacker;
}
}
@@ -7636,16 +7207,16 @@ static void atk88_negativedamage(void)
gBattlescriptCurrInstr++;
}
-static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr)
+static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr)
{
- bool8 certain = 0;
+ bool8 certain = FALSE;
bool8 notProtectAffected = FALSE;
u32 index;
if (flags & MOVE_EFFECT_AFFECTS_USER)
- gActiveBank = gBankAttacker;
+ gActiveBattler = gBattlerAttacker;
else
- gActiveBank = gBankTarget;
+ gActiveBattler = gBattlerTarget;
flags &= ~(MOVE_EFFECT_AFFECTS_USER);
@@ -7661,21 +7232,21 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr)
if ((statValue << 0x18) < 0) // stat decrease
{
- if (gSideTimers[GET_BANK_SIDE(gActiveBank)].mistTimer
+ if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer
&& !certain && gCurrentMove != MOVE_CURSE)
{
if (flags == STAT_CHANGE_BS_PTR)
{
- if (gSpecialStatuses[gActiveBank].statLowered)
+ if (gSpecialStatuses[gActiveBattler].statLowered)
{
gBattlescriptCurrInstr = BS_ptr;
}
else
{
BattleScriptPush(BS_ptr);
- gBattleScripting.bank = gActiveBank;
+ gBattleScripting.battler = gActiveBattler;
gBattlescriptCurrInstr = BattleScript_MistProtected;
- gSpecialStatuses[gActiveBank].statLowered = 1;
+ gSpecialStatuses[gActiveBattler].statLowered = 1;
}
}
return STAT_CHANGE_DIDNT_WORK;
@@ -7686,55 +7257,55 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr)
gBattlescriptCurrInstr = BattleScript_ButItFailed;
return STAT_CHANGE_DIDNT_WORK;
}
- else if ((gBattleMons[gActiveBank].ability == ABILITY_CLEAR_BODY
- || gBattleMons[gActiveBank].ability == ABILITY_WHITE_SMOKE)
+ else if ((gBattleMons[gActiveBattler].ability == ABILITY_CLEAR_BODY
+ || gBattleMons[gActiveBattler].ability == ABILITY_WHITE_SMOKE)
&& !certain && gCurrentMove != MOVE_CURSE)
{
if (flags == STAT_CHANGE_BS_PTR)
{
- if (gSpecialStatuses[gActiveBank].statLowered)
+ if (gSpecialStatuses[gActiveBattler].statLowered)
{
gBattlescriptCurrInstr = BS_ptr;
}
else
{
BattleScriptPush(BS_ptr);
- gBattleScripting.bank = gActiveBank;
+ gBattleScripting.battler = gActiveBattler;
gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss;
- gLastUsedAbility = gBattleMons[gActiveBank].ability;
- RecordAbilityBattle(gActiveBank, gLastUsedAbility);
- gSpecialStatuses[gActiveBank].statLowered = 1;
+ gLastUsedAbility = gBattleMons[gActiveBattler].ability;
+ RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
+ gSpecialStatuses[gActiveBattler].statLowered = 1;
}
}
return STAT_CHANGE_DIDNT_WORK;
}
- else if (gBattleMons[gActiveBank].ability == ABILITY_KEEN_EYE
- && !certain && statId == STAT_STAGE_ACC)
+ else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE
+ && !certain && statId == STAT_ACC)
{
if (flags == STAT_CHANGE_BS_PTR)
{
BattleScriptPush(BS_ptr);
- gBattleScripting.bank = gActiveBank;
+ gBattleScripting.battler = gActiveBattler;
gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;
- gLastUsedAbility = gBattleMons[gActiveBank].ability;
- RecordAbilityBattle(gActiveBank, gLastUsedAbility);
+ gLastUsedAbility = gBattleMons[gActiveBattler].ability;
+ RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
}
return STAT_CHANGE_DIDNT_WORK;
}
- else if (gBattleMons[gActiveBank].ability == ABILITY_HYPER_CUTTER
- && !certain && statId == STAT_STAGE_ATK)
+ else if (gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER
+ && !certain && statId == STAT_ATK)
{
if (flags == STAT_CHANGE_BS_PTR)
{
BattleScriptPush(BS_ptr);
- gBattleScripting.bank = gActiveBank;
+ gBattleScripting.battler = gActiveBattler;
gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;
- gLastUsedAbility = gBattleMons[gActiveBank].ability;
- RecordAbilityBattle(gActiveBank, gLastUsedAbility);
+ gLastUsedAbility = gBattleMons[gActiveBattler].ability;
+ RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
}
return STAT_CHANGE_DIDNT_WORK;
}
- else if (gBattleMons[gActiveBank].ability == ABILITY_SHIELD_DUST && flags == 0)
+ else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0)
{
return STAT_CHANGE_DIDNT_WORK;
}
@@ -7746,22 +7317,22 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr)
if (statValue == -2)
{
gBattleTextBuff2[1] = B_BUFF_STRING;
- gBattleTextBuff2[2] = 0xD3; // harshly
- gBattleTextBuff2[3] = 0xD3 >> 8;
+ gBattleTextBuff2[2] = STRINGID_STATHARSHLY;
+ gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8;
index = 4;
}
gBattleTextBuff2[index] = B_BUFF_STRING;
index++;
- gBattleTextBuff2[index] = 0xD4; // fell
+ gBattleTextBuff2[index] = STRINGID_STATFELL;
index++;
- gBattleTextBuff2[index] = 0xD4 >> 8;
+ gBattleTextBuff2[index] = STRINGID_STATFELL >> 8;
index++;
gBattleTextBuff2[index] = B_BUFF_EOS;
- if (gBattleMons[gActiveBank].statStages[statId] == 0)
+ if (gBattleMons[gActiveBattler].statStages[statId] == 0)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
else
- gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBank);
+ gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler);
}
}
@@ -7773,32 +7344,32 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr)
if (statValue == 2)
{
gBattleTextBuff2[1] = B_BUFF_STRING;
- gBattleTextBuff2[2] = 0xD1; // sharply
- gBattleTextBuff2[3] = 0xD1 >> 8;
+ gBattleTextBuff2[2] = STRINGID_STATSHARPLY;
+ gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8;
index = 4;
}
gBattleTextBuff2[index] = B_BUFF_STRING;
index++;
- gBattleTextBuff2[index] = 0xD2; // rose
+ gBattleTextBuff2[index] = STRINGID_STATROSE;
index++;
- gBattleTextBuff2[index] = 0xD2 >> 8;
+ gBattleTextBuff2[index] = STRINGID_STATROSE >> 8;
index++;
gBattleTextBuff2[index] = B_BUFF_EOS;
- if (gBattleMons[gActiveBank].statStages[statId] == 0xC)
+ if (gBattleMons[gActiveBattler].statStages[statId] == 0xC)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
else
- gBattleCommunication[MULTISTRING_CHOOSER] = (gBankTarget == gActiveBank);
+ gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler);
}
- gBattleMons[gActiveBank].statStages[statId] += statValue;
- if (gBattleMons[gActiveBank].statStages[statId] < 0)
- gBattleMons[gActiveBank].statStages[statId] = 0;
- if (gBattleMons[gActiveBank].statStages[statId] > 0xC)
- gBattleMons[gActiveBank].statStages[statId] = 0xC;
+ gBattleMons[gActiveBattler].statStages[statId] += statValue;
+ if (gBattleMons[gActiveBattler].statStages[statId] < 0)
+ gBattleMons[gActiveBattler].statStages[statId] = 0;
+ if (gBattleMons[gActiveBattler].statStages[statId] > 0xC)
+ gBattleMons[gActiveBattler].statStages[statId] = 0xC;
if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && flags & STAT_CHANGE_BS_PTR)
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_CHANGE_BS_PTR))
return STAT_CHANGE_DIDNT_WORK;
@@ -7808,7 +7379,7 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8* BS_ptr)
static void atk89_statbuffchange(void)
{
- const u8* jumpPtr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ const u8* jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, GET_STAT_BUFF_ID(gBattleScripting.statChanger), gBattlescriptCurrInstr[1], jumpPtr) == STAT_CHANGE_WORKED)
gBattlescriptCurrInstr += 6;
}
@@ -7817,7 +7388,7 @@ static void atk8A_normalisebuffs(void) // haze
{
s32 i, j;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
for (j = 0; j < BATTLE_STATS_NO; j++)
gBattleMons[i].statStages[j] = 6;
@@ -7828,23 +7399,23 @@ static void atk8A_normalisebuffs(void) // haze
static void atk8B_setbide(void)
{
- gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMoves[gBankAttacker] = gCurrentMove;
- gTakenDmg[gBankAttacker] = 0;
- gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); // 2 turns
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS;
+ gLockedMoves[gBattlerAttacker] = gCurrentMove;
+ gTakenDmg[gBattlerAttacker] = 0;
+ gBattleMons[gBattlerAttacker].status2 |= (STATUS2_BIDE - 0x100); // 2 turns
gBattlescriptCurrInstr++;
}
static void atk8C_confuseifrepeatingattackends(void)
{
- if (!(gBattleMons[gBankAttacker].status2 & STATUS2_LOCK_CONFUSE))
+ if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE))
gBattleCommunication[MOVE_EFFECT_BYTE] = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER);
gBattlescriptCurrInstr++;
}
-static void atk8D_setmultihit_counter(void)
+static void atk8D_setmultihitcounter(void)
{
if (gBattlescriptCurrInstr[1])
{
@@ -7862,39 +7433,39 @@ static void atk8D_setmultihit_counter(void)
gBattlescriptCurrInstr += 2;
}
-static void atk8E_init_multihit_string(void)
+static void atk8E_initmultihitstring(void)
{
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
gBattlescriptCurrInstr++;
}
-static bool8 sub_8051064(void)
+static bool8 TryDoForceSwitchOut(void)
{
- if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level)
+ if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
{
- *(gBattleStruct->field_58 + gBankTarget) = gBattlePartyID[gBankTarget];
+ *(gBattleStruct->field_58 + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget];
}
else
{
u16 random = Random() & 0xFF;
- if ((u32)((random * (gBattleMons[gBankAttacker].level + gBattleMons[gBankTarget].level) >> 8) + 1) <= (gBattleMons[gBankTarget].level / 4))
+ if ((u32)((random * (gBattleMons[gBattlerAttacker].level + gBattleMons[gBattlerTarget].level) >> 8) + 1) <= (gBattleMons[gBattlerTarget].level / 4))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
return FALSE;
}
- *(gBattleStruct->field_58 + gBankTarget) = gBattlePartyID[gBankTarget];
+ *(gBattleStruct->field_58 + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget];
}
- gBattlescriptCurrInstr = gUnknown_082DADD8;
+ gBattlescriptCurrInstr = BattleScript_SuccessForceOut;
return TRUE;
}
static void atk8F_forcerandomswitch(void)
{
s32 i;
- s32 bank1PartyId = 0;
- s32 bank2PartyId = 0;
+ s32 battler1PartyId = 0;
+ s32 battler2PartyId = 0;
#ifdef NONMATCHING
s32 lastMonId = 0; // + 1
@@ -7910,7 +7481,7 @@ static void atk8F_forcerandomswitch(void)
if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER))
{
- if (GetBankSide(gBankTarget) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -7919,7 +7490,7 @@ static void atk8F_forcerandomswitch(void)
|| (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_x2000000)
|| (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER))
{
- if ((gBankTarget & BIT_MON) != 0)
+ if ((gBattlerTarget & BIT_FLANK) != 0)
{
firstMonId = 3;
lastMonId = 6;
@@ -7931,13 +7502,13 @@ static void atk8F_forcerandomswitch(void)
}
monsCount = 3;
minNeeded = 1;
- bank2PartyId = gBattlePartyID[gBankTarget];
- bank1PartyId = gBattlePartyID[gBankTarget ^ BIT_MON];
+ battler2PartyId = gBattlerPartyIndexes[gBattlerTarget];
+ battler1PartyId = gBattlerPartyIndexes[gBattlerTarget ^ BIT_FLANK];
}
else if ((gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
|| (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_x2000000))
{
- if (sub_806D82C(GetBankMultiplayerId(gBankTarget)) == 1)
+ if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == 1)
{
firstMonId = 3;
lastMonId = 6;
@@ -7949,12 +7520,12 @@ static void atk8F_forcerandomswitch(void)
}
monsCount = 3;
minNeeded = 1;
- bank2PartyId = gBattlePartyID[gBankTarget];
- bank1PartyId = gBattlePartyID[gBankTarget ^ BIT_MON];
+ battler2PartyId = gBattlerPartyIndexes[gBattlerTarget];
+ battler1PartyId = gBattlerPartyIndexes[gBattlerTarget ^ BIT_FLANK];
}
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
- if (GetBankSide(gBankTarget) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
{
firstMonId = 0;
lastMonId = 6;
@@ -7963,7 +7534,7 @@ static void atk8F_forcerandomswitch(void)
}
else
{
- if ((gBankTarget & BIT_MON) != 0)
+ if ((gBattlerTarget & BIT_FLANK) != 0)
{
firstMonId = 3;
lastMonId = 6;
@@ -7976,8 +7547,8 @@ static void atk8F_forcerandomswitch(void)
monsCount = 3;
minNeeded = 1;
}
- bank2PartyId = gBattlePartyID[gBankTarget];
- bank1PartyId = gBattlePartyID[gBankTarget ^ BIT_MON];
+ battler2PartyId = gBattlerPartyIndexes[gBattlerTarget];
+ battler1PartyId = gBattlerPartyIndexes[gBattlerTarget ^ BIT_FLANK];
}
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
@@ -7985,8 +7556,8 @@ static void atk8F_forcerandomswitch(void)
lastMonId = 6;
monsCount = 6;
minNeeded = 2;
- bank2PartyId = gBattlePartyID[gBankTarget];
- bank1PartyId = gBattlePartyID[gBankTarget ^ BIT_MON];
+ battler2PartyId = gBattlerPartyIndexes[gBattlerTarget];
+ battler1PartyId = gBattlerPartyIndexes[gBattlerTarget ^ BIT_FLANK];
}
else
{
@@ -7994,8 +7565,8 @@ static void atk8F_forcerandomswitch(void)
lastMonId = 6;
monsCount = 6;
minNeeded = 1;
- bank2PartyId = gBattlePartyID[gBankTarget]; // there is only one pokemon out in single battles
- bank1PartyId = gBattlePartyID[gBankTarget];
+ battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; // there is only one pokemon out in single battles
+ battler1PartyId = gBattlerPartyIndexes[gBattlerTarget];
}
for (i = firstMonId; i < lastMonId; i++)
@@ -8010,48 +7581,48 @@ static void atk8F_forcerandomswitch(void)
if (validMons <= minNeeded)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- if (sub_8051064())
+ if (TryDoForceSwitchOut())
{
do
{
i = Random() % monsCount;
i += firstMonId;
}
- while (i == bank2PartyId
- || i == bank1PartyId
+ while (i == battler2PartyId
+ || i == battler1PartyId
|| GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_NONE
|| GetMonData(&party[i], MON_DATA_IS_EGG) == TRUE
|| GetMonData(&party[i], MON_DATA_HP) == 0);
}
- *(gBattleStruct->monToSwitchIntoId + gBankTarget) = i;
+ *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = i;
if (!sub_81B1250())
- sub_803BDA0(gBankTarget);
+ sub_803BDA0(gBattlerTarget);
if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
|| (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)
|| (gBattleTypeFlags & BATTLE_TYPE_x2000000 && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
|| (gBattleTypeFlags & BATTLE_TYPE_x2000000 && gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
- sub_81B8E80(gBankTarget, i, 0);
- sub_81B8E80(gBankTarget ^ BIT_MON, i, 1);
+ sub_81B8E80(gBattlerTarget, i, 0);
+ sub_81B8E80(gBattlerTarget ^ BIT_FLANK, i, 1);
}
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
- sub_80571DC(gBankTarget, i);
+ sub_80571DC(gBattlerTarget, i);
}
}
else
{
- sub_8051064();
+ TryDoForceSwitchOut();
}
}
-static void atk90_conversion_type_change(void) // randomly changes user's type to one of its moves' type
+static void atk90_tryconversiontypechange(void) // randomly changes user's type to one of its moves' type
{
u8 validMoves = 0;
u8 moveChecked;
@@ -8059,7 +7630,7 @@ static void atk90_conversion_type_change(void) // randomly changes user's type t
while (validMoves < 4)
{
- if (gBattleMons[gBankAttacker].moves[validMoves] == 0)
+ if (gBattleMons[gBattlerAttacker].moves[validMoves] == 0)
break;
validMoves++;
@@ -8067,17 +7638,17 @@ static void atk90_conversion_type_change(void) // randomly changes user's type t
for (moveChecked = 0; moveChecked < validMoves; moveChecked++)
{
- moveType = gBattleMoves[gBattleMons[gBankAttacker].moves[moveChecked]].type;
+ moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type;
if (moveType == TYPE_MYSTERY)
{
- if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)
+ if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))
moveType = TYPE_GHOST;
else
moveType = TYPE_NORMAL;
}
- if (moveType != gBattleMons[gBankAttacker].type1
- && moveType != gBattleMons[gBankAttacker].type2)
+ if (moveType != gBattleMons[gBattlerAttacker].type1
+ && moveType != gBattleMons[gBattlerAttacker].type2)
{
break;
}
@@ -8085,7 +7656,7 @@ static void atk90_conversion_type_change(void) // randomly changes user's type t
if (moveChecked == validMoves)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -8094,22 +7665,20 @@ static void atk90_conversion_type_change(void) // randomly changes user's type t
while ((moveChecked = Random() & 3) >= validMoves);
- moveType = gBattleMoves[gBattleMons[gBankAttacker].moves[moveChecked]].type;
+ moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type;
if (moveType == TYPE_MYSTERY)
{
- if (gBattleMons[gBankAttacker].type1 == TYPE_GHOST || gBattleMons[gBankAttacker].type2 == TYPE_GHOST)
+ if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))
moveType = TYPE_GHOST;
else
moveType = TYPE_NORMAL;
}
}
- while (moveType == gBattleMons[gBankAttacker].type1 || moveType == gBattleMons[gBankAttacker].type2);
+ while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2);
- gBattleMons[gBankAttacker].type1 = moveType;
- gBattleMons[gBankAttacker].type2 = moveType;
-
- PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType)
+ SET_BATTLER_TYPE(gBattlerAttacker, moveType);
+ PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType);
gBattlescriptCurrInstr += 5;
}
@@ -8135,16 +7704,16 @@ static void atk91_givepaydaymoney(void)
static void atk92_setlightscreen(void)
{
- if (gSideAffecting[GET_BANK_SIDE(gBankAttacker)] & SIDE_STATUS_LIGHTSCREEN)
+ if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_LIGHTSCREEN)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
else
{
- gSideAffecting[GET_BANK_SIDE(gBankAttacker)] |= SIDE_STATUS_LIGHTSCREEN;
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].lightscreenTimer = 5;
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].lightscreenBank = gBankAttacker;
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenTimer = 5;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2)
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
@@ -8155,95 +7724,95 @@ static void atk92_setlightscreen(void)
gBattlescriptCurrInstr++;
}
-static void atk93_ko_move(void)
+static void atk93_tryKO(void)
{
u8 holdEffect, param;
- if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
+ if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY)
{
- holdEffect = gEnigmaBerries[gBankTarget].holdEffect;
- param = gEnigmaBerries[gBankTarget].holdEffectParam;
+ holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect;
+ param = gEnigmaBerries[gBattlerTarget].holdEffectParam;
}
else
{
- holdEffect = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
- param = ItemId_GetHoldEffectParam(gBattleMons[gBankTarget].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item);
+ param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item);
}
- gStringBank = gBankTarget;
+ gPotentialItemEffectBattler = gBattlerTarget;
if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)
{
- RecordItemEffectBattle(gBankTarget, HOLD_EFFECT_FOCUS_BAND);
- gSpecialStatuses[gBankTarget].focusBanded = 1;
+ RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_FOCUS_BAND);
+ gSpecialStatuses[gBattlerTarget].focusBanded = 1;
}
- if (gBattleMons[gBankTarget].ability == ABILITY_STURDY)
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_STURDY)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gLastUsedAbility = ABILITY_STURDY;
gBattlescriptCurrInstr = BattleScript_SturdyPreventsOHKO;
- RecordAbilityBattle(gBankTarget, ABILITY_STURDY);
+ RecordAbilityBattle(gBattlerTarget, ABILITY_STURDY);
}
else
{
u16 chance;
- if (!(gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS))
+ if (!(gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS))
{
- chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBankAttacker].level - gBattleMons[gBankTarget].level);
- if (Random() % 100 + 1 < chance && gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level)
+ chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level);
+ if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
chance = TRUE;
else
chance = FALSE;
}
- else if (gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker
- && gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level)
+ else if (gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker
+ && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
{
chance = TRUE;
}
else
{
- chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBankAttacker].level - gBattleMons[gBankTarget].level);
- if (Random() % 100 + 1 < chance && gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level)
+ chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level);
+ if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
chance = TRUE;
else
chance = FALSE;
}
if (chance)
{
- if (gProtectStructs[gBankTarget].endured)
+ if (gProtectStructs[gBattlerTarget].endured)
{
- gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
- gBattleMoveFlags |= MOVESTATUS_ENDURED;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;
+ gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED;
}
- else if (gSpecialStatuses[gBankTarget].focusBanded)
+ else if (gSpecialStatuses[gBattlerTarget].focusBanded)
{
- gBattleMoveDamage = gBattleMons[gBankTarget].hp - 1;
- gBattleMoveFlags |= MOVESTATUS_HUNGON;
- gLastUsedItem = gBattleMons[gBankTarget].item;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1;
+ gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON;
+ gLastUsedItem = gBattleMons[gBattlerTarget].item;
}
else
{
- gBattleMoveDamage = gBattleMons[gBankTarget].hp;
- gBattleMoveFlags |= MOVESTATUS_ONEHITKO;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp;
+ gMoveResultFlags |= MOVE_RESULT_ONE_HIT_KO;
}
gBattlescriptCurrInstr += 5;
}
else
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
- if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level)
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
+ if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
}
static void atk94_damagetohalftargethp(void) // super fang
{
- gBattleMoveDamage = gBattleMons[gBankTarget].hp / 2;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp / 2;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
@@ -8254,7 +7823,7 @@ static void atk95_setsandstorm(void)
{
if (gBattleWeather & WEATHER_SANDSTORM_ANY)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
}
else
@@ -8272,17 +7841,17 @@ static void atk96_weatherdamage(void)
{
if (gBattleWeather & WEATHER_SANDSTORM_ANY)
{
- if (gBattleMons[gBankAttacker].type1 != TYPE_ROCK
- && gBattleMons[gBankAttacker].type1 != TYPE_STEEL
- && gBattleMons[gBankAttacker].type1 != TYPE_GROUND
- && gBattleMons[gBankAttacker].type2 != TYPE_ROCK
- && gBattleMons[gBankAttacker].type2 != TYPE_STEEL
- && gBattleMons[gBankAttacker].type2 != TYPE_GROUND
- && gBattleMons[gBankAttacker].ability != ABILITY_SAND_VEIL
- && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND)
- && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER))
- {
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16;
+ if (gBattleMons[gBattlerAttacker].type1 != TYPE_ROCK
+ && gBattleMons[gBattlerAttacker].type1 != TYPE_STEEL
+ && gBattleMons[gBattlerAttacker].type1 != TYPE_GROUND
+ && gBattleMons[gBattlerAttacker].type2 != TYPE_ROCK
+ && gBattleMons[gBattlerAttacker].type2 != TYPE_STEEL
+ && gBattleMons[gBattlerAttacker].type2 != TYPE_GROUND
+ && gBattleMons[gBattlerAttacker].ability != ABILITY_SAND_VEIL
+ && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND)
+ && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER))
+ {
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
}
@@ -8293,12 +7862,11 @@ static void atk96_weatherdamage(void)
}
if (gBattleWeather & WEATHER_HAIL)
{
- if (gBattleMons[gBankAttacker].type1 != TYPE_ICE
- && gBattleMons[gBankAttacker].type2 != TYPE_ICE
- && !(gStatuses3[gBankAttacker] & STATUS3_UNDERGROUND)
- && !(gStatuses3[gBankAttacker] & STATUS3_UNDERWATER))
+ if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)
+ && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND)
+ && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER))
{
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
}
@@ -8313,27 +7881,27 @@ static void atk96_weatherdamage(void)
gBattleMoveDamage = 0;
}
- if (gAbsentBankFlags & gBitTable[gBankAttacker])
+ if (gAbsentBattlerFlags & gBitTable[gBattlerAttacker])
gBattleMoveDamage = 0;
gBattlescriptCurrInstr++;
}
-static void atk97_try_infatuation(void)
+static void atk97_tryinfatuating(void)
{
struct Pokemon *monAttacker, *monTarget;
u16 speciesAttacker, speciesTarget;
u32 personalityAttacker, personalityTarget;
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- monAttacker = &gPlayerParty[gBattlePartyID[gBankAttacker]];
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ monAttacker = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]];
else
- monAttacker = &gEnemyParty[gBattlePartyID[gBankAttacker]];
+ monAttacker = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]];
- if (GetBankSide(gBankTarget) == SIDE_PLAYER)
- monTarget = &gPlayerParty[gBattlePartyID[gBankTarget]];
+ if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
+ monTarget = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]];
else
- monTarget = &gEnemyParty[gBattlePartyID[gBankTarget]];
+ monTarget = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]];
speciesAttacker = GetMonData(monAttacker, MON_DATA_SPECIES);
personalityAttacker = GetMonData(monAttacker, MON_DATA_PERSONALITY);
@@ -8341,56 +7909,56 @@ static void atk97_try_infatuation(void)
speciesTarget = GetMonData(monTarget, MON_DATA_SPECIES);
personalityTarget = GetMonData(monTarget, MON_DATA_PERSONALITY);
- if (gBattleMons[gBankTarget].ability == ABILITY_OBLIVIOUS)
+ if (gBattleMons[gBattlerTarget].ability == ABILITY_OBLIVIOUS)
{
gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction;
gLastUsedAbility = ABILITY_OBLIVIOUS;
- RecordAbilityBattle(gBankTarget, ABILITY_OBLIVIOUS);
+ RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS);
}
else
{
if (GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget)
- || gBattleMons[gBankTarget].status2 & STATUS2_INFATUATION
+ || gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION
|| GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == MON_GENDERLESS
|| GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget) == MON_GENDERLESS)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gBattleMons[gBankTarget].status2 |= STATUS2_INFATUATED_WITH(gBankAttacker);
+ gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker);
gBattlescriptCurrInstr += 5;
}
}
}
-static void atk98_status_icon_update(void)
+static void atk98_updatestatusicon(void)
{
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
if (gBattlescriptCurrInstr[1] != BS_ATTACKER_WITH_PARTNER)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
- EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
+ BtlController_EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
else
{
- gActiveBank = gBankAttacker;
- if (!(gAbsentBankFlags & gBitTable[gActiveBank]))
+ gActiveBattler = gBattlerAttacker;
+ if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
{
- EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);
+ MarkBattlerForControllerExec(gActiveBattler);
}
if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_MON);
- if (!(gAbsentBankFlags & gBitTable[gActiveBank]))
+ gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);
+ if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
{
- EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitStatusIconUpdate(0, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
gBattlescriptCurrInstr += 2;
@@ -8399,31 +7967,31 @@ static void atk98_status_icon_update(void)
static void atk99_setmist(void)
{
- if (gSideTimers[GET_BANK_SIDE(gBankAttacker)].mistTimer)
+ if (gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer)
{
- gBattleMoveFlags |= MOVESTATUS_FAILED;
+ gMoveResultFlags |= MOVE_RESULT_FAILED;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
else
{
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].mistTimer = 5;
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].mistBank = gBankAttacker;
- gSideAffecting[GET_BANK_SIDE(gBankAttacker)] |= SIDE_STATUS_MIST;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer = 5;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistBattlerId = gBattlerAttacker;
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_MIST;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
gBattlescriptCurrInstr++;
}
-static void atk9A_set_focusenergy(void)
+static void atk9A_setfocusenergy(void)
{
- if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY)
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY)
{
- gBattleMoveFlags |= MOVESTATUS_FAILED;
+ gMoveResultFlags |= MOVE_RESULT_FAILED;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
else
{
- gBattleMons[gBankAttacker].status2 |= STATUS2_FOCUS_ENERGY;
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
gBattlescriptCurrInstr++;
@@ -8431,12 +7999,12 @@ static void atk9A_set_focusenergy(void)
static void atk9B_transformdataexecution(void)
{
- gLastUsedMove = 0xFFFF;
+ gChosenMove = 0xFFFF;
gBattlescriptCurrInstr++;
- if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED
- || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED
+ || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)
{
- gBattleMoveFlags |= MOVESTATUS_FAILED;
+ gMoveResultFlags |= MOVE_RESULT_FAILED;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
else
@@ -8444,55 +8012,55 @@ static void atk9B_transformdataexecution(void)
s32 i;
u8 *battleMonAttacker, *battleMonTarget;
- gBattleMons[gBankAttacker].status2 |= STATUS2_TRANSFORMED;
- gDisableStructs[gBankAttacker].disabledMove = 0;
- gDisableStructs[gBankAttacker].disableTimer1 = 0;
- gDisableStructs[gBankAttacker].transformedMonPersonality = gBattleMons[gBankTarget].personality;
- gDisableStructs[gBankAttacker].unk18_b = 0;
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_TRANSFORMED;
+ gDisableStructs[gBattlerAttacker].disabledMove = 0;
+ gDisableStructs[gBattlerAttacker].disableTimer1 = 0;
+ gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality;
+ gDisableStructs[gBattlerAttacker].unk18_b = 0;
- PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBankTarget].species)
+ PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species)
- battleMonAttacker = (u8*)(&gBattleMons[gBankAttacker]);
- battleMonTarget = (u8*)(&gBattleMons[gBankTarget]);
+ battleMonAttacker = (u8*)(&gBattleMons[gBattlerAttacker]);
+ battleMonTarget = (u8*)(&gBattleMons[gBattlerTarget]);
for (i = 0; i < offsetof(struct BattlePokemon, pp); i++)
battleMonAttacker[i] = battleMonTarget[i];
for (i = 0; i < 4; i++)
{
- if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].pp < 5)
- gBattleMons[gBankAttacker].pp[i] = gBattleMoves[gBattleMons[gBankAttacker].moves[i]].pp;
+ if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp < 5)
+ gBattleMons[gBattlerAttacker].pp[i] = gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp;
else
- gBattleMons[gBankAttacker].pp[i] = 5;
+ gBattleMons[gBattlerAttacker].pp[i] = 5;
}
- gActiveBank = gBankAttacker;
- EmitResetActionMoveSelection(0, RESET_MOVE_SELECTION);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitResetActionMoveSelection(0, RESET_MOVE_SELECTION);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
}
-static void atk9C_set_substitute(void)
+static void atk9C_setsubstitute(void)
{
- u32 hp = gBattleMons[gBankAttacker].maxHP / 4;
- if (gBattleMons[gBankAttacker].maxHP / 4 == 0)
+ u32 hp = gBattleMons[gBattlerAttacker].maxHP / 4;
+ if (gBattleMons[gBattlerAttacker].maxHP / 4 == 0)
hp = 1;
- if (gBattleMons[gBankAttacker].hp <= hp)
+ if (gBattleMons[gBattlerAttacker].hp <= hp)
{
gBattleMoveDamage = 0;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
else
{
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4; // one bit value will only work for pokemon which max hp can go to 1020(which is more than possible in games)
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; // one bit value will only work for pokemon which max hp can go to 1020(which is more than possible in games)
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- gBattleMons[gBankAttacker].status2 |= STATUS2_SUBSTITUTE;
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED);
- gDisableStructs[gBankAttacker].substituteHP = gBattleMoveDamage;
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE;
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_WRAPPED);
+ gDisableStructs[gBattlerAttacker].substituteHP = gBattleMoveDamage;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE;
}
@@ -8511,14 +8079,14 @@ static bool8 IsMoveUncopyableByMimic(u16 move)
static void atk9D_mimicattackcopy(void)
{
- gLastUsedMove = 0xFFFF;
+ gChosenMove = 0xFFFF;
- if (IsMoveUncopyableByMimic(gLastUsedMovesByBanks[gBankTarget])
- || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED
- || gLastUsedMovesByBanks[gBankTarget] == 0
- || gLastUsedMovesByBanks[gBankTarget] == 0xFFFF)
+ if (IsMoveUncopyableByMimic(gLastMoves[gBattlerTarget])
+ || gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED
+ || gLastMoves[gBattlerTarget] == 0
+ || gLastMoves[gBattlerTarget] == 0xFFFF)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -8526,27 +8094,27 @@ static void atk9D_mimicattackcopy(void)
for (i = 0; i < 4; i++)
{
- if (gBattleMons[gBankAttacker].moves[i] == gLastUsedMovesByBanks[gBankTarget])
+ if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget])
break;
}
if (i == 4)
{
- gBattleMons[gBankAttacker].moves[gCurrMovePos] = gLastUsedMovesByBanks[gBankTarget];
- if (gBattleMoves[gLastUsedMovesByBanks[gBankTarget]].pp < 5)
- gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gLastUsedMovesByBanks[gBankTarget]].pp;
+ gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget];
+ if (gBattleMoves[gLastMoves[gBattlerTarget]].pp < 5)
+ gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastMoves[gBattlerTarget]].pp;
else
- gBattleMons[gBankAttacker].pp[gCurrMovePos] = 5;
+ gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5;
- PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastUsedMovesByBanks[gBankTarget])
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget])
- gDisableStructs[gBankAttacker].unk18_b |= gBitTable[gCurrMovePos];
+ gDisableStructs[gBattlerAttacker].unk18_b |= gBitTable[gCurrMovePos];
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
}
@@ -8558,7 +8126,7 @@ static void atk9E_metronome(void)
s32 i;
gCurrentMove = (Random() & 0x1FF) + 1;
- if (gCurrentMove > LAST_MOVE_INDEX)
+ if (gCurrentMove >= MOVES_COUNT)
continue;
for (i = 0; i < 4; i++); // ?
@@ -8577,7 +8145,7 @@ static void atk9E_metronome(void)
{
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
- gBankTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
return;
}
}
@@ -8585,7 +8153,7 @@ static void atk9E_metronome(void)
static void atk9F_dmgtolevel(void)
{
- gBattleMoveDamage = gBattleMons[gBankAttacker].level;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].level;
gBattlescriptCurrInstr++;
}
@@ -8596,55 +8164,55 @@ static void atkA0_psywavedamageeffect(void)
while ((randDamage = (Random() & 0xF)) > 10);
randDamage *= 10;
- gBattleMoveDamage = gBattleMons[gBankAttacker].level * (randDamage + 50) / 100;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].level * (randDamage + 50) / 100;
gBattlescriptCurrInstr++;
}
static void atkA1_counterdamagecalculator(void)
{
- u8 sideAttacker = GetBankSide(gBankAttacker);
- u8 sideTarget = GetBankSide(gProtectStructs[gBankAttacker].physicalBank);
+ u8 sideAttacker = GetBattlerSide(gBattlerAttacker);
+ u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId);
- if (gProtectStructs[gBankAttacker].physicalDmg
+ if (gProtectStructs[gBattlerAttacker].physicalDmg
&& sideAttacker != sideTarget
- && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp)
+ && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp)
{
- gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2;
+ gBattleMoveDamage = gProtectStructs[gBattlerAttacker].physicalDmg * 2;
if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp)
- gBankTarget = gSideTimers[sideTarget].followmeTarget;
+ gBattlerTarget = gSideTimers[sideTarget].followmeTarget;
else
- gBankTarget = gProtectStructs[gBankAttacker].physicalBank;
+ gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId;
gBattlescriptCurrInstr += 5;
}
else
{
- gSpecialStatuses[gBankAttacker].flag20 = 1;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gSpecialStatuses[gBattlerAttacker].flag20 = 1;
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
static void atkA2_mirrorcoatdamagecalculator(void) // a copy of atkA1 with the physical -> special field changes
{
- u8 sideAttacker = GetBankSide(gBankAttacker);
- u8 sideTarget = GetBankSide(gProtectStructs[gBankAttacker].specialBank);
+ u8 sideAttacker = GetBattlerSide(gBattlerAttacker);
+ u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId);
- if (gProtectStructs[gBankAttacker].specialDmg && sideAttacker != sideTarget && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp)
+ if (gProtectStructs[gBattlerAttacker].specialDmg && sideAttacker != sideTarget && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp)
{
- gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2;
+ gBattleMoveDamage = gProtectStructs[gBattlerAttacker].specialDmg * 2;
if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp)
- gBankTarget = gSideTimers[sideTarget].followmeTarget;
+ gBattlerTarget = gSideTimers[sideTarget].followmeTarget;
else
- gBankTarget = gProtectStructs[gBankAttacker].specialBank;
+ gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId;
gBattlescriptCurrInstr += 5;
}
else
{
- gSpecialStatuses[gBankAttacker].flag20 = 1;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gSpecialStatuses[gBattlerAttacker].flag20 = 1;
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -8654,63 +8222,63 @@ static void atkA3_disablelastusedattack(void)
for (i = 0; i < 4; i++)
{
- if (gBattleMons[gBankTarget].moves[i] == gLastUsedMovesByBanks[gBankTarget])
+ if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
break;
}
- if (gDisableStructs[gBankTarget].disabledMove == 0
- && i != 4 && gBattleMons[gBankTarget].pp[i] != 0)
+ if (gDisableStructs[gBattlerTarget].disabledMove == 0
+ && i != 4 && gBattleMons[gBattlerTarget].pp[i] != 0)
{
- PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBankTarget].moves[i])
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i])
- gDisableStructs[gBankTarget].disabledMove = gBattleMons[gBankTarget].moves[i];
- gDisableStructs[gBankTarget].disableTimer1 = (Random() & 3) + 2;
- gDisableStructs[gBankTarget].disableTimer2 = gDisableStructs[gBankTarget].disableTimer1; // used to save the random amount of turns?
+ gDisableStructs[gBattlerTarget].disabledMove = gBattleMons[gBattlerTarget].moves[i];
+ gDisableStructs[gBattlerTarget].disableTimer1 = (Random() & 3) + 2;
+ gDisableStructs[gBattlerTarget].disableTimer2 = gDisableStructs[gBattlerTarget].disableTimer1; // used to save the random amount of turns?
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkA4_setencore(void)
+static void atkA4_trysetencore(void)
{
s32 i;
for (i = 0; i < 4; i++)
{
- if (gBattleMons[gBankTarget].moves[i] == gLastUsedMovesByBanks[gBankTarget])
+ if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
break;
}
- if (gLastUsedMovesByBanks[gBankTarget] == MOVE_STRUGGLE
- || gLastUsedMovesByBanks[gBankTarget] == MOVE_ENCORE
- || gLastUsedMovesByBanks[gBankTarget] == MOVE_MIRROR_MOVE)
+ if (gLastMoves[gBattlerTarget] == MOVE_STRUGGLE
+ || gLastMoves[gBattlerTarget] == MOVE_ENCORE
+ || gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE)
{
i = 4;
}
- if (gDisableStructs[gBankTarget].encoredMove == 0
- && i != 4 && gBattleMons[gBankTarget].pp[i] != 0)
+ if (gDisableStructs[gBattlerTarget].encoredMove == 0
+ && i != 4 && gBattleMons[gBattlerTarget].pp[i] != 0)
{
- gDisableStructs[gBankTarget].encoredMove = gBattleMons[gBankTarget].moves[i];
- gDisableStructs[gBankTarget].encoredMovePos = i;
- gDisableStructs[gBankTarget].encoreTimer1 = (Random() & 3) + 3;
- gDisableStructs[gBankTarget].encoreTimer2 = gDisableStructs[gBankTarget].encoreTimer1;
+ gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i];
+ gDisableStructs[gBattlerTarget].encoredMovePos = i;
+ gDisableStructs[gBattlerTarget].encoreTimer1 = (Random() & 3) + 3;
+ gDisableStructs[gBattlerTarget].encoreTimer2 = gDisableStructs[gBattlerTarget].encoreTimer1;
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
static void atkA5_painsplitdmgcalc(void)
{
- if (!(gBattleMons[gBankTarget].status2 & STATUS2_SUBSTITUTE))
+ if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE))
{
- s32 hpDiff = (gBattleMons[gBankAttacker].hp + gBattleMons[gBankTarget].hp) / 2;
- s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBankTarget].hp - hpDiff;
+ s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + gBattleMons[gBattlerTarget].hp) / 2;
+ s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - hpDiff;
u8* storeLoc = (void*)(&gBattleScripting.painSplitHp);
storeLoc[0] = (painSplitHp);
@@ -8718,28 +8286,28 @@ static void atkA5_painsplitdmgcalc(void)
storeLoc[2] = (painSplitHp & 0x00FF0000) >> 16;
storeLoc[3] = (painSplitHp & 0xFF000000) >> 24;
- gBattleMoveDamage = gBattleMons[gBankAttacker].hp - hpDiff;
- gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp - hpDiff;
+ gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF;
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
static void atkA6_settypetorandomresistance(void) // conversion 2
{
- if (gUnknown_02024250[gBankAttacker] == 0
- || gUnknown_02024250[gBankAttacker] == 0xFFFF)
+ if (gLastLandedMoves[gBattlerAttacker] == 0
+ || gLastLandedMoves[gBattlerAttacker] == 0xFFFF)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
- else if (IsTwoTurnsMove(gUnknown_02024250[gBankAttacker])
- && gBattleMons[gUnknown_02024270[gBankAttacker]].status2 & STATUS2_MULTIPLETURNS)
+ else if (IsTwoTurnsMove(gLastLandedMoves[gBattlerAttacker])
+ && gBattleMons[gLastHitBy[gBattlerAttacker]].status2 & STATUS2_MULTIPLETURNS)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -8751,15 +8319,12 @@ static void atkA6_settypetorandomresistance(void) // conversion 2
i *= 3;
- if (TYPE_EFFECT_ATK_TYPE(i) == gUnknown_02024258[gBankAttacker]
+ if (TYPE_EFFECT_ATK_TYPE(i) == gLastHitByType[gBattlerAttacker]
&& TYPE_EFFECT_MULTIPLIER(i) <= TYPE_MUL_NOT_EFFECTIVE
- && gBattleMons[gBankAttacker].type1 != TYPE_EFFECT_DEF_TYPE(i)
- && gBattleMons[gBankAttacker].type2 != TYPE_EFFECT_DEF_TYPE(i))
+ && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i)))
{
- gBattleMons[gBankAttacker].type1 = TYPE_EFFECT_DEF_TYPE(i);
- gBattleMons[gBankAttacker].type2 = TYPE_EFFECT_DEF_TYPE(i);
-
- PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(i))
+ SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i));
+ PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(i));
gBattlescriptCurrInstr += 5;
return;
@@ -8774,14 +8339,11 @@ static void atkA6_settypetorandomresistance(void) // conversion 2
case TYPE_FORESIGHT:
break;
default:
- if (TYPE_EFFECT_ATK_TYPE(j) == gUnknown_02024258[gBankAttacker]
- && TYPE_EFFECT_MULTIPLIER(j) <= 5
- && gBattleMons[gBankAttacker].type1 != TYPE_EFFECT_DEF_TYPE(i)
- && gBattleMons[gBankAttacker].type2 != TYPE_EFFECT_DEF_TYPE(i))
+ if (TYPE_EFFECT_ATK_TYPE(j) == gLastHitByType[gBattlerAttacker]
+ && TYPE_EFFECT_MULTIPLIER(j) <= 5
+ && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i)))
{
- gBattleMons[gBankAttacker].type1 = TYPE_EFFECT_DEF_TYPE(rands);
- gBattleMons[gBankAttacker].type2 = TYPE_EFFECT_DEF_TYPE(rands);
-
+ SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(rands));
PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(rands))
gBattlescriptCurrInstr += 5;
@@ -8791,68 +8353,68 @@ static void atkA6_settypetorandomresistance(void) // conversion 2
}
}
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
static void atkA7_setalwayshitflag(void)
{
- gStatuses3[gBankTarget] &= ~(STATUS3_ALWAYS_HITS);
- gStatuses3[gBankTarget] |= 0x10;
- gDisableStructs[gBankTarget].bankWithSureHit = gBankAttacker;
+ gStatuses3[gBattlerTarget] &= ~(STATUS3_ALWAYS_HITS);
+ gStatuses3[gBattlerTarget] |= 0x10;
+ gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker;
gBattlescriptCurrInstr++;
}
static void atkA8_copymovepermanently(void) // sketch
{
- gLastUsedMove = 0xFFFF;
+ gChosenMove = 0xFFFF;
- if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED)
- && gUnknownMovesUsedByBanks[gBankTarget] != MOVE_STRUGGLE
- && gUnknownMovesUsedByBanks[gBankTarget] != 0
- && gUnknownMovesUsedByBanks[gBankTarget] != 0xFFFF
- && gUnknownMovesUsedByBanks[gBankTarget] != MOVE_SKETCH)
+ if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED)
+ && gLastPrintedMoves[gBattlerTarget] != MOVE_STRUGGLE
+ && gLastPrintedMoves[gBattlerTarget] != 0
+ && gLastPrintedMoves[gBattlerTarget] != 0xFFFF
+ && gLastPrintedMoves[gBattlerTarget] != MOVE_SKETCH)
{
s32 i;
for (i = 0; i < 4; i++)
{
- if (gBattleMons[gBankAttacker].moves[i] == MOVE_SKETCH)
+ if (gBattleMons[gBattlerAttacker].moves[i] == MOVE_SKETCH)
continue;
- if (gBattleMons[gBankAttacker].moves[i] == gUnknownMovesUsedByBanks[gBankTarget])
+ if (gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget])
break;
}
if (i != 4)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else // sketch worked
{
struct MovePpInfo movePpData;
- gBattleMons[gBankAttacker].moves[gCurrMovePos] = gUnknownMovesUsedByBanks[gBankTarget];
- gBattleMons[gBankAttacker].pp[gCurrMovePos] = gBattleMoves[gUnknownMovesUsedByBanks[gBankTarget]].pp;
- gActiveBank = gBankAttacker;
+ gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastPrintedMoves[gBattlerTarget];
+ gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastPrintedMoves[gBattlerTarget]].pp;
+ gActiveBattler = gBattlerAttacker;
for (i = 0; i < 4; i++)
{
- movePpData.moves[i] = gBattleMons[gBankAttacker].moves[i];
- movePpData.pp[i] = gBattleMons[gBankAttacker].pp[i];
+ movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i];
+ movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i];
}
- movePpData.ppBonuses = gBattleMons[gBankAttacker].ppBonuses;
+ movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses;
- EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct MovePpInfo), &movePpData);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct MovePpInfo), &movePpData);
+ MarkBattlerForControllerExec(gActiveBattler);
- PREPARE_MOVE_BUFFER(gBattleTextBuff1, gUnknownMovesUsedByBanks[gBankTarget])
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget])
gBattlescriptCurrInstr += 5;
}
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -8862,7 +8424,7 @@ static bool8 IsTwoTurnsMove(u16 move)
|| gBattleMoves[move].effect == EFFECT_RAZOR_WIND
|| gBattleMoves[move].effect == EFFECT_SKY_ATTACK
|| gBattleMoves[move].effect == EFFECT_SOLARBEAM
- || gBattleMoves[move].effect == EFFECT_FLY
+ || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE
|| gBattleMoves[move].effect == EFFECT_BIDE)
return TRUE;
else
@@ -8878,7 +8440,7 @@ static bool8 IsInvalidForSleepTalkOrAssist(u16 move)
return FALSE;
}
-static u8 AttacksThisTurn(u8 bank, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2
+static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2
{
// first argument is unused
if (gBattleMoves[move].effect == EFFECT_SOLARBEAM
@@ -8889,7 +8451,7 @@ static u8 AttacksThisTurn(u8 bank, u16 move) // Note: returns 1 if it's a chargi
|| gBattleMoves[move].effect == EFFECT_RAZOR_WIND
|| gBattleMoves[move].effect == EFFECT_SKY_ATTACK
|| gBattleMoves[move].effect == EFFECT_SOLARBEAM
- || gBattleMoves[move].effect == EFFECT_FLY
+ || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE
|| gBattleMoves[move].effect == EFFECT_BIDE)
{
if ((gHitMarker & HITMARKER_x8000000))
@@ -8898,24 +8460,24 @@ static u8 AttacksThisTurn(u8 bank, u16 move) // Note: returns 1 if it's a chargi
return 2;
}
-static void atkA9_sleeptalk_choose_move(void)
+static void atkA9_trychoosesleeptalkmove(void)
{
s32 i;
u8 unusableMovesBits = 0;
for (i = 0; i < 4; i++)
{
- if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBankAttacker].moves[i])
- || gBattleMons[gBankAttacker].moves[i] == MOVE_FOCUS_PUNCH
- || gBattleMons[gBankAttacker].moves[i] == MOVE_UPROAR
- || IsTwoTurnsMove(gBattleMons[gBankAttacker].moves[i]))
+ if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBattlerAttacker].moves[i])
+ || gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH
+ || gBattleMons[gBattlerAttacker].moves[i] == MOVE_UPROAR
+ || IsTwoTurnsMove(gBattleMons[gBattlerAttacker].moves[i]))
{
unusableMovesBits |= gBitTable[i];
}
}
- unusableMovesBits = CheckMoveLimitations(gBankAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP));
+ unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP));
if (unusableMovesBits == 0xF) // all 4 moves cannot be chosen
{
gBattlescriptCurrInstr += 5;
@@ -8929,25 +8491,25 @@ static void atkA9_sleeptalk_choose_move(void)
movePosition = Random() & 3;
} while ((gBitTable[movePosition] & unusableMovesBits));
- gRandomMove = gBattleMons[gBankAttacker].moves[movePosition];
+ gRandomMove = gBattleMons[gBattlerAttacker].moves[movePosition];
gCurrMovePos = movePosition;
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
- gBankTarget = GetMoveTarget(gRandomMove, 0);
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlerTarget = GetMoveTarget(gRandomMove, 0);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkAA_set_destinybond(void)
+static void atkAA_setdestinybond(void)
{
- gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND;
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_DESTINY_BOND;
gBattlescriptCurrInstr++;
}
-static void DestinyBondFlagUpdate(void)
+static void TrySetDestinyBondToHappen(void)
{
- u8 sideAttacker = GetBankSide(gBankAttacker);
- u8 sideTarget = GetBankSide(gBankTarget);
- if (gBattleMons[gBankTarget].status2 & STATUS2_DESTINY_BOND
+ u8 sideAttacker = GetBattlerSide(gBattlerAttacker);
+ u8 sideTarget = GetBattlerSide(gBattlerTarget);
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_DESTINY_BOND
&& sideAttacker != sideTarget
&& !(gHitMarker & HITMARKER_GRUDGE))
{
@@ -8955,16 +8517,16 @@ static void DestinyBondFlagUpdate(void)
}
}
-static void atkAB_DestinyBondFlagUpdate(void)
+static void atkAB_trysetdestinybondtohappen(void)
{
- DestinyBondFlagUpdate();
+ TrySetDestinyBondToHappen();
gBattlescriptCurrInstr++;
}
static void atkAC_remaininghptopower(void)
{
s32 i;
- s32 hpFraction = GetScaledHPFraction(gBattleMons[gBankAttacker].hp, gBattleMons[gBankAttacker].maxHP, 48);
+ s32 hpFraction = GetScaledHPFraction(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerAttacker].maxHP, 48);
for (i = 0; i < (s32) sizeof(sFlailHpScaleToPowerTable); i += 2)
{
@@ -8976,103 +8538,103 @@ static void atkAC_remaininghptopower(void)
gBattlescriptCurrInstr++;
}
-static void atkAD_spite_ppreduce(void)
+static void atkAD_tryspiteppreduce(void)
{
- if (gLastUsedMovesByBanks[gBankTarget] != 0
- && gLastUsedMovesByBanks[gBankTarget] != 0xFFFF)
+ if (gLastMoves[gBattlerTarget] != 0
+ && gLastMoves[gBattlerTarget] != 0xFFFF)
{
s32 i;
for (i = 0; i < 4; i++)
{
- if (gLastUsedMovesByBanks[gBankTarget] == gBattleMons[gBankTarget].moves[i])
+ if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i])
break;
}
- if (i != 4 && gBattleMons[gBankTarget].pp[i] > 1)
+ if (i != 4 && gBattleMons[gBattlerTarget].pp[i] > 1)
{
s32 ppToDeduct = (Random() & 3) + 2;
- if (gBattleMons[gBankTarget].pp[i] < ppToDeduct)
- ppToDeduct = gBattleMons[gBankTarget].pp[i];
+ if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct)
+ ppToDeduct = gBattleMons[gBattlerTarget].pp[i];
- PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastUsedMovesByBanks[gBankTarget])
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget])
ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, 0, 1);
PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct)
- gBattleMons[gBankTarget].pp[i] -= ppToDeduct;
- gActiveBank = gBankTarget;
+ gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct;
+ gActiveBattler = gBattlerTarget;
- if (!(gDisableStructs[gActiveBank].unk18_b & gBitTable[i])
- && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED))
+ if (!(gDisableStructs[gActiveBattler].unk18_b & gBitTable[i])
+ && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
{
- EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]);
+ MarkBattlerForControllerExec(gActiveBattler);
}
gBattlescriptCurrInstr += 5;
- if (gBattleMons[gBankTarget].pp[i] == 0)
- CancelMultiTurnMoves(gBankTarget);
+ if (gBattleMons[gBattlerTarget].pp[i] == 0)
+ CancelMultiTurnMoves(gBattlerTarget);
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkAE_heal_party_status(void)
+static void atkAE_healpartystatus(void)
{
u32 zero = 0;
u8 toHeal = 0;
if (gCurrentMove == MOVE_HEAL_BELL)
{
- struct Pokemon* party;
+ struct Pokemon *party;
s32 i;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
- if (gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF)
+ if (gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF)
{
- gBattleMons[gBankAttacker].status1 = 0;
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 = 0;
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
}
else
{
- RecordAbilityBattle(gBankAttacker, gBattleMons[gBankAttacker].ability);
+ RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability);
gBattleCommunication[MULTISTRING_CHOOSER] |= 1;
}
- gActiveBank = gBattleScripting.bank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_MON);
+ gActiveBattler = gBattleScripting.battler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && !(gAbsentBankFlags & gBitTable[gActiveBank]))
+ && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
{
- if (gBattleMons[gActiveBank].ability != ABILITY_SOUNDPROOF)
+ if (gBattleMons[gActiveBattler].ability != ABILITY_SOUNDPROOF)
{
- gBattleMons[gActiveBank].status1 = 0;
- gBattleMons[gActiveBank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gActiveBattler].status1 = 0;
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_NIGHTMARE);
}
else
{
- RecordAbilityBattle(gActiveBank, gBattleMons[gActiveBank].ability);
+ RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
gBattleCommunication[MULTISTRING_CHOOSER] |= 2;
}
}
- for (i = 0; i < 6; i++)
+ for (i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&party[i], MON_DATA_SPECIES2);
u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY);
@@ -9081,12 +8643,12 @@ static void atkAE_heal_party_status(void)
{
u8 ability;
- if (gBattlePartyID[gBankAttacker] == i)
- ability = gBattleMons[gBankAttacker].ability;
+ if (gBattlerPartyIndexes[gBattlerAttacker] == i)
+ ability = gBattleMons[gBattlerAttacker].ability;
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && gBattlePartyID[gActiveBank] == i
- && !(gAbsentBankFlags & gBitTable[gActiveBank]))
- ability = gBattleMons[gActiveBank].ability;
+ && gBattlerPartyIndexes[gActiveBattler] == i
+ && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
+ ability = gBattleMons[gActiveBattler].ability;
else
ability = GetAbilityBySpecies(species, abilityBit);
@@ -9100,24 +8662,24 @@ static void atkAE_heal_party_status(void)
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
toHeal = 0x3F;
- gBattleMons[gBankAttacker].status1 = 0;
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 = 0;
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
- gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2);
+ gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && !(gAbsentBankFlags & gBitTable[gActiveBank]))
+ && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
{
- gBattleMons[gActiveBank].status1 = 0;
- gBattleMons[gActiveBank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gActiveBattler].status1 = 0;
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_NIGHTMARE);
}
}
if (toHeal)
{
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, toHeal, 4, &zero);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, toHeal, 4, &zero);
+ MarkBattlerForControllerExec(gActiveBattler);
}
gBattlescriptCurrInstr++;
@@ -9125,14 +8687,14 @@ static void atkAE_heal_party_status(void)
static void atkAF_cursetarget(void)
{
- if (gBattleMons[gBankTarget].status2 & STATUS2_CURSED)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_CURSED)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gBattleMons[gBankTarget].status2 |= STATUS2_CURSED;
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2;
+ gBattleMons[gBattlerTarget].status2 |= STATUS2_CURSED;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
@@ -9140,35 +8702,35 @@ static void atkAF_cursetarget(void)
}
}
-static void atkB0_set_spikes(void)
+static void atkB0_trysetspikes(void)
{
- u8 targetSide = GetBankSide(gBankAttacker) ^ BIT_SIDE;
+ u8 targetSide = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;
if (gSideTimers[targetSide].spikesAmount == 3)
{
- gSpecialStatuses[gBankAttacker].flag20 = 1;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gSpecialStatuses[gBattlerAttacker].flag20 = 1;
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gSideAffecting[targetSide] |= SIDE_STATUS_SPIKES;
+ gSideStatuses[targetSide] |= SIDE_STATUS_SPIKES;
gSideTimers[targetSide].spikesAmount++;
gBattlescriptCurrInstr += 5;
}
}
-static void atkB1_set_foresight(void)
+static void atkB1_setforesight(void)
{
- gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT;
+ gBattleMons[gBattlerTarget].status2 |= STATUS2_FORESIGHT;
gBattlescriptCurrInstr++;
}
-static void atkB2_setperishsong(void)
+static void atkB2_trysetperishsong(void)
{
s32 i;
s32 notAffectedCount = 0;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gStatuses3[i] & STATUS3_PERISH_SONG
|| gBattleMons[i].ability == ABILITY_SOUNDPROOF)
@@ -9183,43 +8745,43 @@ static void atkB2_setperishsong(void)
}
}
- PressurePPLoseOnUsingPerishSong(gBankAttacker);
+ PressurePPLoseOnUsingPerishSong(gBattlerAttacker);
- if (notAffectedCount == gNoOfAllBanks)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ if (notAffectedCount == gBattlersCount)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
}
static void atkB3_rolloutdamagecalculation(void)
{
- if (gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
{
- CancelMultiTurnMoves(gBankAttacker);
- gBattlescriptCurrInstr = BattleScript_PauseEffectivenessSoundResultMsgEndMove;
+ CancelMultiTurnMoves(gBattlerAttacker);
+ gBattlescriptCurrInstr = BattleScript_MoveMissedPause;
}
else
{
s32 i;
- if (!(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)) // first hit
+ if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // first hit
{
- gDisableStructs[gBankAttacker].rolloutCounter1 = 5;
- gDisableStructs[gBankAttacker].rolloutCounter2 = 5;
- gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMoves[gBankAttacker] = gCurrentMove;
+ gDisableStructs[gBattlerAttacker].rolloutCounter1 = 5;
+ gDisableStructs[gBattlerAttacker].rolloutCounter2 = 5;
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS;
+ gLockedMoves[gBattlerAttacker] = gCurrentMove;
}
- if (--gDisableStructs[gBankAttacker].rolloutCounter1 == 0) // last hit
+ if (--gDisableStructs[gBattlerAttacker].rolloutCounter1 == 0) // last hit
{
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
}
gDynamicBasePower = gBattleMoves[gCurrentMove].power;
- for (i = 1; i < (5 - gDisableStructs[gBankAttacker].rolloutCounter1); i++)
+ for (i = 1; i < (5 - gDisableStructs[gBattlerAttacker].rolloutCounter1); i++)
gDynamicBasePower *= 2;
- if (gBattleMons[gBankAttacker].status2 & STATUS2_DEFENSE_CURL)
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_DEFENSE_CURL)
gDynamicBasePower *= 2;
gBattlescriptCurrInstr++;
@@ -9228,30 +8790,30 @@ static void atkB3_rolloutdamagecalculation(void)
static void atkB4_jumpifconfusedandstatmaxed(void)
{
- if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION
- && gBattleMons[gBankTarget].statStages[gBattlescriptCurrInstr[1]] == 0xC)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_CONFUSION
+ && gBattleMons[gBattlerTarget].statStages[gBattlescriptCurrInstr[1]] == 0xC)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
static void atkB5_furycuttercalc(void)
{
- if (gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
{
- gDisableStructs[gBankAttacker].furyCutterCounter = 0;
- gBattlescriptCurrInstr = BattleScript_PauseEffectivenessSoundResultMsgEndMove;
+ gDisableStructs[gBattlerAttacker].furyCutterCounter = 0;
+ gBattlescriptCurrInstr = BattleScript_MoveMissedPause;
}
else
{
s32 i;
- if (gDisableStructs[gBankAttacker].furyCutterCounter != 5)
- gDisableStructs[gBankAttacker].furyCutterCounter++;
+ if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5)
+ gDisableStructs[gBattlerAttacker].furyCutterCounter++;
gDynamicBasePower = gBattleMoves[gCurrentMove].power;
- for (i = 1; i < gDisableStructs[gBankAttacker].furyCutterCounter; i++)
+ for (i = 1; i < gDisableStructs[gBattlerAttacker].furyCutterCounter; i++)
gDynamicBasePower *= 2;
gBattlescriptCurrInstr++;
@@ -9261,9 +8823,9 @@ static void atkB5_furycuttercalc(void)
static void atkB6_happinesstodamagecalculation(void)
{
if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN)
- gDynamicBasePower = 10 * (gBattleMons[gBankAttacker].friendship) / 25;
+ gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25;
else // EFFECT_FRUSTRATION
- gDynamicBasePower = 10 * (255 - gBattleMons[gBankAttacker].friendship) / 25;
+ gDynamicBasePower = 10 * (255 - gBattleMons[gBattlerAttacker].friendship) / 25;
gBattlescriptCurrInstr++;
}
@@ -9280,34 +8842,34 @@ static void atkB7_presentdamagecalculation(void)
gDynamicBasePower = 120;
else
{
- gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 4;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
}
if (rand < 204)
- gBattlescriptCurrInstr = BattleScript_PresentDamageTarget;
- else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp)
+ gBattlescriptCurrInstr = BattleScript_HitFromCritCalc;
+ else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp)
gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp;
else
{
- gBattleMoveFlags &= ~(MOVESTATUS_NOTAFFECTED);
+ gMoveResultFlags &= ~(MOVE_RESULT_DOESNT_AFFECT_FOE);
gBattlescriptCurrInstr = BattleScript_PresentHealTarget;
}
}
-static void atkB8_set_safeguard(void)
+static void atkB8_setsafeguard(void)
{
- if (gSideAffecting[GET_BANK_SIDE(gBankAttacker)] & SIDE_STATUS_SAFEGUARD)
+ if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
else
{
- gSideAffecting[GET_BANK_SIDE(gBankAttacker)] |= SIDE_STATUS_SAFEGUARD;
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].safeguardTimer = 5;
- gSideTimers[GET_BANK_SIDE(gBankAttacker)].safeguardBank = gBankAttacker;
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardTimer = 5;
+ gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardBattlerId = gBattlerAttacker;
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
@@ -9357,11 +8919,11 @@ static void atkB9_magnitudedamagecalculation(void)
PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude)
- for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++)
+ for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
- if (gBankTarget == gBankAttacker)
+ if (gBattlerTarget == gBattlerAttacker)
continue;
- if (!(gAbsentBankFlags & gBitTable[gBankTarget])) // a valid target was found
+ if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // a valid target was found
break;
}
@@ -9372,43 +8934,43 @@ static void atkBA_jumpifnopursuitswitchdmg(void)
{
if (gMultiHitCounter == 1)
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
else
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
}
else
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
else
- gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
}
- if (gActionForBanks[gBankTarget] == 0
- && gBankAttacker == *(gBattleStruct->moveTarget + gBankTarget)
- && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE))
- && gBattleMons[gBankAttacker].hp
- && !gDisableStructs[gBankTarget].truantCounter
- && gChosenMovesByBanks[gBankTarget] == MOVE_PURSUIT)
+ if (gChosenActionByBattler[gBattlerTarget] == B_ACTION_USE_MOVE
+ && gBattlerAttacker == *(gBattleStruct->moveTarget + gBattlerTarget)
+ && !(gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE))
+ && gBattleMons[gBattlerAttacker].hp
+ && !gDisableStructs[gBattlerTarget].truantCounter
+ && gChosenMoveByBattler[gBattlerTarget] == MOVE_PURSUIT)
{
s32 i;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gBanksByTurnOrder[i] == gBankTarget)
+ if (gBattlerByTurnOrder[i] == gBattlerTarget)
gActionsByTurnOrder[i] = 11;
}
gCurrentMove = MOVE_PURSUIT;
- gCurrMovePos = gUnknown_020241E9 = *(gBattleStruct->chosenMovePositions + gBankTarget);
+ gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerTarget);
gBattlescriptCurrInstr += 5;
gBattleScripting.animTurn = 1;
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -9416,7 +8978,7 @@ static void atkBB_setsunny(void)
{
if (gBattleWeather & WEATHER_SUN_ANY)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
}
else
@@ -9431,16 +8993,16 @@ static void atkBB_setsunny(void)
static void atkBC_maxattackhalvehp(void) // belly drum
{
- u32 halfHp = gBattleMons[gBankAttacker].maxHP / 2;
+ u32 halfHp = gBattleMons[gBattlerAttacker].maxHP / 2;
- if (!(gBattleMons[gBankAttacker].maxHP / 2))
+ if (!(gBattleMons[gBattlerAttacker].maxHP / 2))
halfHp = 1;
- if (gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] < 12
- && gBattleMons[gBankAttacker].hp > halfHp)
+ if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] < 12
+ && gBattleMons[gBattlerAttacker].hp > halfHp)
{
- gBattleMons[gBankAttacker].statStages[STAT_STAGE_ATK] = 12;
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2;
+ gBattleMons[gBattlerAttacker].statStages[STAT_ATK] = 12;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
@@ -9448,7 +9010,7 @@ static void atkBC_maxattackhalvehp(void) // belly drum
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -9458,7 +9020,7 @@ static void atkBD_copyfoestats(void) // psych up
for (i = 0; i < BATTLE_STATS_NO; i++)
{
- gBattleMons[gBankAttacker].statStages[i] = gBattleMons[gBankTarget].statStages[i];
+ gBattleMons[gBattlerAttacker].statStages[i] = gBattleMons[gBattlerTarget].statStages[i];
}
gBattlescriptCurrInstr += 5; // Has an unused jump ptr(possibly for a failed attempt) parameter.
@@ -9466,32 +9028,32 @@ static void atkBD_copyfoestats(void) // psych up
static void atkBE_rapidspinfree(void)
{
- if (gBattleMons[gBankAttacker].status2 & STATUS2_WRAPPED)
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED)
{
- gBattleScripting.bank = gBankTarget;
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED);
- gBankTarget = *(gBattleStruct->wrappedBy + gBankAttacker);
+ gBattleScripting.battler = gBattlerTarget;
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_WRAPPED);
+ gBattlerTarget = *(gBattleStruct->wrappedBy + gBattlerAttacker);
gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;
gBattleTextBuff1[1] = B_BUFF_MOVE;
- gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gBankAttacker * 2 + 0);
- gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gBankAttacker * 2 + 1);
+ gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 0);
+ gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 1);
gBattleTextBuff1[4] = B_BUFF_EOS;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WrapFree;
}
- else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED)
+ else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED)
{
- gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED);
- gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK);
+ gStatuses3[gBattlerAttacker] &= ~(STATUS3_LEECHSEED);
+ gStatuses3[gBattlerAttacker] &= ~(STATUS3_LEECHSEED_BATTLER);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_LeechSeedFree;
}
- else if (gSideAffecting[GetBankSide(gBankAttacker)] & SIDE_STATUS_SPIKES)
+ else if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SPIKES)
{
- gSideAffecting[GetBankSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES);
- gSideTimers[GetBankSide(gBankAttacker)].spikesAmount = 0;
+ gSideStatuses[GetBattlerSide(gBattlerAttacker)] &= ~(SIDE_STATUS_SPIKES);
+ gSideTimers[GetBattlerSide(gBattlerAttacker)].spikesAmount = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SpikesFree;
}
@@ -9501,24 +9063,24 @@ static void atkBE_rapidspinfree(void)
}
}
-static void atkBF_set_defense_curl(void)
+static void atkBF_setdefensecurlbit(void)
{
- gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL;
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_DEFENSE_CURL;
gBattlescriptCurrInstr++;
}
static void atkC0_recoverbasedonsunlight(void)
{
- gBankTarget = gBankAttacker;
+ gBattlerTarget = gBattlerAttacker;
- if (gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP)
+ if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP)
{
if (gBattleWeather == 0 || !WEATHER_HAS_EFFECT)
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 2;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;
else if (gBattleWeather & WEATHER_SUN_ANY)
- gBattleMoveDamage = 20 * gBattleMons[gBankAttacker].maxHP / 30;
+ gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30;
else // not sunny weather
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 4;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
@@ -9528,215 +9090,69 @@ static void atkC0_recoverbasedonsunlight(void)
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-#ifdef NONMATCHING
-static void atkC1_hidden_power_calc(void)
+static void atkC1_hiddenpowercalc(void)
{
- u32 powerBits = 0;
- u32 typeBits = 0;
+ u8 powerBits;
+ u8 typeBits;
- powerBits |= ((gBattleMons[gBankAttacker].hpIV & 2) >> 1);
- powerBits |= ((gBattleMons[gBankAttacker].attackIV & 2) << 0);
- powerBits |= ((gBattleMons[gBankAttacker].defenseIV & 2) << 1);
- powerBits |= ((gBattleMons[gBankAttacker].speedIV & 2) << 2);
- powerBits |= ((gBattleMons[gBankAttacker].spAttackIV & 2) << 3);
- powerBits |= ((gBattleMons[gBankAttacker].spDefenseIV & 2) << 4);
+ powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)
+ | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)
+ | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)
+ | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)
+ | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)
+ | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);
- typeBits |= ((gBattleMons[gBankAttacker].hpIV & 1) << 0);
- typeBits |= ((gBattleMons[gBankAttacker].attackIV & 1) << 1);
- typeBits |= ((gBattleMons[gBankAttacker].defenseIV & 1) << 2);
- typeBits |= ((gBattleMons[gBankAttacker].speedIV & 1) << 3);
- typeBits |= ((gBattleMons[gBankAttacker].spAttackIV & 1) << 4);
- typeBits |= ((gBattleMons[gBankAttacker].spDefenseIV & 1) << 5);
+ typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)
+ | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)
+ | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)
+ | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)
+ | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)
+ | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);
gDynamicBasePower = (40 * powerBits) / 63 + 30;
gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1;
- if (gBattleStruct->dynamicMoveType > 8)
+ if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY)
gBattleStruct->dynamicMoveType++;
gBattleStruct->dynamicMoveType |= 0xC0;
gBattlescriptCurrInstr++;
}
-#else
-__attribute__((naked))
-static void atkC1_hidden_power_calc(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\
- ldr r2, =gBattleMons\n\
- ldr r0, =gBankAttacker\n\
- ldrb r1, [r0]\n\
- movs r0, 0x58\n\
- adds r4, r1, 0\n\
- muls r4, r0\n\
- adds r4, r2\n\
- ldrb r0, [r4, 0x14]\n\
- mov r10, r0\n\
- mov r7, r10\n\
- lsls r7, 27\n\
- adds r0, r7, 0\n\
- lsrs r0, 27\n\
- mov r10, r0\n\
- movs r1, 0x2\n\
- mov r2, r10\n\
- ands r2, r1\n\
- asrs r2, 1\n\
- ldrh r7, [r4, 0x14]\n\
- mov r9, r7\n\
- mov r0, r9\n\
- lsls r0, 22\n\
- mov r9, r0\n\
- lsrs r3, r0, 27\n\
- adds r0, r1, 0\n\
- ands r0, r3\n\
- orrs r2, r0\n\
- ldrb r7, [r4, 0x15]\n\
- mov r8, r7\n\
- mov r0, r8\n\
- lsls r0, 25\n\
- mov r8, r0\n\
- lsrs r3, r0, 27\n\
- adds r0, r1, 0\n\
- ands r0, r3\n\
- lsls r0, 1\n\
- orrs r2, r0\n\
- ldr r6, [r4, 0x14]\n\
- lsls r6, 12\n\
- lsrs r3, r6, 27\n\
- adds r0, r1, 0\n\
- ands r0, r3\n\
- lsls r0, 2\n\
- orrs r2, r0\n\
- ldrh r5, [r4, 0x16]\n\
- lsls r5, 23\n\
- lsrs r3, r5, 27\n\
- adds r0, r1, 0\n\
- ands r0, r3\n\
- lsls r0, 3\n\
- orrs r2, r0\n\
- ldrb r3, [r4, 0x17]\n\
- lsls r3, 26\n\
- lsrs r0, r3, 27\n\
- ands r1, r0\n\
- lsls r1, 4\n\
- orrs r2, r1\n\
- movs r1, 0x1\n\
- adds r4, r1, 0\n\
- mov r7, r10\n\
- ands r4, r7\n\
- mov r0, r9\n\
- lsrs r0, 27\n\
- mov r9, r0\n\
- adds r0, r1, 0\n\
- mov r7, r9\n\
- ands r0, r7\n\
- lsls r0, 1\n\
- orrs r4, r0\n\
- mov r0, r8\n\
- lsrs r0, 27\n\
- mov r8, r0\n\
- adds r0, r1, 0\n\
- mov r7, r8\n\
- ands r0, r7\n\
- lsls r0, 2\n\
- orrs r4, r0\n\
- lsrs r6, 27\n\
- adds r0, r1, 0\n\
- ands r0, r6\n\
- lsls r0, 3\n\
- orrs r4, r0\n\
- lsrs r5, 27\n\
- adds r0, r1, 0\n\
- ands r0, r5\n\
- lsls r0, 4\n\
- orrs r4, r0\n\
- lsrs r3, 27\n\
- ands r1, r3\n\
- lsls r1, 5\n\
- orrs r4, r1\n\
- ldr r5, =gDynamicBasePower\n\
- lsls r0, r2, 2\n\
- adds r0, r2\n\
- lsls r0, 3\n\
- movs r1, 0x3F\n\
- bl __divsi3\n\
- adds r0, 0x1E\n\
- strh r0, [r5]\n\
- ldr r6, =gBattleStruct\n\
- ldr r5, [r6]\n\
- lsls r0, r4, 4\n\
- subs r0, r4\n\
- movs r1, 0x3F\n\
- bl __divsi3\n\
- adds r0, 0x1\n\
- strb r0, [r5, 0x13]\n\
- ldr r1, [r6]\n\
- ldrb r0, [r1, 0x13]\n\
- cmp r0, 0x8\n\
- bls _080544F0\n\
- adds r0, 0x1\n\
- strb r0, [r1, 0x13]\n\
-_080544F0:\n\
- ldr r2, [r6]\n\
- ldrb r0, [r2, 0x13]\n\
- movs r1, 0xC0\n\
- orrs r0, r1\n\
- strb r0, [r2, 0x13]\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, [r1]\n\
- adds r0, 0x1\n\
- str r0, [r1]\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\
- .pool\n\
- .syntax divided");
-}
-#endif // NONMATCHING
-
-static void atkC2_selectnexttarget(void)
+static void atkC2_selectfirstvalidtarget(void)
{
- for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++)
+ for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
- if (gBankTarget == gBankAttacker)
+ if (gBattlerTarget == gBattlerAttacker)
continue;
- if (!(gAbsentBankFlags & gBitTable[gBankTarget]))
+ if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))
break;
}
gBattlescriptCurrInstr++;
}
-static void atkC3_setfutureattack(void)
+static void atkC3_trysetfutureattack(void)
{
- if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0)
+ if (gWishFutureKnock.futureSightCounter[gBattlerTarget] != 0)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gSideAffecting[GET_BANK_SIDE(gBankTarget)] |= SIDE_STATUS_FUTUREATTACK;
- gWishFutureKnock.futureSightMove[gBankTarget] = gCurrentMove;
- gWishFutureKnock.futureSightAttacker[gBankTarget] = gBankAttacker;
- gWishFutureKnock.futureSightCounter[gBankTarget] = 3;
- gWishFutureKnock.futureSightDmg[gBankTarget] = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove,
- gSideAffecting[GET_BANK_SIDE(gBankTarget)], 0,
- 0, gBankAttacker, gBankTarget);
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)] |= SIDE_STATUS_FUTUREATTACK;
+ gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove;
+ gWishFutureKnock.futureSightAttacker[gBattlerTarget] = gBattlerAttacker;
+ gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3;
+ gWishFutureKnock.futureSightDmg[gBattlerTarget] = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove,
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0,
+ 0, gBattlerAttacker, gBattlerTarget);
- if (gProtectStructs[gBankAttacker].helpingHand)
- gWishFutureKnock.futureSightDmg[gBankTarget] = gWishFutureKnock.futureSightDmg[gBankTarget] * 15 / 10;
+ if (gProtectStructs[gBattlerAttacker].helpingHand)
+ gWishFutureKnock.futureSightDmg[gBattlerTarget] = gWishFutureKnock.futureSightDmg[gBattlerTarget] * 15 / 10;
if (gCurrentMove == MOVE_DOOM_DESIRE)
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
@@ -9747,18 +9163,18 @@ static void atkC3_setfutureattack(void)
}
}
-static void atkC4_beat_up(void)
+static void atkC4_trydobeatup(void)
{
- struct Pokemon* party;
+ struct Pokemon *party;
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
- if (gBattleMons[gBankTarget].hp == 0)
+ if (gBattleMons[gBattlerTarget].hp == 0)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -9773,24 +9189,24 @@ static void atkC4_beat_up(void)
}
if (gBattleCommunication[0] < 6)
{
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBankAttacker, gBattleCommunication[0])
+ PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0])
gBattlescriptCurrInstr += 9;
gBattleMoveDamage = gBaseStats[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack;
gBattleMoveDamage *= gBattleMoves[gCurrentMove].power;
gBattleMoveDamage *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2);
- gBattleMoveDamage /= gBaseStats[gBattleMons[gBankTarget].species].baseDefense;
+ gBattleMoveDamage /= gBaseStats[gBattleMons[gBattlerTarget].species].baseDefense;
gBattleMoveDamage = (gBattleMoveDamage / 50) + 2;
- if (gProtectStructs[gBankAttacker].helpingHand)
+ if (gProtectStructs[gBattlerAttacker].helpingHand)
gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
gBattleCommunication[0]++;
}
else if (beforeLoop != 0)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 5);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5);
}
}
@@ -9800,13 +9216,13 @@ static void atkC5_setsemiinvulnerablebit(void)
{
case MOVE_FLY:
case MOVE_BOUNCE:
- gStatuses3[gBankAttacker] |= STATUS3_ON_AIR;
+ gStatuses3[gBattlerAttacker] |= STATUS3_ON_AIR;
break;
case MOVE_DIG:
- gStatuses3[gBankAttacker] |= STATUS3_UNDERGROUND;
+ gStatuses3[gBattlerAttacker] |= STATUS3_UNDERGROUND;
break;
case MOVE_DIVE:
- gStatuses3[gBankAttacker] |= STATUS3_UNDERWATER;
+ gStatuses3[gBattlerAttacker] |= STATUS3_UNDERWATER;
break;
}
@@ -9819,13 +9235,13 @@ static void atkC6_clearsemiinvulnerablebit(void)
{
case MOVE_FLY:
case MOVE_BOUNCE:
- gStatuses3[gBankAttacker] &= ~STATUS3_ON_AIR;
+ gStatuses3[gBattlerAttacker] &= ~STATUS3_ON_AIR;
break;
case MOVE_DIG:
- gStatuses3[gBankAttacker] &= ~STATUS3_UNDERGROUND;
+ gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERGROUND;
break;
case MOVE_DIVE:
- gStatuses3[gBankAttacker] &= ~STATUS3_UNDERWATER;
+ gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERWATER;
break;
}
@@ -9835,7 +9251,7 @@ static void atkC6_clearsemiinvulnerablebit(void)
static void atkC7_setminimize(void)
{
if (gHitMarker & HITMARKER_OBEYS)
- gStatuses3[gBankAttacker] |= STATUS3_MINIMIZED;
+ gStatuses3[gBattlerAttacker] |= STATUS3_MINIMIZED;
gBattlescriptCurrInstr++;
}
@@ -9844,7 +9260,7 @@ static void atkC8_sethail(void)
{
if (gBattleWeather & WEATHER_HAIL_ANY)
{
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
}
else
@@ -9859,34 +9275,34 @@ static void atkC8_sethail(void)
static void atkC9_jumpifattackandspecialattackcannotfall(void) // memento
{
- if (gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] == 0
- && gBattleMons[gBankTarget].statStages[STAT_STAGE_SPATK] == 0
+ if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == 0
+ && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == 0
&& gBattleCommunication[6] != 1)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gActiveBank = gBankAttacker;
- gBattleMoveDamage = gBattleMons[gActiveBank].hp;
- EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].hp;
+ BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 5;
}
}
static void atkCA_setforcedtarget(void) // follow me
{
- gSideTimers[GetBankSide(gBankAttacker)].followmeTimer = 1;
- gSideTimers[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker;
+ gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTimer = 1;
+ gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTarget = gBattlerAttacker;
gBattlescriptCurrInstr++;
}
static void atkCB_setcharge(void)
{
- gStatuses3[gBankAttacker] |= STATUS3_CHARGED_UP;
- gDisableStructs[gBankAttacker].chargeTimer1 = 2;
- gDisableStructs[gBankAttacker].chargeTimer2 = 2;
+ gStatuses3[gBattlerAttacker] |= STATUS3_CHARGED_UP;
+ gDisableStructs[gBattlerAttacker].chargeTimer1 = 2;
+ gDisableStructs[gBattlerAttacker].chargeTimer2 = 2;
gBattlescriptCurrInstr++;
}
@@ -9894,97 +9310,97 @@ static void atkCC_callterrainattack(void) // nature power
{
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gCurrentMove = sNaturePowerMoves[gBattleTerrain];
- gBankTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);
gBattlescriptCurrInstr++;
}
static void atkCD_cureifburnedparalysedorpoisoned(void) // refresh
{
- if (gBattleMons[gBankAttacker].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS | STATUS_TOXIC_POISON))
+ if (gBattleMons[gBattlerAttacker].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON))
{
- gBattleMons[gBankAttacker].status1 = 0;
+ gBattleMons[gBattlerAttacker].status1 = 0;
gBattlescriptCurrInstr += 5;
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
static void atkCE_settorment(void)
{
- if (gBattleMons[gBankTarget].status2 & STATUS2_TORMENT)
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gBattleMons[gBankTarget].status2 |= STATUS2_TORMENT;
+ gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT;
gBattlescriptCurrInstr += 5;
}
}
static void atkCF_jumpifnodamage(void)
{
- if (gProtectStructs[gBankAttacker].physicalDmg || gProtectStructs[gBankAttacker].specialDmg)
+ if (gProtectStructs[gBattlerAttacker].physicalDmg || gProtectStructs[gBattlerAttacker].specialDmg)
gBattlescriptCurrInstr += 5;
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
static void atkD0_settaunt(void)
{
- if (gDisableStructs[gBankTarget].tauntTimer1 == 0)
+ if (gDisableStructs[gBattlerTarget].tauntTimer1 == 0)
{
- gDisableStructs[gBankTarget].tauntTimer1 = 2;
- gDisableStructs[gBankTarget].tauntTimer2 = 2;
+ gDisableStructs[gBattlerTarget].tauntTimer1 = 2;
+ gDisableStructs[gBattlerTarget].tauntTimer2 = 2;
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkD1_set_helpinghand(void)
+static void atkD1_trysethelpinghand(void)
{
- gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_MON);
+ gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && !(gAbsentBankFlags & gBitTable[gBankTarget])
- && !gProtectStructs[gBankAttacker].helpingHand
- && !gProtectStructs[gBankTarget].helpingHand)
+ && !(gAbsentBattlerFlags & gBitTable[gBattlerTarget])
+ && !gProtectStructs[gBattlerAttacker].helpingHand
+ && !gProtectStructs[gBattlerTarget].helpingHand)
{
- gProtectStructs[gBankTarget].helpingHand = 1;
+ gProtectStructs[gBattlerTarget].helpingHand = 1;
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkD2_swap_items(void) // trick
+static void atkD2_tryswapitems(void) // trick
{
// opponent can't swap items with player in regular battles
if (gBattleTypeFlags & BATTLE_TYPE_x4000000
- || (GetBankSide(gBankAttacker) == SIDE_OPPONENT
+ || (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT
&& !(gBattleTypeFlags & (BATTLE_TYPE_LINK
| BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_SECRET_BASE
| BATTLE_TYPE_x2000000))))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- u8 sideAttacker = GetBankSide(gBankAttacker);
- u8 sideTarget = GetBankSide(gBankTarget);
+ u8 sideAttacker = GetBattlerSide(gBattlerAttacker);
+ u8 sideTarget = GetBattlerSide(gBattlerTarget);
// you can't swap items if they were knocked off in regular battles
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
@@ -9992,53 +9408,53 @@ static void atkD2_swap_items(void) // trick
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_SECRET_BASE
| BATTLE_TYPE_x2000000))
- && (gWishFutureKnock.knockedOffPokes[sideAttacker] & gBitTable[gBattlePartyID[gBankAttacker]]
- || gWishFutureKnock.knockedOffPokes[sideTarget] & gBitTable[gBattlePartyID[gBankTarget]]))
+ && (gWishFutureKnock.knockedOffPokes[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]
+ || gWishFutureKnock.knockedOffPokes[sideTarget] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]]))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
// can't swap if two pokemon don't have an item
// or if either of them is an enigma berry or a mail
- else if ((gBattleMons[gBankAttacker].item == 0 && gBattleMons[gBankTarget].item == 0)
- || gBattleMons[gBankAttacker].item == ITEM_ENIGMA_BERRY
- || gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY
- || IS_ITEM_MAIL(gBattleMons[gBankAttacker].item)
- || IS_ITEM_MAIL(gBattleMons[gBankTarget].item))
+ else if ((gBattleMons[gBattlerAttacker].item == 0 && gBattleMons[gBattlerTarget].item == 0)
+ || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY
+ || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY
+ || IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item)
+ || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
// check if ability prevents swapping
- else if (gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD)
+ else if (gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD)
{
gBattlescriptCurrInstr = BattleScript_StickyHoldActivates;
- gLastUsedAbility = gBattleMons[gBankTarget].ability;
- RecordAbilityBattle(gBankTarget, gLastUsedAbility);
+ gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
}
// took a while, but all checks passed and items can be safely swapped
else
{
u16 oldItemAtk, *newItemAtk;
- newItemAtk = &gBattleStruct->changedItems[gBankAttacker];
- oldItemAtk = gBattleMons[gBankAttacker].item;
- *newItemAtk = gBattleMons[gBankTarget].item;
+ newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker];
+ oldItemAtk = gBattleMons[gBattlerAttacker].item;
+ *newItemAtk = gBattleMons[gBattlerTarget].item;
- gBattleMons[gBankAttacker].item = 0;
- gBattleMons[gBankTarget].item = oldItemAtk;
+ gBattleMons[gBattlerAttacker].item = 0;
+ gBattleMons[gBattlerTarget].item = oldItemAtk;
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, newItemAtk);
- MarkBufferBankForExecution(gBankAttacker);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, newItemAtk);
+ MarkBattlerForControllerExec(gBattlerAttacker);
- gActiveBank = gBankTarget;
- EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item);
- MarkBufferBankForExecution(gBankTarget);
+ gActiveBattler = gBattlerTarget;
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBattlerTarget].item);
+ MarkBattlerForControllerExec(gBattlerTarget);
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gBankTarget]) + 0) = 0;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gBankTarget]) + 1) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gBankAttacker]) + 0) = 0;
- *(u8*)((u8*)(&gBattleStruct->choicedMove[gBankAttacker]) + 1) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 0) = 0;
+ *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 1) = 0;
gBattlescriptCurrInstr += 5;
@@ -10055,47 +9471,47 @@ static void atkD2_swap_items(void) // trick
}
}
-static void atkD3_copy_ability(void) // role play
+static void atkD3_trycopyability(void) // role play
{
- if (gBattleMons[gBankTarget].ability != 0
- && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD)
+ if (gBattleMons[gBattlerTarget].ability != 0
+ && gBattleMons[gBattlerTarget].ability != ABILITY_WONDER_GUARD)
{
- gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability;
- gLastUsedAbility = gBattleMons[gBankTarget].ability;
+ gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;
+ gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkD4_wish_effect(void)
+static void atkD4_trywish(void)
{
switch (gBattlescriptCurrInstr[1])
{
case 0: // use wish
- if (gWishFutureKnock.wishCounter[gBankAttacker] == 0)
+ if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0)
{
- gWishFutureKnock.wishCounter[gBankAttacker] = 2;
- gWishFutureKnock.wishUserID[gBankAttacker] = gBattlePartyID[gBankAttacker];
+ gWishFutureKnock.wishCounter[gBattlerAttacker] = 2;
+ gWishFutureKnock.wishMonId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker];
gBattlescriptCurrInstr += 6;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
}
break;
case 1: // heal effect
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBankTarget, gWishFutureKnock.wishUserID[gBankTarget])
+ PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gWishFutureKnock.wishMonId[gBattlerTarget])
- gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
- if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
@@ -10103,25 +9519,25 @@ static void atkD4_wish_effect(void)
}
}
-static void atkD5_setroots(void) // ingrain
+static void atkD5_trysetroots(void) // ingrain
{
- if (gStatuses3[gBankAttacker] & STATUS3_ROOTED)
+ if (gStatuses3[gBattlerAttacker] & STATUS3_ROOTED)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gStatuses3[gBankAttacker] |= STATUS3_ROOTED;
+ gStatuses3[gBattlerAttacker] |= STATUS3_ROOTED;
gBattlescriptCurrInstr += 5;
}
}
static void atkD6_doubledamagedealtifdamaged(void)
{
- if ((gProtectStructs[gBankAttacker].physicalDmg
- && gProtectStructs[gBankAttacker].physicalBank == gBankTarget)
- || (gProtectStructs[gBankAttacker].specialDmg
- && gProtectStructs[gBankAttacker].specialBank == gBankTarget))
+ if ((gProtectStructs[gBattlerAttacker].physicalDmg
+ && gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget)
+ || (gProtectStructs[gBattlerAttacker].specialDmg
+ && gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget))
{
gBattleScripting.dmgMultiplier = 2;
}
@@ -10131,27 +9547,27 @@ static void atkD6_doubledamagedealtifdamaged(void)
static void atkD7_setyawn(void)
{
- if (gStatuses3[gBankTarget] & STATUS3_YAWN
- || gBattleMons[gBankTarget].status1 & STATUS_ANY)
+ if (gStatuses3[gBattlerTarget] & STATUS3_YAWN
+ || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gStatuses3[gBankTarget] |= 0x1000;
+ gStatuses3[gBattlerTarget] |= 0x1000;
gBattlescriptCurrInstr += 5;
}
}
static void atkD8_setdamagetohealthdifference(void)
{
- if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp)
+ if (gBattleMons[gBattlerTarget].hp <= gBattleMons[gBattlerAttacker].hp)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gBattleMoveDamage = gBattleMons[gBankTarget].hp - gBattleMons[gBankAttacker].hp;
+ gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - gBattleMons[gBattlerAttacker].hp;
gBattlescriptCurrInstr += 5;
}
}
@@ -10161,48 +9577,48 @@ static void atkD9_scaledamagebyhealthratio(void)
if (gDynamicBasePower == 0)
{
u8 power = gBattleMoves[gCurrentMove].power;
- gDynamicBasePower = gBattleMons[gBankAttacker].hp * power / gBattleMons[gBankAttacker].maxHP;
+ gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP;
if (gDynamicBasePower == 0)
gDynamicBasePower = 1;
}
gBattlescriptCurrInstr++;
}
-static void atkDA_abilityswap(void) // skill swap
+static void atkDA_tryswapabilities(void) // skill swap
{
- if ((gBattleMons[gBankAttacker].ability == 0
- && gBattleMons[gBankTarget].ability == 0)
- || gBattleMons[gBankAttacker].ability == ABILITY_WONDER_GUARD
- || gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD
- || gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ if ((gBattleMons[gBattlerAttacker].ability == 0
+ && gBattleMons[gBattlerTarget].ability == 0)
+ || gBattleMons[gBattlerAttacker].ability == ABILITY_WONDER_GUARD
+ || gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD
+ || gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- u8 abilityAtk = gBattleMons[gBankAttacker].ability;
- gBattleMons[gBankAttacker].ability = gBattleMons[gBankTarget].ability;
- gBattleMons[gBankTarget].ability = abilityAtk;
+ u8 abilityAtk = gBattleMons[gBattlerAttacker].ability;
+ gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;
+ gBattleMons[gBattlerTarget].ability = abilityAtk;
gBattlescriptCurrInstr += 5;
}
}
-static void atkDB_imprisoneffect(void)
+static void atkDB_tryimprision(void)
{
- if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISONED_OTHERS))
+ if ((gStatuses3[gBattlerAttacker] & STATUS3_IMPRISONED_OTHERS))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- u8 bank, sideAttacker;
+ u8 battlerId, sideAttacker;
- sideAttacker = GetBankSide(gBankAttacker);
- PressurePPLoseOnUsingImprision(gBankAttacker);
- for (bank = 0; bank < gNoOfAllBanks; bank++)
+ sideAttacker = GetBattlerSide(gBattlerAttacker);
+ PressurePPLoseOnUsingImprision(gBattlerAttacker);
+ for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
{
- if (sideAttacker != GetBankSide(bank))
+ if (sideAttacker != GetBattlerSide(battlerId))
{
s32 attackerMoveId;
for (attackerMoveId = 0; attackerMoveId < 4; attackerMoveId++)
@@ -10210,8 +9626,8 @@ static void atkDB_imprisoneffect(void)
s32 i;
for (i = 0; i < 4; i++)
{
- if (gBattleMons[gBankAttacker].moves[attackerMoveId] == gBattleMons[bank].moves[i]
- && gBattleMons[gBankAttacker].moves[attackerMoveId] != MOVE_NONE)
+ if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i]
+ && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE)
break;
}
if (i != 4)
@@ -10219,26 +9635,26 @@ static void atkDB_imprisoneffect(void)
}
if (attackerMoveId != 4)
{
- gStatuses3[gBankAttacker] |= STATUS3_IMPRISONED_OTHERS;
+ gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS;
gBattlescriptCurrInstr += 5;
break;
}
}
}
- if (bank == gNoOfAllBanks) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkDC_setgrudge(void)
+static void atkDC_trysetgrudge(void)
{
- if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE)
+ if (gStatuses3[gBattlerAttacker] & STATUS3_GRUDGE)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gStatuses3[gBankAttacker] |= STATUS3_GRUDGE;
+ gStatuses3[gBattlerAttacker] |= STATUS3_GRUDGE;
gBattlescriptCurrInstr += 5;
}
}
@@ -10248,7 +9664,7 @@ static void atkDD_weightdamagecalculation(void)
s32 i;
for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2)
{
- if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1))
+ if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1))
break;
}
@@ -10267,14 +9683,14 @@ static void atkDE_asistattackselect(void)
s32 monId, moveId;
u16* movesArray = gBattleStruct->assistPossibleMoves;
- if (GET_BANK_SIDE(gBankAttacker) != SIDE_PLAYER)
+ if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER)
party = gEnemyParty;
else
party = gPlayerParty;
for (monId = 0; monId < 6; monId++)
{
- if (monId == gBattlePartyID[gBankAttacker])
+ if (monId == gBattlerPartyIndexes[gBattlerAttacker])
continue;
if (GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_NONE)
continue;
@@ -10304,77 +9720,77 @@ static void atkDE_asistattackselect(void)
{
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gRandomMove = movesArray[((Random() & 0xFF) * chooseableMovesNo) >> 8];
- gBankTarget = GetMoveTarget(gRandomMove, 0);
+ gBattlerTarget = GetMoveTarget(gRandomMove, 0);
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkDF_setmagiccoat(void)
+static void atkDF_trysetmagiccoat(void)
{
- gBankTarget = gBankAttacker;
- gSpecialStatuses[gBankAttacker].flag20 = 1;
- if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) // moves last turn
+ gBattlerTarget = gBattlerAttacker;
+ gSpecialStatuses[gBattlerAttacker].flag20 = 1;
+ if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gProtectStructs[gBankAttacker].bounceMove = 1;
+ gProtectStructs[gBattlerAttacker].bounceMove = 1;
gBattlescriptCurrInstr += 5;
}
}
-static void atkE0_setstealstatchange(void) // snatch
+static void atkE0_trysetsnatch(void) // snatch
{
- gSpecialStatuses[gBankAttacker].flag20 = 1;
- if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) // moves last turn
+ gSpecialStatuses[gBattlerAttacker].flag20 = 1;
+ if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
- gProtectStructs[gBankAttacker].stealMove = 1;
+ gProtectStructs[gBattlerAttacker].stealMove = 1;
gBattlescriptCurrInstr += 5;
}
}
-static void atkE1_intimidate_string_loader(void)
+static void atkE1_trygetintimidatetarget(void)
{
u8 side;
- gBattleScripting.bank = gBattleStruct->intimidateBank;
- side = GetBankSide(gBattleScripting.bank);
+ gBattleScripting.battler = gBattleStruct->intimidateBattler;
+ side = GetBattlerSide(gBattleScripting.battler);
- PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gBattleMons[gBattleScripting.bank].ability)
+ PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gBattleMons[gBattleScripting.battler].ability)
- for (;gBankTarget < gNoOfAllBanks; gBankTarget++)
+ for (;gBattlerTarget < gBattlersCount; gBattlerTarget++)
{
- if (GetBankSide(gBankTarget) == side)
+ if (GetBattlerSide(gBattlerTarget) == side)
continue;
- if (!(gAbsentBankFlags & gBitTable[gBankTarget]))
+ if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget]))
break;
}
- if (gBankTarget >= gNoOfAllBanks)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ if (gBattlerTarget >= gBattlersCount)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
}
-static void atkE2_switchout_abilities(void)
+static void atkE2_switchoutabilities(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- switch (gBattleMons[gActiveBank].ability)
+ switch (gBattleMons[gActiveBattler].ability)
{
case ABILITY_NATURAL_CURE:
- gBattleMons[gActiveBank].status1 = 0;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->field_58 + gActiveBank)], 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gBattleMons[gActiveBattler].status1 = 0;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->field_58 + gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
}
@@ -10383,10 +9799,10 @@ static void atkE2_switchout_abilities(void)
static void atkE3_jumpifhasnohp(void)
{
- gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (gBattleMons[gActiveBank].hp == 0)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
+ if (gBattleMons[gActiveBattler].hp == 0)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
@@ -10413,7 +9829,7 @@ static void atkE4_getsecretpowereffect(void)
case BATTLE_TERRAIN_POND:
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SPD_MINUS_1;
break;
- case BATTLE_TERRAIN_ROCK:
+ case BATTLE_TERRAIN_MOUNTAIN:
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION;
break;
case BATTLE_TERRAIN_CAVE:
@@ -10502,25 +9918,25 @@ static void atkE5_pickup(void)
gBattlescriptCurrInstr++;
}
-static void atkE6_castform_change_animation(void)
+static void atkE6_docastformchangeanimation(void)
{
- gActiveBank = gBattleScripting.bank;
+ gActiveBattler = gBattleScripting.battler;
- if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE)
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE)
*(&gBattleStruct->formToChangeInto) |= 0x80;
- EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr++;
}
-static void atkE7_castform_data_change(void)
+static void atkE7_trycastformdatachange(void)
{
u8 form;
gBattlescriptCurrInstr++;
- form = CastformDataTypeChange(gBattleScripting.bank);
+ form = CastformDataTypeChange(gBattleScripting.battler);
if (form)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
@@ -10534,18 +9950,18 @@ static void atkE8_settypebasedhalvers(void) // water and mud sport
if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT)
{
- if (!(gStatuses3[gBankAttacker] & STATUS3_MUDSPORT))
+ if (!(gStatuses3[gBattlerAttacker] & STATUS3_MUDSPORT))
{
- gStatuses3[gBankAttacker] |= STATUS3_MUDSPORT;
+ gStatuses3[gBattlerAttacker] |= STATUS3_MUDSPORT;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
worked = TRUE;
}
}
else // water sport
{
- if (!(gStatuses3[gBankAttacker] & STATUS3_WATERSPORT))
+ if (!(gStatuses3[gBattlerAttacker] & STATUS3_WATERSPORT))
{
- gStatuses3[gBankAttacker] |= STATUS3_WATERSPORT;
+ gStatuses3[gBattlerAttacker] |= STATUS3_WATERSPORT;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
worked = TRUE;
}
@@ -10554,7 +9970,7 @@ static void atkE8_settypebasedhalvers(void) // water and mud sport
if (worked)
gBattlescriptCurrInstr += 5;
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
static void atkE9_setweatherballtype(void)
@@ -10578,90 +9994,87 @@ static void atkE9_setweatherballtype(void)
gBattlescriptCurrInstr++;
}
-static void atkEA_recycleitem(void)
+static void atkEA_tryrecycleitem(void)
{
u16 *usedHeldItem;
- gActiveBank = gBankAttacker;
- usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBank];
- if (*usedHeldItem != 0 && gBattleMons[gActiveBank].item == 0)
+ gActiveBattler = gBattlerAttacker;
+ usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler];
+ if (*usedHeldItem != 0 && gBattleMons[gActiveBattler].item == 0)
{
gLastUsedItem = *usedHeldItem;
*usedHeldItem = 0;
- gBattleMons[gActiveBank].item = gLastUsedItem;
+ gBattleMons[gActiveBattler].item = gLastUsedItem;
- EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
static void atkEB_settypetoterrain(void)
{
- if (gBattleMons[gBankAttacker].type1 != sTerrainToType[gBattleTerrain]
- && gBattleMons[gBankAttacker].type2 != sTerrainToType[gBattleTerrain])
+ if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]))
{
- gBattleMons[gBankAttacker].type1 = sTerrainToType[gBattleTerrain];
- gBattleMons[gBankAttacker].type2 = sTerrainToType[gBattleTerrain];
-
- PREPARE_TYPE_BUFFER(gBattleTextBuff1, sTerrainToType[gBattleTerrain])
+ SET_BATTLER_TYPE(gBattlerAttacker, sTerrainToType[gBattleTerrain]);
+ PREPARE_TYPE_BUFFER(gBattleTextBuff1, sTerrainToType[gBattleTerrain]);
gBattlescriptCurrInstr += 5;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkEC_pursuit_sth(void)
+static void atkEC_pursuitrelated(void)
{
- gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_MON);
+ gActiveBattler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
- && !(gAbsentBankFlags & gBitTable[gActiveBank])
- && gActionForBanks[gActiveBank] == 0
- && gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT)
+ && !(gAbsentBattlerFlags & gBitTable[gActiveBattler])
+ && gChosenActionByBattler[gActiveBattler] == 0
+ && gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT)
{
- gActionsByTurnOrder[gActiveBank] = 11;
+ gActionsByTurnOrder[gActiveBattler] = 11;
gCurrentMove = MOVE_PURSUIT;
gBattlescriptCurrInstr += 5;
gBattleScripting.animTurn = 1;
- gBattleScripting.field_20 = gBankAttacker;
- gBankAttacker = gActiveBank;
+ gBattleScripting.field_20 = gBattlerAttacker;
+ gBattlerAttacker = gActiveBattler;
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkED_802B4B4(void)
+static void atkEF_snatchsetbattlers(void)
{
- gEffectBank = gBankAttacker;
+ gEffectBattler = gBattlerAttacker;
- if (gBankAttacker == gBankTarget)
- gBankAttacker = gBankTarget = gBattleScripting.bank;
+ if (gBattlerAttacker == gBattlerTarget)
+ gBattlerAttacker = gBattlerTarget = gBattleScripting.battler;
else
- gBankTarget = gBattleScripting.bank;
+ gBattlerTarget = gBattleScripting.battler;
- gBattleScripting.bank = gEffectBank;
+ gBattleScripting.battler = gEffectBattler;
gBattlescriptCurrInstr++;
}
static void atkEE_removelightscreenreflect(void) // brick break
{
- u8 opposingSide = GetBankSide(gBankAttacker) ^ BIT_SIDE;
+ u8 opposingSide = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;
if (gSideTimers[opposingSide].reflectTimer || gSideTimers[opposingSide].lightscreenTimer)
{
- gSideAffecting[opposingSide] &= ~(SIDE_STATUS_REFLECT);
- gSideAffecting[opposingSide] &= ~(SIDE_STATUS_LIGHTSCREEN);
+ gSideStatuses[opposingSide] &= ~(SIDE_STATUS_REFLECT);
+ gSideStatuses[opposingSide] &= ~(SIDE_STATUS_LIGHTSCREEN);
gSideTimers[opposingSide].reflectTimer = 0;
gSideTimers[opposingSide].lightscreenTimer = 0;
gBattleScripting.animTurn = 1;
@@ -10676,26 +10089,26 @@ static void atkEE_removelightscreenreflect(void) // brick break
gBattlescriptCurrInstr++;
}
-static void atkEF_pokeball_catch_calculation(void)
+static void atkEF_handleballthrow(void)
{
u8 ballMultiplier = 0;
- if (gBattleExecBuffer)
+ if (gBattleControllerExecFlags)
return;
- gActiveBank = gBankAttacker;
- gBankTarget = gBankAttacker ^ BIT_SIDE;
+ gActiveBattler = gBattlerAttacker;
+ gBattlerTarget = gBattlerAttacker ^ BIT_SIDE;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
- EmitBallThrowAnim(0, BALL_TRAINER_BLOCK);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBallThrowAnim(0, BALL_TRAINER_BLOCK);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr = BattleScript_TrainerBallBlock;
}
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
{
- EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr = BattleScript_WallyBallThrow;
}
else
@@ -10704,33 +10117,30 @@ static void atkEF_pokeball_catch_calculation(void)
u8 catchRate;
if (gLastUsedItem == ITEM_SAFARI_BALL)
- catchRate = gBattleStruct->field_7C * 1275 / 100;
+ catchRate = gBattleStruct->safariCatchFactor * 1275 / 100;
else
- catchRate = gBaseStats[gBattleMons[gBankTarget].species].catchRate;
+ catchRate = gBaseStats[gBattleMons[gBattlerTarget].species].catchRate;
if (gLastUsedItem > ITEM_SAFARI_BALL)
{
switch (gLastUsedItem)
{
case ITEM_NET_BALL:
- if (gBattleMons[gBankTarget].type1 == TYPE_WATER
- || gBattleMons[gBankTarget].type2 == TYPE_WATER
- || gBattleMons[gBankTarget].type1 == TYPE_BUG
- || gBattleMons[gBankTarget].type2 == TYPE_BUG)
+ if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_WATER) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_BUG))
ballMultiplier = 30;
else
ballMultiplier = 10;
break;
case ITEM_DIVE_BALL:
- if (sav1_map_get_light_level() == 5)
+ if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER)
ballMultiplier = 35;
else
ballMultiplier = 10;
break;
case ITEM_NEST_BALL:
- if (gBattleMons[gBankTarget].level < 40)
+ if (gBattleMons[gBattlerTarget].level < 40)
{
- ballMultiplier = 40 - gBattleMons[gBankTarget].level;
+ ballMultiplier = 40 - gBattleMons[gBattlerTarget].level;
if (ballMultiplier <= 9)
ballMultiplier = 10;
}
@@ -10740,7 +10150,7 @@ static void atkEF_pokeball_catch_calculation(void)
}
break;
case ITEM_REPEAT_BALL:
- if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), FLAG_GET_CAUGHT))
+ if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT))
ballMultiplier = 30;
else
ballMultiplier = 10;
@@ -10760,12 +10170,12 @@ static void atkEF_pokeball_catch_calculation(void)
ballMultiplier = sBallCatchBonuses[gLastUsedItem - 2];
odds = (catchRate * ballMultiplier / 10)
- * (gBattleMons[gBankTarget].maxHP * 3 - gBattleMons[gBankTarget].hp * 2)
- / (3 * gBattleMons[gBankTarget].maxHP);
+ * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2)
+ / (3 * gBattleMons[gBattlerTarget].maxHP);
- if (gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE))
+ if (gBattleMons[gBattlerTarget].status1 & (STATUS1_SLEEP | STATUS1_FREEZE))
odds *= 2;
- if (gBattleMons[gBankTarget].status1 & (STATUS_POISON | STATUS_BURN | STATUS_PARALYSIS | STATUS_TOXIC_POISON))
+ if (gBattleMons[gBattlerTarget].status1 & (STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON))
odds = (odds * 15) / 10;
if (gLastUsedItem != ITEM_SAFARI_BALL)
@@ -10783,10 +10193,10 @@ static void atkEF_pokeball_catch_calculation(void)
if (odds > 254) // mon caught
{
- EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
- SetMonData(&gEnemyParty[gBattlePartyID[gBankTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
+ SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
if (CalculatePlayerPartyCount() == 6)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
@@ -10805,13 +10215,13 @@ static void atkEF_pokeball_catch_calculation(void)
if (gLastUsedItem == ITEM_MASTER_BALL)
shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check?
- EmitBallThrowAnim(0, shakes);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitBallThrowAnim(0, shakes);
+ MarkBattlerForControllerExec(gActiveBattler);
if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above
{
gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
- SetMonData(&gEnemyParty[gBattlePartyID[gBankTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
+ SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
if (CalculatePlayerPartyCount() == 6)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
@@ -10827,20 +10237,20 @@ static void atkEF_pokeball_catch_calculation(void)
}
}
-static void atkF0_give_caught_mon(void)
+static void atkF0_givecaughtmon(void)
{
- if (GiveMonToPlayer(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]]) != MON_GIVEN_TO_PARTY)
+ if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]) != MON_GIVEN_TO_PARTY)
{
if (!sub_813B21C())
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN)));
- GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2);
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2);
}
else
{
StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN)));
- GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2);
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2);
StringCopy(gStringVar3, GetBoxNamePtr(get_unknown_box_id()));
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
}
@@ -10849,21 +10259,21 @@ static void atkF0_give_caught_mon(void)
gBattleCommunication[MULTISTRING_CHOOSER]++;
}
- gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_SPECIES, NULL);
- GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick);
- gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_POKEBALL, NULL);
+ gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_SPECIES, NULL);
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick);
+ gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_POKEBALL, NULL);
gBattlescriptCurrInstr++;
}
-static void atkF1_set_caught_mon_dex_flags(void)
+static void atkF1_trysetcaughtmondexflags(void)
{
u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL);
u32 personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL);
if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -10872,14 +10282,14 @@ static void atkF1_set_caught_mon_dex_flags(void)
}
}
-static void atkF2_display_dex_info(void)
+static void atkF2_displaydexinfo(void)
{
u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL);
switch (gBattleCommunication[0])
{
case 0:
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
gBattleCommunication[0]++;
break;
case 1:
@@ -10887,8 +10297,8 @@ static void atkF2_display_dex_info(void)
{
FreeAllWindowBuffers();
gBattleCommunication[TASK_ID] = CreateDexDisplayMonDataTask(SpeciesToNationalPokedexNum(species),
- gBattleMons[gBankTarget].otId,
- gBattleMons[gBankTarget].personality);
+ gBattleMons[gBattlerTarget].otId,
+ gBattleMons[gBattlerTarget].personality);
gBattleCommunication[0]++;
}
break;
@@ -10991,13 +10401,13 @@ void BattleDestroyYesNoCursorAt(u8 cursorPosition)
CopyBgTilemapBufferToVram(0);
}
-static void atkF3_nickname_caught_poke(void)
+static void atkF3_trygivecaughtmonnick(void)
{
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
- BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC);
+ BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC);
gBattleCommunication[MULTIUSE_STATE]++;
gBattleCommunication[CURSOR_POSITION] = 0;
BattleCreateYesNoCursorAt(0);
@@ -11039,13 +10449,13 @@ static void atkF3_nickname_caught_poke(void)
case 2:
if (!gPaletteFade.active)
{
- GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick);
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick);
FreeAllWindowBuffers();
DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick,
- GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_SPECIES),
- GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]]),
- GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_PERSONALITY, NULL),
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_SPECIES),
+ GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]),
+ GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_PERSONALITY, NULL),
BattleMainCB2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -11054,47 +10464,47 @@ static void atkF3_nickname_caught_poke(void)
case 3:
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active )
{
- SetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick);
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
break;
case 4:
if (CalculatePlayerPartyCount() == 6)
gBattlescriptCurrInstr += 5;
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
break;
}
}
static void atkF4_subattackerhpbydmg(void)
{
- gBattleMons[gBankAttacker].hp -= gBattleMoveDamage;
+ gBattleMons[gBattlerAttacker].hp -= gBattleMoveDamage;
gBattlescriptCurrInstr++;
}
static void atkF5_removeattackerstatus1(void)
{
- gBattleMons[gBankAttacker].status1 = 0;
+ gBattleMons[gBattlerAttacker].status1 = 0;
gBattlescriptCurrInstr++;
}
-static void atkF6_action_finished(void)
+static void atkF6_finishaction(void)
{
- gCurrentActionFuncId = ACTION_FINISHED;
+ gCurrentActionFuncId = B_ACTION_FINISHED;
}
-static void atkF7_turn_finished(void)
+static void atkF7_finishturn(void)
{
- gCurrentActionFuncId = ACTION_FINISHED;
- gCurrentTurnActionNumber = gNoOfAllBanks;
+ gCurrentActionFuncId = B_ACTION_FINISHED;
+ gCurrentTurnActionNumber = gBattlersCount;
}
-static void atkF8_trainer_slide_back(void)
+static void atkF8_trainerslideout(void)
{
- gActiveBank = GetBankByIdentity(gBattlescriptCurrInstr[1]);
- EmitTrainerSlideBack(0);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]);
+ BtlController_EmitTrainerSlideBack(0);
+ MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 2;
}
diff --git a/src/battle_setup.c b/src/battle_setup.c
new file mode 100644
index 000000000..e478af936
--- /dev/null
+++ b/src/battle_setup.c
@@ -0,0 +1,1868 @@
+#include "global.h"
+#include "constants/trainers.h"
+#include "battle.h"
+#include "battle_setup.h"
+#include "battle_transition.h"
+#include "main.h"
+#include "task.h"
+#include "safari_zone.h"
+#include "script.h"
+#include "constants/game_stat.h"
+#include "event_data.h"
+#include "constants/species.h"
+#include "constants/songs.h"
+#include "metatile_behavior.h"
+#include "constants/maps.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "random.h"
+#include "starter_choose.h"
+#include "script_pokemon_80F8.h"
+#include "constants/items.h"
+#include "palette.h"
+#include "window.h"
+#include "event_object_movement.h"
+#include "event_scripts.h"
+#include "trainer_see.h"
+#include "field_message_box.h"
+#include "sound.h"
+#include "strings.h"
+#include "secret_base.h"
+#include "string_util.h"
+#include "overworld.h"
+#include "field_weather.h"
+#include "gym_leader_rematch.h"
+#include "constants/map_types.h"
+
+enum
+{
+ TRAINER_PARAM_LOAD_VAL_8BIT,
+ TRAINER_PARAM_LOAD_VAL_16BIT,
+ TRAINER_PARAM_LOAD_VAL_32BIT,
+ TRAINER_PARAM_CLEAR_VAL_8BIT,
+ TRAINER_PARAM_CLEAR_VAL_16BIT,
+ TRAINER_PARAM_CLEAR_VAL_32BIT,
+ TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR,
+};
+
+struct TrainerBattleParameter
+{
+ void *varPtr;
+ u8 ptrType;
+};
+
+extern bool8 InBattlePyramid(void);
+extern bool8 InBattlePike(void);
+extern bool32 InTrainerHill(void);
+extern bool32 FieldPoisonEffectIsRunning(void);
+extern void prev_quest_postbuffer_cursor_backup_reset(void);
+extern void ResetPoisonStepCounter(void);
+extern void sub_81BE72C(void);
+extern void sub_808BCF4(void);
+extern void sub_80EECC8(void);
+extern void sub_80AF6F0(void);
+extern u16 sub_81A9AA8(u8 localId);
+extern u16 sub_81D6180(u8 localId);
+extern bool8 GetBattlePyramidTrainerFlag(u8 eventObjId);
+extern bool8 GetTrainerHillTrainerFlag(u8 eventObjId);
+extern bool8 sub_81D5C18(void);
+extern void sub_816306C(u8 a0);
+extern void sub_8163048(u8 a0);
+extern void sub_81A9B04(void);
+extern void sub_81D639C(void);
+extern void sub_81D6384(void);
+extern void sub_81D61E8(void);
+extern void sub_80982B8(void);
+extern void sub_81A9EDC(u16 a0);
+extern void sub_81D572C(u8 a0, u16 arg1);
+
+// this file's functions
+static void DoBattlePikeWildBattle(void);
+static void DoSafariBattle(void);
+static void DoStandardWildBattle(void);
+static void CB2_EndWildBattle(void);
+static void CB2_EndScriptedWildBattle(void);
+static u8 GetWildBattleTransition(void);
+static u8 GetTrainerBattleTransition(void);
+static void sub_80B1218(void);
+static void sub_80B1234(void);
+static void CB2_GiveStarter(void);
+static void CB2_StartFirstBattle(void);
+static void CB2_EndFirstBattle(void);
+static void CB2_EndTrainerBattle(void);
+static bool32 IsPlayerDefeated(u32 battleOutcome);
+static u16 GetRematchTrainerId(u16 trainerId);
+static void RegisterTrainerInMatchCall(void);
+static void HandleRematchVarsOnBattleEnd(void);
+static const u8 *GetIntroSpeechOfApproachingTrainer(void);
+static const u8 *GetTrainerCantBattleSpeech(void);
+
+// ewram vars
+EWRAM_DATA static u16 sTrainerBattleMode = 0;
+EWRAM_DATA u16 gTrainerBattleOpponent_A = 0;
+EWRAM_DATA u16 gTrainerBattleOpponent_B = 0;
+EWRAM_DATA u16 gPartnerTrainerId = 0;
+EWRAM_DATA static u16 sTrainerEventObjectLocalId = 0;
+EWRAM_DATA static u8 *sTrainerAIntroSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerBIntroSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerADefeatSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerBDefeatSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerVictorySpeech = NULL;
+EWRAM_DATA static u8 *sTrainerCannotBattleSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerBattleEndScript = NULL;
+EWRAM_DATA static u8 *sTrainerABattleScriptRetAddr = NULL;
+EWRAM_DATA static u8 *sTrainerBBattleScriptRetAddr = NULL;
+EWRAM_DATA static bool8 sShouldCheckTrainerBScript = FALSE;
+EWRAM_DATA static u8 sNoOfPossibleTrainerRetScripts = 0;
+
+// const rom data
+
+// The first transition is used if the enemy pokemon are lower level than our pokemon.
+// Otherwise, the second transition is used.
+static const u8 sBattleTransitionTable_Wild[][2] =
+{
+ {B_TRANSITION_SLICE, B_TRANSITION_WHITEFADE}, // Normal
+ {B_TRANSITION_CLOCKWISE_BLACKFADE, B_TRANSITION_GRID_SQUARES}, // Cave
+ {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, // Cave with flash used
+ {B_TRANSITION_WAVE, B_TRANSITION_RIPPLE}, // Water
+};
+
+static const u8 sBattleTransitionTable_Trainer[][2] =
+{
+ {B_TRANSITION_POKEBALLS_TRAIL, B_TRANSITION_SHARDS}, // Normal
+ {B_TRANSITION_SHUFFLE, B_TRANSITION_BIG_POKEBALL}, // Cave
+ {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, // Cave with flash used
+ {B_TRANSITION_SWIRL, B_TRANSITION_RIPPLE}, // Water
+};
+
+static const u8 sUnknown_0854FE98[] =
+{
+ B_TRANSITION_29, B_TRANSITION_30, B_TRANSITION_31, B_TRANSITION_32,
+ B_TRANSITION_34, B_TRANSITION_35, B_TRANSITION_36, B_TRANSITION_37,
+ B_TRANSITION_38, B_TRANSITION_39, B_TRANSITION_40, B_TRANSITION_41
+};
+
+static const u8 sUnknown_0854FEA4[] =
+{
+ B_TRANSITION_31, B_TRANSITION_32, B_TRANSITION_33
+};
+
+static const u8 sUnknown_0854FEA7[] =
+{
+ B_TRANSITION_29, B_TRANSITION_31, B_TRANSITION_32, B_TRANSITION_33
+};
+
+static const struct TrainerBattleParameter sOrdinaryBattleParams[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+static const struct TrainerBattleParameter sContinueScriptBattleParams[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+static const struct TrainerBattleParameter sDoubleBattleParams[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerABattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBBattleScriptRetAddr, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] =
+{
+ {{TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5}, 0x0, 0x21},
+ {{TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5}, 0x0, 0x14},
+ {{TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5}, 0x0, 0x1a},
+ {{TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5}, 0x0, 0x18},
+ {{TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5}, 0x0, 0x18},
+ {{TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5}, 0x0, 0x27},
+ {{TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5}, 0x0, 0x24},
+ {{TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5}, 0x0, 0x1a},
+ {{TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5}, 0x0, 0x1a},
+ {{TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5}, 0x18, 0x14},
+ {{TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6}, 0x0, 0x13},
+ {{TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5}, 0x18, 0x38},
+ {{TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5}, 0x0, 0x24},
+ {{TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5}, 0x0, 0x13},
+ {{TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5}, 0x0, 0x1d},
+ {{TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5}, 0x0, 0x16},
+ {{TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5}, 0x0, 0x1e},
+ {{TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5}, 0x0, 0x2a},
+ {{TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5}, 0x0, 0x26},
+ {{TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5}, 0x0, 0x21},
+ {{TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5}, 0x0, 0x1d},
+ {{TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5}, 0x18, 0xd},
+ {{TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5}, 0x18, 0x1},
+ {{TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5}, 0x0, 0x23},
+ {{TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5}, 0x0, 0x26},
+ {{TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5}, 0x0, 0x26},
+ {{TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5}, 0x0, 0x24},
+ {{TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5}, 0x0, 0x1f},
+ {{TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5}, 0x0, 0x1f},
+ {{TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5}, 0x0, 0x20},
+ {{TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5}, 0x0, 0x19},
+ {{TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5}, 0x0, 0x12},
+ {{TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5}, 0x0, 0x1e},
+ {{TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5}, 0x18, 0xc},
+ {{TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5}, 0x0, 0x11},
+ {{TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5}, 0x0, 0x15},
+ {{TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5}, 0x0, 0x2b},
+ {{TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5}, 0x0, 0x20},
+ {{TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5}, 0x0, 0x19},
+ {{TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5}, 0x0, 0x20},
+ {{TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5}, 0x0, 0x2b},
+ {{TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5}, 0x0, 0x19},
+ {{TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5}, 0x0, 0x29},
+ {{TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5}, 0x18, 0x1},
+ {{TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5}, 0x0, 0x23},
+ {{TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5}, 0x0, 0x1c},
+ {{TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5}, 0x0, 0x1e},
+ {{TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5}, 0x0, 0x1c},
+ {{TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5}, 0x0, 0x27},
+ {{TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5}, 0x18, 0xd},
+ {{TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6}, 0x0, 0x12},
+ {{TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5}, 0x0, 0x28},
+ {{TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5}, 0x0, 0x17},
+ {{TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5}, 0x0, 0x19},
+ {{TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5}, 0x0, 0x20},
+ {{TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5}, 0x0, 0x20},
+ {{TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5}, 0x18, 0x11},
+ {{TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5}, 0x0, 0x22},
+ {{TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5}, 0x0, 0x22},
+ {{TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5}, 0x0, 0x13},
+ {{TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5}, 0x18, 0xb},
+ {{TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5}, 0x0, 0x1b},
+ {{TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5}, 0x18, 0xc},
+ {{TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5}, 0x18, 0x3e},
+ {{TRAINER_WALLY_3, 0x292, 0x293, 0x294, 0x294}, 0x18, 0x2b},
+ {{TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5}, 0x0, 0x3},
+ {{TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5}, 0x0, 0xb},
+ {{TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5}, 0x0, 0x2},
+ {{TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5}, 0x0, 0xc},
+ {{TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5}, 0x0, 0x0},
+ {{TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5}, 0x0, 0x4},
+ {{TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5}, 0x0, 0x6},
+ {{TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5}, 0x0, 0x7},
+ {{TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY}, 0x0, 0x8},
+ {{TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE}, 0x0, 0x8},
+ {{TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA}, 0x0, 0x8},
+ {{TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE}, 0x0, 0x8},
+ {{TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE}, 0x0, 0x8},
+};
+
+static const u16 sBadgeFlags[8] =
+{
+ FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET,
+ FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET,
+};
+
+#define tState data[0]
+#define tTransition data[1]
+
+static void Task_BattleStart(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (tState)
+ {
+ case 0:
+ if (!FieldPoisonEffectIsRunning()) // is poison not active?
+ {
+ BattleTransition_StartOnField(tTransition);
+ sub_81BE72C();
+ tState++; // go to case 1.
+ }
+ break;
+ case 1:
+ if (IsBattleTransitionDone() == TRUE)
+ {
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_InitBattle);
+ prev_quest_postbuffer_cursor_backup_reset();
+ ResetPoisonStepCounter();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void CreateBattleStartTask(u8 transition, u16 song)
+{
+ u8 taskId = CreateTask(Task_BattleStart, 1);
+
+ gTasks[taskId].tTransition = transition;
+ PlayMapChosenOrBattleBGM(song);
+}
+
+#undef tState
+#undef tTransition
+
+void BattleSetup_StartWildBattle(void)
+{
+ if (GetSafariZoneFlag())
+ DoSafariBattle();
+ else
+ DoStandardWildBattle();
+}
+
+void BattleSetup_StartBattlePikeWildBattle(void)
+{
+ DoBattlePikeWildBattle();
+}
+
+static void DoStandardWildBattle(void)
+{
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ sub_808BCF4();
+ gMain.savedCallback = CB2_EndWildBattle;
+ gBattleTypeFlags = 0;
+ if (InBattlePyramid())
+ {
+ VarSet(VAR_TEMP_E, 0);
+ gBattleTypeFlags |= BATTLE_TYPE_PYRAMID;
+ }
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+void BattleSetup_StartRoamerBattle(void)
+{
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ sub_808BCF4();
+ gMain.savedCallback = CB2_EndWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_ROAMER;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+static void DoSafariBattle(void)
+{
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ sub_808BCF4();
+ gMain.savedCallback = CB2_EndSafariBattle;
+ gBattleTypeFlags = BATTLE_TYPE_SAFARI;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+}
+
+static void DoBattlePikeWildBattle(void)
+{
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ sub_808BCF4();
+ gMain.savedCallback = CB2_EndWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_PIKE;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+static void DoTrainerBattle(void)
+{
+ CreateBattleStartTask(GetTrainerBattleTransition(), 0);
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_TRAINER_BATTLES);
+ sub_80B1234();
+}
+
+static void sub_80B0828(void)
+{
+ if (InBattlePyramid())
+ CreateBattleStartTask(sub_80B100C(10), 0);
+ else
+ CreateBattleStartTask(sub_80B100C(11), 0);
+
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_TRAINER_BATTLES);
+ sub_80B1234();
+}
+
+// Initiates battle where Wally catches Ralts
+void StartWallyTutorialBattle(void)
+{
+ CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5);
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_ReturnToFieldContinueScriptPlayMapMusic;
+ gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL;
+ CreateBattleStartTask(B_TRANSITION_SLICE, 0);
+}
+
+void BattleSetup_StartScriptedWildBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = 0;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+void BattleSetup_StartLatiBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+void BattleSetup_StartLegendaryBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
+
+ switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL))
+ {
+ default:
+ case SPECIES_GROUDON:
+ gBattleTypeFlags |= BATTLE_TYPE_GROUDON;
+ CreateBattleStartTask(B_TRANSITION_GROUDON, MUS_BATTLE34);
+ break;
+ case SPECIES_KYOGRE:
+ gBattleTypeFlags |= BATTLE_TYPE_KYOGRE;
+ CreateBattleStartTask(B_TRANSITION_KYOGRE, MUS_BATTLE34);
+ break;
+ case SPECIES_RAYQUAZA:
+ gBattleTypeFlags |= BATTLE_TYPE_RAYQUAZA;
+ CreateBattleStartTask(B_TRANSITION_RAYQUAZA, MUS_VS_REKKU);
+ break;
+ case SPECIES_DEOXYS:
+ CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RG_VS_DEO);
+ break;
+ case SPECIES_LUGIA:
+ case SPECIES_HO_OH:
+ CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RG_VS_DEN);
+ break;
+ case SPECIES_MEW:
+ CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, MUS_VS_MEW);
+ break;
+ }
+
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+void StartGroudonKyogreBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON;
+
+ if (gGameVersion == VERSION_RUBY)
+ CreateBattleStartTask(B_TRANSITION_SHARDS, MUS_BATTLE34); // GROUDON
+ else
+ CreateBattleStartTask(B_TRANSITION_RIPPLE, MUS_BATTLE34); // KYOGRE
+
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+void StartRegiBattle(void)
+{
+ u8 transitionId;
+ u16 species;
+
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI;
+
+ species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES);
+ switch (species)
+ {
+ case SPECIES_REGIROCK:
+ transitionId = B_TRANSITION_REGIROCK;
+ break;
+ case SPECIES_REGICE:
+ transitionId = B_TRANSITION_REGICE;
+ break;
+ case SPECIES_REGISTEEL:
+ transitionId = B_TRANSITION_REGISTEEL;
+ break;
+ default:
+ transitionId = B_TRANSITION_GRID_SQUARES;
+ break;
+ }
+ CreateBattleStartTask(transitionId, MUS_BATTLE36);
+
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+}
+
+static void CB2_EndWildBattle(void)
+{
+ CpuFill16(0, (void*)(BG_PLTT), BG_PLTT_SIZE);
+ ResetOamRange(0, 128);
+
+ if (IsPlayerDefeated(gBattleOutcome) == TRUE && !InBattlePyramid() && !InBattlePike())
+ {
+ SetMainCallback2(CB2_WhiteOut);
+ }
+ else
+ {
+ SetMainCallback2(CB2_ReturnToField);
+ gFieldCallback = sub_80AF6F0;
+ }
+}
+
+static void CB2_EndScriptedWildBattle(void)
+{
+ CpuFill16(0, (void*)(BG_PLTT), BG_PLTT_SIZE);
+ ResetOamRange(0, 128);
+
+ if (IsPlayerDefeated(gBattleOutcome) == TRUE)
+ {
+ if (InBattlePyramid())
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ else
+ SetMainCallback2(CB2_WhiteOut);
+ }
+ else
+ {
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ }
+}
+
+u8 BattleSetup_GetTerrainId(void)
+{
+ u16 tileBehavior;
+ s16 x, y;
+
+ PlayerGetDestCoords(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (MetatileBehavior_IsTallGrass(tileBehavior))
+ return BATTLE_TERRAIN_GRASS;
+ if (MetatileBehavior_IsLongGrass(tileBehavior))
+ return BATTLE_TERRAIN_LONG_GRASS;
+ if (MetatileBehavior_IsSandOrDeepSand(tileBehavior))
+ return BATTLE_TERRAIN_SAND;
+
+ switch (gMapHeader.mapType)
+ {
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ break;
+ case MAP_TYPE_UNDERGROUND:
+ if (MetatileBehavior_IsMB_0B(tileBehavior))
+ return BATTLE_TERRAIN_BUILDING;
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ return BATTLE_TERRAIN_POND;
+ return BATTLE_TERRAIN_CAVE;
+ case MAP_TYPE_INDOOR:
+ case MAP_TYPE_SECRET_BASE:
+ return BATTLE_TERRAIN_BUILDING;
+ case MAP_TYPE_UNDERWATER:
+ return BATTLE_TERRAIN_UNDERWATER;
+ case MAP_TYPE_6:
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ return BATTLE_TERRAIN_WATER;
+ return BATTLE_TERRAIN_PLAIN;
+ }
+ if (MetatileBehavior_IsDeepOrOceanWater(tileBehavior))
+ return BATTLE_TERRAIN_WATER;
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ return BATTLE_TERRAIN_POND;
+ if (MetatileBehavior_IsMountain(tileBehavior))
+ return BATTLE_TERRAIN_MOUNTAIN;
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ {
+ if (MetatileBehavior_GetBridgeSth(tileBehavior))
+ return BATTLE_TERRAIN_POND;
+ if (MetatileBehavior_IsBridge(tileBehavior) == TRUE)
+ return BATTLE_TERRAIN_WATER;
+ }
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE113) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE113))
+ return BATTLE_TERRAIN_SAND;
+ if (GetSav1Weather() == 8)
+ return BATTLE_TERRAIN_SAND;
+
+ return BATTLE_TERRAIN_PLAIN;
+}
+
+static u8 GetBattleTransitionTypeByMap(void)
+{
+ u16 tileBehavior;
+ s16 x, y;
+
+ PlayerGetDestCoords(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (Overworld_GetFlashLevel())
+ return B_TRANSITION_SHUFFLE;
+ if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ {
+ switch (gMapHeader.mapType)
+ {
+ case MAP_TYPE_UNDERGROUND:
+ return B_TRANSITION_SWIRL;
+ case MAP_TYPE_UNDERWATER:
+ return B_TRANSITION_BIG_POKEBALL;
+ default:
+ return B_TRANSITION_BLUR;
+ }
+ }
+ return B_TRANSITION_BIG_POKEBALL;
+}
+
+static u16 GetSumOfPlayerPartyLevel(u8 numMons)
+{
+ u8 sum = 0;
+ int i;
+
+ for (i = 0; i < PARTY_SIZE; 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);
+ if (--numMons == 0)
+ break;
+ }
+ }
+ return sum;
+}
+
+static u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons)
+{
+ u8 i;
+ u8 sum;
+ u32 count = numMons;
+
+ if (gTrainers[opponentId].partySize < count)
+ count = gTrainers[opponentId].partySize;
+
+ sum = 0;
+
+ switch (gTrainers[opponentId].partyFlags)
+ {
+ case 0:
+ {
+ const struct TrainerMonNoItemDefaultMoves *party;
+ party = gTrainers[opponentId].party.NoItemDefaultMoves;
+ for (i = 0; i < count; i++)
+ sum += party[i].lvl;
+ }
+ break;
+ case F_TRAINER_PARTY_CUSTOM_MOVESET:
+ {
+ const struct TrainerMonNoItemCustomMoves *party;
+ party = gTrainers[opponentId].party.NoItemCustomMoves;
+ for (i = 0; i < count; i++)
+ sum += party[i].lvl;
+ }
+ break;
+ case F_TRAINER_PARTY_HELD_ITEM:
+ {
+ const struct TrainerMonItemDefaultMoves *party;
+ party = gTrainers[opponentId].party.ItemDefaultMoves;
+ for (i = 0; i < count; i++)
+ sum += party[i].lvl;
+ }
+ break;
+ case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM:
+ {
+ const struct TrainerMonItemCustomMoves *party;
+ party = gTrainers[opponentId].party.ItemCustomMoves;
+ for (i = 0; i < count; i++)
+ sum += party[i].lvl;
+ }
+ break;
+ }
+
+ return sum;
+}
+
+static u8 GetWildBattleTransition(void)
+{
+ u8 transitionType = GetBattleTransitionTypeByMap();
+ u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
+ u8 playerLevel = GetSumOfPlayerPartyLevel(1);
+
+ if (enemyLevel < playerLevel)
+ {
+ if (InBattlePyramid())
+ return B_TRANSITION_BLUR;
+ else
+ return sBattleTransitionTable_Wild[transitionType][0];
+ }
+ else
+ {
+ if (InBattlePyramid())
+ return B_TRANSITION_GRID_SQUARES;
+ else
+ return sBattleTransitionTable_Wild[transitionType][1];
+ }
+}
+
+static u8 GetTrainerBattleTransition(void)
+{
+ u8 minPartyCount;
+ u8 transitionType;
+ u8 enemyLevel;
+ u8 playerLevel;
+
+ if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)
+ return B_TRANSITION_CHAMPION;
+
+ if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR)
+ {
+ if (gTrainerBattleOpponent_A == TRAINER_SIDNEY)
+ return B_TRANSITION_SYDNEY;
+ if (gTrainerBattleOpponent_A == TRAINER_PHOEBE)
+ return B_TRANSITION_PHOEBE;
+ if (gTrainerBattleOpponent_A == TRAINER_GLACIA)
+ return B_TRANSITION_GLACIA;
+ if (gTrainerBattleOpponent_A == TRAINER_DRAKE)
+ return B_TRANSITION_DRAKE;
+ return B_TRANSITION_CHAMPION;
+ }
+
+ if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)
+ return B_TRANSITION_CHAMPION;
+
+ if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_TEAM_MAGMA
+ || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_MAGMA_LEADER
+ || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_MAGMA_ADMIN)
+ return B_TRANSITION_MAGMA;
+
+ if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_TEAM_AQUA
+ || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_AQUA_LEADER
+ || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_AQUA_ADMIN)
+ return B_TRANSITION_AQUA;
+
+ if (gTrainers[gTrainerBattleOpponent_A].doubleBattle == TRUE)
+ minPartyCount = 2; // double battles always at least have 2 pokemon.
+ else
+ minPartyCount = 1;
+
+ transitionType = GetBattleTransitionTypeByMap();
+ enemyLevel = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent_A, minPartyCount);
+ playerLevel = GetSumOfPlayerPartyLevel(minPartyCount);
+
+ if (enemyLevel < playerLevel)
+ return sBattleTransitionTable_Trainer[transitionType][0];
+ else
+ return sBattleTransitionTable_Trainer[transitionType][1];
+}
+
+u8 sub_80B100C(s32 arg0)
+{
+ u16 var;
+ u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
+ u8 playerLevel = GetSumOfPlayerPartyLevel(1);
+
+ if (enemyLevel < playerLevel)
+ {
+ switch (arg0)
+ {
+ case 11:
+ case 12:
+ case 13:
+ return B_TRANSITION_POKEBALLS_TRAIL;
+ case 10:
+ return sUnknown_0854FEA4[Random() % ARRAY_COUNT(sUnknown_0854FEA4)];
+ case 3:
+ return sUnknown_0854FEA7[Random() % ARRAY_COUNT(sUnknown_0854FEA7)];
+ }
+
+ if (VarGet(VAR_0x40CE) != 3)
+ return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)];
+ }
+ else
+ {
+ switch (arg0)
+ {
+ case 11:
+ case 12:
+ case 13:
+ return B_TRANSITION_BIG_POKEBALL;
+ case 10:
+ return sUnknown_0854FEA4[Random() % ARRAY_COUNT(sUnknown_0854FEA4)];
+ case 3:
+ return sUnknown_0854FEA7[Random() % ARRAY_COUNT(sUnknown_0854FEA7)];
+ }
+
+ if (VarGet(VAR_0x40CE) != 3)
+ return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)];
+ }
+
+ var = gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.field_CB2 * 2 + 0]
+ + gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.field_CB2 * 2 + 1];
+
+ return sUnknown_0854FE98[var % ARRAY_COUNT(sUnknown_0854FE98)];
+}
+
+void ChooseStarter(void)
+{
+ SetMainCallback2(CB2_ChooseStarter);
+ gMain.savedCallback = CB2_GiveStarter;
+}
+
+static void CB2_GiveStarter(void)
+{
+ u16 starterMon;
+
+ *GetVarPointer(VAR_FIRST_POKE) = gSpecialVar_Result;
+ starterMon = GetStarterPokemon(gSpecialVar_Result);
+ ScriptGiveMon(starterMon, 5, 0, 0, 0, 0);
+ ResetTasks();
+ PlayBattleBGM();
+ SetMainCallback2(CB2_StartFirstBattle);
+ BattleTransition_Start(B_TRANSITION_BLUR);
+}
+
+static void CB2_StartFirstBattle(void)
+{
+ UpdatePaletteFade();
+ RunTasks();
+
+ if (IsBattleTransitionDone() == TRUE)
+ {
+ gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE;
+ gMain.savedCallback = CB2_EndFirstBattle;
+ FreeAllWindowBuffers();
+ SetMainCallback2(CB2_InitBattle);
+ prev_quest_postbuffer_cursor_backup_reset();
+ ResetPoisonStepCounter();
+ IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
+ IncrementGameStat(GAME_STAT_WILD_BATTLES);
+ sub_80EECC8();
+ sub_80B1218();
+ }
+}
+
+static void CB2_EndFirstBattle(void)
+{
+ Overworld_ClearSavedMusic();
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+static void sub_80B1218(void)
+{
+ if (GetGameStat(GAME_STAT_WILD_BATTLES) % 60 == 0)
+ UpdateGymLeaderRematch();
+}
+
+static void sub_80B1234(void)
+{
+ if (GetGameStat(GAME_STAT_TRAINER_BATTLES) % 20 == 0)
+ UpdateGymLeaderRematch();
+}
+
+// why not just use the macros? maybe its because they didnt want to uncast const every time?
+static u32 TrainerBattleLoadArg32(const u8 *ptr)
+{
+ return T1_READ_32(ptr);
+}
+
+static u16 TrainerBattleLoadArg16(const u8 *ptr)
+{
+ return T1_READ_16(ptr);
+}
+
+static u8 TrainerBattleLoadArg8(const u8 *ptr)
+{
+ return T1_READ_8(ptr);
+}
+
+static u16 GetTrainerAFlag(void)
+{
+ return FLAG_TRAINER_FLAG_START + gTrainerBattleOpponent_A;
+}
+
+static u16 GetTrainerBFlag(void)
+{
+ return FLAG_TRAINER_FLAG_START + gTrainerBattleOpponent_B;
+}
+
+static bool32 IsPlayerDefeated(u32 battleOutcome)
+{
+ switch (battleOutcome)
+ {
+ case B_OUTCOME_LOST:
+ case B_OUTCOME_DREW:
+ return TRUE;
+ case B_OUTCOME_WON:
+ case B_OUTCOME_RAN:
+ case B_OUTCOME_PLAYER_TELEPORTED:
+ case B_OUTCOME_MON_FLED:
+ case B_OUTCOME_CAUGHT:
+ return FALSE;
+ default:
+ return FALSE;
+ }
+}
+
+void ResetTrainerOpponentIds(void)
+{
+ gTrainerBattleOpponent_A = 0;
+ gTrainerBattleOpponent_B = 0;
+}
+
+static void InitTrainerBattleVariables(void)
+{
+ sTrainerBattleMode = 0;
+ if (gApproachingTrainerId == 0)
+ {
+ sTrainerAIntroSpeech = NULL;
+ sTrainerADefeatSpeech = NULL;
+ sTrainerABattleScriptRetAddr = NULL;
+ }
+ else
+ {
+ sTrainerBIntroSpeech = NULL;
+ sTrainerBDefeatSpeech = NULL;
+ sTrainerBBattleScriptRetAddr = NULL;
+ }
+ sTrainerEventObjectLocalId = 0;
+ sTrainerVictorySpeech = NULL;
+ sTrainerCannotBattleSpeech = NULL;
+ sTrainerBattleEndScript = NULL;
+}
+
+static inline void SetU8(void *ptr, u8 value)
+{
+ *(u8*)(ptr) = value;
+}
+
+static inline void SetU16(void *ptr, u16 value)
+{
+ *(u16*)(ptr) = value;
+}
+
+static inline void SetU32(void *ptr, u32 value)
+{
+ *(u32*)(ptr) = value;
+}
+
+static inline void SetPtr(const void *ptr, const void* value)
+{
+ *(const void**)(ptr) = value;
+}
+
+static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data)
+{
+ while (1)
+ {
+ switch (specs->ptrType)
+ {
+ case TRAINER_PARAM_LOAD_VAL_8BIT:
+ SetU8(specs->varPtr, TrainerBattleLoadArg8(data));
+ data += 1;
+ break;
+ case TRAINER_PARAM_LOAD_VAL_16BIT:
+ SetU16(specs->varPtr, TrainerBattleLoadArg16(data));
+ data += 2;
+ break;
+ case TRAINER_PARAM_LOAD_VAL_32BIT:
+ SetU32(specs->varPtr, TrainerBattleLoadArg32(data));
+ data += 4;
+ break;
+ case TRAINER_PARAM_CLEAR_VAL_8BIT:
+ SetU8(specs->varPtr, 0);
+ break;
+ case TRAINER_PARAM_CLEAR_VAL_16BIT:
+ SetU16(specs->varPtr, 0);
+ break;
+ case TRAINER_PARAM_CLEAR_VAL_32BIT:
+ SetU32(specs->varPtr, 0);
+ break;
+ case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR:
+ SetPtr(specs->varPtr, data);
+ return;
+ }
+ specs++;
+ }
+}
+
+void SetMapVarsToTrainer(void)
+{
+ if (sTrainerEventObjectLocalId != 0)
+ {
+ gSpecialVar_LastTalked = sTrainerEventObjectLocalId;
+ gSelectedEventObject = GetEventObjectIdByLocalIdAndMap(sTrainerEventObjectLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ }
+}
+
+const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
+{
+ InitTrainerBattleVariables();
+ sTrainerBattleMode = TrainerBattleLoadArg8(data);
+
+ switch (sTrainerBattleMode)
+ {
+ case TRAINER_BATTLE_NORMAL_NO_INTRO_TEXT:
+ TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data);
+ return EventScript_2713C2;
+ case TRAINER_BATTLE_DOUBLE:
+ TrainerBattleLoadArgs(sDoubleBattleParams, data);
+ SetMapVarsToTrainer();
+ return EventScript_TryDoDoubleTrainerBattle;
+ case TRAINER_BATTLE_CONTINUE_SCRIPT:
+ if (gApproachingTrainerId == 0)
+ {
+ TrainerBattleLoadArgs(sContinueScriptBattleParams, data);
+ SetMapVarsToTrainer();
+ }
+ else
+ {
+ TrainerBattleLoadArgs(sTrainerBContinueScriptBattleParams, data);
+ }
+ return EventScript_271362;
+ case TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC:
+ TrainerBattleLoadArgs(sContinueScriptBattleParams, data);
+ SetMapVarsToTrainer();
+ return EventScript_271362;
+ case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE:
+ case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC:
+ TrainerBattleLoadArgs(sContinueScriptDoubleBattleParams, data);
+ SetMapVarsToTrainer();
+ return EventScript_TryDoDoubleTrainerBattle;
+ case TRAINER_BATTLE_REMATCH_DOUBLE:
+ TrainerBattleLoadArgs(sDoubleBattleParams, data);
+ SetMapVarsToTrainer();
+ gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A);
+ return EventScript_TryDoDoubleRematchBattle;
+ case TRAINER_BATTLE_REMATCH:
+ TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
+ SetMapVarsToTrainer();
+ gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A);
+ return EventScript_2713D1;
+ case TRAINER_BATTLE_9:
+ if (gApproachingTrainerId == 0)
+ {
+ TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
+ SetMapVarsToTrainer();
+ gTrainerBattleOpponent_A = sub_81A9AA8(gSpecialVar_LastTalked);
+ }
+ else
+ {
+ TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data);
+ gTrainerBattleOpponent_B = sub_81A9AA8(gSpecialVar_LastTalked);
+ }
+ return EventScript_271362;
+ case TRAINER_BATTLE_SET_TRAINER_A:
+ TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
+ return NULL;
+ case TRAINER_BATTLE_SET_TRAINER_B:
+ TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data);
+ return NULL;
+ case TRAINER_BATTLE_12:
+ if (gApproachingTrainerId == 0)
+ {
+ TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
+ SetMapVarsToTrainer();
+ gTrainerBattleOpponent_A = sub_81D6180(gSpecialVar_LastTalked);
+ }
+ else
+ {
+ TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data);
+ gTrainerBattleOpponent_B = sub_81D6180(gSpecialVar_LastTalked);
+ }
+ return EventScript_271362;
+ default:
+ if (gApproachingTrainerId == 0)
+ {
+ TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
+ SetMapVarsToTrainer();
+ }
+ else
+ {
+ TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data);
+ }
+ return EventScript_271362;
+ }
+}
+
+void ConfigureAndSetUpOneTrainerBattle(u8 trainerEventObjId, const u8 *trainerScript)
+{
+ gSelectedEventObject = trainerEventObjId;
+ gSpecialVar_LastTalked = gEventObjects[trainerEventObjId].localId;
+ BattleSetup_ConfigureTrainerBattle(trainerScript + 1);
+ ScriptContext1_SetupScript(EventScript_271354);
+ ScriptContext2_Enable();
+}
+
+void ConfigureTwoTrainersBattle(u8 trainerEventObjId, const u8 *trainerScript)
+{
+ gSelectedEventObject = trainerEventObjId;
+ gSpecialVar_LastTalked = gEventObjects[trainerEventObjId].localId;
+ BattleSetup_ConfigureTrainerBattle(trainerScript + 1);
+}
+
+void SetUpTwoTrainersBattle(void)
+{
+ ScriptContext1_SetupScript(EventScript_271354);
+ ScriptContext2_Enable();
+}
+
+bool32 GetTrainerFlagFromScriptPointer(const u8 *data)
+{
+ u32 flag = TrainerBattleLoadArg16(data + 2);
+ return FlagGet(FLAG_TRAINER_FLAG_START + flag);
+}
+
+void sub_80B16D8(void)
+{
+ struct EventObject *eventObject = &gEventObjects[gSelectedEventObject];
+
+ SetTrainerMovementType(eventObject, GetTrainerFacingDirectionMovementType(eventObject->facingDirection));
+}
+
+u8 GetTrainerBattleMode(void)
+{
+ return sTrainerBattleMode;
+}
+
+bool8 GetTrainerFlag(void)
+{
+ if (InBattlePyramid())
+ return GetBattlePyramidTrainerFlag(gSelectedEventObject);
+ else if (InTrainerHill())
+ return GetTrainerHillTrainerFlag(gSelectedEventObject);
+ else
+ return FlagGet(GetTrainerAFlag());
+}
+
+static void SetBattledTrainersFlags(void)
+{
+ if (gTrainerBattleOpponent_B != 0)
+ FlagSet(GetTrainerBFlag());
+ FlagSet(GetTrainerAFlag());
+}
+
+static void SetBattledTrainerFlag(void)
+{
+ FlagSet(GetTrainerAFlag());
+}
+
+bool8 HasTrainerBeenFought(u16 trainerId)
+{
+ return FlagGet(FLAG_TRAINER_FLAG_START + trainerId);
+}
+
+void SetTrainerFlag(u16 trainerId)
+{
+ FlagSet(FLAG_TRAINER_FLAG_START + trainerId);
+}
+
+void ClearTrainerFlag(u16 trainerId)
+{
+ FlagClear(FLAG_TRAINER_FLAG_START + trainerId);
+}
+
+void BattleSetup_StartTrainerBattle(void)
+{
+ if (gNoOfApproachingTrainers == 2)
+ gBattleTypeFlags = (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TRAINER);
+ else
+ gBattleTypeFlags = (BATTLE_TYPE_TRAINER);
+
+ if (InBattlePyramid())
+ {
+ VarSet(VAR_TEMP_E, 0);
+ gBattleTypeFlags |= BATTLE_TYPE_PYRAMID;
+
+ if (gNoOfApproachingTrainers == 2)
+ {
+ sub_816306C(1);
+ ZeroMonData(&gEnemyParty[1]);
+ ZeroMonData(&gEnemyParty[2]);
+ ZeroMonData(&gEnemyParty[4]);
+ ZeroMonData(&gEnemyParty[5]);
+ }
+ else
+ {
+ sub_8163048(1);
+ ZeroMonData(&gEnemyParty[1]);
+ ZeroMonData(&gEnemyParty[2]);
+ }
+
+ sub_81A9B04();
+ }
+ else if (sub_81D5C18())
+ {
+ gBattleTypeFlags |= BATTLE_TYPE_x4000000;
+
+ if (gNoOfApproachingTrainers == 2)
+ sub_81D639C();
+ else
+ sub_81D6384();
+
+ sub_81D61E8();
+ }
+
+ sNoOfPossibleTrainerRetScripts = gNoOfApproachingTrainers;
+ gNoOfApproachingTrainers = 0;
+ sShouldCheckTrainerBScript = FALSE;
+ gUnknown_03006080 = 0;
+ gMain.savedCallback = CB2_EndTrainerBattle;
+
+ if (InBattlePyramid() || sub_81D5C18())
+ sub_80B0828();
+ else
+ DoTrainerBattle();
+
+ ScriptContext1_Stop();
+}
+
+static void CB2_EndTrainerBattle(void)
+{
+ if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)
+ {
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ }
+ else if (IsPlayerDefeated(gBattleOutcome) == TRUE)
+ {
+ if (InBattlePyramid() || sub_81D5C18())
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ else
+ SetMainCallback2(CB2_WhiteOut);
+ }
+ else
+ {
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ if (!InBattlePyramid() && !sub_81D5C18())
+ {
+ RegisterTrainerInMatchCall();
+ SetBattledTrainersFlags();
+ }
+ }
+}
+
+static void CB2_EndRematchBattle(void)
+{
+ if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)
+ {
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ }
+ else if (IsPlayerDefeated(gBattleOutcome) == TRUE)
+ {
+ SetMainCallback2(CB2_WhiteOut);
+ }
+ else
+ {
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ RegisterTrainerInMatchCall();
+ SetBattledTrainersFlags();
+ HandleRematchVarsOnBattleEnd();
+ }
+}
+
+void BattleSetup_StartRematchBattle(void)
+{
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER;
+ gMain.savedCallback = CB2_EndRematchBattle;
+ DoTrainerBattle();
+ ScriptContext1_Stop();
+}
+
+void ShowTrainerIntroSpeech(void)
+{
+ if (InBattlePyramid())
+ {
+ if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1)
+ sub_81A9EDC(sub_81A9AA8(gSpecialVar_LastTalked));
+ else
+ sub_81A9EDC(sub_81A9AA8(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId));
+
+ sub_80982B8();
+ }
+ else if (sub_81D5C18())
+ {
+ if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1)
+ sub_81D572C(2, sub_81D6180(gSpecialVar_LastTalked));
+ else
+ sub_81D572C(2, sub_81D6180(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId));
+
+ sub_80982B8();
+ }
+ else
+ {
+ ShowFieldMessage(GetIntroSpeechOfApproachingTrainer());
+ }
+}
+
+const u8 *BattleSetup_GetScriptAddrAfterBattle(void)
+{
+ if (sTrainerBattleEndScript != NULL)
+ return sTrainerBattleEndScript;
+ else
+ return EventScript_TestSignpostMsg;
+}
+
+const u8 *BattleSetup_GetTrainerPostBattleScript(void)
+{
+ if (sShouldCheckTrainerBScript)
+ {
+ sShouldCheckTrainerBScript = FALSE;
+ if (sTrainerBBattleScriptRetAddr != NULL)
+ {
+ gUnknown_03006080 = 1;
+ return sTrainerBBattleScriptRetAddr;
+ }
+ }
+ else
+ {
+ if (sTrainerABattleScriptRetAddr != NULL)
+ {
+ gUnknown_03006080 = 0;
+ return sTrainerABattleScriptRetAddr;
+ }
+ }
+
+ return EventScript_TryGetTrainerScript;
+}
+
+void ShowTrainerCantBattleSpeech(void)
+{
+ ShowFieldMessage(GetTrainerCantBattleSpeech());
+}
+
+void SetUpTrainerEncounterMusic(void)
+{
+ u16 trainerId;
+ u16 music;
+
+ if (gApproachingTrainerId == 0)
+ trainerId = gTrainerBattleOpponent_A;
+ else
+ trainerId = gTrainerBattleOpponent_B;
+
+ if (sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC
+ && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC)
+ {
+ switch (GetTrainerEncounterMusicId(trainerId))
+ {
+ case TRAINER_ENCOUNTER_MUSIC_MALE:
+ music = MUS_BOYEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_FEMALE:
+ music = MUS_GIRLEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_GIRL:
+ music = MUS_SYOUJOEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_INTENSE:
+ music = MUS_HAGESHII;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_COOL:
+ music = MUS_KAKKOII;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_AQUA:
+ music = MUS_AQA_0;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_MAGMA:
+ music = MUS_MGM0;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_SWIMMER:
+ music = MUS_SWIMEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_TWINS:
+ music = MUS_HUTAGO;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR:
+ music = MUS_SITENNOU;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_HIKER:
+ music = MUS_YAMA_EYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER:
+ music = MUS_INTER_V;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_RICH:
+ music = MUS_TEST;
+ break;
+ default:
+ music = MUS_AYASII;
+ }
+ PlayNewMapMusic(music);
+ }
+}
+
+static const u8 *ReturnEmptyStringIfNull(const u8 *string)
+{
+ if (string == NULL)
+ return gText_EmptyString2;
+ else
+ return string;
+}
+
+static const u8 *GetIntroSpeechOfApproachingTrainer(void)
+{
+ if (gApproachingTrainerId == 0)
+ return ReturnEmptyStringIfNull(sTrainerAIntroSpeech);
+ else
+ return ReturnEmptyStringIfNull(sTrainerBIntroSpeech);
+}
+
+const u8 *GetTrainerALoseText(void)
+{
+ const u8 *string;
+
+ if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)
+ string = GetSecretBaseTrainerLoseText();
+ else
+ string = sTrainerADefeatSpeech;
+
+ StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(string));
+ return gStringVar4;
+}
+
+const u8 *GetTrainerBLoseText(void)
+{
+ StringExpandPlaceholders(gStringVar4, ReturnEmptyStringIfNull(sTrainerBDefeatSpeech));
+ return gStringVar4;
+}
+
+const u8 *GetTrainerWonSpeech(void)
+{
+ return ReturnEmptyStringIfNull(sTrainerVictorySpeech);
+}
+
+static const u8 *GetTrainerCantBattleSpeech(void)
+{
+ return ReturnEmptyStringIfNull(sTrainerCannotBattleSpeech);
+}
+
+static s32 FirstBattleTrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId)
+{
+ s32 i;
+
+ for (i = 0; i < REMATCH_TABLE_ENTRIES; i++)
+ {
+ if (table[i].trainerIds[0] == trainerId)
+ return i;
+ }
+
+ return -1;
+}
+
+static s32 TrainerIdToRematchTableId(const struct RematchTrainer *table, u16 trainerId)
+{
+ s32 i, j;
+
+ for (i = 0; i < REMATCH_TABLE_ENTRIES; i++)
+ {
+ for (j = 0; j < REMATCHES_COUNT; j++)
+ {
+ if (table[i].trainerIds[j] == 0)
+ break;
+ if (table[i].trainerIds[j] == trainerId)
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static bool32 sub_80B1D94(s32 rematchTableId)
+{
+ if (rematchTableId >= REMATCH_ELITE_FOUR_ENTRIES)
+ return TRUE;
+ else if (rematchTableId == REMATCH_WALLY_ENTRY)
+ return (FlagGet(FLAG_0x07E) == FALSE);
+ else
+ return FALSE;
+}
+
+static void SetRematchIdForTrainer(const struct RematchTrainer *table, u32 tableId)
+{
+ s32 i;
+
+ for (i = 1; i < REMATCHES_COUNT; i++)
+ {
+ u16 trainerId = table[tableId].trainerIds[i];
+
+ if (trainerId == 0)
+ break;
+ if (!HasTrainerBeenFought(trainerId))
+ break;
+ }
+
+ gSaveBlock1Ptr->trainerRematches[tableId] = i;
+}
+
+static bool32 UpdateRandomTrainerRematches(const struct RematchTrainer *table, u16 mapGroup, u16 mapNum)
+{
+ s32 i;
+ bool32 ret = FALSE;
+
+ for (i = 0; i <= REMATCH_WALLY_ENTRY; i++)
+ {
+ if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum && !sub_80B1D94(i))
+ {
+ if (gSaveBlock1Ptr->trainerRematches[i] != 0)
+ {
+ // Trainer already wants a rematch. Don't bother updating it.
+ ret = TRUE;
+ }
+ else if (FlagGet(FLAG_MATCH_CALL_REGISTERED + i)
+ && (Random() % 100) <= 30) // 31% chance of getting a rematch.
+ {
+ SetRematchIdForTrainer(table, i);
+ ret = TRUE;
+ }
+ }
+ }
+
+ return ret;
+}
+
+void UpdateRematchIfDefeated(s32 rematchTableId)
+{
+ if (HasTrainerBeenFought(gRematchTable[rematchTableId].trainerIds[0]) == TRUE)
+ SetRematchIdForTrainer(gRematchTable, rematchTableId);
+}
+
+static bool32 DoesSomeoneWantRematchIn_(const struct RematchTrainer *table, u16 mapGroup, u16 mapNum)
+{
+ s32 i;
+
+ for (i = 0; i < REMATCH_TABLE_ENTRIES; i++)
+ {
+ if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum && gSaveBlock1Ptr->trainerRematches[i] != 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool32 IsRematchTrainerIn_(const struct RematchTrainer *table, u16 mapGroup, u16 mapNum)
+{
+ s32 i;
+
+ for (i = 0; i < REMATCH_TABLE_ENTRIES; i++)
+ {
+ if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 IsFirstTrainerIdReadyForRematch(const struct RematchTrainer *table, u16 firstBattleTrainerId)
+{
+ s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId);
+
+ if (tableId == -1)
+ return FALSE;
+ if (tableId >= 100)
+ return FALSE;
+ if (gSaveBlock1Ptr->trainerRematches[tableId] == 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+static bool8 IsTrainerReadyForRematch_(const struct RematchTrainer *table, u16 trainerId)
+{
+ s32 tableId = TrainerIdToRematchTableId(table, trainerId);
+
+ if (tableId == -1)
+ return FALSE;
+ if (tableId >= 100)
+ return FALSE;
+ if (gSaveBlock1Ptr->trainerRematches[tableId] == 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+static u16 GetRematchTrainerIdFromTable(const struct RematchTrainer *table, u16 firstBattleTrainerId)
+{
+ const struct RematchTrainer *trainerEntry;
+ s32 i;
+ s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId);
+
+ if (tableId == -1)
+ return FALSE;
+
+ trainerEntry = &table[tableId];
+ for (i = 1; i < REMATCHES_COUNT; i++)
+ {
+ if (trainerEntry->trainerIds[i] == 0) // previous entry was this trainer's last one
+ return trainerEntry->trainerIds[i - 1];
+ if (!HasTrainerBeenFought(trainerEntry->trainerIds[i]))
+ return trainerEntry->trainerIds[i];
+ }
+
+ return trainerEntry->trainerIds[REMATCHES_COUNT - 1]; // already beaten at max stage
+}
+
+static u16 GetLastBeatenRematchTrainerIdFromTable(const struct RematchTrainer *table, u16 firstBattleTrainerId)
+{
+ const struct RematchTrainer *trainerEntry;
+ s32 i;
+ s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId);
+
+ if (tableId == -1)
+ return FALSE;
+
+ trainerEntry = &table[tableId];
+ for (i = 1; i < REMATCHES_COUNT; i++)
+ {
+ if (trainerEntry->trainerIds[i] == 0) // previous entry was this trainer's last one
+ return trainerEntry->trainerIds[i - 1];
+ if (!HasTrainerBeenFought(trainerEntry->trainerIds[i]))
+ return trainerEntry->trainerIds[i - 1];
+ }
+
+ return trainerEntry->trainerIds[REMATCHES_COUNT - 1]; // already beaten at max stage
+}
+
+static void ClearTrainerWantRematchState(const struct RematchTrainer *table, u16 firstBattleTrainerId)
+{
+ s32 tableId = TrainerIdToRematchTableId(table, firstBattleTrainerId);
+
+ if (tableId != -1)
+ gSaveBlock1Ptr->trainerRematches[tableId] = 0;
+}
+
+static u32 GetTrainerMatchCallFlag(u32 trainerId)
+{
+ s32 i;
+
+ for (i = 0; i < REMATCH_TABLE_ENTRIES; i++)
+ {
+ if (gRematchTable[i].trainerIds[0] == trainerId)
+ return FLAG_MATCH_CALL_REGISTERED + i;
+ }
+
+ return 0xFFFF;
+}
+
+static void RegisterTrainerInMatchCall(void)
+{
+ if (FlagGet(FLAG_HAS_MATCH_CALL))
+ {
+ u32 matchCallFlagId = GetTrainerMatchCallFlag(gTrainerBattleOpponent_A);
+ if (matchCallFlagId != 0xFFFF)
+ FlagSet(matchCallFlagId);
+ }
+}
+
+static bool8 WasSecondRematchWon(const struct RematchTrainer *table, u16 firstBattleTrainerId)
+{
+ s32 tableId = FirstBattleTrainerIdToRematchTableId(table, firstBattleTrainerId);
+
+ if (tableId == -1)
+ return FALSE;
+ if (!HasTrainerBeenFought(table[tableId].trainerIds[1]))
+ return FALSE;
+
+ return TRUE;
+}
+
+static bool32 HasAtLeastFiveBadges(void)
+{
+ s32 i, count;
+
+ for (count = 0, i = 0; i < ARRAY_COUNT(sBadgeFlags); i++)
+ {
+ if (FlagGet(sBadgeFlags[i]) == TRUE)
+ {
+ if (++count >= 5)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+#define STEP_COUNTER_MAX 255
+
+void IncrementRematchStepCounter(void)
+{
+ if (HasAtLeastFiveBadges())
+ {
+ if (gSaveBlock1Ptr->trainerRematchStepCounter >= STEP_COUNTER_MAX)
+ gSaveBlock1Ptr->trainerRematchStepCounter = STEP_COUNTER_MAX;
+ else
+ gSaveBlock1Ptr->trainerRematchStepCounter++;
+ }
+}
+
+static bool32 IsRematchStepCounterMaxed(void)
+{
+ if (HasAtLeastFiveBadges() && gSaveBlock1Ptr->trainerRematchStepCounter >= STEP_COUNTER_MAX)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void TryUpdateRandomTrainerRematches(u16 mapGroup, u16 mapNum)
+{
+ if (IsRematchStepCounterMaxed() && UpdateRandomTrainerRematches(gRematchTable, mapGroup, mapNum) == TRUE)
+ gSaveBlock1Ptr->trainerRematchStepCounter = 0;
+}
+
+bool32 DoesSomeoneWantRematchIn(u16 mapGroup, u16 mapNum)
+{
+ return DoesSomeoneWantRematchIn_(gRematchTable, mapGroup, mapNum);
+}
+
+bool32 IsRematchTrainerIn(u16 mapGroup, u16 mapNum)
+{
+ return IsRematchTrainerIn_(gRematchTable, mapGroup, mapNum);
+}
+
+static u16 GetRematchTrainerId(u16 trainerId)
+{
+ return GetRematchTrainerIdFromTable(gRematchTable, trainerId);
+}
+
+u16 GetLastBeatenRematchTrainerId(u16 trainerId)
+{
+ return GetLastBeatenRematchTrainerIdFromTable(gRematchTable, trainerId);
+}
+
+bool8 ShouldTryRematchBattle(void)
+{
+ if (IsFirstTrainerIdReadyForRematch(gRematchTable, gTrainerBattleOpponent_A))
+ return TRUE;
+
+ return WasSecondRematchWon(gRematchTable, gTrainerBattleOpponent_A);
+}
+
+bool8 IsTrainerReadyForRematch(void)
+{
+ return IsTrainerReadyForRematch_(gRematchTable, gTrainerBattleOpponent_A);
+}
+
+static void HandleRematchVarsOnBattleEnd(void)
+{
+ ClearTrainerWantRematchState(gRematchTable, gTrainerBattleOpponent_A);
+ SetBattledTrainersFlags();
+}
+
+void ShouldTryGetTrainerScript(void)
+{
+ if (sNoOfPossibleTrainerRetScripts > 1)
+ {
+ sNoOfPossibleTrainerRetScripts = 0;
+ sShouldCheckTrainerBScript = TRUE;
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ sShouldCheckTrainerBScript = FALSE;
+ gSpecialVar_Result = FALSE;
+ }
+}
+
+u16 CountBattledRematchTeams(u16 trainerId)
+{
+ s32 i;
+
+ if (HasTrainerBeenFought(gRematchTable[trainerId].trainerIds[0]) != TRUE)
+ return 0;
+
+ for (i = 1; i < REMATCHES_COUNT; i++)
+ {
+ if (gRematchTable[trainerId].trainerIds[i] == 0)
+ break;
+ if (!HasTrainerBeenFought(gRematchTable[trainerId].trainerIds[i]))
+ break;
+ }
+
+ return i;
+}
diff --git a/src/battle_tent.c b/src/battle_tent.c
new file mode 100644
index 000000000..68d7c5e83
--- /dev/null
+++ b/src/battle_tent.c
@@ -0,0 +1,268 @@
+#include "global.h"
+#include "overworld.h"
+#include "event_data.h"
+#include "region_map.h"
+#include "battle.h"
+#include "battle_setup.h"
+#include "battle_tower.h"
+#include "battle_frontier_2.h"
+#include "random.h"
+#include "item.h"
+#include "constants/items.h"
+#include "constants/region_map_sections.h"
+
+// this file's functions
+void sub_81B99D4(void);
+void sub_81B9A28(void);
+void sub_81B9A44(void);
+void sub_81B9A60(void);
+void sub_81B9A90(void);
+void sub_81B9ABC(void);
+void sub_81B9B00(void);
+void sub_81B9B28(void);
+void sub_81B9BA0(void);
+void sub_81B9BF4(void);
+void sub_81B9C10(void);
+void sub_81B9C2C(void);
+void sub_81B9C70(void);
+void sub_81B9C98(void);
+void sub_81B9CF0(void);
+void sub_81B9D28(void);
+void sub_81B9D7C(void);
+void sub_81B9D98(void);
+void sub_81B9DB4(void);
+void sub_81B9DF8(void);
+void sub_81B9E20(void);
+void sub_81B9E78(void);
+void sub_81B9E88(void);
+void sub_81BA040(void);
+void sub_81B9EC0(void);
+
+// const rom data
+void (*const gUnknown_086160B4[])(void) =
+{
+ sub_81B99D4,
+ sub_81B9A28,
+ sub_81B9A44,
+ sub_81B9A60,
+ sub_81B9A90,
+ sub_81B9ABC,
+ sub_81B9B00,
+ sub_81B9B28
+};
+
+const u16 gUnknown_086160D4[] = {ITEM_NEST_BALL, ITEM_NONE};
+
+void (*const gUnknown_086160D8[])(void) =
+{
+ sub_81B9BA0,
+ sub_81B9BF4,
+ sub_81B9C10,
+ sub_81B9C2C,
+ sub_81B9C70,
+ sub_81B9C98,
+ sub_81B9CF0
+};
+
+const u16 gUnknown_086160F4[] = {ITEM_HYPER_POTION, ITEM_NONE};
+
+void (*const gUnknown_086160F8[])(void) =
+{
+ sub_81B9D28,
+ sub_81B9D7C,
+ sub_81B9D98,
+ sub_81B9DB4,
+ sub_81B9DF8,
+ sub_81B9E20,
+ sub_81B9E78,
+ sub_81B9E88,
+ sub_81BA040,
+ sub_81B9EC0
+};
+
+const u16 gUnknown_08616120[] = {ITEM_FULL_HEAL, ITEM_NONE};
+
+// code
+void sub_81B99B4(void)
+{
+ gUnknown_086160B4[gSpecialVar_0x8004]();
+}
+
+void sub_81B99D4(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+}
+
+void sub_81B9A28(void)
+{
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E6A;
+}
+
+void sub_81B9A44(void)
+{
+ gSaveBlock2Ptr->frontier.field_E6A = gSpecialVar_0x8006;
+}
+
+void sub_81B9A60(void)
+{
+ gTrainerBattleOpponent_A = (u32)((Random() % 255) * 5) / 64;
+ sub_8162614(gTrainerBattleOpponent_A, 0);
+}
+
+void sub_81B9A90(void)
+{
+ if (gTrainerBattleOpponent_A < 300)
+ ConvertBattleFrontierTrainerSpeechToString(gUnknown_0203BC88[gTrainerBattleOpponent_A].speechBefore);
+}
+
+void sub_81B9ABC(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = TRUE;
+ sub_81A4C30();
+}
+
+void sub_81B9B00(void)
+{
+ gSaveBlock2Ptr->frontier.field_E6A = gUnknown_086160D4[Random() % 1];
+}
+
+void sub_81B9B28(void)
+{
+ if (AddBagItem(gSaveBlock2Ptr->frontier.field_E6A, 1) == TRUE)
+ {
+ CopyItemName(gSaveBlock2Ptr->frontier.field_E6A, gStringVar1);
+ gSaveBlock2Ptr->frontier.field_E6A = ITEM_NONE;
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+}
+
+void sub_81B9B80(void)
+{
+ gUnknown_086160D8[gSpecialVar_0x8004]();
+}
+
+void sub_81B9BA0(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+}
+
+void sub_81B9BF4(void)
+{
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E6C;
+}
+
+void sub_81B9C10(void)
+{
+ gSaveBlock2Ptr->frontier.field_E6C = gSpecialVar_0x8006;
+}
+
+void sub_81B9C2C(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = TRUE;
+ sub_81A4C30();
+}
+
+void sub_81B9C70(void)
+{
+ gSaveBlock2Ptr->frontier.field_E6C = gUnknown_086160F4[Random() % 1];
+}
+
+void sub_81B9C98(void)
+{
+ if (AddBagItem(gSaveBlock2Ptr->frontier.field_E6C, 1) == TRUE)
+ {
+ CopyItemName(gSaveBlock2Ptr->frontier.field_E6C, gStringVar1);
+ gSaveBlock2Ptr->frontier.field_E6C = ITEM_NONE;
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+}
+
+void sub_81B9CF0(void)
+{
+ GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A);
+}
+
+void sub_81B9D08(void)
+{
+ gUnknown_086160F8[gSpecialVar_0x8004]();
+}
+
+void sub_81B9D28(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.field_CB2 = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+}
+
+void sub_81B9D7C(void)
+{
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E6E;
+}
+
+void sub_81B9D98(void)
+{
+ gSaveBlock2Ptr->frontier.field_E6E = gSpecialVar_0x8006;
+}
+
+void sub_81B9DB4(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = TRUE;
+ sub_81A4C30();
+}
+
+void sub_81B9DF8(void)
+{
+ gSaveBlock2Ptr->frontier.field_E6E = gUnknown_08616120[Random() % 1];
+}
+
+void sub_81B9E20(void)
+{
+ if (AddBagItem(gSaveBlock2Ptr->frontier.field_E6E, 1) == TRUE)
+ {
+ CopyItemName(gSaveBlock2Ptr->frontier.field_E6E, gStringVar1);
+ gSaveBlock2Ptr->frontier.field_E6E = ITEM_NONE;
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+}
+
+void sub_81B9E78(void)
+{
+ ZeroPlayerPartyMons();
+ sub_819A4F8();
+}
+
+void sub_81B9E88(void)
+{
+ sub_819DC00();
+}
+
+bool8 sub_81B9E94(void)
+{
+ return (gMapHeader.regionMapSectionId == MAPSEC_SLATEPORT_CITY
+ && ((gMapHeader.mapLayoutId == 385) | (gMapHeader.mapLayoutId == 386)));
+}
diff --git a/src/battle_transition.c b/src/battle_transition.c
new file mode 100644
index 000000000..d1d92cb50
--- /dev/null
+++ b/src/battle_transition.c
@@ -0,0 +1,4346 @@
+#include "global.h"
+#include "battle_transition.h"
+#include "unk_transition.h"
+#include "main.h"
+#include "overworld.h"
+#include "task.h"
+#include "palette.h"
+#include "trig.h"
+#include "field_effect.h"
+#include "field_camera.h"
+#include "random.h"
+#include "sprite.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
+#include "field_camera.h"
+#include "scanline_effect.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "decompress.h"
+#include "bg.h"
+#include "blend_palette.h"
+
+struct TransitionData
+{
+ vu8 VBlank_DMA;
+ u16 WININ;
+ u16 WINOUT;
+ u16 WIN0H;
+ u16 WIN0V;
+ u16 field_A; // unused
+ u16 field_C; // unused
+ u16 BLDCNT;
+ u16 BLDALPHA;
+ u16 BLDY;
+ s16 field_14;
+ s16 field_16;
+ s16 BG0HOFS_1;
+ s16 BG0HOFS_2;
+ s16 BG0VOFS; // used but not set
+ s16 field_1E; // unused
+ s16 field_20;
+ s16 field_22; // unused
+ s16 data[11];
+};
+
+struct StructRectangularSpiral
+{
+ u8 field_0;
+ s16 field_2;
+ u8 field_4;
+ s16 field_6;
+ u8 field_8;
+};
+
+typedef bool8 (*TransitionStateFunc)(struct Task *task);
+typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite);
+
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG0_Y;
+
+extern const struct OamData gEventObjectBaseOam_32x32;
+
+extern void sub_80AC3D0(void);
+
+// this file's functions
+static void LaunchBattleTransitionTask(u8 transitionId);
+static void Task_BattleTransitionMain(u8 taskId);
+static void Phase1Task_TransitionAll(u8 taskId);
+static void Phase2Task_Blur(u8 taskId);
+static void Phase2Task_Swirl(u8 taskId);
+static void Phase2Task_Shuffle(u8 taskId);
+static void Phase2Task_BigPokeball(u8 taskId);
+static void Phase2Task_PokeballsTrail(u8 taskId);
+static void Phase2Task_Clockwise_BlackFade(u8 taskId);
+static void Phase2Task_Ripple(u8 taskId);
+static void Phase2Task_Wave(u8 taskId);
+static void Phase2Task_Slice(u8 taskId);
+static void Phase2Task_WhiteFade(u8 taskId);
+static void Phase2Task_GridSquares(u8 taskId);
+static void Phase2Task_Shards(u8 taskId);
+static void Phase2Task_Sydney(u8 taskId);
+static void Phase2Task_Phoebe(u8 taskId);
+static void Phase2Task_Glacia(u8 taskId);
+static void Phase2Task_Drake(u8 taskId);
+static void Phase2Task_Champion(u8 taskId);
+static void Phase2Task_Aqua(u8 taskId);
+static void Phase2Task_Magma(u8 taskId);
+static void Phase2Task_Regice(u8 taskId);
+static void Phase2Task_Registeel(u8 taskId);
+static void Phase2Task_Regirock(u8 taskId);
+static void Phase2Task_Kyogre(u8 taskId);
+static void Phase2Task_Groudon(u8 taskId);
+static void Phase2Task_Rayquaza(u8 taskId);
+static void Phase2Task_ShredSplit(u8 taskId);
+static void Phase2Task_Blackhole1(u8 taskId);
+static void Phase2Task_Blackhole2(u8 taskId);
+static void Phase2Task_RectangularSpiral(u8 taskId);
+static void Phase2Task_29(u8 taskId);
+static void Phase2Task_30(u8 taskId);
+static void Phase2Task_31(u8 taskId);
+static void Phase2Task_32(u8 taskId);
+static void Phase2Task_33(u8 taskId);
+static void VBlankCB_BattleTransition(void);
+static void VBlankCB_Phase2_Swirl(void);
+static void HBlankCB_Phase2_Swirl(void);
+static void VBlankCB_Phase2_Shuffle(void);
+static void HBlankCB_Phase2_Shuffle(void);
+static void VBlankCB0_Phase2_BigPokeball(void);
+static void VBlankCB1_Phase2_BigPokeball(void);
+static void VBlankCB_Phase2_Clockwise_BlackFade(void);
+static void VBlankCB_Phase2_Ripple(void);
+static void HBlankCB_Phase2_Ripple(void);
+static void VBlankCB_Phase2_30(void);
+static void HBlankCB_Phase2_30(void);
+static void VBlankCB_Phase2_Wave(void);
+static void VBlankCB_Phase2_Slice(void);
+static void HBlankCB_Phase2_Slice(void);
+static void VBlankCB0_Phase2_WhiteFade(void);
+static void VBlankCB1_Phase2_WhiteFade(void);
+static void HBlankCB_Phase2_WhiteFade(void);
+static void VBlankCB_Phase2_Shards(void);
+static void VBlankCB_Phase2_Rayquaza(void);
+static bool8 Phase2_Blur_Func1(struct Task *task);
+static bool8 Phase2_Blur_Func2(struct Task *task);
+static bool8 Phase2_Blur_Func3(struct Task *task);
+static bool8 Phase2_Swirl_Func1(struct Task *task);
+static bool8 Phase2_Swirl_Func2(struct Task *task);
+static bool8 Phase2_Shuffle_Func1(struct Task *task);
+static bool8 Phase2_Shuffle_Func2(struct Task *task);
+static bool8 Phase2_Aqua_Func1(struct Task *task);
+static bool8 Phase2_Aqua_Func2(struct Task *task);
+static bool8 Phase2_Magma_Func1(struct Task *task);
+static bool8 Phase2_Magma_Func2(struct Task *task);
+static bool8 Phase2_FramesCountdown(struct Task *task);
+static bool8 Phase2_Regi_Func1(struct Task *task);
+static bool8 Phase2_Regice_Func2(struct Task *task);
+static bool8 Phase2_Registeel_Func2(struct Task *task);
+static bool8 Phase2_Regirock_Func2(struct Task *task);
+static bool8 Phase2_WeatherTrio_Func1(struct Task *task);
+static bool8 Phase2_WaitPaletteFade(struct Task *task);
+static bool8 Phase2_Kyogre_Func3(struct Task *task);
+static bool8 Phase2_Kyogre_Func4(struct Task *task);
+static bool8 Phase2_Kyogre_Func5(struct Task *task);
+static bool8 Phase2_Groudon_Func3(struct Task *task);
+static bool8 Phase2_Groudon_Func4(struct Task *task);
+static bool8 Phase2_Groudon_Func5(struct Task *task);
+static bool8 Phase2_WeatherDuo_Func6(struct Task *task);
+static bool8 Phase2_WeatherDuo_Func7(struct Task *task);
+static bool8 Phase2_BigPokeball_Func1(struct Task *task);
+static bool8 Phase2_BigPokeball_Func2(struct Task *task);
+static bool8 Phase2_BigPokeball_Func3(struct Task *task);
+static bool8 Phase2_BigPokeball_Func4(struct Task *task);
+static bool8 Phase2_BigPokeball_Func5(struct Task *task);
+static bool8 Phase2_BigPokeball_Func6(struct Task *task);
+static bool8 Phase2_PokeballsTrail_Func1(struct Task *task);
+static bool8 Phase2_PokeballsTrail_Func2(struct Task *task);
+static bool8 Phase2_PokeballsTrail_Func3(struct Task *task);
+static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task);
+static bool8 Phase2_Clockwise_BlackFade_Func2(struct Task *task);
+static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task);
+static bool8 Phase2_Clockwise_BlackFade_Func4(struct Task *task);
+static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task);
+static bool8 Phase2_Clockwise_BlackFade_Func6(struct Task *task);
+static bool8 Phase2_Clockwise_BlackFade_Func7(struct Task *task);
+static bool8 Phase2_Ripple_Func1(struct Task *task);
+static bool8 Phase2_Ripple_Func2(struct Task *task);
+static bool8 Phase2_Wave_Func1(struct Task *task);
+static bool8 Phase2_Wave_Func2(struct Task *task);
+static bool8 Phase2_Wave_Func3(struct Task *task);
+static bool8 Phase2_Slice_Func1(struct Task *task);
+static bool8 Phase2_Slice_Func2(struct Task *task);
+static bool8 Phase2_Slice_Func3(struct Task *task);
+static bool8 Phase2_WhiteFade_Func1(struct Task *task);
+static bool8 Phase2_WhiteFade_Func2(struct Task *task);
+static bool8 Phase2_WhiteFade_Func3(struct Task *task);
+static bool8 Phase2_WhiteFade_Func4(struct Task *task);
+static bool8 Phase2_WhiteFade_Func5(struct Task *task);
+static bool8 Phase2_GridSquares_Func1(struct Task *task);
+static bool8 Phase2_GridSquares_Func2(struct Task *task);
+static bool8 Phase2_GridSquares_Func3(struct Task *task);
+static bool8 Phase2_Shards_Func1(struct Task *task);
+static bool8 Phase2_Shards_Func2(struct Task *task);
+static bool8 Phase2_Shards_Func3(struct Task *task);
+static bool8 Phase2_Shards_Func4(struct Task *task);
+static bool8 Phase2_Shards_Func5(struct Task *task);
+static bool8 Phase2_ShredSplit_Func1(struct Task *task);
+static bool8 Phase2_ShredSplit_Func2(struct Task *task);
+static bool8 Phase2_ShredSplit_Func3(struct Task *task);
+static bool8 Phase2_ShredSplit_Func4(struct Task *task);
+static bool8 Phase2_Blackhole_Func1(struct Task *task);
+static bool8 Phase2_Blackhole1_Func2(struct Task *task);
+static bool8 Phase2_Blackhole1_Func3(struct Task *task);
+static bool8 Phase2_Blackhole2_Func2(struct Task *task);
+static bool8 Phase2_RectangularSpiral_Func1(struct Task *task);
+static bool8 Phase2_RectangularSpiral_Func2(struct Task *task);
+static bool8 Phase2_RectangularSpiral_Func3(struct Task *task);
+static bool8 Phase2_29_Func1(struct Task *task);
+static bool8 Phase2_29_Func2(struct Task *task);
+static bool8 Phase2_30_Func1(struct Task *task);
+static bool8 Phase2_30_Func2(struct Task *task);
+static bool8 Phase2_30_Func3(struct Task *task);
+static bool8 Phase2_30_Func4(struct Task *task);
+static bool8 Phase2_Rayquaza_Func3(struct Task *task);
+static bool8 Phase2_Rayquaza_Func4(struct Task *task);
+static bool8 Phase2_Rayquaza_Func5(struct Task *task);
+static bool8 Phase2_Rayquaza_Func6(struct Task *task);
+static bool8 Phase2_Rayquaza_Func7(struct Task *task);
+static bool8 Phase2_Rayquaza_Func8(struct Task *task);
+static bool8 Phase2_Rayquaza_Func9(struct Task *task);
+static bool8 Phase2_31_Func1(struct Task *task);
+static bool8 Phase2_31_Func2(struct Task *task);
+static bool8 Phase2_31_Func3(struct Task *task);
+static bool8 Phase2_31_33_Func5(struct Task *task);
+static bool8 Phase2_33_Func1(struct Task *task);
+static bool8 Phase2_33_Func2(struct Task *task);
+static bool8 Phase2_33_Func3(struct Task *task);
+static bool8 Phase2_33_Func4(struct Task *task);
+static bool8 Phase2_32_Func1(struct Task *task);
+static bool8 Phase2_32_Func2(struct Task *task);
+static bool8 Phase2_32_Func3(struct Task *task);
+static bool8 Phase2_32_Func4(struct Task *task);
+static bool8 Phase2_32_Func5(struct Task *task);
+static bool8 Phase2_Mugshot_Func1(struct Task *task);
+static bool8 Phase2_Mugshot_Func2(struct Task *task);
+static bool8 Phase2_Mugshot_Func3(struct Task *task);
+static bool8 Phase2_Mugshot_Func4(struct Task *task);
+static bool8 Phase2_Mugshot_Func5(struct Task *task);
+static bool8 Phase2_Mugshot_Func6(struct Task *task);
+static bool8 Phase2_Mugshot_Func7(struct Task *task);
+static bool8 Phase2_Mugshot_Func8(struct Task *task);
+static bool8 Phase2_Mugshot_Func9(struct Task *task);
+static bool8 Phase2_Mugshot_Func10(struct Task *task);
+static void Phase2Task_MugShotTransition(u8 taskId);
+static void Mugshots_CreateOpponentPlayerSprites(struct Task *task);
+static void VBlankCB0_Phase2_Mugshots(void);
+static void VBlankCB1_Phase2_Mugshots(void);
+static void HBlankCB_Phase2_Mugshots(void);
+static bool8 Transition_Phase1(struct Task *task);
+static bool8 Transition_WaitForPhase1(struct Task *task);
+static bool8 Transition_Phase2(struct Task *task);
+static bool8 Transition_WaitForPhase2(struct Task *task);
+static void sub_8149F08(void);
+static void sub_8149F84(void);
+static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4);
+static void sub_814A014(u16 *a0, s16 a1, s16 a2, s16 a3);
+static void sub_8149F98(s16 *array, s16 sinAdd, s16 index, s16 indexIncrementer, s16 amplitude, s16 arrSize);
+static void sub_8149F40(u16 **a0);
+static void sub_814A1AC(s16 *a0, s16 a1, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6);
+static bool8 sub_814A228(s16 *a0, bool8 a1, bool8 a2);
+static void sub_8148484(s16 spriteId, s16 value);
+static void sub_814849C(s16 spriteId);
+static s16 sub_81484B8(s16 spriteId);
+static bool8 Phase1_TransitionAll_Func1(struct Task *task);
+static bool8 Phase1_TransitionAll_Func2(struct Task *task);
+static bool8 IsPhase1Done(void);
+static bool16 sub_8149048(const s16 * const *arg0, struct StructRectangularSpiral *arg1);
+static void sub_814713C(struct Sprite *sprite);
+static void sub_8148380(struct Sprite *sprite);
+static void sub_8149864(struct Sprite *sprite);
+static bool8 sub_81483A8(struct Sprite *sprite);
+static bool8 sub_81483AC(struct Sprite *sprite);
+static bool8 sub_81483F8(struct Sprite *sprite);
+static bool8 sub_814842C(struct Sprite *sprite);
+static bool8 sub_8148458(struct Sprite *sprite);
+
+// iwram bss vars
+IWRAM_DATA static s16 sUnusedRectangularSpiralVar;
+IWRAM_DATA static u8 sTestingTransitionId;
+IWRAM_DATA static u8 sTestingTransitionState;
+IWRAM_DATA static struct StructRectangularSpiral sRectangularSpiralTransition[4];
+
+// ewram vars
+EWRAM_DATA static struct TransitionData *sTransitionStructPtr = NULL;
+
+// const rom data
+static const u32 sBigPokeball_Tileset[] = INCBIN_U32("graphics/battle_transitions/big_pokeball.4bpp");
+static const u32 sPokeballTrail_Tileset[] = INCBIN_U32("graphics/battle_transitions/pokeball_trail.4bpp");
+static const u8 sSpriteImage_85B98F0[] = INCBIN_U8("graphics/battle_transitions/pokeball.4bpp");
+static const u32 sUnknown_085B9AF0[] = INCBIN_U32("graphics/battle_transitions/elite_four_bg.4bpp");
+static const u8 sSpriteImage_85B9CD0[] = INCBIN_U8("graphics/battle_transitions/unused_brendan.4bpp");
+static const u8 sSpriteImage_85BA4D0[] = INCBIN_U8("graphics/battle_transitions/unused_lass.4bpp");
+static const u32 sShrinkingBoxTileset[] = INCBIN_U32("graphics/battle_transitions/shrinking_box.4bpp");
+static const u32 sEvilTeam_Palette[] = INCBIN_U32("graphics/battle_transitions/evil_team.gbapal");
+static const u32 sTeamAqua_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_aqua.4bpp.lz");
+static const u32 sTeamAqua_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_aqua.bin.lz");
+static const u32 sTeamMagma_Tileset[] = INCBIN_U32("graphics/battle_transitions/team_magma.4bpp.lz");
+static const u32 sTeamMagma_Tilemap[] = INCBIN_U32("graphics/battle_transitions/team_magma.bin.lz");
+static const u32 gUnknown_085BBC14[] = INCBIN_U32("graphics/battle_transitions/85BBC14.4bpp");
+static const u32 gUnknown_085BC2B4[] = INCBIN_U32("graphics/battle_transitions/85BC2B4.gbapal");
+static const u32 gUnknown_085BC2D4[] = INCBIN_U32("graphics/battle_transitions/85BC2D4.gbapal");
+static const u32 gUnknown_085BC2F4[] = INCBIN_U32("graphics/battle_transitions/85BC2F4.gbapal");
+static const u32 gUnknown_085BC314[] = INCBIN_U32("graphics/battle_transitions/85BC314.bin");
+static const u32 gUnknown_085BCB14[] = INCBIN_U32("graphics/battle_transitions/85BCB14.bin");
+static const u32 gUnknown_085BD314[] = INCBIN_U32("graphics/battle_transitions/85BD314.bin");
+static const u16 gUnknown_085BDB14[] = INCBIN_U16("graphics/battle_transitions/85BDB14.gbapal");
+static const u32 gUnknown_085BDB34[] = INCBIN_U32("graphics/battle_transitions/kyogre.4bpp.lz");
+static const u32 gUnknown_085BE1E8[] = INCBIN_U32("graphics/battle_transitions/kyogre.bin.lz");
+static const u32 gUnknown_085BE51C[] = INCBIN_U32("graphics/battle_transitions/groudon.4bpp.lz");
+static const u32 gUnknown_085BEA88[] = INCBIN_U32("graphics/battle_transitions/groudon.bin.lz");
+static const u16 gUnknown_085BEDA0[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt1.gbapal");
+static const u16 gUnknown_085BEEE0[] = INCBIN_U16("graphics/battle_transitions/kyogre_pt2.gbapal");
+static const u16 gUnknown_085BF0A0[] = INCBIN_U16("graphics/battle_transitions/groudon_pt1.gbapal");
+static const u16 gUnknown_085BF2A0[] = INCBIN_U16("graphics/battle_transitions/groudon_pt2.gbapal");
+static const u16 gUnknown_085BF4A0[] = INCBIN_U16("graphics/battle_transitions/rayquaza.gbapal");
+static const u32 gUnknown_085BF6A0[] = INCBIN_U32("graphics/battle_transitions/rayquaza.4bpp");
+static const u32 gUnknown_085C6BE0[] = INCBIN_U32("graphics/battle_transitions/rayquaza.bin");
+static const u32 gUnknown_085C7BE0[] = INCBIN_U32("graphics/battle_transitions/frontier_brain.gbapal");
+static const u32 gUnknown_085C7C00[] = INCBIN_U32("graphics/battle_transitions/frontier_brain.4bpp.lz");
+static const u32 gUnknown_085C828C[] = INCBIN_U32("graphics/battle_transitions/frontier_brain.bin.lz");
+static const u32 gUnknown_085C8578[] = INCBIN_U32("graphics/battle_transitions/frontier_squares_blanktiles.gbapal");
+static const u32 gUnknown_085C8598[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.lz");
+static const u32 gUnknown_085C86F4[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.lz");
+static const u32 gUnknown_085C87F4[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.lz");
+static const u32 gUnknown_085C88A4[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.lz");
+static const u32 gUnknown_085C8928[] = INCBIN_U32("graphics/battle_transitions/frontier_squares.bin");
+
+static const TaskFunc sPhase1_Tasks[B_TRANSITION_COUNT] =
+{
+ [0 ... B_TRANSITION_COUNT - 1] = &Phase1Task_TransitionAll
+};
+
+static const TaskFunc sPhase2_Tasks[B_TRANSITION_COUNT] =
+{
+ Phase2Task_Blur, // 0
+ Phase2Task_Swirl, // 1
+ Phase2Task_Shuffle, // 2
+ Phase2Task_BigPokeball, // 3
+ Phase2Task_PokeballsTrail, // 4
+ Phase2Task_Clockwise_BlackFade, // 5
+ Phase2Task_Ripple, // 6
+ Phase2Task_Wave, // 7
+ Phase2Task_Slice, // 8
+ Phase2Task_WhiteFade, // 9
+ Phase2Task_GridSquares, // 10
+ Phase2Task_Shards, // 11
+ Phase2Task_Sydney, // 12
+ Phase2Task_Phoebe, // 13
+ Phase2Task_Glacia, // 14
+ Phase2Task_Drake, // 15
+ Phase2Task_Champion, // 16
+ Phase2Task_Aqua, // 17
+ Phase2Task_Magma, // 18
+ Phase2Task_Regice, // 19
+ Phase2Task_Registeel, // 20
+ Phase2Task_Regirock, // 21
+ Phase2Task_Kyogre, // 22
+ Phase2Task_Groudon, // 23
+ Phase2Task_Rayquaza, // 24
+ Phase2Task_ShredSplit, // 25
+ Phase2Task_Blackhole1, // 26
+ Phase2Task_Blackhole2, // 27
+ Phase2Task_RectangularSpiral, // 28
+ Phase2Task_29, // 29
+ Phase2Task_30, // 30
+ Phase2Task_31, // 31
+ Phase2Task_32, // 32
+ Phase2Task_33, // 33
+ Phase2Task_34, // 34
+ Phase2Task_35, // 35
+ Phase2Task_36, // 36
+ Phase2Task_37, // 37
+ Phase2Task_38, // 38
+ Phase2Task_39, // 39
+ Phase2Task_40, // 40
+ Phase2Task_41, // 41
+};
+
+static const TransitionStateFunc sMainTransitionPhases[] =
+{
+ &Transition_Phase1,
+ &Transition_WaitForPhase1,
+ &Transition_Phase2,
+ &Transition_WaitForPhase2
+};
+
+static const TransitionStateFunc sPhase2_Blur_Funcs[] =
+{
+ Phase2_Blur_Func1,
+ Phase2_Blur_Func2,
+ Phase2_Blur_Func3
+};
+
+static const TransitionStateFunc sPhase2_Swirl_Funcs[] =
+{
+ Phase2_Swirl_Func1,
+ Phase2_Swirl_Func2,
+};
+
+static const TransitionStateFunc sPhase2_Shuffle_Funcs[] =
+{
+ Phase2_Shuffle_Func1,
+ Phase2_Shuffle_Func2,
+};
+
+static const TransitionStateFunc sPhase2_Aqua_Funcs[] =
+{
+ Phase2_Aqua_Func1,
+ Phase2_Aqua_Func2,
+ Phase2_BigPokeball_Func3,
+ Phase2_BigPokeball_Func4,
+ Phase2_BigPokeball_Func5,
+ Phase2_FramesCountdown,
+ Phase2_BigPokeball_Func6
+};
+
+static const TransitionStateFunc sPhase2_Magma_Funcs[] =
+{
+ Phase2_Magma_Func1,
+ Phase2_Magma_Func2,
+ Phase2_BigPokeball_Func3,
+ Phase2_BigPokeball_Func4,
+ Phase2_BigPokeball_Func5,
+ Phase2_FramesCountdown,
+ Phase2_BigPokeball_Func6
+};
+
+static const TransitionStateFunc sPhase2_BigPokeball_Funcs[] =
+{
+ Phase2_BigPokeball_Func1,
+ Phase2_BigPokeball_Func2,
+ Phase2_BigPokeball_Func3,
+ Phase2_BigPokeball_Func4,
+ Phase2_BigPokeball_Func5,
+ Phase2_BigPokeball_Func6
+};
+
+static const TransitionStateFunc sPhase2_Regice_Funcs[] =
+{
+ Phase2_Regi_Func1,
+ Phase2_Regice_Func2,
+ Phase2_BigPokeball_Func3,
+ Phase2_BigPokeball_Func4,
+ Phase2_BigPokeball_Func5,
+ Phase2_BigPokeball_Func6
+};
+
+static const TransitionStateFunc sPhase2_Registeel_Funcs[] =
+{
+ Phase2_Regi_Func1,
+ Phase2_Registeel_Func2,
+ Phase2_BigPokeball_Func3,
+ Phase2_BigPokeball_Func4,
+ Phase2_BigPokeball_Func5,
+ Phase2_BigPokeball_Func6
+};
+
+static const TransitionStateFunc sPhase2_Regirock_Funcs[] =
+{
+ Phase2_Regi_Func1,
+ Phase2_Regirock_Func2,
+ Phase2_BigPokeball_Func3,
+ Phase2_BigPokeball_Func4,
+ Phase2_BigPokeball_Func5,
+ Phase2_BigPokeball_Func6
+};
+
+static const TransitionStateFunc sPhase2_Kyogre_Funcs[] =
+{
+ Phase2_WeatherTrio_Func1,
+ Phase2_WaitPaletteFade,
+ Phase2_Kyogre_Func3,
+ Phase2_Kyogre_Func4,
+ Phase2_Kyogre_Func5,
+ Phase2_FramesCountdown,
+ Phase2_WeatherDuo_Func6,
+ Phase2_WeatherDuo_Func7
+};
+
+static const TransitionStateFunc sPhase2_PokeballsTrail_Funcs[] =
+{
+ Phase2_PokeballsTrail_Func1,
+ Phase2_PokeballsTrail_Func2,
+ Phase2_PokeballsTrail_Func3
+};
+
+static const s16 sUnknown_085C8B88[2] = {-16, 256};
+static const s16 sUnknown_085C8B8C[5] = {0, 32, 64, 18, 48};
+static const s16 sUnknown_085C8B96[2] = {8, -8};
+
+static const TransitionStateFunc sPhase2_Clockwise_BlackFade_Funcs[] =
+{
+ Phase2_Clockwise_BlackFade_Func1,
+ Phase2_Clockwise_BlackFade_Func2,
+ Phase2_Clockwise_BlackFade_Func3,
+ Phase2_Clockwise_BlackFade_Func4,
+ Phase2_Clockwise_BlackFade_Func5,
+ Phase2_Clockwise_BlackFade_Func6,
+ Phase2_Clockwise_BlackFade_Func7
+};
+
+static const TransitionStateFunc sPhase2_Ripple_Funcs[] =
+{
+ Phase2_Ripple_Func1,
+ Phase2_Ripple_Func2
+};
+
+static const TransitionStateFunc sPhase2_Wave_Funcs[] =
+{
+ Phase2_Wave_Func1,
+ Phase2_Wave_Func2,
+ Phase2_Wave_Func3
+};
+
+static const TransitionStateFunc sPhase2_Mugshot_Funcs[] =
+{
+ Phase2_Mugshot_Func1,
+ Phase2_Mugshot_Func2,
+ Phase2_Mugshot_Func3,
+ Phase2_Mugshot_Func4,
+ Phase2_Mugshot_Func5,
+ Phase2_Mugshot_Func6,
+ Phase2_Mugshot_Func7,
+ Phase2_Mugshot_Func8,
+ Phase2_Mugshot_Func9,
+ Phase2_Mugshot_Func10
+};
+
+static const u8 sMugshotsTrainerPicIDsTable[MUGSHOTS_COUNT] =
+{
+ TRAINER_PIC_ELITE_FOUR_SIDNEY,
+ TRAINER_PIC_ELITE_FOUR_PHOEBE,
+ TRAINER_PIC_ELITE_FOUR_GLACIA,
+ TRAINER_PIC_ELITE_FOUR_DRAKE,
+ TRAINER_PIC_CHAMPION_WALLACE
+};
+static const s16 sMugshotsOpponentRotationScales[MUGSHOTS_COUNT][2] =
+{
+ {0x200, 0x200},
+ {0x200, 0x200},
+ {0x1B0, 0x1B0},
+ {0x1A0, 0x1A0},
+ {0x188, 0x188},
+};
+static const s16 sMugshotsOpponentCoords[MUGSHOTS_COUNT][2] =
+{
+ {0, 0},
+ {0, 0},
+ {-4, 4},
+ {0, 5},
+ {-8, 7},
+};
+
+static const TransitionSpriteCallback sUnknown_085C8C24[] =
+{
+ sub_81483A8,
+ sub_81483AC,
+ sub_81483F8,
+ sub_814842C,
+ sub_81483A8,
+ sub_8148458,
+ sub_81483A8
+};
+
+static const s16 sUnknown_085C8C40[2] = {12, -12};
+static const s16 sUnknown_085C8C44[2] = {-1, 1};
+
+static const TransitionStateFunc sPhase2_Slice_Funcs[] =
+{
+ Phase2_Slice_Func1,
+ Phase2_Slice_Func2,
+ Phase2_Slice_Func3
+};
+
+static const TransitionStateFunc sPhase2_ShredSplit_Funcs[] =
+{
+ Phase2_ShredSplit_Func1,
+ Phase2_ShredSplit_Func2,
+ Phase2_ShredSplit_Func3,
+ Phase2_ShredSplit_Func4
+};
+
+static const u8 gUnknown_085C8C64[] = {39, 119};
+static const s16 gUnknown_085C8C66[] = {1, -1};
+
+static const TransitionStateFunc sPhase2_Blackhole1_Funcs[] =
+{
+ Phase2_Blackhole_Func1,
+ Phase2_Blackhole1_Func2,
+ Phase2_Blackhole1_Func3
+};
+
+static const TransitionStateFunc sPhase2_Blackhole2_Funcs[] =
+{
+ Phase2_Blackhole_Func1,
+ Phase2_Blackhole2_Func2
+};
+
+static const s16 gUnknown_085C8C80[] = {-6, 4};
+
+static const TransitionStateFunc sPhase2_RectangularSpiral_Funcs[] =
+{
+ Phase2_RectangularSpiral_Func1,
+ Phase2_RectangularSpiral_Func2,
+ Phase2_RectangularSpiral_Func3
+};
+
+static const s16 gUnknown_085C8C90[] = {1, 27, 275, -1};
+static const s16 gUnknown_085C8C98[] = {2, 486, -1};
+static const s16 gUnknown_085C8C9E[] = {3, 262, -1};
+static const s16 gUnknown_085C8CA4[] = {4, 507, -2};
+static const s16 gUnknown_085C8CAA[] = {1, 213, -1};
+static const s16 gUnknown_085C8CB0[] = {2, 548, -2};
+static const s16 gUnknown_085C8CB6[] = {3, 196, -1};
+static const s16 gUnknown_085C8CBC[] = {4, 573, 309, -1};
+static const s16 gUnknown_085C8CC4[] = {1, 474, -1};
+static const s16 gUnknown_085C8CCA[] = {2, 295, 32, -1};
+static const s16 gUnknown_085C8CD2[] = {3, 58, -1};
+static const s16 gUnknown_085C8CD8[] = {4, 455, -1};
+static const s16 gUnknown_085C8CDE[] = {1, 540, -1};
+static const s16 gUnknown_085C8CE4[] = {2, 229, -1};
+static const s16 gUnknown_085C8CEA[] = {3, 244, 28, -1};
+static const s16 gUnknown_085C8CF2[] = {4, 517, -1};
+
+static const s16 *const gUnknown_085C8CF8[] =
+{
+ gUnknown_085C8C90,
+ gUnknown_085C8CA4,
+ gUnknown_085C8C98,
+ gUnknown_085C8C9E,
+ gUnknown_085C8CEA,
+ gUnknown_085C8CE4,
+ gUnknown_085C8CF2,
+ gUnknown_085C8CDE
+};
+
+static const s16 *const gUnknown_085C8D18[] =
+{
+ gUnknown_085C8CBC,
+ gUnknown_085C8CB0,
+ gUnknown_085C8CB6,
+ gUnknown_085C8CAA,
+ gUnknown_085C8CCA,
+ gUnknown_085C8CD8,
+ gUnknown_085C8CC4,
+ gUnknown_085C8CD2
+};
+
+static const s16 *const *const gUnknown_085C8D38[] =
+{
+ gUnknown_085C8CF8,
+ gUnknown_085C8D18
+};
+
+static const TransitionStateFunc sPhase2_Groudon_Funcs[] =
+{
+ Phase2_WeatherTrio_Func1,
+ Phase2_WaitPaletteFade,
+ Phase2_Groudon_Func3,
+ Phase2_Groudon_Func4,
+ Phase2_Groudon_Func5,
+ Phase2_FramesCountdown,
+ Phase2_WeatherDuo_Func6,
+ Phase2_WeatherDuo_Func7
+};
+
+static const TransitionStateFunc sPhase2_Rayquaza_Funcs[] =
+{
+ Phase2_WeatherTrio_Func1,
+ Phase2_WaitPaletteFade,
+ Phase2_Rayquaza_Func3,
+ Phase2_Rayquaza_Func4,
+ Phase2_Rayquaza_Func5,
+ Phase2_Rayquaza_Func6,
+ Phase2_Rayquaza_Func7,
+ Phase2_Rayquaza_Func8,
+ Phase2_Rayquaza_Func9,
+ Phase2_Blackhole1_Func2,
+ Phase2_Blackhole1_Func3
+};
+
+static const TransitionStateFunc sPhase2_WhiteFade_Funcs[] =
+{
+ Phase2_WhiteFade_Func1,
+ Phase2_WhiteFade_Func2,
+ Phase2_WhiteFade_Func3,
+ Phase2_WhiteFade_Func4,
+ Phase2_WhiteFade_Func5
+};
+
+static const s16 sUnknown_085C8DA0[] = {0, 20, 15, 40, 10, 25, 35, 5};
+
+static const TransitionStateFunc sPhase2_GridSquares_Funcs[] =
+{
+ Phase2_GridSquares_Func1,
+ Phase2_GridSquares_Func2,
+ Phase2_GridSquares_Func3
+};
+
+static const TransitionStateFunc sPhase2_Shards_Funcs[] =
+{
+ Phase2_Shards_Func1,
+ Phase2_Shards_Func2,
+ Phase2_Shards_Func3,
+ Phase2_Shards_Func4,
+ Phase2_Shards_Func5
+};
+
+static const s16 sUnknown_085C8DD0[][5] =
+{
+ {56, 0, 0, 160, 0},
+ {104, 160, 240, 88, 1},
+ {240, 72, 56, 0, 1},
+ {0, 32, 144, 160, 0},
+ {144, 160, 184, 0, 1},
+ {56, 0, 168, 160, 0},
+ {168, 160, 48, 0, 1},
+};
+
+static const s16 sUnknown_085C8E16[] = {8, 4, 2, 1, 1, 1, 0};
+
+static const TransitionStateFunc sPhase1_TransitionAll_Funcs[] =
+{
+ Phase1_TransitionAll_Func1,
+ Phase1_TransitionAll_Func2
+};
+
+static const struct SpriteFrameImage sSpriteImageTable_85C8E2C[] =
+{
+ sSpriteImage_85B98F0, 0x200
+};
+
+static const union AnimCmd sSpriteAnim_85C8E34[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_85C8E3C[] =
+{
+ sSpriteAnim_85C8E34
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_85C8E40[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -4, 1),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_85C8E50[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 4, 1),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_85C8E60[] =
+{
+ sSpriteAffineAnim_85C8E40,
+ sSpriteAffineAnim_85C8E50
+};
+
+static const struct SpriteTemplate gUnknown_085C8E68 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4105,
+ .oam = &gEventObjectBaseOam_32x32,
+ .anims = sSpriteAnimTable_85C8E3C,
+ .images = sSpriteImageTable_85C8E2C,
+ .affineAnims = sSpriteAffineAnimTable_85C8E60,
+ .callback = sub_814713C
+};
+
+static const struct OamData gOamData_85C8E80 =
+{
+ .y = 0,
+ .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 struct SpriteFrameImage sSpriteImageTable_85C8E88[] =
+{
+ sSpriteImage_85B9CD0, 0x800
+};
+
+static const struct SpriteFrameImage sSpriteImageTable_85C8E90[] =
+{
+ sSpriteImage_85BA4D0, 0x800
+};
+
+static const union AnimCmd sSpriteAnim_85C8E98[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_85C8EA0[] =
+{
+ sSpriteAnim_85C8E98
+};
+
+static const struct SpriteTemplate sSpriteTemplate_85C8EA4 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4106,
+ .oam = &gOamData_85C8E80,
+ .anims = sSpriteAnimTable_85C8EA0,
+ .images = sSpriteImageTable_85C8E88,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8148380
+};
+
+static const struct SpriteTemplate sSpriteTemplate_85C8EBC =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4106,
+ .oam = &gOamData_85C8E80,
+ .anims = sSpriteAnimTable_85C8EA0,
+ .images = sSpriteImageTable_85C8E90,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8148380
+};
+
+static const u16 gFieldEffectObjectPalette10[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_10.gbapal");
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo10 =
+{
+ gFieldEffectObjectPalette10, 0x1009
+};
+
+static const u16 sMugshotPal_Sydney[] = INCBIN_U16("graphics/battle_transitions/sidney_bg.gbapal");
+static const u16 sMugshotPal_Phoebe[] = INCBIN_U16("graphics/battle_transitions/phoebe_bg.gbapal");
+static const u16 sMugshotPal_Glacia[] = INCBIN_U16("graphics/battle_transitions/glacia_bg.gbapal");
+static const u16 sMugshotPal_Drake[] = INCBIN_U16("graphics/battle_transitions/drake_bg.gbapal");
+static const u16 sMugshotPal_Champion[] = INCBIN_U16("graphics/battle_transitions/wallace_bg.gbapal");
+static const u16 sMugshotPal_Brendan[] = INCBIN_U16("graphics/battle_transitions/brendan_bg.gbapal");
+static const u16 sMugshotPal_May[] = INCBIN_U16("graphics/battle_transitions/may_bg.gbapal");
+
+static const u16 *const sOpponentMugshotsPals[MUGSHOTS_COUNT] =
+{
+ sMugshotPal_Sydney,
+ sMugshotPal_Phoebe,
+ sMugshotPal_Glacia,
+ sMugshotPal_Drake,
+ sMugshotPal_Champion
+};
+
+static const u16 *const sPlayerMugshotsPals[2] =
+{
+ sMugshotPal_Brendan,
+ sMugshotPal_May
+};
+
+static const u16 sUnusedTrainerPalette[] = INCBIN_U16("graphics/battle_transitions/unused_trainer.gbapal");
+static const struct SpritePalette sSpritePalette_UnusedTrainer =
+{
+ sUnusedTrainerPalette, 0x100A
+};
+
+static const u16 sBigPokeball_Tilemap[] = INCBIN_U16("graphics/battle_transitions/big_pokeball_map.bin");
+static const u16 sMugshotsTilemap[] = INCBIN_U16("graphics/battle_transitions/elite_four_bg_map.bin");
+
+static const TransitionStateFunc sPhase2_29_Funcs[] =
+{
+ Phase2_29_Func1,
+ Phase2_29_Func2,
+ Phase2_BigPokeball_Func3,
+ Phase2_BigPokeball_Func4,
+ Phase2_BigPokeball_Func5,
+ Phase2_BigPokeball_Func6
+};
+
+static const TransitionStateFunc sPhase2_30_Funcs[] =
+{
+ Phase2_30_Func1,
+ Phase2_30_Func2,
+ Phase2_30_Func3,
+ Phase2_30_Func4
+};
+
+static const TransitionStateFunc sPhase2_31_Funcs[] =
+{
+ Phase2_31_Func1,
+ Phase2_31_Func2,
+ Phase2_31_Func3,
+ Phase2_31_33_Func5
+};
+
+static const TransitionStateFunc sPhase2_33_Funcs[] =
+{
+ Phase2_33_Func1,
+ Phase2_33_Func2,
+ Phase2_33_Func3,
+ Phase2_33_Func4,
+ Phase2_31_33_Func5
+};
+
+static const TransitionStateFunc sPhase2_32_Funcs[] =
+{
+ Phase2_32_Func1,
+ Phase2_32_Func2,
+ Phase2_32_Func3,
+ Phase2_32_Func4,
+ Phase2_32_Func5
+};
+
+static const u8 gUnknown_085C9A30[] = {0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x1b, 0x14, 0x0d, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x07, 0x0e, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x13, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x10, 0x11, 0x12};
+static const u8 gUnknown_085C9A53[] = {0x00, 0x10, 0x29, 0x16, 0x2c, 0x02, 0x2b, 0x15, 0x2e, 0x1b, 0x09, 0x30, 0x26, 0x05, 0x39, 0x3b, 0x0c, 0x3f, 0x23, 0x1c, 0x0a, 0x35, 0x07, 0x31, 0x27, 0x17, 0x37, 0x01, 0x3e, 0x11, 0x3d, 0x1e, 0x06, 0x22, 0x0f, 0x33, 0x20, 0x3a, 0x0d, 0x2d, 0x25, 0x34, 0x0b, 0x18, 0x3c, 0x13, 0x38, 0x21, 0x1d, 0x32, 0x28, 0x36, 0x0e, 0x03, 0x2f, 0x14, 0x12, 0x19, 0x04, 0x24, 0x1a, 0x2a, 0x1f, 0x08, 0x00};
+
+// code
+static void CB2_TestBattleTransition(void)
+{
+ switch (sTestingTransitionState)
+ {
+ case 0:
+ LaunchBattleTransitionTask(sTestingTransitionId);
+ sTestingTransitionState++;
+ break;
+ case 1:
+ if (IsBattleTransitionDone())
+ {
+ sTestingTransitionState = 0;
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ }
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void TestBattleTransition(u8 transitionId)
+{
+ sTestingTransitionId = transitionId;
+ SetMainCallback2(CB2_TestBattleTransition);
+}
+
+void BattleTransition_StartOnField(u8 transitionId)
+{
+ gMain.callback2 = CB2_OverworldBasic;
+ LaunchBattleTransitionTask(transitionId);
+}
+
+void BattleTransition_Start(u8 transitionId)
+{
+ LaunchBattleTransitionTask(transitionId);
+}
+
+// in all tasks data[0] is reserved for the state
+#define tState data[0]
+
+// main task that launches sub-tasks for phase1 and phase2
+#define tTransitionId data[1]
+#define tTransitionDone data[15]
+
+bool8 IsBattleTransitionDone(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_BattleTransitionMain);
+ if (gTasks[taskId].tTransitionDone)
+ {
+ DestroyTask(taskId);
+ FREE_AND_SET_NULL(sTransitionStructPtr);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void LaunchBattleTransitionTask(u8 transitionId)
+{
+ u8 taskId = CreateTask(Task_BattleTransitionMain, 2);
+ gTasks[taskId].tTransitionId = transitionId;
+ sTransitionStructPtr = AllocZeroed(sizeof(*sTransitionStructPtr));
+}
+
+static void Task_BattleTransitionMain(u8 taskId)
+{
+ while (sMainTransitionPhases[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Transition_Phase1(struct Task *task)
+{
+ sub_80AC3D0();
+ CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
+ if (sPhase1_Tasks[task->tTransitionId] != NULL)
+ {
+ CreateTask(sPhase1_Tasks[task->tTransitionId], 4);
+ task->tState++;
+ return FALSE;
+ }
+ else
+ {
+ task->tState = 2;
+ return TRUE;
+ }
+}
+
+static bool8 Transition_WaitForPhase1(struct Task *task)
+{
+ if (FindTaskIdByFunc(sPhase1_Tasks[task->tTransitionId]) == 0xFF)
+ {
+ task->tState++;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static bool8 Transition_Phase2(struct Task *task)
+{
+ CreateTask(sPhase2_Tasks[task->tTransitionId], 0);
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Transition_WaitForPhase2(struct Task *task)
+{
+ task->tTransitionDone = FALSE;
+ if (FindTaskIdByFunc(sPhase2_Tasks[task->tTransitionId]) == 0xFF)
+ task->tTransitionDone = TRUE;
+ return FALSE;
+}
+
+#undef tTransitionId
+#undef tTransitionDone
+
+static void Phase1Task_TransitionAll(u8 taskId)
+{
+ if (gTasks[taskId].tState == 0)
+ {
+ gTasks[taskId].tState++;
+ CreatePhase1Task(0, 0, 3, 2, 2); // creates a sub-task for this sub-task
+ }
+ else if (IsPhase1Done())
+ {
+ DestroyTask(taskId);
+ }
+}
+
+// sub-task for phase2
+#define tData1 data[1]
+#define tData2 data[2]
+#define tData3 data[3]
+#define tData4 data[4]
+#define tData5 data[5]
+#define tData6 data[6]
+#define tFuncState data[7]
+#define tFrames data[8]
+#define tOpponentSpriteId data[13]
+#define tPlayerSpriteId data[14]
+#define tMugshotId data[15]
+
+static void Phase2Task_Blur(u8 taskId)
+{
+ while (sPhase2_Blur_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Blur_Func1(struct Task *task)
+{
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ SetGpuRegBits(REG_OFFSET_BG1CNT, BGCNT_MOSAIC);
+ SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_MOSAIC);
+ SetGpuRegBits(REG_OFFSET_BG3CNT, BGCNT_MOSAIC);
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Blur_Func2(struct Task *task)
+{
+ if (task->tData1 != 0)
+ {
+ task->tData1--;
+ }
+ else
+ {
+ task->tData1 = 4;
+ if (++task->tData2 == 10)
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0);
+ SetGpuReg(REG_OFFSET_MOSAIC, (task->tData2 & 15) * 17);
+ if (task->tData2 > 14)
+ task->tState++;
+ }
+ return FALSE;
+}
+
+static bool8 Phase2_Blur_Func3(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ u8 taskId = FindTaskIdByFunc(Phase2Task_Blur);
+ DestroyTask(taskId);
+ }
+ return FALSE;
+}
+
+static void Phase2Task_Swirl(u8 taskId)
+{
+ while (sPhase2_Swirl_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Swirl_Func1(struct Task *task)
+{
+ sub_8149F08();
+ ScanlineEffect_Clear();
+ BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0);
+ sub_8149F98(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_14, 0, 2, 0, 160);
+
+ SetVBlankCallback(VBlankCB_Phase2_Swirl);
+ SetHBlankCallback(HBlankCB_Phase2_Swirl);
+
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Swirl_Func2(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ task->tData1 += 4;
+ task->tData2 += 8;
+
+ sub_8149F98(gScanlineEffectRegBuffers[0], sTransitionStructPtr->field_14, task->tData1, 2, task->tData2, 160);
+
+ if (!gPaletteFade.active)
+ {
+ u8 taskId = FindTaskIdByFunc(Phase2Task_Swirl);
+ DestroyTask(taskId);
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Swirl(void)
+{
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+}
+
+static void HBlankCB_Phase2_Swirl(void)
+{
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG1HOFS = var;
+ REG_BG2HOFS = var;
+ REG_BG3HOFS = var;
+}
+
+static void Phase2Task_Shuffle(u8 taskId)
+{
+ while (sPhase2_Shuffle_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Shuffle_Func1(struct Task *task)
+{
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0);
+ memset(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_16, 0x140);
+
+ SetVBlankCallback(VBlankCB_Phase2_Shuffle);
+ SetHBlankCallback(HBlankCB_Phase2_Shuffle);
+
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Shuffle_Func2(struct Task *task)
+{
+ u8 i;
+ u16 r3, r4;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ r4 = task->tData1;
+ r3 = task->tData2 >> 8;
+ task->tData1 += 4224;
+ task->tData2 += 384;
+
+ for (i = 0; i < 160; i++, r4 += 4224)
+ {
+ u16 var = r4 / 256;
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
+ }
+
+ if (!gPaletteFade.active)
+ DestroyTask(FindTaskIdByFunc(Phase2Task_Shuffle));
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Shuffle(void)
+{
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+}
+
+static void HBlankCB_Phase2_Shuffle(void)
+{
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG1VOFS = var;
+ REG_BG2VOFS = var;
+ REG_BG3VOFS = var;
+}
+
+static void Phase2Task_BigPokeball(u8 taskId)
+{
+ while (sPhase2_BigPokeball_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_Aqua(u8 taskId)
+{
+ while (sPhase2_Aqua_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_Magma(u8 taskId)
+{
+ while (sPhase2_Magma_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_Regice(u8 taskId)
+{
+ while (sPhase2_Regice_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_Registeel(u8 taskId)
+{
+ while (sPhase2_Registeel_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_Regirock(u8 taskId)
+{
+ while (sPhase2_Regirock_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_Kyogre(u8 taskId)
+{
+ while (sPhase2_Kyogre_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void sub_814669C(struct Task *task)
+{
+ s32 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ task->tData1 = 16;
+ task->tData2 = 0;
+ task->tData4 = 0;
+ task->tData5 = 0x4000;
+ sTransitionStructPtr->WININ = 63;
+ sTransitionStructPtr->WINOUT = 0;
+ sTransitionStructPtr->WIN0H = 240;
+ sTransitionStructPtr->WIN0V = 160;
+ sTransitionStructPtr->BLDCNT = 0x3F41;
+ sTransitionStructPtr->BLDALPHA = (task->tData1 << 8) | (task->tData2);
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = 240;
+ }
+
+ SetVBlankCallback(VBlankCB0_Phase2_BigPokeball);
+}
+
+static bool8 Phase2_Aqua_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ task->tFrames = 60;
+ sub_814669C(task);
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ LZ77UnCompVram(sTeamAqua_Tileset, dst2);
+ LoadPalette(sEvilTeam_Palette, 0xF0, 0x20);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Magma_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ task->tFrames = 60;
+ sub_814669C(task);
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ LZ77UnCompVram(sTeamMagma_Tileset, dst2);
+ LoadPalette(sEvilTeam_Palette, 0xF0, 0x20);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Regi_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ task->tFrames = 60;
+ sub_814669C(task);
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ CpuCopy16(gUnknown_085BBC14, dst2, 0x2000);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_BigPokeball_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_814669C(task);
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ CpuCopy16(sBigPokeball_Tileset, dst2, 0x580);
+ LoadPalette(gFieldEffectObjectPalette10, 0xF0, 0x20);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_BigPokeball_Func2(struct Task *task)
+{
+ s16 i, j;
+ u16 *dst1, *dst2;
+ const u16 *BigPokeballMap;
+
+ sub_8149F58(&dst1, &dst2);
+ BigPokeballMap = sBigPokeball_Tilemap;
+ for (i = 0; i < 20; i++)
+ {
+ for (j = 0; j < 30; j++, BigPokeballMap++)
+ {
+ dst1[i * 32 + j] = *BigPokeballMap | 0xF000;
+ }
+ }
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Aqua_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(sTeamAqua_Tilemap, dst1);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Magma_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(sTeamMagma_Tilemap, dst1);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Regice_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LoadPalette(gUnknown_085BC2B4, 0xF0, 0x20);
+ CpuCopy16(gUnknown_085BC314, dst1, 0x500);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Registeel_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LoadPalette(gUnknown_085BC2D4, 0xF0, 0x20);
+ CpuCopy16(gUnknown_085BCB14, dst1, 0x500);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Regirock_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LoadPalette(gUnknown_085BC2F4, 0xF0, 0x20);
+ CpuCopy16(gUnknown_085BD314, dst1, 0x500);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Kyogre_Func3(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ LZ77UnCompVram(gUnknown_085BDB34, dst2);
+ LZ77UnCompVram(gUnknown_085BE1E8, dst1);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Kyogre_Func4(struct Task *task)
+{
+ if (task->tData1 % 3 == 0)
+ {
+ u16 var = task->tData1 % 30;
+ var /= 3;
+ LoadPalette(gUnknown_085BEDA0 + (var * 16), 0xF0, 0x20);
+ }
+ if (++task->tData1 > 58)
+ {
+ task->tState++;
+ task->tData1 = 0;
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_Kyogre_Func5(struct Task *task)
+{
+ if (task->tData1 % 5 == 0)
+ {
+ s16 var = task->tData1 / 5;
+ LoadPalette(gUnknown_085BEEE0 + (var * 16), 0xF0, 0x20);
+ }
+ if (++task->tData1 > 68)
+ {
+ task->tState++;
+ task->tData1 = 0;
+ task->tFrames = 30;
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_WeatherDuo_Func6(struct Task *task)
+{
+ BeginNormalPaletteFade(0xFFFF8000, 1, 0, 0x10, 0);
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_WeatherDuo_Func7(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(task->func));
+ }
+ return FALSE;
+}
+
+static bool8 Phase2_BigPokeball_Func3(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ if (task->tData3 == 0 || --task->tData3 == 0)
+ {
+ task->tData2++;
+ task->tData3 = 2;
+ }
+ sTransitionStructPtr->BLDALPHA = (task->tData1 << 8) | task->tData2;
+ if (task->tData2 > 15)
+ task->tState++;
+ task->tData4 += 8;
+ task->tData5 -= 256;
+
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_BigPokeball_Func4(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ if (task->tData3 == 0 || --task->tData3 == 0)
+ {
+ task->tData1--;
+ task->tData3 = 2;
+ }
+ sTransitionStructPtr->BLDALPHA = (task->tData1 << 8) | task->tData2;
+ if (task->tData1 == 0)
+ task->tState++;
+ task->tData4 += 8;
+ task->tData5 -= 256;
+
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_BigPokeball_Func5(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ task->tData4 += 8;
+ task->tData5 -= 256;
+
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+
+ if (task->tData5 <= 0)
+ {
+ task->tState++;
+ task->tData1 = 160;
+ task->tData2 = 256;
+ task->tData3 = 0;
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_FramesCountdown(struct Task *task)
+{
+ if (--task->tFrames == 0)
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_WeatherTrio_Func1(struct Task *task)
+{
+ BeginNormalPaletteFade(0x0000FFFF, 1, 0, 0x10, 0);
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_WaitPaletteFade(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_BigPokeball_Func6(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ if (task->tData2 < 1024)
+ task->tData2 += 128;
+ if (task->tData1 != 0)
+ {
+ task->tData1 -= (task->tData2 >> 8);
+ if (task->tData1 < 0)
+ task->tData1 = 0;
+ }
+ sub_814A014(gScanlineEffectRegBuffers[0], 120, 80, task->tData1);
+ if (task->tData1 == 0)
+ {
+ SetVBlankCallback(NULL);
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(task->func));
+ }
+ else
+ {
+ if (task->tData3 == 0)
+ {
+ task->tData3++;
+ SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ }
+
+ return FALSE;
+}
+
+static void Transition_BigPokeball_Vblank(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+ REG_BLDCNT = sTransitionStructPtr->BLDCNT;
+ REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
+}
+
+static void VBlankCB0_Phase2_BigPokeball(void)
+{
+ Transition_BigPokeball_Vblank();
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BG0HOFS, 0xA2400001);
+}
+
+static void VBlankCB1_Phase2_BigPokeball(void)
+{
+ Transition_BigPokeball_Vblank();
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
+}
+
+static void Phase2Task_PokeballsTrail(u8 taskId)
+{
+ while (sPhase2_PokeballsTrail_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_PokeballsTrail_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ CpuSet(sPokeballTrail_Tileset, dst2, 0x20);
+ CpuFill32(0, dst1, 0x800);
+ LoadPalette(gFieldEffectObjectPalette10, 0xF0, 0x20);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_PokeballsTrail_Func2(struct Task *task)
+{
+ s16 i;
+ s16 rand;
+ s16 arr0[ARRAY_COUNT(sUnknown_085C8B88)];
+ s16 arr1[ARRAY_COUNT(sUnknown_085C8B8C)];
+
+ memcpy(arr0, sUnknown_085C8B88, sizeof(sUnknown_085C8B88));
+ memcpy(arr1, sUnknown_085C8B8C, sizeof(sUnknown_085C8B8C));
+ rand = Random() & 1;
+ for (i = 0; i <= 4; i++, rand ^= 1)
+ {
+ gFieldEffectArguments[0] = arr0[rand]; // x
+ gFieldEffectArguments[1] = (i * 32) + 16; // y
+ gFieldEffectArguments[2] = rand;
+ gFieldEffectArguments[3] = arr1[i];
+ FieldEffectStart(FLDEFF_POKEBALL);
+ }
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_PokeballsTrail_Func3(struct Task *task)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_POKEBALL))
+ {
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_PokeballsTrail));
+ }
+ return FALSE;
+}
+
+bool8 FldEff_Pokeball(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&gUnknown_085C8E68, gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].data[0] = gFieldEffectArguments[2];
+ gSprites[spriteId].data[1] = gFieldEffectArguments[3];
+ gSprites[spriteId].data[2] = -1;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], gFieldEffectArguments[2]);
+ return FALSE;
+}
+
+#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \
+{ \
+ u32 index = (posY) * 32 + posX; \
+ ptr[index] = toStore; \
+}
+
+static void sub_814713C(struct Sprite *sprite)
+{
+ s16 arr0[ARRAY_COUNT(sUnknown_085C8B96)];
+
+ memcpy(arr0, sUnknown_085C8B96, sizeof(sUnknown_085C8B96));
+ if (sprite->data[1] != 0)
+ {
+ sprite->data[1]--;
+ }
+ else
+ {
+ if (sprite->pos1.x >= 0 && sprite->pos1.x <= 240)
+ {
+ s16 posX = sprite->pos1.x >> 3;
+ s16 posY = sprite->pos1.y >> 3;
+
+ if (posX != sprite->data[2])
+ {
+ u32 var;
+ u16 *ptr;
+
+ sprite->data[2] = posX;
+ var = (((REG_BG0CNT >> 8) & 0x1F) << 11); // r2
+ ptr = (u16 *)(VRAM + var);
+
+ SOME_VRAM_STORE(ptr, posY - 2, posX, 0xF001);
+ SOME_VRAM_STORE(ptr, posY - 1, posX, 0xF001);
+ SOME_VRAM_STORE(ptr, posY - 0, posX, 0xF001);
+ SOME_VRAM_STORE(ptr, posY + 1, posX, 0xF001);
+ }
+ }
+ sprite->pos1.x += arr0[sprite->data[0]];
+ if (sprite->pos1.x < -15 || sprite->pos1.x > 255)
+ FieldEffectStop(sprite, FLDEFF_POKEBALL);
+ }
+}
+
+static void Phase2Task_Clockwise_BlackFade(u8 taskId)
+{
+ while (sPhase2_Clockwise_BlackFade_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task)
+{
+ u16 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ sTransitionStructPtr->WININ = 0;
+ sTransitionStructPtr->WINOUT = 63;
+ sTransitionStructPtr->WIN0H = -3855;
+ sTransitionStructPtr->WIN0V = 160;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = 0xF3F4;
+ }
+
+ SetVBlankCallback(VBlankCB_Phase2_Clockwise_BlackFade);
+ sTransitionStructPtr->data[4] = 120;
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Clockwise_BlackFade_Func2(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], -1, 1, 1);
+ do
+ {
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] + 1) | 0x7800;
+ } while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
+
+ sTransitionStructPtr->data[4] += 16;
+ if (sTransitionStructPtr->data[4] >= 240)
+ {
+ sTransitionStructPtr->data[5] = 0;
+ task->tState++;
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task)
+{
+ s16 r1, r3;
+ vu8 var = 0;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ sub_814A1AC(sTransitionStructPtr->data, 120, 80, 240, sTransitionStructPtr->data[5], 1, 1);
+
+ while (1)
+ {
+ r1 = 120, r3 = sTransitionStructPtr->data[2] + 1;
+ if (sTransitionStructPtr->data[5] >= 80)
+ r1 = sTransitionStructPtr->data[2], r3 = 240;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
+ if (var != 0)
+ break;
+ var = sub_814A228(sTransitionStructPtr->data, 1, 1);
+ }
+
+ sTransitionStructPtr->data[5] += 8;
+ if (sTransitionStructPtr->data[5] >= 160)
+ {
+ sTransitionStructPtr->data[4] = 240;
+ task->tState++;
+ }
+ else
+ {
+ while (sTransitionStructPtr->data[3] < sTransitionStructPtr->data[5])
+ {
+ gScanlineEffectRegBuffers[0][++sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
+ }
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Clockwise_BlackFade_Func4(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], 160, 1, 1);
+ do
+ {
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] << 8) | 0xF0;
+ } while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
+
+ sTransitionStructPtr->data[4] -= 16;
+ if (sTransitionStructPtr->data[4] <= 0)
+ {
+ sTransitionStructPtr->data[5] = 160;
+ task->tState++;
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task)
+{
+ s16 r1, r2, var4;
+ vu8 var = 0;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ sub_814A1AC(sTransitionStructPtr->data, 120, 80, 0, sTransitionStructPtr->data[5], 1, 1);
+
+ while (1)
+ {
+ r1 = (gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]]) & 0xFF;
+ r2 = sTransitionStructPtr->data[2];
+ if (sTransitionStructPtr->data[5] <= 80)
+ r2 = 120, r1 = sTransitionStructPtr->data[2];
+ var4 = (r1) | (r2 << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = var4;
+ if (var != 0)
+ break;
+ var = sub_814A228(sTransitionStructPtr->data, 1, 1);
+ }
+
+ sTransitionStructPtr->data[5] -= 8;
+ if (sTransitionStructPtr->data[5] <= 0)
+ {
+ sTransitionStructPtr->data[4] = 0;
+ task->tState++;
+ }
+ else
+ {
+ while (sTransitionStructPtr->data[3] > sTransitionStructPtr->data[5])
+ {
+ gScanlineEffectRegBuffers[0][--sTransitionStructPtr->data[3]] = (r1) | (r2 << 8);
+ }
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Clockwise_BlackFade_Func6(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], 0, 1, 1);
+ do
+ {
+ s16 r2, r3;
+
+ r2 = 120, r3 = sTransitionStructPtr->data[2];
+ if (sTransitionStructPtr->data[2] >= 120)
+ r2 = 0, r3 = 240;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r2 << 8);
+
+ } while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
+
+ sTransitionStructPtr->data[4] += 16;
+ if (sTransitionStructPtr->data[2] > 120)
+ task->tState++;
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Clockwise_BlackFade_Func7(struct Task *task)
+{
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_Clockwise_BlackFade));
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Clockwise_BlackFade(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA != 0)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+ REG_WIN0H = gScanlineEffectRegBuffers[1][0];
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
+}
+
+static void Phase2Task_Ripple(u8 taskId)
+{
+ while (sPhase2_Ripple_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Ripple_Func1(struct Task *task)
+{
+ u8 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
+ }
+
+ SetVBlankCallback(VBlankCB_Phase2_Ripple);
+ SetHBlankCallback(HBlankCB_Phase2_Ripple);
+
+ EnableInterrupts(INTR_FLAG_HBLANK);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Ripple_Func2(struct Task *task)
+{
+ u8 i;
+ s16 r3;
+ u16 r4, r8;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ r3 = task->tData2 >> 8;
+ r4 = task->tData1;
+ r8 = 384;
+ task->tData1 += 0x400;
+ if (task->tData2 <= 0x1FFF)
+ task->tData2 += 0x180;
+
+ for (i = 0; i < 160; i++, r4 += r8)
+ {
+ // todo: fix the asm
+ s16 var = r4 >> 8;
+ asm("");
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
+ }
+
+ if (++task->tData3 == 81)
+ {
+ task->tData4++;
+ BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 0x10, 0);
+ }
+
+ if (task->tData4 != 0 && !gPaletteFade.active)
+ DestroyTask(FindTaskIdByFunc(Phase2Task_Ripple));
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Ripple(void)
+{
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+}
+
+static void HBlankCB_Phase2_Ripple(void)
+{
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG1VOFS = var;
+ REG_BG2VOFS = var;
+ REG_BG3VOFS = var;
+}
+
+static void Phase2Task_Wave(u8 taskId)
+{
+ while (sPhase2_Wave_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Wave_Func1(struct Task *task)
+{
+ u8 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ sTransitionStructPtr->WININ = 63;
+ sTransitionStructPtr->WINOUT = 0;
+ sTransitionStructPtr->WIN0H = 240;
+ sTransitionStructPtr->WIN0V = 160;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = 242;
+ }
+
+ SetVBlankCallback(VBlankCB_Phase2_Wave);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Wave_Func2(struct Task *task)
+{
+ u8 i, r5;
+ u16* toStore;
+ bool8 nextFunc;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ toStore = gScanlineEffectRegBuffers[0];
+ r5 = task->tData2;
+ task->tData2 += 16;
+ task->tData1 += 8;
+
+ for (i = 0, nextFunc = TRUE; i < 160; i++, r5 += 4, toStore++)
+ {
+ s16 value = task->tData1 + Sin(r5, 40);
+ if (value < 0)
+ value = 0;
+ if (value > 240)
+ value = 240;
+ *toStore = (value << 8) | (0xF1);
+ if (value < 240)
+ nextFunc = FALSE;
+ }
+ if (nextFunc)
+ task->tState++;
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Wave_Func3(struct Task *task)
+{
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_Wave));
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Wave(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA != 0)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
+}
+
+static void Phase2Task_Sydney(u8 taskId)
+{
+ gTasks[taskId].tMugshotId = MUGSHOT_SYDNEY;
+ Phase2Task_MugShotTransition(taskId);
+}
+
+static void Phase2Task_Phoebe(u8 taskId)
+{
+ gTasks[taskId].tMugshotId = MUGSHOT_PHOEBE;
+ Phase2Task_MugShotTransition(taskId);
+}
+
+static void Phase2Task_Glacia(u8 taskId)
+{
+ gTasks[taskId].tMugshotId = MUGSHOT_GLACIA;
+ Phase2Task_MugShotTransition(taskId);
+}
+
+static void Phase2Task_Drake(u8 taskId)
+{
+ gTasks[taskId].tMugshotId = MUGSHOT_DRAKE;
+ Phase2Task_MugShotTransition(taskId);
+}
+
+static void Phase2Task_Champion(u8 taskId)
+{
+ gTasks[taskId].tMugshotId = MUGSHOT_CHAMPION;
+ Phase2Task_MugShotTransition(taskId);
+}
+
+static void Phase2Task_MugShotTransition(u8 taskId)
+{
+ while (sPhase2_Mugshot_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Mugshot_Func1(struct Task *task)
+{
+ u8 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+ Mugshots_CreateOpponentPlayerSprites(task);
+
+ task->tData1 = 0;
+ task->tData2 = 1;
+ task->tData3 = 239;
+ sTransitionStructPtr->WININ = 63;
+ sTransitionStructPtr->WINOUT = 62;
+ sTransitionStructPtr->WIN0V = 160;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = 0xF0F1;
+ }
+
+ SetVBlankCallback(VBlankCB0_Phase2_Mugshots);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func2(struct Task *task)
+{
+ s16 i, j;
+ u16 *dst1, *dst2;
+ const u16 *MugshotsMap;
+
+ MugshotsMap = sMugshotsTilemap;
+ sub_8149F58(&dst1, &dst2);
+ CpuSet(sUnknown_085B9AF0, dst2, 0xF0);
+ LoadPalette(sOpponentMugshotsPals[task->tMugshotId], 0xF0, 0x20);
+ LoadPalette(sPlayerMugshotsPals[gSaveBlock2Ptr->playerGender], 0xFA, 0xC);
+
+ for (i = 0; i < 20; i++)
+ {
+ for (j = 0; j < 32; j++, MugshotsMap++)
+ {
+ dst1[i * 32 + j] = *MugshotsMap | 0xF000;
+ }
+ }
+
+ EnableInterrupts(INTR_FLAG_HBLANK);
+
+ SetHBlankCallback(HBlankCB_Phase2_Mugshots);
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func3(struct Task *task)
+{
+ u8 i, r5;
+ u16* toStore;
+ s16 value;
+ s32 mergedValue;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ toStore = gScanlineEffectRegBuffers[0];
+ r5 = task->tData1;
+ task->tData1 += 0x10;
+
+ for (i = 0; i < 80; i++, toStore++, r5 += 0x10)
+ {
+ value = task->tData2 + Sin(r5, 0x10);
+ if (value < 0)
+ value = 1;
+ if (value > 0xF0)
+ value = 0xF0;
+ *toStore = value;
+ }
+ for (; i < 160; i++, toStore++, r5 += 0x10)
+ {
+ value = task->tData3 - Sin(r5, 0x10);
+ if (value < 0)
+ value = 0;
+ if (value > 0xEF)
+ value = 0xEF;
+ *toStore = (value << 8) | (0xF0);
+ }
+
+ task->tData2 += 8;
+ task->tData3 -= 8;
+ if (task->tData2 > 0xF0)
+ task->tData2 = 0xF0;
+ if (task->tData3 < 0)
+ task->tData3 = 0;
+ mergedValue = *(s32*)(&task->tData2);
+ if (mergedValue == 0xF0)
+ task->tState++;
+
+ sTransitionStructPtr->BG0HOFS_1 -= 8;
+ sTransitionStructPtr->BG0HOFS_2 += 8;
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func4(struct Task *task)
+{
+ u8 i;
+ u16* toStore;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ for (i = 0, toStore = gScanlineEffectRegBuffers[0]; i < 160; i++, toStore++)
+ {
+ *toStore = 0xF0;
+ }
+
+ task->tState++;
+ task->tData1 = 0;
+ task->tData2 = 0;
+ task->tData3 = 0;
+ sTransitionStructPtr->BG0HOFS_1 -= 8;
+ sTransitionStructPtr->BG0HOFS_2 += 8;
+
+ sub_8148484(task->tOpponentSpriteId, 0);
+ sub_8148484(task->tPlayerSpriteId, 1);
+ sub_814849C(task->tOpponentSpriteId);
+
+ PlaySE(SE_BT_START);
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func5(struct Task *task)
+{
+ sTransitionStructPtr->BG0HOFS_1 -= 8;
+ sTransitionStructPtr->BG0HOFS_2 += 8;
+ if (sub_81484B8(task->tOpponentSpriteId))
+ {
+ task->tState++;
+ sub_814849C(task->tPlayerSpriteId);
+ }
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func6(struct Task *task)
+{
+ sTransitionStructPtr->BG0HOFS_1 -= 8;
+ sTransitionStructPtr->BG0HOFS_2 += 8;
+ if (sub_81484B8(task->tPlayerSpriteId))
+ {
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ SetVBlankCallback(NULL);
+ DmaStop(0);
+ memset(gScanlineEffectRegBuffers[0], 0, 0x140);
+ memset(gScanlineEffectRegBuffers[1], 0, 0x140);
+ SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ task->tState++;
+ task->tData3 = 0;
+ task->tData4 = 0;
+ sTransitionStructPtr->BLDCNT = 0xBF;
+ SetVBlankCallback(VBlankCB1_Phase2_Mugshots);
+ }
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func7(struct Task *task)
+{
+ bool32 r6;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ r6 = TRUE;
+ sTransitionStructPtr->BG0HOFS_1 -= 8;
+ sTransitionStructPtr->BG0HOFS_2 += 8;
+
+ if (task->tData4 < 0x50)
+ task->tData4 += 2;
+ if (task->tData4 > 0x50)
+ task->tData4 = 0x50;
+
+ if (++task->tData3 & 1)
+ {
+ s16 i;
+ for (i = 0, r6 = FALSE; i <= task->tData4; i++)
+ {
+ s16 index1 = 0x50 - i;
+ s16 index2 = 0x50 + i;
+ if (gScanlineEffectRegBuffers[0][index1] <= 15)
+ {
+ r6 = TRUE;
+ gScanlineEffectRegBuffers[0][index1]++;
+ }
+ if (gScanlineEffectRegBuffers[0][index2] <= 15)
+ {
+ r6 = TRUE;
+ gScanlineEffectRegBuffers[0][index2]++;
+ }
+ }
+ }
+
+ if (task->tData4 == 0x50 && !r6)
+ task->tState++;
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func8(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ BlendPalettes(-1, 0x10, 0x7FFF);
+ sTransitionStructPtr->BLDCNT = 0xFF;
+ task->tData3 = 0;
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Mugshot_Func9(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ task->tData3++;
+ memset(gScanlineEffectRegBuffers[0], task->tData3, 0x140);
+ if (task->tData3 > 15)
+ task->tState++;
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Mugshot_Func10(struct Task *task)
+{
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(task->func));
+ return FALSE;
+}
+
+static void VBlankCB0_Phase2_Mugshots(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA != 0)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ REG_BG0VOFS = sTransitionStructPtr->BG0VOFS;
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
+}
+
+static void VBlankCB1_Phase2_Mugshots(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA != 0)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ REG_BLDCNT = sTransitionStructPtr->BLDCNT;
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BLDY, 0xA2400001);
+}
+
+static void HBlankCB_Phase2_Mugshots(void)
+{
+ if (REG_VCOUNT < 80)
+ REG_BG0HOFS = sTransitionStructPtr->BG0HOFS_1;
+ else
+ REG_BG0HOFS = sTransitionStructPtr->BG0HOFS_2;
+}
+
+static void Mugshots_CreateOpponentPlayerSprites(struct Task *task)
+{
+ struct Sprite *opponentSprite, *playerSprite;
+
+ s16 mugshotId = task->tMugshotId;
+ task->tOpponentSpriteId = CreateTrainerSprite(sMugshotsTrainerPicIDsTable[mugshotId],
+ sMugshotsOpponentCoords[mugshotId][0] - 32,
+ sMugshotsOpponentCoords[mugshotId][1] + 42,
+ 0, gDecompressionBuffer);
+ task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), 272, 106, 0, gDecompressionBuffer);
+
+ opponentSprite = &gSprites[task->tOpponentSpriteId];
+ playerSprite = &gSprites[task->tPlayerSpriteId];
+
+ opponentSprite->callback = sub_8148380;
+ playerSprite->callback = sub_8148380;
+
+ opponentSprite->oam.affineMode = 3;
+ playerSprite->oam.affineMode = 3;
+
+ opponentSprite->oam.matrixNum = AllocOamMatrix();
+ playerSprite->oam.matrixNum = AllocOamMatrix();
+
+ opponentSprite->oam.shape = 1;
+ playerSprite->oam.shape = 1;
+
+ opponentSprite->oam.size = 3;
+ playerSprite->oam.size = 3;
+
+ CalcCenterToCornerVec(opponentSprite, 1, 3, 3);
+ CalcCenterToCornerVec(playerSprite, 1, 3, 3);
+
+ SetOamMatrixRotationScaling(opponentSprite->oam.matrixNum, sMugshotsOpponentRotationScales[mugshotId][0], sMugshotsOpponentRotationScales[mugshotId][1], 0);
+ SetOamMatrixRotationScaling(playerSprite->oam.matrixNum, -512, 512, 0);
+}
+
+static void sub_8148380(struct Sprite *sprite)
+{
+ while (sUnknown_085C8C24[sprite->data[0]](sprite));
+}
+
+static bool8 sub_81483A8(struct Sprite *sprite)
+{
+ return FALSE;
+}
+
+static bool8 sub_81483AC(struct Sprite *sprite)
+{
+ s16 arr0[2];
+ s16 arr1[2];
+
+ memcpy(arr0, sUnknown_085C8C40, sizeof(sUnknown_085C8C40));
+ memcpy(arr1, sUnknown_085C8C44, sizeof(sUnknown_085C8C44));
+
+ sprite->data[0]++;
+ sprite->data[1] = arr0[sprite->data[7]];
+ sprite->data[2] = arr1[sprite->data[7]];
+ return TRUE;
+}
+
+static bool8 sub_81483F8(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->data[1];
+ if (sprite->data[7] && sprite->pos1.x < 133)
+ sprite->data[0]++;
+ else if (!sprite->data[7] && sprite->pos1.x > 103)
+ sprite->data[0]++;
+ return FALSE;
+}
+
+static bool8 sub_814842C(struct Sprite *sprite)
+{
+ sprite->data[1] += sprite->data[2];
+ sprite->pos1.x += sprite->data[1];
+ if (sprite->data[1] == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[2] = -sprite->data[2];
+ sprite->data[6] = 1;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8148458(struct Sprite *sprite)
+{
+ sprite->data[1] += sprite->data[2];
+ sprite->pos1.x += sprite->data[1];
+ if (sprite->pos1.x < -31 || sprite->pos1.x > 271)
+ sprite->data[0]++;
+ return FALSE;
+}
+
+static void sub_8148484(s16 spriteId, s16 value)
+{
+ gSprites[spriteId].data[7] = value;
+}
+
+static void sub_814849C(s16 spriteId)
+{
+ gSprites[spriteId].data[0]++;
+}
+
+static s16 sub_81484B8(s16 spriteId)
+{
+ return gSprites[spriteId].data[6];
+}
+
+static void Phase2Task_Slice(u8 taskId)
+{
+ while (sPhase2_Slice_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Slice_Func1(struct Task *task)
+{
+ u16 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ task->tData2 = 256;
+ task->tData3 = 1;
+ sTransitionStructPtr->WININ = 63;
+ sTransitionStructPtr->WINOUT = 0;
+ sTransitionStructPtr->WIN0V = 160;
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[1][160 + i] = 0xF0;
+ }
+
+ EnableInterrupts(INTR_FLAG_HBLANK);
+ SetGpuRegBits(REG_OFFSET_DISPSTAT, DISPSTAT_HBLANK_INTR);
+
+ SetVBlankCallback(VBlankCB_Phase2_Slice);
+ SetHBlankCallback(HBlankCB_Phase2_Slice);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Slice_Func2(struct Task *task)
+{
+ u16 i;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ task->tData1 += (task->tData2 >> 8);
+ if (task->tData1 > 0xF0)
+ task->tData1 = 0xF0;
+ if (task->tData2 <= 0xFFF)
+ task->tData2 += task->tData3;
+ if (task->tData3 < 128)
+ task->tData3 <<= 1; // multiplying by two
+
+ for (i = 0; i < 160; i++)
+ {
+ u16 *storeLoc1 = &gScanlineEffectRegBuffers[0][i];
+ u16 *storeLoc2 = &gScanlineEffectRegBuffers[0][i + 160];
+ if (i & 1)
+ {
+ *storeLoc1 = sTransitionStructPtr->field_14 + task->tData1;
+ *storeLoc2 = 0xF0 - task->tData1;
+ }
+ else
+ {
+ *storeLoc1 = sTransitionStructPtr->field_14 - task->tData1;
+ *storeLoc2 = (task->tData1 << 8) | (0xF1);
+ }
+ }
+
+ if (task->tData1 > 0xEF)
+ task->tState++;
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Slice_Func3(struct Task *task)
+{
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_Slice));
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Slice(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
+ DmaSet(0, &gScanlineEffectRegBuffers[1][160], &REG_WIN0H, 0xA2400001);
+}
+
+static void HBlankCB_Phase2_Slice(void)
+{
+ if (REG_VCOUNT < 160)
+ {
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG1HOFS = var;
+ REG_BG2HOFS = var;
+ REG_BG3HOFS = var;
+ }
+}
+
+static void Phase2Task_ShredSplit(u8 taskId)
+{
+ while (sPhase2_ShredSplit_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_ShredSplit_Func1(struct Task *task)
+{
+ u16 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ sTransitionStructPtr->WININ = 63;
+ sTransitionStructPtr->WINOUT = 0;
+ sTransitionStructPtr->WIN0V = 160;
+
+ for (i = 0; i < 0xA0; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[1][0xA0 + i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[0][0xA0 + i] = 0xF0;
+ gScanlineEffectRegBuffers[0][0x140 + i] = 0;
+ gScanlineEffectRegBuffers[0][0x1E0 + i] = 0x100;
+ gScanlineEffectRegBuffers[0][0x280 + i] = 1;
+ }
+
+ task->tData4 = 0;
+ task->tData5 = 0;
+ task->tData6 = 7;
+
+ EnableInterrupts(INTR_FLAG_HBLANK);
+
+ SetVBlankCallback(VBlankCB_Phase2_Slice);
+ SetHBlankCallback(HBlankCB_Phase2_Slice);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_ShredSplit_Func2(struct Task *task)
+{
+ u16 i, j, k;
+ u8 arr1[ARRAY_COUNT(gUnknown_085C8C64)];
+ s16 arr2[ARRAY_COUNT(gUnknown_085C8C66)];
+ u8 var;
+ u16 *ptr4, *ptr3, *ptr1, *ptr2;
+ s16 unkVar;
+
+ memcpy(arr1, gUnknown_085C8C64, sizeof(arr1));
+ memcpy(arr2, gUnknown_085C8C66, sizeof(arr2));
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ var = 0;
+
+ for (i = 0; i <= task->tData5; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ for (k = 0; k < 2; k++)
+ {
+ unkVar = (arr1[j]) + (arr2[k] * -(i) * 2);
+ if (unkVar >= 0 && (unkVar != 79 || j != 1))
+ {
+ ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
+ ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
+ if (*ptr4 > 0xEF)
+ {
+ *ptr4 = 0xF0;
+ var++;
+ }
+ else
+ {
+ *ptr4 += (*ptr3 >> 8);
+ if (*ptr1 <= 0x7F)
+ *ptr1 *= 2;
+ if (*ptr3 <= 0xFFF)
+ *ptr3 += *ptr1;
+ }
+ ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
+ *ptr2 = sTransitionStructPtr->field_14 + *ptr4;
+ *ptr3 = 0xF0 - *ptr4;
+
+ if (i == 0)
+ break;
+ }
+ }
+ }
+
+ for (j = 0; j < 2; j++)
+ {
+ for (k = 0; k < 2; k++)
+ {
+ unkVar = (arr1[j] + 1) + (arr2[k] * -(i) * 2);
+ if (unkVar <= 160 && (unkVar != 80 || j != 1))
+ {
+ ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
+ ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
+ if (*ptr4 > 0xEF)
+ {
+ *ptr4 = 0xF0;
+ var++;
+ }
+ else
+ {
+ *ptr4 += (*ptr3 >> 8);
+ if (*ptr1 <= 0x7F)
+ *ptr1 *= 2;
+ if (*ptr3 <= 0xFFF)
+ *ptr3 += *ptr1;
+ }
+ ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
+ *ptr2 = sTransitionStructPtr->field_14 - *ptr4;
+ *ptr3 = (*ptr4 << 8) | (0xF1);
+
+ if (i == 0)
+ break;
+ }
+ }
+ }
+ }
+
+ if (--task->tData4 < 0)
+ task->tData4 = 0;
+ if (task->tData4 <= 0 && task->tData5 + 1 <= 20)
+ task->tData4 = task->tData6, task->tData5++;
+ if (var > 0x9F)
+ task->tState++;
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+// This function never increments the state counter, because the loop condition
+// is always false, resulting in the game being stuck in an infinite loop.
+// It's possible this transition is only partially
+// done and the second part was left out.
+static bool8 Phase2_ShredSplit_Func3(struct Task *task)
+{
+ u16 i;
+ bool32 done = TRUE;
+ u16 checkVar2 = 0xFF10;
+
+ for (i = 0; i < 0xA0; i++)
+ {
+ if (gScanlineEffectRegBuffers[1][i] != 0xF0 && gScanlineEffectRegBuffers[1][i] != checkVar2)
+ done = FALSE; // a break statement should be put here
+ }
+
+ if (done == TRUE)
+ task->tState++;
+
+ return FALSE;
+}
+
+static bool8 Phase2_ShredSplit_Func4(struct Task *task)
+{
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_ShredSplit));
+ return FALSE;
+}
+
+static void Phase2Task_Blackhole1(u8 taskId)
+{
+ while (sPhase2_Blackhole1_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_Blackhole2(u8 taskId)
+{
+ while (sPhase2_Blackhole2_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Blackhole_Func1(struct Task *task)
+{
+ s32 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ sTransitionStructPtr->WININ = 0;
+ sTransitionStructPtr->WINOUT = 63;
+ sTransitionStructPtr->WIN0H = 240;
+ sTransitionStructPtr->WIN0V = 160;
+
+ for (i = 0; i < 0xA0; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = 0;
+ }
+
+ SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
+
+ task->tState++;
+ task->tData1 = 1;
+ task->tData2 = 0x100;
+ task->tFuncState = 0;
+
+ return FALSE;
+}
+
+static bool8 Phase2_Blackhole1_Func3(struct Task *task)
+{
+ if (task->tFuncState == 1)
+ {
+ DmaStop(0);
+ SetVBlankCallback(NULL);
+ DestroyTask(FindTaskIdByFunc(task->func));
+ }
+ else
+ {
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ if (task->tData2 < 0x400)
+ task->tData2 += 0x80;
+ if (task->tData1 < 0xA0)
+ task->tData1 += (task->tData2 >> 8);
+ if (task->tData1 > 0xA0)
+ task->tData1 = 0xA0;
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
+ if (task->tData1 == 0xA0)
+ {
+ task->tFuncState = 1;
+ sub_8149F84();
+ }
+ else
+ {
+ sTransitionStructPtr->VBlank_DMA++;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_Blackhole1_Func2(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ if (task->tFuncState == 0)
+ {
+ task->tFuncState++;
+ task->tData1 = 0x30;
+ task->tData6 = 0;
+ }
+ task->tData1 += gUnknown_085C8C80[task->tData6];
+ task->tData6 = (task->tData6 + 1) % 2;
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
+ if (task->tData1 < 9)
+ {
+ task->tState++;
+ task->tFuncState = 0;
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Blackhole2_Func2(struct Task *task)
+{
+ u16 index; // should be s16 I think
+ s16 amplitude;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+ if (task->tFuncState == 0)
+ {
+ task->tFuncState++;
+ task->tData5 = 2;
+ task->tData6 = 2;
+ }
+ if (task->tData1 > 0xA0)
+ task->tData1 = 0xA0;
+
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
+ if (task->tData1 == 0xA0)
+ {
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(task->func));
+ }
+
+ index = task->tData5;
+ if ((task->tData5 & 0xFF) <= 128)
+ {
+ amplitude = task->tData6;
+ task->tData5 += 8;
+ }
+ else
+ {
+ amplitude = task->tData6 - 1;
+ task->tData5 += 16;
+ }
+ task->tData1 += Sin(index & 0xFF, amplitude);
+
+ if (task->tData1 <= 0)
+ task->tData1 = 1;
+ if (task->tData5 > 0xFE)
+ task->tData5 >>= 8, task->tData6++;
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static void Phase2Task_RectangularSpiral(u8 taskId)
+{
+ while (sPhase2_RectangularSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_RectangularSpiral_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ CpuCopy16(sShrinkingBoxTileset, dst2, 0x20);
+ CpuCopy16(sShrinkingBoxTileset + 0x70, dst2 + 0x20, 0x20);
+ CpuFill16(0xF000, dst1, 0x800);
+ LoadPalette(gFieldEffectObjectPalette10, 0xF0, 0x20);
+
+ task->tData3 = 1;
+ task->tState++;
+
+ sRectangularSpiralTransition[0].field_0 = 0;
+ sRectangularSpiralTransition[0].field_2 = -1;
+ sRectangularSpiralTransition[0].field_4 = 1;
+ sRectangularSpiralTransition[0].field_6 = 308;
+ sRectangularSpiralTransition[0].field_8 = 0;
+
+ sRectangularSpiralTransition[1].field_0 = 0;
+ sRectangularSpiralTransition[1].field_2 = -1;
+ sRectangularSpiralTransition[1].field_4 = 1;
+ sRectangularSpiralTransition[1].field_6 = 308;
+ sRectangularSpiralTransition[1].field_8 = 0;
+
+ sRectangularSpiralTransition[2].field_0 = 0;
+ sRectangularSpiralTransition[2].field_2 = -3;
+ sRectangularSpiralTransition[2].field_4 = 1;
+ sRectangularSpiralTransition[2].field_6 = 307;
+ sRectangularSpiralTransition[2].field_8 = 0;
+
+ sRectangularSpiralTransition[3].field_0 = 0;
+ sRectangularSpiralTransition[3].field_2 = -3;
+ sRectangularSpiralTransition[3].field_4 = 1;
+ sRectangularSpiralTransition[3].field_6 = 307;
+ sRectangularSpiralTransition[3].field_8 = 0;
+
+ return FALSE;
+}
+
+static bool8 Phase2_RectangularSpiral_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+ u8 i;
+ u16 j;
+ bool32 done = TRUE;
+
+ sub_8149F58(&dst1, &dst2);
+
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < ARRAY_COUNT(sRectangularSpiralTransition); j++)
+ {
+ s16 var = 0, var2 = 0;
+ s32 var3 = 0;
+
+ if (sub_8149048(gUnknown_085C8D38[j / 2], &sRectangularSpiralTransition[j]))
+ {
+ u32 one;
+ done = FALSE;
+ var = sRectangularSpiralTransition[j].field_2;
+ one = 1;
+ if ((j & 1) == one)
+ var = 0x27D - var;
+
+ var2 = var % 32;
+ var3 = var / 32 * 32;
+
+ dst1[var3 + var2] = 0xF002;
+ }
+ }
+ }
+
+ if (done == TRUE)
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_RectangularSpiral_Func3(struct Task *task)
+{
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(task->func));
+ return FALSE;
+}
+
+static bool16 sub_8149048(const s16 * const *arg0, struct StructRectangularSpiral *arg1)
+{
+ const s16 *array = arg0[arg1->field_0];
+ if (array[arg1->field_4] == -1)
+ return FALSE;
+
+ // ??
+ sUnusedRectangularSpiralVar = array[0];
+ sUnusedRectangularSpiralVar = array[1];
+ sUnusedRectangularSpiralVar = array[2];
+ sUnusedRectangularSpiralVar = array[3];
+
+ switch (array[0])
+ {
+ case 1:
+ arg1->field_2 += 0x1;
+ break;
+ case 2:
+ arg1->field_2 -= 0x1;
+ break;
+ case 3:
+ arg1->field_2 -= 0x20;
+ break;
+ case 4:
+ arg1->field_2 += 0x20;
+ break;
+ }
+
+ if (arg1->field_2 > 0x27F || array[arg1->field_4] == -1)
+ return FALSE;
+
+ if (arg1->field_8 == 0 && array[arg1->field_4] == -2)
+ {
+ arg1->field_8 = 1;
+ arg1->field_4 = 1;
+ arg1->field_2 = arg1->field_6;
+ arg1->field_0 = 4;
+ }
+
+ if (arg1->field_2 == array[arg1->field_4])
+ {
+ (arg1->field_0)++;
+ if (arg1->field_8 == 1)
+ {
+ if (arg1->field_0 > 7)
+ {
+ (arg1->field_4)++;
+ (arg1->field_0) = 4;
+ }
+ }
+ else
+ {
+ if (arg1->field_0 > 3)
+ {
+ (arg1->field_4)++;
+ (arg1->field_0) = 0;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+static void Phase2Task_Groudon(u8 taskId)
+{
+ while (sPhase2_Groudon_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Groudon_Func3(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ LZ77UnCompVram(gUnknown_085BE51C, dst2);
+ LZ77UnCompVram(gUnknown_085BEA88, dst1);
+
+ task->tState++;
+ task->tData1 = 0;
+ return FALSE;
+}
+
+static bool8 Phase2_Groudon_Func4(struct Task *task)
+{
+ if (task->tData1 % 3 == 0)
+ {
+ u16 var = (task->tData1 % 30) / 3;
+ LoadPalette(gUnknown_085BF0A0 + (var * 16), 0xF0, 0x20);
+ }
+ if (++task->tData1 > 58)
+ {
+ task->tState++;
+ task->tData1 = 0;
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_Groudon_Func5(struct Task *task)
+{
+ if (task->tData1 % 5 == 0)
+ {
+ s16 var = task->tData1 / 5;
+ LoadPalette(gUnknown_085BF2A0 + (var * 16), 0xF0, 0x20);
+ }
+ if (++task->tData1 > 68)
+ {
+ task->tState++;
+ task->tData1 = 0;
+ task->tFrames = 30;
+ }
+
+ return FALSE;
+}
+
+static void Phase2Task_Rayquaza(u8 taskId)
+{
+ while (sPhase2_Rayquaza_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Rayquaza_Func3(struct Task *task)
+{
+ u16 *dst1, *dst2;
+ u16 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ SetGpuReg(REG_OFFSET_BG0CNT, 0x9A08);
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ CpuCopy16(gUnknown_085BF6A0, dst2, 0x2000);
+
+ sTransitionStructPtr->field_20 = 0;
+ task->tState++;
+ LoadPalette(gUnknown_085BF4A0 + 0x50, 0xF0, 0x20);
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = 0;
+ gScanlineEffectRegBuffers[1][i] = 0x100;
+ }
+
+ SetVBlankCallback(VBlankCB_Phase2_Rayquaza);
+ return FALSE;
+}
+
+static bool8 Phase2_Rayquaza_Func4(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ CpuCopy16(gUnknown_085C6BE0, dst1, 0x1000);
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Rayquaza_Func5(struct Task *task)
+{
+ if ((task->tData1 % 4) == 0)
+ {
+ u16 value = task->tData1 / 4;
+ const u16 *palPtr = &gUnknown_085BF4A0[(value + 5) * 16];
+ LoadPalette(palPtr, 0xF0, 0x20);
+ }
+ if (++task->tData1 > 40)
+ {
+ task->tState++;
+ task->tData1 = 0;
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_Rayquaza_Func6(struct Task *task)
+{
+ if (++task->tData1 > 20)
+ {
+ task->tState++;
+ task->tData1 = 0;
+ BeginNormalPaletteFade(0xFFFF8000, 2, 0, 0x10, 0);
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_Rayquaza_Func7(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sTransitionStructPtr->field_20 = 1;
+ task->tState++;
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_Rayquaza_Func8(struct Task *task)
+{
+ BlendPalettes(0x00007FFF, 8, 0);
+ BlendPalettes(0xFFFF8000, 0, 0);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_Rayquaza_Func9(struct Task *task)
+{
+ if ((task->tData1 % 3) == 0)
+ {
+ u16 value = task->tData1 / 3;
+ const u16 *palPtr = &gUnknown_085BF4A0[(value + 0) * 16];
+ LoadPalette(palPtr, 0xF0, 0x20);
+ }
+ if (++task->tData1 >= 40)
+ {
+ u16 i;
+
+ sTransitionStructPtr->WININ = 0;
+ sTransitionStructPtr->WINOUT = 63;
+ sTransitionStructPtr->WIN0H = 240;
+ sTransitionStructPtr->WIN0V = 160;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = 0;
+ }
+
+ SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
+ task->tState++;
+ task->tData2 = 0x100;
+ task->tFuncState = 0;
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
+ }
+
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Rayquaza(void)
+{
+ void *dmaSrc;
+
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+
+ if (sTransitionStructPtr->field_20 == 0)
+ dmaSrc = gScanlineEffectRegBuffers[0];
+ else if (sTransitionStructPtr->field_20 == 1)
+ dmaSrc = gScanlineEffectRegBuffers[1];
+ else
+ dmaSrc = gScanlineEffectRegBuffers[0];
+
+ DmaSet(0, dmaSrc, &REG_BG0VOFS, 0xA2400001);
+}
+
+static void Phase2Task_WhiteFade(u8 taskId)
+{
+ while (sPhase2_WhiteFade_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_WhiteFade_Func1(struct Task *task)
+{
+ u16 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ sTransitionStructPtr->BLDCNT = 0xBF;
+ sTransitionStructPtr->BLDY = 0;
+ sTransitionStructPtr->WININ = 0x1E;
+ sTransitionStructPtr->WINOUT = 0x3F;
+ sTransitionStructPtr->WIN0V = 0xA0;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = 0;
+ gScanlineEffectRegBuffers[1][i + 160] = 0xF0;
+ }
+
+ EnableInterrupts(INTR_FLAG_HBLANK);
+ SetHBlankCallback(HBlankCB_Phase2_WhiteFade);
+ SetVBlankCallback(VBlankCB0_Phase2_WhiteFade);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_WhiteFade_Func2(struct Task *task)
+{
+ s16 i, posY;
+ s16 arr1[ARRAY_COUNT(sUnknown_085C8DA0)];
+ struct Sprite *sprite;
+
+ memcpy(arr1, sUnknown_085C8DA0, sizeof(sUnknown_085C8DA0));
+ for (i = 0, posY = 0; i < 8; i++, posY += 0x14)
+ {
+ sprite = &gSprites[CreateInvisibleSprite(sub_8149864)];
+ sprite->pos1.x = 0xF0;
+ sprite->pos1.y = posY;
+ sprite->data[5] = arr1[i];
+ }
+ sprite->data[6]++;
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_WhiteFade_Func3(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = 0;
+ if (sTransitionStructPtr->field_20 > 7)
+ {
+ BlendPalettes(-1, 0x10, 0x7FFF);
+ task->tState++;
+ }
+ return FALSE;
+}
+
+static bool8 Phase2_WhiteFade_Func4(struct Task *task)
+{
+ sTransitionStructPtr->VBlank_DMA = 0;
+
+ DmaStop(0);
+ SetVBlankCallback(0);
+ SetHBlankCallback(0);
+
+ sTransitionStructPtr->WIN0H = 0xF0;
+ sTransitionStructPtr->BLDY = 0;
+ sTransitionStructPtr->BLDCNT = 0xFF;
+ sTransitionStructPtr->WININ = 0x3F;
+
+ SetVBlankCallback(VBlankCB1_Phase2_WhiteFade);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_WhiteFade_Func5(struct Task *task)
+{
+ if (++sTransitionStructPtr->BLDY > 16)
+ {
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_WhiteFade));
+ }
+ return FALSE;
+}
+
+static void VBlankCB0_Phase2_WhiteFade(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ REG_BLDCNT = sTransitionStructPtr->BLDCNT;
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
+ DmaSet(0, &gScanlineEffectRegBuffers[1][160], &REG_WIN0H, 0xA2400001);
+}
+
+static void VBlankCB1_Phase2_WhiteFade(void)
+{
+ VBlankCB_BattleTransition();
+ REG_BLDY = sTransitionStructPtr->BLDY;
+ REG_BLDCNT = sTransitionStructPtr->BLDCNT;
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0H = sTransitionStructPtr->WIN0H;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+}
+
+static void HBlankCB_Phase2_WhiteFade(void)
+{
+ REG_BLDY = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+}
+
+static void sub_8149864(struct Sprite *sprite)
+{
+ if (sprite->data[5])
+ {
+ sprite->data[5]--;
+ if (sprite->data[6])
+ sTransitionStructPtr->VBlank_DMA = 1;
+ }
+ else
+ {
+ u16 i;
+ u16* ptr1 = &gScanlineEffectRegBuffers[0][sprite->pos1.y];
+ u16* ptr2 = &gScanlineEffectRegBuffers[0][sprite->pos1.y + 160];
+ for (i = 0; i < 20; i++)
+ {
+ ptr1[i] = sprite->data[0] >> 8;
+ ptr2[i] = (u8)(sprite->pos1.x);
+ }
+ if (sprite->pos1.x == 0 && sprite->data[0] == 0x1000)
+ sprite->data[1] = 1;
+
+ sprite->pos1.x -= 16;
+ sprite->data[0] += 0x80;
+
+ if (sprite->pos1.x < 0)
+ sprite->pos1.x = 0;
+ if (sprite->data[0] > 0x1000)
+ sprite->data[0] = 0x1000;
+
+ if (sprite->data[6])
+ sTransitionStructPtr->VBlank_DMA = 1;
+
+ if (sprite->data[1])
+ {
+ if (sprite->data[6] == 0 || (sTransitionStructPtr->field_20 > 6 && sprite->data[2]++ > 7))
+ {
+ sTransitionStructPtr->field_20++;
+ DestroySprite(sprite);
+ }
+ }
+ }
+}
+
+static void Phase2Task_GridSquares(u8 taskId)
+{
+ while (sPhase2_GridSquares_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_GridSquares_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ CpuSet(sShrinkingBoxTileset, dst2, 0x10);
+ CpuFill16(0xF000, dst1, 0x800);
+ LoadPalette(gFieldEffectObjectPalette10, 0xF0, 0x20);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_GridSquares_Func2(struct Task *task)
+{
+ u16* dst1;
+
+ if (task->tData1 == 0)
+ {
+ sub_8149F40(&dst1);
+ task->tData1 = 3;
+ task->tData2++;
+ CpuSet(sShrinkingBoxTileset + (task->tData2 * 8), dst1, 0x10);
+ if (task->tData2 > 0xD)
+ {
+ task->tState++;
+ task->tData1 = 16;
+ }
+ }
+
+ task->tData1--;
+ return FALSE;
+}
+
+static bool8 Phase2_GridSquares_Func3(struct Task *task)
+{
+ if (--task->tData1 == 0)
+ {
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_GridSquares));
+ }
+ return FALSE;
+}
+
+static void Phase2Task_Shards(u8 taskId)
+{
+ while (sPhase2_Shards_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_Shards_Func1(struct Task *task)
+{
+ u16 i;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+
+ sTransitionStructPtr->WININ = 0x3F;
+ sTransitionStructPtr->WINOUT = 0;
+ sTransitionStructPtr->WIN0V = 0xA0;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
+ }
+
+ CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 0xA0);
+ SetVBlankCallback(VBlankCB_Phase2_Shards);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Shards_Func2(struct Task *task)
+{
+ sub_814A1AC(sTransitionStructPtr->data,
+ sUnknown_085C8DD0[task->tData1][0],
+ sUnknown_085C8DD0[task->tData1][1],
+ sUnknown_085C8DD0[task->tData1][2],
+ sUnknown_085C8DD0[task->tData1][3],
+ 1, 1);
+ task->tData2 = sUnknown_085C8DD0[task->tData1][4];
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_Shards_Func3(struct Task *task)
+{
+ s16 i;
+ bool8 nextFunc;
+
+ sTransitionStructPtr->VBlank_DMA = 0;
+
+ for (i = 0, nextFunc = FALSE; i < 16; i++)
+ {
+ s16 r3 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] >> 8;
+ s16 r4 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] & 0xFF;
+ if (task->tData2 == 0)
+ {
+ if (r3 < sTransitionStructPtr->data[2])
+ r3 = sTransitionStructPtr->data[2];
+ if (r3 > r4)
+ r3 = r4;
+ }
+ else
+ {
+ if (r4 > sTransitionStructPtr->data[2])
+ r4 = sTransitionStructPtr->data[2];
+ if (r4 <= r3)
+ r4 = r3;
+ }
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r4) | (r3 << 8);
+ if (nextFunc)
+ {
+ task->tState++;
+ break;
+ }
+ else
+ nextFunc = sub_814A228(sTransitionStructPtr->data, 1, 1);
+ }
+
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static bool8 Phase2_Shards_Func4(struct Task *task)
+{
+ if (++task->tData1 < 7)
+ {
+ task->tState++;
+ task->tData3 = sUnknown_085C8E16[task->tData1 - 1];
+ return TRUE;
+ }
+ else
+ {
+ DmaStop(0);
+ sub_8149F84();
+ DestroyTask(FindTaskIdByFunc(Phase2Task_Shards));
+ return FALSE;
+ }
+}
+
+static bool8 Phase2_Shards_Func5(struct Task *task)
+{
+ if (--task->tData3 == 0)
+ {
+ task->tState = 1;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_Shards(void)
+{
+ DmaStop(0);
+ VBlankCB_BattleTransition();
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ REG_WININ = sTransitionStructPtr->WININ;
+ REG_WINOUT = sTransitionStructPtr->WINOUT;
+ REG_WIN0V = sTransitionStructPtr->WIN0V;
+ REG_WIN0H = gScanlineEffectRegBuffers[1][0];
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
+}
+
+// sub-task for phase2
+#undef tData1
+#undef tData2
+#undef tData3
+#undef tData4
+#undef tData5
+#undef tData6
+#undef tFuncState
+#undef tFrames
+#undef tOpponentSpriteId
+#undef tPlayerSpriteId
+#undef tMugshotId
+
+// sub-task for sub-task phase
+#define tData1 data[1]
+#define tData2 data[2]
+#define tData3 data[3]
+#define tData4 data[4]
+#define tData5 data[5]
+#define tData6 data[6]
+#define tData7 data[7]
+
+static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4)
+{
+ u8 taskId = CreateTask(TransitionPhase1_Task_RunFuncs, 3);
+ gTasks[taskId].tData1 = a0;
+ gTasks[taskId].tData2 = a1;
+ gTasks[taskId].tData3 = a2;
+ gTasks[taskId].tData4 = a3;
+ gTasks[taskId].tData5 = a4;
+ gTasks[taskId].tData6 = a0;
+}
+
+static bool8 IsPhase1Done(void)
+{
+ if (FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void TransitionPhase1_Task_RunFuncs(u8 taskId)
+{
+ while (sPhase1_TransitionAll_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase1_TransitionAll_Func1(struct Task *task)
+{
+ if (task->tData6 == 0 || --task->tData6 == 0)
+ {
+ task->tData6 = task->tData1;
+ task->tData7 += task->tData4;
+ if (task->tData7 > 16)
+ task->tData7 = 16;
+ BlendPalettes(-1, task->tData7, 0x2D6B);
+ }
+ if (task->tData7 > 15)
+ {
+ task->tState++;
+ task->tData6 = task->tData2;
+ }
+ return FALSE;
+}
+
+static bool8 Phase1_TransitionAll_Func2(struct Task *task)
+{
+ if (task->tData6 == 0 || --task->tData6 == 0)
+ {
+ task->tData6 = task->tData2;
+ task->tData7 -= task->tData5;
+ if (task->tData7 < 0)
+ task->tData7 = 0;
+ BlendPalettes(-1, task->tData7, 0x2D6B);
+ }
+ if (task->tData7 == 0)
+ {
+ if (--task->tData3 == 0)
+ DestroyTask(FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs));
+ else
+ {
+ task->tData6 = task->tData1;
+ task->tState = 0;
+ }
+ }
+ return FALSE;
+}
+
+#undef tData1
+#undef tData2
+#undef tData3
+#undef tData4
+#undef tData5
+#undef tData6
+#undef tData7
+
+static void sub_8149F08(void)
+{
+ memset(sTransitionStructPtr, 0, sizeof(*sTransitionStructPtr));
+ sub_8089C08(&sTransitionStructPtr->field_14, &sTransitionStructPtr->field_16);
+}
+
+static void VBlankCB_BattleTransition(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_8149F40(u16 **a0)
+{
+ u16 reg, *vram;
+
+ reg = REG_BG0CNT >> 2;
+ reg <<= 0xE;
+ vram = (u16*)(VRAM + reg);
+
+ *a0 = vram;
+}
+
+void sub_8149F58(u16 **a0, u16 **a1)
+{
+ u16 reg0, reg1, *vram0, *vram1;
+
+ reg0 = REG_BG0CNT >> 8;
+ reg1 = REG_BG0CNT >> 2;
+
+ reg0 <<= 0xB;
+ reg1 <<= 0xE;
+
+ vram0 = (u16*)(VRAM + reg0);
+ *a0 = vram0;
+
+ vram1 = (u16*)(VRAM + reg1);
+ *a1 = vram1;
+}
+
+static void sub_8149F84(void)
+{
+ BlendPalettes(-1, 0x10, 0);
+}
+
+static void sub_8149F98(s16 *array, s16 sinAdd, s16 index, s16 indexIncrementer, s16 amplitude, s16 arrSize)
+{
+ u8 i;
+ for (i = 0; arrSize > 0; arrSize--, i++, index += indexIncrementer)
+ {
+ array[i] = sinAdd + Sin(0xFF & index, amplitude);
+ }
+}
+
+static void sub_814A014(u16 *array, s16 a1, s16 a2, s16 a3)
+{
+ s16 i;
+
+ memset(array, 0xA, 160 * sizeof(s16));
+ for (i = 0; i < 64; i++)
+ {
+ s16 sinResult, cosResult;
+ s16 toStoreOrr, r2, r3, toStore, r7, r8;
+
+ sinResult = Sin(i, a3);
+ cosResult = Cos(i, a3);
+
+ toStoreOrr = a1 - sinResult;
+ toStore = a1 + sinResult;
+ r7 = a2 - cosResult;
+ r8 = a2 + cosResult;
+
+ if (toStoreOrr < 0)
+ toStoreOrr = 0;
+ if (toStore > 0xF0)
+ toStore = 0xF0;
+ if (r7 < 0)
+ r7 = 0;
+ if (r8 > 0x9F)
+ r8 = 0x9F;
+
+ toStore |= (toStoreOrr << 8);
+ array[r7] = toStore;
+ array[r8] = toStore;
+
+ cosResult = Cos(i + 1, a3);
+ r3 = a2 - cosResult;
+ r2 = a2 + cosResult;
+
+ if (r3 < 0)
+ r3 = 0;
+ if (r2 > 0x9F)
+ r2 = 0x9F;
+
+ while (r7 > r3)
+ array[--r7] = toStore;
+ while (r7 < r3)
+ array[++r7] = toStore;
+
+ while (r8 > r2)
+ array[--r8] = toStore;
+ while (r8 < r2)
+ array[++r8] = toStore;
+ }
+}
+
+static void sub_814A1AC(s16 *data, s16 a1, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6)
+{
+ data[0] = a1;
+ data[1] = a2;
+ data[2] = a1;
+ data[3] = a2;
+ data[4] = a3;
+ data[5] = a4;
+ data[6] = a5;
+ data[7] = a6;
+ data[8] = a3 - a1;
+ if (data[8] < 0)
+ {
+ data[8] = -data[8];
+ data[6] = -a5;
+ }
+ data[9] = a4 - a2;
+ if (data[9] < 0)
+ {
+ data[9] = -data[9];
+ data[7] = -a6;
+ }
+ data[10] = 0;
+}
+
+static bool8 sub_814A228(s16 *data, bool8 a1, bool8 a2)
+{
+ u8 var;
+ if (data[8] > data[9])
+ {
+ data[2] += data[6];
+ data[10] += data[9];
+ if (data[10] > data[8])
+ {
+ data[3] += data[7];
+ data[10] -= data[8];
+ }
+ }
+ else
+ {
+ data[3] += data[7];
+ data[10] += data[8];
+ if (data[10] > data[9])
+ {
+ data[2] += data[6];
+ data[10] -= data[9];
+ }
+ }
+ var = 0;
+ if ((data[6] > 0 && data[2] >= data[4]) || (data[6] < 0 && data[2] <= data[4]))
+ {
+ var++;
+ if (a1)
+ data[2] = data[4];
+ }
+ if ((data[7] > 0 && data[3] >= data[5]) || (data[7] < 0 && data[3] <= data[5]))
+ {
+ var++;
+ if (a2)
+ data[3] = data[5];
+ }
+
+ if (var == 2)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+// sub-task for phase2 of a couple of new transitions
+#define tData1 data[1]
+#define tData2 data[2]
+#define tData3 data[3]
+#define tData4 data[4]
+#define tData5 data[5]
+#define tData6 data[6]
+#define tData7 data[7]
+
+static bool8 Phase2_29_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_814669C(task);
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ LZ77UnCompVram(gUnknown_085C7C00, dst2);
+ LoadPalette(gUnknown_085C7BE0, 0xF0, 0x20);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_29_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(gUnknown_085C828C, dst1);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 0x84, task->tData5, 160);
+
+ task->tState++;
+ return TRUE;
+}
+
+static void Phase2Task_29(u8 taskId)
+{
+ while (sPhase2_29_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_30(u8 taskId)
+{
+ while (sPhase2_30_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_30_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F08();
+ ScanlineEffect_Clear();
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
+ task->tData2 = 0x2000;
+ task->tData1 = 0x7FFF;
+ task->tData5 = 0;
+ task->tData6 = 16;
+ task->tData7 = 2560;
+ sTransitionStructPtr->BLDCNT = 0x3F41;
+ sTransitionStructPtr->BLDALPHA = (task->tData6 << 8) | (task->tData5);
+ REG_BLDCNT = sTransitionStructPtr->BLDCNT;
+ REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
+ sub_8149F58(&dst1, &dst2);
+ CpuFill16(0, dst1, 0x800);
+ LZ77UnCompVram(gUnknown_085C7C00, dst2);
+ LoadPalette(gUnknown_085C7BE0, 0xF0, 0x20);
+ sTransitionStructPtr->field_16 = 0;
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_30_Func2(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(gUnknown_085C828C, dst1);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_30_Func3(struct Task *task)
+{
+ u8 i;
+
+ for (i = 0; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
+ }
+
+ SetVBlankCallback(VBlankCB_Phase2_30);
+ SetHBlankCallback(HBlankCB_Phase2_30);
+ EnableInterrupts(INTR_FLAG_HBLANK);
+
+ task->tState++;
+ return TRUE;
+}
+
+static bool8 Phase2_30_Func4(struct Task *task)
+{
+ u8 i;
+ u16 var6, amplitude, var8;
+
+ sTransitionStructPtr->VBlank_DMA = FALSE;
+
+ amplitude = task->tData2 >> 8;
+ var6 = task->tData1;
+ var8 = 384;
+
+ task->tData1 = var6 - task->tData7;
+
+ if (task->tData3 >= 70)
+ {
+ if (task->tData2 - 384 >= 0)
+ task->tData2 -= 384;
+ else
+ task->tData2 = 0;
+ }
+
+ if (task->tData3 >= 0 && task->tData3 % 3 == 0)
+ {
+ if (task->tData5 < 16)
+ task->tData5++;
+ else if (task->tData6 > 0)
+ task->tData6--;
+
+ sTransitionStructPtr->BLDALPHA = (task->tData6 << 8) | (task->tData5);
+ }
+
+ for (i = 0; i < 160; i++, var6 += var8)
+ {
+ s16 index = var6 / 256;
+ asm("");
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(index, amplitude);
+ }
+
+ if (++task->tData3 == 101)
+ {
+ task->tData4++;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ }
+
+ if (task->tData4 != 0 && !gPaletteFade.active)
+ DestroyTask(FindTaskIdByFunc(Phase2Task_30));
+
+ task->tData7 -= 17;
+ sTransitionStructPtr->VBlank_DMA++;
+ return FALSE;
+}
+
+static void VBlankCB_Phase2_30(void)
+{
+ VBlankCB_BattleTransition();
+ REG_BLDCNT = sTransitionStructPtr->BLDCNT;
+ REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
+
+ if (sTransitionStructPtr->VBlank_DMA)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+}
+
+static void HBlankCB_Phase2_30(void)
+{
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG0VOFS = var;
+}
+
+static void Phase2Task_31(u8 taskId)
+{
+ while (sPhase2_31_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_33(u8 taskId)
+{
+ while (sPhase2_33_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static void Phase2Task_32(u8 taskId)
+{
+ while (sPhase2_32_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 Phase2_31_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(gUnknown_085C8598, dst2);
+
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF);
+ FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF);
+ CopyBgTilemapBufferToVram(0);
+ LoadPalette(gUnknown_085C8578, 0xF0, 0x20);
+
+ task->tData2 = 1;
+ task->tData3 = 0;
+ task->tData4 = 0;
+ task->tData7 = 10;
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_31_Func2(struct Task *task)
+{
+ CopyRectToBgTilemapBufferRect(0, gUnknown_085C8928, 0, 0, 4, 4, task->tData2, task->tData3, 4, 4, 0xF, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+
+ task->tData2 += 4;
+ if (++task->tData4 == 7)
+ {
+ task->tData2 = 1;
+ task->tData3 += 4;
+ task->tData4 = 0;
+ if (task->tData3 > 19)
+ task->tState++;
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_31_Func3(struct Task *task)
+{
+ u8 i;
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ if (task->tData6++ >= task->tData7)
+ {
+ switch (task->tData5)
+ {
+ case 0:
+ for (i = 250; i < 255; i++)
+ {
+ gPlttBufferUnfaded[i] = 0;
+ gPlttBufferFaded[i] = 0;
+ }
+ break;
+ case 1:
+ BlendPalettes(0xFFFF7FFF, 0x10, 0);
+ LZ77UnCompVram(gUnknown_085C86F4, dst2);
+ break;
+ case 2:
+ LZ77UnCompVram(gUnknown_085C87F4, dst2);
+ break;
+ case 3:
+ LZ77UnCompVram(gUnknown_085C88A4, dst2);
+ break;
+ default:
+ FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
+ CopyBgTilemapBufferToVram(0);
+ task->tState++;
+ return FALSE;
+ }
+
+ task->tData6 = 0;
+ task->tData5++;
+ }
+
+ return FALSE;
+}
+
+static bool8 Phase2_33_Func1(struct Task *task)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(gUnknown_085C8598, dst2);
+
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF);
+ FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF);
+ CopyBgTilemapBufferToVram(0);
+ LoadPalette(gUnknown_085C8578, 0xE0, 0x20);
+ LoadPalette(gUnknown_085C8578, 0xF0, 0x20);
+ BlendPalette(0xE0, 0x10, 8, 0);
+
+ task->tData2 = 34;
+ task->tData3 = 0;
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_33_Func2(struct Task *task)
+{
+ u8 var = gUnknown_085C9A30[task->tData2];
+ u8 varMod = var % 7;
+ u8 varDiv = var / 7;
+ CopyRectToBgTilemapBufferRect(0, &gUnknown_085C8928, 0, 0, 4, 4, 4 * varMod + 1, 4 * varDiv, 4, 4, 0xF, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+
+ if (--task->tData2 < 0)
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_33_Func3(struct Task *task)
+{
+ BlendPalette(0xE0, 0x10, 3, 0);
+ BlendPalettes(0xFFFF3FFF, 0x10, 0);
+
+ task->tData2 = 0;
+ task->tData3 = 0;
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_33_Func4(struct Task *task)
+{
+ if ((task->tData3 ^= 1))
+ {
+ CopyRectToBgTilemapBufferRect(
+ 0,
+ gUnknown_085C8928,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4 * (gUnknown_085C9A30[task->tData2] % 7) + 1,
+ 4 * (gUnknown_085C9A30[task->tData2] / 7),
+ 4,
+ 4,
+ 0xE,
+ 0,
+ 0);
+ }
+ else
+ {
+ if (task->tData2 > 0)
+ {
+ FillBgTilemapBufferRect(
+ 0,
+ 1,
+ 4 * (gUnknown_085C9A30[task->tData2 - 1] % 7) + 1,
+ 4 * (gUnknown_085C9A30[task->tData2 - 1] / 7),
+ 4,
+ 4,
+ 0xF);
+ }
+
+ task->tData2++;
+ }
+
+ if (task->tData2 > 34)
+ task->tState++;
+
+ CopyBgTilemapBufferToVram(0);
+ return FALSE;
+}
+
+static bool8 Phase2_31_33_Func5(struct Task *task)
+{
+ FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
+ CopyBgTilemapBufferToVram(0);
+ BlendPalettes(0xFFFFFFFF, 0x10, 0);
+ DestroyTask(FindTaskIdByFunc(task->func));
+ return FALSE;
+}
+
+// sub task for phase2 32
+#define tSub32_X_delta data[0]
+#define tSub32_Y_delta data[1]
+#define tSub32_Bool data[2]
+
+static void sub_814ABE4(u8 taskId)
+{
+ if (!(gTasks[taskId].tSub32_Bool ^= 1))
+ {
+ SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X);
+ SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
+ gBattle_BG0_X += gTasks[taskId].tSub32_X_delta;
+ gBattle_BG0_Y += gTasks[taskId].tSub32_Y_delta;
+ }
+}
+
+static bool8 Phase2_32_Func1(struct Task *task)
+{
+ u8 taskId = 0;
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(gUnknown_085C8598, dst2);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ CopyBgTilemapBufferToVram(0);
+ LoadPalette(gUnknown_085C8578, 0xF0, 0x20);
+
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_X);
+ SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
+
+ task->tData2 = 0;
+ taskId = CreateTask(sub_814ABE4, 1);
+ switch (Random() % 4)
+ {
+ case 0:
+ gTasks[taskId].tSub32_X_delta = 1;
+ gTasks[taskId].tSub32_Y_delta = 1;
+ break;
+ case 1:
+ gTasks[taskId].tSub32_X_delta = -1;
+ gTasks[taskId].tSub32_Y_delta = -1;
+ break;
+ case 2:
+ gTasks[taskId].tSub32_X_delta = 1;
+ gTasks[taskId].tSub32_Y_delta = -1;
+ break;
+ default:
+ gTasks[taskId].tSub32_X_delta = -1;
+ gTasks[taskId].tSub32_Y_delta = 1;
+ break;
+ }
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_32_Func2(struct Task *task)
+{
+ u8 var = gUnknown_085C9A53[task->tData2];
+ u8 varDiv = var / 8;
+ u8 varAnd = var & 7;
+
+ CopyRectToBgTilemapBufferRect(
+ 0,
+ &gUnknown_085C8928,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4 * varDiv + 1,
+ 4 * varAnd,
+ 4,
+ 4,
+ 0xF,
+ 0,
+ 0);
+ CopyBgTilemapBufferToVram(0);
+
+ if (++task->tData2 > 63)
+ task->tState++;
+ return 0;
+}
+
+static bool8 Phase2_32_Func3(struct Task *task)
+{
+ BlendPalettes(0xFFFF7FFF, 0x10, 0);
+
+ task->tData2 = 0;
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 Phase2_32_Func4(struct Task *task)
+{
+ u8 var = gUnknown_085C9A53[task->tData2];
+ u8 varDiv = var / 8;
+ u8 varAnd = var & 7;
+
+ FillBgTilemapBufferRect(0, 1, 4 * varDiv + 1, 4 * varAnd, 4, 4, 0xF);
+ CopyBgTilemapBufferToVram(0);
+
+ if (++task->tData2 > 63)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_814ABE4));
+ task->tState++;
+ }
+
+ return FALSE;
+}
+
+#undef tSub32_X_delta
+#undef tSub32_Y_delta
+#undef tSub32_Bool
+
+static bool8 Phase2_32_Func5(struct Task *task)
+{
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_Y);
+
+ FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
+ CopyBgTilemapBufferToVram(0);
+ BlendPalettes(0xFFFFFFFF, 0x10, 0);
+
+ DestroyTask(FindTaskIdByFunc(task->func));
+ task->tState++; // UB: changing value of a destroyed task
+ return FALSE;
+}
+
+#undef tData1
+#undef tData2
+#undef tData3
+#undef tData4
+#undef tData5
+#undef tData6
+#undef tData7
diff --git a/src/battle_tv.c b/src/battle_tv.c
new file mode 100644
index 000000000..6f9ee414e
--- /dev/null
+++ b/src/battle_tv.c
@@ -0,0 +1,1574 @@
+#include "global.h"
+#include "pokemon.h"
+#include "battle.h"
+#include "battle_tv.h"
+#include "constants/battle_string_ids.h"
+#include "constants/battle_anim.h"
+#include "constants/moves.h"
+#include "constants/species.h"
+#include "battle_message.h"
+#include "tv.h"
+
+// this file's functions
+static bool8 sub_817E0B8(u16 stringId);
+static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3);
+static void TrySetBattleSeminarShow(void);
+static void AddPointsOnFainting(bool8 targetFainted);
+static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot);
+static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride);
+
+// const rom data
+static const u16 sVariableDmgMoves[] =
+{
+ MOVE_COUNTER, MOVE_FISSURE, MOVE_BIDE, MOVE_MIRROR_COAT,
+ MOVE_HORN_DRILL, MOVE_FLAIL, MOVE_REVERSAL, MOVE_HIDDEN_POWER,
+ MOVE_SHEER_COLD, MOVE_FOCUS_PUNCH, MOVE_ERUPTION,
+ MOVE_WATER_SPOUT, MOVE_DREAM_EATER, MOVE_WEATHER_BALL,
+ MOVE_SNORE, MOVE_PAIN_SPLIT, MOVE_GUILLOTINE,
+ MOVE_FRUSTRATION, MOVE_RETURN, MOVE_ENDEAVOR,
+ MOVE_PRESENT, MOVE_REVENGE, 0xFFFF,
+ // those are handled by the function itself
+ MOVE_MAGNITUDE, MOVE_PSYWAVE, 0xFFFF
+};
+
+static const u16 sUnknown_0860A4E0[] =
+{
+ 0x0001, 0x0001, 0x0001, 0x0004, 0x0001, 0x0001, 0x0001, 0x0000, 0x0005, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0005, 0x0005, 0x0004, 0x0005, 0x0001, 0x0003, 0x0001,
+ 0x0003, 0x0005, 0x0001, 0x0007, 0x0001, 0x0007, 0x0007, 0x0001, 0x0005, 0x0002, 0x0004, 0x0001, 0x0001, 0x0001, 0x0005, 0x0001,
+ 0x0002, 0x0004, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0007, 0x0004, 0x0004, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0004, 0x0001, 0x0001, 0x0001, 0x0004,
+ 0x0005, 0x0002, 0x0004, 0x0001, 0x0004, 0x0001, 0x0007, 0x0002, 0x0001, 0x0005, 0x0007, 0x0003, 0x0003, 0x0004, 0x0003, 0x0003,
+ 0x0003, 0x0003, 0x0003, 0x0002, 0x0004, 0x0001, 0x0005, 0x0001, 0x0001, 0x0004, 0x0005, 0x0003, 0x0001, 0x0002, 0x0001, 0x0005,
+ 0x0004, 0x0003, 0x0006, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0004, 0x0001, 0x0001, 0x0001, 0x0005, 0x0001, 0x0001, 0x0007,
+ 0x0002, 0x0002, 0x0001, 0x0001, 0x0004, 0x0004, 0x0004, 0x0001, 0x0004, 0x0004, 0x0001, 0x0001, 0x0001, 0x0001, 0x0007, 0x0007,
+ 0x0006, 0x0003, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003, 0x0001, 0x0001, 0x0004, 0x0004,
+ 0x0003, 0x0003, 0x0003, 0x0001, 0x0004, 0x0007, 0x0007, 0x0005, 0x0007, 0x0001, 0x0007, 0x0001, 0x0005, 0x0000, 0x0004, 0x0004,
+ 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0006, 0x0003, 0x0006, 0x0004, 0x0004, 0x0002, 0x0005, 0x0002, 0x0001, 0x0001, 0x0006,
+ 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0006, 0x0001, 0x0004, 0x0001, 0x0001, 0x0003, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0004, 0x0001, 0x0001, 0x0003
+};
+static const u16 sUnknown_0860A68C[] =
+{
+ 0x0004, 0xfffd, 0xfffa
+};
+static const u16 sUnknown_0860A692[] =
+{
+ 0x0004, 0x0004, 0x0006, 0x0006, 0x0007, 0x0006, 0x0002
+};
+static const u16 sUnknown_0860A6A0[] =
+{
+ 0x0091, 0x0003, 0x00fa, 0x0003, 0x00be, 0x0003, 0x0080, 0x0003, 0x006e, 0x0003, 0x0098, 0x0003, 0x0143, 0x0003, 0x0123, 0x0003,
+ 0x007f, 0x0003, 0x014a, 0x0003, 0x0039, 0x0003, 0x0134, 0x0003, 0x0038, 0x0003, 0x003d, 0x0003, 0x015a, 0x0000, 0x0037, 0x0003,
+ 0x0160, 0x0003, 0x0137, 0x0003, 0x0057, 0x0003, 0x004c, 0xfffc, 0x013b, 0xfffc, 0x00ac, 0xfffc, 0x0035, 0xfffc, 0x00dd, 0xfffc,
+ 0x007e, 0xfffc, 0x0101, 0xfffc, 0x0034, 0xfffc, 0x0133, 0xfffc, 0x012b, 0xfffc, 0x011c, 0xfffc, 0x0053, 0xfffc, 0x0007, 0xfffc,
+ 0x004c, 0xfffc, 0xffff, 0x0000
+};
+static const u16 sUnknown_0860A728[] =
+{
+ 0x013b, 0x0003, 0x00ac, 0x0003, 0x0035, 0x0003, 0x00dd, 0x0003, 0x007e, 0x0003, 0x0101, 0x0003, 0x0034, 0x0003, 0x0133, 0x0003,
+ 0x012b, 0x0003, 0x011c, 0x0003, 0x0053, 0x0003, 0x0007, 0x0003, 0x004c, 0x0005, 0x00eb, 0x0003, 0x00ea, 0x0003, 0x00ec, 0x0003,
+ 0x0137, 0x0003, 0xffff, 0x0000
+};
+static const u16 sUnknown_0860A770[] =
+{
+ 0x0137, 0x0003, 0x004c, 0xfffd, 0xffff, 0x0000
+};
+static const u16 sUnknown_0860A77C[] =
+{
+ 0x0137, 0x0003, 0x004c, 0xfffd, 0xffff, 0x0000
+};
+static const u16 sUnknown_0860A788[] =
+{
+ 0x0055, 0x0003, 0x0009, 0x0003, 0x00d1, 0x0003, 0x0054, 0x0003, 0x00c0, 0x0003, 0x015f, 0x0003, 0x0056, 0x0000, 0x0057, 0x0003,
+ 0x0158, 0x0003, 0xffff, 0x0000
+};
+static const u16 sUnknown_0860A7B0[] =
+{
+ 0x0005, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003
+};
+static const u16 sUnknown_0860A7BE[] =
+{
+ 0x0005, 0x0005, 0x0005, 0x0005, 0x0005
+};
+static const u16 sUnknown_0860A7C8[] =
+{
+ 0x0004
+};
+static const u16 sUnknown_0860A7CA[] =
+{
+ 0x0005
+};
+static const u16 sUnknown_0860A7CC[] =
+{
+ 0x0005
+};
+static const u16 sUnknown_0860A7CE[] =
+{
+ 0x0003
+};
+static const u16 sUnknown_0860A7D0[] =
+{
+ 0x0003
+};
+static const u16 sUnknown_0860A7D2[] =
+{
+ 0x0004
+};
+static const u16 sUnknown_0860A7D4[] =
+{
+ 0x0003
+};
+static const u16 sUnknown_0860A7D6[] =
+{
+ 0x0006
+};
+static const u16 sUnknown_0860A7D8[] =
+{
+ 0x0006
+};
+static const u16 sUnknown_0860A7DA[] =
+{
+ 0x0006
+};
+static const u16 sUnknown_0860A7DC[] =
+{
+ 0x0004
+};
+static const u16 sUnknown_0860A7DE[] =
+{
+ 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002
+};
+static const u16 sUnknown_0860A7EC[] =
+{
+ 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004
+};
+static const u16 sUnknown_0860A7FA[] =
+{
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+};
+static const u16 sUnknown_0860A808[] =
+{
+ 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002
+};
+static const u16 sUnknown_0860A816[] =
+{
+ 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004
+};
+static const u16 sUnknown_0860A824[] =
+{
+ 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe
+};
+
+static const u16 *const sPointsArray[] =
+{
+ sUnknown_0860A4E0,
+ sUnknown_0860A68C,
+ sUnknown_0860A692,
+ sUnknown_0860A6A0,
+ sUnknown_0860A728,
+ sUnknown_0860A770,
+ sUnknown_0860A77C,
+ sUnknown_0860A788,
+ sUnknown_0860A7B0,
+ sUnknown_0860A7BE,
+ sUnknown_0860A7C8,
+ sUnknown_0860A7CA,
+ sUnknown_0860A7CC,
+ sUnknown_0860A7CE,
+ sUnknown_0860A7D0,
+ sUnknown_0860A7D2,
+ sUnknown_0860A7D4,
+ sUnknown_0860A7D6,
+ sUnknown_0860A7D8,
+ sUnknown_0860A7DA,
+ sUnknown_0860A7DA,
+ sUnknown_0860A7DC,
+ sUnknown_0860A7DE,
+ sUnknown_0860A7EC,
+ sUnknown_0860A7FA,
+ sUnknown_0860A808,
+ sUnknown_0860A816,
+ sUnknown_0860A824
+};
+
+static const u16 sUnknown_0860A8A4[] =
+{
+ STRINGID_PKMNPERISHCOUNTFELL, STRINGID_PKMNWISHCAMETRUE, STRINGID_PKMNLOSTPPGRUDGE,
+ STRINGID_PKMNTOOKFOE, STRINGID_PKMNABSORBEDNUTRIENTS, STRINGID_PKMNANCHOREDITSELF,
+ STRINGID_PKMNAFFLICTEDBYCURSE, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_PKMNLOCKEDINNIGHTMARE,
+ STRINGID_PKMNHURTBY, STRINGID_PKMNHURTBYBURN, STRINGID_PKMNHURTBYPOISON,
+ STRINGID_PKMNHURTBYSPIKES, STRINGID_ATTACKERFAINTED, STRINGID_TARGETFAINTED,
+ STRINGID_PKMNHITWITHRECOIL, STRINGID_PKMNCRASHED, 0xFFFF
+};
+
+// code
+void BattleTv_SetDataBasedOnString(u16 stringId)
+{
+ struct BattleTv *tvPtr;
+ u32 atkSide, defSide, effSide, scriptingSide;
+ struct Pokemon *atkMon, *defMon;
+ u8 moveSlot;
+ u32 atkFlank, defFlank, effFlank;
+ u8 *perishCount;
+ u16 *statStringId, *finishedMoveId;
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && stringId != STRINGID_ITDOESNTAFFECT && stringId != STRINGID_NOTVERYEFFECTIVE)
+ return;
+
+ tvPtr = &gBattleStruct->tv;
+
+ atkSide = GetBattlerSide(gBattlerAttacker);
+ defSide = GetBattlerSide(gBattlerTarget);
+ effSide = GetBattlerSide(gEffectBattler);
+ scriptingSide = GetBattlerSide(gBattleMsgDataPtr->scrActive);
+
+ if (atkSide == B_SIDE_PLAYER)
+ atkMon = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]];
+ else
+ atkMon = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]];
+
+ if (defSide == B_SIDE_PLAYER)
+ defMon = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]];
+ else
+ defMon = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]];
+
+ moveSlot = GetBattlerMoveSlotId(gBattlerAttacker, gBattleMsgDataPtr->currentMove);
+
+ if (moveSlot >= 4 && sub_817E0B8(stringId) && stringId > BATTLESTRINGS_ID_ADDER)
+ {
+ tvPtr->side[atkSide].faintCause = 15;
+ return;
+ }
+
+ perishCount = (u8 *)(gBattleTextBuff1 + 4);
+ statStringId = (u16 *)(gBattleTextBuff2 + 2);
+ finishedMoveId = (u16 *)(gBattleTextBuff1 + 2);
+
+ atkFlank = GetBattlerPosition(gBattlerAttacker) / 2;
+ defFlank = GetBattlerPosition(gBattlerTarget) / 2;
+ effFlank = GetBattlerPosition(gEffectBattler) / 2;
+
+ switch (stringId)
+ {
+ case STRINGID_ITDOESNTAFFECT:
+ AddMovePoints(1, moveSlot, 2, 0);
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ TrySetBattleSeminarShow();
+ break;
+ case STRINGID_NOTVERYEFFECTIVE:
+ AddMovePoints(1, moveSlot, 1, 0);
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && GetMonData(defMon, MON_DATA_HP, NULL) != 0)
+ TrySetBattleSeminarShow();
+ break;
+ case STRINGID_SUPEREFFECTIVE:
+ AddMovePoints(1, moveSlot, 0, 0);
+ break;
+ case STRINGID_PKMNFORESAWATTACK:
+ tvPtr->side[atkSide].futureSightMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].futureSightMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNCHOSEXASDESTINY:
+ tvPtr->side[atkSide].doomDesireMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].doomDesireMoveSlot = moveSlot;
+ break;
+ case STRINGID_FAINTINTHREE:
+ tvPtr->side[atkSide].perishSongMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].perishSongMoveSlot = moveSlot;
+ tvPtr->side[atkSide].perishSong = 1;
+ break;
+ case STRINGID_PKMNPERISHCOUNTFELL:
+ if (*perishCount == 0)
+ tvPtr->side[atkSide].faintCause = 10;
+ break;
+ case STRINGID_PKMNWISHCAMETRUE:
+ if (tvPtr->side[defSide].wishMonId != 0)
+ {
+ AddMovePoints(2, 3, defSide,
+ (tvPtr->side[defSide].wishMonId - 1) * 4 + tvPtr->side[defSide].wishMoveSlot);
+ }
+ break;
+ case STRINGID_PKMNWANTSGRUDGE:
+ tvPtr->side[atkSide].grudgeMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].grudgeMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNLOSTPPGRUDGE:
+ if (tvPtr->side[defSide].grudgeMonId != 0)
+ {
+ AddMovePoints(2, 4, defSide,
+ (tvPtr->side[defSide].grudgeMonId - 1) * 4 + tvPtr->side[defSide].grudgeMoveSlot);
+ }
+ break;
+ case STRINGID_PKMNTRYINGTOTAKEFOE:
+ tvPtr->side[atkSide].destinyBondMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].destinyBondMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNTOOKFOE:
+ if (tvPtr->side[defSide].destinyBondMonId != 0)
+ tvPtr->side[atkSide].faintCause = 11;
+ break;
+ case STRINGID_PKMNPLANTEDROOTS:
+ tvPtr->pos[atkSide][atkFlank].ingrainMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[atkSide][atkFlank].ingrainMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNABSORBEDNUTRIENTS:
+ if (tvPtr->pos[atkSide][atkFlank].ingrainMonId != 0)
+ {
+ AddMovePoints(2, 6, atkSide,
+ (tvPtr->pos[atkSide][atkFlank].ingrainMonId - 1) * 4 + tvPtr->pos[atkSide][atkFlank].ingrainMoveSlot);
+ }
+ break;
+ case STRINGID_PKMNANCHOREDITSELF:
+ if (tvPtr->pos[defSide][defFlank].ingrainMonId != 0)
+ {
+ AddMovePoints(2, 6, defSide,
+ (tvPtr->pos[defSide][defFlank].ingrainMonId - 1) * 4 + tvPtr->pos[defSide][defFlank].ingrainMoveSlot);
+ }
+ break;
+ case STRINGID_PKMNTRANSFORMEDINTO:
+ gBattleStruct->anyMonHasTransformed = TRUE;
+ break;
+ case STRINGID_CRITICALHIT:
+ AddMovePoints(0x12, moveSlot, 0, 0);
+ break;
+ case STRINGID_PKMNSSTATCHANGED:
+ if (gBattleTextBuff1[2] != 0)
+ {
+ if (*statStringId == STRINGID_STATSHARPLY)
+ AddMovePoints(0x17, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ else
+ AddMovePoints(0x16, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ }
+ break;
+ case STRINGID_PKMNSSTATCHANGED2:
+ if (gBattleTextBuff1[2] != 0)
+ {
+ if (gBattlerAttacker == gBattlerTarget)
+ {
+ if (*statStringId == STRINGID_STATSHARPLY)
+ AddMovePoints(0x17, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ else
+ AddMovePoints(0x16, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ }
+ else
+ {
+ AddMovePoints(0x1B, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ }
+ }
+ break;
+ case STRINGID_PKMNSSTATCHANGED3:
+ if (gBattleTextBuff1[2] != 0)
+ AddMovePoints(0x18, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ break;
+ case STRINGID_PKMNSSTATCHANGED4:
+ if (gBattleTextBuff1[2] != 0)
+ {
+ if (*statStringId == STRINGID_STATHARSHLY)
+ AddMovePoints(0x1A, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ else
+ AddMovePoints(0x19, moveSlot, gBattleTextBuff1[2] - 1, 0);
+ }
+ break;
+ case STRINGID_PKMNLAIDCURSE:
+ tvPtr->pos[defSide][defFlank].curseMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[defSide][defFlank].curseMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNAFFLICTEDBYCURSE:
+ if (GetMonData(atkMon, MON_DATA_HP, NULL)
+ && tvPtr->pos[atkSide][atkFlank].curseMonId != 0)
+ {
+ AddMovePoints(8, 0, tvPtr->pos[atkSide][atkFlank].curseMonId - 1, tvPtr->pos[atkSide][atkFlank].curseMoveSlot);
+ tvPtr->side[atkSide].faintCause = 1;
+ tvPtr->side[atkSide].faintCauseMonId = atkFlank;
+ }
+ break;
+ case STRINGID_PKMNSEEDED:
+ tvPtr->pos[defSide][defFlank].leechSeedMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[defSide][defFlank].leechSeedMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNSAPPEDBYLEECHSEED:
+ if (tvPtr->pos[atkSide][atkFlank].leechSeedMonId != 0)
+ {
+ AddMovePoints(8, 1, tvPtr->pos[atkSide][atkFlank].leechSeedMonId - 1, tvPtr->pos[atkSide][atkFlank].leechSeedMoveSlot);
+ tvPtr->side[atkSide].faintCause = 2;
+ tvPtr->side[atkSide].faintCauseMonId = atkFlank;
+ }
+ break;
+ case STRINGID_PKMNFELLINTONIGHTMARE:
+ tvPtr->pos[defSide][defFlank].nightmareMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[defSide][defFlank].nightmareMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNLOCKEDINNIGHTMARE:
+ if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0
+ && tvPtr->pos[atkSide][atkFlank].nightmareMonId != 0)
+ {
+ AddMovePoints(8, 5, tvPtr->pos[atkSide][atkFlank].nightmareMonId - 1, tvPtr->pos[atkSide][atkFlank].nightmareMoveSlot);
+ tvPtr->side[atkSide].faintCause = 5;
+ tvPtr->side[atkSide].faintCauseMonId = atkFlank;
+ }
+ break;
+ case STRINGID_PKMNSQUEEZEDBYBIND:
+ case STRINGID_PKMNTRAPPEDINVORTEX:
+ case STRINGID_PKMNWRAPPEDBY:
+ case STRINGID_PKMNCLAMPED:
+ case STRINGID_PKMNTRAPPEDBYSANDTOMB:
+ tvPtr->pos[defSide][defFlank].wrapMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[defSide][defFlank].wrapMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNHURTBY:
+ if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0
+ && tvPtr->pos[atkSide][atkFlank].wrapMonId != 0)
+ {
+ AddMovePoints(8, 6, tvPtr->pos[atkSide][atkFlank].wrapMonId - 1, tvPtr->pos[atkSide][atkFlank].wrapMoveSlot);
+ tvPtr->side[atkSide].faintCause = 6;
+ tvPtr->side[atkSide].faintCauseMonId = atkFlank;
+ }
+ break;
+ case STRINGID_PKMNWASBURNED:
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].brnMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].brnMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNHURTBYBURN:
+ if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0)
+ {
+ if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMonId != 0)
+ AddMovePoints(8, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMoveSlot);
+ tvPtr->side[atkSide].faintCause = 4;
+ tvPtr->side[atkSide].faintCauseMonId = gBattlerPartyIndexes[gBattlerAttacker];
+ }
+ break;
+ case STRINGID_PKMNWASPOISONED:
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].psnMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].psnMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNBADLYPOISONED:
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].badPsnMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].badPsnMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNHURTBYPOISON:
+ if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0)
+ {
+ if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMonId != 0)
+ AddMovePoints(8, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMoveSlot);
+ if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMonId != 0)
+ AddMovePoints(8, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMoveSlot);
+ tvPtr->side[atkSide].faintCause = 3;
+ tvPtr->side[atkSide].faintCauseMonId = gBattlerPartyIndexes[gBattlerAttacker];
+ }
+ break;
+ case STRINGID_PKMNFELLINLOVE:
+ tvPtr->pos[defSide][defFlank].attractMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[defSide][defFlank].attractMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNIMMOBILIZEDBYLOVE:
+ if (tvPtr->pos[atkSide][atkFlank].attractMonId != 0)
+ AddMovePoints(9, 0, tvPtr->pos[atkSide][atkFlank].attractMonId - 1, tvPtr->pos[atkSide][atkFlank].attractMoveSlot);
+ break;
+ case STRINGID_PKMNWASPARALYZED:
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].prlzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].prlzMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNISPARALYZED:
+ if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId != 0)
+ AddMovePoints(9, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMoveSlot);
+ break;
+ case STRINGID_PKMNFELLASLEEP:
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].slpMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].slpMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNFASTASLEEP:
+ if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId != 0
+ && gBattleMsgDataPtr->currentMove != MOVE_SNORE
+ && gBattleMsgDataPtr->currentMove != MOVE_SLEEP_TALK)
+ AddMovePoints(9, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMoveSlot);
+ break;
+ case STRINGID_PKMNWASFROZEN:
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].frzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].frzMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNISFROZEN:
+ if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId != 0)
+ AddMovePoints(9, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMoveSlot);
+ break;
+ case STRINGID_PKMNWASCONFUSED:
+ tvPtr->pos[effSide][effFlank].confusionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[effSide][effFlank].confusionMoveSlot = moveSlot;
+ break;
+ case STRINGID_ITHURTCONFUSION:
+ if (tvPtr->pos[atkSide][atkFlank].confusionMonId != 0)
+ AddMovePoints(9, 1, tvPtr->pos[atkSide][atkFlank].confusionMonId - 1, tvPtr->pos[atkSide][atkFlank].confusionMoveSlot);
+ tvPtr->side[atkSide].faintCause = 12;
+ break;
+ case STRINGID_SPIKESSCATTERED:
+ tvPtr->side[defSide].spikesMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[defSide].spikesMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNHURTBYSPIKES:
+ if (tvPtr->side[scriptingSide].spikesMonId != 0)
+ {
+ AddMovePoints(10, scriptingSide ^ BIT_SIDE, tvPtr->side[scriptingSide].spikesMonId - 1, tvPtr->side[scriptingSide].spikesMoveSlot);
+ tvPtr->side[scriptingSide].faintCause = 7;
+ }
+ break;
+ case STRINGID_PKMNBLEWAWAYSPIKES:
+ tvPtr->side[atkSide].spikesMonId = 0;
+ tvPtr->side[atkSide].spikesMoveSlot = 0;
+ break;
+ case STRINGID_FIREWEAKENED:
+ tvPtr->pos[atkSide][atkFlank].waterSportMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[atkSide][atkFlank].waterSportMoveSlot = moveSlot;
+ break;
+ case STRINGID_ELECTRICITYWEAKENED:
+ tvPtr->pos[atkSide][atkFlank].mudSportMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[atkSide][atkFlank].mudSportMoveSlot = moveSlot;
+ break;
+ case STRINGID_ATTACKERFAINTED:
+ AddPointsOnFainting(FALSE);
+ case STRINGID_RETURNMON:
+ if (tvPtr->pos[atkSide][atkFlank].waterSportMonId != 0)
+ {
+ tvPtr->pos[atkSide][atkFlank].waterSportMonId = 0;
+ tvPtr->pos[atkSide][atkFlank].waterSportMoveSlot = 0;
+ }
+ if (tvPtr->pos[atkSide][atkFlank].mudSportMonId != 0)
+ {
+ tvPtr->pos[atkSide][atkFlank].mudSportMonId = 0;
+ tvPtr->pos[atkSide][atkFlank].mudSportMoveSlot = 0;
+ }
+ break;
+ case STRINGID_TARGETFAINTED:
+ AddPointsOnFainting(TRUE);
+ if (tvPtr->pos[atkSide][defFlank].waterSportMonId != 0)
+ {
+ tvPtr->pos[atkSide][defFlank].waterSportMonId = 0;
+ tvPtr->pos[atkSide][defFlank].waterSportMoveSlot = 0;
+ }
+ if (tvPtr->pos[atkSide][defFlank].mudSportMonId != 0)
+ {
+ tvPtr->pos[atkSide][defFlank].mudSportMonId = 0;
+ tvPtr->pos[atkSide][defFlank].mudSportMoveSlot = 0;
+ }
+ break;
+ case STRINGID_PKMNRAISEDDEF:
+ case STRINGID_PKMNRAISEDDEFALITTLE:
+ tvPtr->side[atkSide].reflectMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].reflectMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNRAISEDSPDEF:
+ case STRINGID_PKMNRAISEDSPDEFALITTLE:
+ tvPtr->side[atkSide].lightScreenMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].lightScreenMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNSXWOREOFF:
+ if (*finishedMoveId == MOVE_REFLECT)
+ {
+ tvPtr->side[atkSide].reflectMonId = 0;
+ tvPtr->side[atkSide].reflectMoveSlot = 0;
+ }
+ if (*finishedMoveId == MOVE_LIGHT_SCREEN)
+ {
+ tvPtr->side[atkSide].lightScreenMonId = 0;
+ tvPtr->side[atkSide].lightScreenMoveSlot = 0;
+ }
+ if (*finishedMoveId == MOVE_MIST)
+ {
+ tvPtr->side[atkSide].mistMonId = 0;
+ tvPtr->side[atkSide].mistMoveSlot = 0;
+ }
+ break;
+ case STRINGID_PKMNCOVEREDBYVEIL:
+ tvPtr->side[atkSide].safeguardMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].safeguardMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNUSEDSAFEGUARD:
+ if (tvPtr->side[defSide].safeguardMonId != 0)
+ AddMovePoints(15, 0, tvPtr->side[defSide].safeguardMonId - 1, tvPtr->side[defSide].safeguardMoveSlot);
+ break;
+ case STRINGID_PKMNSAFEGUARDEXPIRED:
+ tvPtr->side[atkSide].safeguardMonId = 0;
+ tvPtr->side[atkSide].safeguardMoveSlot = 0;
+ break;
+ case STRINGID_PKMNSHROUDEDINMIST:
+ tvPtr->side[atkSide].mistMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].mistMoveSlot = moveSlot;
+ break;
+ case STRINGID_PKMNPROTECTEDBYMIST:
+ if (tvPtr->side[defSide].mistMonId != 0)
+ AddMovePoints(16, 0, tvPtr->side[defSide].mistMonId - 1, tvPtr->side[defSide].mistMoveSlot);
+ break;
+ case STRINGID_THEWALLSHATTERED:
+ tvPtr->side[defSide].reflectMonId = 0;
+ tvPtr->side[defSide].reflectMoveSlot = 0;
+ tvPtr->side[defSide].lightScreenMonId = 0;
+ tvPtr->side[defSide].lightScreenMoveSlot = 0;
+ AddMovePoints(17, 0, gBattlerPartyIndexes[gBattlerAttacker], moveSlot);
+ break;
+ case STRINGID_PKMNFLINCHED:
+ if (tvPtr->pos[atkSide][0].attackedByMonId != 0)
+ AddMovePoints(21, 0, tvPtr->pos[atkSide][0].attackedByMonId - 1, tvPtr->pos[atkSide][0].attackedByMoveSlot);
+ if (tvPtr->pos[atkSide][1].attackedByMonId != 0)
+ AddMovePoints(21, 0, tvPtr->pos[atkSide][1].attackedByMonId - 1, tvPtr->pos[atkSide][1].attackedByMoveSlot);
+ break;
+ case STRINGID_PKMNCRASHED:
+ case STRINGID_PKMNHITWITHRECOIL:
+ tvPtr->side[atkSide].faintCause = 14;
+ break;
+ }
+}
+
+static bool8 sub_817E0B8(u16 stringId)
+{
+ s32 i = 0;
+
+ do
+ {
+ if (sUnknown_0860A8A4[i] == stringId)
+ break;
+ i++;
+ } while (sUnknown_0860A8A4[i] != 0xFFFF);
+
+ if (sUnknown_0860A8A4[i] == 0xFFFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruct *disableStructPtr)
+{
+ struct BattleTv *tvPtr;
+ u32 atkSide, defSide;
+ u8 moveSlot;
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ return;
+
+ tvPtr = &gBattleStruct->tv;
+
+ atkSide = GetBattlerSide(gBattlerAttacker);
+ defSide = GetBattlerSide(gBattlerTarget);
+ moveSlot = GetBattlerMoveSlotId(gBattlerAttacker, move);
+
+ if (moveSlot >= 4)
+ {
+ tvPtr->side[atkSide].faintCause = 15;
+ return;
+ }
+
+ tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMoveSlot = moveSlot;
+ tvPtr->side[atkSide].usedMoveSlot = moveSlot;
+ AddMovePoints(0, moveSlot, gBattleMoves[move].effect, 0);
+ AddPointsBasedOnWeather(weatherFlags, move, moveSlot);
+ if (disableStructPtr->chargeTimer1 != 0)
+ AddMovePoints(7, move, moveSlot, 0);
+
+ if (move == MOVE_WISH)
+ {
+ tvPtr->side[atkSide].wishMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide].wishMoveSlot = moveSlot;
+ }
+ if (move == MOVE_SELF_DESTRUCT || move == MOVE_EXPLOSION)
+ {
+ tvPtr->side[atkSide ^ BIT_SIDE].explosionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1;
+ tvPtr->side[atkSide ^ BIT_SIDE].explosionMoveSlot = moveSlot;
+ tvPtr->side[atkSide ^ BIT_SIDE].faintCause = 13;
+ tvPtr->side[atkSide ^ BIT_SIDE].explosion = 1;
+ }
+
+ AddMovePoints(13, gBattleMoves[move].type, gBattleMoves[move].power, 0);
+ AddMovePoints(14, gBattleMoves[move].type, gBattleMoves[move].power, 0);
+ AddMovePoints(11, gBattleMoves[move].type, 0, 0);
+ AddMovePoints(12, gBattleMoves[move].type, 0, 0);
+}
+
+void BattleTv_SetDataBasedOnAnimation(u8 animationId)
+{
+ struct BattleTv *tvPtr;
+ u32 atkSide;
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ return;
+
+ tvPtr = &gBattleStruct->tv;
+ atkSide = GetBattlerSide(gBattlerAttacker);
+ switch (animationId)
+ {
+ case B_ANIM_FUTURE_SIGHT_HIT:
+ if (tvPtr->side[atkSide].futureSightMonId != 0)
+ {
+ AddMovePoints(2, 0, atkSide,
+ (tvPtr->side[atkSide].futureSightMonId - 1) * 4 + tvPtr->side[atkSide].futureSightMoveSlot);
+ tvPtr->side[atkSide].faintCause = 8;
+ }
+ break;
+ case B_ANIM_DOOM_DESIRE_HIT:
+ if (tvPtr->side[atkSide].doomDesireMonId != 0)
+ {
+ AddMovePoints(2, 1, atkSide,
+ (tvPtr->side[atkSide].doomDesireMonId - 1) * 4 + tvPtr->side[atkSide].doomDesireMoveSlot);
+ tvPtr->side[atkSide].faintCause = 9;
+ }
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+// for loop has an unused stack variable
+void TryPutLinkBattleTvShowOnAir(void)
+{
+ u16 playerBestSpecies = 0, opponentBestSpecies = 0;
+ s16 playerBestSum = 0, opponentBestSum = SHRT_MAX;
+ u8 playerBestMonId = 0, opponentBestMonId = 0;
+ struct BattleTvMovePoints *movePoints = NULL;
+ u8 countPlayer = 0, countOpponent = 0;
+ s16 sum = 0;
+ u16 species = 0;
+ u16 moveId = 0;
+ s32 i, j;
+
+ if (gBattleStruct->anyMonHasTransformed)
+ return;
+
+ movePoints = &gBattleStruct->tvMovePoints;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE)
+ countPlayer++;
+ if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE)
+ countOpponent++;
+ }
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) || countPlayer != countOpponent)
+ return;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL);
+ if (species != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG, NULL))
+ {
+ for (sum = 0, j = 0; j < 4; j++)
+ sum += movePoints->points[0][i * 4 + j];
+
+ if (playerBestSum < sum)
+ {
+ playerBestMonId = i;
+ playerBestSum = sum;
+ playerBestSpecies = species;
+ }
+ }
+
+ species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL);
+ if (species != SPECIES_NONE && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG, NULL))
+ {
+ for (sum = 0, j = 0; j < 4; j++)
+ sum += movePoints->points[1][i * 4 + j];
+
+ if (opponentBestSum == sum)
+ {
+ if (GetMonData(&gEnemyParty[i], MON_DATA_EXP, NULL) > GetMonData(&gEnemyParty[opponentBestMonId], MON_DATA_EXP, NULL))
+ {
+ opponentBestMonId = i;
+ opponentBestSum = sum;
+ opponentBestSpecies = species;
+ }
+ }
+ else if (opponentBestSum > sum)
+ {
+ opponentBestMonId = i;
+ opponentBestSum = sum;
+ opponentBestSpecies = species;
+ }
+ }
+ }
+
+ for (sum = 0, i = 0, j = 0; j < 4; j++)
+ {
+ if (sum < movePoints->points[0][playerBestMonId * 4 + j])
+ {
+ sum = movePoints->points[0][playerBestMonId * 4 + j];
+ i = j;
+ }
+ }
+
+ moveId = GetMonData(&gPlayerParty[playerBestMonId], MON_DATA_MOVE1 + i, NULL);
+ if (playerBestSum == 0 || moveId == 0)
+ return;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if ((playerBestMonId < 3 && !GetLinkTrainerFlankId(gBattleScripting.multiplayerId))
+ || (playerBestMonId >= 3 && GetLinkTrainerFlankId(gBattleScripting.multiplayerId)))
+ {
+ j = (opponentBestMonId < 3) ? 0 : 1;
+ PutBattleUpdateOnTheAir(sub_806EF84(j, gBattleScripting.multiplayerId), moveId, playerBestSpecies, opponentBestSpecies);
+ }
+ }
+ else
+ {
+ PutBattleUpdateOnTheAir(gBattleScripting.multiplayerId ^ 1, moveId, playerBestSpecies, opponentBestSpecies);
+ }
+}
+
+#else
+NAKED
+void TryPutLinkBattleTvShowOnAir(void)
+{
+ asm_unified(
+ "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\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x4]\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x8]\n\
+ ldr r3, =0x00007fff\n\
+ str r3, [sp, 0xC]\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x10]\n\
+ movs r7, 0\n\
+ str r7, [sp, 0x14]\n\
+ mov r8, r0\n\
+ ldr r0, =gBattleStruct\n\
+ ldr r1, [r0]\n\
+ adds r0, r1, 0\n\
+ adds r0, 0xB3\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _0817E42A\n\
+ b _0817E670\n\
+_0817E42A:\n\
+ movs r2, 0xD2\n\
+ lsls r2, 1\n\
+ adds r2, r1\n\
+ mov r10, r2\n\
+ movs r6, 0\n\
+_0817E434:\n\
+ movs r0, 0x64\n\
+ adds r4, r6, 0\n\
+ muls r4, r0\n\
+ ldr r0, =gPlayerParty\n\
+ adds r0, r4, r0\n\
+ movs r1, 0xB\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ beq _0817E454\n\
+ mov r0, r8\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+_0817E454:\n\
+ ldr r5, =gEnemyParty\n\
+ adds r0, r4, r5\n\
+ movs r1, 0xB\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ beq _0817E46A\n\
+ adds r0, r7, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+_0817E46A:\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x5\n\
+ ble _0817E434\n\
+ ldr r0, =gBattleTypeFlags\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0817E47E\n\
+ b _0817E670\n\
+_0817E47E:\n\
+ cmp r8, r7\n\
+ beq _0817E484\n\
+ b _0817E670\n\
+_0817E484:\n\
+ movs r6, 0\n\
+ lsls r3, r6, 1\n\
+ str r3, [sp, 0x18]\n\
+ movs r4, 0x64\n\
+ mov r8, r4\n\
+_0817E48E:\n\
+ mov r1, r8\n\
+ muls r1, r6\n\
+ ldr r0, =gPlayerParty\n\
+ adds r4, r1, r0\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xB\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r7, r0, 16\n\
+ adds r0, r6, 0x1\n\
+ mov r9, r0\n\
+ cmp r7, 0\n\
+ beq _0817E4EE\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x2D\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ bne _0817E4EE\n\
+ movs r4, 0\n\
+ lsls r0, r6, 3\n\
+ mov r2, r10\n\
+ adds r1, r0, r2\n\
+ movs r3, 0x3\n\
+_0817E4C4:\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ ldrh r4, [r1]\n\
+ adds r0, r4\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ adds r1, 0x2\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0817E4C4\n\
+ ldr r1, [sp, 0x8]\n\
+ lsls r0, r1, 16\n\
+ lsls r1, r4, 16\n\
+ cmp r0, r1\n\
+ bge _0817E4EE\n\
+ lsls r0, r6, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x10]\n\
+ lsrs r1, 16\n\
+ str r1, [sp, 0x8]\n\
+ str r7, [sp]\n\
+_0817E4EE:\n\
+ mov r0, r8\n\
+ muls r0, r6\n\
+ ldr r2, =gEnemyParty\n\
+ adds r4, r0, r2\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xB\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r7, r0, 16\n\
+ ldr r3, [sp, 0x8]\n\
+ lsls r3, 16\n\
+ str r3, [sp, 0x1C]\n\
+ cmp r7, 0\n\
+ beq _0817E5A0\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x2D\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ bne _0817E5A0\n\
+ movs r4, 0\n\
+ ldr r0, [sp, 0xC]\n\
+ lsls r2, r0, 16\n\
+ movs r3, 0x1\n\
+ lsls r1, r3, 1\n\
+ adds r1, 0x1\n\
+ lsls r1, 4\n\
+ lsls r0, r6, 3\n\
+ adds r0, r1\n\
+ mov r3, r10\n\
+ adds r1, r0, r3\n\
+ movs r3, 0x3\n\
+_0817E534:\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ ldrh r4, [r1]\n\
+ adds r0, r4\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ adds r1, 0x2\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _0817E534\n\
+ asrs r1, r2, 16\n\
+ lsls r5, r4, 16\n\
+ asrs r0, r5, 16\n\
+ cmp r1, r0\n\
+ bne _0817E590\n\
+ mov r0, r8\n\
+ muls r0, r6\n\
+ ldr r1, =gEnemyParty\n\
+ adds r0, r1\n\
+ movs r1, 0x19\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ adds r4, r0, 0\n\
+ ldr r2, [sp, 0x14]\n\
+ mov r0, r8\n\
+ muls r0, r2\n\
+ ldr r3, =gEnemyParty\n\
+ adds r0, r3\n\
+ movs r1, 0x19\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ cmp r4, r0\n\
+ bls _0817E5A0\n\
+ b _0817E594\n\
+ .pool\n\
+_0817E590:\n\
+ cmp r1, r0\n\
+ ble _0817E5A0\n\
+_0817E594:\n\
+ lsls r0, r6, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x14]\n\
+ lsrs r5, 16\n\
+ str r5, [sp, 0xC]\n\
+ str r7, [sp, 0x4]\n\
+_0817E5A0:\n\
+ mov r6, r9\n\
+ cmp r6, 0x5\n\
+ bgt _0817E5A8\n\
+ b _0817E48E\n\
+_0817E5A8:\n\
+ movs r4, 0\n\
+ movs r6, 0\n\
+ movs r3, 0\n\
+ ldr r5, =gPlayerParty\n\
+ ldr r7, [sp, 0x10]\n\
+ lsls r0, r7, 3\n\
+ mov r1, r10\n\
+ adds r2, r0, r1\n\
+_0817E5B8:\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ movs r7, 0\n\
+ ldrsh r1, [r2, r7]\n\
+ cmp r0, r1\n\
+ bge _0817E5C8\n\
+ ldrh r4, [r2]\n\
+ adds r6, r3, 0\n\
+_0817E5C8:\n\
+ adds r2, 0x2\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x3\n\
+ ble _0817E5B8\n\
+ movs r0, 0x64\n\
+ ldr r1, [sp, 0x10]\n\
+ muls r0, r1\n\
+ adds r0, r5\n\
+ adds r1, r6, 0\n\
+ adds r1, 0xD\n\
+ movs r2, 0\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ ldr r2, [sp, 0x1C]\n\
+ cmp r2, 0\n\
+ beq _0817E670\n\
+ cmp r4, 0\n\
+ beq _0817E670\n\
+ ldr r0, =gBattleTypeFlags\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0817E65C\n\
+ ldr r3, [sp, 0x10]\n\
+ cmp r3, 0x2\n\
+ bhi _0817E620\n\
+ ldr r0, =gBattleScripting\n\
+ adds r0, 0x25\n\
+ ldrb r0, [r0]\n\
+ bl GetLinkTrainerFlankId\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _0817E630\n\
+ b _0817E670\n\
+ .pool\n\
+_0817E620:\n\
+ ldr r0, =gBattleScripting\n\
+ adds r0, 0x25\n\
+ ldrb r0, [r0]\n\
+ bl GetLinkTrainerFlankId\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ beq _0817E670\n\
+_0817E630:\n\
+ movs r3, 0\n\
+ ldr r7, [sp, 0x14]\n\
+ cmp r7, 0x2\n\
+ bls _0817E63A\n\
+ movs r3, 0x1\n\
+_0817E63A:\n\
+ lsls r0, r3, 24\n\
+ lsrs r0, 24\n\
+ ldr r1, =gBattleScripting\n\
+ adds r1, 0x25\n\
+ ldrb r1, [r1]\n\
+ bl sub_806EF84\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r1, r4, 0\n\
+ ldr r2, [sp]\n\
+ ldr r3, [sp, 0x4]\n\
+ bl PutBattleUpdateOnTheAir\n\
+ b _0817E670\n\
+ .pool\n\
+_0817E65C:\n\
+ ldr r0, =gBattleScripting\n\
+ adds r0, 0x25\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ eors r0, r1\n\
+ adds r1, r4, 0\n\
+ ldr r2, [sp]\n\
+ ldr r3, [sp, 0x4]\n\
+ bl PutBattleUpdateOnTheAir\n\
+_0817E670:\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\
+ .pool");
+}
+#endif
+
+static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3)
+{
+ struct BattleTvMovePoints *movePoints = &gBattleStruct->tvMovePoints;
+ struct BattleTv *tvPtr = &gBattleStruct->tv;
+ u32 atkSide = GetBattlerSide(gBattlerAttacker);
+ u32 defSide = GetBattlerSide(gBattlerTarget);
+ const u16 *ptr;
+ s32 i;
+
+ switch (caseId)
+ {
+ case 0:
+ case 1:
+ case 18:
+ case 22 ... 27:
+ movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += sPointsArray[caseId][arg2];
+ break;
+ case 3 ... 7:
+ i = 0;
+ ptr = sPointsArray[caseId];
+ do
+ {
+ if (arg1 == ptr[i])
+ {
+ movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += ptr[i+1];
+ break;
+ }
+ i += 2;
+ } while (ptr[i] != 0xFFFF);
+ break;
+ case 19:
+ tvPtr->side[arg2 ^ 1].faintCause = 0;
+ movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1];
+ break;
+ case 20:
+ tvPtr->side[arg2].faintCause = 0;
+ case 2:
+ movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1];
+ break;
+ case 17:
+ movePoints->points[atkSide][arg2 * 4 + arg3] += sPointsArray[caseId][arg1];
+ break;
+ case 8:
+ case 9:
+ case 15:
+ case 16:
+ case 21:
+ movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += sPointsArray[caseId][arg1];
+ break;
+ case 10:
+ movePoints->points[arg1][arg2 * 4 + arg3] += sPointsArray[caseId][0];
+ break;
+ case 11:
+ if (tvPtr->pos[defSide][0].waterSportMonId != -(tvPtr->pos[defSide][1].waterSportMonId) && arg1 == 10)
+ {
+ if (tvPtr->pos[defSide][0].waterSportMonId != 0)
+ {
+ u32 id = (tvPtr->pos[defSide][0].waterSportMonId - 1) * 4;
+ movePoints->points[defSide][id + tvPtr->pos[defSide][0].waterSportMoveSlot] += sPointsArray[caseId][0];
+ }
+ if (tvPtr->pos[defSide][1].waterSportMonId != 0)
+ {
+ u32 id = (tvPtr->pos[defSide][1].waterSportMonId - 1) * 4;
+ movePoints->points[defSide][id + tvPtr->pos[defSide][1].waterSportMoveSlot] += sPointsArray[caseId][0];
+ }
+ }
+ break;
+ case 12:
+ if (tvPtr->pos[defSide][0].mudSportMonId != -(tvPtr->pos[defSide][1].mudSportMonId) && arg1 == 13)
+ {
+ if (tvPtr->pos[defSide][0].mudSportMonId != 0)
+ {
+ u32 id = (tvPtr->pos[defSide][0].mudSportMonId - 1) * 4;
+ movePoints->points[defSide][id + tvPtr->pos[defSide][0].mudSportMoveSlot] += sPointsArray[caseId][0];
+ }
+ if (tvPtr->pos[defSide][1].mudSportMonId != 0)
+ {
+ u32 id = (tvPtr->pos[defSide][1].mudSportMonId - 1) * 4;
+ movePoints->points[defSide][id + tvPtr->pos[defSide][1].mudSportMoveSlot] += sPointsArray[caseId][0];
+ }
+ }
+ break;
+ case 13:
+ if (arg1 <= 8 && arg2 != 0 && tvPtr->side[defSide].reflectMonId != 0)
+ {
+ u32 id = (tvPtr->side[defSide].reflectMonId - 1) * 4;
+ movePoints->points[defSide][id + tvPtr->side[defSide].reflectMoveSlot] += sPointsArray[caseId][0];
+ }
+ break;
+ case 14:
+ if (arg1 > 8 && arg2 != 0 && tvPtr->side[defSide].lightScreenMonId != 0)
+ {
+ u32 id = (tvPtr->side[defSide].lightScreenMonId - 1) * 4;
+ movePoints->points[defSide][id + tvPtr->side[defSide].lightScreenMoveSlot] += sPointsArray[caseId][0];
+ }
+ break;
+ }
+}
+
+static void AddPointsOnFainting(bool8 targetFainted)
+{
+ struct BattleTv *tvPtr = &gBattleStruct->tv;
+ u32 atkSide = GetBattlerSide(gBattlerAttacker);
+ u32 defSide = GetBattlerSide(gBattlerTarget);
+ u32 atkArrId = tvPtr->side[atkSide].faintCauseMonId;
+ s32 i;
+
+ if (tvPtr->side[atkSide].faintCause != 0)
+ {
+ switch (tvPtr->side[atkSide].faintCause)
+ {
+ case 1:
+ if (tvPtr->pos[atkSide][atkArrId].curseMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->pos[atkSide][atkArrId].curseMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].curseMoveSlot);
+ }
+ break;
+ case 2:
+ if (tvPtr->pos[atkSide][atkArrId].leechSeedMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->pos[atkSide][atkArrId].leechSeedMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].leechSeedMoveSlot);
+ }
+ break;
+ case 3:
+ if (tvPtr->mon[atkSide][atkArrId].psnMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->mon[atkSide][atkArrId].psnMonId - 1) * 4 + tvPtr->mon[atkSide][atkArrId].psnMoveSlot);
+ }
+ if (tvPtr->mon[atkSide][atkArrId].badPsnMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->mon[atkSide][atkArrId].badPsnMonId - 1) * 4 + tvPtr->mon[atkSide][atkArrId].badPsnMoveSlot);
+ }
+ break;
+ case 4:
+ if (tvPtr->mon[atkSide][atkArrId].brnMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->mon[atkSide][atkArrId].brnMonId - 1) * 4 + tvPtr->mon[atkSide][atkArrId].brnMoveSlot);
+ }
+ break;
+ case 5:
+ if (tvPtr->pos[atkSide][atkArrId].nightmareMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->pos[atkSide][atkArrId].nightmareMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].nightmareMoveSlot);
+ }
+ break;
+ case 6:
+ if (tvPtr->pos[atkSide][atkArrId].wrapMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->pos[atkSide][atkArrId].wrapMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].wrapMoveSlot);
+ }
+ break;
+ case 7:
+ if (tvPtr->side[atkSide].spikesMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->side[atkSide].spikesMonId - 1) * 4 + tvPtr->side[atkSide].spikesMoveSlot);
+ }
+ break;
+ case 8:
+ if (tvPtr->side[atkSide].futureSightMonId != 0)
+ {
+ AddMovePoints(20, 0, atkSide,
+ (tvPtr->side[atkSide].futureSightMonId - 1) * 4 + tvPtr->side[atkSide].futureSightMoveSlot);
+ }
+ break;
+ case 9:
+ if (tvPtr->side[atkSide].doomDesireMonId != 0)
+ {
+ AddMovePoints(20, 0, atkSide,
+ (tvPtr->side[atkSide].doomDesireMonId - 1) * 4 + tvPtr->side[atkSide].doomDesireMoveSlot);
+ }
+ break;
+ case 10:
+ if (tvPtr->side[atkSide].perishSong
+ && tvPtr->side[atkSide].perishSongMonId - 1 != gBattlerPartyIndexes[gBattlerAttacker])
+ {
+ AddMovePoints(19, 0, atkSide,
+ (tvPtr->side[atkSide].perishSongMonId - 1) * 4 + tvPtr->side[atkSide].perishSongMoveSlot);
+ }
+ if (tvPtr->side[atkSide ^ BIT_SIDE].perishSong)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->side[atkSide ^ BIT_SIDE].perishSongMonId - 1) * 4 + tvPtr->side[atkSide ^ BIT_SIDE].perishSongMoveSlot);
+ }
+ break;
+ case 11:
+ if (tvPtr->side[atkSide ^ BIT_SIDE].destinyBondMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->side[atkSide ^ BIT_SIDE].destinyBondMonId - 1) * 4 + tvPtr->side[atkSide ^ BIT_SIDE].destinyBondMoveSlot);
+ }
+ break;
+ case 12:
+ for (i = 0; i < 2; i++)
+ {
+ if (tvPtr->pos[atkSide][i].confusionMonId != 0)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->pos[atkSide][i].confusionMonId - 1) * 4 + tvPtr->pos[atkSide][i].confusionMoveSlot);
+ }
+ }
+ break;
+ case 13:
+ if (tvPtr->side[atkSide].explosion)
+ {
+ AddMovePoints(19, 0, atkSide,
+ (tvPtr->side[atkSide].explosionMonId - 1) * 4 + tvPtr->side[atkSide].explosionMoveSlot);
+ }
+ if (tvPtr->side[atkSide ^ BIT_SIDE].explosion)
+ {
+ AddMovePoints(19, 0, atkSide ^ BIT_SIDE,
+ (tvPtr->side[atkSide ^ BIT_SIDE].explosionMonId - 1) * 4 + tvPtr->side[atkSide ^ BIT_SIDE].explosionMoveSlot);
+ }
+ break;
+ case 14:
+ if (targetFainted == TRUE)
+ {
+ AddMovePoints(20, 0, atkSide,
+ (gBattlerPartyIndexes[gBattlerAttacker]) * 4 + tvPtr->side[atkSide].usedMoveSlot);
+ }
+ break;
+ case 15:
+ break;
+ }
+ }
+ else
+ {
+ if (tvPtr->side[defSide].faintCause == 7)
+ {
+ if (tvPtr->side[defSide].spikesMonId != 0)
+ {
+ AddMovePoints(19, 0, defSide ^ BIT_SIDE,
+ (tvPtr->side[defSide].spikesMonId - 1) * 4 + tvPtr->side[defSide].spikesMoveSlot);
+ }
+ }
+ else
+ {
+ AddMovePoints(20, 0, atkSide,
+ (gBattlerPartyIndexes[gBattlerAttacker]) * 4 + tvPtr->side[atkSide].usedMoveSlot);
+ }
+ }
+}
+
+static void TrySetBattleSeminarShow(void)
+{
+ s32 i;
+ s32 dmgByMove[4];
+ u16 powerOverride;
+ u16 currMoveSaved;
+
+ if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ return;
+ else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT)
+ return;
+ else if (gBattleMons[gBattlerAttacker].statStages[STAT_ACC] <= 5)
+ return;
+ else if (gBattleMons[gBattlerTarget].statStages[STAT_EVASION] > 6)
+ return;
+ else if (gCurrentMove == MOVE_HIDDEN_POWER || gCurrentMove == MOVE_WEATHER_BALL)
+ return;
+ else if (gBattleTypeFlags & (BATTLE_TYPE_PALACE | BATTLE_TYPE_PIKE | BATTLE_TYPE_PYRAMID))
+ return;
+ else if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[gMoveSelectionCursor[gBattlerAttacker]]].power == 0)
+ return;
+
+ i = 0;
+ currMoveSaved = gBattleMons[gBattlerAttacker].moves[gMoveSelectionCursor[gBattlerAttacker]];
+ do
+ {
+ if (currMoveSaved == sVariableDmgMoves[i])
+ break;
+ i++;
+ } while (sVariableDmgMoves[i] != 0xFFFF);
+
+ if (sVariableDmgMoves[i] != 0xFFFF)
+ return;
+
+ dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleMoveDamage;
+ currMoveSaved = gCurrentMove;
+ for (i = 0; i < 4; i++)
+ {
+ gCurrentMove = gBattleMons[gBattlerAttacker].moves[i];
+ powerOverride = 0;
+ if (ShouldCalculateDamage(gCurrentMove, &dmgByMove[i], &powerOverride))
+ {
+ u8 moveResultFlags;
+ u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)];
+ gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove,
+ sideStatus, powerOverride,
+ 0, gBattlerAttacker, gBattlerTarget);
+
+ if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
+ gBattleMoveDamage *= 2;
+ if (gProtectStructs[gBattlerAttacker].helpingHand)
+ gBattleMoveDamage = gBattleMoveDamage * 15 / 10;
+
+ moveResultFlags = TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);
+ dmgByMove[i] = gBattleMoveDamage;
+ if (dmgByMove[i] == 0 && !(moveResultFlags & MOVE_RESULT_NO_EFFECT))
+ dmgByMove[i] = 1;
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (i != gMoveSelectionCursor[gBattlerAttacker] && dmgByMove[i] > dmgByMove[gMoveSelectionCursor[gBattlerAttacker]])
+ {
+ u16 opponentSpecies, playerSpecies;
+ s32 bestMoveId;
+
+ if (gMoveSelectionCursor[gBattlerAttacker] != 0)
+ bestMoveId = 0;
+ else
+ bestMoveId = 1;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (i != gMoveSelectionCursor[gBattlerAttacker] && dmgByMove[i] > dmgByMove[bestMoveId])
+ bestMoveId = i;
+ }
+
+ opponentSpecies = GetMonData(&gEnemyParty [gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES, NULL);
+ playerSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_SPECIES, NULL);
+ sub_80EE35C(opponentSpecies, playerSpecies, gMoveSelectionCursor[gBattlerAttacker], gBattleMons[gBattlerAttacker].moves, gBattleMons[gBattlerAttacker].moves[bestMoveId]);
+ break;
+ }
+ }
+
+ gBattleMoveDamage = dmgByMove[gMoveSelectionCursor[gBattlerAttacker]];
+ gCurrentMove = currMoveSaved;
+}
+
+static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride)
+{
+ if (gBattleMoves[moveId].power == 0)
+ {
+ *dmg = 0;
+ return FALSE;
+ }
+ else
+ {
+ s32 i = 0;
+ do
+ {
+ if (moveId == sVariableDmgMoves[i])
+ break;
+ i++;
+ } while (sVariableDmgMoves[i] != 0xFFFF);
+
+ if (sVariableDmgMoves[i] != 0xFFFF)
+ {
+ *dmg = 0;
+ return FALSE;
+ }
+ else if (moveId == MOVE_PSYWAVE)
+ {
+ *dmg = gBattleMons[gBattlerAttacker].level;
+ *dmg /= 2;
+ return FALSE;
+ }
+ else if (moveId == MOVE_MAGNITUDE)
+ {
+ *powerOverride = 10;
+ return TRUE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+}
+
+void BattleTv_ClearExplosionFaintCause(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ struct BattleTv *tvPtr = &gBattleStruct->tv;
+
+ tvPtr->side[B_SIDE_PLAYER].faintCause = 0;
+ tvPtr->side[B_SIDE_OPPONENT].faintCause = 0;
+
+ tvPtr->side[B_SIDE_PLAYER].faintCauseMonId = 0;
+ tvPtr->side[B_SIDE_OPPONENT].faintCauseMonId = 0;
+
+ tvPtr->side[B_SIDE_PLAYER].explosionMonId = 0;
+ tvPtr->side[B_SIDE_OPPONENT].explosionMonId = 0;
+
+ tvPtr->side[B_SIDE_PLAYER].explosionMoveSlot = 0;
+ tvPtr->side[B_SIDE_OPPONENT].explosionMoveSlot = 0;
+
+ tvPtr->side[B_SIDE_PLAYER].explosion = 0;
+ tvPtr->side[B_SIDE_OPPONENT].explosion = 0;
+ }
+}
+
+u8 GetBattlerMoveSlotId(u8 battlerId, u16 moveId)
+{
+ s32 i;
+ struct Pokemon *party;
+
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ i = 0;
+ while (1)
+ {
+ if (i >= 4)
+ break;
+ if (GetMonData(&party[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + i, NULL) == moveId)
+ break;
+ i++;
+ }
+
+ return i;
+}
+
+static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot)
+{
+ if (weatherFlags & WEATHER_RAIN_ANY)
+ AddMovePoints(3, moveId, moveSlot, 0);
+ else if (weatherFlags & WEATHER_SUN_ANY)
+ AddMovePoints(4, moveId, moveSlot, 0);
+ else if (weatherFlags & WEATHER_SANDSTORM_ANY)
+ AddMovePoints(5, moveId, moveSlot, 0);
+ else if (weatherFlags & WEATHER_HAIL_ANY)
+ AddMovePoints(6, moveId, moveSlot, 0);
+}
diff --git a/src/battle_util.c b/src/battle_util.c
index ed3bdef98..875244d79 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -1,177 +1,27 @@
#include "global.h"
#include "battle.h"
-#include "abilities.h"
-#include "moves.h"
-#include "hold_effects.h"
+#include "constants/battle_script_commands.h"
+#include "constants/abilities.h"
+#include "constants/moves.h"
+#include "constants/hold_effects.h"
+#include "constants/battle_anim.h"
#include "pokemon.h"
-#include "species.h"
+#include "constants/species.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "util.h"
-#include "battle_move_effects.h"
-#include "rng.h"
+#include "constants/battle_move_effects.h"
+#include "battle_scripts.h"
+#include "random.h"
#include "text.h"
#include "string_util.h"
#include "battle_message.h"
+#include "constants/battle_string_ids.h"
#include "battle_ai_script_commands.h"
#include "battle_controllers.h"
#include "event_data.h"
-#include "calculate_base_damage.h"
#include "link.h"
-
-extern const u8* gBattlescriptCurrInstr;
-extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT];
-extern const u8* gUnknown_02024230[BATTLE_BANKS_COUNT];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u8 gActiveBank;
-extern u8 gStringBank;
-extern u16 gCurrentMove;
-extern u16 gLastUsedItem;
-extern u8 gNoOfAllBanks;
-extern u32 gStatuses3[BATTLE_BANKS_COUNT];
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-extern u8 gAbsentBankFlags;
-extern u16 gBattleWeather;
-extern u8 gBanksByTurnOrder[BATTLE_BANKS_COUNT];
-extern u16 gSideAffecting[2];
-extern u8 gBattleCommunication[];
-extern void (*gBattleMainFunc)(void);
-extern s32 gBattleMoveDamage;
-extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
-extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
-extern u32 gBattleTypeFlags;
-extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT];
-extern u32 gHitMarker;
-extern u8 gEffectBank;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gBank1;
-extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
-extern u8 gBattleMoveFlags;
-extern s32 gTakenDmg[BATTLE_BANKS_COUNT];
-extern u8 gTakenDmgBanks[BATTLE_BANKS_COUNT];
-extern u8 gLastUsedAbility;
-extern u8 gCurrentActionFuncId;
-extern u32 gBattleExecBuffer;
-extern u16 gRandomMove;
-extern u8 gCurrMovePos;
-extern u8 gUnknown_020241E9;
-extern u8 gSentPokesToOpponent[2];
-
-extern const struct BattleMove gBattleMoves[];
-
-// scripts
-extern const u8 gUnknown_082DAE2A[];
-extern const u8 gUnknown_082DAE1F[];
-extern const u8 gUnknown_082DB089[];
-extern const u8 gUnknown_082DB098[];
-extern const u8 gUnknown_082DB0AF[];
-extern const u8 gUnknown_082DB0A0[];
-extern const u8 gUnknown_082DB185[];
-extern const u8 gUnknown_082DB181[];
-extern const u8 gUnknown_082DB812[];
-extern const u8 gUnknown_082DB076[];
-extern const u8 BattleScript_NoMovesLeft[];
-extern const u8 gUnknown_082DACFA[];
-extern const u8 gUnknown_082DAD0B[];
-extern const u8 gUnknown_082DACC9[];
-extern const u8 gUnknown_082DAC47[];
-extern const u8 gUnknown_082DACE0[];
-extern const u8 gUnknown_082DACD2[];
-extern const u8 BattleScript_WishComesTrue[];
-extern const u8 gUnknown_082DACC9[];
-extern const u8 gUnknown_082DAC2C[];
-extern const u8 BattleScript_IngrainTurnHeal[];
-extern const u8 BattleScript_LeechSeedTurnDrain[];
-extern const u8 BattleScript_PoisonTurnDmg[];
-extern const u8 BattleScript_BurnTurnDmg[];
-extern const u8 BattleScript_NightmareTurnDmg[];
-extern const u8 BattleScript_CurseTurnDmg[];
-extern const u8 BattleScript_WrapTurnDmg[];
-extern const u8 BattleScript_WrapEnds[];
-extern const u8 gUnknown_082DB234[];
-extern const u8 gUnknown_082DB2A6[];
-extern const u8 BattleScript_ThrashConfuses[];
-extern const u8 BattleScript_DisabledNoMore[];
-extern const u8 BattleScript_EncoredNoMore[];
-extern const u8 BattleScript_YawnMakesAsleep[];
-extern const u8 gUnknown_082DAFE4[];
-extern const u8 gUnknown_082DB8F3[];
-extern const u8 gUnknown_082DAF05[];
-extern const u8 gUnknown_082DAF20[];
-extern const u8 gUnknown_082DA7C4[];
-extern const u8 gUnknown_082DA7CD[];
-extern const u8 BattleScript_MoveUsedWokeUp[];
-extern const u8 BattleScript_MoveUsedIsAsleep[];
-extern const u8 BattleScript_MoveUsedIsFrozen[];
-extern const u8 BattleScript_MoveUsedUnfroze[];
-extern const u8 BattleScript_MoveUsedLoafingAround[];
-extern const u8 BattleScript_MoveUsedMustRecharge[];
-extern const u8 BattleScript_MoveUsedFlinched[];
-extern const u8 BattleScript_MoveUsedIsDisabled[];
-extern const u8 BattleScript_MoveUsedIsTaunted[];
-extern const u8 BattleScript_MoveUsedIsImprisoned[];
-extern const u8 BattleScript_MoveUsedIsConfused[];
-extern const u8 BattleScript_MoveUsedIsConfusedNoMore[];
-extern const u8 BattleScript_MoveUsedIsParalyzed[];
-extern const u8 BattleScript_MoveUsedIsParalyzedCantAttack[];
-extern const u8 BattleScript_MoveUsedIsInLove[];
-extern const u8 BattleScript_BideStoringEnergy[];
-extern const u8 BattleScript_BideAttack[];
-extern const u8 BattleScript_BideNoEnergyToAttack[];
-extern const u8 gUnknown_082DACE7[];
-extern const u8 BattleScript_DrizzleActivates[];
-extern const u8 BattleScript_SandstreamActivates[];
-extern const u8 BattleScript_DroughtActivates[];
-extern const u8 BattleScript_CastformChange[];
-extern const u8 BattleScript_RainDishActivates[];
-extern const u8 BattleScript_ShedSkinActivates[];
-extern const u8 BattleScript_SpeedBoostActivates[];
-extern const u8 BattleScript_SoundproofProtected[];
-extern const u8 BattleScript_MoveHPDrain[];
-extern const u8 BattleScript_MoveHPDrain_PPLoss[];
-extern const u8 BattleScript_FlashFireBoost[];
-extern const u8 BattleScript_FlashFireBoost_PPLoss[];
-extern const u8 gUnknown_082DB592[];
-extern const u8 gUnknown_082DB591[];
-extern const u8 BattleScript_ColorChangeActivates[];
-extern const u8 BattleScript_RoughSkinActivates[];
-extern const u8 BattleScript_ApplySecondaryEffect[];
-extern const u8 BattleScript_CuteCharmActivates[];
-extern const u8 gUnknown_082DB68C[];
-extern const u8 BattleScript_SynchronizeActivates[];
-extern const u8 gUnknown_082DB4B8[];
-extern const u8 gUnknown_082DB4C1[];
-extern const u8 BattleScript_TraceActivates[];
-
-extern const u8 BattleScript_WhiteHerbEnd2[];
-extern const u8 BattleScript_WhiteHerbRet[];
-extern const u8 BattleScript_ItemHealHP_RemoveItem[];
-extern const u8 BattleScript_BerryPPHealEnd2[];
-extern const u8 BattleScript_ItemHealHP_End2[];
-extern const u8 BattleScript_BerryConfuseHealEnd2[];
-extern const u8 BattleScript_BerryStatRaiseEnd2[];
-extern const u8 BattleScript_BerryFocusEnergyEnd2[];
-extern const u8 BattleScript_BerryCurePrlzEnd2[];
-extern const u8 BattleScript_BerryCurePsnEnd2[];
-extern const u8 BattleScript_BerryCureBrnEnd2[];
-extern const u8 BattleScript_BerryCureFrzEnd2[];
-extern const u8 BattleScript_BerryCureSlpEnd2[];
-extern const u8 BattleScript_BerryCureConfusionEnd2[];
-extern const u8 BattleScript_BerryCureChosenStatusEnd2[];
-extern const u8 BattleScript_BerryCureParRet[];
-extern const u8 BattleScript_BerryCurePsnRet[];
-extern const u8 BattleScript_BerryCureBrnRet[];
-extern const u8 BattleScript_BerryCureFrzRet[];
-extern const u8 BattleScript_BerryCureSlpRet[];
-extern const u8 BattleScript_BerryCureConfusionRet[];
-extern const u8 BattleScript_BerryCureChosenStatusRet[];
-extern const u8 BattleScript_ItemHealHP_Ret[];
-
-extern const u8 gUnknown_082DB695[]; //disobedient while asleep
-extern const u8 gUnknown_082DB6A5[]; //disobedient, uses a random move
-extern const u8 gUnknown_082DB6D9[]; //disobedient, went to sleep
-extern const u8 gUnknown_082DB6F0[]; //disobedient, hits itself
+#include "berry.h"
extern u8 weather_get_current(void);
@@ -182,173 +32,169 @@ static const u16 sSoundMovesTable[] =
MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, 0xFFFF
};
-u8 GetBattleBank(u8 caseId)
+u8 GetBattlerForBattleScript(u8 caseId)
{
u8 ret = 0;
switch (caseId)
{
- case BS_GET_TARGET:
- ret = gBankTarget;
+ case BS_TARGET:
+ ret = gBattlerTarget;
break;
- case BS_GET_ATTACKER:
- ret = gBankAttacker;
+ case BS_ATTACKER:
+ ret = gBattlerAttacker;
break;
- case BS_GET_EFFECT_BANK:
- ret = gEffectBank;
+ case BS_EFFECT_BATTLER:
+ ret = gEffectBattler;
break;
- case 7:
+ case BS_BATTLER_0:
ret = 0;
break;
- case BS_GET_SCRIPTING_BANK:
- ret = gBattleScripting.bank;
+ case BS_SCRIPTING:
+ ret = gBattleScripting.battler;
break;
- case 3:
- ret = gBank1;
+ case BS_FAINTED:
+ ret = gBattlerFainted;
break;
case 5:
- ret = gBank1;
+ ret = gBattlerFainted;
break;
case 4:
case 6:
case 8:
case 9:
- case BS_GET_PLAYER1:
- ret = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ case BS_PLAYER1:
+ ret = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
break;
- case BS_GET_OPPONENT1:
- ret = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ case BS_OPPONENT1:
+ ret = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
break;
- case BS_GET_PLAYER2:
- ret = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ case BS_PLAYER2:
+ ret = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
break;
- case BS_GET_OPPONENT2:
- ret = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ case BS_OPPONENT2:
+ ret = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
break;
}
return ret;
}
-void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move)
+void PressurePPLose(u8 defender, u8 attacker, u16 move)
{
s32 i;
- if (gBattleMons[bankDef].ability != ABILITY_PRESSURE)
+ if (gBattleMons[defender].ability != ABILITY_PRESSURE)
return;
for (i = 0; i < 4; i++)
{
- if (gBattleMons[bankAtk].moves[i] == move)
+ if (gBattleMons[attacker].moves[i] == move)
break;
}
if (i == 4) // mons don't share any moves
return;
- if (gBattleMons[bankAtk].pp[i] != 0)
- gBattleMons[bankAtk].pp[i]--;
+ if (gBattleMons[attacker].pp[i] != 0)
+ gBattleMons[attacker].pp[i]--;
- if (!(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED)
- && !(gDisableStructs[bankAtk].unk18_b & gBitTable[i]))
+ if (!(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[attacker].unk18_b & gBitTable[i]))
{
- gActiveBank = bankAtk;
- EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = attacker;
+ BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
-void PressurePPLoseOnUsingImprision(u8 bankAtk)
+void PressurePPLoseOnUsingImprision(u8 attacker)
{
s32 i, j;
s32 imprisionPos = 4;
- u8 atkSide = GetBankSide(bankAtk);
+ u8 atkSide = GetBattlerSide(attacker);
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (atkSide != GetBankSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE)
+ if (atkSide != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE)
{
for (j = 0; j < 4; j++)
{
- if (gBattleMons[bankAtk].moves[j] == MOVE_IMPRISON)
+ if (gBattleMons[attacker].moves[j] == MOVE_IMPRISON)
break;
}
if (j != 4)
{
imprisionPos = j;
- if (gBattleMons[bankAtk].pp[j] != 0)
- gBattleMons[bankAtk].pp[j]--;
+ if (gBattleMons[attacker].pp[j] != 0)
+ gBattleMons[attacker].pp[j]--;
}
}
}
if (imprisionPos != 4
- && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED)
- && !(gDisableStructs[bankAtk].unk18_b & gBitTable[imprisionPos]))
+ && !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[attacker].unk18_b & gBitTable[imprisionPos]))
{
- gActiveBank = bankAtk;
- EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisionPos, 0, 1, &gBattleMons[gActiveBank].pp[imprisionPos]);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = attacker;
+ BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisionPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisionPos]);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
-void PressurePPLoseOnUsingPerishSong(u8 bankAtk)
+void PressurePPLoseOnUsingPerishSong(u8 attacker)
{
s32 i, j;
s32 perishSongPos = 4;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gBattleMons[i].ability == ABILITY_PRESSURE && i != bankAtk)
+ if (gBattleMons[i].ability == ABILITY_PRESSURE && i != attacker)
{
for (j = 0; j < 4; j++)
{
- if (gBattleMons[bankAtk].moves[j] == MOVE_PERISH_SONG)
+ if (gBattleMons[attacker].moves[j] == MOVE_PERISH_SONG)
break;
}
if (j != 4)
{
perishSongPos = j;
- if (gBattleMons[bankAtk].pp[j] != 0)
- gBattleMons[bankAtk].pp[j]--;
+ if (gBattleMons[attacker].pp[j] != 0)
+ gBattleMons[attacker].pp[j]--;
}
}
}
if (perishSongPos != 4
- && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED)
- && !(gDisableStructs[bankAtk].unk18_b & gBitTable[perishSongPos]))
+ && !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[attacker].unk18_b & gBitTable[perishSongPos]))
{
- gActiveBank = bankAtk;
- EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBank].pp[perishSongPos]);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = attacker;
+ BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]);
+ MarkBattlerForControllerExec(gActiveBattler);
}
}
-void MarkAllBufferBanksForExecution(void) // unused
+void MarkAllBattlersForControllerExec(void) // unused
{
s32 i;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- for (i = 0; i < gNoOfAllBanks; i++)
- gBattleExecBuffer |= gBitTable[i] << 0x1C;
+ for (i = 0; i < gBattlersCount; i++)
+ gBattleControllerExecFlags |= gBitTable[i] << 0x1C;
}
else
{
- for (i = 0; i < gNoOfAllBanks; i++)
- gBattleExecBuffer |= gBitTable[i];
+ for (i = 0; i < gBattlersCount; i++)
+ gBattleControllerExecFlags |= gBitTable[i];
}
}
-void MarkBufferBankForExecution(u8 bank)
+void MarkBattlerForControllerExec(u8 battlerId)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
- gBattleExecBuffer |= gBitTable[bank] << 0x1C;
- }
+ gBattleControllerExecFlags |= gBitTable[battlerId] << 0x1C;
else
- {
- gBattleExecBuffer |= gBitTable[bank];
- }
+ gBattleControllerExecFlags |= gBitTable[battlerId];
}
void sub_803F850(u8 arg0)
@@ -356,45 +202,45 @@ void sub_803F850(u8 arg0)
s32 i;
for (i = 0; i < GetLinkPlayerCount(); i++)
- gBattleExecBuffer |= gBitTable[arg0] << (i << 2);
+ gBattleControllerExecFlags |= gBitTable[arg0] << (i << 2);
- gBattleExecBuffer &= ~(0x10000000 << arg0);
+ gBattleControllerExecFlags &= ~(0x10000000 << arg0);
}
-void CancelMultiTurnMoves(u8 bank)
+void CancelMultiTurnMoves(u8 battler)
{
- gBattleMons[bank].status2 &= ~(STATUS2_MULTIPLETURNS);
- gBattleMons[bank].status2 &= ~(STATUS2_LOCK_CONFUSE);
- gBattleMons[bank].status2 &= ~(STATUS2_UPROAR);
- gBattleMons[bank].status2 &= ~(STATUS2_BIDE);
+ gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS);
+ gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE);
+ gBattleMons[battler].status2 &= ~(STATUS2_UPROAR);
+ gBattleMons[battler].status2 &= ~(STATUS2_BIDE);
- gStatuses3[bank] &= ~(STATUS3_SEMI_INVULNERABLE);
+ gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE);
- gDisableStructs[bank].rolloutCounter1 = 0;
- gDisableStructs[bank].furyCutterCounter = 0;
+ gDisableStructs[battler].rolloutCounter1 = 0;
+ gDisableStructs[battler].furyCutterCounter = 0;
}
-bool8 WasUnableToUseMove(u8 bank)
+bool8 WasUnableToUseMove(u8 battler)
{
- if (gProtectStructs[bank].prlzImmobility
- || gProtectStructs[bank].targetNotAffected
- || gProtectStructs[bank].usedImprisionedMove
- || gProtectStructs[bank].loveImmobility
- || gProtectStructs[bank].usedDisabledMove
- || gProtectStructs[bank].usedTauntedMove
- || gProtectStructs[bank].flag2Unknown
- || gProtectStructs[bank].flinchImmobility
- || gProtectStructs[bank].confusionSelfDmg)
+ if (gProtectStructs[battler].prlzImmobility
+ || gProtectStructs[battler].targetNotAffected
+ || gProtectStructs[battler].usedImprisionedMove
+ || gProtectStructs[battler].loveImmobility
+ || gProtectStructs[battler].usedDisabledMove
+ || gProtectStructs[battler].usedTauntedMove
+ || gProtectStructs[battler].flag2Unknown
+ || gProtectStructs[battler].flinchImmobility
+ || gProtectStructs[battler].confusionSelfDmg)
return TRUE;
else
return FALSE;
}
-void PrepareStringBattle(u16 stringId, u8 bank)
+void PrepareStringBattle(u16 stringId, u8 battler)
{
- gActiveBank = bank;
- EmitPrintString(0, stringId);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = battler;
+ BtlController_EmitPrintString(0, stringId);
+ MarkBattlerForControllerExec(gActiveBattler);
}
void ResetSentPokesToOpponentValue(void)
@@ -405,161 +251,161 @@ void ResetSentPokesToOpponentValue(void)
gSentPokesToOpponent[0] = 0;
gSentPokesToOpponent[1] = 0;
- for (i = 0; i < gNoOfAllBanks; i += 2)
- bits |= gBitTable[gBattlePartyID[i]];
+ for (i = 0; i < gBattlersCount; i += 2)
+ bits |= gBitTable[gBattlerPartyIndexes[i]];
- for (i = 1; i < gNoOfAllBanks; i += 2)
- gSentPokesToOpponent[(i & BIT_MON) >> 1] = bits;
+ for (i = 1; i < gBattlersCount; i += 2)
+ gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits;
}
-void sub_803F9EC(u8 bank)
+void sub_803F9EC(u8 battler)
{
s32 i = 0;
u32 bits = 0;
- if (GetBankSide(bank) == SIDE_OPPONENT)
+ if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
- u8 id = ((bank & BIT_MON) >> 1);
- gSentPokesToOpponent[id] = 0;
+ u8 flank = ((battler & BIT_FLANK) >> 1);
+ gSentPokesToOpponent[flank] = 0;
- for (i = 0; i < gNoOfAllBanks; i += 2)
+ for (i = 0; i < gBattlersCount; i += 2)
{
- if (!(gAbsentBankFlags & gBitTable[i]))
- bits |= gBitTable[gBattlePartyID[i]];
+ if (!(gAbsentBattlerFlags & gBitTable[i]))
+ bits |= gBitTable[gBattlerPartyIndexes[i]];
}
- gSentPokesToOpponent[id] = bits;
+ gSentPokesToOpponent[flank] = bits;
}
}
-void sub_803FA70(u8 bank)
+void sub_803FA70(u8 battler)
{
- if (GetBankSide(bank) == SIDE_OPPONENT)
+ if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
- sub_803F9EC(bank);
+ sub_803F9EC(battler);
}
else
{
s32 i;
- for (i = 1; i < gNoOfAllBanks; i++)
- gSentPokesToOpponent[(i & BIT_MON) >> 1] |= gBitTable[gBattlePartyID[bank]];
+ for (i = 1; i < gBattlersCount; i++)
+ gSentPokesToOpponent[(i & BIT_FLANK) >> 1] |= gBitTable[gBattlerPartyIndexes[battler]];
}
}
-void BattleScriptPush(const u8* bsPtr)
+void BattleScriptPush(const u8 *bsPtr)
{
- BATTLESCRIPTS_STACK->ptr[BATTLESCRIPTS_STACK->size++] = bsPtr;
+ gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = bsPtr;
}
void BattleScriptPushCursor(void)
{
- BATTLESCRIPTS_STACK->ptr[BATTLESCRIPTS_STACK->size++] = gBattlescriptCurrInstr;
+ gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = gBattlescriptCurrInstr;
}
void BattleScriptPop(void)
{
- gBattlescriptCurrInstr = BATTLESCRIPTS_STACK->ptr[--BATTLESCRIPTS_STACK->size];
+ gBattlescriptCurrInstr = gBattleResources->battleScriptsStack->ptr[--gBattleResources->battleScriptsStack->size];
}
u8 TrySetCantSelectMoveBattleScript(void)
{
u8 limitations = 0;
- u16 move = gBattleMons[gActiveBank].moves[gBattleBufferB[gActiveBank][2]];
+ u16 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]];
u8 holdEffect;
- u16* choicedMove = &gBattleStruct->choicedMove[gActiveBank];
+ u16* choicedMove = &gBattleStruct->choicedMove[gActiveBattler];
- if (gDisableStructs[gActiveBank].disabledMove == move && move != 0)
+ if (gDisableStructs[gActiveBattler].disabledMove == move && move != 0)
{
- gBattleScripting.bank = gActiveBank;
+ gBattleScripting.battler = gActiveBattler;
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gUnknown_02024230[gActiveBank] = gUnknown_082DAE2A;
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMoveInPalace;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
}
else
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAE1F;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMove;
limitations = 1;
}
}
- if (move == gLastUsedMovesByBanks[gActiveBank] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBank].status2 & STATUS2_TORMENT))
+ if (move == gLastMoves[gActiveBattler] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT))
{
- CancelMultiTurnMoves(gActiveBank);
+ CancelMultiTurnMoves(gActiveBattler);
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gUnknown_02024230[gActiveBank] = gUnknown_082DB098;
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMoveInPalace;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
}
else
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB089;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMove;
limitations++;
}
}
- if (gDisableStructs[gActiveBank].tauntTimer1 != 0 && gBattleMoves[move].power == 0)
+ if (gDisableStructs[gActiveBattler].tauntTimer1 != 0 && gBattleMoves[move].power == 0)
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gUnknown_02024230[gActiveBank] = gUnknown_082DB0AF;
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTauntInPalace;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
}
else
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB0A0;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTaunt;
limitations++;
}
}
- if (GetImprisonedMovesCount(gActiveBank, move))
+ if (GetImprisonedMovesCount(gActiveBattler, move))
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gUnknown_02024230[gActiveBank] = gUnknown_082DB185;
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisionedMoveInPalace;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
}
else
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB181;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisionedMove;
limitations++;
}
}
- if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY)
- holdEffect = gEnigmaBerries[gActiveBank].holdEffect;
+ if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY)
+ holdEffect = gEnigmaBerries[gActiveBattler].holdEffect;
else
- holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item);
- gStringBank = gActiveBank;
+ gPotentialItemEffectBattler = gActiveBattler;
if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move)
{
gCurrentMove = *choicedMove;
- gLastUsedItem = gBattleMons[gActiveBank].item;
+ gLastUsedItem = gBattleMons[gActiveBattler].item;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
}
else
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB812;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveChoiceItem;
limitations++;
}
}
- if (gBattleMons[gActiveBank].pp[gBattleBufferB[gActiveBank][2]] == 0)
+ if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gProtectStructs[gActiveBank].flag_x10 = 1;
+ gProtectStructs[gActiveBattler].flag_x10 = 1;
}
else
{
- gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB076;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingMoveWithNoPP;
limitations++;
}
}
@@ -567,36 +413,36 @@ u8 TrySetCantSelectMoveBattleScript(void)
return limitations;
}
-u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check)
+u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check)
{
u8 holdEffect;
- u16* choicedMove = &gBattleStruct->choicedMove[bank];
+ u16 *choicedMove = &gBattleStruct->choicedMove[battlerId];
s32 i;
- if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY)
- holdEffect = gEnigmaBerries[bank].holdEffect;
+ if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY)
+ holdEffect = gEnigmaBerries[battlerId].holdEffect;
else
- holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item);
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[battlerId].item);
- gStringBank = bank;
+ gPotentialItemEffectBattler = battlerId;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < 4; i++)
{
- if (gBattleMons[bank].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE)
+ if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE)
unusableMoves |= gBitTable[i];
- if (gBattleMons[bank].pp[i] == 0 && check & MOVE_LIMITATION_PP)
+ if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP)
unusableMoves |= gBitTable[i];
- if (gBattleMons[bank].moves[i] == gDisableStructs[bank].disabledMove && check & MOVE_LIMITATION_DISABLED)
+ if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED)
unusableMoves |= gBitTable[i];
- if (gBattleMons[bank].moves[i] == gLastUsedMovesByBanks[bank] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[bank].status2 & STATUS2_TORMENT)
+ if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT)
unusableMoves |= gBitTable[i];
- if (gDisableStructs[bank].tauntTimer1 && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[bank].moves[i]].power == 0)
+ if (gDisableStructs[battlerId].tauntTimer1 && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0)
unusableMoves |= gBitTable[i];
- if (GetImprisonedMovesCount(bank, gBattleMons[bank].moves[i]) && check & MOVE_LIMITATION_IMPRISION)
+ if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISION)
unusableMoves |= gBitTable[i];
- if (gDisableStructs[bank].encoreTimer1 && gDisableStructs[bank].encoredMove != gBattleMons[bank].moves[i])
+ if (gDisableStructs[battlerId].encoreTimer1 && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i])
unusableMoves |= gBitTable[i];
- if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[bank].moves[i])
+ if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i])
unusableMoves |= gBitTable[i];
}
return unusableMoves;
@@ -605,30 +451,30 @@ u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check)
bool8 AreAllMovesUnusable(void)
{
u8 unusable;
- unusable = CheckMoveLimitations(gActiveBank, 0, 0xFF);
+ unusable = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
- if (unusable == 0xF) // all moves are unusable
+ if (unusable == 0xF) // All moves are unusable.
{
- gProtectStructs[gActiveBank].onlyStruggle = 1;
- gBattlescriptPtrsForSelection[gActiveBank] = BattleScript_NoMovesLeft;
+ gProtectStructs[gActiveBattler].noValidMoves = 1;
+ gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft;
}
else
{
- gProtectStructs[gActiveBank].onlyStruggle = 0;
+ gProtectStructs[gActiveBattler].noValidMoves = 0;
}
return (unusable == 0xF);
}
-u8 GetImprisonedMovesCount(u8 bank, u16 move)
+u8 GetImprisonedMovesCount(u8 battlerId, u16 move)
{
s32 i;
u8 imprisionedMoves = 0;
- u8 bankSide = GetBankSide(bank);
+ u8 battlerSide = GetBattlerSide(battlerId);
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (bankSide != GetBankSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS)
+ if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS)
{
s32 j;
for (j = 0; j < 4; j++)
@@ -644,62 +490,73 @@ u8 GetImprisonedMovesCount(u8 bank, u16 move)
return imprisionedMoves;
}
-u8 UpdateTurnCounters(void)
+enum
+{
+ ENDTURN_ORDER,
+ ENDTURN_REFLECT,
+ ENDTURN_LIGHT_SCREEN,
+ ENDTURN_MIST,
+ ENDTURN_SAFEGUARD,
+ ENDTURN_WISH,
+ ENDTURN_RAIN,
+ ENDTURN_SANDSTORM,
+ ENDTURN_SUN,
+ ENDTURN_HAIL,
+ ENDTURN_FIELD_COUNT,
+};
+
+u8 DoFieldEndTurnEffects(void)
{
u8 effect = 0;
s32 i;
- for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankAttacker]; gBankAttacker++)
+ for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; gBattlerAttacker++)
{
}
- for (gBankTarget = 0; gBankTarget < gNoOfAllBanks && gAbsentBankFlags & gBitTable[gBankTarget]; gBankTarget++)
+ for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerTarget]; gBattlerTarget++)
{
}
do
{
- u8 sideBank;
+ u8 side;
- switch (gBattleStruct->turncountersTracker)
+ switch (gBattleStruct->turnCountersTracker)
{
- case 0:
- for (i = 0; i < gNoOfAllBanks; i++)
+ case ENDTURN_ORDER:
+ for (i = 0; i < gBattlersCount; i++)
{
- gBanksByTurnOrder[i] = i;
+ gBattlerByTurnOrder[i] = i;
}
- for (i = 0; i < gNoOfAllBanks - 1; i++)
+ for (i = 0; i < gBattlersCount - 1; i++)
{
s32 j;
- for (j = i + 1; j < gNoOfAllBanks; j++)
+ for (j = i + 1; j < gBattlersCount; j++)
{
- if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0))
+ if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], 0))
SwapTurnOrder(i, j);
}
}
// It's stupid, but won't match without it
{
- u8* var = &gBattleStruct->turncountersTracker;
+ u8* var = &gBattleStruct->turnCountersTracker;
(*var)++;
gBattleStruct->turnSideTracker = 0;
}
// fall through
- case 1:
+ case ENDTURN_REFLECT:
while (gBattleStruct->turnSideTracker < 2)
{
- sideBank = gBattleStruct->turnSideTracker;
- gActiveBank = gBankAttacker = gSideTimers[sideBank].reflectBank;
- if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT)
+ side = gBattleStruct->turnSideTracker;
+ gActiveBattler = gBattlerAttacker = gSideTimers[side].reflectBattlerId;
+ if (gSideStatuses[side] & SIDE_STATUS_REFLECT)
{
- if (--gSideTimers[sideBank].reflectTimer == 0)
+ if (--gSideTimers[side].reflectTimer == 0)
{
- gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT;
- BattleScriptExecute(gUnknown_082DACFA);
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = MOVE_REFLECT;
- gBattleTextBuff1[3] = MOVE_REFLECT >> 8;
- gBattleTextBuff1[4] = EOS;
+ gSideStatuses[side] &= ~SIDE_STATUS_REFLECT;
+ BattleScriptExecute(BattleScript_SideStatusWoreOff);
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT);
effect++;
}
}
@@ -709,27 +566,23 @@ u8 UpdateTurnCounters(void)
}
if (!effect)
{
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
gBattleStruct->turnSideTracker = 0;
}
break;
- case 2:
+ case ENDTURN_LIGHT_SCREEN:
while (gBattleStruct->turnSideTracker < 2)
{
- sideBank = gBattleStruct->turnSideTracker;
- gActiveBank = gBankAttacker = gSideTimers[sideBank].lightscreenBank;
- if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN)
+ side = gBattleStruct->turnSideTracker;
+ gActiveBattler = gBattlerAttacker = gSideTimers[side].lightscreenBattlerId;
+ if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)
{
- if (--gSideTimers[sideBank].lightscreenTimer == 0)
+ if (--gSideTimers[side].lightscreenTimer == 0)
{
- gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN;
- BattleScriptExecute(gUnknown_082DACFA);
- gBattleCommunication[MULTISTRING_CHOOSER] = sideBank;
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = MOVE_LIGHT_SCREEN;
- gBattleTextBuff1[3] = MOVE_LIGHT_SCREEN >> 8;
- gBattleTextBuff1[4] = EOS;
+ gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN;
+ BattleScriptExecute(BattleScript_SideStatusWoreOff);
+ gBattleCommunication[MULTISTRING_CHOOSER] = side;
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN);
effect++;
}
}
@@ -739,26 +592,22 @@ u8 UpdateTurnCounters(void)
}
if (!effect)
{
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
gBattleStruct->turnSideTracker = 0;
}
break;
- case 3:
+ case ENDTURN_MIST:
while (gBattleStruct->turnSideTracker < 2)
{
- sideBank = gBattleStruct->turnSideTracker;
- gActiveBank = gBankAttacker = gSideTimers[sideBank].mistBank;
- if (gSideTimers[sideBank].mistTimer != 0
- && --gSideTimers[sideBank].mistTimer == 0)
- {
- gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST;
- BattleScriptExecute(gUnknown_082DACFA);
- gBattleCommunication[MULTISTRING_CHOOSER] = sideBank;
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = MOVE_MIST;
- gBattleTextBuff1[3] = MOVE_MIST >> 8;
- gBattleTextBuff1[4] = EOS;
+ side = gBattleStruct->turnSideTracker;
+ gActiveBattler = gBattlerAttacker = gSideTimers[side].mistBattlerId;
+ if (gSideTimers[side].mistTimer != 0
+ && --gSideTimers[side].mistTimer == 0)
+ {
+ gSideStatuses[side] &= ~SIDE_STATUS_MIST;
+ BattleScriptExecute(BattleScript_SideStatusWoreOff);
+ gBattleCommunication[MULTISTRING_CHOOSER] = side;
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST);
effect++;
}
gBattleStruct->turnSideTracker++;
@@ -767,21 +616,21 @@ u8 UpdateTurnCounters(void)
}
if (!effect)
{
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
gBattleStruct->turnSideTracker = 0;
}
break;
- case 4:
+ case ENDTURN_SAFEGUARD:
while (gBattleStruct->turnSideTracker < 2)
{
- sideBank = gBattleStruct->turnSideTracker;
- gActiveBank = gBankAttacker = gSideTimers[sideBank].safeguardBank;
- if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD)
+ side = gBattleStruct->turnSideTracker;
+ gActiveBattler = gBattlerAttacker = gSideTimers[side].safeguardBattlerId;
+ if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD)
{
- if (--gSideTimers[sideBank].safeguardTimer == 0)
+ if (--gSideTimers[side].safeguardTimer == 0)
{
- gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD;
- BattleScriptExecute(gUnknown_082DAD0B);
+ gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD;
+ BattleScriptExecute(BattleScript_SafeguardEnds);
effect++;
}
}
@@ -791,19 +640,19 @@ u8 UpdateTurnCounters(void)
}
if (!effect)
{
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
gBattleStruct->turnSideTracker = 0;
}
break;
- case 5:
- while (gBattleStruct->turnSideTracker < gNoOfAllBanks)
+ case ENDTURN_WISH:
+ while (gBattleStruct->turnSideTracker < gBattlersCount)
{
- gActiveBank = gBanksByTurnOrder[gBattleStruct->turnSideTracker];
- if (gWishFutureKnock.wishCounter[gActiveBank] != 0
- && --gWishFutureKnock.wishCounter[gActiveBank] == 0
- && gBattleMons[gActiveBank].hp != 0)
+ gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker];
+ if (gWishFutureKnock.wishCounter[gActiveBattler] != 0
+ && --gWishFutureKnock.wishCounter[gActiveBattler] == 0
+ && gBattleMons[gActiveBattler].hp != 0)
{
- gBankTarget = gActiveBank;
+ gBattlerTarget = gActiveBattler;
BattleScriptExecute(BattleScript_WishComesTrue);
effect++;
}
@@ -813,10 +662,10 @@ u8 UpdateTurnCounters(void)
}
if (!effect)
{
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
}
break;
- case 6:
+ case ENDTURN_RAIN:
if (gBattleWeather & WEATHER_RAIN_ANY)
{
if (!(gBattleWeather & WEATHER_RAIN_PERMANENT))
@@ -833,67 +682,78 @@ u8 UpdateTurnCounters(void)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR)
+ {
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ }
else
+ {
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- BattleScriptExecute(gUnknown_082DAC2C);
+ }
+
+ BattleScriptExecute(BattleScript_RainContinuesOrEnds);
effect++;
}
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
break;
- case 7:
+ case ENDTURN_SANDSTORM:
if (gBattleWeather & WEATHER_SANDSTORM_ANY)
{
if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0)
{
gBattleWeather &= ~WEATHER_SANDSTORM_TEMPORARY;
- gBattlescriptCurrInstr = gUnknown_082DACC9;
+ gBattlescriptCurrInstr = BattleScript_SandStormHailEnds;
}
else
- gBattlescriptCurrInstr = gUnknown_082DAC47;
+ {
+ gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues;
+ }
- gBattleScripting.animArg1 = 0xC;
+ gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
BattleScriptExecute(gBattlescriptCurrInstr);
effect++;
}
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
break;
- case 8:
+ case ENDTURN_SUN:
if (gBattleWeather & WEATHER_SUN_ANY)
{
if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0)
{
gBattleWeather &= ~WEATHER_SUN_TEMPORARY;
- gBattlescriptCurrInstr = gUnknown_082DACE0;
+ gBattlescriptCurrInstr = BattleScript_SunlightFaded;
}
else
- gBattlescriptCurrInstr = gUnknown_082DACD2;
+ {
+ gBattlescriptCurrInstr = BattleScript_SunlightContinues;
+ }
BattleScriptExecute(gBattlescriptCurrInstr);
effect++;
}
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
break;
- case 9:
- if (gBattleWeather & WEATHER_HAIL)
+ case ENDTURN_HAIL:
+ if (gBattleWeather & WEATHER_HAIL_ANY)
{
if (--gWishFutureKnock.weatherDuration == 0)
{
gBattleWeather &= ~WEATHER_HAIL;
- gBattlescriptCurrInstr = gUnknown_082DACC9;
+ gBattlescriptCurrInstr = BattleScript_SandStormHailEnds;
}
else
- gBattlescriptCurrInstr = gUnknown_082DAC47;
+ {
+ gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues;
+ }
- gBattleScripting.animArg1 = 0xD;
+ gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
BattleScriptExecute(gBattlescriptCurrInstr);
effect++;
}
- gBattleStruct->turncountersTracker++;
+ gBattleStruct->turnCountersTracker++;
break;
- case 10:
+ case ENDTURN_FIELD_COUNT:
effect++;
break;
}
@@ -901,30 +761,52 @@ u8 UpdateTurnCounters(void)
return (gBattleMainFunc != BattleTurnPassed);
}
-#define TURNBASED_MAX_CASE 19
+enum
+{
+ ENDTURN_INGRAIN,
+ ENDTURN_ABILITIES,
+ ENDTURN_ITEMS1,
+ ENDTURN_LEECH_SEED,
+ ENDTURN_POISON,
+ ENDTURN_BAD_POISON,
+ ENDTURN_BURN,
+ ENDTURN_NIGHTMARES,
+ ENDTURN_CURSE,
+ ENDTURN_WRAP,
+ ENDTURN_UPROAR,
+ ENDTURN_THRASH,
+ ENDTURN_DISABLE,
+ ENDTURN_ENCORE,
+ ENDTURN_LOCK_ON,
+ ENDTURN_CHARGE,
+ ENDTURN_TAUNT,
+ ENDTURN_YAWN,
+ ENDTURN_ITEMS2,
+ ENDTURN_BATTLER_COUNT
+};
-u8 TurnBasedEffects(void)
+u8 DoBattlerEndTurnEffects(void)
{
u8 effect = 0;
gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20);
- while (gBattleStruct->turnEffectsBank < gNoOfAllBanks && gBattleStruct->turnEffectsTracker <= TURNBASED_MAX_CASE)
+ while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT)
{
- gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->turnEffectsBank];
- if (gAbsentBankFlags & gBitTable[gActiveBank])
+ gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId];
+ if (gAbsentBattlerFlags & gBitTable[gActiveBattler])
{
- gBattleStruct->turnEffectsBank++;
+ gBattleStruct->turnEffectsBattlerId++;
}
else
{
switch (gBattleStruct->turnEffectsTracker)
{
- case 0: // ingrain
- if ((gStatuses3[gActiveBank] & STATUS3_ROOTED)
- && gBattleMons[gActiveBank].hp != gBattleMons[gActiveBank].maxHP
- && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_INGRAIN: // ingrain
+ if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED)
+ && gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP
+ && gBattleMons[gActiveBattler].hp != 0)
{
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
@@ -933,41 +815,41 @@ u8 TurnBasedEffects(void)
}
gBattleStruct->turnEffectsTracker++;
break;
- case 1: // end turn abilities
- if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBank, 0, 0, 0))
+ case ENDTURN_ABILITIES: // end turn abilities
+ if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0))
effect++;
gBattleStruct->turnEffectsTracker++;
break;
- case 2: // item effects
- if (ItemBattleEffects(1, gActiveBank, 0))
+ case ENDTURN_ITEMS1: // item effects
+ if (ItemBattleEffects(1, gActiveBattler, 0))
effect++;
gBattleStruct->turnEffectsTracker++;
break;
- case 18: // item effects again
- if (ItemBattleEffects(1, gActiveBank, 1))
+ case ENDTURN_ITEMS2: // item effects again
+ if (ItemBattleEffects(1, gActiveBattler, 1))
effect++;
gBattleStruct->turnEffectsTracker++;
break;
- case 3: // leech seed
- if ((gStatuses3[gActiveBank] & STATUS3_LEECHSEED)
- && gBattleMons[gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK].hp != 0
- && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_LEECH_SEED: // leech seed
+ if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED)
+ && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER].hp != 0
+ && gBattleMons[gActiveBattler].hp != 0)
{
- gBankTarget = gStatuses3[gActiveBank] & STATUS3_LEECHSEED_BANK; //funny how the 'target' is actually the bank that receives HP
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
+ gBattlerTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver.
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- gBattleScripting.animArg1 = gBankTarget;
- gBattleScripting.animArg2 = gBankAttacker;
+ gBattleScripting.animArg1 = gBattlerTarget;
+ gBattleScripting.animArg2 = gBattlerAttacker;
BattleScriptExecute(BattleScript_LeechSeedTurnDrain);
effect++;
}
gBattleStruct->turnEffectsTracker++;
break;
- case 4: // poison
- if ((gBattleMons[gActiveBank].status1 & STATUS_POISON) && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_POISON: // poison
+ if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0)
{
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptExecute(BattleScript_PoisonTurnDmg);
@@ -975,24 +857,24 @@ u8 TurnBasedEffects(void)
}
gBattleStruct->turnEffectsTracker++;
break;
- case 5: // toxic poison
- if ((gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON) && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_BAD_POISON: // toxic poison
+ if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0)
{
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) //not 16 turns
- gBattleMons[gActiveBank].status1 += 0x100;
- gBattleMoveDamage *= (gBattleMons[gActiveBank].status1 & 0xF00) >> 8;
+ if ((gBattleMons[gActiveBattler].status1 & 0xF00) != 0xF00) // not 16 turns
+ gBattleMons[gActiveBattler].status1 += 0x100;
+ gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & 0xF00) >> 8;
BattleScriptExecute(BattleScript_PoisonTurnDmg);
effect++;
}
gBattleStruct->turnEffectsTracker++;
break;
- case 6: // burn
- if ((gBattleMons[gActiveBank].status1 & STATUS_BURN) && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_BURN: // burn
+ if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0)
{
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptExecute(BattleScript_BurnTurnDmg);
@@ -1000,14 +882,14 @@ u8 TurnBasedEffects(void)
}
gBattleStruct->turnEffectsTracker++;
break;
- case 7: // spooky nightmares
- if ((gBattleMons[gActiveBank].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_NIGHTMARES: // spooky nightmares
+ if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0)
{
- // R/S does not perform this sleep check, which causes the nighmare effect to
- // persist even after the affected Pokemon has been awakened by Shed Skin
- if (gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
+ // R/S does not perform this sleep check, which causes the nightmare effect to
+ // persist even after the affected Pokemon has been awakened by Shed Skin.
+ if (gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
{
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptExecute(BattleScript_NightmareTurnDmg);
@@ -1015,15 +897,15 @@ u8 TurnBasedEffects(void)
}
else
{
- gBattleMons[gActiveBank].status2 &= ~STATUS2_NIGHTMARE;
+ gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE;
}
}
gBattleStruct->turnEffectsTracker++;
break;
- case 8: // curse
- if ((gBattleMons[gActiveBank].status2 & STATUS2_CURSED) && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_CURSE: // curse
+ if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0)
{
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptExecute(BattleScript_CurseTurnDmg);
@@ -1031,31 +913,31 @@ u8 TurnBasedEffects(void)
}
gBattleStruct->turnEffectsTracker++;
break;
- case 9: // wrap
- if ((gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBank].hp != 0)
+ case ENDTURN_WRAP: // wrap
+ if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0)
{
- gBattleMons[gActiveBank].status2 -= 0x2000;
- if (gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) // damaged by wrap
+ gBattleMons[gActiveBattler].status2 -= 0x2000;
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) // damaged by wrap
{
// This is the only way I could get this array access to match.
- gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 0);
- gBattleScripting.animArg2 = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 1);
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 0);
- gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 1);
+ gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0);
+ gBattleScripting.animArg2 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1);
+ gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;
+ gBattleTextBuff1[1] = B_BUFF_MOVE;
+ gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0);
+ gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1);
gBattleTextBuff1[4] = EOS;
gBattlescriptCurrInstr = BattleScript_WrapTurnDmg;
- gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
}
else // broke free
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 0);
- gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBank * 2 + 1);
+ gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;
+ gBattleTextBuff1[1] = B_BUFF_MOVE;
+ gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0);
+ gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1);
gBattleTextBuff1[4] = EOS;
gBattlescriptCurrInstr = BattleScript_WrapEnds;
}
@@ -1064,70 +946,70 @@ u8 TurnBasedEffects(void)
}
gBattleStruct->turnEffectsTracker++;
break;
- case 10: // uproar
- if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR)
+ case ENDTURN_UPROAR: // uproar
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR)
{
- for (gBankAttacker = 0; gBankAttacker < gNoOfAllBanks; gBankAttacker++)
+ for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++)
{
- if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP)
- && gBattleMons[gBankAttacker].ability != ABILITY_SOUNDPROOF)
+ if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
+ && gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF)
{
- gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP);
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- BattleScriptExecute(gUnknown_082DB234);
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ BattleScriptExecute(BattleScript_MonWokeUpInUproar);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
}
}
- if (gBankAttacker != gNoOfAllBanks)
+ if (gBattlerAttacker != gBattlersCount)
{
effect = 2; // a pokemon was awaken
break;
}
else
{
- gBankAttacker = gActiveBank;
- gBattleMons[gActiveBank].status2 -= 0x10; // uproar timer goes down
- if (WasUnableToUseMove(gActiveBank))
+ gBattlerAttacker = gActiveBattler;
+ gBattleMons[gActiveBattler].status2 -= 0x10; // uproar timer goes down
+ if (WasUnableToUseMove(gActiveBattler))
{
- CancelMultiTurnMoves(gActiveBank);
+ CancelMultiTurnMoves(gActiveBattler);
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
- else if (gBattleMons[gActiveBank].status2 & STATUS2_UPROAR)
+ else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- gBattleMons[gActiveBank].status2 |= STATUS2_MULTIPLETURNS;
+ gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS;
}
else
{
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- CancelMultiTurnMoves(gActiveBank);
+ CancelMultiTurnMoves(gActiveBattler);
}
- BattleScriptExecute(gUnknown_082DB2A6);
+ BattleScriptExecute(BattleScript_PrintUproarOverTurns);
effect = 1;
}
}
if (effect != 2)
gBattleStruct->turnEffectsTracker++;
break;
- case 11: // thrash
- if (gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE)
+ case ENDTURN_THRASH: // thrash
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)
{
- gBattleMons[gActiveBank].status2 -= 0x400;
- if (WasUnableToUseMove(gActiveBank))
- CancelMultiTurnMoves(gActiveBank);
- else if (!(gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE)
- && (gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS))
+ gBattleMons[gActiveBattler].status2 -= 0x400;
+ if (WasUnableToUseMove(gActiveBattler))
+ CancelMultiTurnMoves(gActiveBattler);
+ else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)
+ && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS))
{
- gBattleMons[gActiveBank].status2 &= ~(STATUS2_MULTIPLETURNS);
- if (!(gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION))
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS);
+ if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION))
{
- gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47;
+ gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER;
SetMoveEffect(1, 0);
- if (gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
BattleScriptExecute(BattleScript_ThrashConfuses);
effect++;
}
@@ -1135,85 +1017,85 @@ u8 TurnBasedEffects(void)
}
gBattleStruct->turnEffectsTracker++;
break;
- case 12: // disable
- if (gDisableStructs[gActiveBank].disableTimer1 != 0)
+ case ENDTURN_DISABLE: // disable
+ if (gDisableStructs[gActiveBattler].disableTimer1 != 0)
{
- int i;
+ s32 i;
for (i = 0; i < 4; i++)
{
- if (gDisableStructs[gActiveBank].disabledMove == gBattleMons[gActiveBank].moves[i])
+ if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i])
break;
}
if (i == 4) // pokemon does not have the disabled move anymore
{
- gDisableStructs[gActiveBank].disabledMove = 0;
- gDisableStructs[gActiveBank].disableTimer1 = 0;
+ gDisableStructs[gActiveBattler].disabledMove = 0;
+ gDisableStructs[gActiveBattler].disableTimer1 = 0;
}
- else if (--gDisableStructs[gActiveBank].disableTimer1 == 0) // disable ends
+ else if (--gDisableStructs[gActiveBattler].disableTimer1 == 0) // disable ends
{
- gDisableStructs[gActiveBank].disabledMove = 0;
+ gDisableStructs[gActiveBattler].disabledMove = 0;
BattleScriptExecute(BattleScript_DisabledNoMore);
effect++;
}
}
gBattleStruct->turnEffectsTracker++;
break;
- case 13: // encore
- if (gDisableStructs[gActiveBank].encoreTimer1 != 0)
+ case ENDTURN_ENCORE: // encore
+ if (gDisableStructs[gActiveBattler].encoreTimer1 != 0)
{
- if (gBattleMons[gActiveBank].moves[gDisableStructs[gActiveBank].encoredMovePos] != gDisableStructs[gActiveBank].encoredMove) // pokemon does not have the encored move anymore
+ if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore
{
- gDisableStructs[gActiveBank].encoredMove = 0;
- gDisableStructs[gActiveBank].encoreTimer1 = 0;
+ gDisableStructs[gActiveBattler].encoredMove = 0;
+ gDisableStructs[gActiveBattler].encoreTimer1 = 0;
}
- else if (--gDisableStructs[gActiveBank].encoreTimer1 == 0
- || gBattleMons[gActiveBank].pp[gDisableStructs[gActiveBank].encoredMovePos] == 0)
+ else if (--gDisableStructs[gActiveBattler].encoreTimer1 == 0
+ || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0)
{
- gDisableStructs[gActiveBank].encoredMove = 0;
- gDisableStructs[gActiveBank].encoreTimer1 = 0;
+ gDisableStructs[gActiveBattler].encoredMove = 0;
+ gDisableStructs[gActiveBattler].encoreTimer1 = 0;
BattleScriptExecute(BattleScript_EncoredNoMore);
effect++;
}
}
gBattleStruct->turnEffectsTracker++;
break;
- case 14: // lock-on decrement
- if (gStatuses3[gActiveBank] & STATUS3_ALWAYS_HITS)
- gStatuses3[gActiveBank] -= 0x8;
+ case ENDTURN_LOCK_ON: // lock-on decrement
+ if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS)
+ gStatuses3[gActiveBattler] -= 0x8;
gBattleStruct->turnEffectsTracker++;
break;
- case 15: // charge
- if (gDisableStructs[gActiveBank].chargeTimer1 && --gDisableStructs[gActiveBank].chargeTimer1 == 0)
- gStatuses3[gActiveBank] &= ~STATUS3_CHARGED_UP;
+ case ENDTURN_CHARGE: // charge
+ if (gDisableStructs[gActiveBattler].chargeTimer1 && --gDisableStructs[gActiveBattler].chargeTimer1 == 0)
+ gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP;
gBattleStruct->turnEffectsTracker++;
break;
- case 16: // taunt
- if (gDisableStructs[gActiveBank].tauntTimer1)
- gDisableStructs[gActiveBank].tauntTimer1--;
+ case ENDTURN_TAUNT: // taunt
+ if (gDisableStructs[gActiveBattler].tauntTimer1)
+ gDisableStructs[gActiveBattler].tauntTimer1--;
gBattleStruct->turnEffectsTracker++;
break;
- case 17: // yawn
- if (gStatuses3[gActiveBank] & STATUS3_YAWN)
+ case ENDTURN_YAWN: // yawn
+ if (gStatuses3[gActiveBattler] & STATUS3_YAWN)
{
- gStatuses3[gActiveBank] -= 0x800;
- if (!(gStatuses3[gActiveBank] & STATUS3_YAWN) && !(gBattleMons[gActiveBank].status1 & STATUS_ANY)
- && gBattleMons[gActiveBank].ability != ABILITY_VITAL_SPIRIT
- && gBattleMons[gActiveBank].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBank))
+ gStatuses3[gActiveBattler] -= 0x800;
+ if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY)
+ && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT
+ && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler))
{
- CancelMultiTurnMoves(gActiveBank);
- gBattleMons[gActiveBank].status1 |= (Random() & 3) + 2;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
- gEffectBank = gActiveBank;
+ CancelMultiTurnMoves(gActiveBattler);
+ gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
+ gEffectBattler = gActiveBattler;
BattleScriptExecute(BattleScript_YawnMakesAsleep);
effect++;
}
}
gBattleStruct->turnEffectsTracker++;
break;
- case 19: // done
+ case ENDTURN_BATTLER_COUNT: // done
gBattleStruct->turnEffectsTracker = 0;
- gBattleStruct->turnEffectsBank++;
+ gBattleStruct->turnEffectsBattlerId++;
break;
}
if (effect != 0)
@@ -1224,96 +1106,88 @@ u8 TurnBasedEffects(void)
return 0;
}
-bool8 sub_8041364(void)
+bool8 HandleWishPerishSongOnTurnEnd(void)
{
gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20);
- switch (gBattleStruct->field_1A0)
+ switch (gBattleStruct->wishPerishSongState)
{
case 0:
- while (gBattleStruct->field_1A1 < gNoOfAllBanks)
+ while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount)
{
- gActiveBank = gBattleStruct->field_1A1;
- if (gAbsentBankFlags & gBitTable[gActiveBank])
+ gActiveBattler = gBattleStruct->wishPerishSongBattlerId;
+ if (gAbsentBattlerFlags & gBitTable[gActiveBattler])
{
- gBattleStruct->field_1A1++;
+ gBattleStruct->wishPerishSongBattlerId++;
continue;
}
- gBattleStruct->field_1A1++;
- if (gWishFutureKnock.futureSightCounter[gActiveBank] != 0
- && --gWishFutureKnock.futureSightCounter[gActiveBank] == 0
- && gBattleMons[gActiveBank].hp != 0)
+ gBattleStruct->wishPerishSongBattlerId++;
+ if (gWishFutureKnock.futureSightCounter[gActiveBattler] != 0
+ && --gWishFutureKnock.futureSightCounter[gActiveBattler] == 0
+ && gBattleMons[gActiveBattler].hp != 0)
{
- if (gWishFutureKnock.futureSightMove[gActiveBank] == MOVE_FUTURE_SIGHT)
+ if (gWishFutureKnock.futureSightMove[gActiveBattler] == MOVE_FUTURE_SIGHT)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = gWishFutureKnock.futureSightMove[gActiveBank];
- gBattleTextBuff1[3] = gWishFutureKnock.futureSightMove[gActiveBank] >> 8;
- gBattleTextBuff1[4] = EOS;
- gBankTarget = gActiveBank;
- gBankAttacker = gWishFutureKnock.futureSightAttacker[gActiveBank];
- gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBank];
- gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF;
- BattleScriptExecute(gUnknown_082DAFE4);
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[gActiveBattler]);
+
+ gBattlerTarget = gActiveBattler;
+ gBattlerAttacker = gWishFutureKnock.futureSightAttacker[gActiveBattler];
+ gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBattler];
+ gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF;
+ BattleScriptExecute(BattleScript_MonTookFutureAttack);
- if (gWishFutureKnock.futureSightCounter[gActiveBank] == 0
- && gWishFutureKnock.futureSightCounter[gActiveBank ^ 2] == 0)
+ if (gWishFutureKnock.futureSightCounter[gActiveBattler] == 0
+ && gWishFutureKnock.futureSightCounter[gActiveBattler ^ BIT_FLANK] == 0)
{
- gSideAffecting[GetBankIdentity(gBankTarget) & 1] &= ~SIDE_STATUS_FUTUREATTACK;
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)] &= ~(SIDE_STATUS_FUTUREATTACK);
}
- return 1;
+ return TRUE;
}
}
// Why do I have to keep doing this to match?
{
- u8* var = &gBattleStruct->field_1A0;
- *var = 1;
- gBattleStruct->field_1A1 = 0;
+ u8 *state = &gBattleStruct->wishPerishSongState;
+ *state = 1;
+ gBattleStruct->wishPerishSongBattlerId = 0;
}
// fall through
case 1:
- while (gBattleStruct->field_1A1 < gNoOfAllBanks)
+ while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount)
{
- gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->field_1A1];
- if (gAbsentBankFlags & gBitTable[gActiveBank])
+ gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->wishPerishSongBattlerId];
+ if (gAbsentBattlerFlags & gBitTable[gActiveBattler])
{
- gBattleStruct->field_1A1++;
+ gBattleStruct->wishPerishSongBattlerId++;
continue;
}
- gBattleStruct->field_1A1++;
- if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG)
+ gBattleStruct->wishPerishSongBattlerId++;
+ if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 1;
- gBattleTextBuff1[2] = 1;
- gBattleTextBuff1[3] = 1;
- gBattleTextBuff1[4] = gDisableStructs[gActiveBank].perishSongTimer1;
- gBattleTextBuff1[5] = EOS;
- if (gDisableStructs[gActiveBank].perishSongTimer1 == 0)
+ PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gActiveBattler].perishSongTimer1);
+ if (gDisableStructs[gActiveBattler].perishSongTimer1 == 0)
{
- gStatuses3[gActiveBank] &= ~STATUS3_PERISH_SONG;
- gBattleMoveDamage = gBattleMons[gActiveBank].hp;
- gBattlescriptCurrInstr = gUnknown_082DAF05;
+ gStatuses3[gActiveBattler] &= ~STATUS3_PERISH_SONG;
+ gBattleMoveDamage = gBattleMons[gActiveBattler].hp;
+ gBattlescriptCurrInstr = BattleScript_PerishSongTakesLife;
}
else
{
- gDisableStructs[gActiveBank].perishSongTimer1--;
- gBattlescriptCurrInstr = gUnknown_082DAF20;
+ gDisableStructs[gActiveBattler].perishSongTimer1--;
+ gBattlescriptCurrInstr = BattleScript_PerishSongCountGoesDown;
}
BattleScriptExecute(gBattlescriptCurrInstr);
- return 1;
+ return TRUE;
}
}
// Hm...
{
- u8* var = &gBattleStruct->field_1A0;
- *var = 2;
- gBattleStruct->field_1A1 = 0;
+ u8 *state = &gBattleStruct->wishPerishSongState;
+ *state = 2;
+ gBattleStruct->wishPerishSongBattlerId = 0;
}
// fall through
case 2:
@@ -1326,129 +1200,146 @@ bool8 sub_8041364(void)
for (i = 0; i < 2; i++)
CancelMultiTurnMoves(i);
- gBattlescriptCurrInstr = gUnknown_082DB8F3;
- BattleScriptExecute(gUnknown_082DB8F3);
- gBattleStruct->field_1A0++;
- return 1;
+ gBattlescriptCurrInstr = BattleScript_82DB8F3;
+ BattleScriptExecute(BattleScript_82DB8F3);
+ gBattleStruct->wishPerishSongState++;
+ return TRUE;
}
break;
}
gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20);
- return 0;
+ return FALSE;
}
-#define sub_8041728_MAX_CASE 7
+#define FAINTED_ACTIONS_MAX_CASE 7
-bool8 sub_8041728(void)
+bool8 HandleFaintedMonActions(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
return FALSE;
do
{
- int i;
- switch (gBattleStruct->field_4D)
+ s32 i;
+ switch (gBattleStruct->faintedActionsState)
{
case 0:
- gBattleStruct->field_4E = 0;
- gBattleStruct->field_4D++;
- for (i = 0; i < gNoOfAllBanks; i++)
+ gBattleStruct->faintedActionsBattlerId = 0;
+ gBattleStruct->faintedActionsState++;
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gAbsentBankFlags & gBitTable[i] && !sub_80423F4(i, 6, 6))
- gAbsentBankFlags &= ~(gBitTable[i]);
+ if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, 6, 6))
+ gAbsentBattlerFlags &= ~(gBitTable[i]);
}
// fall through
case 1:
do
{
- gBank1 = gBankTarget = gBattleStruct->field_4E;
- if (gBattleMons[gBattleStruct->field_4E].hp == 0
- && !(gBattleStruct->field_DF & gBitTable[gBattlePartyID[gBattleStruct->field_4E]])
- && !(gAbsentBankFlags & gBitTable[gBattleStruct->field_4E]))
+ gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId;
+ if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0
+ && !(gBattleStruct->field_DF & gBitTable[gBattlerPartyIndexes[gBattleStruct->faintedActionsBattlerId]])
+ && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId]))
{
- BattleScriptExecute(gUnknown_082DA7C4);
- gBattleStruct->field_4D = 2;
+ BattleScriptExecute(BattleScript_GiveExp);
+ gBattleStruct->faintedActionsState = 2;
return TRUE;
}
- } while (++gBattleStruct->field_4E != gNoOfAllBanks);
- gBattleStruct->field_4D = 3;
+ } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount);
+ gBattleStruct->faintedActionsState = 3;
break;
case 2:
- sub_803F9EC(gBank1);
- if (++gBattleStruct->field_4E == gNoOfAllBanks)
- gBattleStruct->field_4D = 3;
+ sub_803F9EC(gBattlerFainted);
+ if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount)
+ gBattleStruct->faintedActionsState = 3;
else
- gBattleStruct->field_4D = 1;
+ gBattleStruct->faintedActionsState = 1;
break;
case 3:
- gBattleStruct->field_4E = 0;
- gBattleStruct->field_4D++;
+ gBattleStruct->faintedActionsBattlerId = 0;
+ gBattleStruct->faintedActionsState++;
// fall through
case 4:
do
{
- gBank1 = gBankTarget = gBattleStruct->field_4E;
- if (gBattleMons[gBattleStruct->field_4E].hp == 0
- && !(gAbsentBankFlags & gBitTable[gBattleStruct->field_4E]))
+ gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId;
+ if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0
+ && !(gAbsentBattlerFlags & gBitTable[gBattleStruct->faintedActionsBattlerId]))
{
- BattleScriptExecute(gUnknown_082DA7CD);
- gBattleStruct->field_4D = 5;
+ BattleScriptExecute(BattleScript_HandleFaintedMon);
+ gBattleStruct->faintedActionsState = 5;
return TRUE;
}
- } while (++gBattleStruct->field_4E != gNoOfAllBanks);
- gBattleStruct->field_4D = 6;
+ } while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount);
+ gBattleStruct->faintedActionsState = 6;
break;
case 5:
- if (++gBattleStruct->field_4E == gNoOfAllBanks)
- gBattleStruct->field_4D = 6;
+ if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount)
+ gBattleStruct->faintedActionsState = 6;
else
- gBattleStruct->field_4D = 4;
+ gBattleStruct->faintedActionsState = 4;
break;
case 6:
if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) || ItemBattleEffects(1, 0, 1) || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0))
return TRUE;
- gBattleStruct->field_4D++;
+ gBattleStruct->faintedActionsState++;
break;
- case 7:
+ case FAINTED_ACTIONS_MAX_CASE:
break;
}
- } while (gBattleStruct->field_4D != sub_8041728_MAX_CASE);
+ } while (gBattleStruct->faintedActionsState != FAINTED_ACTIONS_MAX_CASE);
return FALSE;
}
void TryClearRageStatuses(void)
{
- int i;
- for (i = 0; i < gNoOfAllBanks; i++)
+ s32 i;
+ for (i = 0; i < gBattlersCount; i++)
{
- if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMovesByBanks[i] != MOVE_RAGE)
+ if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE)
gBattleMons[i].status2 &= ~(STATUS2_RAGE);
}
}
-#define ATKCANCELLER_MAX_CASE 14
+enum
+{
+ CANCELLER_FLAGS,
+ CANCELLER_ASLEEP,
+ CANCELLER_FROZEN,
+ CANCELLER_TRUANT,
+ CANCELLER_RECHARGE,
+ CANCELLER_FLINCH,
+ CANCELLER_DISABLED,
+ CANCELLER_TAUNTED,
+ CANCELLER_IMPRISONED,
+ CANCELLER_CONFUSED,
+ CANCELLER_PARALYSED,
+ CANCELLER_IN_LOVE,
+ CANCELLER_BIDE,
+ CANCELLER_THAW,
+ CANCELLER_END,
+};
u8 AtkCanceller_UnableToUseMove(void)
{
u8 effect = 0;
- s32* bideDmg = &gBattleScripting.bideDmg;
+ s32 *bideDmg = &gBattleScripting.bideDmg;
do
{
switch (gBattleStruct->atkCancellerTracker)
{
- case 0: // flags clear
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_DESTINY_BOND);
- gStatuses3[gBankAttacker] &= ~(STATUS3_GRUDGE);
+ case CANCELLER_FLAGS: // flags clear
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND);
+ gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE);
gBattleStruct->atkCancellerTracker++;
break;
- case 1: // check being asleep
- if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP)
+ case CANCELLER_ASLEEP: // check being asleep
+ if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
{
- if (UproarWakeUpCheck(gBankAttacker))
+ if (UproarWakeUpCheck(gBattlerAttacker))
{
- gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP);
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -1457,15 +1348,15 @@ u8 AtkCanceller_UnableToUseMove(void)
else
{
u8 toSub;
- if (gBattleMons[gBankAttacker].ability == ABILITY_EARLY_BIRD)
+ if (gBattleMons[gBattlerAttacker].ability == ABILITY_EARLY_BIRD)
toSub = 2;
else
toSub = 1;
- if ((gBattleMons[gBankAttacker].status1 & STATUS_SLEEP) < toSub)
- gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP);
+ if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub)
+ gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
else
- gBattleMons[gBankAttacker].status1 -= toSub;
- if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP)
+ gBattleMons[gBattlerAttacker].status1 -= toSub;
+ if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
{
if (gCurrentMove != MOVE_SNORE && gCurrentMove != MOVE_SLEEP_TALK)
{
@@ -1476,7 +1367,7 @@ u8 AtkCanceller_UnableToUseMove(void)
}
else
{
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -1486,8 +1377,8 @@ u8 AtkCanceller_UnableToUseMove(void)
}
gBattleStruct->atkCancellerTracker++;
break;
- case 2: // check being frozen
- if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE)
+ case CANCELLER_FROZEN: // check being frozen
+ if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)
{
if (Random() % 5)
{
@@ -1504,7 +1395,7 @@ u8 AtkCanceller_UnableToUseMove(void)
}
else // unfreeze
{
- gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE);
+ gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
@@ -1513,81 +1404,81 @@ u8 AtkCanceller_UnableToUseMove(void)
}
gBattleStruct->atkCancellerTracker++;
break;
- case 3: // truant
- if (gBattleMons[gBankAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBankAttacker].truantCounter)
+ case CANCELLER_TRUANT: // truant
+ if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter)
{
- CancelMultiTurnMoves(gBankAttacker);
+ CancelMultiTurnMoves(gBattlerAttacker);
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround;
- gBattleMoveFlags |= MOVESTATUS_MISSED;
+ gMoveResultFlags |= MOVE_RESULT_MISSED;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 4: // recharge
- if (gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE)
+ case CANCELLER_RECHARGE: // recharge
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)
{
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RECHARGE);
- gDisableStructs[gBankAttacker].rechargeCounter = 0;
- CancelMultiTurnMoves(gBankAttacker);
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RECHARGE);
+ gDisableStructs[gBattlerAttacker].rechargeCounter = 0;
+ CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 5: // flinch
- if (gBattleMons[gBankAttacker].status2 & STATUS2_FLINCHED)
+ case CANCELLER_FLINCH: // flinch
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED)
{
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_FLINCHED);
- gProtectStructs[gBankAttacker].flinchImmobility = 1;
- CancelMultiTurnMoves(gBankAttacker);
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED);
+ gProtectStructs[gBattlerAttacker].flinchImmobility = 1;
+ CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 6: // disabled move
- if (gDisableStructs[gBankAttacker].disabledMove == gCurrentMove && gDisableStructs[gBankAttacker].disabledMove != 0)
+ case CANCELLER_DISABLED: // disabled move
+ if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != 0)
{
- gProtectStructs[gBankAttacker].usedDisabledMove = 1;
- gBattleScripting.bank = gBankAttacker;
- CancelMultiTurnMoves(gBankAttacker);
+ gProtectStructs[gBattlerAttacker].usedDisabledMove = 1;
+ gBattleScripting.battler = gBattlerAttacker;
+ CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 7: // taunt
- if (gDisableStructs[gBankAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0)
+ case CANCELLER_TAUNTED: // taunt
+ if (gDisableStructs[gBattlerAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0)
{
- gProtectStructs[gBankAttacker].usedTauntedMove = 1;
- CancelMultiTurnMoves(gBankAttacker);
+ gProtectStructs[gBattlerAttacker].usedTauntedMove = 1;
+ CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 8: // imprisoned
- if (GetImprisonedMovesCount(gBankAttacker, gCurrentMove))
+ case CANCELLER_IMPRISONED: // imprisoned
+ if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove))
{
- gProtectStructs[gBankAttacker].usedImprisionedMove = 1;
- CancelMultiTurnMoves(gBankAttacker);
+ gProtectStructs[gBattlerAttacker].usedImprisionedMove = 1;
+ CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 9: // confusion
- if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION)
+ case CANCELLER_CONFUSED: // confusion
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION)
{
- gBattleMons[gBankAttacker].status2--;
- if (gBattleMons[gBankAttacker].status2 & STATUS2_CONFUSION)
+ gBattleMons[gBattlerAttacker].status2--;
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION)
{
if (Random() & 1)
{
@@ -1597,9 +1488,9 @@ u8 AtkCanceller_UnableToUseMove(void)
else // confusion dmg
{
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- gBankTarget = gBankAttacker;
- gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker);
- gProtectStructs[gBankAttacker].confusionSelfDmg = 1;
+ gBattlerTarget = gBattlerAttacker;
+ gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker);
+ gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
}
gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused;
@@ -1613,68 +1504,74 @@ u8 AtkCanceller_UnableToUseMove(void)
}
gBattleStruct->atkCancellerTracker++;
break;
- case 10: // paralysis
- if ((gBattleMons[gBankAttacker].status1 & STATUS_PARALYSIS) && (Random() % 4) == 0)
+ case CANCELLER_PARALYSED: // paralysis
+ if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0)
{
- gProtectStructs[gBankAttacker].prlzImmobility = 1;
+ gProtectStructs[gBattlerAttacker].prlzImmobility = 1;
// This is removed in Emerald for some reason
- //CancelMultiTurnMoves(gBankAttacker);
+ //CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 11: // infatuation
- if (gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION)
+ case CANCELLER_IN_LOVE: // infatuation
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION)
{
- gBattleScripting.bank = CountTrailingZeroBits((gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) >> 0x10);
+ gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10);
if (Random() & 1)
+ {
BattleScriptPushCursor();
+ }
else
{
BattleScriptPush(BattleScript_MoveUsedIsParalyzedCantAttack);
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
- gProtectStructs[gBankAttacker].loveImmobility = 1;
- CancelMultiTurnMoves(gBankAttacker);
+ gProtectStructs[gBattlerAttacker].loveImmobility = 1;
+ CancelMultiTurnMoves(gBattlerAttacker);
}
gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove;
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 12: // bide
- if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE)
+ case CANCELLER_BIDE: // bide
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE)
{
- gBattleMons[gBankAttacker].status2 -= 0x100;
- if (gBattleMons[gBankAttacker].status2 & STATUS2_BIDE)
+ gBattleMons[gBattlerAttacker].status2 -= 0x100;
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE)
+ {
gBattlescriptCurrInstr = BattleScript_BideStoringEnergy;
+ }
else
{
// This is removed in Emerald for some reason
- //gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
- if (gTakenDmg[gBankAttacker])
+ //gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
+ if (gTakenDmg[gBattlerAttacker])
{
gCurrentMove = MOVE_BIDE;
- *bideDmg = gTakenDmg[gBankAttacker] * 2;
- gBankTarget = gTakenDmgBanks[gBankAttacker];
- if (gAbsentBankFlags & gBitTable[gBankTarget])
- gBankTarget = GetMoveTarget(MOVE_BIDE, 1);
+ *bideDmg = gTakenDmg[gBattlerAttacker] * 2;
+ gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker];
+ if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
+ gBattlerTarget = GetMoveTarget(MOVE_BIDE, 1);
gBattlescriptCurrInstr = BattleScript_BideAttack;
}
else
+ {
gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack;
+ }
}
effect = 1;
}
gBattleStruct->atkCancellerTracker++;
break;
- case 13: // move thawing
- if (gBattleMons[gBankAttacker].status1 & STATUS_FREEZE)
+ case CANCELLER_THAW: // move thawing
+ if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)
{
if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT)
{
- gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE);
+ gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
@@ -1683,132 +1580,143 @@ u8 AtkCanceller_UnableToUseMove(void)
}
gBattleStruct->atkCancellerTracker++;
break;
- case 14: // last case
+ case CANCELLER_END:
break;
}
- } while (gBattleStruct->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0);
+ } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0);
if (effect == 2)
{
- gActiveBank = gBankAttacker;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
}
return effect;
}
-bool8 sub_80423F4(u8 bank, u8 r1, u8 r2)
+bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
{
- struct Pokemon* party;
- u8 r7;
- u8 r6;
+ struct Pokemon *party;
+ u8 id1, id2;
s32 i;
+
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
return FALSE;
+
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
- if (GetBankSide(bank) == SIDE_PLAYER)
+ if (GetBattlerSide(battler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
- r6 = ((bank & 2) / 2);
- for (i = r6 * 3; i < r6 * 3 + 3; i++)
+
+ id1 = ((battler & BIT_FLANK) / 2);
+ for (i = id1 * 3; i < id1 * 3 + 3; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
- && GetMonData(&party[i], MON_DATA_SPECIES2) != 0
+ && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
break;
}
- return (i == r6 * 3 + 3);
+ return (i == id1 * 3 + 3);
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
{
- if (GetBankSide(bank) == SIDE_PLAYER)
+ if (GetBattlerSide(battler) == B_SIDE_PLAYER)
{
party = gPlayerParty;
- r7 = GetBankMultiplayerId(bank);
- r6 = sub_806D82C(r7);
+ id2 = GetBattlerMultiplayerId(battler);
+ id1 = GetLinkTrainerFlankId(id2);
}
else
{
- // FIXME: Compiler insists on moving r4 into r1 before doing the eor
+ // FIXME: Compiler insists on moving r4 into r1 before doing the eor.
#ifndef NONMATCHING
- register u32 var asm("r1");
+ register u32 var asm("r1");
#else
- u32 var;
+ u32 var;
#endif // NONMATCHING
party = gEnemyParty;
- var = bank ^ 1;
- r6 = (var != 0) ? 1 : 0;
+ var = battler ^ BIT_SIDE;
+ if (var == 0)
+ id1 = 0;
+ else
+ id1 = 1;
}
}
else
{
- r7 = GetBankMultiplayerId(bank);
- if (GetBankSide(bank) == SIDE_PLAYER)
+ id2 = GetBattlerMultiplayerId(battler);
+
+ if (GetBattlerSide(battler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
- r6 = sub_806D82C(r7);
+
+ id1 = GetLinkTrainerFlankId(id2);
}
- for (i = r6 * 3; i < r6 * 3 + 3; i++)
+
+ for (i = id1 * 3; i < id1 * 3 + 3; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
- && GetMonData(&party[i], MON_DATA_SPECIES2) != 0
+ && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
break;
}
- return (i == r6 * 3 + 3);
+ return (i == id1 * 3 + 3);
}
- else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && GetBankSide(bank) == SIDE_OPPONENT)
+ else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
party = gEnemyParty;
- if (bank == 1)
- r6 = 0;
+ if (battler == 1)
+ id1 = 0;
else
- r6 = 3;
- for (i = r6; i < r6 + 3; i++)
+ id1 = 3;
+
+ for (i = id1; i < id1 + 3; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
- && GetMonData(&party[i], MON_DATA_SPECIES2) != 0
+ && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
break;
}
- return (i == r6 + 3);
+ return (i == id1 + 3);
}
else
{
- if (GetBankSide(bank) == SIDE_OPPONENT)
+ if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
- r7 = GetBankByIdentity(1);
- r6 = GetBankByIdentity(3);
+ id2 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ id1 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
party = gEnemyParty;
}
else
{
- r7 = GetBankByIdentity(0);
- r6 = GetBankByIdentity(2);
+ id2 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ id1 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
party = gPlayerParty;
}
- if (r1 == 6)
- r1 = gBattlePartyID[r7];
- if (r2 == 6)
- r2 = gBattlePartyID[r6];
- for (i = 0; i < 6; i++)
+
+ if (partyIdBattlerOn1 == PARTY_SIZE)
+ partyIdBattlerOn1 = gBattlerPartyIndexes[id2];
+ if (partyIdBattlerOn2 == PARTY_SIZE)
+ partyIdBattlerOn2 = gBattlerPartyIndexes[id1];
+
+ for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
- && GetMonData(&party[i], MON_DATA_SPECIES2) != 0
+ && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG
- // FIXME: Using index[array] instead of array[index] is BAD!
- && i != r1 && i != r2 && i != r7[gBattleStruct->monToSwitchIntoId] && i != r6[gBattleStruct->monToSwitchIntoId])
+ && i != partyIdBattlerOn1 && i != partyIdBattlerOn2
+ && i != *(gBattleStruct->monToSwitchIntoId + id2) && i != id1[gBattleStruct->monToSwitchIntoId])
break;
}
- return (i == 6);
+ return (i == PARTY_SIZE);
}
}
@@ -1821,48 +1729,43 @@ enum
CASTFORM_TO_ICE, //4
};
-u8 CastformDataTypeChange(u8 bank)
+u8 CastformDataTypeChange(u8 battler)
{
u8 formChange = 0;
- if (gBattleMons[bank].species != SPECIES_CASTFORM || gBattleMons[bank].ability != ABILITY_FORECAST || gBattleMons[bank].hp == 0)
+ if (gBattleMons[battler].species != SPECIES_CASTFORM || gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
return CASTFORM_NO_CHANGE;
- if (!WEATHER_HAS_EFFECT && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL)
+ if (!WEATHER_HAS_EFFECT && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
- gBattleMons[bank].type1 = TYPE_NORMAL;
- gBattleMons[bank].type2 = TYPE_NORMAL;
+ SET_BATTLER_TYPE(battler, TYPE_NORMAL);
return CASTFORM_TO_NORMAL;
}
if (!WEATHER_HAS_EFFECT)
return CASTFORM_NO_CHANGE;
- if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL)) && gBattleMons[bank].type1 != TYPE_NORMAL && gBattleMons[bank].type2 != TYPE_NORMAL)
+ if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
- gBattleMons[bank].type1 = TYPE_NORMAL;
- gBattleMons[bank].type2 = TYPE_NORMAL;
+ SET_BATTLER_TYPE(battler, TYPE_NORMAL);
formChange = CASTFORM_TO_NORMAL;
}
- if (gBattleWeather & WEATHER_SUN_ANY && gBattleMons[bank].type1 != TYPE_FIRE && gBattleMons[bank].type2 != TYPE_FIRE)
+ if (gBattleWeather & WEATHER_SUN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE))
{
- gBattleMons[bank].type1 = TYPE_FIRE;
- gBattleMons[bank].type2 = TYPE_FIRE;
+ SET_BATTLER_TYPE(battler, TYPE_FIRE);
formChange = CASTFORM_TO_FIRE;
}
- if (gBattleWeather & WEATHER_RAIN_ANY && gBattleMons[bank].type1 != TYPE_WATER && gBattleMons[bank].type2 != TYPE_WATER)
+ if (gBattleWeather & WEATHER_RAIN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER))
{
- gBattleMons[bank].type1 = TYPE_WATER;
- gBattleMons[bank].type2 = TYPE_WATER;
+ SET_BATTLER_TYPE(battler, TYPE_WATER);
formChange = CASTFORM_TO_WATER;
}
- if (gBattleWeather & WEATHER_HAIL && gBattleMons[bank].type1 != TYPE_ICE && gBattleMons[bank].type2 != TYPE_ICE)
+ if (gBattleWeather & WEATHER_HAIL_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE))
{
- gBattleMons[bank].type1 = TYPE_ICE;
- gBattleMons[bank].type2 = TYPE_ICE;
+ SET_BATTLER_TYPE(battler, TYPE_ICE);
formChange = CASTFORM_TO_ICE;
}
return formChange;
}
// The largest function in the game, but even it could not save itself from decompiling.
-u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
+u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg)
{
u8 effect = 0;
struct Pokemon *pokeAtk;
@@ -1872,19 +1775,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
u32 pidAtk;
u32 pidDef;
- if (gBankAttacker >= gNoOfAllBanks)
- gBankAttacker = bank;
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
- pokeAtk = &gPlayerParty[gBattlePartyID[gBankAttacker]];
+ if (gBattlerAttacker >= gBattlersCount)
+ gBattlerAttacker = battler;
+
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
+ pokeAtk = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]];
else
- pokeAtk = &gEnemyParty[gBattlePartyID[gBankAttacker]];
+ pokeAtk = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]];
- if (gBankTarget >= gNoOfAllBanks)
- gBankTarget = bank;
- if (GetBankSide(gBankTarget) == SIDE_PLAYER)
- pokeDef = &gPlayerParty[gBattlePartyID[gBankTarget]];
+ if (gBattlerTarget >= gBattlersCount)
+ gBattlerTarget = battler;
+
+ if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
+ pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]];
else
- pokeDef = &gEnemyParty[gBattlePartyID[gBankTarget]];
+ pokeDef = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]];
speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES);
pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY);
@@ -1892,7 +1797,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES);
pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY);
- if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // why isn't that check done at the beginning?
+ if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // Why isn't that check done at the beginning?
{
u8 moveType;
s32 i;
@@ -1903,23 +1808,20 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (special)
gLastUsedAbility = special;
else
- gLastUsedAbility = gBattleMons[bank].ability;
+ gLastUsedAbility = gBattleMons[battler].ability;
if (moveArg)
move = moveArg;
else
move = gCurrentMove;
- if (gBattleStruct->dynamicMoveType)
- moveType = gBattleStruct->dynamicMoveType & 0x3F;
- else
- moveType = gBattleMoves[move].type;
+ GET_MOVE_TYPE(move, moveType);
switch (caseID)
{
case ABILITYEFFECT_ON_SWITCHIN: // 0
- if (gBankAttacker >= gNoOfAllBanks)
- gBankAttacker = bank;
+ if (gBattlerAttacker >= gBattlersCount)
+ gBattlerAttacker = battler;
switch (gLastUsedAbility)
{
case ABILITYEFFECT_SWITCH_IN_WEATHER:
@@ -1934,7 +1836,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT);
gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES;
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
effect++;
}
break;
@@ -1943,7 +1845,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES;
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
effect++;
}
break;
@@ -1952,7 +1854,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES;
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
effect++;
}
break;
@@ -1961,7 +1863,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (effect)
{
gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current();
- BattleScriptPushCursorAndCallback(gUnknown_082DACE7);
+ BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts);
}
break;
case ABILITY_DRIZZLE:
@@ -1969,7 +1871,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY);
BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates);
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
effect++;
}
break;
@@ -1978,7 +1880,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates);
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
effect++;
}
break;
@@ -1987,44 +1889,44 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates);
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
effect++;
}
break;
case ABILITY_INTIMIDATE:
- if (!(gSpecialStatuses[bank].intimidatedPoke))
+ if (!(gSpecialStatuses[battler].intimidatedMon))
{
- gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES;
- gSpecialStatuses[bank].intimidatedPoke = 1;
+ gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES;
+ gSpecialStatuses[battler].intimidatedMon = 1;
}
break;
case ABILITY_FORECAST:
- effect = CastformDataTypeChange(bank);
+ effect = CastformDataTypeChange(battler);
if (effect != 0)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
*(&gBattleStruct->formToChangeInto) = effect - 1;
}
break;
case ABILITY_TRACE:
- if (!(gSpecialStatuses[bank].traced))
+ if (!(gSpecialStatuses[battler].traced))
{
- gStatuses3[bank] |= STATUS3_TRACE;
- gSpecialStatuses[bank].traced = 1;
+ gStatuses3[battler] |= STATUS3_TRACE;
+ gSpecialStatuses[battler].traced = 1;
}
break;
case ABILITY_CLOUD_NINE:
case ABILITY_AIR_LOCK:
{
- // that's a weird choice for a variable, why not use i or bank?
- for (target1 = 0; target1 < gNoOfAllBanks; target1++)
+ // that's a weird choice for a variable, why not use i or battler?
+ for (target1 = 0; target1 < gBattlersCount; target1++)
{
effect = CastformDataTypeChange(target1);
if (effect != 0)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
- gBattleScripting.bank = target1;
+ gBattleScripting.battler = target1;
*(&gBattleStruct->formToChangeInto) = effect - 1;
break;
}
@@ -2034,18 +1936,18 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_ENDTURN: // 1
- if (gBattleMons[bank].hp != 0)
+ if (gBattleMons[battler].hp != 0)
{
- gBankAttacker = bank;
+ gBattlerAttacker = battler;
switch (gLastUsedAbility)
{
case ABILITY_RAIN_DISH:
if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY)
- && gBattleMons[bank].maxHP > gBattleMons[bank].hp)
+ && gBattleMons[battler].maxHP > gBattleMons[battler].hp)
{
gLastUsedAbility = ABILITY_RAIN_DISH; // why
BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates);
- gBattleMoveDamage = gBattleMons[bank].maxHP / 16;
+ gBattleMoveDamage = gBattleMons[battler].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
@@ -2053,40 +1955,40 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_SHED_SKIN:
- if ((gBattleMons[bank].status1 & STATUS_ANY) && (Random() % 3) == 0)
+ if ((gBattleMons[battler].status1 & STATUS1_ANY) && (Random() % 3) == 0)
{
- if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON))
+ if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON))
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
+ if (gBattleMons[battler].status1 & STATUS1_SLEEP)
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
- if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
+ if (gBattleMons[battler].status1 & STATUS1_PARALYSIS)
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
- if (gBattleMons[bank].status1 & STATUS_BURN)
+ if (gBattleMons[battler].status1 & STATUS1_BURN)
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
- if (gBattleMons[bank].status1 & STATUS_FREEZE)
+ if (gBattleMons[battler].status1 & STATUS1_FREEZE)
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
- gBattleMons[bank].status1 = 0;
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); // fix nightmare glitch
- gBattleScripting.bank = gActiveBank = bank;
+ gBattleMons[battler].status1 = 0;
+ gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); // fix nightmare glitch
+ gBattleScripting.battler = gActiveBattler = battler;
BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates);
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
effect++;
}
break;
case ABILITY_SPEED_BOOST:
- if (gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC && gDisableStructs[bank].isFirstTurn != 2)
+ if (gBattleMons[battler].statStages[STAT_SPEED] < 0xC && gDisableStructs[battler].isFirstTurn != 2)
{
- gBattleMons[bank].statStages[STAT_STAGE_SPEED]++;
+ gBattleMons[battler].statStages[STAT_SPEED]++;
gBattleScripting.animArg1 = 0x11;
gBattleScripting.animArg2 = 0;
BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates);
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
effect++;
}
break;
case ABILITY_TRUANT:
- gDisableStructs[gBankAttacker].truantCounter ^= 1;
+ gDisableStructs[gBattlerAttacker].truantCounter ^= 1;
break;
}
}
@@ -2101,7 +2003,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
if (sSoundMovesTable[i] != 0xFFFF)
{
- if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS)
+ if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)
gHitMarker |= HITMARKER_NO_PPDEDUCT;
gBattlescriptCurrInstr = BattleScript_SoundproofProtected;
effect = 1;
@@ -2116,7 +2018,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
case ABILITY_VOLT_ABSORB:
if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0)
{
- if (gProtectStructs[gBankAttacker].notFirstStrike)
+ if (gProtectStructs[gBattlerAttacker].notFirstStrike)
gBattlescriptCurrInstr = BattleScript_MoveHPDrain;
else
gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;
@@ -2127,7 +2029,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
case ABILITY_WATER_ABSORB:
if (moveType == TYPE_WATER && gBattleMoves[move].power != 0)
{
- if (gProtectStructs[gBankAttacker].notFirstStrike)
+ if (gProtectStructs[gBattlerAttacker].notFirstStrike)
gBattlescriptCurrInstr = BattleScript_MoveHPDrain;
else
gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;
@@ -2136,23 +2038,23 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_FLASH_FIRE:
- if (moveType == TYPE_FIRE && !(gBattleMons[bank].status1 & STATUS_FREEZE))
+ if (moveType == TYPE_FIRE && !(gBattleMons[battler].status1 & STATUS1_FREEZE))
{
- if (!(gBattleResources->flags->flags[bank] & UNKNOWN_FLAG_FLASH_FIRE))
+ if (!(gBattleResources->flags->flags[battler] & UNKNOWN_FLAG_FLASH_FIRE))
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- if (gProtectStructs[gBankAttacker].notFirstStrike)
+ if (gProtectStructs[gBattlerAttacker].notFirstStrike)
gBattlescriptCurrInstr = BattleScript_FlashFireBoost;
else
gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;
- gBattleResources->flags->flags[bank] |= UNKNOWN_FLAG_FLASH_FIRE;
+ gBattleResources->flags->flags[battler] |= UNKNOWN_FLAG_FLASH_FIRE;
effect = 2;
}
else
{
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- if (gProtectStructs[gBankAttacker].notFirstStrike)
+ if (gProtectStructs[gBattlerAttacker].notFirstStrike)
gBattlescriptCurrInstr = BattleScript_FlashFireBoost;
else
gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;
@@ -2164,16 +2066,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
if (effect == 1)
{
- if (gBattleMons[bank].maxHP == gBattleMons[bank].hp)
+ if (gBattleMons[battler].maxHP == gBattleMons[battler].hp)
{
- if ((gProtectStructs[gBankAttacker].notFirstStrike))
- gBattlescriptCurrInstr = gUnknown_082DB592;
+ if ((gProtectStructs[gBattlerAttacker].notFirstStrike))
+ gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless;
else
- gBattlescriptCurrInstr = gUnknown_082DB591;
+ gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss;
}
else
{
- gBattleMoveDamage = gBattleMons[bank].maxHP / 4;
+ gBattleMoveDamage = gBattleMons[battler].maxHP / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
@@ -2185,30 +2087,28 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
switch (gLastUsedAbility)
{
case ABILITY_COLOR_CHANGE:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
&& move != MOVE_STRUGGLE
&& gBattleMoves[move].power != 0
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && gBattleMons[bank].type1 != moveType
- && gBattleMons[bank].type2 != moveType
- && gBattleMons[bank].hp != 0)
- {
- gBattleMons[bank].type1 = moveType;
- gBattleMons[bank].type2 = moveType;
- PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType)
+ && TARGET_TURN_DAMAGED
+ && !IS_BATTLER_OF_TYPE(battler, moveType)
+ && gBattleMons[battler].hp != 0)
+ {
+ SET_BATTLER_TYPE(battler, moveType);
+ PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ColorChangeActivates;
effect++;
}
break;
case ABILITY_ROUGH_SKIN:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && gBattleMons[gBattlerAttacker].hp != 0
+ && !gProtectStructs[gBattlerAttacker].confusionSelfDmg
+ && TARGET_TURN_DAMAGED
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
{
- gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16;
+ gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptPushCursor();
@@ -2217,10 +2117,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_EFFECT_SPORE:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && gBattleMons[gBattlerAttacker].hp != 0
+ && !gProtectStructs[gBattlerAttacker].confusionSelfDmg
+ && TARGET_TURN_DAMAGED
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
&& (Random() % 10) == 0)
{
@@ -2240,10 +2140,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_POISON_POINT:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && gBattleMons[gBattlerAttacker].hp != 0
+ && !gProtectStructs[gBattlerAttacker].confusionSelfDmg
+ && TARGET_TURN_DAMAGED
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
&& (Random() % 3) == 0)
{
@@ -2255,10 +2155,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_STATIC:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && gBattleMons[gBattlerAttacker].hp != 0
+ && !gProtectStructs[gBattlerAttacker].confusionSelfDmg
+ && TARGET_TURN_DAMAGED
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
&& (Random() % 3) == 0)
{
@@ -2270,11 +2170,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_FLAME_BODY:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && gBattleMons[gBattlerAttacker].hp != 0
+ && !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && TARGET_TURN_DAMAGED
&& (Random() % 3) == 0)
{
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN;
@@ -2285,20 +2185,20 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_CUTE_CHARM:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && gBattleMons[gBattlerAttacker].hp != 0
+ && !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && gBattleMons[gBankTarget].hp != 0
+ && TARGET_TURN_DAMAGED
+ && gBattleMons[gBattlerTarget].hp != 0
&& (Random() % 3) == 0
- && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS
+ && gBattleMons[gBattlerAttacker].ability != ABILITY_OBLIVIOUS
&& GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef)
- && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION)
+ && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION)
&& GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != MON_GENDERLESS
&& GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != MON_GENDERLESS)
{
- gBattleMons[gBankAttacker].status2 |= STATUS2_INFATUATED_WITH(gBankTarget);
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_CuteCharmActivates;
effect++;
@@ -2307,99 +2207,97 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_IMMUNITY: // 5
+ for (battler = 0; battler < gBattlersCount; battler++)
{
- for (bank = 0; bank < gNoOfAllBanks; bank++)
+ switch (gBattleMons[battler].ability)
{
- switch (gBattleMons[bank].ability)
+ case ABILITY_IMMUNITY:
+ if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER))
{
- case ABILITY_IMMUNITY:
- if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | STATUS_TOXIC_COUNTER))
- {
- StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
- effect = 1;
- }
- break;
- case ABILITY_OWN_TEMPO:
- if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
- {
- StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
- effect = 2;
- }
- break;
- case ABILITY_LIMBER:
- if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
- {
- StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
- effect = 1;
- }
- break;
- case ABILITY_INSOMNIA:
- case ABILITY_VITAL_SPIRIT:
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
- {
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
- StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
- effect = 1;
- }
- break;
- case ABILITY_WATER_VEIL:
- if (gBattleMons[bank].status1 & STATUS_BURN)
- {
- StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
- effect = 1;
- }
+ StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_OWN_TEMPO:
+ if (gBattleMons[battler].status2 & STATUS2_CONFUSION)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
+ effect = 2;
+ }
+ break;
+ case ABILITY_LIMBER:
+ if (gBattleMons[battler].status1 & STATUS1_PARALYSIS)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_INSOMNIA:
+ case ABILITY_VITAL_SPIRIT:
+ if (gBattleMons[battler].status1 & STATUS1_SLEEP)
+ {
+ gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE);
+ StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_WATER_VEIL:
+ if (gBattleMons[battler].status1 & STATUS1_BURN)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_MAGMA_ARMOR:
+ if (gBattleMons[battler].status1 & STATUS1_FREEZE)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
+ effect = 1;
+ }
+ break;
+ case ABILITY_OBLIVIOUS:
+ if (gBattleMons[battler].status2 & STATUS2_INFATUATION)
+ {
+ StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
+ effect = 3;
+ }
+ break;
+ }
+ if (effect)
+ {
+ switch (effect)
+ {
+ case 1: // status cleared
+ gBattleMons[battler].status1 = 0;
break;
- case ABILITY_MAGMA_ARMOR:
- if (gBattleMons[bank].status1 & STATUS_FREEZE)
- {
- StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
- effect = 1;
- }
+ case 2: // get rid of confusion
+ gBattleMons[battler].status2 &= ~(STATUS2_CONFUSION);
break;
- case ABILITY_OBLIVIOUS:
- if (gBattleMons[bank].status2 & STATUS2_INFATUATION)
- {
- StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
- effect = 3;
- }
+ case 3: // get rid of infatuation
+ gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION);
break;
}
- if (effect)
- {
- switch (effect)
- {
- case 1: // status cleared
- gBattleMons[bank].status1 = 0;
- break;
- case 2: // get rid of confusion
- gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
- break;
- case 3: // get rid of infatuation
- gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION);
- break;
- }
- BattleScriptPushCursor();
- gBattlescriptCurrInstr = gUnknown_082DB68C;
- gBattleScripting.bank = bank;
- gActiveBank = bank;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
- return effect;
- }
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus;
+ gBattleScripting.battler = battler;
+ gActiveBattler = battler;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
+ return effect;
}
}
break;
case ABILITYEFFECT_FORECAST: // 6
- for (bank = 0; bank < gNoOfAllBanks; bank++)
+ for (battler = 0; battler < gBattlersCount; battler++)
{
- if (gBattleMons[bank].ability == ABILITY_FORECAST)
+ if (gBattleMons[battler].ability == ABILITY_FORECAST)
{
- effect = CastformDataTypeChange(bank);
+ effect = CastformDataTypeChange(battler);
if (effect)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
- gBattleScripting.bank = bank;
+ gBattleScripting.battler = battler;
*(&gBattleStruct->formToChangeInto) = effect - 1;
return effect;
}
@@ -2415,7 +2313,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER;
- gBattleScripting.bank = gBankTarget;
+ gBattleScripting.battler = gBattlerTarget;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SynchronizeActivates;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
@@ -2431,7 +2329,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect;
- gBattleScripting.bank = gBankAttacker;
+ gBattleScripting.battler = gBattlerAttacker;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SynchronizeActivates;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
@@ -2439,56 +2337,56 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_INTIMIDATE1: // 9
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES)
{
gLastUsedAbility = ABILITY_INTIMIDATE;
gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
- BattleScriptPushCursorAndCallback(gUnknown_082DB4B8);
- gBattleStruct->intimidateBank = i;
+ BattleScriptPushCursorAndCallback(BattleScript_82DB4B8);
+ gBattleStruct->intimidateBattler = i;
effect++;
break;
}
}
break;
case ABILITYEFFECT_TRACE: // 11
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE))
{
u8 target2;
- side = (GetBankIdentity(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon
- target1 = GetBankByIdentity(side);
- target2 = GetBankByIdentity(side + BIT_MON);
+ side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon
+ target1 = GetBattlerAtPosition(side);
+ target2 = GetBattlerAtPosition(side + BIT_FLANK);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0
&& gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0)
{
- gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side);
- gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
- gLastUsedAbility = gBattleMons[gActiveBank].ability;
+ gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side);
+ gBattleMons[i].ability = gBattleMons[gActiveBattler].ability;
+ gLastUsedAbility = gBattleMons[gActiveBattler].ability;
effect++;
}
else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0)
{
- gActiveBank = target1;
- gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
- gLastUsedAbility = gBattleMons[gActiveBank].ability;
+ gActiveBattler = target1;
+ gBattleMons[i].ability = gBattleMons[gActiveBattler].ability;
+ gLastUsedAbility = gBattleMons[gActiveBattler].ability;
effect++;
}
else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0)
{
- gActiveBank = target2;
- gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
- gLastUsedAbility = gBattleMons[gActiveBank].ability;
+ gActiveBattler = target2;
+ gBattleMons[i].ability = gBattleMons[gActiveBattler].ability;
+ gLastUsedAbility = gBattleMons[gActiveBattler].ability;
effect++;
}
}
else
{
- gActiveBank = target1;
+ gActiveBattler = target1;
if (gBattleMons[target1].ability && gBattleMons[target1].hp)
{
gBattleMons[i].ability = gBattleMons[target1].ability;
@@ -2500,9 +2398,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
BattleScriptPushCursorAndCallback(BattleScript_TraceActivates);
gStatuses3[i] &= ~(STATUS3_TRACE);
- gBattleScripting.bank = i;
+ gBattleScripting.battler = i;
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBank, gBattlePartyID[gActiveBank])
+ PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler])
PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility)
break;
}
@@ -2510,36 +2408,36 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_INTIMIDATE2: // 10
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES))
{
gLastUsedAbility = ABILITY_INTIMIDATE;
gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
BattleScriptPushCursor();
- gBattlescriptCurrInstr = gUnknown_082DB4C1;
- gBattleStruct->intimidateBank = i;
+ gBattlescriptCurrInstr = BattleScript_82DB4C1;
+ gBattleStruct->intimidateBattler = i;
effect++;
break;
}
}
break;
case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12
- side = GetBankSide(bank);
- for (i = 0; i < gNoOfAllBanks; i++)
+ side = GetBattlerSide(battler);
+ for (i = 0; i < gBattlersCount; i++)
{
- if (GetBankSide(i) != side && gBattleMons[i].ability == ability)
+ if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability)
{
gLastUsedAbility = ability;
effect = i + 1;
}
}
break;
- case ABILITYEFFECT_CHECK_BANK_SIDE: // 13
- side = GetBankSide(bank);
- for (i = 0; i < gNoOfAllBanks; i++)
+ case ABILITYEFFECT_CHECK_BATTLER_SIDE: // 13
+ side = GetBattlerSide(battler);
+ for (i = 0; i < gBattlersCount; i++)
{
- if (GetBankSide(i) == side && gBattleMons[i].ability == ability)
+ if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability)
{
gLastUsedAbility = ability;
effect = i + 1;
@@ -2550,21 +2448,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
switch (gLastUsedAbility)
{
case 0xFD:
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gStatuses3[i] & STATUS3_MUDSPORT)
effect = i + 1;
}
break;
case 0xFE:
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gStatuses3[i] & STATUS3_WATERSPORT)
effect = i + 1;
}
break;
default:
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gBattleMons[i].ability == ability)
{
@@ -2576,7 +2474,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_CHECK_ON_FIELD: // 19
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0)
{
@@ -2585,10 +2483,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
}
break;
- case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15
- for (i = 0; i < gNoOfAllBanks; i++)
+ case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER: // 15
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gBattleMons[i].ability == ability && i != bank)
+ if (gBattleMons[i].ability == ability && i != battler)
{
gLastUsedAbility = ability;
effect = i + 1;
@@ -2596,21 +2494,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_COUNT_OTHER_SIDE: // 16
- side = GetBankSide(bank);
- for (i = 0; i < gNoOfAllBanks; i++)
+ side = GetBattlerSide(battler);
+ for (i = 0; i < gBattlersCount; i++)
{
- if (GetBankSide(i) != side && gBattleMons[i].ability == ability)
+ if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability)
{
gLastUsedAbility = ability;
effect++;
}
}
break;
- case ABILITYEFFECT_COUNT_BANK_SIDE: // 17
- side = GetBankSide(bank);
- for (i = 0; i < gNoOfAllBanks; i++)
+ case ABILITYEFFECT_COUNT_BATTLER_SIDE: // 17
+ side = GetBattlerSide(battler);
+ for (i = 0; i < gBattlersCount; i++)
{
- if (GetBankSide(i) == side && gBattleMons[i].ability == ability)
+ if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability)
{
gLastUsedAbility = ability;
effect++;
@@ -2618,9 +2516,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_COUNT_ON_FIELD: // 18
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
- if (gBattleMons[i].ability == ability && i != bank)
+ if (gBattleMons[i].ability == ability && i != battler)
{
gLastUsedAbility = ability;
effect++;
@@ -2630,25 +2528,25 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF)
- RecordAbilityBattle(bank, gLastUsedAbility);
+ RecordAbilityBattle(battler, gLastUsedAbility);
}
return effect;
}
-void BattleScriptExecute(const u8* BS_ptr)
+void BattleScriptExecute(const u8 *BS_ptr)
{
gBattlescriptCurrInstr = BS_ptr;
- BATTLE_CALLBACKS_STACK->function[BATTLE_CALLBACKS_STACK->size++] = gBattleMainFunc;
+ gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc;
gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack;
gCurrentActionFuncId = 0;
}
-void BattleScriptPushCursorAndCallback(const u8* BS_ptr)
+void BattleScriptPushCursorAndCallback(const u8 *BS_ptr)
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BS_ptr;
- BATTLE_CALLBACKS_STACK->function[BATTLE_CALLBACKS_STACK->size++] = gBattleMainFunc;
+ gBattleResources->battleCallbackStack->function[gBattleResources->battleCallbackStack->size++] = gBattleMainFunc;
gBattleMainFunc = RunBattleScriptCommands;
}
@@ -2662,100 +2560,91 @@ enum
ITEM_STATS_CHANGE, // 5
};
-enum
-{
- FLAVOR_SPICY, // 0
- FLAVOR_DRY, // 1
- FLAVOR_SWEET, // 2
- FLAVOR_BITTER, // 3
- FLAVOR_SOUR, // 4
-};
-
-u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
+u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{
int i = 0;
u8 effect = ITEM_NO_EFFECT;
u8 changedPP = 0;
- u8 bankHoldEffect, atkHoldEffect, defHoldEffect;
- u8 bankQuality, atkQuality, defQuality;
+ u8 battlerHoldEffect, atkHoldEffect, defHoldEffect;
+ u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam;
u16 atkItem, defItem;
- gLastUsedItem = gBattleMons[bank].item;
+ gLastUsedItem = gBattleMons[battlerId].item;
if (gLastUsedItem == ITEM_ENIGMA_BERRY)
{
- bankHoldEffect = gEnigmaBerries[bank].holdEffect;
- bankQuality = gEnigmaBerries[bank].holdEffectParam;
+ battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect;
+ battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam;
}
else
{
- bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);
- bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem);
+ battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);
+ battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem);
}
- atkItem = gBattleMons[gBankAttacker].item;
+ atkItem = gBattleMons[gBattlerAttacker].item;
if (atkItem == ITEM_ENIGMA_BERRY)
{
- atkHoldEffect = gEnigmaBerries[gBankAttacker].holdEffect;
- atkQuality = gEnigmaBerries[gBankAttacker].holdEffectParam;
+ atkHoldEffect = gEnigmaBerries[gBattlerAttacker].holdEffect;
+ atkHoldEffectParam = gEnigmaBerries[gBattlerAttacker].holdEffectParam;
}
else
{
atkHoldEffect = ItemId_GetHoldEffect(atkItem);
- atkQuality = ItemId_GetHoldEffectParam(atkItem);
+ atkHoldEffectParam = ItemId_GetHoldEffectParam(atkItem);
}
// def variables are unused
- defItem = gBattleMons[gBankTarget].item;
+ defItem = gBattleMons[gBattlerTarget].item;
if (defItem == ITEM_ENIGMA_BERRY)
{
- defHoldEffect = gEnigmaBerries[gBankTarget].holdEffect;
- defQuality = gEnigmaBerries[gBankTarget].holdEffectParam;
+ defHoldEffect = gEnigmaBerries[gBattlerTarget].holdEffect;
+ defHoldEffectParam = gEnigmaBerries[gBattlerTarget].holdEffectParam;
}
else
{
defHoldEffect = ItemId_GetHoldEffect(defItem);
- defQuality = ItemId_GetHoldEffectParam(defItem);
+ defHoldEffectParam = ItemId_GetHoldEffectParam(defItem);
}
switch (caseID)
{
case ITEMEFFECT_ON_SWITCH_IN:
- switch (bankHoldEffect)
+ switch (battlerHoldEffect)
{
case HOLD_EFFECT_DOUBLE_PRIZE:
- if (GetBankSide(bank) == SIDE_PLAYER)
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
gBattleStruct->moneyMultiplier = 2;
break;
case HOLD_EFFECT_RESTORE_STATS:
- for (i = 0; i < 8; i++)
+ for (i = 0; i < BATTLE_STATS_NO; i++)
{
- if (gBattleMons[bank].statStages[i] < 6)
+ if (gBattleMons[battlerId].statStages[i] < 6)
{
- gBattleMons[bank].statStages[i] = 6;
+ gBattleMons[battlerId].statStages[i] = 6;
effect = ITEM_STATS_CHANGE;
}
}
if (effect)
{
- gBattleScripting.bank = bank;
- gStringBank = bank;
- gActiveBank = gBankAttacker = bank;
+ gBattleScripting.battler = battlerId;
+ gPotentialItemEffectBattler = battlerId;
+ gActiveBattler = gBattlerAttacker = battlerId;
BattleScriptExecute(BattleScript_WhiteHerbEnd2);
}
break;
}
break;
case 1:
- if (gBattleMons[bank].hp)
+ if (gBattleMons[battlerId].hp)
{
- switch (bankHoldEffect)
+ switch (battlerHoldEffect)
{
case HOLD_EFFECT_RESTORE_HP:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
{
- gBattleMoveDamage = bankQuality;
- if (gBattleMons[bank].hp + bankQuality > gBattleMons[bank].maxHP)
- gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
+ gBattleMoveDamage = battlerHoldEffectParam;
+ if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP)
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
effect = 4;
@@ -2764,87 +2653,83 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
case HOLD_EFFECT_RESTORE_PP:
if (!moveTurn)
{
- struct Pokemon* poke;
+ struct Pokemon *mon;
u8 ppBonuses;
u16 move;
- if (GetBankSide(bank) == SIDE_PLAYER)
- poke = &gPlayerParty[gBattlePartyID[bank]];
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]];
else
- poke = &gEnemyParty[gBattlePartyID[bank]];
+ mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]];
for (i = 0; i < 4; i++)
{
- move = GetMonData(poke, MON_DATA_MOVE1 + i);
- changedPP = GetMonData(poke, MON_DATA_PP1 + i);
- ppBonuses = GetMonData(poke, MON_DATA_PP_BONUSES);
+ move = GetMonData(mon, MON_DATA_MOVE1 + i);
+ changedPP = GetMonData(mon, MON_DATA_PP1 + i);
+ ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
if (move && changedPP == 0)
break;
}
if (i != 4)
{
u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i);
- if (changedPP + bankQuality > maxPP)
+ if (changedPP + battlerHoldEffectParam > maxPP)
changedPP = maxPP;
else
- changedPP = changedPP + bankQuality;
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = move;
- gBattleTextBuff1[3] = move >> 8;
- gBattleTextBuff1[4] = 0xFF;
+ changedPP = changedPP + battlerHoldEffectParam;
+
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, move);
+
BattleScriptExecute(BattleScript_BerryPPHealEnd2);
- EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP);
+ MarkBattlerForControllerExec(gActiveBattler);
effect = ITEM_PP_CHANGE;
}
}
break;
case HOLD_EFFECT_RESTORE_STATS:
- for (i = 0; i < 8; i++)
+ for (i = 0; i < BATTLE_STATS_NO; i++)
{
- if (gBattleMons[bank].statStages[i] < 6)
+ if (gBattleMons[battlerId].statStages[i] < 6)
{
- gBattleMons[bank].statStages[i] = 6;
+ gBattleMons[battlerId].statStages[i] = 6;
effect = ITEM_STATS_CHANGE;
}
}
if (effect)
{
- gBattleScripting.bank = bank;
- gStringBank = bank;
- gActiveBank = gBankAttacker = bank;
+ gBattleScripting.battler = battlerId;
+ gPotentialItemEffectBattler = battlerId;
+ gActiveBattler = gBattlerAttacker = battlerId;
BattleScriptExecute(BattleScript_WhiteHerbEnd2);
}
break;
case HOLD_EFFECT_LEFTOVERS:
- if (gBattleMons[bank].hp < gBattleMons[bank].maxHP && !moveTurn)
+ if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn)
{
- gBattleMoveDamage = gBattleMons[bank].maxHP / 16;
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP)
- gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
BattleScriptExecute(BattleScript_ItemHealHP_End2);
effect = ITEM_HP_CHANGE;
- RecordItemEffectBattle(bank, bankHoldEffect);
+ RecordItemEffectBattle(battlerId, battlerHoldEffect);
}
break;
// nice copy/paste there gamefreak, making a function for confuse berries was too much eh?
case HOLD_EFFECT_CONFUSE_SPICY:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 8;
- gBattleTextBuff1[2] = FLAVOR_SPICY;
- gBattleTextBuff1[3] = EOS;
- gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality;
+ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY);
+
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP)
- gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
- if (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SPICY) < 0)
+ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SPICY) < 0)
BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
@@ -2852,19 +2737,17 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
break;
case HOLD_EFFECT_CONFUSE_DRY:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 8;
- gBattleTextBuff1[2] = FLAVOR_DRY;
- gBattleTextBuff1[3] = EOS;
- gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality;
+ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY);
+
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP)
- gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
- if (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_DRY) < 0)
+ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_DRY) < 0)
BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
@@ -2872,19 +2755,17 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
break;
case HOLD_EFFECT_CONFUSE_SWEET:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 8;
- gBattleTextBuff1[2] = FLAVOR_SWEET;
- gBattleTextBuff1[3] = EOS;
- gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality;
+ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET);
+
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP)
- gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
- if (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SWEET) < 0)
+ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SWEET) < 0)
BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
@@ -2892,19 +2773,17 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
break;
case HOLD_EFFECT_CONFUSE_BITTER:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 8;
- gBattleTextBuff1[2] = FLAVOR_BITTER;
- gBattleTextBuff1[3] = EOS;
- gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality;
+ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER);
+
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP)
- gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
- if (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_BITTER) < 0)
+ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_BITTER) < 0)
BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
@@ -2912,19 +2791,17 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
break;
case HOLD_EFFECT_CONFUSE_SOUR:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / 2 && !moveTurn)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 8;
- gBattleTextBuff1[2] = FLAVOR_SOUR;
- gBattleTextBuff1[3] = EOS;
- gBattleMoveDamage = gBattleMons[bank].maxHP / bankQuality;
+ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR);
+
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP)
- gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
- if (GetFlavourRelationByPersonality(gBattleMons[bank].personality, FLAVOR_SOUR) < 0)
+ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SOUR) < 0)
BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
@@ -2933,105 +2810,85 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
break;
// copy/paste again, smh
case HOLD_EFFECT_ATTACK_UP:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_ATK] < 0xC)
- {
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 5;
- gBattleTextBuff1[2] = STAT_STAGE_ATK;
- gBattleTextBuff1[3] = EOS;
-
- gBattleTextBuff2[0] = 0xFD;
- gBattleTextBuff2[1] = 0;
- gBattleTextBuff2[2] = 0xD2;
- gBattleTextBuff2[3] = 0xD2 >> 8;
- gBattleTextBuff2[4] = EOS;
-
- gEffectBank = bank;
- gBattleScripting.statChanger = 0x10 + STAT_STAGE_ATK;
- gBattleScripting.animArg1 = 0xE + STAT_STAGE_ATK;
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC)
+ {
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
+ PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE);
+
+ gEffectBattler = battlerId;
+ SET_STATCHANGER(STAT_ATK, 1, FALSE);
+ gBattleScripting.animArg1 = 0xE + STAT_ATK;
gBattleScripting.animArg2 = 0;
BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
case HOLD_EFFECT_DEFENSE_UP:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_DEF] < 0xC)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 5;
- gBattleTextBuff1[2] = STAT_STAGE_DEF;
- gBattleTextBuff1[3] = EOS;
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF);
- gEffectBank = bank;
- gBattleScripting.statChanger = 0x10 + STAT_STAGE_DEF;
- gBattleScripting.animArg1 = 0xE + STAT_STAGE_DEF;
+ gEffectBattler = battlerId;
+ SET_STATCHANGER(STAT_DEF, 1, FALSE);
+ gBattleScripting.animArg1 = 0xE + STAT_DEF;
gBattleScripting.animArg2 = 0;
BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
case HOLD_EFFECT_SPEED_UP:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 5;
- gBattleTextBuff1[2] = STAT_STAGE_SPEED;
- gBattleTextBuff1[3] = EOS;
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED);
- gEffectBank = bank;
- gBattleScripting.statChanger = 0x10 + STAT_STAGE_SPEED;
- gBattleScripting.animArg1 = 0xE + STAT_STAGE_SPEED;
+ gEffectBattler = battlerId;
+ SET_STATCHANGER(STAT_SPEED, 1, FALSE);
+ gBattleScripting.animArg1 = 0xE + STAT_SPEED;
gBattleScripting.animArg2 = 0;
BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
case HOLD_EFFECT_SP_ATTACK_UP:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPATK] < 0xC)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 5;
- gBattleTextBuff1[2] = STAT_STAGE_SPATK;
- gBattleTextBuff1[3] = EOS;
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK);
- gEffectBank = bank;
- gBattleScripting.statChanger = 0x10 + STAT_STAGE_SPATK;
- gBattleScripting.animArg1 = 0xE + STAT_STAGE_SPATK;
+ gEffectBattler = battlerId;
+ SET_STATCHANGER(STAT_SPATK, 1, FALSE);
+ gBattleScripting.animArg1 = 0xE + STAT_SPATK;
gBattleScripting.animArg2 = 0;
BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
case HOLD_EFFECT_SP_DEFENSE_UP:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && gBattleMons[bank].statStages[STAT_STAGE_SPDEF] < 0xC)
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC)
{
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 5;
- gBattleTextBuff1[2] = STAT_STAGE_SPDEF;
- gBattleTextBuff1[3] = EOS;
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF);
- gEffectBank = bank;
- gBattleScripting.statChanger = 0x10 + STAT_STAGE_SPDEF;
- gBattleScripting.animArg1 = 0xE + STAT_STAGE_SPDEF;
+ gEffectBattler = battlerId;
+ SET_STATCHANGER(STAT_SPDEF, 1, FALSE);
+ gBattleScripting.animArg1 = 0xE + STAT_SPDEF;
gBattleScripting.animArg2 = 0;
BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
case HOLD_EFFECT_CRITICAL_UP:
- if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && !(gBattleMons[bank].status2 & STATUS2_FOCUS_ENERGY))
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY))
{
- gBattleMons[bank].status2 |= STATUS2_FOCUS_ENERGY;
+ gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY;
BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2);
effect = ITEM_EFFECT_OTHER;
}
break;
case HOLD_EFFECT_RANDOM_STAT_UP:
- if (!moveTurn && gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality)
+ if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam)
{
for (i = 0; i < 5; i++)
{
- if (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] < 0xC)
+ if (gBattleMons[battlerId].statStages[STAT_ATK + i] < 0xC)
break;
}
if (i != 5)
@@ -3039,24 +2896,21 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
do
{
i = Random() % 5;
- } while (gBattleMons[bank].statStages[STAT_STAGE_ATK + i] == 0xC);
-
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 5;
- gBattleTextBuff1[2] = i + 1;
- gBattleTextBuff1[3] = EOS;
-
- gBattleTextBuff2[0] = 0xFD;
- gBattleTextBuff2[1] = 0;
- gBattleTextBuff2[2] = 0xD1;
- gBattleTextBuff2[3] = 0xD1 >> 8;
- gBattleTextBuff2[4] = 0;
- gBattleTextBuff2[5] = 0xD2;
- gBattleTextBuff2[6] = 0xD2 >> 8;
+ } while (gBattleMons[battlerId].statStages[STAT_ATK + i] == 0xC);
+
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1);
+
+ gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN;
+ gBattleTextBuff2[1] = B_BUFF_STRING;
+ gBattleTextBuff2[2] = STRINGID_STATSHARPLY;
+ gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8;
+ gBattleTextBuff2[4] = B_BUFF_STRING;
+ gBattleTextBuff2[5] = STRINGID_STATROSE;
+ gBattleTextBuff2[6] = STRINGID_STATROSE >> 8;
gBattleTextBuff2[7] = EOS;
- gEffectBank = bank;
- gBattleScripting.statChanger = 0x21 + i;
+ gEffectBattler = battlerId;
+ SET_STATCHANGER(i + 1, 2, FALSE);
gBattleScripting.animArg1 = 0x21 + i + 6;
gBattleScripting.animArg2 = 0;
BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
@@ -3065,85 +2919,85 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
break;
case HOLD_EFFECT_CURE_PAR:
- if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
+ if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
- gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS);
BattleScriptExecute(BattleScript_BerryCurePrlzEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_PSN:
- if (gBattleMons[bank].status1 & STATUS_PSN_ANY)
+ if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
{
- gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER);
BattleScriptExecute(BattleScript_BerryCurePsnEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_BRN:
- if (gBattleMons[bank].status1 & STATUS_BURN)
+ if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
- gBattleMons[bank].status1 &= ~(STATUS_BURN);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_BURN);
BattleScriptExecute(BattleScript_BerryCureBrnEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_FRZ:
- if (gBattleMons[bank].status1 & STATUS_FREEZE)
+ if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
- gBattleMons[bank].status1 &= ~(STATUS_FREEZE);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
BattleScriptExecute(BattleScript_BerryCureFrzEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_SLP:
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
+ if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptExecute(BattleScript_BerryCureSlpEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_CONFUSION:
- if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
- gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
BattleScriptExecute(BattleScript_BerryCureConfusionEnd2);
effect = ITEM_EFFECT_OTHER;
}
break;
case HOLD_EFFECT_CURE_STATUS:
- if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
i = 0;
- if (gBattleMons[bank].status1 & STATUS_PSN_ANY)
+ if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
i++;
}
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
+ if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
i++;
}
- if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
+ if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
i++;
}
- if (gBattleMons[bank].status1 & STATUS_BURN)
+ if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
i++;
}
- if (gBattleMons[bank].status1 & STATUS_FREEZE)
+ if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
i++;
}
- if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
i++;
@@ -3152,16 +3006,16 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- gBattleMons[bank].status1 = 0;
- gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status1 = 0;
+ gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_ATTRACT:
- if (gBattleMons[bank].status2 & STATUS2_INFATUATION)
+ if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
{
- gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION);
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
@@ -3171,18 +3025,18 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
if (effect)
{
- gBattleScripting.bank = bank;
- gStringBank = bank;
- gActiveBank = gBankAttacker = bank;
+ gBattleScripting.battler = battlerId;
+ gPotentialItemEffectBattler = battlerId;
+ gActiveBattler = gBattlerAttacker = battlerId;
switch (effect)
{
case ITEM_STATUS_CHANGE:
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
case ITEM_PP_CHANGE:
- if (!(gBattleMons[bank].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[bank].unk18_b & gBitTable[i]))
- gBattleMons[bank].pp[i] = changedPP;
+ if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[battlerId].unk18_b & gBitTable[i]))
+ gBattleMons[battlerId].pp[i] = changedPP;
break;
}
}
@@ -3191,80 +3045,80 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
case 2:
break;
case 3:
- for (bank = 0; bank < gNoOfAllBanks; bank++)
+ for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
{
- gLastUsedItem = gBattleMons[bank].item;
- if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY)
+ gLastUsedItem = gBattleMons[battlerId].item;
+ if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY)
{
- bankHoldEffect = gEnigmaBerries[bank].holdEffect;
- bankQuality = gEnigmaBerries[bank].holdEffectParam;
+ battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect;
+ battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam;
}
else
{
- bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);
- bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem);
+ battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem);
+ battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem);
}
- switch (bankHoldEffect)
+ switch (battlerHoldEffect)
{
case HOLD_EFFECT_CURE_PAR:
- if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
+ if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
- gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureParRet;
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_PSN:
- if (gBattleMons[bank].status1 & STATUS_PSN_ANY)
+ if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
{
- gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet;
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_BRN:
- if (gBattleMons[bank].status1 & STATUS_BURN)
+ if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
- gBattleMons[bank].status1 &= ~(STATUS_BURN);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_BURN);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet;
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_FRZ:
- if (gBattleMons[bank].status1 & STATUS_FREEZE)
+ if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
- gBattleMons[bank].status1 &= ~(STATUS_FREEZE);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet;
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_SLP:
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
+ if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet;
effect = ITEM_STATUS_CHANGE;
}
break;
case HOLD_EFFECT_CURE_CONFUSION:
- if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
- gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet;
effect = ITEM_EFFECT_OTHER;
}
break;
case HOLD_EFFECT_CURE_ATTRACT:
- if (gBattleMons[bank].status2 & STATUS2_INFATUATION)
+ if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
{
- gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION);
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
@@ -3273,35 +3127,35 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
break;
case HOLD_EFFECT_CURE_STATUS:
- if (gBattleMons[bank].status1 & STATUS_ANY || gBattleMons[bank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
- if (gBattleMons[bank].status1 & STATUS_PSN_ANY)
+ if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
}
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
+ if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
}
- if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
+ if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
}
- if (gBattleMons[bank].status1 & STATUS_BURN)
+ if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
}
- if (gBattleMons[bank].status1 & STATUS_FREEZE)
+ if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
}
- if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
}
- gBattleMons[bank].status1 = 0;
- gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status1 = 0;
+ gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;
@@ -3309,18 +3163,18 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
break;
case HOLD_EFFECT_RESTORE_STATS:
- for (i = 0; i < 8; i++)
+ for (i = 0; i < BATTLE_STATS_NO; i++)
{
- if (gBattleMons[bank].statStages[i] < 6)
+ if (gBattleMons[battlerId].statStages[i] < 6)
{
- gBattleMons[bank].statStages[i] = 6;
+ gBattleMons[battlerId].statStages[i] = 6;
effect = ITEM_STATS_CHANGE;
}
}
if (effect)
{
- gBattleScripting.bank = bank;
- gStringBank = bank;
+ gBattleScripting.battler = battlerId;
+ gPotentialItemEffectBattler = battlerId;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WhiteHerbRet;
return effect; // unnecessary return
@@ -3329,11 +3183,11 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
if (effect)
{
- gBattleScripting.bank = bank;
- gStringBank = bank;
- gActiveBank = bank;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gBattleScripting.battler = battlerId;
+ gPotentialItemEffectBattler = battlerId;
+ gActiveBattler = battlerId;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
break;
}
}
@@ -3344,33 +3198,33 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
switch (atkHoldEffect)
{
case HOLD_EFFECT_FLINCH:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && (Random() % 100) < atkQuality
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && TARGET_TURN_DAMAGED
+ && (Random() % 100) < atkHoldEffectParam
&& gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED
- && gBattleMons[gBankTarget].hp)
+ && gBattleMons[gBattlerTarget].hp)
{
- gBattleCommunication[MOVE_EFFECT_BYTE] = 8;
+ gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH;
BattleScriptPushCursor();
SetMoveEffect(0, 0);
BattleScriptPop();
}
break;
case HOLD_EFFECT_SHELL_BELL:
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gSpecialStatuses[gBankTarget].moveturnLostHP != 0
- && gSpecialStatuses[gBankTarget].moveturnLostHP != 0xFFFF
- && gBankAttacker != gBankTarget
- && gBattleMons[gBankAttacker].hp != gBattleMons[gBankAttacker].maxHP
- && gBattleMons[gBankAttacker].hp != 0)
+ if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && gSpecialStatuses[gBattlerTarget].dmg != 0
+ && gSpecialStatuses[gBattlerTarget].dmg != 0xFFFF
+ && gBattlerAttacker != gBattlerTarget
+ && gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP
+ && gBattleMons[gBattlerAttacker].hp != 0)
{
gLastUsedItem = atkItem;
- gStringBank = gBankAttacker;
- gBattleScripting.bank = gBankAttacker;
- gBattleMoveDamage = (gSpecialStatuses[gBankTarget].moveturnLostHP / atkQuality) * -1;
+ gPotentialItemEffectBattler = gBattlerAttacker;
+ gBattleScripting.battler = gBattlerAttacker;
+ gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkHoldEffectParam) * -1;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = -1;
- gSpecialStatuses[gBankTarget].moveturnLostHP = 0;
+ gSpecialStatuses[gBattlerTarget].dmg = 0;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret;
effect++;
@@ -3384,50 +3238,50 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
return effect;
}
-void ClearFuryCutterDestinyBondGrudge(u8 bank)
+void ClearFuryCutterDestinyBondGrudge(u8 battlerId)
{
- gDisableStructs[bank].furyCutterCounter = 0;
- gBattleMons[bank].status2 &= ~(STATUS2_DESTINY_BOND);
- gStatuses3[bank] &= ~(STATUS3_GRUDGE);
+ gDisableStructs[battlerId].furyCutterCounter = 0;
+ gBattleMons[battlerId].status2 &= ~(STATUS2_DESTINY_BOND);
+ gStatuses3[battlerId] &= ~(STATUS3_GRUDGE);
}
void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands
{
- if (gBattleExecBuffer == 0)
+ if (gBattleControllerExecFlags == 0)
gBattleScriptingCommandsTable[*gBattlescriptCurrInstr]();
}
-u8 GetMoveTarget(u16 move, u8 useMoveTarget)
+u8 GetMoveTarget(u16 move, u8 setTarget)
{
- u8 targetBank = 0;
+ u8 targetBattler = 0;
u8 moveTarget;
u8 side;
- if (useMoveTarget)
- moveTarget = useMoveTarget - 1;
+ if (setTarget)
+ moveTarget = setTarget - 1;
else
moveTarget = gBattleMoves[move].target;
switch (moveTarget)
{
case MOVE_TARGET_SELECTED:
- side = GetBankSide(gBankAttacker) ^ 1;
+ side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;
if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)
- targetBank = gSideTimers[side].followmeTarget;
+ targetBattler = gSideTimers[side].followmeTarget;
else
{
- side = GetBankSide(gBankAttacker);
+ side = GetBattlerSide(gBattlerAttacker);
do
{
- targetBank = Random() % gNoOfAllBanks;
- } while (targetBank == gBankAttacker || side == GetBankSide(targetBank) || gAbsentBankFlags & gBitTable[targetBank]);
+ targetBattler = Random() % gBattlersCount;
+ } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || gAbsentBattlerFlags & gBitTable[targetBattler]);
if (gBattleMoves[move].type == TYPE_ELECTRIC
- && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBankAttacker, ABILITY_LIGHTNING_ROD, 0, 0)
- && gBattleMons[targetBank].ability != ABILITY_LIGHTNING_ROD)
+ && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_LIGHTNING_ROD, 0, 0)
+ && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD)
{
- targetBank ^= 2;
- RecordAbilityBattle(targetBank, gBattleMons[targetBank].ability);
- gSpecialStatuses[targetBank].lightningRodRedirected = 1;
+ targetBattler ^= BIT_FLANK;
+ RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability);
+ gSpecialStatuses[targetBattler].lightningRodRedirected = 1;
}
}
break;
@@ -3435,62 +3289,58 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget)
case MOVE_TARGET_BOTH:
case MOVE_TARGET_FOES_AND_ALLY:
case MOVE_TARGET_OPPONENTS_FIELD:
- targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1);
- if (gAbsentBankFlags & gBitTable[targetBank])
- targetBank ^= 2;
+ targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE);
+ if (gAbsentBattlerFlags & gBitTable[targetBattler])
+ targetBattler ^= BIT_FLANK;
break;
case MOVE_TARGET_RANDOM:
- side = GetBankSide(gBankAttacker) ^ 1;
+ side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE;
if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)
- targetBank = gSideTimers[side].followmeTarget;
+ targetBattler = gSideTimers[side].followmeTarget;
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & MOVE_TARGET_RANDOM)
{
- if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
{
if (Random() & 1)
- targetBank = GetBankByIdentity(1);
+ targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
else
- targetBank = GetBankByIdentity(3);
+ targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
}
else
{
if (Random() & 1)
- targetBank = GetBankByIdentity(0);
+ targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
else
- targetBank = GetBankByIdentity(2);
+ targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
}
- if (gAbsentBankFlags & gBitTable[targetBank])
- targetBank ^= 2;
+ if (gAbsentBattlerFlags & gBitTable[targetBattler])
+ targetBattler ^= BIT_FLANK;
}
else
- targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1);
+ targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE);
break;
+ case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_USER:
- case MOVE_TARGET_x10:
- targetBank = gBankAttacker;
+ targetBattler = gBattlerAttacker;
break;
}
- #ifndef NONMATCHING
- MEME_ACCESS_U8(BattleStruct, gBattleStruct, gBankAttacker, moveTarget, targetBank);
- #else
- gBattleStruct->moveTarget[gBankAttacker] = targetBank;
- #endif // NONMATCHING
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBattler;
- return targetBank;
+ return targetBattler;
}
-static bool32 HasObedientBitSet(u8 bank)
+static bool32 HasObedientBitSet(u8 battlerId)
{
- if (GetBankSide(bank) == SIDE_OPPONENT)
+ if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT)
return TRUE;
- if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS
- && GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES, NULL) != SPECIES_MEW)
+ if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS
+ && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_MEW)
return TRUE;
- return GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_OBEDIENCE, NULL);
+ return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_OBEDIENCE, NULL);
}
-u8 IsPokeDisobedient(void)
+u8 IsMonDisobedient(void)
{
s32 rnd;
s32 calc;
@@ -3498,18 +3348,18 @@ u8 IsPokeDisobedient(void)
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
return 0;
- if (GetBankSide(gBankAttacker) == SIDE_OPPONENT)
+ if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT)
return 0;
- if (HasObedientBitSet(gBankAttacker)) // only if species is Mew or Deoxys
+ if (HasObedientBitSet(gBattlerAttacker)) // only if species is Mew or Deoxys
{
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBankIdentity(gBankAttacker) == 2)
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gBattlerAttacker) == 2)
return 0;
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
return 0;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
return 0;
- if (!IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName))
+ if (!IsOtherTrainer(gBattleMons[gBattlerAttacker].otId, gBattleMons[gBattlerAttacker].otName))
return 0;
if (FlagGet(FLAG_BADGE08_GET))
return 0;
@@ -3524,27 +3374,27 @@ u8 IsPokeDisobedient(void)
obedienceLevel = 70;
}
- if (gBattleMons[gBankAttacker].level <= obedienceLevel)
+ if (gBattleMons[gBattlerAttacker].level <= obedienceLevel)
return 0;
rnd = (Random() & 255);
- calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8;
+ calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8;
if (calc < obedienceLevel)
return 0;
// is not obedient
if (gCurrentMove == MOVE_RAGE)
- gBattleMons[gBankAttacker].status2 &= ~(STATUS2_RAGE);
- if (gBattleMons[gBankAttacker].status1 & STATUS_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK))
+ gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RAGE);
+ if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK))
{
- gBattlescriptCurrInstr = gUnknown_082DB695;
+ gBattlescriptCurrInstr = BattleScript_82DB695;
return 1;
}
rnd = (Random() & 255);
- calc = (gBattleMons[gBankAttacker].level + obedienceLevel) * rnd >> 8;
+ calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8;
if (calc < obedienceLevel)
{
- calc = CheckMoveLimitations(gBankAttacker, gBitTable[gCurrMovePos], 0xFF);
+ calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], 0xFF);
if (calc == 0xF) // all moves cannot be used
{
gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3;
@@ -3555,42 +3405,42 @@ u8 IsPokeDisobedient(void)
{
do
{
- gCurrMovePos = gUnknown_020241E9 = Random() & 3;
+ gCurrMovePos = gChosenMovePos = Random() & 3;
} while (gBitTable[gCurrMovePos] & calc);
- gRandomMove = gBattleMons[gBankAttacker].moves[gCurrMovePos];
- gBattlescriptCurrInstr = gUnknown_082DB6A5;
- gBankTarget = GetMoveTarget(gRandomMove, 0);
+ gRandomMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
+ gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove;
+ gBattlerTarget = GetMoveTarget(gRandomMove, 0);
gHitMarker |= HITMARKER_x200000;
return 2;
}
}
else
{
- obedienceLevel = gBattleMons[gBankAttacker].level - obedienceLevel;
+ obedienceLevel = gBattleMons[gBattlerAttacker].level - obedienceLevel;
calc = (Random() & 255);
- if (calc < obedienceLevel && !(gBattleMons[gBankAttacker].status1 & STATUS_ANY) && gBattleMons[gBankAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBankAttacker].ability != ABILITY_INSOMNIA)
+ if (calc < obedienceLevel && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && gBattleMons[gBattlerAttacker].ability != ABILITY_VITAL_SPIRIT && gBattleMons[gBattlerAttacker].ability != ABILITY_INSOMNIA)
{
// try putting asleep
int i;
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (i = 0; i < gBattlersCount; i++)
{
if (gBattleMons[i].status2 & STATUS2_UPROAR)
break;
}
- if (i == gNoOfAllBanks)
+ if (i == gBattlersCount)
{
- gBattlescriptCurrInstr = gUnknown_082DB6D9;
+ gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep;
return 1;
}
}
calc -= obedienceLevel;
if (calc < obedienceLevel)
{
- gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankAttacker], MOVE_POUND, 0, 40, 0, gBankAttacker, gBankAttacker);
- gBankTarget = gBankAttacker;
- gBattlescriptCurrInstr = gUnknown_082DB6F0;
+ gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker);
+ gBattlerTarget = gBattlerAttacker;
+ gBattlescriptCurrInstr = BattleScript_82DB6F0;
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
return 2;
}
diff --git a/src/battle_util2.c b/src/battle_util2.c
index e119c85d7..1d2f1e95b 100644
--- a/src/battle_util2.c
+++ b/src/battle_util2.c
@@ -4,20 +4,11 @@
#include "malloc.h"
#include "pokemon.h"
#include "event_data.h"
-#include "abilities.h"
-#include "rng.h"
+#include "constants/abilities.h"
+#include "random.h"
+#include "battle_scripts.h"
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gUnknown_0203CF00[];
-extern const u8* gBattlescriptCurrInstr;
-extern u8 gBattleCommunication[];
-extern u8 gActiveBank;
-
-extern const u8 BattleScript_MoveUsedWokeUp[];
-extern const u8 BattleScript_MoveUsedIsFrozen[];
-extern const u8 BattleScript_MoveUsedUnfroze[];
-extern const u8 BattleScript_MoveUsedIsAsleep[];
extern void sub_81D55D0(void);
extern void sub_81D5694(void);
@@ -83,41 +74,41 @@ void FreeBattleResources(void)
}
}
-void AdjustFriendshipOnBattleFaint(u8 bank)
+void AdjustFriendshipOnBattleFaint(u8 battlerId)
{
- u8 opposingBank;
+ u8 opposingBattlerId;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- u8 opposingBank2;
+ u8 opposingBattlerId2;
- opposingBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- opposingBank2 = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ opposingBattlerId2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
- if (gBattleMons[opposingBank2].level > gBattleMons[opposingBank].level)
- opposingBank = opposingBank2;
+ if (gBattleMons[opposingBattlerId2].level > gBattleMons[opposingBattlerId].level)
+ opposingBattlerId = opposingBattlerId2;
}
else
{
- opposingBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
}
- if (gBattleMons[opposingBank].level > gBattleMons[bank].level)
+ if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level)
{
- if (gBattleMons[opposingBank].level - gBattleMons[bank].level > 29)
- AdjustFriendship(&gPlayerParty[gBattlePartyID[bank]], 8);
+ if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29)
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 8);
else
- AdjustFriendship(&gPlayerParty[gBattlePartyID[bank]], 6);
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
}
else
{
- AdjustFriendship(&gPlayerParty[gBattlePartyID[bank]], 6);
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
}
}
-void sub_80571DC(u8 bank, u8 arg1)
+void sub_80571DC(u8 battlerId, u8 arg1)
{
- if (GetBankSide(bank) != SIDE_OPPONENT)
+ if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT)
{
s32 i;
@@ -126,14 +117,14 @@ void sub_80571DC(u8 bank, u8 arg1)
for (i = 0; i < 3; i++)
gUnknown_0203CF00[i] = *(0 * 3 + i + (u8*)(gBattleStruct->field_60));
- sub_81B8FB0(pokemon_order_func(gBattlePartyID[bank]), pokemon_order_func(arg1));
+ sub_81B8FB0(pokemon_order_func(gBattlerPartyIndexes[battlerId]), pokemon_order_func(arg1));
for (i = 0; i < 3; i++)
*(0 * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
}
}
-u32 sub_805725C(u8 bank)
+u32 sub_805725C(u8 battlerId)
{
u32 effect = 0;
@@ -142,12 +133,12 @@ u32 sub_805725C(u8 bank)
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
+ if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- if (UproarWakeUpCheck(bank))
+ if (UproarWakeUpCheck(battlerId))
{
- gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -157,24 +148,24 @@ u32 sub_805725C(u8 bank)
{
u32 toSub;
- if (gBattleMons[bank].ability == ABILITY_EARLY_BIRD)
+ if (gBattleMons[battlerId].ability == ABILITY_EARLY_BIRD)
toSub = 2;
else
toSub = 1;
- if ((gBattleMons[bank].status1 & STATUS_SLEEP) < toSub)
- gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
+ if ((gBattleMons[battlerId].status1 & STATUS1_SLEEP) < toSub)
+ gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
else
- gBattleMons[bank].status1 -= toSub;
+ gBattleMons[battlerId].status1 -= toSub;
- if (gBattleMons[bank].status1 & STATUS_SLEEP)
+ if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep;
effect = 2;
}
else
{
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -185,7 +176,7 @@ u32 sub_805725C(u8 bank)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 1:
- if (gBattleMons[bank].status1 & STATUS_FREEZE)
+ if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
if (Random() % 5 != 0)
{
@@ -193,7 +184,7 @@ u32 sub_805725C(u8 bank)
}
else
{
- gBattleMons[bank].status1 &= ~(STATUS_FREEZE);
+ gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
@@ -210,9 +201,9 @@ u32 sub_805725C(u8 bank)
if (effect == 2)
{
- gActiveBank = bank;
- EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
- MarkBufferBankForExecution(gActiveBank);
+ gActiveBattler = battlerId;
+ BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
+ MarkBattlerForControllerExec(gActiveBattler);
}
return effect;
diff --git a/src/berry.c b/src/berry.c
index 6d1fd17a1..f8a0204c4 100644
--- a/src/berry.c
+++ b/src/berry.c
@@ -2,28 +2,22 @@
#include "berry.h"
#include "main.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "text.h"
-#include "rng.h"
+#include "random.h"
#include "event_data.h"
#include "fieldmap.h"
-extern u8 FieldObjectGetBerryTreeId(u8 mapObjectId);
+extern u8 EventObjectGetBerryTreeId(u8 eventObjectId);
extern void sub_8092EF0(u8 mapId, u8 mapNumber, u8 mapGroup);
extern void CB2_ChooseBerry(void);
-extern const u8* GetFieldObjectScriptPointerForComparison(void);
-extern bool8 sub_8092E9C(u8, u8, u8);
+extern const u8* GetEventObjectScriptPointerForComparison(void);
+extern bool8 IsBerryTreeSparkling(u8, u8, u8);
extern u16 gSpecialVar_ItemId;
extern const u8 BerryTreeScript[];
-#define BERRY_NAME_LENGTH 6
-
-#define FIRST_BERRY ITEM_CHERI_BERRY
-#define LAST_BERRY ITEM_ENIGMA_BERRY
-
-
static const u8 sBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers.");
static const u8 sBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy.");
static const u8 sBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are");
@@ -910,9 +904,9 @@ struct BerryTree *GetBerryTreeInfo(u8 id)
return &gSaveBlock1Ptr->berryTrees[id];
}
-bool32 FieldObjectInteractionWaterBerryTree(void)
+bool32 EventObjectInteractionWaterBerryTree(void)
{
- struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject));
+ struct BerryTree *tree = GetBerryTreeInfo(EventObjectGetBerryTreeId(gSelectedEventObject));
switch (tree->stage)
{
@@ -936,8 +930,8 @@ bool32 FieldObjectInteractionWaterBerryTree(void)
bool8 IsPlayerFacingPlantedBerryTree(void)
{
- if (GetFieldObjectScriptPointerForComparison() == BerryTreeScript
- && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == 0)
+ if (GetEventObjectScriptPointerForComparison() == BerryTreeScript
+ && GetStageByBerryTreeId(EventObjectGetBerryTreeId(gSelectedEventObject)) == 0)
return TRUE;
else
return FALSE;
@@ -945,10 +939,10 @@ bool8 IsPlayerFacingPlantedBerryTree(void)
bool8 TryToWaterBerryTree(void)
{
- if (GetFieldObjectScriptPointerForComparison() != BerryTreeScript)
+ if (GetEventObjectScriptPointerForComparison() != BerryTreeScript)
return FALSE;
else
- return FieldObjectInteractionWaterBerryTree();
+ return EventObjectInteractionWaterBerryTree();
}
void ClearBerryTrees(void)
@@ -1062,28 +1056,28 @@ u8 GetStageByBerryTreeId(u8 id)
u8 ItemIdToBerryType(u16 item)
{
- u16 berry = item - FIRST_BERRY;
+ u16 berry = item - FIRST_BERRY_INDEX;
- if (berry > LAST_BERRY - FIRST_BERRY)
+ if (berry > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
return 1;
else
- return item - FIRST_BERRY + 1;
+ return ITEM_TO_BERRY(item);
}
u16 BerryTypeToItemId(u16 berry)
{
u16 item = berry - 1;
- if (item > LAST_BERRY - FIRST_BERRY)
- return FIRST_BERRY;
+ if (item > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
+ return FIRST_BERRY_INDEX;
else
- return berry + FIRST_BERRY - 1;
+ return berry + FIRST_BERRY_INDEX - 1;
}
void GetBerryNameByBerryType(u8 berry, u8 *string)
{
- memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH);
- string[BERRY_NAME_LENGTH] = EOS;
+ memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_COUNT - 1);
+ string[BERRY_NAME_COUNT - 1] = EOS;
}
void GetBerryCountStringByBerryType(u8 berry, u8* dest, u32 berryCount)
@@ -1158,7 +1152,7 @@ u16 GetStageDurationByBerryType(u8 berry)
return GetBerryInfo(berry)->stageDuration * 60;
}
-void FieldObjectInteractionGetBerryTreeData(void)
+void EventObjectInteractionGetBerryTreeData(void)
{
u8 id;
u8 berry;
@@ -1166,13 +1160,13 @@ void FieldObjectInteractionGetBerryTreeData(void)
u8 group;
u8 num;
- id = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ id = EventObjectGetBerryTreeId(gSelectedEventObject);
berry = GetBerryTypeByBerryTreeId(id);
ResetBerryTreeSparkleFlag(id);
unk = gSpecialVar_LastTalked;
num = gSaveBlock1Ptr->location.mapNum;
group = gSaveBlock1Ptr->location.mapGroup;
- if (sub_8092E9C(unk, num, group))
+ if (IsBerryTreeSparkling(unk, num, group))
gSpecialVar_0x8004 = 0xFF;
else
gSpecialVar_0x8004 = GetStageByBerryTreeId(id);
@@ -1181,15 +1175,15 @@ void FieldObjectInteractionGetBerryTreeData(void)
GetBerryCountStringByBerryType(berry, gStringVar1, gSpecialVar_0x8006);
}
-void FieldObjectInteractionGetBerryName(void)
+void EventObjectInteractionGetBerryName(void)
{
- u8 berryType = GetBerryTypeByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject));
+ u8 berryType = GetBerryTypeByBerryTreeId(EventObjectGetBerryTreeId(gSelectedEventObject));
GetBerryNameByBerryType(berryType, gStringVar1);
}
-void FieldObjectInteractionGetBerryCountString(void)
+void EventObjectInteractionGetBerryCountString(void)
{
- u8 treeId = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ u8 treeId = EventObjectGetBerryTreeId(gSelectedEventObject);
u8 berry = GetBerryTypeByBerryTreeId(treeId);
u8 count = GetBerryCountByBerryTreeId(treeId);
GetBerryCountStringByBerryType(berry, gStringVar1, count);
@@ -1200,31 +1194,31 @@ void Bag_ChooseBerry(void)
SetMainCallback2(CB2_ChooseBerry);
}
-void FieldObjectInteractionPlantBerryTree(void)
+void EventObjectInteractionPlantBerryTree(void)
{
u8 berry = ItemIdToBerryType(gSpecialVar_ItemId);
- PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE);
- FieldObjectInteractionGetBerryTreeData();
+ PlantBerryTree(EventObjectGetBerryTreeId(gSelectedEventObject), berry, 1, TRUE);
+ EventObjectInteractionGetBerryTreeData();
}
-void FieldObjectInteractionPickBerryTree(void)
+void EventObjectInteractionPickBerryTree(void)
{
- u8 id = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ u8 id = EventObjectGetBerryTreeId(gSelectedEventObject);
u8 berry = GetBerryTypeByBerryTreeId(id);
gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id));
}
-void FieldObjectInteractionRemoveBerryTree(void)
+void EventObjectInteractionRemoveBerryTree(void)
{
- RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject));
+ RemoveBerryTree(EventObjectGetBerryTreeId(gSelectedEventObject));
sub_8092EF0(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
u8 PlayerHasBerries(void)
{
- return IsBagPocketNonEmpty(BAG_BERRIES);
+ return IsBagPocketNonEmpty(POCKET_BERRIES);
}
void ResetBerryTreeSparkleFlags(void)
@@ -1242,14 +1236,14 @@ void ResetBerryTreeSparkleFlags(void)
top = cam_top + 3;
right = cam_left + 14;
bottom = top + 8;
- for (i = 0; i < MAP_OBJECTS_COUNT; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
- if (gMapObjects[i].active && gMapObjects[i].animPattern == 12)
+ if (gEventObjects[i].active && gEventObjects[i].movementType == 12)
{
- cam_left = gMapObjects[i].coords2.x;
- cam_top = gMapObjects[i].coords2.y;
+ cam_left = gEventObjects[i].currentCoords.x;
+ cam_top = gEventObjects[i].currentCoords.y;
if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom)
- ResetBerryTreeSparkleFlag(gMapObjects[i].trainerRange_berryTreeId);
+ ResetBerryTreeSparkleFlag(gEventObjects[i].trainerRange_berryTreeId);
}
}
}
diff --git a/src/berry_blender.c b/src/berry_blender.c
index 8e5a51845..257c7233f 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -1,17 +1,138 @@
#include "global.h"
+#include "constants/game_stat.h"
+#include "overworld.h"
+#include "berry_blender.h"
#include "bg.h"
#include "window.h"
#include "task.h"
#include "sprite.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "m4a.h"
+#include "bg.h"
+#include "palette.h"
+#include "decompress.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "text.h"
+#include "text_window.h"
+#include "event_data.h"
+#include "main.h"
+#include "link.h"
+#include "item_menu_icons.h"
+#include "berry.h"
+#include "item.h"
+#include "constants/items.h"
+#include "string_util.h"
+#include "international_string_util.h"
+#include "random.h"
+#include "menu.h"
+#include "pokeblock.h"
+#include "trig.h"
+#include "tv.h"
+#include "item_menu.h"
+#include "battle_records.h"
+
+#define BLENDER_SCORE_BEST 0
+#define BLENDER_SCORE_GOOD 1
+#define BLENDER_SCORE_MISS 2
+
+#define BLENDER_MAX_PLAYERS 4
+#define BLENDER_SCORES_NO 3
+
+enum
+{
+ PLAY_AGAIN_OK,
+ DONT_PLAY_AGAIN,
+ CANT_PLAY_NO_BERRIES,
+ CANT_PLAY_NO_PKBLCK_SPACE
+};
+
+struct BlenderBerry
+{
+ u16 itemId;
+ u8 name[BERRY_NAME_COUNT];
+ u8 flavors[FLAVOR_COUNT];
+ u8 smoothness;
+};
+
+struct TimeAndRPM
+{
+ u32 time;
+ u16 max_RPM;
+};
+
+struct BlenderGameBlock
+{
+ struct TimeAndRPM timeRPM;
+ u16 scores[BLENDER_MAX_PLAYERS][BLENDER_SCORES_NO];
+};
+
+struct TvBlenderStruct
+{
+ u8 name[11];
+ u8 pokeblockFlavor;
+ u8 pokeblockColor;
+ u8 pokeblockSheen;
+};
-// Static type declarations
+struct BerryBlenderData
+{
+ u8 mainState;
+ u8 loadGfxState;
+ u8 unused_02[0x42];
+ u16 field_44;
+ u8 scoreIconIds[BLENDER_SCORES_NO];
+ u16 arrowPos;
+ s16 field_4C;
+ u16 max_RPM;
+ u8 syncArrowSpriteIds[BLENDER_MAX_PLAYERS];
+ u8 syncArrowSprite2Ids[BLENDER_MAX_PLAYERS];
+ u8 unused_57[0xB];
+ u8 gameEndState;
+ u16 field_64[BLENDER_MAX_PLAYERS];
+ u16 field_6C;
+ u16 field_6E;
+ u16 playAgainState;
+ u8 field_72;
+ u16 chosenItemId[BLENDER_MAX_PLAYERS];
+ u8 playersNo;
+ u8 unused_7D[0x10];
+ u16 field_8E[BLENDER_MAX_PLAYERS];
+ u16 field_96[BLENDER_MAX_PLAYERS];
+ u8 yesNoAnswer;
+ u8 stringVar[100];
+ u32 gameFrameTime;
+ s32 framesToWait;
+ u32 field_10C;
+ u8 unused_110[4];
+ u8 field_114;
+ u16 field_116;
+ u16 field_118;
+ u16 field_11A;
+ u16 bg_X;
+ u16 bg_Y;
+ u8 field_120[3];
+ u8 field_123;
+ u16 scores[BLENDER_MAX_PLAYERS][BLENDER_SCORES_NO];
+ u8 playerPlaces[BLENDER_MAX_PLAYERS];
+ struct BgAffineSrcData bgAffineSrc;
+ u16 field_154;
+ struct BlenderBerry blendedBerries[BLENDER_MAX_PLAYERS];
+ struct TimeAndRPM smallBlock;
+ u32 field_1A0;
+ u8 field_1A4;
+ struct TvBlenderStruct tvBlender;
+ u8 tilemapBuffers[2][0x800];
+ s16 textState;
+ void *tilesBuffer;
+ struct BlenderGameBlock gameBlock;
+};
-// Static RAM declarations
-IWRAM_DATA void *berry_blender_c_unused_03000de4;
-IWRAM_DATA s16 gUnknown_03000DE8[8];
-IWRAM_DATA s16 gUnknown_03000DF8[6];
-IWRAM_DATA s16 gUnknown_03000E04;
-IWRAM_DATA s16 gUnknown_03000E06;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+extern u8 gInGameOpponentsNo;
+extern u8 gUnknown_020322D5;
// graphics
extern const u8 gBerryBlenderArrowTiles[];
@@ -21,20 +142,87 @@ extern const u8 gBerryBlenderParticlesTiles[];
extern const u8 gBerryBlenderCountdownNumbersTiles[];
extern const u16 gBerryBlenderMiscPalette[];
extern const u16 gBerryBlenderArrowPalette[];
-
-void sub_8080EA4(u8 taskId);
-void sub_8080FD0(u8 taskId);
-void sub_80810F8(u8 taskId);
-void sub_80833F8(struct Sprite *sprite);
-void sub_8082F68(struct Sprite *sprite);
-void sub_8083010(struct Sprite *sprite);
-void sub_80830C0(struct Sprite *sprite);
-
-// .rodata
-// TODO: make those static once the file is decompiled
-const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal");
-const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin");
-const u16 sBlenderOuterPal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal");
+extern const u8 sBlenderCenterGfx[];
+extern const u8 gUnknown_08D91DB8[];
+extern const u8 gUnknown_08D927EC[];
+
+// text
+extern const u8 gText_SavingDontTurnOff2[];
+extern const u8 gText_Space[];
+extern const u8 gText_BlenderMaxSpeedRecord[];
+extern const u8 gText_234Players[];
+
+extern void sub_800A418(void);
+extern u8 sub_800A9D8(void);
+extern void sub_81AABF0(void (*callback)(void));
+extern void sub_800B4C0(void);
+extern void ClearLinkCallback(void);
+extern void sub_8009F8C(void);
+extern void sub_8153430(void);
+extern bool8 sub_8153474(void);
+extern void sub_80EECEC(void);
+
+// this file's functions
+static void BerryBlender_SetBackgroundsPos(void);
+static void sub_8080EA4(u8 taskId);
+static void sub_8080FD0(u8 taskId);
+static void sub_80810F8(u8 taskId);
+static void sub_8081224(u8 taskId);
+static void sub_8083F3C(u8 taskId);
+static void sub_80833F8(struct Sprite *sprite);
+static void sub_8082F68(struct Sprite *sprite);
+static void sub_8083010(struct Sprite *sprite);
+static void sub_80830C0(struct Sprite *sprite);
+static void sub_8082F9C(struct Sprite *sprite);
+static void Blender_SetPlayerNamesLocal(u8 opponentsNum);
+static void sub_807FAC8(void);
+static void sub_8082D28(void);
+static bool32 Blender_PrintText(s16 *textState, const u8 *string, s32 textSpeed);
+static void sub_807FFA4(void);
+static void sub_8080018(void);
+static void sub_80808D4(void);
+static void Blender_DummiedOutFunc(s16 a0, s16 a1);
+static void sub_8081898(void);
+static void sub_8082CB4(struct BgAffineSrcData *bgAffineSrc);
+static bool8 sub_8083380(void);
+static void sub_808074C(void);
+static void Blender_PrintPlayerNames(void);
+static void sub_8080588(void);
+static void Blender_SetBankBerryData(u8 bank, u16 itemId);
+static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s32 speed, s32 caseId);
+static void sub_8080DF8(void);
+static void sub_8082E84(void);
+static void sub_80832BC(s16* a0, u16 a1);
+static void sub_8083140(u16 a0, u16 a2);
+static void sub_8083230(u16 a0);
+static void sub_808330C(void);
+static void sub_8082AD4(void);
+static void CB2_HandleBlenderEndGame(void);
+static bool8 Blender_PrintBlendingRanking(void);
+static bool8 Blender_PrintBlendingResults(void);
+static void CB2_HandlePlayerPlayAgainChoice(void);
+static void CB2_HandlePlayerLinkPlayAgainChoice(void);
+static void sub_8083170(u16 a0, u16 a1);
+static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst);
+static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlenderStruct *a1);
+
+// ewram
+EWRAM_DATA static struct BerryBlenderData *sBerryBlenderData = NULL;
+EWRAM_DATA static s32 sUnknown_020322A8[5] = {0};
+EWRAM_DATA static s32 sUnknown_020322BC[5] = {0};
+EWRAM_DATA static u32 sUnknown_020322D0 = 0;
+
+// iwram
+IWRAM_DATA static s16 sUnknown_03000DE8[8];
+IWRAM_DATA static s16 sUnknown_03000DF8[6];
+IWRAM_DATA static s16 sUnknown_03000E04;
+IWRAM_DATA static s16 sUnknown_03000E06;
+
+// rom
+
+static const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal");
+static const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin");
+static const u16 sBlenderOuterPal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal");
// unreferenced pals?
static const u16 sUnknownPal_0[] = INCBIN_U16("graphics/unknown/unknown_339514.gbapal");
@@ -47,9 +235,9 @@ static const u8 sUnusedText_Space[] = _(" ");
static const u8 sUnusedText_Terminating[] = _("Terminating.");
static const u8 sUnusedText_LinkPartnerNotFound[] = _("Link partner(s) not found.\nPlease try again.\p");
-const u8 gText_BerryBlenderStart[] = _("Starting up the BERRY BLENDER.\pPlease select a BERRY from your BAG\nto put in the BERRY BLENDER.\p");
-const u8 gText_NewParagraph[] = _("\p");
-const u8 gText_WasMade[] = _(" was made!");
+static const u8 sText_BerryBlenderStart[] = _("Starting up the BERRY BLENDER.\pPlease select a BERRY from your BAG\nto put in the BERRY BLENDER.\p");
+static const u8 sText_NewParagraph[] = _("\p");
+static const u8 sText_WasMade[] = _(" was made!");
static const u8 sText_Mister[] = _("MISTER");
static const u8 sText_Laddie[] = _("LADDIE");
static const u8 sText_Lassie[] = _("LASSIE");
@@ -57,7 +245,7 @@ static const u8 sText_Master[] = _("MASTER");
static const u8 sText_Dude[] = _("DUDE");
static const u8 sText_Miss[] = _("MISS");
-const u8* const sBlenderOpponentsNames[] =
+static const u8* const sBlenderOpponentsNames[] =
{
sText_Mister,
sText_Laddie,
@@ -67,31 +255,41 @@ const u8* const sBlenderOpponentsNames[] =
sText_Miss
};
+enum
+{
+ BLENDER_MISTER,
+ BLENDER_LADDIE,
+ BLENDER_LASSIE,
+ BLENDER_MASTER,
+ BLENDER_DUDE,
+ BLENDER_MISS
+};
+
static const u8 sText_PressAToStart[] = _("Press the A Button to start.");
static const u8 sText_PleaseWaitAWhile[] = _("Please wait a while.");
-const u8 sText_CommunicationStandby[] = _("Communication standby…");
-const u8 sText_WouldLikeToBlendAnotherBerry[] = _("Would you like to blend another BERRY?");
-const u8 sText_RunOutOfBerriesForBlending[] = _("You’ve run out of BERRIES for\nblending in the BERRY BLENDER.\p");
-const u8 sText_YourPokeblockCaseIsFull[] = _("Your {POKEBLOCK} CASE is full.\p");
-const u8 sText_HasNoBerriesToPut[] = _(" has no BERRIES to put in\nthe BERRY BLENDER.");
-const u8 sText_ApostropheSPokeblockCaseIsFull[] = _("’s {POKEBLOCK} CASE is full.\p");
-const u8 sText_BlendingResults[] = _("RESULTS OF BLENDING");
+static const u8 sText_CommunicationStandby[] = _("Communication standby…");
+static const u8 sText_WouldLikeToBlendAnotherBerry[] = _("Would you like to blend another BERRY?");
+static const u8 sText_RunOutOfBerriesForBlending[] = _("You’ve run out of BERRIES for\nblending in the BERRY BLENDER.\p");
+static const u8 sText_YourPokeblockCaseIsFull[] = _("Your {POKEBLOCK} CASE is full.\p");
+static const u8 sText_HasNoBerriesToPut[] = _(" has no BERRIES to put in\nthe BERRY BLENDER.");
+static const u8 sText_ApostropheSPokeblockCaseIsFull[] = _("’s {POKEBLOCK} CASE is full.\p");
+static const u8 sText_BlendingResults[] = _("RESULTS OF BLENDING");
static const u8 sText_BerryUsed[] = _("BERRY USED");
-const u8 sText_SpaceBerry[] = _(" BERRY");
-const u8 sText_Time[] = _("Time:");
-const u8 sText_Min[] = _(" min. ");
-const u8 sText_Sec[] = _(" sec.");
-const u8 sText_MaximumSpeed[] = _("MAXIMUM SPEED");
-const u8 sText_RPM[] = _(" RPM");
-const u8 sText_Dot[] = _(".");
-const u8 sText_NewLine[] = _("\n");
+static const u8 sText_SpaceBerry[] = _(" BERRY");
+static const u8 sText_Time[] = _("Time:");
+static const u8 sText_Min[] = _(" min. ");
+static const u8 sText_Sec[] = _(" sec.");
+static const u8 sText_MaximumSpeed[] = _("MAXIMUM SPEED");
+static const u8 sText_RPM[] = _(" RPM");
+static const u8 sText_Dot[] = _(".");
+static const u8 sText_NewLine[] = _("\n");
static const u8 sText_Space[] = _(" ");
-const u8 sText_Ranking[] = _("RANKING");
-const u8 sText_TheLevelIs[] = _("The level is ");
-const u8 sText_TheFeelIs[] = _(", and the feel is ");
-const u8 sText_Dot2[] = _(".");
+static const u8 sText_Ranking[] = _("RANKING");
+static const u8 sText_TheLevelIs[] = _("The level is ");
+static const u8 sText_TheFeelIs[] = _(", and the feel is ");
+static const u8 sText_Dot2[] = _(".");
-const struct BgTemplate gUnknown_08339974[3] =
+static const struct BgTemplate sBerryBlenderBgTemplates[3] =
{
{
.bg = 0,
@@ -122,7 +320,7 @@ const struct BgTemplate gUnknown_08339974[3] =
}
};
-const struct WindowTemplate gUnknown_08339980[] =
+static const struct WindowTemplate sBerryBlender_WindowTemplates[] =
{
{0, 1, 6, 7, 2, 0xE, 0x28},
{0, 0x16, 6, 7, 2, 0xE, 0x36},
@@ -133,31 +331,31 @@ const struct WindowTemplate gUnknown_08339980[] =
DUMMY_WIN_TEMPLATE
};
-const struct WindowTemplate gUnknown_083399B8 =
+static const struct WindowTemplate sBlender_YesNoWindowTemplate =
{
0, 0x15, 9, 5, 4, 0xE, 0xCC
};
-const s8 gUnknown_083399C0[][2] =
+static const s8 sUnknown_083399C0[][2] =
{
{-1, -1}, {1, -1}, {-1, 1}, {1, 1}
};
-const u8 sBlenderSyncArrowsPos[][2] =
+static const u8 sBlenderSyncArrowsPos[BLENDER_MAX_PLAYERS][2] =
{
{72, 32}, {168, 32}, {72, 128}, {168, 128}
};
-const u8 gUnknown_083399D0[3][4] =
+static const u8 sUnknown_083399D0[3][4] =
{
{-1, 0, 1, -1}, {-1, 0, 1, 2}, {0, 1, 2, 3}
};
-const u16 gUnknown_083399DC[] = {0, 0xC000, 0x4000, 0x8000};
-const u8 gUnknown_083399E4[] = {1, 1, 0};
-const u8 gUnknown_083399E7[] = {32, 224, 96, 160, 0};
+static const u16 sUnknown_083399DC[] = {0, 0xC000, 0x4000, 0x8000};
+static const u8 sUnknown_083399E4[] = {1, 1, 0};
+static const u8 sUnknown_083399E7[] = {32, 224, 96, 160, 0};
-const TaskFunc gUnknown_083399EC[] =
+static const TaskFunc sUnknown_083399EC[] =
{
sub_8080EA4, sub_8080FD0, sub_80810F8
};
@@ -279,22 +477,22 @@ static const union AnimCmd *const sSpriteAnimTable_82163AC[] =
sSpriteAnim_82163A4
};
-const struct SpriteSheet sSpriteSheet_BlenderArrow =
+static const struct SpriteSheet sSpriteSheet_BlenderArrow =
{
gBerryBlenderArrowTiles, 0x800, 46545
};
-const struct SpritePalette sSpritePal_BlenderMisc =
+static const struct SpritePalette sSpritePal_BlenderMisc =
{
gBerryBlenderMiscPalette, 46546
};
-const struct SpritePalette sSpritePal_BlenderArrow =
+static const struct SpritePalette sSpritePal_BlenderArrow =
{
gBerryBlenderArrowPalette, 12312
};
-const struct SpriteTemplate sBlenderSyncArrow_SpriteTemplate =
+static const struct SpriteTemplate sBlenderSyncArrow_SpriteTemplate =
{
.tileTag = 46545,
.paletteTag = 12312,
@@ -358,12 +556,12 @@ static const union AnimCmd *const sSpriteAnimTable_8216444[] =
sSpriteAnim_821643C,
};
-const struct SpriteSheet gUnknown_08339B38 =
+static const struct SpriteSheet sUnknown_08339B38 =
{
gBerryBlenderMarubatsuTiles, 0x200, 48888
};
-const struct SpriteTemplate gUnknown_08339B40 =
+static const struct SpriteTemplate sUnknown_08339B40 =
{
.tileTag = 48888,
.paletteTag = 46546,
@@ -445,12 +643,12 @@ static const union AnimCmd *const sSpriteAnimTable_82164E0[] =
sSpriteAnim_82164D8,
};
-const struct SpriteSheet gUnknown_08339BD8 =
+static const struct SpriteSheet sUnknown_08339BD8 =
{
gBerryBlenderParticlesTiles, 0xE0, 23456
};
-const struct SpriteTemplate gUnknown_08339BE0 =
+static const struct SpriteTemplate sUnknown_08339BE0 =
{
.tileTag = 23456,
.paletteTag = 46546,
@@ -503,12 +701,12 @@ static const union AnimCmd *const sSpriteAnimTable_8216534[] =
sSpriteAnim_821652C,
};
-const struct SpriteSheet gUnknown_08339C24 =
+static const struct SpriteSheet sUnknown_08339C24 =
{
gBerryBlenderCountdownNumbersTiles, 0x600, 12345
};
-const struct SpriteTemplate gUnknown_08339C2C =
+static const struct SpriteTemplate sUnknown_08339C2C =
{
.tileTag = 12345,
.paletteTag = 46546,
@@ -547,12 +745,12 @@ static const union AnimCmd *const sSpriteAnimTable_8216570[] =
sSpriteAnim_8216568,
};
-const struct SpriteSheet gUnknown_08339C58 =
+static const struct SpriteSheet sUnknown_08339C58 =
{
gBerryBlenderStartTiles, 0x400, 12346
};
-const struct SpriteTemplate gUnknown_08339C60 =
+static const struct SpriteTemplate sUnknown_08339C60 =
{
.tileTag = 12346,
.paletteTag = 46546,
@@ -563,7 +761,7 @@ const struct SpriteTemplate gUnknown_08339C60 =
.callback = sub_80830C0
};
-const s16 gUnknown_08339C78[][5] =
+static const s16 sUnknown_08339C78[][5] =
{
{-10, 20, 10, 2, 1},
{250, 20, 10, -2, 1},
@@ -571,18 +769,18 @@ const s16 gUnknown_08339C78[][5] =
{250, 140, 10, -2, -1},
};
-const u8 gUnknown_08339CA0[][3] =
+static const u8 sOpponentBerrySets[][3] =
{
{4, 3, 2}, {0, 4, 3}, {1, 0, 4}, {2, 1, 0}, {3, 2, 1}, {0, 2, 3}, {1, 3, 4}, {2, 4, 0}, {3, 0, 1}, {4, 1, 2},
};
-const u8 gUnknown_08339CBE[] = {30, 31, 32, 33, 34};
+static const u8 sSpecialOpponentBerrySets[] = {30, 31, 32, 33, 34};
-const u8 gUnknown_08339CC3[] = {1, 1, 2, 3, 4};
+static const u8 sUnknown_08339CC3[] = {1, 1, 2, 3, 4};
-const u8 gUnknown_08339CC8[] = {0x1C, 0x16, 0x13, 0x1A, 0x19, 0x0E, 0x0D, 0x0B, 0x07, 0x15};
+static const u8 sUnknown_08339CC8[] = {0x1C, 0x16, 0x13, 0x1A, 0x19, 0x0E, 0x0D, 0x0B, 0x07, 0x15};
-static const u8 gUnknown_08339CD2[] =
+static const u8 sUnknown_08339CD2[] =
{
0xfe, 0x02, 0x02, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f, 0x0c, 0x10,
0x00, 0xff, 0xfe, 0x91, 0x72, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f,
@@ -592,6 +790,2834 @@ static const u8 gUnknown_08339CD2[] =
0x05, 0x03, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02
};
-const struct WindowTemplate gUnknown_08339D14[] = {0, 6, 4, 0x12, 0xB, 0xF, 8};
+static const struct WindowTemplate sBlenderRecordWindowTemplate = {0, 6, 4, 0x12, 0xB, 0xF, 8};
+
+// code
+
+static void Blender_ControlHitPitch(void)
+{
+ m4aMPlayPitchControl(&gMPlayInfo_SE2, 0xFFFF, 2 * (sBerryBlenderData->field_4C - 128));
+}
+
+static void VBlankCB0_BerryBlender(void)
+{
+ BerryBlender_SetBackgroundsPos();
+ SetBgAffine(2, sBerryBlenderData->bgAffineSrc.texX, sBerryBlenderData->bgAffineSrc.texY,
+ sBerryBlenderData->bgAffineSrc.scrX, sBerryBlenderData->bgAffineSrc.scrY,
+ sBerryBlenderData->bgAffineSrc.sx, sBerryBlenderData->bgAffineSrc.sy,
+ sBerryBlenderData->bgAffineSrc.alpha);
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static bool8 LoadBerryBlenderGfx(void)
+{
+ switch (sBerryBlenderData->loadGfxState)
+ {
+ case 0:
+ sBerryBlenderData->tilesBuffer = AllocZeroed(GetDecompressedDataSize(sBlenderCenterGfx) + 100);
+ LZDecompressWram(sBlenderCenterGfx, sBerryBlenderData->tilesBuffer);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 1:
+ CopyToBgTilemapBuffer(2, sBlenderCenterMap, 0x400, 0);
+ CopyBgTilemapBufferToVram(2);
+ LoadPalette(sBlenderCenterPal, 0, 0x100);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 2:
+ LoadBgTiles(2, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(sBlenderCenterGfx), 0);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 3:
+ LZDecompressWram(gUnknown_08D91DB8, sBerryBlenderData->tilesBuffer);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 4:
+ LoadBgTiles(1, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(gUnknown_08D91DB8), 0);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 5:
+ LZDecompressWram(gUnknown_08D927EC, sBerryBlenderData->tilesBuffer);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 6:
+ CopyToBgTilemapBuffer(1, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(gUnknown_08D927EC), 0);
+ CopyBgTilemapBufferToVram(1);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 7:
+ LoadPalette(sBlenderOuterPal, 0x80, 0x20);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 8:
+ LoadSpriteSheet(&sSpriteSheet_BlenderArrow);
+ LoadSpriteSheet(&sUnknown_08339BD8);
+ LoadSpriteSheet(&sUnknown_08339B38);
+ sBerryBlenderData->loadGfxState++;
+ break;
+ case 9:
+ LoadSpriteSheet(&sUnknown_08339C24);
+ LoadSpriteSheet(&sUnknown_08339C58);
+ LoadSpritePalette(&sSpritePal_BlenderArrow);
+ LoadSpritePalette(&sSpritePal_BlenderMisc);
+ Free(sBerryBlenderData->tilesBuffer);
+ sBerryBlenderData->loadGfxState = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_807F9D0(void)
+{
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14);
+ CopyBgTilemapBufferToVram(0);
+ ShowBg(0);
+ ShowBg(1);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+}
+
+static void InitBerryBlenderWindows(void)
+{
+ if (InitWindows(sBerryBlender_WindowTemplates))
+ {
+ s32 i;
+
+ DeactivateAllTextPrinters();
+ for (i = 0; i < 5; i++)
+ FillWindowPixelBuffer(i, 0);
+
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14);
+ sub_81978B0(0xE0);
+ }
+}
+
+void DoBerryBlending(void)
+{
+ if (sBerryBlenderData == NULL)
+ sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData));
+
+ sBerryBlenderData->gameEndState = 0;
+ sBerryBlenderData->mainState = 0;
+ sBerryBlenderData->gameEndState = 0;
+
+ Blender_SetPlayerNamesLocal(gSpecialVar_0x8004);
+ SetMainCallback2(sub_807FAC8);
+}
+
+static void sub_807FAC8(void)
+{
+ s32 i;
+
+ switch (sBerryBlenderData->mainState)
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ SetVBlankCallback(NULL);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates));
+ SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]);
+ SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]);
+ LoadUserWindowBorderGfx(0, 1, 0xD0);
+ LoadMessageBoxGfx(0, 0x14, 0xF0);
+ InitBerryBlenderWindows();
+
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->field_118 = 0;
+ sBerryBlenderData->field_116 = 0;
+ sBerryBlenderData->field_11A = 0x50;
+ sBerryBlenderData->bg_X = 0;
+ sBerryBlenderData->bg_Y = 0;
+ sBerryBlenderData->loadGfxState = 0;
+
+ sub_8082D28();
+ break;
+ case 1:
+ if (LoadBerryBlenderGfx())
+ {
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ sBerryBlenderData->syncArrowSpriteIds[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1);
+ StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[i]], i + 8);
+ }
+ if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType)
+ {
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ SetVBlankCallback(VBlankCB0_BerryBlender);
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ sub_8082D28();
+ sBerryBlenderData->mainState++;
+ break;
+ case 3:
+ sub_807F9D0();
+ if (!gPaletteFade.active)
+ sBerryBlenderData->mainState++;
+ break;
+ case 4:
+ if (Blender_PrintText(&sBerryBlenderData->textState, sText_BerryBlenderStart, GetPlayerTextSpeed()))
+ sBerryBlenderData->mainState++;
+ break;
+ case 5:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ sBerryBlenderData->mainState++;
+ break;
+ case 6:
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ UnsetBgTilemapBuffer(2);
+ UnsetBgTilemapBuffer(1);
+ SetVBlankCallback(NULL);
+ sub_81AABF0(sub_807FFA4);
+
+ sBerryBlenderData->mainState = 0;
+ }
+ break;
+ }
+
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void sub_807FD08(struct Sprite* sprite)
+{
+ sprite->data[1] += sprite->data[6];
+ sprite->data[2] -= sprite->data[4];
+ sprite->data[2] += sprite->data[7];
+ sprite->data[0] += sprite->data[7];
+ sprite->data[4]--;
+
+ if (sprite->data[0] < sprite->data[2])
+ {
+ sprite->data[3] = sprite->data[4] = sprite->data[3] - 1;
+
+ if (++sprite->data[5] > 3)
+ DestroySprite(sprite);
+ else
+ PlaySE(SE_TB_KARA);
+ }
+ sprite->pos1.x = sprite->data[1];
+ sprite->pos1.y = sprite->data[2];
+}
+
+static void sub_807FD64(struct Sprite* sprite, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6)
+{
+ sprite->data[0] = a3;
+ sprite->data[1] = a2;
+ sprite->data[2] = a3;
+ sprite->data[3] = a4;
+ sprite->data[4] = 10;
+ sprite->data[5] = 0;
+ sprite->data[6] = a5;
+ sprite->data[7] = a6;
+ sprite->callback = sub_807FD08;
+}
+
+static void sub_807FD90(u16 a0, u8 a1)
+{
+ u8 spriteId = sub_80D511C(a0 + 123, 0, 80, a1 & 1);
+ sub_807FD64(&gSprites[spriteId], sUnknown_08339C78[a1][0], sUnknown_08339C78[a1][1], sUnknown_08339C78[a1][2], sUnknown_08339C78[a1][3], sUnknown_08339C78[a1][4]);
+}
+
+static void Blender_CopyBerryData(struct BlenderBerry* berry, u16 itemId)
+{
+ const struct Berry *berryInfo = GetBerryInfo(ITEM_TO_BERRY(itemId));
+
+ berry->itemId = itemId;
+ StringCopy(berry->name, berryInfo->name);
+ berry->flavors[FLAVOR_SPICY] = berryInfo->spicy;
+ berry->flavors[FLAVOR_DRY] = berryInfo->dry;
+ berry->flavors[FLAVOR_SWEET] = berryInfo->sweet;
+ berry->flavors[FLAVOR_BITTER] = berryInfo->bitter;
+ berry->flavors[FLAVOR_SOUR] = berryInfo->sour;
+ berry->smoothness = berryInfo->smoothness;
+}
+
+static void Blender_SetPlayerNamesLocal(u8 opponentsNum)
+{
+ switch (opponentsNum)
+ {
+ case 0:
+ gInGameOpponentsNo = 0;
+ break;
+ case 1:
+ gInGameOpponentsNo = 1;
+ sBerryBlenderData->playersNo = 2;
+ StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);
+
+ if (!FlagGet(FLAG_0x340))
+ StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MASTER]);
+ else
+ StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MISTER]);
+
+ gLinkPlayers[0].language = GAME_LANGUAGE;
+ gLinkPlayers[1].language = GAME_LANGUAGE;
+ break;
+ case 2:
+ gInGameOpponentsNo = 2;
+ sBerryBlenderData->playersNo = 3;
+ StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);
+ StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_DUDE]);
+ StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LASSIE]);
+
+ gLinkPlayers[0].language = GAME_LANGUAGE;
+ gLinkPlayers[1].language = GAME_LANGUAGE;
+ gLinkPlayers[2].language = GAME_LANGUAGE;
+ break;
+ case 3:
+ gInGameOpponentsNo = 3;
+ sBerryBlenderData->playersNo = 4;
+ StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);
+ StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MISS]);
+ StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LADDIE]);
+ StringCopy(gLinkPlayers[3].name, sBlenderOpponentsNames[BLENDER_LASSIE]);
+
+ gLinkPlayers[0].language = GAME_LANGUAGE;
+ gLinkPlayers[1].language = GAME_LANGUAGE;
+ gLinkPlayers[2].language = GAME_LANGUAGE;
+ gLinkPlayers[3].language = GAME_LANGUAGE;
+ break;
+ }
+}
+
+static void sub_807FFA4(void)
+{
+ s32 i;
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ if (sBerryBlenderData == NULL)
+ sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData));
+
+ sBerryBlenderData->mainState = 0;
+ sBerryBlenderData->field_10C = 0;
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ sBerryBlenderData->chosenItemId[i] = ITEM_NONE;
+
+ Blender_SetPlayerNamesLocal(gSpecialVar_0x8004);
+
+ if (gSpecialVar_0x8004 == 0)
+ SetMainCallback2(sub_8080018);
+ else
+ SetMainCallback2(sub_80808D4);
+}
+
+static void sub_8080018(void)
+{
+ s32 i, j;
+
+ switch (sBerryBlenderData->mainState)
+ {
+ case 0:
+ sub_8080588();
+ gLinkType = 0x4422;
+ sBerryBlenderData->field_72 = 0;
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ sBerryBlenderData->field_64[i] = 0;
+ for (j = 0; j < 3; j++)
+ {
+ sBerryBlenderData->scores[i][j] = 0;
+ }
+ }
+ sBerryBlenderData->playAgainState = 0;
+ sBerryBlenderData->max_RPM = 0;
+ sBerryBlenderData->loadGfxState = 0;
+ sBerryBlenderData->mainState++;
+ break;
+ case 1:
+ if (LoadBerryBlenderGfx())
+ {
+ sBerryBlenderData->mainState++;
+ sub_8082D28();
+ }
+ break;
+ case 2:
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ sBerryBlenderData->syncArrowSprite2Ids[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1);
+ StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSprite2Ids[i]], i + 8);
+ }
+ if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType)
+ {
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ sBerryBlenderData->mainState++;
+ break;
+ case 3:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ sBerryBlenderData->mainState++;
+ break;
+ case 4:
+ sub_807F9D0();
+ if (!gPaletteFade.active)
+ {
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 5:
+ Blender_PrintText(&sBerryBlenderData->textState, sText_CommunicationStandby, 0);
+ sBerryBlenderData->mainState = 8;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 8:
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->field_114 = 0;
+ Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
+ memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry));
+ sub_800ADF8();
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 9:
+ if (sub_800A520())
+ {
+ ResetBlockReceivedFlags();
+ if (GetMultiplayerId() == 0)
+ sub_800A4D8(4);
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 10:
+ if (++sBerryBlenderData->framesToWait > 20)
+ {
+ sub_8197DF8(4, TRUE);
+ if (GetBlockReceivedStatus() == sub_800A9D8())
+ {
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ memcpy(&sBerryBlenderData->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry));
+ sBerryBlenderData->chosenItemId[i] = sBerryBlenderData->blendedBerries[i].itemId;
+ }
+
+ ResetBlockReceivedFlags();
+ sBerryBlenderData->mainState++;
+ }
+ }
+ break;
+ case 11:
+ sBerryBlenderData->playersNo = GetLinkPlayerCount();
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ if (sBerryBlenderData->field_114 == sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i])
+ {
+ sub_807FD90(sBerryBlenderData->chosenItemId[sBerryBlenderData->field_114], i);
+ break;
+ }
+ }
+
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->field_114++;
+ break;
+ case 12:
+ if (++sBerryBlenderData->framesToWait > 60)
+ {
+ if (sBerryBlenderData->field_114 >= sBerryBlenderData->playersNo)
+ {
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]] - 22528;
+ }
+ else
+ {
+ sBerryBlenderData->mainState--;
+ }
+ sBerryBlenderData->framesToWait = 0;
+ }
+ break;
+ case 13:
+ if (sub_800A520())
+ {
+ sBerryBlenderData->mainState++;
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ PlaySE(SE_RU_HYUU);
+ ShowBg(2);
+ }
+ break;
+ case 14:
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
+ sBerryBlenderData->arrowPos += 0x200;
+ sBerryBlenderData->field_11A += 4;
+ if (sBerryBlenderData->field_11A > 0xFF)
+ {
+ SetGpuRegBits(REG_OFFSET_BG2CNT, 2);
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->field_11A = 0x100;
+ sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]];
+ sBerryBlenderData->framesToWait = 0;
+ PlaySE(SE_TRACK_DOOR);
+ sub_808074C();
+ Blender_PrintPlayerNames();
+ }
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ break;
+ case 15:
+ if (sub_8083380())
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ }
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ break;
+ case 16:
+ CreateSprite(&sUnknown_08339C2C, 120, -16, 3);
+ sBerryBlenderData->mainState++;
+ break;
+ case 18:
+ sBerryBlenderData->mainState++;
+ break;
+ case 19:
+ sub_800ADF8();
+ sBerryBlenderData->mainState++;
+ break;
+ case 20:
+ if (sub_800A520())
+ {
+ sub_800A418();
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 21:
+ sBerryBlenderData->field_4C = 128;
+ sBerryBlenderData->gameFrameTime = 0;
+ SetMainCallback2(sub_8081898);
+ if (GetCurrentMapMusic() != MUS_CYCLING)
+ {
+ sBerryBlenderData->field_154 = GetCurrentMapMusic();
+ }
+ PlayBGM(MUS_CYCLING);
+ break;
+ }
+
+ Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void sub_8080588(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+
+ SetVBlankCallback(VBlankCB0_BerryBlender);
+
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates));
+
+ SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]);
+ SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]);
+ LoadUserWindowBorderGfx(0, 1, 0xD0);
+ LoadMessageBoxGfx(0, 0x14, 0xF0);
+ InitBerryBlenderWindows();
+
+ sBerryBlenderData->field_44 = 0;
+ sBerryBlenderData->field_4C = 0;
+ sBerryBlenderData->arrowPos = 0;
+ sBerryBlenderData->max_RPM = 0;
+ sBerryBlenderData->bg_X = 0;
+ sBerryBlenderData->bg_Y = 0;
+}
+
+static u8 sub_8080624(u16 arrowPos, u8 playerId)
+{
+ u32 var1 = (arrowPos / 0x100) + 0x18;
+ u8 arrID = sBerryBlenderData->field_96[playerId];
+ u32 var2 = sUnknown_083399E7[arrID];
+
+ if (var1 >= var2 && var1 < var2 + 0x30)
+ {
+ if (var1 >= var2 + 20 && var1 < var2 + 28)
+ return 2;
+ else
+ return 1;
+ }
+
+ return 0;
+}
+
+static void Blender_SetOpponentsBerryData(u16 playerBerryItemId, u8 playersNum, struct BlenderBerry* playerBerry)
+{
+ u16 opponentSetId = 0;
+ u16 opponentBerryId;
+ u16 var;
+ u16 i;
+
+ if (playerBerryItemId == ITEM_ENIGMA_BERRY)
+ {
+ for (i = 0; i < FLAVOR_COUNT; i++)
+ {
+ if (playerBerry->flavors[opponentSetId] > playerBerry->flavors[i])
+ opponentSetId = i;
+ }
+ opponentSetId += 5;
+ }
+ else
+ {
+ opponentSetId = playerBerryItemId - FIRST_BERRY_INDEX;
+ if (opponentSetId >= 5)
+ opponentSetId = (opponentSetId % 5) + 5;
+ }
+ for (i = 0; i < playersNum - 1; i++)
+ {
+ opponentBerryId = sOpponentBerrySets[opponentSetId][i];
+ var = playerBerryItemId - 163;
+ if (!FlagGet(0x340) && gSpecialVar_0x8004 == 1)
+ {
+ opponentSetId %= 5;
+ opponentBerryId = sSpecialOpponentBerrySets[opponentSetId];
+ if (var <= 4)
+ opponentBerryId -= 5;
+ }
+ Blender_SetBankBerryData(i + 1, opponentBerryId + FIRST_BERRY_INDEX);
+ }
+}
+
+static void sub_808074C(void)
+{
+ s32 i, j;
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ sBerryBlenderData->field_96[i] = 0xFF;
+ sBerryBlenderData->field_8E[i] = sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i];
+ }
+ for (j = 0; j < BLENDER_MAX_PLAYERS; j++)
+ {
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ if (sBerryBlenderData->field_8E[i] == j)
+ sBerryBlenderData->field_96[j] = i;
+ }
+ }
+}
+
+static void Blender_PrintPlayerNames(void)
+{
+ s32 i, xPos;
+ u32 multiplayerId = 0;
+ u8 text[20];
+
+ if (gReceivedRemoteLinkPlayers)
+ multiplayerId = GetMultiplayerId();
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ if (sBerryBlenderData->field_8E[i] != 0xFF)
+ {
+ sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[i]] = sBerryBlenderData->syncArrowSprite2Ids[i];
+ StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[i]]], i);
+
+ text[0] = EOS;
+ StringCopy(text, gLinkPlayers[sBerryBlenderData->field_8E[i]].name);
+ xPos = GetStringCenterAlignXOffset(1, text, 0x38);
+
+ if (multiplayerId == sBerryBlenderData->field_8E[i])
+ Blender_AddTextPrinter(i, text, xPos, 1, 0, 2);
+ else
+ Blender_AddTextPrinter(i, text, xPos, 1, 0, 1);
+
+ PutWindowTilemap(i);
+ CopyWindowToVram(i, 3);
+ }
+ }
+}
+
+static void sub_80808D4(void)
+{
+ s32 i, j;
+
+ switch (sBerryBlenderData->mainState)
+ {
+ case 0:
+ sub_800B4C0();
+ sub_8080588();
+ Blender_SetBankBerryData(0, gSpecialVar_ItemId);
+ Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
+ Blender_SetOpponentsBerryData(gSpecialVar_ItemId, sBerryBlenderData->playersNo, &sBerryBlenderData->blendedBerries[0]);
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ sBerryBlenderData->field_64[i] = 0;
+ for (j = 0; j < 3; j++)
+ {
+ sBerryBlenderData->scores[i][j] = 0;
+ }
+ }
+
+ sBerryBlenderData->playAgainState = 0;
+ sBerryBlenderData->loadGfxState = 0;
+ gLinkType = 0x4422;
+ sBerryBlenderData->mainState++;
+ break;
+ case 1:
+ if (LoadBerryBlenderGfx())
+ {
+ sBerryBlenderData->mainState++;
+ sub_8082D28();
+ }
+ break;
+ case 2:
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ sBerryBlenderData->syncArrowSprite2Ids[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1);
+ StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSprite2Ids[i]], i + 8);
+ }
+ sBerryBlenderData->mainState++;
+ break;
+ case 3:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 4:
+ if (++sBerryBlenderData->framesToWait == 2)
+ sub_807F9D0();
+ if (!gPaletteFade.active)
+ sBerryBlenderData->mainState = 8;
+ break;
+ case 8:
+ sBerryBlenderData->mainState = 11;
+ sBerryBlenderData->field_114 = 0;
+ break;
+ case 11:
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ u32 var = sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i];
+ if (sBerryBlenderData->field_114 == var)
+ {
+ sub_807FD90(sBerryBlenderData->chosenItemId[sBerryBlenderData->field_114], i);
+ break;
+ }
+ }
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->field_114++;
+ break;
+ case 12:
+ if (++sBerryBlenderData->framesToWait > 60)
+ {
+ if (sBerryBlenderData->field_114 >= sBerryBlenderData->playersNo)
+ {
+ sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]] - 22528;
+ sBerryBlenderData->mainState++;
+ }
+ else
+ {
+ sBerryBlenderData->mainState--;
+ }
+ sBerryBlenderData->framesToWait = 0;
+ }
+ break;
+ case 13:
+ sBerryBlenderData->mainState++;
+ sub_808074C();
+ PlaySE(SE_RU_HYUU);
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ ShowBg(2);
+ break;
+ case 14:
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
+ sBerryBlenderData->arrowPos += 0x200;
+ sBerryBlenderData->field_11A += 4;
+ if (sBerryBlenderData->field_11A > 0xFF)
+ {
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->field_11A = 0x100;
+ sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]];
+ SetGpuRegBits(REG_OFFSET_BG2CNT, 2);
+ sBerryBlenderData->framesToWait = 0;
+ PlaySE(SE_TRACK_DOOR);
+ Blender_PrintPlayerNames();
+ }
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ break;
+ case 15:
+ if (sub_8083380())
+ {
+ sBerryBlenderData->mainState++;
+ }
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ break;
+ case 16:
+ CreateSprite(&sUnknown_08339C2C, 120, -16, 3);
+ sBerryBlenderData->mainState++;
+ break;
+ case 18:
+ sBerryBlenderData->mainState++;
+ break;
+ case 19:
+ sBerryBlenderData->mainState++;
+ break;
+ case 20:
+ sBerryBlenderData->mainState++;
+ break;
+ case 21:
+ sub_8080DF8();
+ sBerryBlenderData->field_4C = 0x80;
+ sBerryBlenderData->gameFrameTime = 0;
+ sBerryBlenderData->field_123 = 0;
+ sBerryBlenderData->field_72 = 0;
+ SetMainCallback2(sub_8081898);
+
+ if (gSpecialVar_0x8004 == 1)
+ {
+ if (!FlagGet(FLAG_0x340))
+ sBerryBlenderData->field_120[0] = CreateTask(sub_8081224, 10);
+ else
+ sBerryBlenderData->field_120[0] = CreateTask(sUnknown_083399EC[0], 10);
+ }
+
+ if (gSpecialVar_0x8004 > 1)
+ {
+ for (i = 0; i < gSpecialVar_0x8004; i++)
+ sBerryBlenderData->field_120[i] = CreateTask(sUnknown_083399EC[i], 10 + i);
+ }
+
+ if (GetCurrentMapMusic() != MUS_CYCLING)
+ sBerryBlenderData->field_154 = GetCurrentMapMusic();
+
+ PlayBGM(MUS_CYCLING);
+ PlaySE(SE_MOTER);
+ Blender_ControlHitPitch();
+ break;
+ }
+
+ Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void sub_8080DF8(void)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ {
+ gSendCmd[0] = 0;
+ gSendCmd[2] = 0;
+ gRecvCmds[i][0] = 0;
+ gRecvCmds[i][2] = 0;
+ }
+}
+
+static void sub_8080E20(u8 taskId)
+{
+ if(++gTasks[taskId].data[0] > gTasks[taskId].data[1])
+ {
+ gRecvCmds[gTasks[taskId].data[2]][2] = 0x2345;
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_8080E6C(u8 a0, u8 a1)
+{
+ u8 taskId = CreateTask(sub_8080E20, 80);
+ gTasks[taskId].data[1] = a1;
+ gTasks[taskId].data[2] = a0;
+}
+
+static void sub_8080EA4(u8 taskId)
+{
+ if (sub_8080624(sBerryBlenderData->arrowPos, 1) == 2)
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ if (sBerryBlenderData->field_123 == 0)
+ {
+ u8 rand = Random() / 655;
+ if (sBerryBlenderData->field_4C < 500)
+ {
+ if (rand > 75)
+ gRecvCmds[1][2] = 0x4523;
+ else
+ gRecvCmds[1][2] = 0x5432;
+
+ gRecvCmds[1][2] = 0x5432;
+ }
+ else if (sBerryBlenderData->field_4C < 1500)
+ {
+ if (rand > 80)
+ {
+ gRecvCmds[1][2] = 0x4523;
+ }
+ else
+ {
+ u8 value = rand - 21;
+ if (value < 60)
+ gRecvCmds[1][2] = 0x5432;
+ else if (rand < 10)
+ sub_8080E6C(1, 5);
+ }
+ }
+ else if (rand <= 90)
+ {
+ u8 value = rand - 71;
+ if (value < 20)
+ gRecvCmds[1][2] = 0x5432;
+ else if (rand < 30)
+ sub_8080E6C(1, 5);
+ }
+ else
+ {
+ gRecvCmds[1][2] = 0x4523;
+ }
+ }
+ else
+ {
+ gRecvCmds[1][2] = 0x4523;
+ }
+
+ gTasks[taskId].data[0] = 1;
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+}
+
+static void sub_8080FD0(u8 taskId)
+{
+ u32 var1 = (sBerryBlenderData->arrowPos + 0x1800) & 0xFFFF;
+ u32 var2 = sBerryBlenderData->field_96[2] & 0xFF;
+ if ((var1 >> 8) > sUnknown_083399E7[var2] + 20 && (var1 >> 8) < sUnknown_083399E7[var2] + 40)
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ if (sBerryBlenderData->field_123 == 0)
+ {
+ u8 rand = Random() / 655;
+ if (sBerryBlenderData->field_4C < 500)
+ {
+ if (rand > 66)
+ gRecvCmds[2][2] = 0x4523;
+ else
+ gRecvCmds[2][2] = 0x5432;
+ }
+ else
+ {
+ u8 value;
+ if (rand > 65)
+ gRecvCmds[2][2] = 0x4523;
+ value = rand - 41;
+ if (value < 25)
+ gRecvCmds[2][2] = 0x5432;
+ if (rand < 10)
+ sub_8080E6C(2, 5);
+ }
+
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ gRecvCmds[2][2] = 0x4523;
+ gTasks[taskId].data[0] = 1;
+ }
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+}
+
+static void sub_80810F8(u8 taskId)
+{
+ u32 var1, var2;
+
+ var1 = (sBerryBlenderData->arrowPos + 0x1800) & 0xFFFF;
+ var2 = sBerryBlenderData->field_96[3] & 0xFF;
+ if ((var1 >> 8) > sUnknown_083399E7[var2] + 20 && (var1 >> 8) < sUnknown_083399E7[var2] + 40)
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ if (sBerryBlenderData->field_123 == 0)
+ {
+ u8 rand = (Random() / 655);
+ if (sBerryBlenderData->field_4C < 500)
+ {
+ if (rand > 88)
+ gRecvCmds[3][2] = 0x4523;
+ else
+ gRecvCmds[3][2] = 0x5432;
+ }
+ else
+ {
+ if (rand > 60)
+ {
+ gRecvCmds[3][2] = 0x4523;
+ }
+ else
+ {
+ s8 value = rand - 56; // makes me wonder what the original code was
+ u8 value2 = value;
+ if (value2 < 5)
+ gRecvCmds[3][2] = 0x5432;
+ }
+ if (rand < 5)
+ sub_8080E6C(3, 5);
+ }
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ gRecvCmds[3][2] = 0x4523;
+ gTasks[taskId].data[0] = 1;
+ }
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+}
+
+static void sub_8081224(u8 taskId)
+{
+ if (sub_8080624(sBerryBlenderData->arrowPos, 1) == 2)
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gRecvCmds[1][2] = 0x4523;
+ gTasks[taskId].data[0] = 1;
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+}
+
+static void sub_8081288(u16 a0, u8 a1)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&sUnknown_08339B40,
+ sBlenderSyncArrowsPos[a1][0] - (10 * sUnknown_083399C0[a1][0]),
+ sBlenderSyncArrowsPos[a1][1] - (10 * sUnknown_083399C0[a1][1]),
+ 1);
+ if (a0 == 0x4523)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 2);
+ gSprites[spriteId].callback = sub_8082F9C;
+ PlaySE(SE_RU_GASHIN);
+ }
+ else if (a0 == 0x5432)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 0);
+ PlaySE(SE_SEIKAI);
+ }
+ else if (a0 == 0x2345)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ PlaySE(SE_HAZURE);
+ }
+ sub_8082E84();
+}
+
+static void sub_8081370(u16 a0)
+{
+ Blender_ControlHitPitch();
+ switch (a0)
+ {
+ case 0x4523:
+ if (sBerryBlenderData->field_4C < 1500)
+ sBerryBlenderData->field_4C += (0x180 / sUnknown_08339CC3[sBerryBlenderData->playersNo]);
+ else
+ {
+ sBerryBlenderData->field_4C += (128 / sUnknown_08339CC3[sBerryBlenderData->playersNo]);
+ sub_80832BC(&sBerryBlenderData->bg_X, (sBerryBlenderData->field_4C / 100) - 10);
+ sub_80832BC(&sBerryBlenderData->bg_Y, (sBerryBlenderData->field_4C / 100) - 10);
+ }
+ break;
+ case 0x5432:
+ if (sBerryBlenderData->field_4C < 1500)
+ sBerryBlenderData->field_4C += (0x100 / sUnknown_08339CC3[sBerryBlenderData->playersNo]);
+ break;
+ case 0x2345:
+ sBerryBlenderData->field_4C -= (0x100 / sUnknown_08339CC3[sBerryBlenderData->playersNo]);
+ if (sBerryBlenderData->field_4C < 0x80)
+ sBerryBlenderData->field_4C = 0x80;
+ break;
+ }
+}
+
+static bool32 sub_80814B0(u16 arg0, u16 arg1, u16 arg2)
+{
+ if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType)
+ {
+ if ((arg0 & 0xFF00) == arg2)
+ return TRUE;
+ }
+ else
+ {
+ if (arg0 == arg1)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_80814F4(void)
+{
+ s32 i;
+
+ if (gSpecialVar_0x8004 != 0)
+ {
+ if (gSendCmd[2] != 0)
+ {
+ gRecvCmds[0][2] = gSendCmd[2];
+ gRecvCmds[0][0] = 0x4444;
+ gSendCmd[2] = 0;
+ }
+ for (i = 1; i < 4; i++)
+ {
+ if (gRecvCmds[i][2] != 0)
+ gRecvCmds[i][0] = 0x4444;
+ }
+ }
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ {
+ if (sub_80814B0(gRecvCmds[i][0], 0x4444, 0x4400))
+ {
+ u32 var = sBerryBlenderData->field_96[i];
+ if (gRecvCmds[i][2] == 0x4523)
+ {
+ sub_8081370(0x4523);
+ sBerryBlenderData->field_116 += (sBerryBlenderData->field_4C / 55);
+ if (sBerryBlenderData->field_116 >= 1000)
+ sBerryBlenderData->field_116 = 1000;
+ sub_8081288(0x4523, var);
+ sBerryBlenderData->scores[i][BLENDER_SCORE_BEST]++;
+ }
+ else if (gRecvCmds[i][2] == 0x5432)
+ {
+ sub_8081370(0x5432);
+ sBerryBlenderData->field_116 += (sBerryBlenderData->field_4C / 70);
+ sub_8081288(0x5432, var);
+ sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]++;
+ }
+ else if (gRecvCmds[i][2] == 0x2345)
+ {
+ sub_8081288(0x2345, var);
+ sub_8081370(0x2345);
+ if (sBerryBlenderData->scores[i][BLENDER_SCORE_MISS] < 999)
+ sBerryBlenderData->scores[i][BLENDER_SCORE_MISS]++;
+ }
+ if (gRecvCmds[i][2] == 0x2345 || gRecvCmds[2][i] == 0x4523 || gRecvCmds[2][i] == 0x5432) // could be a bug, 2 and i are reversed
+ {
+ if (sBerryBlenderData->field_4C > 1500)
+ m4aMPlayTempoControl(&gMPlayInfo_BGM, ((sBerryBlenderData->field_4C - 750) / 20) + 256);
+ else
+ m4aMPlayTempoControl(&gMPlayInfo_BGM, 0x100);
+ }
+ }
+ }
+ if (gSpecialVar_0x8004 != 0)
+ {
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ {
+ gRecvCmds[i][0] = 0;
+ gRecvCmds[i][2] = 0;
+ }
+ }
+}
+
+static void sub_8081744(void)
+{
+ u8 var2;
+ bool8 A_pressed = FALSE;
+ u8 playerId = 0;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ playerId = GetMultiplayerId();
+
+ var2 = sBerryBlenderData->field_96[playerId];
+
+ if (sBerryBlenderData->gameEndState == 0)
+ {
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A && gMain.newKeys & A_BUTTON)
+ {
+ if ((gMain.heldKeysRaw & (A_BUTTON | L_BUTTON)) != (A_BUTTON | L_BUTTON))
+ A_pressed = TRUE;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ A_pressed = TRUE;
+ }
+
+ if (A_pressed)
+ {
+ u8 var3;
+ StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[var2]]], var2 + 4);
+ var3 = sub_8080624(sBerryBlenderData->arrowPos, playerId);
+
+ if (var3 == 2)
+ gSendCmd[2] = 0x4523;
+ else if (var3 == 1)
+ gSendCmd[2] = 0x5432;
+ else
+ gSendCmd[2] = 0x2345;
+ }
+ }
+ if (++sBerryBlenderData->field_72 > 5)
+ {
+ if (sBerryBlenderData->field_4C > 128)
+ sBerryBlenderData->field_4C--;
+ sBerryBlenderData->field_72 = 0;
+ }
+ if (gUnknown_020322D5 && gMain.newKeys & L_BUTTON)
+ sBerryBlenderData->field_123 ^= 1;
+}
+
+static void sub_8081898(void)
+{
+ sub_8082D28();
+
+ if (sBerryBlenderData->gameFrameTime < (99 * 60 * 60) + (59 * 60)) // game time can't be longer than 99 minutes and 59 seconds, can't print 3 digits
+ sBerryBlenderData->gameFrameTime++;
+
+ sub_8081744();
+ SetLinkDebugValues((u16)(sBerryBlenderData->field_4C), sBerryBlenderData->field_116);
+ sub_80814F4();
+ sub_8083140(sBerryBlenderData->field_116, 1000);
+ sub_8083230(sBerryBlenderData->field_4C);
+ sub_808330C();
+ sub_8082AD4();
+ if (sBerryBlenderData->gameEndState == 0 && sBerryBlenderData->field_118 >= 1000)
+ {
+ sBerryBlenderData->field_116 = 1000;
+ sBerryBlenderData->gameEndState = 1;
+ SetMainCallback2(CB2_HandleBlenderEndGame);
+ }
+
+ Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void Blender_DummiedOutFunc(s16 a0, s16 a1)
+{
+
+}
+
+static bool8 sub_8081964(struct BlenderBerry* berries, u8 index1, u8 index2)
+{
+ if (berries[index1].itemId != berries[index2].itemId
+ || (StringCompare(berries[index1].name, berries[index2].name) == 0
+ && (berries[index1].flavors[FLAVOR_SPICY] == berries[index2].flavors[FLAVOR_SPICY]
+ && berries[index1].flavors[FLAVOR_DRY] == berries[index2].flavors[FLAVOR_DRY]
+ && berries[index1].flavors[FLAVOR_SWEET] == berries[index2].flavors[FLAVOR_SWEET]
+ && berries[index1].flavors[FLAVOR_BITTER] == berries[index2].flavors[FLAVOR_BITTER]
+ && berries[index1].flavors[FLAVOR_SOUR] == berries[index2].flavors[FLAVOR_SOUR]
+ && berries[index1].smoothness == berries[index2].smoothness)))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static u32 Blender_GetPokeblockColor(struct BlenderBerry* berries, s16* a1, u8 playersNo, u8 a3)
+{
+ s16 vars[6];
+ s32 i;
+ s32 r6;
+ u8 r2;
+
+ for (i = 0; i < 6; i++)
+ vars[i] = a1[i];
+
+ r6 = 0;
+ for (i = 0; i < 5; i++)
+ {
+ if (vars[i] == 0)
+ r6++;
+ }
+ if (r6 == 5 || a3 > 3)
+ return 12;
+ for (i = 0; i < playersNo; i++)
+ {
+ for (r6 = 0; r6 < playersNo; r6++)
+ {
+ if (berries[i].itemId == berries[r6].itemId && i != r6
+ && (berries[i].itemId != ITEM_ENIGMA_BERRY || sub_8081964(berries, i, r6)))
+ return 12;
+ }
+ }
+ r2 = 0;
+ for (r2 = 0, i = 0; i < 5; i++)
+ {
+ if (vars[i] > 0)
+ r2++;
+ }
+ if (r2 > 3)
+ return 13;
+ if (r2 == 3)
+ return 11;
+ for (i = 0; i < 5; i++)
+ {
+ if (vars[i] > 50)
+ return 14;
+ }
+ if (r2 == 1 && vars[0] > 0)
+ return 1;
+ if (r2 == 1 && vars[1] > 0)
+ return 2;
+ if (r2 == 1 && vars[2] > 0)
+ return 3;
+ if (r2 == 1 && vars[3] > 0)
+ return 4;
+ if (r2 == 1 && vars[4] > 0)
+ return 5;
+ if (r2 == 2)
+ {
+ s32 var = 0;
+ for (i = 0; i < 5; i++)
+ {
+ if (vars[i] > 0)
+ sUnknown_03000DF8[var++] = i;
+ }
+ if (vars[sUnknown_03000DF8[0]] >= vars[sUnknown_03000DF8[1]])
+ {
+ if (sUnknown_03000DF8[0] == 0)
+ return (sUnknown_03000DF8[1] << 16) | 6;
+ if (sUnknown_03000DF8[0] == 1)
+ return (sUnknown_03000DF8[1] << 16) | 7;
+ if (sUnknown_03000DF8[0] == 2)
+ return (sUnknown_03000DF8[1] << 16) | 8;
+ if (sUnknown_03000DF8[0] == 3)
+ return (sUnknown_03000DF8[1] << 16) | 9;
+ if (sUnknown_03000DF8[0] == 4)
+ return (sUnknown_03000DF8[1] << 16) | 10;
+ }
+ else
+ {
+ if (sUnknown_03000DF8[1] == 0)
+ return (sUnknown_03000DF8[0] << 16) | 6;
+ if (sUnknown_03000DF8[1] == 1)
+ return (sUnknown_03000DF8[0] << 16) | 7;
+ if (sUnknown_03000DF8[1] == 2)
+ return (sUnknown_03000DF8[0] << 16) | 8;
+ if (sUnknown_03000DF8[1] == 3)
+ return (sUnknown_03000DF8[0] << 16) | 9;
+ if (sUnknown_03000DF8[1] == 4)
+ return (sUnknown_03000DF8[0] << 16) | 10;
+ }
+ }
+ return 0;
+}
+
+static void sub_8081BB0(s16 value)
+{
+ sUnknown_03000E04 = value;
+}
+
+static s16 sub_8081BBC(void)
+{
+ return sUnknown_03000E04;
+}
+
+static void sub_8081BC8(s16 value)
+{
+ sUnknown_03000E06 = value;
+}
+
+static s16 sub_8081BD4(void)
+{
+ return sUnknown_03000E06;
+}
+
+static void Blender_CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *pokeblock, u8 playersNo, u8 *flavors, u16 maxRPM)
+{
+ s32 i, j;
+ s32 multiuseVar, var2;
+ u8 var3;
+
+ for (i = 0; i < 6; i++)
+ sUnknown_03000DE8[i] = 0;
+
+ for (i = 0; i < playersNo; i++)
+ {
+ for (j = 0; j < 6; j++)
+ sUnknown_03000DE8[j] += berries[i].flavors[j];
+ }
+
+ multiuseVar = sUnknown_03000DE8[0];
+ sUnknown_03000DE8[0] -= sUnknown_03000DE8[1];
+ sUnknown_03000DE8[1] -= sUnknown_03000DE8[2];
+ sUnknown_03000DE8[2] -= sUnknown_03000DE8[3];
+ sUnknown_03000DE8[3] -= sUnknown_03000DE8[4];
+ sUnknown_03000DE8[4] -= multiuseVar;
+
+ multiuseVar = 0;
+ for (i = 0; i < 5; i++)
+ {
+ if (sUnknown_03000DE8[i] < 0)
+ {
+ sUnknown_03000DE8[i] = 0;
+ multiuseVar++;
+ }
+ }
+ var3 = multiuseVar;
+ for (i = 0; i < 5; i++)
+ {
+ if (sUnknown_03000DE8[i] > 0)
+ {
+ if (sUnknown_03000DE8[i] < multiuseVar)
+ sUnknown_03000DE8[i] = 0;
+ else
+ sUnknown_03000DE8[i] -= multiuseVar;
+ }
+ }
+ for (i = 0; i < 5; i++)
+ {
+ sUnknown_020322A8[i] = sUnknown_03000DE8[i];
+ }
+
+ multiuseVar = maxRPM / 333 + 100;
+ sUnknown_020322D0 = multiuseVar;
+
+ for (i = 0; i < 5; i++)
+ {
+ s32 r4;
+ s32 r5 = sUnknown_03000DE8[i];
+ r5 = (r5 * multiuseVar) / 10;
+ r4 = r5 % 10;
+ r5 /= 10;
+ if (r4 > 4)
+ r5++;
+ sUnknown_03000DE8[i] = r5;
+ }
+ for (i = 0; i < 5; i++)
+ {
+ sUnknown_020322BC[i] = sUnknown_03000DE8[i];
+ }
+
+ pokeblock->color = Blender_GetPokeblockColor(berries, &sUnknown_03000DE8[0], playersNo, var3);
+ sUnknown_03000DE8[5] = (sUnknown_03000DE8[5] / playersNo) - playersNo;
+
+ if (sUnknown_03000DE8[5] < 0)
+ sUnknown_03000DE8[5] = 0;
+
+ if (pokeblock->color == 12)
+ {
+ multiuseVar = Random() % 10;
+ for (i = 0; i < 5; i++)
+ {
+ if ((sUnknown_08339CC8[multiuseVar] >> i) & 1)
+ sUnknown_03000DE8[i] = 2;
+ else
+ sUnknown_03000DE8[i] = 0;
+ }
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ if (sUnknown_03000DE8[i] > 255)
+ sUnknown_03000DE8[i] = 255;
+ }
+
+ pokeblock->spicy = sUnknown_03000DE8[0];
+ pokeblock->dry = sUnknown_03000DE8[1];
+ pokeblock->sweet = sUnknown_03000DE8[2];
+ pokeblock->bitter = sUnknown_03000DE8[3];
+ pokeblock->sour = sUnknown_03000DE8[4];
+ pokeblock->feel = sUnknown_03000DE8[5];
+
+ for (i = 0; i < 6; i++)
+ {
+ flavors[i] = sUnknown_03000DE8[i];
+ }
+}
+
+static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavors, u16 a4)
+{
+ Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavors, a4);
+}
+
+static void sub_8081E20(void)
+{
+ u32 frames = (u16)(sBerryBlenderData->gameFrameTime);
+ u16 max_RPM = sBerryBlenderData->max_RPM;
+ s16 var = 0;
+
+ if (frames < 900)
+ var = 5;
+ else if ((u16)(frames - 900) < 600)
+ var = 4;
+ else if ((u16)(frames - 1500) < 600)
+ var = 3;
+ else if ((u16)(frames - 2100) < 900)
+ var = 2;
+ else if ((u16)(frames - 3300) < 300)
+ var = 1;
+
+ sub_8081BC8(var);
+
+ var = 0;
+ if (max_RPM <= 64)
+ {
+ if (max_RPM >= 50 && max_RPM < 100)
+ var = -1;
+ else if (max_RPM >= 100 && max_RPM < 150)
+ var = -2;
+ else if (max_RPM >= 150 && max_RPM < 200)
+ var = -3;
+ else if (max_RPM >= 200 && max_RPM < 250)
+ var = -4;
+ else if (max_RPM >= 250 && max_RPM < 300)
+ var = -5;
+ else if (max_RPM >= 350 && max_RPM < 400)
+ var = -6;
+ else if (max_RPM >= 400 && max_RPM < 450)
+ var = -7;
+ else if (max_RPM >= 500 && max_RPM < 550)
+ var = -8;
+ else if (max_RPM >= 550 && max_RPM < 600)
+ var = -9;
+ else if (max_RPM >= 600)
+ var = -10;
+ }
+
+ sub_8081BB0(var);
+}
+
+static void sub_8081F94(u16 *a0)
+{
+ if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType)
+ *a0 = 0x2F00;
+ else
+ *a0 = 0x2FFF;
+}
+
+static void CB2_HandleBlenderEndGame(void)
+{
+ u8 i, j;
+
+ if (sBerryBlenderData->gameEndState < 3)
+ sub_8082D28();
+
+ GetMultiplayerId(); // unused return value
+
+ switch (sBerryBlenderData->gameEndState)
+ {
+ case 1:
+ m4aMPlayTempoControl(&gMPlayInfo_BGM, 256);
+ for (i = 0; i < gSpecialVar_0x8004; i++)
+ {
+ DestroyTask(sBerryBlenderData->field_120[i]);
+ }
+ sBerryBlenderData->gameEndState++;
+ break;
+ case 2:
+ sBerryBlenderData->field_4C -= 32;
+ if (sBerryBlenderData->field_4C <= 0)
+ {
+ ClearLinkCallback();
+ sBerryBlenderData->field_4C = 0;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ sBerryBlenderData->gameEndState++;
+ else
+ sBerryBlenderData->gameEndState = 5;
+
+ sBerryBlenderData->mainState = 0;
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ }
+ Blender_ControlHitPitch();
+ break;
+ case 3:
+ if (GetMultiplayerId() != 0)
+ {
+ sBerryBlenderData->gameEndState++;
+ }
+ else if (sub_800A520())
+ {
+ if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType)
+ {
+ sBerryBlenderData->gameBlock.timeRPM.time = sBerryBlenderData->gameFrameTime;
+ sBerryBlenderData->gameBlock.timeRPM.max_RPM = sBerryBlenderData->max_RPM;
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ for (j = 0; j < BLENDER_SCORES_NO; j++)
+ sBerryBlenderData->gameBlock.scores[i][j] = sBerryBlenderData->scores[i][j];
+ }
+
+ if (SendBlock(0, &sBerryBlenderData->gameBlock, sizeof(sBerryBlenderData->gameBlock)))
+ sBerryBlenderData->gameEndState++;
+ }
+ else
+ {
+ sBerryBlenderData->smallBlock.time = sBerryBlenderData->gameFrameTime;
+ sBerryBlenderData->smallBlock.max_RPM = sBerryBlenderData->max_RPM;
+ if (SendBlock(0, &sBerryBlenderData->smallBlock, sizeof(sBerryBlenderData->smallBlock) + 32))
+ sBerryBlenderData->gameEndState++;
+ }
+ }
+ break;
+ case 4:
+ if (GetBlockReceivedStatus())
+ {
+ ResetBlockReceivedFlags();
+ sBerryBlenderData->gameEndState++;
+
+ if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType)
+ {
+ struct BlenderGameBlock *receivedBlock = (struct BlenderGameBlock*)(&gBlockRecvBuffer);
+
+ sBerryBlenderData->max_RPM = receivedBlock->timeRPM.max_RPM;
+ sBerryBlenderData->gameFrameTime = receivedBlock->timeRPM.time;
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ for (j = 0; j < BLENDER_SCORES_NO; j++)
+ sBerryBlenderData->scores[i][j] = receivedBlock->scores[i][j];
+ }
+ }
+ else
+ {
+ struct TimeAndRPM *receivedBlock = (struct TimeAndRPM*)(&gBlockRecvBuffer);
+
+ sBerryBlenderData->max_RPM = receivedBlock->max_RPM;
+ sBerryBlenderData->gameFrameTime = receivedBlock->time;
+ }
+ }
+ break;
+ case 5:
+ if (Blender_PrintBlendingRanking())
+ sBerryBlenderData->gameEndState++;
+ break;
+ case 6:
+ if (Blender_PrintBlendingResults())
+ {
+ if (gInGameOpponentsNo == 0)
+ IncrementGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS);
+ else
+ IncrementGameStat(GAME_STAT_POKEBLOCKS);
+
+ sBerryBlenderData->gameEndState++;
+ }
+ break;
+ case 7:
+ if (Blender_PrintText(&sBerryBlenderData->textState, sText_WouldLikeToBlendAnotherBerry, GetPlayerTextSpeed()))
+ sBerryBlenderData->gameEndState++;
+ break;
+ case 9:
+ sBerryBlenderData->yesNoAnswer = 0;
+ CreateYesNoMenu(&sBlender_YesNoWindowTemplate, 1, 0xD, 0);
+ sBerryBlenderData->gameEndState++;
+ break;
+ case 10:
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 1:
+ case -1:
+ sBerryBlenderData->yesNoAnswer = 1;
+ sBerryBlenderData->gameEndState++;
+ for (i = 0; i <BLENDER_MAX_PLAYERS; i++)
+ {
+ if (sBerryBlenderData->field_8E[i] != 0xFF)
+ {
+ PutWindowTilemap(i);
+ CopyWindowToVram(i, 3);
+ }
+ }
+ break;
+ case 0:
+ sBerryBlenderData->yesNoAnswer = 0;
+ sBerryBlenderData->gameEndState++;
+ for (i = 0; i <BLENDER_MAX_PLAYERS; i++)
+ {
+ if (sBerryBlenderData->field_8E[i] != 0xFF)
+ {
+ PutWindowTilemap(i);
+ CopyWindowToVram(i, 3);
+ }
+ }
+ break;
+ }
+ break;
+ case 11:
+ sub_8081F94(&gSendCmd[0]);
+ if (sBerryBlenderData->yesNoAnswer == 0)
+ {
+ if (IsBagPocketNonEmpty(POCKET_BERRIES) == FALSE) // no berries
+ {
+ sBerryBlenderData->playAgainState = CANT_PLAY_NO_BERRIES;
+ gSendCmd[1] = 0x9999;
+ }
+ else if (GetFirstFreePokeblockSlot() == -1) // no space for pokeblocks
+ {
+ sBerryBlenderData->playAgainState = CANT_PLAY_NO_PKBLCK_SPACE;
+ gSendCmd[1] = 0xAAAA;
+ }
+ else
+ {
+ sBerryBlenderData->playAgainState = PLAY_AGAIN_OK;
+ gSendCmd[1] = 0x7779;
+ }
+ sBerryBlenderData->gameEndState++;
+ }
+ else
+ {
+ sBerryBlenderData->playAgainState = DONT_PLAY_AGAIN;
+ gSendCmd[1] = 0x8888;
+ sBerryBlenderData->gameEndState++;
+ }
+ break;
+ case 12:
+ if (gInGameOpponentsNo)
+ {
+ SetMainCallback2(CB2_HandlePlayerPlayAgainChoice);
+ sBerryBlenderData->gameEndState = 0;
+ sBerryBlenderData->mainState = 0;
+ }
+ else
+ {
+ sBerryBlenderData->gameEndState++;
+ }
+ break;
+ case 8:
+ sBerryBlenderData->gameEndState++;
+ break;
+ case 13:
+ if (Blender_PrintText(&sBerryBlenderData->textState, sText_CommunicationStandby, GetPlayerTextSpeed()))
+ {
+ SetMainCallback2(CB2_HandlePlayerLinkPlayAgainChoice);
+ sBerryBlenderData->gameEndState = 0;
+ sBerryBlenderData->mainState = 0;
+ }
+ break;
+ }
+
+ sub_808330C();
+ sub_8083230(sBerryBlenderData->field_4C);
+ sub_8082AD4();
+ Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static bool8 LinkPlayAgainHandleSaving(void)
+{
+ switch (sBerryBlenderData->field_1A0)
+ {
+ case 0:
+ sub_800ADF8();
+ sBerryBlenderData->field_1A0 = 1;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 1:
+ if (sub_800A520())
+ {
+ sBerryBlenderData->field_1A0++;
+ gSoftResetDisabled = TRUE;
+ }
+ break;
+ case 2:
+ sub_8153430();
+ sBerryBlenderData->field_1A0++;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 3:
+ if (++sBerryBlenderData->framesToWait == 10)
+ {
+ sub_800ADF8();
+ sBerryBlenderData->field_1A0++;
+ }
+ break;
+ case 4:
+ if (sub_800A520())
+ {
+ if (sub_8153474())
+ {
+ sBerryBlenderData->field_1A0 = 5;
+ }
+ else
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->field_1A0 = 3;
+ }
+ }
+ break;
+ case 5:
+ sBerryBlenderData->field_1A0++;
+ sBerryBlenderData->framesToWait = 0;
+ break;
+ case 6:
+ if (++sBerryBlenderData->framesToWait > 5)
+ {
+ gSoftResetDisabled = FALSE;
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+static void CB2_HandlePlayerLinkPlayAgainChoice(void)
+{
+ switch (sBerryBlenderData->gameEndState)
+ {
+ case 0:
+ if (sBerryBlenderData->field_64[0] == 0x2222)
+ {
+ sBerryBlenderData->gameEndState = 5;
+ }
+ else if (sBerryBlenderData->field_64[0] == 0x1111)
+ {
+ if (sBerryBlenderData->field_6C == 0x9999)
+ sBerryBlenderData->gameEndState = 2;
+ else if (sBerryBlenderData->field_6C == 0xAAAA)
+ sBerryBlenderData->gameEndState = 1;
+ else
+ sBerryBlenderData->gameEndState = 5;
+ }
+ break;
+ case 1:
+ sBerryBlenderData->gameEndState = 3;
+ StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_6E].name);
+ StringAppend(gStringVar4, sText_ApostropheSPokeblockCaseIsFull);
+ break;
+ case 2:
+ sBerryBlenderData->gameEndState++;
+ StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_6E].name);
+ StringAppend(gStringVar4, sText_HasNoBerriesToPut);
+ break;
+ case 3:
+ if (Blender_PrintText(&sBerryBlenderData->textState, gStringVar4, GetPlayerTextSpeed()))
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->gameEndState++;
+ }
+ break;
+ case 4:
+ if (++sBerryBlenderData->framesToWait > 60)
+ sBerryBlenderData->gameEndState = 5;
+ break;
+ case 5:
+ Blender_PrintText(&sBerryBlenderData->textState, gText_SavingDontTurnOff2, 0);
+ sub_800ADF8();
+ sBerryBlenderData->gameEndState++;
+ break;
+ case 6:
+ if (sub_800A520())
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->gameEndState++;
+ sBerryBlenderData->field_1A0 = 0;
+ }
+ break;
+ case 7:
+ if (LinkPlayAgainHandleSaving())
+ {
+ PlaySE(SE_SAVE);
+ sBerryBlenderData->gameEndState++;
+ }
+ break;
+ case 8:
+ sBerryBlenderData->gameEndState++;
+ sub_800ADF8();
+ break;
+ case 9:
+ if (sub_800A520())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ sBerryBlenderData->gameEndState++;
+ }
+ break;
+ case 10:
+ if (!gPaletteFade.active)
+ {
+ if (sBerryBlenderData->field_64[0] == 0x2222)
+ {
+ FreeAllWindowBuffers();
+ UnsetBgTilemapBuffer(2);
+ UnsetBgTilemapBuffer(1);
+ FREE_AND_SET_NULL(sBerryBlenderData);
+ SetMainCallback2(DoBerryBlending);
+ }
+ else
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->gameEndState++;
+ }
+ }
+ break;
+ case 11:
+ if (++sBerryBlenderData->framesToWait > 30)
+ {
+ sub_800AC34();
+ sBerryBlenderData->gameEndState++;
+ }
+ break;
+ case 12:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ FREE_AND_SET_NULL(sBerryBlenderData);
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ }
+ break;
+ }
+
+ sub_8082AD4();
+ Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void CB2_HandlePlayerPlayAgainChoice(void)
+{
+ switch (sBerryBlenderData->gameEndState)
+ {
+ case 0:
+ if (sBerryBlenderData->playAgainState == PLAY_AGAIN_OK || sBerryBlenderData->playAgainState == DONT_PLAY_AGAIN)
+ sBerryBlenderData->gameEndState = 9;
+ if (sBerryBlenderData->playAgainState == CANT_PLAY_NO_BERRIES)
+ sBerryBlenderData->gameEndState = 2;
+ if (sBerryBlenderData->playAgainState == CANT_PLAY_NO_PKBLCK_SPACE)
+ sBerryBlenderData->gameEndState = 1;
+ break;
+ case 1:
+ sBerryBlenderData->gameEndState = 3;
+ sBerryBlenderData->textState = 0;
+ StringCopy(gStringVar4, sText_YourPokeblockCaseIsFull);
+ break;
+ case 2:
+ sBerryBlenderData->gameEndState++;
+ sBerryBlenderData->textState = 0;
+ StringCopy(gStringVar4, sText_RunOutOfBerriesForBlending);
+ break;
+ case 3:
+ if (Blender_PrintText(&sBerryBlenderData->textState, gStringVar4, GetPlayerTextSpeed()))
+ sBerryBlenderData->gameEndState = 9;
+ break;
+ case 9:
+ BeginFastPaletteFade(3);
+ sBerryBlenderData->gameEndState++;
+ break;
+ case 10:
+ if (!gPaletteFade.active)
+ {
+ if (sBerryBlenderData->playAgainState == PLAY_AGAIN_OK)
+ SetMainCallback2(DoBerryBlending);
+ else
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+
+ FreeAllWindowBuffers();
+ UnsetBgTilemapBuffer(2);
+ UnsetBgTilemapBuffer(1);
+ FREE_AND_SET_NULL(sBerryBlenderData);
+ }
+ break;
+ }
+
+ sub_8082AD4();
+ Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void sub_8082AD4(void)
+{
+ if (gReceivedRemoteLinkPlayers)
+ {
+ if (sub_80814B0(gRecvCmds[0][0], 0x2FFF, 0x2F00))
+ {
+ if (gRecvCmds[0][1] == 0x1111)
+ {
+ switch (gRecvCmds[0][2])
+ {
+ case 0x8888:
+ sBerryBlenderData->field_6C = 0x8888;
+ sBerryBlenderData->field_6E = gRecvCmds[0][3];
+ break;
+ case 0x9999:
+ sBerryBlenderData->field_6C = 0x9999;
+ sBerryBlenderData->field_6E = gRecvCmds[0][3];
+ break;
+ case 0xAAAA:
+ sBerryBlenderData->field_6C = 0xAAAA;
+ sBerryBlenderData->field_6E = gRecvCmds[0][3];
+ break;
+ }
+
+ sBerryBlenderData->field_64[0] = 0x1111;
+ }
+ else if (gRecvCmds[0][1] == 0x2222)
+ {
+ sBerryBlenderData->field_64[0] = 0x2222;
+ }
+ }
+ if (GetMultiplayerId() == 0 && sBerryBlenderData->field_64[0] != 0x1111 && sBerryBlenderData->field_64[0] != 0x2222)
+ {
+ u8 i;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (sub_80814B0(gRecvCmds[i][0], 0x2FFF, 0x2F00))
+ {
+ switch (gRecvCmds[i][1])
+ {
+ case 0x8888:
+ sBerryBlenderData->field_64[i] = 0x8888;
+ break;
+ case 0x7779:
+ sBerryBlenderData->field_64[i] = 0x7779;
+ break;
+ case 0x9999:
+ sBerryBlenderData->field_64[i] = 0x9999;
+ break;
+ case 0xAAAA:
+ sBerryBlenderData->field_64[i] = 0xAAAA;
+ break;
+ }
+ }
+ }
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (sBerryBlenderData->field_64[i] == 0)
+ break;
+ }
+ if (i == GetLinkPlayerCount())
+ {
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (sBerryBlenderData->field_64[i] != 0x7779)
+ break;
+ }
+ sub_8081F94(&gSendCmd[0]);
+ if (i == GetLinkPlayerCount())
+ {
+ gSendCmd[1] = 0x2222;
+ }
+ else
+ {
+ gSendCmd[1] = 0x1111;
+ gSendCmd[2] = sBerryBlenderData->field_64[i];
+ gSendCmd[3] = i;
+ }
+ }
+ }
+ }
+}
+
+static void sub_8082CB4(struct BgAffineSrcData *dest)
+{
+ struct BgAffineSrcData affineSrc;
+
+ affineSrc.texX = 0x7800;
+ affineSrc.texY = 0x5000;
+ affineSrc.scrX = 0x78 - sBerryBlenderData->bg_X;
+ affineSrc.scrY = 0x50 - sBerryBlenderData->bg_Y;
+ affineSrc.sx = sBerryBlenderData->field_11A;
+ affineSrc.sy = sBerryBlenderData->field_11A;
+ affineSrc.alpha = sBerryBlenderData->arrowPos;
+
+ *dest = affineSrc;
+}
+
+u16 GetBlenderArrowPosition(void)
+{
+ return sBerryBlenderData->arrowPos;
+}
+
+static void sub_8082D28(void)
+{
+ u8 playerId = 0;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ playerId = GetMultiplayerId();
+
+ if (gWirelessCommType && gReceivedRemoteLinkPlayers != 0)
+ {
+ if (playerId == 0)
+ {
+ sBerryBlenderData->arrowPos += sBerryBlenderData->field_4C;
+ gSendCmd[5] = sBerryBlenderData->field_116;
+ gSendCmd[6] = sBerryBlenderData->arrowPos;
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ }
+ else
+ {
+ if ((gRecvCmds[0][0] & 0xFF00) == 0x4400)
+ {
+ sBerryBlenderData->field_116 = gRecvCmds[0][5];
+ sBerryBlenderData->arrowPos = gRecvCmds[0][6];
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ }
+ }
+ }
+ else
+ {
+ sBerryBlenderData->arrowPos += sBerryBlenderData->field_4C;
+ sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
+ }
+}
+
+static void BerryBlender_SetBackgroundsPos(void)
+{
+ SetGpuReg(REG_OFFSET_BG1HOFS, sBerryBlenderData->bg_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, sBerryBlenderData->bg_Y);
+
+ SetGpuReg(REG_OFFSET_BG0HOFS, sBerryBlenderData->bg_X);
+ SetGpuReg(REG_OFFSET_BG0VOFS, sBerryBlenderData->bg_Y);
+}
+
+static void sub_8082E3C(struct Sprite* sprite)
+{
+ sprite->data[2] += sprite->data[0];
+ sprite->data[3] += sprite->data[1];
+ sprite->pos2.x = sprite->data[2] / 8;
+ sprite->pos2.y = sprite->data[3] / 8;
+
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+static void sub_8082E84(void)
+{
+ s32 limit = (Random() % 2) + 1;
+ s32 i;
+
+ for (i = 0; i < limit; i++)
+ {
+ u16 rand;
+ s32 x, y;
+ u8 spriteId;
+
+ rand = sBerryBlenderData->arrowPos + (Random() % 20);
+
+ x = gSineTable[(rand & 0xFF) + 64] / 4;
+ y = gSineTable[(rand & 0xFF)] / 4;
+
+ spriteId = CreateSprite(&sUnknown_08339BE0, x + 120, y + 80, 1);
+ gSprites[spriteId].data[0] = 16 - (Random() % 32);
+ gSprites[spriteId].data[1] = 16 - (Random() % 32);
+
+ gSprites[spriteId].callback = sub_8082E3C;
+ }
+}
+
+static void sub_8082F68(struct Sprite* sprite)
+{
+ sprite->data[0]++;
+ sprite->pos2.y = -(sprite->data[0] / 3);
+
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+static void sub_8082F9C(struct Sprite* sprite)
+{
+ sprite->data[0]++;
+ sprite->pos2.y = -(sprite->data[0] * 2);
+
+ if (sprite->pos2.y < -12)
+ sprite->pos2.y = -12;
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+}
+
+static void Blender_SetBankBerryData(u8 bank, u16 itemId)
+{
+ sBerryBlenderData->chosenItemId[bank] = itemId;
+ Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[bank], itemId);
+}
+
+static void sub_8083010(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] += 8;
+ if (sprite->data[1] > 88)
+ {
+ sprite->data[1] = 88;
+ sprite->data[0]++;
+ PlaySE(SE_KON);
+ }
+ break;
+ case 1:
+ sprite->data[2] += 1;
+ if (sprite->data[2] > 20)
+ {
+ sprite->data[0]++;
+ sprite->data[2] = 0;
+ }
+ break;
+ case 2:
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 176)
+ {
+ if (++sprite->data[3] == 3)
+ {
+ DestroySprite(sprite);
+ CreateSprite(&sUnknown_08339C60, 120, -20, 2);
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ sprite->data[1] = -16;
+ StartSpriteAnim(sprite, sprite->data[3]);
+ }
+ }
+ break;
+ }
+
+ sprite->pos2.y = sprite->data[1];
+}
+
+static void sub_80830C0(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] += 8;
+ if (sprite->data[1] > 92)
+ {
+ sprite->data[1] = 92;
+ sprite->data[0]++;
+ PlaySE(SE_PIN);
+ }
+ break;
+ case 1:
+ sprite->data[2] += 1;
+ if (sprite->data[2] > 20)
+ sprite->data[0]++;
+ break;
+ case 2:
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 176)
+ {
+ sBerryBlenderData->mainState++;
+ DestroySprite(sprite);
+ }
+ break;
+ }
+
+ sprite->pos2.y = sprite->data[1];
+}
+
+static void sub_8083140(u16 a0, u16 a1)
+{
+ if (sBerryBlenderData->field_118 < a0)
+ {
+ sBerryBlenderData->field_118 += 2;
+ sub_8083170(sBerryBlenderData->field_118, a1);
+ }
+}
+
+static void sub_8083170(u16 a0, u16 a1)
+{
+ s32 var1, var2, var3, var4;
+ u16 *vram;
+
+ vram = (u16*)(VRAM + 0x6000);
+ var1 = (a0 * 64) / a1;
+ var2 = var1 / 8;
+ for (var4 = 0; var4 < var2; var4++)
+ {
+ vram[11 + var4] = 0x80E9;
+ vram[43 + var4] = 0x80F9;
+ }
+ var3 = var1 % 8;
+ if (var3 != 0)
+ {
+ vram[11 + var4] = var3 + 0x80E1;
+ vram[43 + var4] = var3 + 0x80F1;
+ var4++;
+ }
+ for (; var4 < 8; var4++)
+ {
+ vram[11 + var4] = 0x80E1;
+ vram[43 + var4] = 0x80F1;
+ }
+}
+
+static u32 sub_8083210(u16 a0)
+{
+ return 0x57E40 * a0 / 0x10000;
+}
+
+static void sub_8083230(u16 a0)
+{
+ u8 i;
+ u8 palAdders[5];
+
+ u32 var = sub_8083210(a0);
+ if (sBerryBlenderData->max_RPM < var)
+ sBerryBlenderData->max_RPM = var;
+ for (i = 0; i < 5; i++)
+ {
+ palAdders[i] = var % 10;
+ var /= 10;
+ }
+ *((u16*)(VRAM + 0x6458)) = palAdders[4] + 0x8072;
+ *((u16*)(VRAM + 0x645A)) = palAdders[3] + 0x8072;
+ *((u16*)(VRAM + 0x645C)) = palAdders[2] + 0x8072;
+ *((u16*)(VRAM + 0x6460)) = palAdders[1] + 0x8072;
+ *((u16*)(VRAM + 0x6462)) = palAdders[0] + 0x8072;
+}
+
+static void sub_80832BC(s16* a0, u16 a1)
+{
+ if (*a0 == 0)
+ *a0 = (Random() % a1) - (a1 / 2);
+}
+
+static void sub_80832E8(s16* a0)
+{
+ if (*a0 < 0)
+ (*a0)++;
+ if (*a0 > 0)
+ (*a0)--;
+}
+
+static void sub_808330C(void)
+{
+ sub_80832E8(&sBerryBlenderData->bg_X);
+ sub_80832E8(&sBerryBlenderData->bg_Y);
+}
+
+static void sub_8083334(s16* a0, u16 a1)
+{
+ s32 var;
+
+ if (a1 < 10)
+ var = 16;
+ else
+ var = 8;
+
+ if (*a0 == 0)
+ {
+ *a0 = (Random() % var) - (var / 2);
+ }
+ else
+ {
+ if (*a0 < 0)
+ (*a0)++;
+ if (*a0 > 0)
+ (*a0)--;
+ }
+}
+
+static bool8 sub_8083380(void)
+{
+ if (sBerryBlenderData->framesToWait == 0)
+ {
+ sBerryBlenderData->bg_X = 0;
+ sBerryBlenderData->bg_Y = 0;
+ }
+
+ sBerryBlenderData->framesToWait++;
+ sub_8083334(&sBerryBlenderData->bg_X, sBerryBlenderData->framesToWait);
+ sub_8083334(&sBerryBlenderData->bg_Y, sBerryBlenderData->framesToWait);
+
+ if (sBerryBlenderData->framesToWait == 20)
+ {
+ sBerryBlenderData->bg_X = 0;
+ sBerryBlenderData->bg_Y = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_80833F8(struct Sprite* sprite)
+{
+ sprite->pos2.x = -(sBerryBlenderData->bg_X);
+ sprite->pos2.y = -(sBerryBlenderData->bg_Y);
+}
+
+static void TryUpdateBerryBlenderRecord(void)
+{
+ if (gSaveBlock1Ptr->berryBlenderRecords[sBerryBlenderData->playersNo - 2] < sBerryBlenderData->max_RPM)
+ gSaveBlock1Ptr->berryBlenderRecords[sBerryBlenderData->playersNo - 2] = sBerryBlenderData->max_RPM;
+}
+
+static bool8 Blender_PrintBlendingResults(void)
+{
+ u16 i;
+ s32 xPos, yPos;
+
+ struct Pokeblock pokeblock;
+ u8 flavors[6];
+ u8 text[40];
+ u16 berryIds[4]; // unused
+
+ switch (sBerryBlenderData->mainState)
+ {
+ case 0:
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->framesToWait = 17;
+ break;
+ case 1:
+ sBerryBlenderData->framesToWait -= 10;
+ if (sBerryBlenderData->framesToWait < 0)
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 2:
+ if (++sBerryBlenderData->framesToWait > 20)
+ {
+ for (i = 0; i < BLENDER_SCORES_NO; i++)
+ DestroySprite(&gSprites[sBerryBlenderData->scoreIconIds[i]]);
+
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 3:
+ {
+ u16 minutes, seconds;
+ u8 *txtPtr;
+
+ xPos = GetStringCenterAlignXOffset(1, sText_BlendingResults, 0xA8);
+ Blender_AddTextPrinter(5, sText_BlendingResults, xPos, 1, TEXT_SPEED_FF, 0);
+
+ if (sBerryBlenderData->playersNo == 4)
+ yPos = 17;
+ else
+ yPos = 21;
+
+ for (i = 0; i < sBerryBlenderData->playersNo; yPos += 16, i++)
+ {
+ u8 place = sBerryBlenderData->playerPlaces[i];
+
+ ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1);
+ StringAppend(sBerryBlenderData->stringVar, sText_Dot);
+ StringAppend(sBerryBlenderData->stringVar, gText_Space);
+ StringAppend(sBerryBlenderData->stringVar, gLinkPlayers[place].name);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 8, yPos, TEXT_SPEED_FF, 3);
+
+ StringCopy(sBerryBlenderData->stringVar, sBerryBlenderData->blendedBerries[place].name);
+ ConvertInternationalString(sBerryBlenderData->stringVar, gLinkPlayers[place].language);
+ StringAppend(sBerryBlenderData->stringVar, sText_SpaceBerry);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x54, yPos, TEXT_SPEED_FF, 3);
+ }
+
+ Blender_AddTextPrinter(5, sText_MaximumSpeed, 0, 0x51, TEXT_SPEED_FF, 3);
+ ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->max_RPM / 100, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ StringAppend(sBerryBlenderData->stringVar, sText_Dot);
+
+ ConvertIntToDecimalStringN(text, sBerryBlenderData->max_RPM % 100, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(sBerryBlenderData->stringVar, text);
+ StringAppend(sBerryBlenderData->stringVar, sText_RPM);
+
+ xPos = GetStringRightAlignXOffset(1, sBerryBlenderData->stringVar, 0xA8);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, xPos, 0x51, TEXT_SPEED_FF, 3);
+ Blender_AddTextPrinter(5, sText_Time, 0, 0x61, TEXT_SPEED_FF, 3);
+
+ seconds = (sBerryBlenderData->gameFrameTime / 60) % 60;
+ minutes = (sBerryBlenderData->gameFrameTime / (60 * 60));
+
+ ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, minutes, STR_CONV_MODE_LEADING_ZEROS, 2);
+ txtPtr = StringAppend(sBerryBlenderData->stringVar, sText_Min);
+
+ ConvertIntToDecimalStringN(txtPtr, seconds, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(sBerryBlenderData->stringVar, sText_Sec);
+
+ xPos = GetStringRightAlignXOffset(1, sBerryBlenderData->stringVar, 0xA8);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, xPos, 0x61, TEXT_SPEED_FF, 3);
+
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+
+ CopyWindowToVram(5, 2);
+ }
+ break;
+ case 4:
+ if (gMain.newKeys & A_BUTTON)
+ sBerryBlenderData->mainState++;
+ break;
+ case 5:
+ sub_8198070(5, 1);
+
+ for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
+ {
+ if (sBerryBlenderData->chosenItemId[i] != 0)
+ berryIds[i] = sBerryBlenderData->chosenItemId[i] - FIRST_BERRY_INDEX;
+ if (sBerryBlenderData->field_8E[i] != 0xFF)
+ {
+ PutWindowTilemap(i);
+ CopyWindowToVram(i, 3);
+ }
+ }
+
+ sub_8081E20();
+
+ Blender_CalculatePokeblock(sBerryBlenderData->blendedBerries, &pokeblock, sBerryBlenderData->playersNo, flavors, sBerryBlenderData->max_RPM);
+ Blender_PrintMadePokeblockString(&pokeblock, sBerryBlenderData->stringVar);
+ TryAddContestLinkTvShow(&pokeblock, &sBerryBlenderData->tvBlender);
+
+ CreateTask(sub_8083F3C, 6);
+ sub_80EECEC();
+
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ AddPokeblock(&pokeblock);
+
+ sBerryBlenderData->textState = 0;
+ sBerryBlenderData->mainState++;
+ break;
+ case 6:
+ if (Blender_PrintText(&sBerryBlenderData->textState, sBerryBlenderData->stringVar, GetPlayerTextSpeed()))
+ {
+ TryUpdateBerryBlenderRecord();
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst)
+{
+ u8 text[12];
+ u8 flavorLvl, feel;
+
+ dst[0] = EOS;
+ StringCopy(dst, gPokeblockNames[pokeblock->color]);
+ StringAppend(dst, sText_WasMade);
+ StringAppend(dst, sText_NewLine);
+
+ flavorLvl = GetHighestPokeblocksFlavorLevel(pokeblock);
+ feel = GetPokeblocksFeel(pokeblock);
+
+ StringAppend(dst, sText_TheLevelIs);
+ ConvertIntToDecimalStringN(text, flavorLvl, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringAppend(dst, text);
+
+ StringAppend(dst, sText_TheFeelIs);
+ ConvertIntToDecimalStringN(text, feel, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringAppend(dst, text);
+
+ StringAppend(dst, sText_Dot2);
+ StringAppend(dst, sText_NewParagraph);
+}
+
+static void Blender_SortBasedOnPoints(u8 *places, u8 playersNum, u32 *scores)
+{
+ s32 i, j;
+
+ for (i = 0; i < playersNum; i++)
+ {
+ for (j = 0; j < playersNum; j++)
+ {
+ if (scores[places[i]] > scores[places[j]])
+ {
+ u8 temp = places[i];
+ places[i] = places[j];
+ places[j] = temp;
+ }
+ }
+ }
+}
+
+static void Blender_SortScores(void)
+{
+ u8 playerId;
+ u8 i;
+ u8 places[BLENDER_MAX_PLAYERS];
+ u32 points[BLENDER_MAX_PLAYERS];
+
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ places[i] = i;
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ {
+ points[i] = 1000000 * sBerryBlenderData->scores[i][BLENDER_SCORE_BEST];
+ points[i] += 1000 * sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD];
+ points[i] += 1000 - sBerryBlenderData->scores[i][BLENDER_SCORE_MISS];
+ }
+ Blender_SortBasedOnPoints(places, sBerryBlenderData->playersNo, points);
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ sBerryBlenderData->playerPlaces[i] = places[i];
+
+ if (gReceivedRemoteLinkPlayers == 0)
+ playerId = 0;
+ else
+ playerId = GetMultiplayerId();
+
+ for (i = 0; i < sBerryBlenderData->playersNo; i++)
+ {
+ if (sBerryBlenderData->playerPlaces[i] == playerId)
+ sBerryBlenderData->field_1A4 = i;
+ }
+}
+
+static bool8 Blender_PrintBlendingRanking(void)
+{
+ u16 i;
+ s32 xPos, yPos;
+
+ switch (sBerryBlenderData->mainState)
+ {
+ case 0:
+ sBerryBlenderData->mainState++;
+ sBerryBlenderData->framesToWait = 255;
+ break;
+ case 1:
+ sBerryBlenderData->framesToWait -= 10;
+ if (sBerryBlenderData->framesToWait < 0)
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 2:
+ if (++sBerryBlenderData->framesToWait > 20)
+ {
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 3:
+ SetWindowBorderStyle(5, 0, 1, 0xD);
+ xPos = GetStringCenterAlignXOffset(1, sText_Ranking, 0xA8);
+ Blender_AddTextPrinter(5, sText_Ranking, xPos, 1, TEXT_SPEED_FF, 0);
+
+ sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST] = CreateSprite(&sUnknown_08339B40, 128, 52, 0);
+ StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST]], 3);
+ gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST]].callback = SpriteCallbackDummy;
+
+ sBerryBlenderData->scoreIconIds[BLENDER_SCORE_GOOD] = CreateSprite(&sUnknown_08339B40, 160, 52, 0);
+ gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_GOOD]].callback = SpriteCallbackDummy;
+
+ sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS] = CreateSprite(&sUnknown_08339B40, 192, 52, 0);
+ StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS]], 1);
+ gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS]].callback = SpriteCallbackDummy;
+
+ Blender_SortScores();
+
+ for (yPos = 0x29, i = 0; i < sBerryBlenderData->playersNo; yPos += 0x10, i++)
+ {
+ u8 place = sBerryBlenderData->playerPlaces[i];
+
+ ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1);
+ StringAppend(sBerryBlenderData->stringVar, sText_Dot);
+ StringAppend(sBerryBlenderData->stringVar, gText_Space);
+ StringAppend(sBerryBlenderData->stringVar, gLinkPlayers[place].name);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0, yPos, TEXT_SPEED_FF, 3);
+
+ ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_BEST], STR_CONV_MODE_RIGHT_ALIGN, 3);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x4E, yPos, TEXT_SPEED_FF, 3);
+
+ ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_GOOD], STR_CONV_MODE_RIGHT_ALIGN, 3);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x6E, yPos, TEXT_SPEED_FF, 3);
+
+ ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_MISS], STR_CONV_MODE_RIGHT_ALIGN, 3);
+ Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x8E, yPos, TEXT_SPEED_FF, 3);
+ }
+
+ PutWindowTilemap(5);
+ CopyWindowToVram(5, 3);
+
+ sBerryBlenderData->framesToWait = 0;
+ sBerryBlenderData->mainState++;
+ break;
+ case 4:
+ if (++sBerryBlenderData->framesToWait > 20)
+ sBerryBlenderData->mainState++;
+ break;
+ case 5:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sBerryBlenderData->mainState++;
+ }
+ break;
+ case 6:
+ sBerryBlenderData->mainState = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void ShowBerryBlenderRecordWindow(void)
+{
+ s32 i;
+ s32 xPos, yPos;
+ struct WindowTemplate winTemplate;
+ u8 text[32];
+
+ winTemplate = sBlenderRecordWindowTemplate;
+ gRecordsWindowId = AddWindow(&winTemplate);
+ NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, 0);
+ FillWindowPixelBuffer(gRecordsWindowId, 0x11);
+
+ xPos = GetStringCenterAlignXOffset(1, gText_BlenderMaxSpeedRecord, 0x90);
+ PrintTextOnWindow(gRecordsWindowId, 1, gText_BlenderMaxSpeedRecord, xPos, 1, 0, NULL);
+ PrintTextOnWindow(gRecordsWindowId, 1, gText_234Players, 4, 0x29, 0, NULL);
+
+ for (i = 0, yPos = 0x29; i < BLENDER_SCORES_NO; i++)
+ {
+ u8 *txtPtr;
+ u32 record;
+
+ record = gSaveBlock1Ptr->berryBlenderRecords[i];
+
+ txtPtr = ConvertIntToDecimalStringN(text, record / 100, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ txtPtr = StringAppend(txtPtr, sText_Dot);
+ txtPtr = ConvertIntToDecimalStringN(txtPtr, record % 100, STR_CONV_MODE_LEADING_ZEROS, 2);
+ txtPtr = StringAppend(txtPtr, sText_RPM);
+
+ xPos = GetStringRightAlignXOffset(1, text, 0x8C);
+ PrintTextOnWindow(gRecordsWindowId, 1, text, xPos, yPos + (i * 16), 0, NULL);
+ }
+
+ PutWindowTilemap(gRecordsWindowId);
+ CopyWindowToVram(gRecordsWindowId, 3);
+}
+
+static void sub_8083F3C(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ PlayFanfare(MUS_FANFA1);
+ gTasks[taskId].data[0]++;
+ }
+ if (IsFanfareTaskInactive())
+ {
+ PlayBGM(sBerryBlenderData->field_154);
+ DestroyTask(taskId);
+ }
+}
+
+static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlenderStruct *tvBlender)
+{
+ u8 flavorLevel = GetHighestPokeblocksFlavorLevel(pokeblock);
+ u16 sheen = (flavorLevel * 10) / GetPokeblocksFeel(pokeblock);
+
+ tvBlender->pokeblockSheen = sheen;
+ tvBlender->pokeblockColor = pokeblock->color;
+ tvBlender->name[0] = EOS;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (sBerryBlenderData->field_1A4 == 0 && sheen > 20)
+ {
+ StringCopy(tvBlender->name, gLinkPlayers[sBerryBlenderData->playerPlaces[sBerryBlenderData->playersNo - 1]].name);
+ tvBlender->pokeblockFlavor = GetPokeblocksFlavor(pokeblock);
+ if (Put3CheersForPokeblocksOnTheAir(tvBlender->name, tvBlender->pokeblockFlavor,
+ tvBlender->pokeblockColor, tvBlender->pokeblockSheen,
+ gLinkPlayers[sBerryBlenderData->playerPlaces[sBerryBlenderData->playersNo - 1]].language))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+ else if (sBerryBlenderData->field_1A4 == sBerryBlenderData->playersNo - 1 && sheen <= 20)
+ {
+ StringCopy(tvBlender->name, gLinkPlayers[sBerryBlenderData->playerPlaces[0]].name);
+ tvBlender->pokeblockFlavor = GetPokeblocksFlavor(pokeblock);
+ if (Put3CheersForPokeblocksOnTheAir(tvBlender->name, tvBlender->pokeblockFlavor,
+ tvBlender->pokeblockColor, tvBlender->pokeblockSheen,
+ gLinkPlayers[sBerryBlenderData->playerPlaces[0]].language))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s32 speed, s32 caseId)
+{
+ u8 txtColor[3];
+ u32 letterSpacing = 0;
+
+ switch (caseId)
+ {
+ case 0:
+ case 3:
+ txtColor[0] = 1;
+ txtColor[1] = 2;
+ txtColor[2] = 3;
+ break;
+ case 1:
+ txtColor[0] = 0;
+ txtColor[1] = 2;
+ txtColor[2] = 3;
+ break;
+ case 2:
+ txtColor[0] = 0;
+ txtColor[1] = 4;
+ txtColor[2] = 5;
+ break;
+ }
+
+ if (caseId != 3)
+ {
+ FillWindowPixelBuffer(windowId, txtColor[0] | (txtColor[0] << 4));
+ }
+
+ AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, 1, txtColor, speed, string);
+}
+
+static bool32 Blender_PrintText(s16 *textState, const u8 *string, s32 textSpeed)
+{
+ switch (*textState)
+ {
+ case 0:
+ sub_8197B1C(4, FALSE, 0x14, 0xF);
+ Blender_AddTextPrinter(4, string, 0, 1, textSpeed, 0);
+ PutWindowTilemap(4);
+ CopyWindowToVram(4, 3);
+ (*textState)++;
+ break;
+ case 1:
+ if (!IsTextPrinterActive(4))
+ {
+ *textState = 0;
+ return TRUE;
+ }
+ break;
+ }
-// .text
+ return FALSE;
+}
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
index eca20af9d..f6a5895a9 100644
--- a/src/berry_fix_program.c
+++ b/src/berry_fix_program.c
@@ -1,5 +1,3 @@
-
-// Includes
#include "global.h"
#include "gpu_regs.h"
#include "multiboot.h"
@@ -8,8 +6,9 @@
#include "main.h"
#include "sprite.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "window.h"
+#include "text.h"
#include "menu.h"
#include "m4a.h"
@@ -36,9 +35,9 @@ static void berry_fix_bg_hide(void);
// .rodata
-static const u8 gUnknown_08617E78[] = _("Berry Program Update");
-static const u8 gUnknown_08617E8D[] = _("Ruby/Sapphire");
-static const u8 gUnknown_08617E9B[] = _("Emerald");
+static const u8 sUnknown_08617E78[] = _("Berry Program Update");
+static const u8 sUnknown_08617E8D[] = _("Ruby/Sapphire");
+static const u8 sUnknown_08617E9B[] = _("Emerald");
static const u8 Unknown_08617EA3[] = _("The Berry Program on your POKéMON\nRuby/Sapphire Game Pak will be updated.\n{COLOR RED}{SHADOW LIGHT_RED}Press the A Button.");
static const u8 Unknown_08617F07[] = _("Please ensure the connection of your\nGame Boy Advance system matches this.\n{COLOR RED}{SHADOW LIGHT_RED}YES: Press the A Button.\nNO: Turn off the power and try again.");
@@ -63,15 +62,15 @@ static const struct WindowTemplate gUnknown_08618110[] = {
{-1}
};
-static const u16 gUnknown_08618138[] = {
+static const u16 sUnknown_08618138[] = {
0x7fff, 0x7fff, 0x318c, 0x675a,
0x043c, 0x3aff, 0x0664, 0x4bd2,
0x6546, 0x7b14, 0x7fff, 0x318c,
0x675a, 0x0000, 0x0000, 0x0000
};
-static const u8 gUnknown_08618158[] = {10, 11, 12};
-static const u8 gUnknown_0861815B[] = { 0, 10, 13};
+static const u8 sUnknown_08618158[] = {10, 11, 12};
+static const u8 sUnknown_0861815B[] = { 0, 10, 13};
static const u8 *const gUnknown_08618160[] = {
Unknown_08617F07,
@@ -82,50 +81,50 @@ static const u8 *const gUnknown_08618160[] = {
Unknown_08617EA3
};
-extern const u8 gUnknown_08DD87C0[];
-extern const u8 gUnknown_08DD8EE0[];
-extern const u8 gUnknown_08DD8780[];
-extern const u8 gUnknown_08DD90E0[];
-extern const u8 gUnknown_08DD9718[];
-extern const u8 gUnknown_08DD9080[];
-extern const u8 gUnknown_08DD98B4[];
-extern const u8 gUnknown_08DD9E58[];
-extern const u8 gUnknown_08DD9874[];
-extern const u8 gUnknown_08DDA02C[];
-extern const u8 gUnknown_08DDA63C[];
-extern const u8 gUnknown_08DD9FEC[];
-extern const u8 gUnknown_08DDA840[];
-extern const u8 gUnknown_08DDAE40[];
-extern const u8 gUnknown_08DDA800[];
-extern const u8 gUnknown_08DDB020[];
-extern const u8 gUnknown_08DDB2C4[];
-extern const u8 gUnknown_08DDAFE0[];
+extern const u8 gBerryFixGameboy_Gfx[];
+extern const u8 gBerryFixGameboy_Tilemap[];
+extern const u8 gBerryFixGameboy_Pal[];
+extern const u8 gBerryFixGameboyLogo_Gfx[];
+extern const u8 gBerryFixGameboyLogo_Tilemap[];
+extern const u8 gBerryFixGameboyLogo_Pal[];
+extern const u8 gBerryFixGbaTransfer_Gfx[];
+extern const u8 gBerryFixGbaTransfer_Tilemap[];
+extern const u8 gBerryFixGbaTransfer_Pal[];
+extern const u8 gBerryFixGbaTransferHighlight_Gfx[];
+extern const u8 gBerryFixGbaTransferHighlight_Tilemap[];
+extern const u8 gBerryFixGbaTransferHighlight_Pal[];
+extern const u8 gBerryFixGbaTransferError_Gfx[];
+extern const u8 gBerryFixGbaTransferError_Tilemap[];
+extern const u8 gBerryFixGbaTransferError_Pal[];
+extern const u8 gBerryFixWindow_Gfx[];
+extern const u8 gBerryFixWindow_Tilemap[];
+extern const u8 gBerryFixWindow_Pal[];
static const u8 *const gUnknown_08618178[][3] = {
{
- gUnknown_08DD87C0,
- gUnknown_08DD8EE0,
- gUnknown_08DD8780
+ gBerryFixGameboy_Gfx,
+ gBerryFixGameboy_Tilemap,
+ gBerryFixGameboy_Pal
}, {
- gUnknown_08DD90E0,
- gUnknown_08DD9718,
- gUnknown_08DD9080
+ gBerryFixGameboyLogo_Gfx,
+ gBerryFixGameboyLogo_Tilemap,
+ gBerryFixGameboyLogo_Pal
}, {
- gUnknown_08DD98B4,
- gUnknown_08DD9E58,
- gUnknown_08DD9874
+ gBerryFixGbaTransfer_Gfx,
+ gBerryFixGbaTransfer_Tilemap,
+ gBerryFixGbaTransfer_Pal
}, {
- gUnknown_08DDA02C,
- gUnknown_08DDA63C,
- gUnknown_08DD9FEC
+ gBerryFixGbaTransferHighlight_Gfx,
+ gBerryFixGbaTransferHighlight_Tilemap,
+ gBerryFixGbaTransferHighlight_Pal
}, {
- gUnknown_08DDA840,
- gUnknown_08DDAE40,
- gUnknown_08DDA800
+ gBerryFixGbaTransferError_Gfx,
+ gBerryFixGbaTransferError_Tilemap,
+ gBerryFixGbaTransferError_Pal
}, {
- gUnknown_08DDB020,
- gUnknown_08DDB2C4,
- gUnknown_08DDAFE0
+ gBerryFixWindow_Gfx,
+ gBerryFixWindow_Tilemap,
+ gBerryFixWindow_Pal
},
};
@@ -134,7 +133,7 @@ extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
// .text
-void InitBerryFixProgram(void)
+void CB2_InitBerryFixProgram(void)
{
DisableInterrupts(0xFFFF);
EnableInterrupts(0x0001);
@@ -142,7 +141,7 @@ void InitBerryFixProgram(void)
SetVBlankCallback(NULL);
ResetSpriteData();
ResetTasks();
- remove_some_task();
+ ScanlineEffect_Stop();
SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
berry_fix_mb_manager = AllocZeroed(0x50);
berry_fix_mb_manager->state = 0;
@@ -218,10 +217,9 @@ static void berry_fix_main(void)
}
}
-#ifdef NONMATCHING
static void berry_fix_gpu_set(void)
{
- s32 width;
+ s32 width, left;
SetGpuReg(REG_OFFSET_BG0CNT, 0x0000);
SetGpuReg(REG_OFFSET_BG1CNT, 0x0000);
@@ -244,236 +242,33 @@ static void berry_fix_gpu_set(void)
InitWindows(gUnknown_08618110);
DeactivateAllTextPrinters();
- DmaCopy32(3, gUnknown_08618138, BG_PLTT + 0x1E0, 0x20);
+ DmaCopy32(3, sUnknown_08618138, BG_PLTT + 0x1E0, 0x20);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP);
FillWindowPixelBuffer(2, 0);
FillWindowPixelBuffer(3, 0);
FillWindowPixelBuffer(0, 0xAA);
-// This block is a meme among memes
- width = (0x78 - GetStringWidth(0, gUnknown_08617E9B, 0)) / 2;
- box_print(2, 0, width, 3, gUnknown_0861815B, -1, gUnknown_08617E9B);
- width = (s32)(0x78 - GetStringWidth(0, gUnknown_08617E9B, 0)) / 2 + 0x78;
- box_print(2, 0, width, 3, gUnknown_0861815B, -1, gUnknown_08617E8D);
- width = (0x70 - GetStringWidth(0, gUnknown_08617E8D, 0)) / 2;
- box_print(3, 0, width, 0, gUnknown_0861815B, -1, gUnknown_08617E8D);
- width = (0xd0 - GetStringWidth(1, gUnknown_08617E78, 0)) / 2;
- box_print(0, 1, width, 2, gUnknown_08618158, -1, gUnknown_08617E78);
+ width = GetStringWidth(0, sUnknown_08617E9B, 0);
+ left = (0x78 - width) / 2;
+ box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E9B);
+
+ width = GetStringWidth(0, sUnknown_08617E8D, 0);
+ left = (0x78 - width) / 2 + 0x78;
+ box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D);
+
+ width = GetStringWidth(0, sUnknown_08617E8D, 0);
+ left = (0x70 - width) / 2;
+ box_print(3, 0, left, 0, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D);
+
+ width = GetStringWidth(1, sUnknown_08617E78, 0);
+ left = (0xD0 - width) / 2;
+ box_print(0, 1, left, 2, sUnknown_08618158, TEXT_SPEED_FF, sUnknown_08617E78);
CopyWindowToVram(2, 2);
CopyWindowToVram(3, 2);
CopyWindowToVram(0, 2);
}
-#else
-__attribute__((naked)) static void berry_fix_gpu_set(void)
-{
- asm(".syntax unified\n"
- "\tpush {r4-r6,lr}\n"
- "\tmov r6, r8\n"
- "\tpush {r6}\n"
- "\tsub sp, 0x10\n"
- "\tmovs r0, 0x8\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0xA\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x10\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x12\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x14\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x16\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x50\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tmovs r1, 0\n"
- "\tstr r1, [sp, 0xC]\n"
- "\tldr r4, =0x040000d4\n"
- "\tadd r0, sp, 0xC\n"
- "\tstr r0, [r4]\n"
- "\tmovs r0, 0xC0\n"
- "\tlsls r0, 19\n"
- "\tstr r0, [r4, 0x4]\n"
- "\tldr r0, =0x85006000\n"
- "\tstr r0, [r4, 0x8]\n"
- "\tldr r0, [r4, 0x8]\n"
- "\tstr r1, [sp, 0xC]\n"
- "\tadd r0, sp, 0xC\n"
- "\tstr r0, [r4]\n"
- "\tmovs r0, 0xE0\n"
- "\tlsls r0, 19\n"
- "\tstr r0, [r4, 0x4]\n"
- "\tldr r2, =0x85000100\n"
- "\tstr r2, [r4, 0x8]\n"
- "\tldr r0, [r4, 0x8]\n"
- "\tstr r1, [sp, 0xC]\n"
- "\tadd r0, sp, 0xC\n"
- "\tstr r0, [r4]\n"
- "\tmovs r0, 0xA0\n"
- "\tlsls r0, 19\n"
- "\tstr r0, [r4, 0x4]\n"
- "\tstr r2, [r4, 0x8]\n"
- "\tldr r0, [r4, 0x8]\n"
- "\tmovs r0, 0\n"
- "\tbl ResetBgsAndClearDma3BusyFlags\n"
- "\tldr r1, =gUnknown_08618108\n"
- "\tmovs r0, 0\n"
- "\tmovs r2, 0x2\n"
- "\tbl InitBgsFromTemplates\n"
- "\tmovs r0, 0\n"
- "\tmovs r1, 0\n"
- "\tmovs r2, 0\n"
- "\tbl ChangeBgX\n"
- "\tmovs r0, 0\n"
- "\tmovs r1, 0\n"
- "\tmovs r2, 0\n"
- "\tbl ChangeBgY\n"
- "\tmovs r0, 0x1\n"
- "\tmovs r1, 0\n"
- "\tmovs r2, 0\n"
- "\tbl ChangeBgX\n"
- "\tmovs r0, 0x1\n"
- "\tmovs r1, 0\n"
- "\tmovs r2, 0\n"
- "\tbl ChangeBgY\n"
- "\tldr r0, =gUnknown_08618110\n"
- "\tbl InitWindows\n"
- "\tbl DeactivateAllTextPrinters\n"
- "\tldr r0, =gUnknown_08618138\n"
- "\tstr r0, [r4]\n"
- "\tldr r0, =0x050001e0\n"
- "\tstr r0, [r4, 0x4]\n"
- "\tldr r0, =0x84000008\n"
- "\tstr r0, [r4, 0x8]\n"
- "\tldr r0, [r4, 0x8]\n"
- "\tmovs r0, 0\n"
- "\tmovs r1, 0x40\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x2\n"
- "\tmovs r1, 0\n"
- "\tbl FillWindowPixelBuffer\n"
- "\tmovs r0, 0x3\n"
- "\tmovs r1, 0\n"
- "\tbl FillWindowPixelBuffer\n"
- "\tmovs r0, 0\n"
- "\tmovs r1, 0xAA\n"
- "\tbl FillWindowPixelBuffer\n"
- "\tldr r5, =gUnknown_08617E9B\n"
- "\tmovs r0, 0\n"
- "\tadds r1, r5, 0\n"
- "\tmovs r2, 0\n"
- "\tbl GetStringWidth\n"
- "\tadds r1, r0, 0\n"
- "\tmovs r4, 0x78\n"
- "\tsubs r0, r4, r1\n"
- "\tlsrs r1, r0, 31\n"
- "\tadds r0, r1\n"
- "\tasrs r0, 1\n"
- "\tlsls r2, r0, 24\n"
- "\tlsrs r2, 24\n"
- "\tldr r6, =gUnknown_0861815B\n"
- "\tstr r6, [sp]\n"
- "\tmovs r0, 0x1\n"
- "\tnegs r0, r0\n"
- "\tmov r8, r0\n"
- "\tstr r0, [sp, 0x4]\n"
- "\tstr r5, [sp, 0x8]\n"
- "\tmovs r0, 0x2\n"
- "\tmovs r1, 0\n"
- "\tmovs r3, 0x3\n"
- "\tbl box_print\n"
- "\tldr r5, =gUnknown_08617E8D\n"
- "\tmovs r0, 0\n"
- "\tadds r1, r5, 0\n"
- "\tmovs r2, 0\n"
- "\tbl GetStringWidth\n"
- "\tadds r1, r0, 0\n"
- "\tsubs r4, r1\n"
- "\tlsrs r0, r4, 31\n"
- "\tadds r4, r0\n"
- "\tasrs r4, 1\n"
- "\tadds r0, r4, 0\n"
- "\tadds r0, 0x78\n"
- "\tlsls r2, r0, 24\n"
- "\tlsrs r2, 24\n"
- "\tstr r6, [sp]\n"
- "\tmov r0, r8\n"
- "\tstr r0, [sp, 0x4]\n"
- "\tstr r5, [sp, 0x8]\n"
- "\tmovs r0, 0x2\n"
- "\tmovs r1, 0\n"
- "\tmovs r3, 0x3\n"
- "\tbl box_print\n"
- "\tmovs r0, 0\n"
- "\tadds r1, r5, 0\n"
- "\tmovs r2, 0\n"
- "\tbl GetStringWidth\n"
- "\tadds r1, r0, 0\n"
- "\tmovs r0, 0x70\n"
- "\tsubs r0, r1\n"
- "\tlsrs r1, r0, 31\n"
- "\tadds r0, r1\n"
- "\tasrs r0, 1\n"
- "\tlsls r2, r0, 24\n"
- "\tlsrs r2, 24\n"
- "\tstr r6, [sp]\n"
- "\tmov r0, r8\n"
- "\tstr r0, [sp, 0x4]\n"
- "\tstr r5, [sp, 0x8]\n"
- "\tmovs r0, 0x3\n"
- "\tmovs r1, 0\n"
- "\tmovs r3, 0\n"
- "\tbl box_print\n"
- "\tldr r4, =gUnknown_08617E78\n"
- "\tmovs r0, 0x1\n"
- "\tadds r1, r4, 0\n"
- "\tmovs r2, 0\n"
- "\tbl GetStringWidth\n"
- "\tadds r1, r0, 0\n"
- "\tmovs r0, 0xD0\n"
- "\tsubs r0, r1\n"
- "\tlsrs r1, r0, 31\n"
- "\tadds r0, r1\n"
- "\tasrs r0, 1\n"
- "\tlsls r2, r0, 24\n"
- "\tlsrs r2, 24\n"
- "\tldr r0, =gUnknown_08618158\n"
- "\tstr r0, [sp]\n"
- "\tmov r0, r8\n"
- "\tstr r0, [sp, 0x4]\n"
- "\tstr r4, [sp, 0x8]\n"
- "\tmovs r0, 0\n"
- "\tmovs r1, 0x1\n"
- "\tmovs r3, 0x2\n"
- "\tbl box_print\n"
- "\tmovs r0, 0x2\n"
- "\tmovs r1, 0x2\n"
- "\tbl CopyWindowToVram\n"
- "\tmovs r0, 0x3\n"
- "\tmovs r1, 0x2\n"
- "\tbl CopyWindowToVram\n"
- "\tmovs r0, 0\n"
- "\tmovs r1, 0x2\n"
- "\tbl CopyWindowToVram\n"
- "\tadd sp, 0x10\n"
- "\tpop {r3}\n"
- "\tmov r8, r3\n"
- "\tpop {r4-r6}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.pool\n"
- ".syntax divided");
-}
-#endif
-
static int berry_fix_text_update(int checkval)
{
if (berry_fix_mb_manager->unk1 == checkval)
@@ -497,7 +292,7 @@ static void berry_fix_text_print(int scene)
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
FillWindowPixelBuffer(1, 0xAA);
- box_print(1, 1, 0, 0, gUnknown_08618158, -1, gUnknown_08618160[scene]);
+ box_print(1, 1, 0, 0, sUnknown_08618158, -1, gUnknown_08618160[scene]);
PutWindowTilemap(1);
CopyWindowToVram(1, 2);
switch (scene)
@@ -523,7 +318,7 @@ static void berry_fix_text_print(int scene)
ShowBg(1);
}
-static void berry_fix_bg_hide()
+static void berry_fix_bg_hide(void)
{
HideBg(0);
HideBg(1);
diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c
new file mode 100644
index 000000000..fb4bf6817
--- /dev/null
+++ b/src/berry_tag_screen.c
@@ -0,0 +1,653 @@
+#include "global.h"
+#include "berry_tag_screen.h"
+#include "berry.h"
+#include "decompress.h"
+#include "event_object_movement.h"
+#include "item_menu.h"
+#include "constants/items.h"
+#include "item.h"
+#include "item_use.h"
+#include "main.h"
+#include "menu.h"
+#include "text.h"
+#include "window.h"
+#include "task.h"
+#include "menu_helpers.h"
+#include "palette.h"
+#include "overworld.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "bg.h"
+#include "malloc.h"
+#include "scanline_effect.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "item_menu_icons.h"
+#include "decompress.h"
+#include "international_string_util.h"
+
+// There are 4 windows used in berry tag screen.
+enum
+{
+ WIN_BERRY_NAME,
+ WIN_SIZE_FIRM,
+ WIN_DESC,
+ WIN_BERRY_TAG
+};
+
+struct BerryTagScreenStruct
+{
+ u16 tilemapBuffers[3][0x400];
+ u16 berryId;
+ u8 berrySpriteId;
+ u8 flavorCircleIds[FLAVOR_COUNT];
+ u16 gfxState;
+};
+
+// EWRAM vars
+static EWRAM_DATA struct BerryTagScreenStruct *sBerryTag = NULL;
+
+// const rom data
+static const struct BgTemplate sBackgroundTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const u16 sFontPalette[] = INCBIN_U16("graphics/interface/berry_tag_screen.gbapal");
+
+static const u8 sTextColors[2][3] =
+{
+ {0, 2, 3},
+ {15, 14, 13}
+};
+
+static const struct WindowTemplate sWindowTemplates[] =
+{
+ {0x01, 0x0b, 0x04, 0x08, 0x02, 0x0f, 0x0045}, // WIN_BERRY_NAME
+ {0x01, 0x0b, 0x07, 0x12, 0x04, 0x0f, 0x0055}, // WIN_SIZE_FIRM
+ {0x01, 0x04, 0x0e, 0x19, 0x04, 0x0f, 0x009d}, // WIN_DESC
+ {0x00, 0x02, 0x00, 0x08, 0x02, 0x0f, 0x0101}, // WIN_BERRY_TAG
+ DUMMY_WIN_TEMPLATE
+};
+
+static const u8 *const sBerryFirmnessStrings[] =
+{
+ gBerryFirmnessString_VerySoft,
+ gBerryFirmnessString_Soft,
+ gBerryFirmnessString_Hard,
+ gBerryFirmnessString_VeryHard,
+ gBerryFirmnessString_SuperHard
+};
+
+// this file's functions
+static void CB2_InitBerryTagScreen(void);
+static void HandleInitBackgrounds(void);
+static void HandleInitWindows(void);
+static void AddBerryTagTextToBg0(void);
+static void PrintAllBerryData(void);
+static void CreateBerrySprite(void);
+static void CreateFlavorCircleSprites(void);
+static void SetFlavorCirclesVisiblity(void);
+static void PrintBerryNumberAndName(void);
+static void PrintBerrySize(void);
+static void PrintBerryFirmness(void);
+static void PrintBerryDescription1(void);
+static void PrintBerryDescription2(void);
+static bool8 InitBerryTagScreen(void);
+static bool8 LoadBerryTagGfx(void);
+static void Task_HandleInput(u8 taskId);
+static void Task_CloseBerryTagScreen(u8 taskId);
+static void Task_DisplayAnotherBerry(u8 taskId);
+static void TryChangeDisplayedBerry(u8 taskId, s8 toMove);
+static void HandleBagCursorPositionChange(s8 toMove);
+
+// code
+void DoBerryTagScreen(void)
+{
+ sBerryTag = AllocZeroed(sizeof(*sBerryTag));
+ sBerryTag->berryId = ItemIdToBerryType(gSpecialVar_ItemId);
+ SetMainCallback2(CB2_InitBerryTagScreen);
+}
+
+static void CB2_BerryTagScreen(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+static void VblankCB(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void CB2_InitBerryTagScreen(void)
+{
+ while (1)
+ {
+ if (sub_81221EC() == TRUE)
+ break;
+ if (InitBerryTagScreen() == TRUE)
+ break;
+ if (sub_81221AC() == TRUE)
+ break;
+ }
+}
+
+static bool8 InitBerryTagScreen(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankHBlankCallbacksToNull();
+ ResetVramOamAndBgCntRegs();
+ clear_scheduled_bg_copies_to_vram();
+ gMain.state++;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = 1;
+ gMain.state++;
+ break;
+ case 3:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 4:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 5:
+ if (!sub_81221AC())
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 6:
+ HandleInitBackgrounds();
+ sBerryTag->gfxState = 0;
+ gMain.state++;
+ break;
+ case 7:
+ if (LoadBerryTagGfx())
+ gMain.state++;
+ break;
+ case 8:
+ HandleInitWindows();
+ gMain.state++;
+ break;
+ case 9:
+ AddBerryTagTextToBg0();
+ gMain.state++;
+ break;
+ case 10:
+ PrintAllBerryData();
+ gMain.state++;
+ break;
+ case 11:
+ CreateBerrySprite();
+ gMain.state++;
+ break;
+ case 12:
+ CreateFlavorCircleSprites();
+ SetFlavorCirclesVisiblity();
+ gMain.state++;
+ break;
+ case 13:
+ CreateTask(Task_HandleInput, 0);
+ gMain.state++;
+ break;
+ case 14:
+ BlendPalettes(-1, 0x10, 0);
+ gMain.state++;
+ break;
+ case 15:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ gPaletteFade.bufferTransferDisabled = 0;
+ gMain.state++;
+ break;
+ default: // done
+ SetVBlankCallback(VblankCB);
+ SetMainCallback2(CB2_BerryTagScreen);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void HandleInitBackgrounds(void)
+{
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates));
+ SetBgTilemapBuffer(2, sBerryTag->tilemapBuffers[0]);
+ SetBgTilemapBuffer(3, sBerryTag->tilemapBuffers[1]);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(2);
+ schedule_bg_copy_tilemap_to_vram(3);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+}
+
+static bool8 LoadBerryTagGfx(void)
+{
+ u16 i;
+
+ switch (sBerryTag->gfxState)
+ {
+ case 0:
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(2, gUnknown_08D9BB44, 0, 0, 0);
+ sBerryTag->gfxState++;
+ break;
+ case 1:
+ if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ {
+ LZDecompressWram(gUnknown_08D9BF98, sBerryTag->tilemapBuffers[0]);
+ sBerryTag->gfxState++;
+ }
+ break;
+ case 2:
+ LZDecompressWram(gUnknown_08D9C13C, sBerryTag->tilemapBuffers[2]);
+ sBerryTag->gfxState++;
+ break;
+ case 3:
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ {
+ for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++)
+ sBerryTag->tilemapBuffers[1][i] = 0x4042;
+ }
+ else
+ {
+ for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++)
+ sBerryTag->tilemapBuffers[1][i] = 0x5042;
+ }
+ sBerryTag->gfxState++;
+ break;
+ case 4:
+ LoadCompressedPalette(gUnknown_08D9BEF0, 0, 0xC0);
+ sBerryTag->gfxState++;
+ break;
+ case 5:
+ LoadCompressedObjectPic(&gUnknown_0857FDEC);
+ sBerryTag->gfxState++;
+ break;
+ default:
+ LoadCompressedObjectPalette(&gUnknown_0857FDF4);
+ return TRUE; // done
+ }
+
+ return FALSE;
+}
+
+static void HandleInitWindows(void)
+{
+ u16 i;
+
+ InitWindows(sWindowTemplates);
+ DeactivateAllTextPrinters();
+ LoadPalette(sFontPalette, 0xF0, 0x20);
+ for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++)
+ PutWindowTilemap(i);
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+static void PrintTextInBerryTagScreen(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed, u8 colorStructId)
+{
+ AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, sTextColors[colorStructId], speed, text);
+}
+
+static void AddBerryTagTextToBg0(void)
+{
+ memcpy(GetBgTilemapBuffer(0), sBerryTag->tilemapBuffers[2], sizeof(sBerryTag->tilemapBuffers[2]));
+ FillWindowPixelBuffer(WIN_BERRY_TAG, 0xFF);
+ PrintTextInBerryTagScreen(WIN_BERRY_TAG, gText_BerryTag, GetStringCenterAlignXOffset(1, gText_BerryTag, 0x40), 1, 0, 1);
+ PutWindowTilemap(WIN_BERRY_TAG);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void PrintAllBerryData(void)
+{
+ PrintBerryNumberAndName();
+ PrintBerrySize();
+ PrintBerryFirmness();
+ PrintBerryDescription1();
+ PrintBerryDescription2();
+}
+
+static void PrintBerryNumberAndName(void)
+{
+ const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
+ ConvertIntToDecimalStringN(gStringVar1, sBerryTag->berryId, 2, 2);
+ StringCopy(gStringVar2, berry->name);
+ StringExpandPlaceholders(gStringVar4, gText_UnkF908Var1Var2);
+ PrintTextInBerryTagScreen(WIN_BERRY_NAME, gStringVar4, 0, 1, 0, 0);
+}
+
+static void PrintBerrySize(void)
+{
+ const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
+ PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_SizeSlash, 0, 1, TEXT_SPEED_FF, NULL);
+ if (berry->size != 0)
+ {
+ u32 inches, fraction;
+
+ inches = 1000 * berry->size / 254;
+ if (inches % 10 > 4)
+ inches += 10;
+ fraction = (inches % 100) / 10;
+ inches /= 100;
+
+ ConvertIntToDecimalStringN(gStringVar1, inches, 0, 2);
+ ConvertIntToDecimalStringN(gStringVar2, fraction, 0, 2);
+ StringExpandPlaceholders(gStringVar4, gText_Var1DotVar2);
+ PrintTextOnWindow(WIN_SIZE_FIRM, 1, gStringVar4, 0x28, 1, 0, NULL);
+ }
+ else
+ {
+ PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 1, 0, NULL);
+ }
+}
+
+static void PrintBerryFirmness(void)
+{
+ const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
+ PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_FirmSlash, 0, 0x11, TEXT_SPEED_FF, NULL);
+ if (berry->firmness != 0)
+ PrintTextOnWindow(WIN_SIZE_FIRM, 1, sBerryFirmnessStrings[berry->firmness - 1], 0x28, 0x11, 0, NULL);
+ else
+ PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 0x11, 0, NULL);
+}
+
+static void PrintBerryDescription1(void)
+{
+ const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
+ PrintTextOnWindow(WIN_DESC, 1, berry->description1, 0, 1, 0, NULL);
+}
+
+static void PrintBerryDescription2(void)
+{
+ const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
+ PrintTextOnWindow(WIN_DESC, 1, berry->description2, 0, 0x11, 0, NULL);
+}
+
+static void CreateBerrySprite(void)
+{
+ sBerryTag->berrySpriteId = CreateBerryTagSprite(sBerryTag->berryId - 1, 56, 64);
+}
+
+static void DestroyBerrySprite(void)
+{
+ DestroySprite(&gSprites[sBerryTag->berrySpriteId]);
+ FreeBerryTagSpritePalette();
+}
+
+static void CreateFlavorCircleSprites(void)
+{
+ sBerryTag->flavorCircleIds[FLAVOR_SPICY] = CreateBerryFlavorCircleSprite(64);
+ sBerryTag->flavorCircleIds[FLAVOR_DRY] = CreateBerryFlavorCircleSprite(104);
+ sBerryTag->flavorCircleIds[FLAVOR_SWEET] = CreateBerryFlavorCircleSprite(144);
+ sBerryTag->flavorCircleIds[FLAVOR_BITTER] = CreateBerryFlavorCircleSprite(184);
+ sBerryTag->flavorCircleIds[FLAVOR_SOUR] = CreateBerryFlavorCircleSprite(224);
+}
+
+static void SetFlavorCirclesVisiblity(void)
+{
+ const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
+
+ if (berry->spicy)
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 0;
+ else
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 1;
+
+ if (berry->dry)
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 0;
+ else
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 1;
+
+ if (berry->sweet)
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 0;
+ else
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 1;
+
+ if (berry->bitter)
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 0;
+ else
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 1;
+
+ if (berry->sour)
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 0;
+ else
+ gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 1;
+}
+
+static void DestroyFlavorCircleSprites(void)
+{
+ u16 i;
+
+ for (i = 0; i < FLAVOR_COUNT; i++)
+ DestroySprite(&gSprites[sBerryTag->flavorCircleIds[i]]);
+}
+
+static void PrepareToCloseBerryTagScreen(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_CloseBerryTagScreen;
+}
+
+static void Task_CloseBerryTagScreen(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyBerrySprite();
+ DestroyFlavorCircleSprites();
+ Free(sBerryTag);
+ FreeAllWindowBuffers();
+ SetMainCallback2(bag_menu_mail_related);
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_HandleInput(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ u16 arrowKeys = gMain.newAndRepeatedKeys & DPAD_ANY;
+ if (arrowKeys == DPAD_UP)
+ TryChangeDisplayedBerry(taskId, -1);
+ else if (arrowKeys == DPAD_DOWN)
+ TryChangeDisplayedBerry(taskId, 1);
+ else if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ PrepareToCloseBerryTagScreen(taskId);
+ }
+}
+
+static void TryChangeDisplayedBerry(u8 taskId, s8 toMove)
+{
+ s16 *data = gTasks[taskId].data;
+ s16 currPocketPosition = gUnknown_0203CE58.scrollPosition[3] + gUnknown_0203CE58.cursorPosition[3];
+ u32 newPocketPosition = currPocketPosition + toMove;
+ if (newPocketPosition < 46 && BagGetItemIdByPocketPosition(POCKET_BERRIES, newPocketPosition) != 0)
+ {
+ if (toMove < 0)
+ data[1] = 2;
+ else
+ data[1] = 1;
+
+ data[0] = 0;
+ PlaySE(SE_SELECT);
+ HandleBagCursorPositionChange(toMove);
+ gTasks[taskId].func = Task_DisplayAnotherBerry;
+ }
+}
+
+static void HandleBagCursorPositionChange(s8 toMove)
+{
+ u16 *scrollPos = &gUnknown_0203CE58.scrollPosition[3];
+ u16 *cursorPos = &gUnknown_0203CE58.cursorPosition[3];
+ if (toMove > 0)
+ {
+ if (*cursorPos < 4 || BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + 8) == 0)
+ *cursorPos += toMove;
+ else
+ *scrollPos += toMove;
+ }
+ else
+ {
+ if (*cursorPos > 3 || *scrollPos == 0)
+ *cursorPos += toMove;
+ else
+ *scrollPos += toMove;
+ }
+
+ sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + *cursorPos));
+}
+
+static void Task_DisplayAnotherBerry(u8 taskId)
+{
+ u16 i;
+ s16 posY;
+ s16 *data = gTasks[taskId].data;
+ data[0] += 0x10;
+ data[0] &= 0xFF;
+
+ if (data[1] == 1)
+ {
+ switch (data[0])
+ {
+ case 0x30:
+ FillWindowPixelBuffer(0, 0);
+ break;
+ case 0x40:
+ PrintBerryNumberAndName();
+ break;
+ case 0x50:
+ DestroyBerrySprite();
+ CreateBerrySprite();
+ break;
+ case 0x60:
+ FillWindowPixelBuffer(1, 0);
+ break;
+ case 0x70:
+ PrintBerrySize();
+ break;
+ case 0x80:
+ PrintBerryFirmness();
+ break;
+ case 0x90:
+ SetFlavorCirclesVisiblity();
+ break;
+ case 0xA0:
+ FillWindowPixelBuffer(2, 0);
+ break;
+ case 0xB0:
+ PrintBerryDescription1();
+ break;
+ case 0xC0:
+ PrintBerryDescription2();
+ break;
+ }
+ }
+ else
+ {
+ switch (data[0])
+ {
+ case 0x30:
+ FillWindowPixelBuffer(2, 0);
+ break;
+ case 0x40:
+ PrintBerryDescription2();
+ break;
+ case 0x50:
+ PrintBerryDescription1();
+ break;
+ case 0x60:
+ SetFlavorCirclesVisiblity();
+ break;
+ case 0x70:
+ FillWindowPixelBuffer(1, 0);
+ break;
+ case 0x80:
+ PrintBerryFirmness();
+ break;
+ case 0x90:
+ PrintBerrySize();
+ break;
+ case 0xA0:
+ DestroyBerrySprite();
+ CreateBerrySprite();
+ break;
+ case 0xB0:
+ FillWindowPixelBuffer(0, 0);
+ break;
+ case 0xC0:
+ PrintBerryNumberAndName();
+ break;
+ }
+ }
+
+ if (data[1] == 1)
+ posY = -data[0];
+ else
+ posY = data[0];
+
+ gSprites[sBerryTag->berrySpriteId].pos2.y = posY;
+ for (i = 0; i < FLAVOR_COUNT; i++)
+ gSprites[sBerryTag->flavorCircleIds[i]].pos2.y = posY;
+
+ ChangeBgY(1, 0x1000, data[1]);
+ ChangeBgY(2, 0x1000, data[1]);
+
+ if (data[0] == 0)
+ gTasks[taskId].func = Task_HandleInput;
+}
diff --git a/src/bg.c b/src/bg.c
index 74e3ea830..2f4cdc856 100644
--- a/src/bg.c
+++ b/src/bg.c
@@ -463,7 +463,7 @@ bool8 IsDma3ManagerBusyWithBgCopy(void)
return FALSE;
}
#else
-__attribute__((naked))
+NAKED
bool8 IsDma3ManagerBusyWithBgCopy(void)
{
asm("push {r4-r7,lr}\n\
@@ -965,9 +965,9 @@ void CopyBgTilemapBufferToVram(u8 bg)
}
}
-void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u8 height)
+void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 width, u8 height)
{
- void* srcCopy;
+ const void* srcCopy;
u16 destX16;
u16 destY16;
u16 mode;
@@ -1007,7 +1007,7 @@ void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, void *src, u8 destX, u8 dest
}
// Skipping for now, it probably uses structs passed by value
/*
-void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
+void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
{
u16 attribute;
u16 mode;
@@ -1048,8 +1048,8 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid
}
}
}*/
-__attribute__((naked))
-void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
+NAKED
+void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
{
asm("push {r4-r7,lr}\n\
mov r7, r10\n\
@@ -1495,7 +1495,7 @@ void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 pal
*dest = test;
}
#else
-__attribute__((naked))
+NAKED
void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
{
asm("push {r4-r6,lr}\n\
diff --git a/src/bike.c b/src/bike.c
new file mode 100644
index 000000000..6ffd479f7
--- /dev/null
+++ b/src/bike.c
@@ -0,0 +1,1077 @@
+#include "global.h"
+#include "bike.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "constants/flags.h"
+#include "global.fieldmap.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "constants/map_types.h"
+
+extern bool8 gBikeCyclingChallenge;
+extern u8 gBikeCollisions;
+
+extern u8 sub_808B980(u8 direction);
+extern u8 sub_808B9BC(u8 direction);
+extern u8 sub_808B9A4(u8 direction);
+extern u8 sub_808C1B4(u8 direction);
+extern u8 npc_use_some_d2s(u8 direction);
+extern void Overworld_ClearSavedMusic(void);
+extern void Overworld_PlaySpecialMapMusic(void);
+
+// this file's functions
+static void MovePlayerOnMachBike(u8, u16, u16);
+static u8 GetMachBikeTransition(u8 *);
+static void MachBikeTransition_FaceDirection(u8);
+static void MachBikeTransition_TurnDirection(u8);
+static void MachBikeTransition_TrySpeedUp(u8);
+static void MachBikeTransition_TrySlowDown(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 AcroBikeHandleInputSidewaysJump(u8 *, u16, u16);
+static u8 AcroBikeHandleInputTurnJump(u8 *, u16, u16);
+static void AcroBikeTransition_FaceDirection(u8);
+static void AcroBikeTransition_TurnDirection(u8);
+static void AcroBikeTransition_Moving(u8);
+static void AcroBikeTransition_NormalToWheelie(u8);
+static void AcroBikeTransition_WheelieToNormal(u8);
+static void AcroBikeTransition_WheelieIdle(u8);
+static void AcroBikeTransition_WheelieHoppingStanding(u8);
+static void AcroBikeTransition_WheelieHoppingMoving(u8);
+static void AcroBikeTransition_SideJump(u8);
+static void AcroBikeTransition_TurnJump(u8);
+static void AcroBikeTransition_WheelieMoving(u8);
+static void AcroBikeTransition_WheelieRisingMoving(u8);
+static void AcroBikeTransition_WheelieLoweringMoving(u8);
+static void AcroBike_TryHistoryUpdate(u16, u16);
+static u8 AcroBike_GetJumpDirection(void);
+static void Bike_UpdateDirTimerHistory(u8);
+static void Bike_UpdateABStartSelectHistory(u8);
+static u8 Bike_DPadToDirection(u16);
+static u8 get_some_collision(u8);
+static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct EventObject *, s16, s16, u8, u8);
+static bool8 IsRunningDisallowedByMetatile(u8);
+static void Bike_TryAdvanceCyclingRoadCollisions();
+static u8 CanBikeFaceDirOnMetatile(u8, u8);
+static bool8 WillPlayerCollideWithCollision(u8, u8);
+static void Bike_SetBikeStill(void);
+
+// const rom data
+
+/*
+ A bike transition is a type of callback for the bike that actually
+ modifies the bicycle's direction or momentum or otherwise movement.
+ Alternatively, a bike may also have input handlers which process the
+ bike transition to call: the acro bike has input handlers while the mach
+ bike does not. This is because the Acro needs to know the button inputs
+ for its complex tricks and actions.
+*/
+
+static void (*const sMachBikeTransitions[])(u8) =
+{
+ MachBikeTransition_FaceDirection, // Face vs Turn: Face has no anim while Turn does. Turn checks for collision because if you turn right as opposed to face right, if there is a wall there, turn will make a bonk sound effect while face will not.
+ MachBikeTransition_TurnDirection,
+ MachBikeTransition_TrySpeedUp,
+ MachBikeTransition_TrySlowDown,
+};
+
+// bikeFrameCounter is input which is represented by sMachBikeSpeeds in order: 0 is normal speed (1 speed), 1 is fast speed (2 speed), 2 is fastest speed (4 speed)
+static void (*const sMachBikeSpeedCallbacks[])(u8) =
+{
+ PlayerGoSpeed1, // normal speed (1 speed)
+ PlayerGoSpeed2, // fast speed (2 speed)
+ PlayerGoSpeed4, // fastest speed (4 speed)
+};
+
+static void (*const sAcroBikeTransitions[])(u8) =
+{
+ AcroBikeTransition_FaceDirection,
+ AcroBikeTransition_TurnDirection,
+ AcroBikeTransition_Moving,
+ AcroBikeTransition_NormalToWheelie,
+ AcroBikeTransition_WheelieToNormal,
+ AcroBikeTransition_WheelieIdle,
+ AcroBikeTransition_WheelieHoppingStanding,
+ AcroBikeTransition_WheelieHoppingMoving,
+ AcroBikeTransition_SideJump,
+ AcroBikeTransition_TurnJump,
+ AcroBikeTransition_WheelieMoving,
+ AcroBikeTransition_WheelieRisingMoving,
+ AcroBikeTransition_WheelieLoweringMoving,
+};
+
+static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) =
+{
+ AcroBikeHandleInputNormal,
+ AcroBikeHandleInputTurning,
+ AcroBikeHandleInputWheelieStanding,
+ AcroBikeHandleInputBunnyHop,
+ AcroBikeHandleInputWheelieMoving,
+ AcroBikeHandleInputSidewaysJump,
+ AcroBikeHandleInputTurnJump,
+};
+
+// used with bikeFrameCounter from mach bike
+static const u16 sMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST};
+
+// this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list.
+static const u8 sAcroBikeJumpTimerList[] = {4, 0};
+
+// this is a list of history inputs to do in order to do the check to retrieve a jump direction for acro bike. it seems to be an extensible list, so its possible that Game Freak may have intended for the Acro Bike to have more complex tricks at some point. The final list only has the acro jump.
+static const struct BikeHistoryInputInfo sAcroBikeTricksList[] =
+{
+ // the 0xF is a mask performed with each byte of the array in order to perform the check on only the last entry of the history list, otherwise the check wouldn't work as there can be 0xF0 as opposed to 0x0F.
+ {DIR_SOUTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_SOUTH},
+ {DIR_NORTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_NORTH},
+ {DIR_WEST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_WEST},
+ {DIR_EAST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_EAST},
+};
+
+// code
+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);
+}
+
+// dirTraveling is a variable that is 0 when the player is standing still.
+static u8 GetMachBikeTransition(u8 *dirTraveling)
+{
+ // if the dir updated before this function, get the relevent new direction to check later.
+ u8 direction = GetPlayerMovementDirection();
+
+ // is the player standing still?
+ if (*dirTraveling == 0)
+ {
+ *dirTraveling = direction; // update the direction, since below we either faced a direction or we started moving.
+ if (gPlayerAvatar.bikeSpeed == SPEED_STANDING)
+ {
+ gPlayerAvatar.runningState = NOT_MOVING;
+ return MACH_TRANS_FACE_DIRECTION;
+ }
+ gPlayerAvatar.runningState = MOVING;
+ return MACH_TRANS_START_MOVING;
+ }
+
+ // we need to check if the last traveled direction changed from the new direction as well as ensuring that we dont update the state while the player is moving: see the else check.
+ if (*dirTraveling != direction && gPlayerAvatar.runningState != MOVING)
+ {
+ if (gPlayerAvatar.bikeSpeed != SPEED_STANDING)
+ {
+ *dirTraveling = direction; // implement the new direction
+ gPlayerAvatar.runningState = MOVING;
+ return MACH_TRANS_START_MOVING;
+ }
+ // if you didnt start moving but your dir was different, do a turn direction instead.
+ gPlayerAvatar.runningState = TURN_DIRECTION;
+ return MACH_TRANS_TURN_DIRECTION;
+ }
+ else // the player is either going in the current direction and hasnt changed or their state is currently moving.
+ {
+ gPlayerAvatar.runningState = MOVING;
+ return MACH_TRANS_KEEP_MOVING;
+ }
+}
+
+// the difference between face direction and turn direction is that one changes direction while the other does the animation of turning as well as changing direction.
+static void MachBikeTransition_FaceDirection(u8 direction)
+{
+ PlayerFaceDirection(direction);
+ Bike_SetBikeStill();
+}
+
+static void MachBikeTransition_TurnDirection(u8 direction)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior))
+ {
+ PlayerTurnInPlace(direction);
+ Bike_SetBikeStill();
+ }
+ else
+ {
+ MachBikeTransition_FaceDirection(playerEventObj->facingDirection);
+ }
+}
+
+static void MachBikeTransition_TrySpeedUp(u8 direction)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+ u8 collision;
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == FALSE)
+ {
+ // we cannot go forward, so either slow down or, if we are stopped, idle face direction.
+ if (gPlayerAvatar.bikeSpeed)
+ MachBikeTransition_TrySlowDown(playerEventObj->movementDirection);
+ else
+ MachBikeTransition_FaceDirection(playerEventObj->movementDirection);
+ }
+ else
+ {
+ collision = get_some_collision(direction);
+ if (collision > 0 && collision < 12)
+ {
+ // we hit a solid object, but check to see if its a ledge and then jump.
+ if (collision == COLLISION_LEDGE_JUMP)
+ {
+ PlayerJumpLedge(direction);
+ }
+ else
+ {
+ // we hit a solid object that is not a ledge, so perform the collision.
+ Bike_SetBikeStill();
+ if (collision == 4 && IsPlayerCollidingWithFarawayIslandMew(direction))
+ PlayerOnBikeCollideWithFarawayIslandMew(direction);
+ else if (collision < 5 || collision > 8)
+ PlayerOnBikeCollide(direction);
+ }
+ }
+ else
+ {
+ // we did not hit anything that can slow us down, so perform the advancement callback depending on the bikeFrameCounter and try to increase the mach bike's speed.
+ sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction);
+ gPlayerAvatar.bikeSpeed = 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_TrySlowDown(u8 direction)
+{
+ u8 collision;
+
+ if (gPlayerAvatar.bikeSpeed != SPEED_STANDING)
+ gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.bikeSpeed;
+
+ collision = get_some_collision(direction);
+
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == COLLISION_LEDGE_JUMP)
+ {
+ PlayerJumpLedge(direction);
+ }
+ else
+ {
+ Bike_SetBikeStill();
+ if (collision == 4 && IsPlayerCollidingWithFarawayIslandMew(direction))
+ PlayerOnBikeCollideWithFarawayIslandMew(direction);
+ else if (collision < 5 || collision > 8)
+ PlayerOnBikeCollide(direction);
+ }
+ }
+ else
+ {
+ sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction);
+ }
+}
+
+// the acro bike requires the input handler to be executed before the transition can.
+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 = GetPlayerMovementDirection();
+
+ 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.runningState = NOT_MOVING;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ return ACRO_TRANS_NORMAL_TO_WHEELIE;
+ }
+ else
+ {
+ *newDirection = direction;
+ gPlayerAvatar.runningState = NOT_MOVING;
+ return ACRO_TRANS_FACE_DIRECTION;
+ }
+ }
+ if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.bikeSpeed == SPEED_STANDING)
+ {
+ gPlayerAvatar.bikeSpeed++;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING;
+ return ACRO_TRANS_WHEELIE_RISING_MOVING;
+ }
+ if (*newDirection != direction && gPlayerAvatar.runningState != MOVING)
+ {
+ gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING;
+ gPlayerAvatar.newDirBackup = *newDirection;
+ gPlayerAvatar.runningState = NOT_MOVING;
+ return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys);
+ }
+ gPlayerAvatar.runningState = MOVING;
+ return ACRO_TRANS_MOVING;
+}
+
+static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+
+ *newDirection = gPlayerAvatar.newDirBackup;
+ gPlayerAvatar.bikeFrameCounter++;
+
+ // Wait 6 frames before actually changing direction
+ if (gPlayerAvatar.bikeFrameCounter > 6) // ... because it takes 6 frames to advance 1 tile.
+ {
+ gPlayerAvatar.runningState = TURN_DIRECTION;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ Bike_SetBikeStill();
+ return ACRO_TRANS_TURN_DIRECTION;
+ }
+ direction = GetPlayerMovementDirection();
+ if (*newDirection == AcroBike_GetJumpDirection())
+ {
+ Bike_SetBikeStill(); // Bike_SetBikeStill sets speed to standing, but the next line immediately overrides it. could have just reset acroBikeState to 0 here instead of wasting a jump.
+ gPlayerAvatar.bikeSpeed = SPEED_NORMAL;
+ if (*newDirection == GetOppositeDirection(direction))
+ {
+ // do a turn jump.
+ // no need to update runningState, didnt move.
+ gPlayerAvatar.acroBikeState = ACRO_STATE_TURN_JUMP;
+ return ACRO_TRANS_TURN_JUMP;
+ }
+ else
+ {
+ // do a sideways jump.
+ gPlayerAvatar.runningState = MOVING; // we need to move, set state to moving.
+ gPlayerAvatar.acroBikeState = ACRO_STATE_SIDE_JUMP;
+ return ACRO_TRANS_SIDE_JUMP;
+ }
+ }
+ *newDirection = direction;
+ return ACRO_TRANS_FACE_DIRECTION;
+}
+
+static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+ struct EventObject *playerEventObj;
+
+ direction = GetPlayerMovementDirection();
+ playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+ gPlayerAvatar.runningState = NOT_MOVING;
+
+ if (heldKeys & B_BUTTON)
+ gPlayerAvatar.bikeFrameCounter++;
+ else
+ {
+ // B button was released.
+ gPlayerAvatar.bikeFrameCounter = 0;
+ if (!MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior))
+ {
+ // Go back to normal on flat ground
+ *newDirection = direction;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ Bike_SetBikeStill();
+ return ACRO_TRANS_WHEELIE_TO_NORMAL;
+ }
+ }
+ if (gPlayerAvatar.bikeFrameCounter >= 40)
+ {
+ *newDirection = direction;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP;
+ Bike_SetBikeStill();
+ return ACRO_TRANS_WHEELIE_HOPPING_STANDING;
+ }
+ if (*newDirection == direction)
+ {
+ gPlayerAvatar.runningState = MOVING;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING;
+ Bike_SetBikeStill();
+ return ACRO_TRANS_WHEELIE_MOVING;
+ }
+ if (*newDirection == 0)
+ {
+ *newDirection = direction;
+ return ACRO_TRANS_WHEELIE_IDLE;
+ }
+ gPlayerAvatar.runningState = TURN_DIRECTION;
+ return ACRO_TRANS_WHEELIE_IDLE;
+}
+
+static u8 AcroBikeHandleInputBunnyHop(u8 *newDirection, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+ struct EventObject *playerEventObj;
+
+ direction = GetPlayerMovementDirection();
+ playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (!(heldKeys & B_BUTTON))
+ {
+ // B button was released
+ Bike_SetBikeStill();
+ if (MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior))
+ {
+ // even though B was released, dont undo the wheelie on the bumpy slope.
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys);
+ }
+ else
+ {
+ // .. otherwise, go back to normal on flat ground
+ *newDirection = direction;
+ gPlayerAvatar.runningState = NOT_MOVING;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ return ACRO_TRANS_WHEELIE_TO_NORMAL;
+ }
+ }
+
+ // B Button is still held
+
+ if (*newDirection == DIR_NONE)
+ {
+ // we did not move, so keep hopping in place without moving.
+ *newDirection = direction;
+ gPlayerAvatar.runningState = NOT_MOVING;
+ return ACRO_TRANS_WHEELIE_HOPPING_STANDING;
+ }
+ if (*newDirection != direction && gPlayerAvatar.runningState != MOVING)
+ {
+ // we changed direction, so turn but do not move hop.
+ gPlayerAvatar.runningState = TURN_DIRECTION;
+ return ACRO_TRANS_WHEELIE_HOPPING_STANDING;
+ }
+ // otherwise, we started moving while hopping
+ gPlayerAvatar.runningState = MOVING;
+ return ACRO_TRANS_WHEELIE_HOPPING_MOVING;
+}
+
+static u8 AcroBikeHandleInputWheelieMoving(u8 *newDirection, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+ struct EventObject *playerEventObj;
+
+ direction = GetPlayerFacingDirection();
+ playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (!(heldKeys & B_BUTTON))
+ {
+ // we were moving on a wheelie, but we let go while moving. reset bike still status
+ Bike_SetBikeStill();
+ if (!MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior))
+ {
+ // we let go of B and arent on a bumpy slope, set state to normal because now we need to handle this
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ if (*newDirection == DIR_NONE)
+ {
+ // we stopped moving but are turning, still try to lower the wheelie in place.
+ *newDirection = direction;
+ gPlayerAvatar.runningState = NOT_MOVING;
+ return ACRO_TRANS_WHEELIE_TO_NORMAL;
+ }
+ if (*newDirection != direction && gPlayerAvatar.runningState != MOVING)
+ {
+ // we did not turn while lowering wheelie, so do so without turning.
+ gPlayerAvatar.runningState = NOT_MOVING;
+ return ACRO_TRANS_WHEELIE_TO_NORMAL;
+ }
+ // if we are moving while lowering wheelie, put the acro into a lowering state while moving.
+ gPlayerAvatar.runningState = MOVING;
+ return ACRO_TRANS_WHEELIE_LOWERING_MOVING;
+ }
+ // please do not undo the wheelie on a bumpy slope
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys);
+ }
+ // we are still holding B.
+ if (*newDirection == DIR_NONE)
+ {
+ // idle the wheelie in place because we're holding B without moving.
+ *newDirection = direction;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ gPlayerAvatar.runningState = NOT_MOVING;
+ Bike_SetBikeStill();
+ return ACRO_TRANS_WHEELIE_IDLE;
+ }
+ if (direction != *newDirection && gPlayerAvatar.runningState != MOVING)
+ {
+ gPlayerAvatar.runningState = NOT_MOVING;
+ return ACRO_TRANS_WHEELIE_IDLE;
+ }
+ gPlayerAvatar.runningState = MOVING;
+ return ACRO_TRANS_WHEELIE_MOVING;
+}
+
+static u8 AcroBikeHandleInputSidewaysJump(u8 *ptr, u16 newKeys, u16 heldKeys)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ playerEventObj->facingDirectionLocked = 0;
+ SetEventObjectDirection(playerEventObj, playerEventObj->facingDirection);
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ return CheckMovementInputAcroBike(ptr, newKeys, heldKeys);
+}
+
+static u8 AcroBikeHandleInputTurnJump(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_TurnDirection(u8 direction)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ direction = playerEventObj->movementDirection;
+ PlayerFaceDirection(direction);
+}
+
+static void AcroBikeTransition_Moving(u8 direction)
+{
+ u8 collision;
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ {
+ AcroBikeTransition_FaceDirection(playerEventObj->movementDirection);
+ return;
+ }
+ collision = get_some_collision(direction);
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == COLLISION_LEDGE_JUMP)
+ PlayerJumpLedge(direction);
+ else if (collision == 4 && IsPlayerCollidingWithFarawayIslandMew(direction))
+ PlayerOnBikeCollideWithFarawayIslandMew(direction);
+ else if (collision < 5 || collision > 8)
+ PlayerOnBikeCollide(direction);
+ }
+ else
+ {
+ PlayerGoSpeed3(direction);
+ }
+}
+
+static void AcroBikeTransition_NormalToWheelie(u8 direction)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ direction = playerEventObj->movementDirection;
+ PlayerStartWheelie(direction);
+}
+
+static void AcroBikeTransition_WheelieToNormal(u8 direction)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ direction = playerEventObj->movementDirection;
+ PlayerEndWheelie(direction);
+}
+
+static void AcroBikeTransition_WheelieIdle(u8 direction)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ direction = playerEventObj->movementDirection;
+ PlayerIdleWheelie(direction);
+}
+
+static void AcroBikeTransition_WheelieHoppingStanding(u8 direction)
+{
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ direction = playerEventObj->movementDirection;
+ PlayerStandingHoppingWheelie(direction);
+}
+
+static void AcroBikeTransition_WheelieHoppingMoving(u8 direction)
+{
+ u8 collision;
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ {
+ AcroBikeTransition_WheelieHoppingStanding(playerEventObj->movementDirection);
+ return;
+ }
+ collision = get_some_collision(direction);
+ // TODO: Try to get rid of this goto
+ if (collision == 0 || collision == 9)
+ {
+ goto derp;
+ }
+ else if (collision == 6)
+ {
+ PlayerLedgeHoppingWheelie(direction);
+ }
+ else if (collision < 5 || collision > 8)
+ {
+ if (collision <= 11)
+ {
+ AcroBikeTransition_WheelieHoppingStanding(direction);
+ }
+ else
+ {
+ derp:
+ PlayerMovingHoppingWheelie(direction);
+ }
+ }
+}
+
+static void AcroBikeTransition_SideJump(u8 direction)
+{
+ u8 collision;
+ struct EventObject *playerEventObj;
+
+ collision = get_some_collision(direction);
+ if (collision != 0)
+ {
+ if (collision == 7)
+ return;
+ if (collision < 10)
+ {
+ AcroBikeTransition_TurnDirection(direction);
+ return;
+ }
+ if (WillPlayerCollideWithCollision(collision, direction) == FALSE)
+ {
+ AcroBikeTransition_TurnDirection(direction);
+ return;
+ }
+ }
+ playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+ PlaySE(SE_JITE_PYOKO);
+ playerEventObj->facingDirectionLocked = 1;
+ PlayerSetAnimId(GetJumpMovementAction(direction), 2);
+}
+
+static void AcroBikeTransition_TurnJump(u8 direction)
+{
+ PlayerAcroTurnJump(direction);
+}
+
+static void AcroBikeTransition_WheelieMoving(u8 direction)
+{
+ u8 collision;
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ {
+ PlayerIdleWheelie(playerEventObj->movementDirection);
+ return;
+ }
+ collision = get_some_collision(direction);
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == 6)
+ {
+ PlayerLedgeHoppingWheelie(direction);
+ }
+ else if (collision == 9)
+ {
+ PlayerIdleWheelie(direction);
+ }
+ else if (collision <= 4)
+ {
+ if (MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior))
+ PlayerIdleWheelie(direction);
+ else
+ sub_808B980(direction); //hit wall?
+ }
+ return;
+ }
+ sub_808B9BC(direction);
+ gPlayerAvatar.runningState = MOVING;
+}
+
+static void AcroBikeTransition_WheelieRisingMoving(u8 direction)
+{
+ u8 collision;
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ {
+ PlayerStartWheelie(playerEventObj->movementDirection);
+ return;
+ }
+ collision = get_some_collision(direction);
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == 6)
+ {
+ PlayerLedgeHoppingWheelie(direction);
+ }
+ else if (collision == 9)
+ {
+ PlayerIdleWheelie(direction);
+ }
+ else if (collision <= 4)
+ {
+ if (MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior))
+ PlayerIdleWheelie(direction);
+ else
+ sub_808B980(direction); //hit wall?
+ }
+ return;
+ }
+ sub_808B9A4(direction);
+ gPlayerAvatar.runningState = MOVING;
+}
+
+static void AcroBikeTransition_WheelieLoweringMoving(u8 direction)
+{
+ u8 collision;
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0)
+ {
+ PlayerEndWheelie(playerEventObj->movementDirection);
+ return;
+ }
+ collision = get_some_collision(direction);
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == 6)
+ PlayerJumpLedge(direction);
+ else if (collision < 5 || collision > 8)
+ PlayerEndWheelie(direction);
+ return;
+ }
+ npc_use_some_d2s(direction);
+}
+
+void Bike_TryAcroBikeHistoryUpdate(u16 newKeys, u16 heldKeys)
+{
+ if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)
+ AcroBike_TryHistoryUpdate(newKeys, heldKeys);
+}
+
+static void AcroBike_TryHistoryUpdate(u16 newKeys, u16 heldKeys) // newKeys is unused
+{
+ u8 direction = Bike_DPadToDirection(heldKeys);
+
+ if (direction == (gPlayerAvatar.directionHistory & 0xF))
+ {
+ // increment the timer for direction history since last input.
+ if (gPlayerAvatar.dirTimerHistory[0] < 0xFF)
+ gPlayerAvatar.dirTimerHistory[0]++;
+ }
+ else
+ {
+ Bike_UpdateDirTimerHistory(direction);
+ gPlayerAvatar.bikeSpeed = SPEED_STANDING;
+ }
+
+ direction = heldKeys & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON); // directions is reused for some reason.
+ if (direction == (gPlayerAvatar.abStartSelectHistory & 0xF))
+ {
+ if (gPlayerAvatar.abStartSelectTimerHistory[0] < 0xFF)
+ gPlayerAvatar.abStartSelectTimerHistory[0]++;
+ }
+ else
+ {
+ Bike_UpdateABStartSelectHistory(direction);
+ gPlayerAvatar.bikeSpeed = SPEED_STANDING;
+ }
+}
+
+static bool8 HasPlayerInputTakenLongerThanList(const u8 *dirTimerList, const u8 *abStartSelectTimerList)
+{
+ u8 i;
+
+ for (i = 0; dirTimerList[i] != 0; i++)
+ {
+ if (gPlayerAvatar.dirTimerHistory[i] > dirTimerList[i])
+ return FALSE;
+ }
+ for (i = 0; abStartSelectTimerList[i] != 0; i++)
+ {
+ if (gPlayerAvatar.abStartSelectTimerHistory[i] > abStartSelectTimerList[i])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static u8 AcroBike_GetJumpDirection(void)
+{
+ u32 i;
+
+ for (i = 0; i < ARRAY_COUNT(sAcroBikeTricksList); i++)
+ {
+ const struct BikeHistoryInputInfo *historyInputInfo = &sAcroBikeTricksList[i];
+ u32 dirHistory = gPlayerAvatar.directionHistory;
+ u32 abStartSelectHistory = gPlayerAvatar.abStartSelectHistory;
+
+ dirHistory &= historyInputInfo->dirHistoryMask;
+ abStartSelectHistory &= historyInputInfo->abStartSelectHistoryMask;
+ if (dirHistory == historyInputInfo->dirHistoryMatch && abStartSelectHistory == historyInputInfo->abStartSelectHistoryMatch && HasPlayerInputTakenLongerThanList(historyInputInfo->dirTimerHistoryList, historyInputInfo->abStartSelectHistoryList))
+ return historyInputInfo->direction;
+ }
+ return 0;
+}
+
+static void Bike_UpdateDirTimerHistory(u8 dir)
+{
+ u8 i;
+
+ gPlayerAvatar.directionHistory = (gPlayerAvatar.directionHistory << 4) | (dir & 0xF);
+
+ for (i = 7; i != 0; i--)
+ gPlayerAvatar.dirTimerHistory[i] = gPlayerAvatar.dirTimerHistory[i - 1];
+ gPlayerAvatar.dirTimerHistory[0] = 1;
+}
+
+static void Bike_UpdateABStartSelectHistory(u8 input)
+{
+ u8 i;
+
+ gPlayerAvatar.abStartSelectHistory = (gPlayerAvatar.abStartSelectHistory << 4) | (input & 0xF);
+
+ for (i = 7; i != 0; i--)
+ gPlayerAvatar.abStartSelectTimerHistory[i] = gPlayerAvatar.abStartSelectTimerHistory[i - 1];
+ gPlayerAvatar.abStartSelectTimerHistory[0] = 1;
+}
+
+static u8 Bike_DPadToDirection(u16 heldKeys)
+{
+ if (heldKeys & DPAD_UP)
+ return DIR_NORTH;
+ if (heldKeys & DPAD_DOWN)
+ return DIR_SOUTH;
+ if (heldKeys & DPAD_LEFT)
+ return DIR_WEST;
+ if (heldKeys & DPAD_RIGHT)
+ return DIR_EAST;
+ return DIR_NONE;
+}
+
+static u8 get_some_collision(u8 direction)
+{
+ s16 x;
+ s16 y;
+ u8 metatitleBehavior;
+ struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ x = playerEventObj->currentCoords.x;
+ y = playerEventObj->currentCoords.y;
+ MoveCoords(direction, &x, &y);
+ metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ return Bike_CheckCollisionTryAdvanceCollisionCount(playerEventObj, x, y, direction, metatitleBehavior);
+}
+
+static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct EventObject *eventObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior)
+{
+ u8 collision = CheckForEventObjectCollision(eventObject, x, y, direction, metatitleBehavior);
+
+ if (collision > 4)
+ return collision;
+
+ if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior))
+ collision = 2;
+
+ if (collision)
+ Bike_TryAdvanceCyclingRoadCollisions();
+
+ return collision;
+}
+
+bool8 RS_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 Bike_TryAdvanceCyclingRoadCollisions(void)
+{
+ if (gBikeCyclingChallenge != FALSE && gBikeCollisions < 100)
+ gBikeCollisions++;
+}
+
+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 WillPlayerCollideWithCollision(u8 newTileCollision, u8 direction)
+{
+ if (direction == DIR_NORTH || direction == DIR_SOUTH)
+ {
+ if (newTileCollision == 10 || newTileCollision == 12)
+ return FALSE;
+ }
+ else if (newTileCollision == 11 || newTileCollision == 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(gEventObjects[gPlayerAvatar.eventObjectId].currentMetatileBehavior) != FALSE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void GetOnOffBike(u8 transitionFlags)
+{
+ gUnusedBikeCameraAheadPanback = FALSE;
+
+ if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ {
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
+ Overworld_ClearSavedMusic();
+ Overworld_PlaySpecialMapMusic();
+ }
+ else
+ {
+ SetPlayerAvatarTransitionFlags(transitionFlags);
+ Overworld_SetSavedMusic(MUS_CYCLING);
+ Overworld_ChangeMusicTo(MUS_CYCLING);
+ }
+}
+
+void BikeClearState(int newDirHistory, int newAbStartHistory)
+{
+ u8 i;
+
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ gPlayerAvatar.newDirBackup = DIR_NONE;
+ gPlayerAvatar.bikeFrameCounter = 0;
+ gPlayerAvatar.bikeSpeed = SPEED_STANDING;
+ gPlayerAvatar.directionHistory = newDirHistory;
+ gPlayerAvatar.abStartSelectHistory = newAbStartHistory;
+
+ for (i = 0; i < 8; i++)
+ gPlayerAvatar.dirTimerHistory[i] = 0;
+
+ for (i = 0; i < 8; i++)
+ gPlayerAvatar.abStartSelectTimerHistory[i] = 0;
+}
+
+void Bike_UpdateBikeCounterSpeed(u8 counter)
+{
+ gPlayerAvatar.bikeFrameCounter = counter;
+ gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5.
+}
+
+static void Bike_SetBikeStill(void)
+{
+ gPlayerAvatar.bikeFrameCounter = 0;
+ gPlayerAvatar.bikeSpeed = SPEED_STANDING;
+}
+
+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, sMachBikeSpeeds, 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 Bike_HandleBumpySlopeJump(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_808C1B4(GetPlayerMovementDirection());
+ }
+ }
+}
+
+bool32 IsRunningDisallowed(u8 metatile)
+{
+ if (!(gMapHeader.flags & 4) || IsRunningDisallowedByMetatile(metatile) == TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/src/birch_pc.c b/src/birch_pc.c
new file mode 100644
index 000000000..3148832be
--- /dev/null
+++ b/src/birch_pc.c
@@ -0,0 +1,89 @@
+#include "global.h"
+#include "event_data.h"
+#include "field_message_box.h"
+#include "pokedex.h"
+#include "constants/species.h"
+#include "strings.h"
+
+bool16 ScriptGetPokedexInfo(void)
+{
+ if (gSpecialVar_0x8004 == 0) // is national dex not present?
+ {
+ gSpecialVar_0x8005 = GetHoennPokedexCount(0);
+ gSpecialVar_0x8006 = GetHoennPokedexCount(1);
+ }
+ else
+ {
+ gSpecialVar_0x8005 = GetNationalPokedexCount(0);
+ gSpecialVar_0x8006 = GetNationalPokedexCount(1);
+ }
+
+ return IsNationalPokedexEnabled();
+}
+
+// This shows your Hoenn Pokedex rating and not your National Dex.
+const u8 *GetPokedexRatingText(u16 count)
+{
+ if (count < 10)
+ return gBirchDexRatingText_LessThan10;
+ if (count < 20)
+ return gBirchDexRatingText_LessThan20;
+ if (count < 30)
+ return gBirchDexRatingText_LessThan30;
+ if (count < 40)
+ return gBirchDexRatingText_LessThan40;
+ if (count < 50)
+ return gBirchDexRatingText_LessThan50;
+ if (count < 60)
+ return gBirchDexRatingText_LessThan60;
+ if (count < 70)
+ return gBirchDexRatingText_LessThan70;
+ if (count < 80)
+ return gBirchDexRatingText_LessThan80;
+ if (count < 90)
+ return gBirchDexRatingText_LessThan90;
+ if (count < 100)
+ return gBirchDexRatingText_LessThan100;
+ if (count < 110)
+ return gBirchDexRatingText_LessThan110;
+ if (count < 120)
+ return gBirchDexRatingText_LessThan120;
+ if (count < 130)
+ return gBirchDexRatingText_LessThan130;
+ if (count < 140)
+ return gBirchDexRatingText_LessThan140;
+ if (count < 150)
+ return gBirchDexRatingText_LessThan150;
+ if (count < 160)
+ return gBirchDexRatingText_LessThan160;
+ if (count < 170)
+ return gBirchDexRatingText_LessThan170;
+ if (count < 180)
+ return gBirchDexRatingText_LessThan180;
+ if (count < 190)
+ return gBirchDexRatingText_LessThan190;
+ if (count < 200)
+ return gBirchDexRatingText_LessThan200;
+ if (count == 200)
+ {
+ if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1)
+ || GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200.
+ return gBirchDexRatingText_LessThan200;
+ return gBirchDexRatingText_DexCompleted;
+ }
+ if (count == 201)
+ {
+ if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1)
+ && GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200.
+ return gBirchDexRatingText_LessThan200;
+ return gBirchDexRatingText_DexCompleted;
+ }
+ if (count == 202)
+ return gBirchDexRatingText_DexCompleted; // Hoenn dex is considered complete, even though the hoenn dex count is 210.
+ return gBirchDexRatingText_LessThan10;
+}
+
+void ShowPokedexRatingMessage(void)
+{
+ ShowFieldMessage(GetPokedexRatingText(gSpecialVar_0x8004));
+}
diff --git a/src/blit.c b/src/blit.c
new file mode 100644
index 000000000..b4d5f7de5
--- /dev/null
+++ b/src/blit.c
@@ -0,0 +1,209 @@
+#include "global.h"
+#include "blit.h"
+
+void BlitBitmapRect4BitWithoutColorKey(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)
+{
+ BlitBitmapRect4Bit(src, dst, srcX, srcY, dstX, dstY, width, height, 0xFF);
+}
+
+void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey)
+{
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierSrcY;
+ s32 multiplierDstY;
+ s32 loopSrcY, loopDstY;
+ s32 loopSrcX, loopDstX;
+ u8 *pixelsSrc;
+ u8 *pixelsDst;
+ s32 toOrr;
+ s32 toAnd;
+ s32 toShift;
+
+ if (dst->width - dstX < width)
+ xEnd = (dst->width - dstX) + srcX;
+ else
+ xEnd = srcX + width;
+
+ if (dst->height - dstY < height)
+ yEnd = (dst->height - dstY) + srcY;
+ else
+ yEnd = height + srcY;
+
+ multiplierSrcY = (src->width + (src->width & 7)) >> 3;
+ multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
+
+ if (colorKey == 0xFF)
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
+ pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);
+ toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);
+ toShift = ((loopDstX & 1) << 2);
+ toOrr <<= toShift;
+ toAnd = 0xF0 >> (toShift);
+ *pixelsDst = toOrr | (*pixelsDst & toAnd);
+ }
+ }
+ }
+ else
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
+ pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);
+ toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);
+ if (toOrr != colorKey)
+ {
+ toShift = ((loopDstX & 1) << 2);
+ toOrr <<= toShift;
+ toAnd = 0xF0 >> (toShift);
+ *pixelsDst = toOrr | (*pixelsDst & toAnd);
+ }
+ }
+ }
+ }
+}
+
+void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
+{
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierY;
+ s32 loopX, loopY;
+ s32 toOrr1, toOrr2;
+
+ xEnd = x + width;
+ if (xEnd > surface->width)
+ xEnd = surface->width;
+
+ yEnd = y + height;
+ if (yEnd > surface->height)
+ yEnd = surface->height;
+
+ multiplierY = (surface->width + (surface->width & 7)) >> 3;
+ toOrr1 = (u32)(fillValue << 0x1C) >> 0x18;
+ toOrr2 = (fillValue & 0xF);
+
+ for (loopY = y; loopY < yEnd; loopY++)
+ {
+ for (loopX = x; loopX < xEnd; loopX++)
+ {
+ u8 *pixels = surface->pixels + ((loopX >> 1) & 3) + ((loopX >> 3) << 5) + (((loopY >> 3) * multiplierY) << 5) + ((u32)(loopY << 0x1d) >> 0x1B);
+ if ((loopX << 0x1F) != 0)
+ *pixels = toOrr1 | (*pixels & 0xF);
+ else
+ *pixels = toOrr2 | (*pixels & 0xF0);
+ }
+ }
+}
+
+void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset)
+{
+ s32 palOffsetBits;
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierSrcY;
+ s32 multiplierDstY;
+ s32 loopSrcY, loopDstY;
+ s32 loopSrcX, loopDstX;
+ u8 *pixelsSrc;
+ u8 *pixelsDst;
+ s32 colorKeyBits;
+
+ palOffsetBits = (u32)(paletteOffset << 0x1C) >> 0x18;
+ colorKeyBits = (u32)(colorKey << 0x1C) >> 0x18;
+
+ if (dst->width - dstX < width)
+ xEnd = (dst->width - dstX) + srcX;
+ else
+ xEnd = width + srcX;
+
+ if (dst->height - dstY < height)
+ yEnd = (srcY + dst->height) - dstY;
+ else
+ yEnd = srcY + height;
+
+ multiplierSrcY = (src->width + (src->width & 7)) >> 3;
+ multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
+
+ if (colorKey == 0xFF)
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
+ if (loopSrcX & 1)
+ {
+ *pixelsDst = palOffsetBits + (*pixelsSrc >> 4);
+ }
+ else
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);
+ }
+ }
+ }
+ }
+ else
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ if (loopSrcX & 1)
+ {
+ if ((*pixelsSrc & 0xF0) != colorKeyBits)
+ {
+ pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
+ *pixelsDst = palOffsetBits + (*pixelsSrc >> 4);
+ }
+ }
+ else
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ if ((*pixelsSrc & 0xF) != colorKey)
+ {
+ pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
+ *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);
+ }
+ }
+ }
+ }
+ }
+}
+
+void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
+{
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierY;
+ s32 loopX, loopY;
+
+ xEnd = x + width;
+ if (xEnd > surface->width)
+ xEnd = surface->width;
+
+ yEnd = y + height;
+ if (yEnd > surface->height)
+ yEnd = surface->height;
+
+ multiplierY = (surface->width + (surface->width & 7)) >> 3;
+
+ for (loopY = y; loopY < yEnd; loopY++)
+ {
+ for (loopX = x; loopX < xEnd; loopX++)
+ {
+ u8 *pixels = surface->pixels + (loopX & 7) + ((loopX >> 3) << 6) + (((loopY >> 3) * multiplierY) << 6) + ((u32)(loopY << 0x1d) >> 0x1a);
+ *pixels = fillValue;
+ }
+ }
+}
diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c
index 85b2bc509..b7ed1f713 100755..100644
--- a/src/braille_puzzles.c
+++ b/src/braille_puzzles.c
@@ -1,12 +1,13 @@
#include "global.h"
#include "event_data.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "script.h"
-#include "species.h"
+#include "constants/species.h"
#include "task.h"
#include "field_effect.h"
-#include "flags.h"
+#include "constants/flags.h"
+#include "constants/maps.h"
extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); // fieldmap
extern void DrawWholeMapView(); // field_camera
@@ -14,7 +15,6 @@ extern void SetCameraPanningCallback(void ( *callback)()); // field_camera
extern void InstallCameraPanAheadCallback(void);
extern void SetCameraPanning(s16 x, s16 y);
extern u8 GetCursorSelectionMonId(void);
-extern void FieldEffectActiveListRemove(u8 id); // field_effect
extern u8 oei_task_add(void);
// why do this, GF?
@@ -24,8 +24,9 @@ enum
FLY_PUZZLE
};
-extern u8 gBraillePuzzleCallbackFlag;
-extern u8 gUnknown_085EFE74[][2];
+EWRAM_DATA static u8 sBraillePuzzleCallbackFlag = 0;
+
+extern const u8 gUnknown_085EFE74[][2];
void SealedChamberShakingEffect(u8);
void sub_8179860(void);
@@ -205,14 +206,25 @@ void SealedChamberShakingEffect(u8 taskId)
// moved later in the function because it was rewritten.
bool8 ShouldDoBrailleStrengthEffect(void)
{
- if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x06))
+ if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH)
+ && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(DESERT_RUINS)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(DESERT_RUINS))
{
if (gSaveBlock1Ptr->pos.x == 6 && gSaveBlock1Ptr->pos.y == 23)
- { gBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; }
+ {
+ sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
+ return TRUE;
+ }
else if (gSaveBlock1Ptr->pos.x == 5 && gSaveBlock1Ptr->pos.y == 23)
- { gBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; }
+ {
+ sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
+ return TRUE;
+ }
else if (gSaveBlock1Ptr->pos.x == 7 && gSaveBlock1Ptr->pos.y == 23)
- { gBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; }
+ {
+ sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
+ return TRUE;
+ }
}
return FALSE;
@@ -249,7 +261,7 @@ bool8 ShouldDoBrailleFlyEffect(void)
if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x44))
{
if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 25)
- { gBraillePuzzleCallbackFlag = FLY_PUZZLE; return TRUE; }
+ { sBraillePuzzleCallbackFlag = FLY_PUZZLE; return TRUE; }
}
return FALSE;
}
@@ -362,7 +374,7 @@ bool8 FldEff_UsePuzzleEffect(void)
{
u8 taskId = oei_task_add();
- if (gBraillePuzzleCallbackFlag == FLY_PUZZLE)
+ if (sBraillePuzzleCallbackFlag == FLY_PUZZLE)
{
gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16;
gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback;
@@ -375,37 +387,49 @@ bool8 FldEff_UsePuzzleEffect(void)
return FALSE;
}
-// can't get this one to match due to the weird macro-like varsets with strange bitshifting.
-// to note: 0x10000 is loaded in, and its obviously supposed to be 1, but i cant get 0x80 << 9 to be loaded in without using it directly.
-// maybe there's some way of writing it that works?
-#ifdef NONMATCHING
-// ShouldDoBrailleRegicePuzzle
bool8 ShouldDoBrailleRegicePuzzle(void)
{
u8 i;
- if (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x43)
+ if (gSaveBlock1Ptr->location.mapGroup == 0x18
+ && gSaveBlock1Ptr->location.mapNum == 0x43)
{
- // _08179A1A
if (FlagGet(FLAG_SYS_BRAILLE_WAIT) != FALSE)
return FALSE;
- if (FlagGet(2) == FALSE)
+ if (FlagGet(FLAG_0x002) == FALSE)
return FALSE;
- if (FlagGet(3) == TRUE)
+ if (FlagGet(FLAG_0x003) == TRUE)
return FALSE;
for (i = 0; i < 36; i++)
{
- if (gSaveBlock1Ptr->pos.x == gUnknown_085EFE74[i][0] && gSaveBlock1Ptr->pos.y == gUnknown_085EFE74[i][1])
+ u8 xPos = gUnknown_085EFE74[i][0];
+ u8 yPos = gUnknown_085EFE74[i][1];
+ if (gSaveBlock1Ptr->pos.x == xPos && gSaveBlock1Ptr->pos.y == yPos)
{
+ u16 varValue;
+
if (i < 16)
- VarSet(0x403B, (0x10000 << i | VarGet(0x403B) << 16) >> 16); // correct
+ {
+ u16 val = VarGet(0x403B);
+ val |= 1 << i;
+ VarSet(0x403B, val);
+ }
else if (i < 32)
- VarSet(0x403C, (0x10000 << (i - 16) | VarGet(0x403C) << 16) >> 16); // hmm?
+ {
+ u16 val = VarGet(0x403C);
+ val |= 1 << (i - 16);
+ VarSet(0x403C, val);
+ }
else
- VarSet(0x403D, (0x10000 << (i - 32) | VarGet(0x403D) << 16) >> 16); // hmm?
-
- if (VarGet(0x403B) != 0xFFFF || VarGet(0x403C) != 0xFF || VarGet(0x403D) != 0xF)
+ {
+ u16 val = VarGet(0x403D);
+ val |= 1 << (i - 32);
+ VarSet(0x403D, val);
+ }
+
+ varValue = VarGet(0x403B);
+ if (varValue != 0xFFFF || VarGet(0x403C) != varValue || VarGet(0x403D) != 0xF)
return FALSE;
if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 21)
@@ -414,170 +438,10 @@ bool8 ShouldDoBrailleRegicePuzzle(void)
return FALSE;
}
}
+
+ FlagSet(FLAG_0x003);
+ FlagClear(FLAG_0x002);
}
- // TODO: Find what flags 2 and 3 are.
- FlagSet(3);
- FlagClear(2);
+
return FALSE;
}
-#else
-__attribute__((naked))
-bool8 ShouldDoBrailleRegicePuzzle(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- ldr r4, =gSaveBlock1Ptr\n\
- ldr r0, [r4]\n\
- ldrh r1, [r0, 0x4]\n\
- ldr r0, =0x00004318\n\
- cmp r1, r0\n\
- beq _08179A1A\n\
- b _08179B5A\n\
-_08179A1A:\n\
- ldr r0, =0x000008b1\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _08179A28\n\
- b _08179B5A\n\
-_08179A28:\n\
- movs r0, 0x2\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _08179A36\n\
- b _08179B5A\n\
-_08179A36:\n\
- movs r0, 0x3\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x1\n\
- bne _08179A58\n\
- b _08179B5A\n\
- .pool\n\
-_08179A54:\n\
- movs r0, 0x1\n\
- b _08179B5C\n\
-_08179A58:\n\
- movs r5, 0\n\
- mov r8, r4\n\
- ldr r4, =gUnknown_085EFE74\n\
- adds r0, r4, 0x1\n\
- mov r12, r0\n\
- ldr r6, =0x0000403b\n\
- ldr r1, =0x0000403c\n\
- mov r9, r1\n\
-_08179A68:\n\
- lsls r0, r5, 1\n\
- adds r1, r0, r4\n\
- add r0, r12\n\
- ldrb r3, [r0]\n\
- mov r7, r8\n\
- ldr r2, [r7]\n\
- movs r7, 0\n\
- ldrsh r0, [r2, r7]\n\
- ldrb r1, [r1]\n\
- cmp r0, r1\n\
- bne _08179B44\n\
- movs r1, 0x2\n\
- ldrsh r0, [r2, r1]\n\
- cmp r0, r3\n\
- bne _08179B44\n\
- cmp r5, 0xF\n\
- bhi _08179AB0\n\
- adds r0, r6, 0\n\
- bl VarGet\n\
- lsls r0, 16\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- lsls r1, r5\n\
- orrs r1, r0\n\
- lsrs r1, 16\n\
- adds r0, r6, 0\n\
- bl VarSet\n\
- b _08179AF0\n\
- .pool\n\
-_08179AB0:\n\
- cmp r5, 0x1F\n\
- bhi _08179AD2\n\
- mov r0, r9\n\
- bl VarGet\n\
- lsls r0, 16\n\
- adds r2, r5, 0\n\
- subs r2, 0x10\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- lsls r1, r2\n\
- orrs r1, r0\n\
- lsrs r1, 16\n\
- mov r0, r9\n\
- bl VarSet\n\
- b _08179AF0\n\
-_08179AD2:\n\
- ldr r4, =0x0000403d\n\
- adds r0, r4, 0\n\
- bl VarGet\n\
- lsls r0, 16\n\
- adds r2, r5, 0\n\
- subs r2, 0x20\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- lsls r1, r2\n\
- orrs r1, r0\n\
- lsrs r1, 16\n\
- adds r0, r4, 0\n\
- bl VarSet\n\
-_08179AF0:\n\
- ldr r0, =0x0000403b\n\
- bl VarGet\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- ldr r0, =0x0000ffff\n\
- cmp r4, r0\n\
- bne _08179B5A\n\
- ldr r0, =0x0000403c\n\
- bl VarGet\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, r4\n\
- bne _08179B5A\n\
- ldr r0, =0x0000403d\n\
- bl VarGet\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0xF\n\
- bne _08179B5A\n\
- ldr r0, =gSaveBlock1Ptr\n\
- ldr r0, [r0]\n\
- ldr r1, [r0]\n\
- ldr r0, =0x00150008\n\
- cmp r1, r0\n\
- beq _08179A54\n\
- b _08179B5A\n\
- .pool\n\
-_08179B44:\n\
- adds r0, r5, 0x1\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- cmp r5, 0x23\n\
- bls _08179A68\n\
- movs r0, 0x3\n\
- bl FlagSet\n\
- movs r0, 0x2\n\
- bl FlagClear\n\
-_08179B5A:\n\
- movs r0, 0\n\
-_08179B5C:\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");
-}
-#endif
diff --git a/src/calculate_base_damage.c b/src/calculate_base_damage.c
deleted file mode 100644
index 89770b17a..000000000
--- a/src/calculate_base_damage.c
+++ /dev/null
@@ -1,283 +0,0 @@
-#include "global.h"
-#include "abilities.h"
-#include "battle.h"
-#include "hold_effects.h"
-#include "event_data.h"
-#include "item.h"
-#include "items.h"
-#include "pokemon.h"
-#include "species.h"
-#include "moves.h"
-#include "battle_move_effects.h"
-
-extern u32 gBattleTypeFlags;
-extern struct BattlePokemon gBattleMons[4];
-extern u16 gCurrentMove;
-extern u8 gCritMultiplier;
-extern u16 gBattleWeather;
-extern struct BattleEnigmaBerry gEnigmaBerries[];
-extern u16 gBattleMovePower;
-extern u16 gTrainerBattleOpponent_A;
-
-bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 bank);
-
-extern const struct BattleMove gBattleMoves[];
-extern const u8 gHoldEffectToType[][2];
-extern const u8 gStatStageRatios[][2];
-
-#define APPLY_STAT_MOD(var, mon, stat, statIndex) \
-{ \
- (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)]][0]; \
- (var) /= (gStatStageRatios)[(mon)->statStages[(statIndex)]][1]; \
-}
-
-s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef)
-{
- u32 i;
- s32 damage = 0;
- s32 damageHelper;
- u8 type;
- u16 attack, defense;
- u16 spAttack, spDefense;
- u8 defenderHoldEffect;
- u8 defenderHoldEffectParam;
- u8 attackerHoldEffect;
- u8 attackerHoldEffectParam;
-
- if (!powerOverride)
- gBattleMovePower = gBattleMoves[move].power;
- else
- gBattleMovePower = powerOverride;
-
- if (!typeOverride)
- type = gBattleMoves[move].type;
- else
- type = typeOverride & 0x3F;
-
- attack = attacker->attack;
- defense = defender->defense;
- spAttack = attacker->spAttack;
- spDefense = defender->spDefense;
-
- if (attacker->item == ITEM_ENIGMA_BERRY)
- {
- attackerHoldEffect = gEnigmaBerries[bankAtk].holdEffect;
- attackerHoldEffectParam = gEnigmaBerries[bankAtk].holdEffectParam;
- }
- else
- {
- attackerHoldEffect = ItemId_GetHoldEffect(attacker->item);
- attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item);
- }
-
- if (defender->item == ITEM_ENIGMA_BERRY)
- {
- defenderHoldEffect = gEnigmaBerries[bankDef].holdEffect;
- defenderHoldEffectParam = gEnigmaBerries[bankDef].holdEffectParam;
- }
- else
- {
- defenderHoldEffect = ItemId_GetHoldEffect(defender->item);
- defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item);
- }
-
- if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER)
- attack *= 2;
-
- if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, bankAtk))
- attack = (110 * attack) / 100;
- if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, bankDef))
- defense = (110 * defense) / 100;
- if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, bankAtk))
- spAttack = (110 * spAttack) / 100;
- if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, bankDef))
- spDefense = (110 * spDefense) / 100;
-
- for (i = 0; i < 17; i++)
- {
- if (attackerHoldEffect == gHoldEffectToType[i][0]
- && type == gHoldEffectToType[i][1])
- {
- if (type <= 8)
- attack = (attack * (attackerHoldEffectParam + 100)) / 100;
- else
- spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100;
- break;
- }
- }
-
- if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND)
- attack = (150 * attack) / 100;
- if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS))
- spAttack = (150 * spAttack) / 100;
- if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS))
- spDefense = (150 * spDefense) / 100;
- if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL)
- spAttack *= 2;
- if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL)
- spDefense *= 2;
- if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU)
- spAttack *= 2;
- if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO)
- defense *= 2;
- if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK))
- attack *= 2;
- if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE))
- spAttack /= 2;
- if (attacker->ability == ABILITY_HUSTLE)
- attack = (150 * attack) / 100;
- if (attacker->ability == ABILITY_PLUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MINUS, 0, 0))
- spAttack = (150 * spAttack) / 100;
- if (attacker->ability == ABILITY_MINUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_PLUS, 0, 0))
- spAttack = (150 * spAttack) / 100;
- if (attacker->ability == ABILITY_GUTS && attacker->status1)
- attack = (150 * attack) / 100;
- if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1)
- defense = (150 * defense) / 100;
- if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFD, 0))
- gBattleMovePower /= 2;
- if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFE, 0))
- gBattleMovePower /= 2;
- if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3))
- gBattleMovePower = (150 * gBattleMovePower) / 100;
- if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3))
- gBattleMovePower = (150 * gBattleMovePower) / 100;
- if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3))
- gBattleMovePower = (150 * gBattleMovePower) / 100;
- if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3))
- gBattleMovePower = (150 * gBattleMovePower) / 100;
- if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION)
- defense /= 2;
-
- if (type < TYPE_MYSTERY) // is physical
- {
- if (gCritMultiplier == 2)
- {
- if (attacker->statStages[STAT_STAGE_ATK] > 6)
- APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK)
- else
- damage = attack;
- }
- else
- APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK)
-
- damage = damage * gBattleMovePower;
- damage *= (2 * attacker->level / 5 + 2);
-
- if (gCritMultiplier == 2)
- {
- if (defender->statStages[STAT_STAGE_DEF] < 6)
- APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF)
- else
- damageHelper = defense;
- }
- else
- APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF)
-
- damage = damage / damageHelper;
- damage /= 50;
-
- if ((attacker->status1 & STATUS_BURN) && attacker->ability != ABILITY_GUTS)
- damage /= 2;
-
- if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
- {
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(2) == 2)
- damage = 2 * (damage / 3);
- else
- damage /= 2;
- }
-
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(2) == 2)
- damage /= 2;
-
- // moves always do at least 1 damage.
- if (damage == 0)
- damage = 1;
- }
-
- if (type == TYPE_MYSTERY)
- damage = 0; // is ??? type. does 0 damage.
-
- if (type > TYPE_MYSTERY) // is special?
- {
- if (gCritMultiplier == 2)
- {
- if (attacker->statStages[STAT_STAGE_SPATK] > 6)
- APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK)
- else
- damage = spAttack;
- }
- else
- APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK)
-
- damage = damage * gBattleMovePower;
- damage *= (2 * attacker->level / 5 + 2);
-
- if (gCritMultiplier == 2)
- {
- if (defender->statStages[STAT_STAGE_SPDEF] < 6)
- APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF)
- else
- damageHelper = spDefense;
- }
- else
- APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF)
-
- damage = (damage / damageHelper);
- damage /= 50;
-
- if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1)
- {
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(2) == 2)
- damage = 2 * (damage / 3);
- else
- damage /= 2;
- }
-
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(2) == 2)
- damage /= 2;
-
- // are effects of weather negated with cloud nine or air lock
- if (!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0)
- && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0))
- {
- if (gBattleWeather & WEATHER_RAIN_TEMPORARY)
- {
- switch (type)
- {
- case TYPE_FIRE:
- damage /= 2;
- break;
- case TYPE_WATER:
- damage = (15 * damage) / 10;
- break;
- }
- }
-
- // any weather except sun weakens solar beam
- if ((gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_HAIL)) && gCurrentMove == MOVE_SOLAR_BEAM)
- damage /= 2;
-
- // sunny
- if (gBattleWeather & WEATHER_SUN_ANY)
- {
- switch (type)
- {
- case TYPE_FIRE:
- damage = (15 * damage) / 10;
- break;
- case TYPE_WATER:
- damage /= 2;
- break;
- }
- }
- }
-
- // flash fire triggered
- if ((gBattleResources->flags->flags[bankAtk] & UNKNOWN_FLAG_FLASH_FIRE) && type == TYPE_FIRE)
- damage = (15 * damage) / 10;
- }
-
- return damage + 2;
-}
diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c
index 3192e0e11..266ea8250 100755..100644
--- a/src/clear_save_data_screen.c
+++ b/src/clear_save_data_screen.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "task.h"
-#include "menu.h"
#include "text.h"
+#include "menu.h"
#include "sound.h"
#include "main.h"
#include "save.h"
@@ -9,13 +9,11 @@
#include "gpu_regs.h"
#include "bg.h"
#include "text_window.h"
-#include "songs.h"
+#include "constants/songs.h"
extern u8 gText_ClearAllSaveData[];
extern u8 gText_ClearingData[];
-extern u16 gUnknown_0860F074[];
-
static void Task_DoClearSaveDataScreenYesNo(u8);
static void Task_ClearSaveDataScreenYesNoChoice(u8);
static void Task_ClearSaveData(u8);
@@ -88,7 +86,7 @@ static void Task_DoClearSaveDataScreenYesNo(u8 taskId)
static void Task_ClearSaveDataScreenYesNoChoice(u8 taskId)
{
- switch(sub_8198C58())
+ switch(ProcessMenuInputNoWrap_())
{
case 0:
FillWindowPixelBuffer(0, 17);
@@ -204,6 +202,6 @@ static void InitClearSaveDataScreenWindows(void)
InitWindows(sClearSaveTextWindow);
DeactivateAllTextPrinters();
FillWindowPixelBuffer(0, 0);
- sub_80987D4(0, 0, 2, 224);
+ LoadWindowGfx(0, 0, 2, 224);
LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
}
diff --git a/src/clock.c b/src/clock.c
new file mode 100644
index 000000000..ccbb0c24b
--- /dev/null
+++ b/src/clock.c
@@ -0,0 +1,93 @@
+#include "global.h"
+#include "rom6.h"
+#include "event_data.h"
+#include "rtc.h"
+#include "lottery_corner.h"
+#include "dewford_trend.h"
+#include "tv.h"
+#include "field_screen.h"
+#include "berry.h"
+#include "main.h"
+#include "overworld.h"
+#include "wallclock.h"
+
+// static types
+
+// static declarations
+
+static void UpdatePerDay(struct Time *localTime);
+static void UpdatePerMinute(struct Time *localTime);
+
+// rodata
+
+// text
+
+static void InitTimeBasedEvents(void)
+{
+ FlagSet(FLAG_SYS_CLOCK_SET);
+ RtcCalcLocalTime();
+ gSaveBlock2Ptr->lastBerryTreeUpdate = gLocalTime;
+ VarSet(VAR_DAYS, gLocalTime.days);
+}
+
+void DoTimeBasedEvents(void)
+{
+ if (FlagGet(FLAG_SYS_CLOCK_SET) && !sub_813B9C0())
+ {
+ RtcCalcLocalTime();
+ UpdatePerDay(&gLocalTime);
+ UpdatePerMinute(&gLocalTime);
+ }
+}
+
+static void UpdatePerDay(struct Time *localTime)
+{
+ u16 *days = GetVarPointer(VAR_DAYS);
+ u16 daysSince;
+
+ if (*days != localTime->days && *days <= localTime->days)
+ {
+ daysSince = localTime->days - *days;
+ ClearUpperFlags();
+ UpdateDewfordTrendPerDay(daysSince);
+ UpdateTVShowsPerDay(daysSince);
+ UpdateWeatherPerDay(daysSince);
+ UpdatePartyPokerusTime(daysSince);
+ UpdateMirageRnd(daysSince);
+ UpdateBirchState(daysSince);
+ UpdateFrontierManiac(daysSince);
+ UpdateFrontierGambler(daysSince);
+ SetShoalItemFlag(daysSince);
+ SetRandomLotteryNumber(daysSince);
+ *days = localTime->days;
+ }
+}
+
+static void UpdatePerMinute(struct Time *localTime)
+{
+ struct Time difference;
+ int minutes;
+
+ CalcTimeDifference(&difference, &gSaveBlock2Ptr->lastBerryTreeUpdate, localTime);
+ minutes = 24 * 60 * difference.days + 60 * difference.hours + difference.minutes;
+ if (minutes != 0)
+ {
+ if (minutes >= 0)
+ {
+ BerryTreeTimeUpdate(minutes);
+ gSaveBlock2Ptr->lastBerryTreeUpdate = *localTime;
+ }
+ }
+}
+
+static void ReturnFromStartWallClock(void)
+{
+ InitTimeBasedEvents();
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+void StartWallClock(void)
+{
+ SetMainCallback2(Cb2_StartWallClock);
+ gMain.savedCallback = ReturnFromStartWallClock;
+}
diff --git a/src/coins.c b/src/coins.c
index e1694b29c..12e0bd4ef 100644
--- a/src/coins.c
+++ b/src/coins.c
@@ -2,7 +2,7 @@
#include "coins.h"
#include "text.h"
#include "window.h"
-#include "text_window.h"
+#include "strings.h"
#include "string_util.h"
#include "menu.h"
#include "international_string_util.h"
@@ -11,10 +11,6 @@
EWRAM_DATA u8 sCoinsWindowId = 0;
-extern void sub_819746C(u8 windowId, bool8 copyToVram);
-
-extern const u8 gText_Coins[];
-
void PrintCoinsString(u32 coinAmount)
{
u32 xAlign;
@@ -53,7 +49,6 @@ void SetCoins(u16 coinAmount)
gSaveBlock1Ptr->coins = coinAmount ^ gSaveBlock2Ptr->encryptionKey;
}
-/* Can't match it lol
bool8 GiveCoins(u16 toAdd)
{
u16 newAmount;
@@ -67,10 +62,22 @@ bool8 GiveCoins(u16 toAdd)
}
else
{
- newAmount = ownedCoins + toAdd;
- if (newAmount > MAX_COINS)
- newAmount = MAX_COINS;
+ ownedCoins += toAdd;
+ if (ownedCoins > MAX_COINS)
+ ownedCoins = MAX_COINS;
+ newAmount = ownedCoins;
}
SetCoins(newAmount);
return TRUE;
-}*/
+}
+
+bool8 TakeCoins(u16 toSub)
+{
+ u16 ownedCoins = GetCoins();
+ if (ownedCoins >= toSub)
+ {
+ SetCoins(ownedCoins - toSub);
+ return TRUE;
+ }
+ return FALSE;
+}
diff --git a/src/coord_event_weather.c b/src/coord_event_weather.c
new file mode 100644
index 000000000..60b87fa30
--- /dev/null
+++ b/src/coord_event_weather.c
@@ -0,0 +1,119 @@
+#include "global.h"
+#include "constants/weather.h"
+#include "coord_event_weather.h"
+#include "field_weather.h"
+
+struct CoordEventWeather
+{
+ u8 coordEventWeather;
+ void (*func)(void);
+};
+
+static void CoordEventWeather_Clouds(void);
+static void CoordEventWeather_Sunny(void);
+static void CoordEventWeather_LightRain(void);
+static void CoordEventWeather_Snow(void);
+static void CoordEventWeather_Thunderstorm(void);
+static void CoordEventWeather_Fog(void);
+static void CoordEventWeather_DiagonalFog(void);
+static void CoordEventWeather_Ash(void);
+static void CoordEventWeather_Sandstorm(void);
+static void CoordEventWeather_Dark(void);
+static void CoordEventWeather_Drought(void);
+static void CoordEventWeather_Route119Cycle(void);
+static void CoordEventWeather_Route123Cycle(void);
+
+static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
+{
+ { COORD_EVENT_WEATHER_CLOUDS, CoordEventWeather_Clouds },
+ { COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny },
+ { COORD_EVENT_WEATHER_RAIN_LIGHT, CoordEventWeather_LightRain },
+ { COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow },
+ { COORD_EVENT_WEATHER_RAIN_MED, CoordEventWeather_Thunderstorm },
+ { COORD_EVENT_WEATHER_FOG_1, CoordEventWeather_Fog },
+ { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog },
+ { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash },
+ { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm },
+ { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark },
+ { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
+ { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
+ { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
+};
+
+static void CoordEventWeather_Clouds(void)
+{
+ SetWeather(WEATHER_CLOUDS);
+}
+
+static void CoordEventWeather_Sunny(void)
+{
+ SetWeather(WEATHER_SUNNY);
+}
+
+static void CoordEventWeather_LightRain(void)
+{
+ SetWeather(WEATHER_RAIN_LIGHT);
+}
+
+static void CoordEventWeather_Snow(void)
+{
+ SetWeather(WEATHER_SNOW);
+}
+
+static void CoordEventWeather_Thunderstorm(void)
+{
+ SetWeather(WEATHER_RAIN_MED);
+}
+
+static void CoordEventWeather_Fog(void)
+{
+ SetWeather(WEATHER_FOG_1);
+}
+
+static void CoordEventWeather_DiagonalFog(void)
+{
+ SetWeather(WEATHER_FOG_2);
+}
+
+static void CoordEventWeather_Ash(void)
+{
+ SetWeather(WEATHER_ASH);
+}
+
+static void CoordEventWeather_Sandstorm(void)
+{
+ SetWeather(WEATHER_SANDSTORM);
+}
+
+static void CoordEventWeather_Dark(void)
+{
+ SetWeather(WEATHER_SHADE);
+}
+
+static void CoordEventWeather_Drought(void)
+{
+ SetWeather(WEATHER_DROUGHT);
+}
+
+static void CoordEventWeather_Route119Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE119_CYCLE);
+}
+
+static void CoordEventWeather_Route123Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE123_CYCLE);
+}
+
+void DoCoordEventWeather(u8 coordEventWeather)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++)
+ {
+ if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather)
+ {
+ sCoordEventWeatherFuncs[i].func();
+ return;
+ }
+ }
+}
diff --git a/src/credits.c b/src/credits.c
new file mode 100644
index 000000000..168f3e8a3
--- /dev/null
+++ b/src/credits.c
@@ -0,0 +1,2355 @@
+#include "global.h"
+#include "palette.h"
+#include "main.h"
+#include "task.h"
+#include "bg.h"
+#include "malloc.h"
+#include "window.h"
+#include "text.h"
+#include "menu.h"
+#include "international_string_util.h"
+#include "constants/songs.h"
+#include "gpu_regs.h"
+#include "m4a.h"
+#include "constants/rgb.h"
+#include "battle_dome_cards.h"
+#include "starter_choose.h"
+#include "decompress.h"
+#include "intro_credits_graphics.h"
+#include "sound.h"
+#include "trig.h"
+#include "graphics.h"
+#include "pokedex.h"
+#include "constants/vars.h"
+#include "event_data.h"
+#include "random.h"
+
+enum
+{
+ PAGE_TITLE,
+ PAGE_DIRECTOR,
+ PAGE_ART_DIRECTOR,
+ PAGE_WORLD_DIRECTOR,
+ PAGE_LEAD_PROGRAMMER,
+ PAGE_PROGRAMMERS_1,
+ PAGE_PROGRAMMERS_2,
+ PAGE_PROGRAMMERS_3,
+ PAGE_PROGRAMMERS_4,
+ PAGE_GRAPHIC_DESIGNERS_1,
+ PAGE_GRAPHIC_DESIGNERS_2,
+ PAGE_GRAPHIC_DESIGNERS_3,
+ PAGE_MUSIC_COMPOSITION,
+ PAGE_SOUND_EFFECTS,
+ PAGE_GAME_DESIGNERS_1,
+ PAGE_GAME_DESIGNERS_2,
+ PAGE_GAME_DESIGNERS_3,
+ PAGE_SCENARIO_PLOT,
+ PAGE_SCENARIO,
+ PAGE_SCRIPT_DESIGNERS,
+ PAGE_MAP_DESIGNERS,
+ PAGE_BATTLE_FRONTIER_DATA,
+ PAGE_PARAMETRIC_DESIGNERS,
+ PAGE_POKEDEX_TEXT,
+ PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_1,
+ PAGE_PKMN_DESIGNERS_1,
+ PAGE_PKMN_DESIGNERS_2,
+ PAGE_PKMN_DESIGNERS_3,
+ PAGE_PKMN_DESIGNERS_4,
+ PAGE_SUPPORT_PROGRAMMERS,
+ PAGE_NCL_PRODUCT_TESTING,
+ PAGE_PACKAGE_AND_MANUAL,
+ PAGE_SPECIAL_THANKS_1,
+ PAGE_SPECIAL_THANKS_2,
+ PAGE_SPECIAL_THANKS_3,
+ PAGE_SPECIAL_THANKS_4,
+ PAGE_INFORMATION_SUPERVISORS,
+ PAGE_ARTWORK_1,
+ PAGE_ARTWORK_2,
+ PAGE_ARTWORK_3,
+ PAGE_COORDINATORS,
+ PAGE_ENGLISH_VERSION,
+ PAGE_TRANSLATOR,
+ PAGE_TEXT_EDITOR,
+ PAGE_NCL_COORDINATOR,
+ PAGE_PROGRAMMERS_5,
+ PAGE_GRAPHIC_DESIGNER,
+ PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_2,
+ PAGE_NOA_TESTING,
+ PAGE_BRAILLE_CODE_CHECK_1,
+ PAGE_BRAILLE_CODE_CHECK_2,
+ PAGE_SPECIAL_THANKS_5,
+ PAGE_TASK_MANAGERS,
+ PAGE_PRODUCERS,
+ PAGE_EXECUTIVE_DIRECTOR,
+ PAGE_EXECUTIVE_PRODUCERS_1,
+ PAGE_EXECUTIVE_PRODUCERS_2,
+ PAGE_COUNT
+};
+
+#define COLOR_DARK_GREEN RGB(7, 11, 6)
+#define COLOR_LIGHT_GREEN RGB(13, 20, 12)
+
+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,
+ TDA_13 = 13,
+ TDA_14 = 14,
+ TDA_TASK_B_ID = 15,
+
+ // Appears to be responsible for text
+ TDB_0 = 0,
+ TDB_TASK_A_ID = 1,
+ TDB_CURRENT_PAGE = 2,
+ TDB_3 = 3,
+
+ TDC_0 = 0,
+ 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,
+
+ TDE_0 = 0,
+ TDE_1 = 1,
+ TDE_TASK_A_ID = 2,
+};
+
+struct Unk201C000
+{
+ u16 unk0[71];
+ u16 unk8E;
+ u16 unk90;
+ u16 unk92;
+ u16 unk94;
+ u16 unk96[386];
+ u16 unk39A;
+ u16 unk39C[7];
+};
+
+struct CreditsEntry
+{
+ u8 var_0;
+ u8 var_1;
+ const u8 *text;
+};
+
+static EWRAM_DATA s16 gUnknown_0203BCE0 = 0;
+static EWRAM_DATA u16 gUnknown_0203BCE2 = 0; // TASK A
+EWRAM_DATA bool8 gHasHallOfFameRecords = 0;
+static EWRAM_DATA u8 gUnknown_0203BCE5 = 0;
+static EWRAM_DATA struct Unk201C000 *gUnknown_0203BCE8 = {0};
+
+static const u16 gUnknown_085E56F0[][16] =
+{
+ INCBIN_U16("graphics/credits/credits_1.gbapal"),
+ INCBIN_U16("graphics/credits/credits_2.gbapal"),
+ INCBIN_U16("graphics/credits/credits_3.gbapal"),
+ INCBIN_U16("graphics/credits/credits_4.gbapal"),
+};
+
+static const u8 gCreditsCopyrightEnd_Gfx[] = INCBIN_U8("graphics/credits/the_end_copyright.4bpp.lz");
+
+static void sub_81772B8(struct Sprite *sprite);
+
+static const u8 gUnknown_085E5BAC[] =
+{
+ 0, 1, 0,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+};
+
+static const u8 gUnknown_085E5BBB[] =
+{
+ 1, 0xFF, 1,
+ 1, 0xFF, 1,
+ 1, 2, 1,
+ 1, 0xFF, 1,
+ 1, 0xFF, 1,
+};
+
+static const u8 gUnknown_085E5BCA[] =
+{
+ 1, 0, 0,
+ 1, 0xFF, 0xFF,
+ 1, 2, 2,
+ 1, 0xFF, 0xFF,
+ 1, 0x80, 0x80,
+};
+
+static const u8 gUnknown_085E5BD9[] =
+{
+ 1, 3, 1,
+ 1, 4, 1,
+ 1, 5, 1,
+ 1, 0xC4, 1,
+ 1, 0xC3, 1,
+};
+
+static const u8 gUnknown_085E5BE8[] =
+{
+ 1, 6, 7,
+ 1, 8, 9,
+ 1, 0xFF, 1,
+ 1, 0x88, 0x89,
+ 1, 0x86, 0x87,
+};
+
+static const u8 gCreditsText_EmptyString[] = _("");
+static const u8 gCreditsText_PkmnEmeraldVersion[] = _("POKéMON EMERALD VERSION");
+static const u8 gCreditsText_Credits[] = _("Credits");
+static const u8 gCreditsText_ExecutiveDirector[] = _("Executive Director");
+static const u8 gCreditsText_Director[] = _("Director");
+static const u8 gCreditsText_ArtDirector[] = _("Art Director");
+static const u8 gCreditsText_BattleDirector[] = _("Battle Director");
+static const u8 gCreditsText_MainProgrammer[] = _("Main Programmer");
+static const u8 gCreditsText_BattleSystemPgrms[] = _("Battle System Programmers");
+static const u8 gCreditsText_FieldSystemPgrms[] = _("Field System Programmer");
+static const u8 gCreditsText_Programmers[] = _("Programmers");
+static const u8 gCreditsText_MainGraphicDesigner[] = _("Main Graphic Designer");
+static const u8 gCreditsText_GraphicDesigners[] = _("Graphic Designers");
+static const u8 gCreditsText_PkmnDesigners[] = _("POKéMON Designers");
+static const u8 gCreditsText_MusicComposition[] = _("Music Composition");
+static const u8 gCreditsText_SoundEffectsAndPkmnVoices[] = _("Sound Effects & POKéMON Voices");
+static const u8 gCreditsText_GameDesigners[] = _("Game Designers");
+static const u8 gCreditsText_ScenarioPlot[] = _("Scenario Plot");
+static const u8 gCreditsText_Scenario[] = _("Scenario");
+static const u8 gCreditsText_ScriptDesigners[] = _("Script Designers");
+static const u8 gCreditsText_MapDesigners[] = _("Map Designers");
+static const u8 gCreditsText_MapDataDesigners[] = _("Map Data Designers");
+static const u8 gCreditsText_ParametricDesigners[] = _("Parametric Designers");
+static const u8 gCreditsText_PokedexText[] = _("POKéDEX Text");
+static const u8 gCreditsText_EnvAndToolPgrms[] = _("Environment & Tool Programmers");
+static const u8 gCreditsText_NCLProductTesting[] = _("NCL Product Testing");
+static const u8 gCreditsText_SpecialThanks[] = _("Special Thanks");
+static const u8 gCreditsText_Coordinators[] = _("Coordinators");
+static const u8 gCreditsText_Producers[] = _("Producers");
+static const u8 gCreditsText_ExecProducers[] = _("Executive Producers");
+static const u8 gCreditsText_InfoSupervisors[] = _("Information Supervisors");
+static const u8 gCreditsText_TaskManagers[] = _("Task Managers");
+static const u8 gCreditsText_BrailleCodeCheck[] = _("Braille Code Check");
+static const u8 gCreditsText_WorldDirector[] = _("World Director");
+static const u8 gCreditsText_BattleFrontierData[] = _("Battle Frontier Data");
+static const u8 gCreditsText_SupportProgrammers[] = _("Support Programmers");
+static const u8 gCreditsText_Artwork[] = _("Artwork");
+static const u8 gCreditsText_LeadProgrammer[] = _("Lead Programmer");
+static const u8 gCreditsText_LeadGraphicArtist[] = _("Lead Graphic Artist");
+static const u8 gCreditsText_SatoshiTajiri[] = _("Satoshi Tajiri");
+static const u8 gCreditsText_JunichiMasuda[] = _("Junichi Masuda");
+static const u8 gCreditsText_KenSugimori[] = _("Ken Sugimori");
+static const u8 gCreditsText_ShigekiMorimoto[] = _("Shigeki Morimoto");
+static const u8 gCreditsText_TetsuyaWatanabe[] = _("Tetsuya Watanabe");
+static const u8 gCreditsText_HisashiSogabe[] = _("Hisashi Sogabe");
+static const u8 gCreditsText_SosukeTamada[] = _("Sosuke Tamada");
+static const u8 gCreditsText_AkitoMori[] = _("Akito Mori");
+static const u8 gCreditsText_KeitaKagaya[] = _("Keita Kagaya");
+static const u8 gCreditsText_YoshinoriMatsuda[] = _("Yoshinori Matsuda");
+static const u8 gCreditsText_HiroyukiNakamura[] = _("Hiroyuki Nakamura");
+static const u8 gCreditsText_MasaoTaya[] = _("Masao Taya");
+static const u8 gCreditsText_SatoshiNohara[] = _("Satoshi Nohara");
+static const u8 gCreditsText_TomomichiOhta[] = _("Tomomichi Ohta");
+static const u8 gCreditsText_MiyukiIwasawa[] = _("Miyuki Iwasawa");
+static const u8 gCreditsText_TakenoriOhta[] = _("Takenori Ohta");
+static const u8 gCreditsText_HironobuYoshida[] = _("Hironobu Yoshida");
+static const u8 gCreditsText_MotofumiFujiwara[] = _("Motofumi Fujiwara");
+static const u8 gCreditsText_SatoshiOhta[] = _("Satoshi Ohta");
+static const u8 gCreditsText_AsukaIwashita[] = _("Asuka Iwashita");
+static const u8 gCreditsText_AimiTomita[] = _("Aimi Tomita");
+static const u8 gCreditsText_TakaoUnno[] = _("Takao Unno");
+static const u8 gCreditsText_KanakoEo[] = _("Kanako Eo");
+static const u8 gCreditsText_JunOkutani[] = _("Jun Okutani");
+static const u8 gCreditsText_AtsukoNishida[] = _("Atsuko Nishida");
+static const u8 gCreditsText_MuneoSaito[] = _("Muneo Saito");
+static const u8 gCreditsText_RenaYoshikawa[] = _("Rena Yoshikawa");
+static const u8 gCreditsText_GoIchinose[] = _("Go Ichinose");
+static const u8 gCreditsText_MorikazuAoki[] = _("Morikazu Aoki");
+static const u8 gCreditsText_KojiNishino[] = _("Koji Nishino");
+static const u8 gCreditsText_KenjiMatsushima[] = _("Kenji Matsushima");
+static const u8 gCreditsText_TetsujiOhta[] = _("Tetsuji Ohta");
+static const u8 gCreditsText_HitomiSato[] = _("Hitomi Sato");
+static const u8 gCreditsText_TakeshiKawachimaru[] = _("Takeshi Kawachimaru");
+static const u8 gCreditsText_TeruyukiShimoyamada[] = _("Teruyuki Shimoyamada");
+static const u8 gCreditsText_ShigeruOhmori[] = _("Shigeru Ohmori");
+static const u8 gCreditsText_TadashiTakahashi[] = _("Tadashi Takahashi");
+static const u8 gCreditsText_ToshinobuMatsumiya[] = _("Toshinobu Matsumiya");
+static const u8 gCreditsText_AkihitoTomisawa[] = _("Akihito Tomisawa");
+static const u8 gCreditsText_HirokiEnomoto[] = _("Hiroki Enomoto");
+static const u8 gCreditsText_KazuyukiTerada[] = _("Kazuyuki Terada");
+static const u8 gCreditsText_YuriSakurai[] = _("Yuri Sakurai");
+static const u8 gCreditsText_HiromiSagawa[] = _("Hiromi Sagawa");
+static const u8 gCreditsText_KenjiTominaga[] = _("Kenji Tominaga");
+static const u8 gCreditsText_YoshioTajiri[] = _("Yoshio Tajiri");
+static const u8 gCreditsText_TeikoSasaki[] = _("Teiko Sasaki");
+static const u8 gCreditsText_SachikoHamano[] = _("Sachiko Hamano");
+static const u8 gCreditsText_ChieMatsumiya[] = _("Chie Matsumiya");
+static const u8 gCreditsText_AkikoShinozaki[] = _("Akiko Shinozaki");
+static const u8 gCreditsText_AstukoFujii[] = _("Astuko Fujii");
+static const u8 gCreditsText_NozomuSaito[] = _("Nozomu Saito");
+static const u8 gCreditsText_KenkichiToyama[] = _("Kenkichi Toyama");
+static const u8 gCreditsText_SuguruNakatsui[] = _("Suguru Nakatsui");
+static const u8 gCreditsText_YumiFunasaka[] = _("Yumi Funasaka");
+static const u8 gCreditsText_NaokoYanase[] = _("Naoko Yanase");
+static const u8 gCreditsText_NCLSuperMarioClub[] = _("NCL Super Mario Club");
+static const u8 gCreditsText_AtsushiTada[] = _("Atsushi Tada");
+static const u8 gCreditsText_TakahiroOhnishi[] = _("Takahiro Ohnishi");
+static const u8 gCreditsText_NorihideOkamura[] = _("Norihide Okamura");
+static const u8 gCreditsText_HiroNakamura[] = _("Hiro Nakamura");
+static const u8 gCreditsText_HiroyukiUesugi[] = _("Hiroyuki Uesugi");
+static const u8 gCreditsText_TerukiMurakawa[] = _("Teruki Murakawa");
+static const u8 gCreditsText_AkiraKinashi[] = _("Akira Kinashi");
+static const u8 gCreditsText_MichikoTakizawa[] = _("Michiko Takizawa");
+static const u8 gCreditsText_MakikoTakada[] = _("Makiko Takada");
+static const u8 gCreditsText_TakanaoKondo[] = _("Takanao Kondo");
+static const u8 gCreditsText_AiMashima[] = _("Ai Mashima");
+static const u8 gCreditsText_GakujiNomoto[] = _("Gakuji Nomoto");
+static const u8 gCreditsText_TakehiroIzushi[] = _("Takehiro Izushi");
+static const u8 gCreditsText_HitoshiYamagami[] = _("Hitoshi Yamagami");
+static const u8 gCreditsText_KyokoWatanabe[] = _("Kyoko Watanabe");
+static const u8 gCreditsText_TakaoNakano[] = _("Takao Nakano");
+static const u8 gCreditsText_HiroyukiJinnai[] = _("Hiroyuki Jinnai");
+static const u8 gCreditsText_HiroakiTsuru[] = _("Hiroaki Tsuru");
+static const u8 gCreditsText_TsunekazIshihara[] = _("Tsunekaz Ishihara");
+static const u8 gCreditsText_SatoruIwata[] = _("Satoru Iwata");
+static const u8 gCreditsText_KazuyaSuyama[] = _("Kazuya Suyama");
+static const u8 gCreditsText_SatoshiMitsuhara[] = _("Satoshi Mitsuhara");
+static const u8 gCreditsText_JapanBrailleLibrary[] = _("Japan Braille Library");
+static const u8 gCreditsText_TomotakaKomura[] = _("Tomotaka Komura");
+static const u8 gCreditsText_MikikoOhhashi[] = _("Mikiko Ohhashi");
+static const u8 gCreditsText_DaisukeHoshino[] = _("Daisuke Hoshino");
+static const u8 gCreditsText_KenjiroIto[] = _("Kenjiro Ito");
+static const u8 gCreditsText_RuiKawaguchi[] = _("Rui Kawaguchi");
+static const u8 gCreditsText_ShunsukeKohori[] = _("Shunsuke Kohori");
+static const u8 gCreditsText_SachikoNakamichi[] = _("Sachiko Nakamichi");
+static const u8 gCreditsText_FujikoNomura[] = _("Fujiko Nomura");
+static const u8 gCreditsText_KazukiYoshihara[] = _("Kazuki Yoshihara");
+static const u8 gCreditsText_RetsujiNomoto[] = _("Retsuji Nomoto");
+static const u8 gCreditsText_AzusaTajima[] = _("Azusa Tajima");
+static const u8 gCreditsText_ShusakuEgami[] = _("Shusaku Egami");
+static const u8 gCreditsText_PackageAndManual[] = _("Package & Manual Illustration");
+static const u8 gCreditsText_EnglishVersion[] = _("English Version Coordinators");
+static const u8 gCreditsText_Translator[] = _("Translator");
+static const u8 gCreditsText_TextEditor[] = _("Text Editor");
+static const u8 gCreditsText_NCLCoordinator[] = _("NCL Coordinator");
+static const u8 gCreditsText_GraphicDesigner[] = _("Graphic Designer");
+static const u8 gCreditsText_NOAProductTesting[] = _("NOA Product Testing");
+static const u8 gCreditsText_HideyukiNakajima[] = _("Hideyuki Nakajima");
+static const u8 gCreditsText_HidenoriSaeki[] = _("Hidenori Saeki");
+static const u8 gCreditsText_YokoWatanabe[] = _("Yoko Watanabe");
+static const u8 gCreditsText_SakaeKimura[] = _("Sakae Kimura");
+static const u8 gCreditsText_ChiakiShinkai[] = _("Chiaki Shinkai");
+static const u8 gCreditsText_SethMcMahill[] = _("Seth McMahill");
+static const u8 gCreditsText_NobOgasawara[] = _("Nob Ogasawara");
+static const u8 gCreditsText_TeresaLillygren[] = _("Teresa Lillygren");
+static const u8 gCreditsText_KimikoNakamichi[] = _("Kimiko Nakamichi");
+static const u8 gCreditsText_SouichiYamamoto[] = _("Souichi Yamamoto");
+static const u8 gCreditsText_YuichiroIto[] = _("Yuichiro Ito");
+static const u8 gCreditsText_ThomasHertzog[] = _("Thomas Hertzog");
+static const u8 gCreditsText_MikaKurosawa[] = _("Mika Kurosawa");
+static const u8 gCreditsText_NationalFederationBlind[] = _("National Federation of the Blind");
+static const u8 gCreditsText_PatriciaAMaurer[] = _("Patricia A. Maurer");
+static const u8 gCreditsText_EuropeanBlindUnion[] = _("European Blind Union");
+static const u8 gCreditsText_AustralianBrailleAuthority[] = _("Australian Braille Authority");
+static const u8 gCreditsText_RoyalNewZealandFederationBlind[] = _("Royal New Zealand Federation for the Blind");
+static const u8 gCreditsText_MotoyasuTojima[] = _("Motoyasu Tojima");
+static const u8 gCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow");
+static const u8 gCreditsText_ShellieDow[] = _("Shellie Dow");
+static const u8 gCreditsText_ErikJohnson[] = _("Erik Johnson");
+static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, 0, gCreditsText_EmptyString};
+static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, 1, gCreditsText_PkmnEmeraldVersion};
+static const struct CreditsEntry gCreditsEntry_Credits[] = {11, 1, gCreditsText_Credits};
+static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, 1, gCreditsText_ExecutiveDirector};
+static const struct CreditsEntry gCreditsEntry_Director[] = {12, 1, gCreditsText_Director};
+static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, 1, gCreditsText_ArtDirector};
+static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, 1, gCreditsText_BattleDirector};
+static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, 1, gCreditsText_MainProgrammer};
+static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, 1, gCreditsText_BattleSystemPgrms};
+static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, 1, gCreditsText_FieldSystemPgrms};
+static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, 1, gCreditsText_Programmers};
+static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, 1, gCreditsText_MainGraphicDesigner};
+static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, 1, gCreditsText_GraphicDesigners};
+static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, 1, gCreditsText_PkmnDesigners};
+static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, 1, gCreditsText_MusicComposition};
+static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, 1, gCreditsText_SoundEffectsAndPkmnVoices};
+static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, 1, gCreditsText_GameDesigners};
+static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, 1, gCreditsText_ScenarioPlot};
+static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, 1, gCreditsText_Scenario};
+static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, 1, gCreditsText_ScriptDesigners};
+static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, 1, gCreditsText_MapDesigners};
+static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, 1, gCreditsText_MapDataDesigners};
+static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, 1, gCreditsText_ParametricDesigners};
+static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, 1, gCreditsText_PokedexText};
+static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, 1, gCreditsText_EnvAndToolPgrms};
+static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, 1, gCreditsText_NCLProductTesting};
+static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, 1, gCreditsText_SpecialThanks};
+static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, 1, gCreditsText_Coordinators};
+static const struct CreditsEntry gCreditsEntry_Producers[] = {11, 1, gCreditsText_Producers};
+static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, 1, gCreditsText_ExecProducers};
+static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, 1, gCreditsText_InfoSupervisors};
+static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, 1, gCreditsText_TaskManagers};
+static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, 1, gCreditsText_BrailleCodeCheck};
+static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, 1, gCreditsText_WorldDirector};
+static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, 1, gCreditsText_BattleFrontierData};
+static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, 1, gCreditsText_SupportProgrammers};
+static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, 1, gCreditsText_Artwork};
+static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, 1, gCreditsText_LeadProgrammer};
+static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, 1, gCreditsText_LeadGraphicArtist};
+static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, 0, gCreditsText_SatoshiTajiri};
+static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, 0, gCreditsText_JunichiMasuda};
+static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, 0, gCreditsText_KenSugimori};
+static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, 0, gCreditsText_ShigekiMorimoto};
+static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, 0, gCreditsText_TetsuyaWatanabe};
+static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, 0, gCreditsText_HisashiSogabe};
+static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, 0, gCreditsText_SosukeTamada};
+static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, 0, gCreditsText_AkitoMori};
+static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, 0, gCreditsText_KeitaKagaya};
+static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, 0, gCreditsText_YoshinoriMatsuda};
+static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, 0, gCreditsText_HiroyukiNakamura};
+static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, 0, gCreditsText_MasaoTaya};
+static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, 0, gCreditsText_SatoshiNohara};
+static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, 0, gCreditsText_TomomichiOhta};
+static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, 0, gCreditsText_MiyukiIwasawa};
+static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, 0, gCreditsText_TakenoriOhta};
+static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, 0, gCreditsText_HironobuYoshida};
+static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, 0, gCreditsText_MotofumiFujiwara};
+static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, 0, gCreditsText_SatoshiOhta};
+static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, 0, gCreditsText_AsukaIwashita};
+static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, 0, gCreditsText_AimiTomita};
+static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, 0, gCreditsText_TakaoUnno};
+static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, 0, gCreditsText_KanakoEo};
+static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, 0, gCreditsText_JunOkutani};
+static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, 0, gCreditsText_AtsukoNishida};
+static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, 0, gCreditsText_MuneoSaito};
+static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, 0, gCreditsText_RenaYoshikawa};
+static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, 0, gCreditsText_GoIchinose};
+static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, 0, gCreditsText_MorikazuAoki};
+static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, 0, gCreditsText_KojiNishino};
+static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, 0, gCreditsText_KenjiMatsushima};
+static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, 0, gCreditsText_TetsujiOhta};
+static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, 0, gCreditsText_HitomiSato};
+static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, 0, gCreditsText_TakeshiKawachimaru};
+static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, 0, gCreditsText_TeruyukiShimoyamada};
+static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, 0, gCreditsText_ShigeruOhmori};
+static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, 0, gCreditsText_TadashiTakahashi};
+static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, 0, gCreditsText_ToshinobuMatsumiya};
+static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, 0, gCreditsText_AkihitoTomisawa};
+static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, 0, gCreditsText_HirokiEnomoto};
+static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, 0, gCreditsText_KazuyukiTerada};
+static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, 0, gCreditsText_YuriSakurai};
+static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, 0, gCreditsText_HiromiSagawa};
+static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, 0, gCreditsText_KenjiTominaga};
+static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, 0, gCreditsText_YoshioTajiri};
+static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, 0, gCreditsText_TeikoSasaki};
+static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, 0, gCreditsText_SachikoHamano};
+static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, 0, gCreditsText_ChieMatsumiya};
+static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, 0, gCreditsText_AkikoShinozaki};
+static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, 0, gCreditsText_AstukoFujii};
+static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, 0, gCreditsText_NozomuSaito};
+static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, 0, gCreditsText_KenkichiToyama};
+static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, 0, gCreditsText_SuguruNakatsui};
+static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, 0, gCreditsText_YumiFunasaka};
+static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, 0, gCreditsText_NaokoYanase};
+static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, 0, gCreditsText_NCLSuperMarioClub};
+static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, 0, gCreditsText_AtsushiTada};
+static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, 0, gCreditsText_TakahiroOhnishi};
+static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, 0, gCreditsText_NorihideOkamura};
+static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, 0, gCreditsText_HiroNakamura};
+static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, 0, gCreditsText_HiroyukiUesugi};
+static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, 0, gCreditsText_TerukiMurakawa};
+static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, 0, gCreditsText_AkiraKinashi};
+static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, 0, gCreditsText_MichikoTakizawa};
+static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, 0, gCreditsText_MakikoTakada};
+static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, 0, gCreditsText_TakanaoKondo};
+static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, 0, gCreditsText_AiMashima};
+static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, 0, gCreditsText_GakujiNomoto};
+static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, 0, gCreditsText_TakehiroIzushi};
+static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, 0, gCreditsText_HitoshiYamagami};
+static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, 0, gCreditsText_KyokoWatanabe};
+static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, 0, gCreditsText_TakaoNakano};
+static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, 0, gCreditsText_HiroyukiJinnai};
+static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, 0, gCreditsText_HiroakiTsuru};
+static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, 0, gCreditsText_TsunekazIshihara};
+static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, 0, gCreditsText_SatoruIwata};
+static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, 0, gCreditsText_KazuyaSuyama};
+static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, 0, gCreditsText_SatoshiMitsuhara};
+static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, 0, gCreditsText_JapanBrailleLibrary};
+static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, 0, gCreditsText_TomotakaKomura};
+static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, 0, gCreditsText_MikikoOhhashi};
+static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, 0, gCreditsText_DaisukeHoshino};
+static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, 0, gCreditsText_KenjiroIto};
+static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, 0, gCreditsText_RuiKawaguchi};
+static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, 0, gCreditsText_ShunsukeKohori};
+static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, 0, gCreditsText_SachikoNakamichi};
+static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, 0, gCreditsText_FujikoNomura};
+static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, 0, gCreditsText_KazukiYoshihara};
+static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, 0, gCreditsText_RetsujiNomoto};
+static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, 0, gCreditsText_AzusaTajima};
+static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, 0, gCreditsText_ShusakuEgami};
+static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, 1, gCreditsText_PackageAndManual};
+static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, 1, gCreditsText_EnglishVersion};
+static const struct CreditsEntry gCreditsEntry_Translator[] = {0, 1, gCreditsText_Translator};
+static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, 1, gCreditsText_TextEditor};
+static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, 1, gCreditsText_NCLCoordinator};
+static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, 1, gCreditsText_GraphicDesigner};
+static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, 1, gCreditsText_NOAProductTesting};
+static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, 0, gCreditsText_HideyukiNakajima};
+static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, 0, gCreditsText_HidenoriSaeki};
+static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, 0, gCreditsText_YokoWatanabe};
+static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, 0, gCreditsText_SakaeKimura};
+static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, 0, gCreditsText_ChiakiShinkai};
+static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, 0, gCreditsText_SethMcMahill};
+static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, 0, gCreditsText_NobOgasawara};
+static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, 0, gCreditsText_TeresaLillygren};
+static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, 0, gCreditsText_KimikoNakamichi};
+static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, 0, gCreditsText_SouichiYamamoto};
+static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, 0, gCreditsText_YuichiroIto};
+static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, 0, gCreditsText_ThomasHertzog};
+static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, 0, gCreditsText_MikaKurosawa};
+static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, 0, gCreditsText_NationalFederationBlind};
+static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, 0, gCreditsText_PatriciaAMaurer};
+static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, 0, gCreditsText_EuropeanBlindUnion};
+static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, 0, gCreditsText_AustralianBrailleAuthority};
+static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, 0, gCreditsText_RoyalNewZealandFederationBlind};
+static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, 0, gCreditsText_MotoyasuTojima};
+static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, 0, gCreditsText_NicolaPrattBarlow};
+static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, 0, gCreditsText_ShellieDow};
+static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, 0, gCreditsText_ErikJohnson};
+
+#define _ gCreditsEntry_EmptyString
+static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] =
+{
+ {
+ _,
+ gCreditsEntry_PkmnEmeraldVersion,
+ gCreditsEntry_Credits,
+ _,
+ _
+ },
+ {
+ _,
+ gCreditsEntry_Director,
+ gCreditsEntry_ShigekiMorimoto,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_ArtDirector,
+ gCreditsEntry_KenSugimori,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_WorldDirector,
+ gCreditsEntry_JunichiMasuda,
+ _,
+ _,
+ },
+ {
+ gCreditsEntry_LeadProgrammer,
+ gCreditsEntry_HisashiSogabe,
+ gCreditsEntry_LeadGraphicArtist,
+ gCreditsEntry_MotofumiFujiwara,
+ _,
+ },
+ {
+ gCreditsEntry_Programmers,
+ gCreditsEntry_HisashiSogabe,
+ gCreditsEntry_TomomichiOhta,
+ gCreditsEntry_NozomuSaito,
+ gCreditsEntry_EmptyString,
+ },
+ {
+ gCreditsEntry_Programmers,
+ gCreditsEntry_AkitoMori,
+ gCreditsEntry_HiroyukiNakamura,
+ gCreditsEntry_MasaoTaya,
+ _,
+ },
+ {
+ gCreditsEntry_Programmers,
+ gCreditsEntry_SatoshiNohara,
+ gCreditsEntry_MiyukiIwasawa,
+ gCreditsEntry_YoshinoriMatsuda,
+ gCreditsEntry_KeitaKagaya,
+ },
+ {
+ gCreditsEntry_Programmers,
+ gCreditsEntry_TetsuyaWatanabe,
+ gCreditsEntry_SosukeTamada,
+ gCreditsEntry_TakenoriOhta,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_GraphicDesigners,
+ gCreditsEntry_MotofumiFujiwara,
+ gCreditsEntry_SatoshiOhta,
+ _,
+ },
+ {
+ gCreditsEntry_GraphicDesigners,
+ gCreditsEntry_KenkichiToyama,
+ gCreditsEntry_AsukaIwashita,
+ gCreditsEntry_TakaoUnno,
+ _,
+ },
+ {
+ gCreditsEntry_GraphicDesigners,
+ gCreditsEntry_KenSugimori,
+ gCreditsEntry_HironobuYoshida,
+ gCreditsEntry_AimiTomita,
+ gCreditsEntry_KanakoEo,
+ },
+ {
+ gCreditsEntry_MusicComposition,
+ gCreditsEntry_GoIchinose,
+ gCreditsEntry_JunichiMasuda,
+ gCreditsEntry_MorikazuAoki,
+ gCreditsEntry_HitomiSato,
+ },
+ {
+ _,
+ gCreditsEntry_SoundEffectsAndPkmnVoices,
+ gCreditsEntry_GoIchinose,
+ gCreditsEntry_MorikazuAoki,
+ _,
+ },
+ {
+ gCreditsEntry_GameDesigners,
+ gCreditsEntry_ShigekiMorimoto,
+ gCreditsEntry_TeruyukiShimoyamada,
+ gCreditsEntry_TakeshiKawachimaru,
+ gCreditsEntry_AkihitoTomisawa,
+ },
+ {
+ gCreditsEntry_GameDesigners,
+ gCreditsEntry_SuguruNakatsui,
+ gCreditsEntry_TetsujiOhta,
+ gCreditsEntry_HitomiSato,
+ gCreditsEntry_KenjiMatsushima,
+ },
+ {
+ gCreditsEntry_GameDesigners,
+ gCreditsEntry_JunichiMasuda,
+ gCreditsEntry_KojiNishino,
+ gCreditsEntry_ShigeruOhmori,
+ gCreditsEntry_TadashiTakahashi,
+ },
+ {
+ gCreditsEntry_ScenarioPlot,
+ gCreditsEntry_AkihitoTomisawa,
+ gCreditsEntry_JunichiMasuda,
+ gCreditsEntry_KojiNishino,
+ _,
+ },
+ {
+ gCreditsEntry_Scenario,
+ gCreditsEntry_AkihitoTomisawa,
+ gCreditsEntry_HitomiSato,
+ gCreditsEntry_ToshinobuMatsumiya,
+ _,
+ },
+ {
+ gCreditsEntry_ScriptDesigners,
+ gCreditsEntry_TomomichiOhta,
+ gCreditsEntry_SatoshiNohara,
+ _,
+ _,
+ },
+ {
+ gCreditsEntry_MapDesigners,
+ gCreditsEntry_SuguruNakatsui,
+ gCreditsEntry_TeruyukiShimoyamada,
+ gCreditsEntry_ShigeruOhmori,
+ gCreditsEntry_TetsujiOhta,
+ },
+ {
+ _,
+ gCreditsEntry_BattleFrontierData,
+ gCreditsEntry_TetsujiOhta,
+ _,
+ _,
+ },
+ {
+ gCreditsEntry_ParametricDesigners,
+ gCreditsEntry_TeruyukiShimoyamada,
+ gCreditsEntry_ShigekiMorimoto,
+ gCreditsEntry_TetsujiOhta,
+ gCreditsEntry_KojiNishino,
+ },
+ {
+ _,
+ gCreditsEntry_PokedexText,
+ gCreditsEntry_KenjiMatsushima,
+ _,
+ _,
+ },
+ {
+ gCreditsEntry_EnvAndToolPgrms,
+ gCreditsEntry_HisashiSogabe,
+ gCreditsEntry_SosukeTamada,
+ gCreditsEntry_HiroyukiNakamura,
+ gCreditsEntry_AkitoMori,
+ },
+ {
+ gCreditsEntry_PkmnDesigners,
+ gCreditsEntry_KenSugimori,
+ gCreditsEntry_MotofumiFujiwara,
+ gCreditsEntry_ShigekiMorimoto,
+ _,
+ },
+ {
+ gCreditsEntry_PkmnDesigners,
+ gCreditsEntry_HironobuYoshida,
+ gCreditsEntry_SatoshiOhta,
+ gCreditsEntry_AsukaIwashita,
+ _,
+ },
+ {
+ gCreditsEntry_PkmnDesigners,
+ gCreditsEntry_TakaoUnno,
+ gCreditsEntry_KanakoEo,
+ gCreditsEntry_AimiTomita,
+ _,
+ },
+ {
+ gCreditsEntry_PkmnDesigners,
+ gCreditsEntry_AtsukoNishida,
+ gCreditsEntry_MuneoSaito,
+ gCreditsEntry_RenaYoshikawa,
+ gCreditsEntry_JunOkutani,
+ },
+ {
+ _,
+ gCreditsEntry_SupportProgrammers,
+ gCreditsEntry_SatoshiMitsuhara,
+ gCreditsEntry_DaisukeHoshino,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_NCLProductTesting,
+ gCreditsEntry_NCLSuperMarioClub,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_PackageAndManual,
+ gCreditsEntry_KenSugimori,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_SpecialThanks,
+ gCreditsEntry_KenjiTominaga,
+ gCreditsEntry_HirokiEnomoto,
+ _,
+ },
+ {
+ gCreditsEntry_SpecialThanks,
+ gCreditsEntry_KazuyaSuyama,
+ gCreditsEntry_KenjiroIto,
+ gCreditsEntry_MichikoTakizawa,
+ gCreditsEntry_MakikoTakada,
+ },
+ {
+ gCreditsEntry_SpecialThanks,
+ gCreditsEntry_MikikoOhhashi,
+ gCreditsEntry_TakanaoKondo,
+ gCreditsEntry_RuiKawaguchi,
+ _,
+ },
+ {
+ gCreditsEntry_SpecialThanks,
+ gCreditsEntry_TakahiroOhnishi,
+ gCreditsEntry_NorihideOkamura,
+ gCreditsEntry_ShunsukeKohori,
+ _,
+ },
+ {
+ gCreditsEntry_InfoSupervisors,
+ gCreditsEntry_KazuyukiTerada,
+ gCreditsEntry_YuriSakurai,
+ gCreditsEntry_YumiFunasaka,
+ gCreditsEntry_NaokoYanase,
+ },
+ {
+ _,
+ gCreditsEntry_Artwork,
+ gCreditsEntry_SachikoNakamichi,
+ gCreditsEntry_FujikoNomura,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_Artwork,
+ gCreditsEntry_HideyukiNakajima,
+ gCreditsEntry_HidenoriSaeki,
+ _,
+ },
+ {
+ gCreditsEntry_Artwork,
+ gCreditsEntry_YokoWatanabe,
+ gCreditsEntry_SakaeKimura,
+ gCreditsEntry_ChiakiShinkai,
+ _,
+ },
+ {
+ gCreditsEntry_Coordinators,
+ gCreditsEntry_KazukiYoshihara,
+ gCreditsEntry_AkiraKinashi,
+ gCreditsEntry_RetsujiNomoto,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_EnglishVersion,
+ gCreditsEntry_HiroNakamura,
+ gCreditsEntry_SethMcMahill,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_Translator,
+ gCreditsEntry_NobOgasawara,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_TextEditor,
+ gCreditsEntry_TeresaLillygren,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_NCLCoordinator,
+ gCreditsEntry_KimikoNakamichi,
+ _,
+ _,
+ },
+ {
+ gCreditsEntry_Programmers,
+ gCreditsEntry_TerukiMurakawa,
+ gCreditsEntry_SouichiYamamoto,
+ gCreditsEntry_YuichiroIto,
+ gCreditsEntry_AkiraKinashi,
+ },
+ {
+ _,
+ gCreditsEntry_GraphicDesigner,
+ gCreditsEntry_AkiraKinashi,
+ _,
+ _,
+ },
+ {
+ gCreditsEntry_EnvAndToolPgrms,
+ gCreditsEntry_TerukiMurakawa,
+ gCreditsEntry_SouichiYamamoto,
+ gCreditsEntry_KimikoNakamichi,
+ _,
+ },
+ {
+ gCreditsEntry_NOAProductTesting,
+ gCreditsEntry_ThomasHertzog,
+ gCreditsEntry_ErikJohnson,
+ gCreditsEntry_MikaKurosawa,
+ _,
+ },
+ {
+ gCreditsEntry_BrailleCodeCheck,
+ gCreditsEntry_NationalFederationBlind,
+ gCreditsEntry_PatriciaAMaurer,
+ gCreditsEntry_JapanBrailleLibrary,
+ gCreditsEntry_EuropeanBlindUnion,
+ },
+ {
+ _,
+ gCreditsEntry_BrailleCodeCheck,
+ gCreditsEntry_AustralianBrailleAuthority,
+ gCreditsEntry_RoyalNewZealandFederationBlind,
+ _,
+ },
+ {
+ gCreditsEntry_SpecialThanks,
+ gCreditsEntry_HiroyukiUesugi,
+ gCreditsEntry_MotoyasuTojima,
+ gCreditsEntry_NicolaPrattBarlow,
+ gCreditsEntry_ShellieDow,
+ },
+ {
+ _,
+ gCreditsEntry_TaskManagers,
+ gCreditsEntry_AzusaTajima,
+ gCreditsEntry_ShusakuEgami,
+ _,
+ },
+ {
+ gCreditsEntry_Producers,
+ gCreditsEntry_HiroyukiJinnai,
+ gCreditsEntry_HitoshiYamagami,
+ gCreditsEntry_GakujiNomoto,
+ gCreditsEntry_HiroakiTsuru,
+ },
+ {
+ _,
+ gCreditsEntry_ExecutiveDirector,
+ gCreditsEntry_SatoshiTajiri,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_ExecProducers,
+ gCreditsEntry_SatoruIwata,
+ _,
+ _,
+ },
+ {
+ _,
+ gCreditsEntry_ExecProducers,
+ gCreditsEntry_TsunekazIshihara,
+ _,
+ _,
+ },
+};
+#undef _
+
+static const struct BgTemplate gUnknown_085E6F68[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+};
+static const struct WindowTemplate gUnknown_085E6F6C[] =
+{
+ { 0x00, 0x00, 0x09, 0x1E, 0x0C, 0x08, 0x0001 },
+ DUMMY_WIN_TEMPLATE,
+};
+static const u8 gUnknown_085E6F7C[][2] =
+{
+ {104, 36},
+ {120, 36},
+ {136, 36},
+};
+
+static const union AnimCmd gUnknown_085E6F84[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gUnknown_085E6F98[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gUnknown_085E6FAC[] =
+{
+ ANIMCMD_FRAME(256, 4),
+ ANIMCMD_FRAME(320, 4),
+ ANIMCMD_FRAME(384, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_085E6FBC[] =
+{
+ ANIMCMD_FRAME(384, 30),
+ ANIMCMD_FRAME(320, 30),
+ ANIMCMD_FRAME(256, 30),
+ ANIMCMD_FRAME(256, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_085E6FD0[] =
+{
+ gUnknown_085E6F84,
+ gUnknown_085E6F98,
+ gUnknown_085E6FAC,
+ gUnknown_085E6FBC,
+};
+
+static const union AnimCmd gUnknown_085E6FE0[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gUnknown_085E6FF4[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gUnknown_085E7008[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_085E7010[] =
+{
+ gUnknown_085E6FE0,
+ gUnknown_085E6FF4,
+ gUnknown_085E7008,
+};
+
+static const struct SpriteSheet gUnknown_085E701C[] = {
+ { gDecompressionBuffer, 6144, 1001 },
+ { NULL },
+};
+static const struct SpritePalette gUnknown_085E702C[] = {
+ { (const u16 *)(gDecompressionBuffer + 0x1800), 1001 },
+ { NULL },
+};
+
+static const struct OamData gUnknown_085E703C =
+{
+ .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 gUnknown_085E7044[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_085E704C[] =
+{
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_085E7054[] =
+{
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_085E705C[] =
+{
+ gUnknown_085E7044,
+ gUnknown_085E704C,
+ gUnknown_085E7054,
+};
+
+static const struct SpriteTemplate gUnknown_085E7068 =
+{
+ .tileTag = 1001,
+ .paletteTag = 1001,
+ .oam = &gUnknown_085E703C,
+ .anims = gUnknown_085E705C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_81772B8,
+};
+
+void sub_8175620(void);
+static void sub_8175744(u8 taskIdA);
+static void sub_8175774(u8 taskIdA);
+static void sub_8175808(u8 taskIdA);
+static void c2_080C9BFC(u8 taskIdA);
+static void sub_81758E4(u8 taskIdA);
+static void sub_81758A4(u8 taskIdA);
+static void sub_8175A9C(u8 taskIdA);
+static void sub_8175AE4(u8 taskIdA);
+static void sub_8175B1C(u8 taskIdA);
+static void sub_8175B90(u8 taskIdA);
+static void sub_8175BD8(u8 taskIdA);
+static void sub_8175C34(u8 taskIdA);
+static void sub_8175CC8(u8 taskIdA);
+static void sub_8175CE4(void);
+static void sub_8175DA0(u8 taskIdB);
+static u8 sub_817603C(u8 page, u8 taskIdA);
+static void sub_81760FC(u8 taskIdA);
+static void sub_817651C(u8 taskIdA);
+static void sub_817624C(u8 taskIdA);
+static bool8 sub_8176AB0(u8 data, u8 taskIdA);
+static void sub_8176CA0(u8 taskIdA);
+static void sub_8176D1C(u16, u16, u16);
+static void sub_8176E40(u16 arg0, u16 palette);
+static void sub_8176EE8(struct Sprite *sprite);
+static void sub_8176F90(struct Sprite *sprite);
+static u8 sub_8177224(u16 species, s16 x, s16 y, u16 position);
+static void sub_8177388(void);
+
+static void sub_81754C8(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_81754DC(void)
+{
+ RunTasks();
+ AnimateSprites();
+
+ if ((gMain.heldKeys & B_BUTTON)
+ && gHasHallOfFameRecords != 0
+ && gTasks[gUnknown_0203BCE2].func == sub_8175774)
+ {
+ sub_81754C8();
+ RunTasks();
+ AnimateSprites();
+ gUnknown_0203BCE5 = 1;
+ }
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_8175548(void)
+{
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_085E6F68, 1);
+ SetBgTilemapBuffer(0, AllocZeroed(0x800));
+ LoadPalette(gUnknown_085E56F0, 0x80, 0x40);
+ InitWindows(gUnknown_085E6F6C);
+ DeactivateAllTextPrinters();
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ ShowBg(0);
+}
+
+static void sub_81755A4(void)
+{
+ void *ptr;
+ FreeAllWindowBuffers();
+ ptr = GetBgTilemapBuffer(0);
+ if (ptr)
+ Free(ptr);
+}
+
+static void sub_81755BC(const u8 *string, u8 y, u8 a2)
+{
+ u8 x;
+ u8 color[3];
+
+ color[0] = 0;
+
+ if (a2 == 1)
+ {
+ color[1] = 3;
+ color[2] = 4;
+ }
+ else
+ {
+ color[1] = 1;
+ color[2] = 2;
+ }
+
+ x = GetStringCenterAlignXOffsetWithLetterSpacing(1, string, 0xF0, 1);
+ AddTextPrinterParameterized2(0, 1, x, y, 1, 0, color, -1, string);
+}
+
+void sub_8175620(void)
+{
+ u8 taskIdA;
+ s16 taskIdC;
+ u8 taskIdB;
+ u16 savedIme;
+
+ sub_8175CE4();
+ SetVBlankCallback(NULL);
+ InitHeap(gHeap, HEAP_SIZE);
+ ResetPaletteFade();
+ ResetTasks();
+ sub_8175548();
+
+ taskIdA = CreateTask(sub_8175744, 0);
+
+ gTasks[taskIdA].data[TDA_4] = 0;
+ gTasks[taskIdA].data[TDA_7] = 0;
+ gTasks[taskIdA].data[TDA_11] = 0;
+ gTasks[taskIdA].data[TDA_13] = 1;
+
+ while (TRUE)
+ {
+ if (sub_8176AB0(0, taskIdA))
+ break;
+ }
+
+ taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID];
+ gTasks[taskIdC].data[TDC_0] = 40;
+
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0xFFFC);
+
+ taskIdB = CreateTask(sub_8175DA0, 0);
+
+ gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA;
+ gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB;
+
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetVBlankCallback(sub_81754C8);
+ m4aSongNumStart(MUS_THANKFOR);
+ SetMainCallback2(sub_81754DC);
+ gUnknown_0203BCE5 = 0;
+ gUnknown_0203BCE8 = AllocZeroed(sizeof(struct Unk201C000));
+
+ sub_8177388();
+
+ gUnknown_0203BCE8->unk8E = 0;
+ gUnknown_0203BCE8->unk90 = 0;
+ gUnknown_0203BCE8->unk92 = 0;
+
+ gUnknown_0203BCE2 = taskIdA;
+}
+
+static void sub_8175744(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ gTasks[taskIdA].func = sub_8175774;
+}
+
+static void sub_8175774(u8 taskIdA)
+{
+ u16 data1;
+
+ if (gTasks[taskIdA].data[TDA_4])
+ {
+ s16 taskIdC;
+
+ taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID];
+ gTasks[taskIdC].data[TDC_0] = 30;
+
+ gTasks[taskIdA].data[TDA_12] = 0x100;
+ gTasks[taskIdA].func = sub_8175A9C;
+ return;
+ }
+
+ gUnknown_0203BCE0 = 0;
+ data1 = gTasks[taskIdA].data[TDA_11];
+
+ if (gTasks[taskIdA].data[TDA_11] == 1)
+ {
+ gTasks[taskIdA].data[TDA_13] = data1;
+ gTasks[taskIdA].data[TDA_11] = 0;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskIdA].func = sub_8175808;
+ }
+ else if (gTasks[taskIdA].data[TDA_11] == 2)
+ {
+ gTasks[taskIdA].data[TDA_13] = data1;
+ gTasks[taskIdA].data[TDA_11] = 0;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskIdA].func = sub_81758A4;
+ }
+}
+
+static void sub_8175808(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ sub_8176CA0(taskIdA);
+ gTasks[taskIdA].func = c2_080C9BFC;
+ }
+}
+
+static void c2_080C9BFC(u8 taskIdA)
+{
+ u16 backup;
+
+ SetVBlankCallback(NULL);
+
+ if (sub_8176AB0(gTasks[taskIdA].data[TDA_7], taskIdA))
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetVBlankCallback(sub_81754C8);
+ gTasks[taskIdA].func = sub_8175744;
+ }
+}
+
+static void sub_81758A4(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ sub_8176CA0(taskIdA);
+ gTasks[taskIdA].func = sub_81758E4;
+ }
+}
+
+static void sub_81758E4(u8 taskIdA)
+{
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ {
+ u16 i;
+ u16 *temp;
+
+ ResetSpriteData();
+ dp13_810BB8C();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM);
+ LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800));
+ LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2);
+
+ for (i = 0; i < 0x800; i++)
+ gDecompressionBuffer[i] = 0x11;
+ for (i = 0; i < 0x800; i++)
+ (gDecompressionBuffer + 0x800)[i] = 0x22;
+ for (i = 0; i < 0x800; i++)
+ (gDecompressionBuffer + 0x1000)[i] = 0x33;
+
+ temp = (u16 *)(&gDecompressionBuffer[0x1800]);
+ temp[0] = RGB_BLACK;
+ temp[1] = RGB(31, 31, 20); // light yellow
+ temp[2] = RGB(31, 20, 20); // light red
+ temp[3] = RGB(20, 20, 31); // light blue
+
+ LoadSpriteSheet(gUnknown_085E701C);
+ LoadSpritePalette(gUnknown_085E702C);
+
+ gMain.state += 1;
+ break;
+ }
+ case 1:
+ gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(sub_81760FC, 0);
+ 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(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 32);
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_BG3_ON
+ | DISPCNT_OBJ_ON);
+
+ gMain.state = 0;
+ gUnknown_0203BD28 = 0;
+ gTasks[taskIdA].func = sub_8175744;
+ break;
+ }
+}
+
+static void sub_8175A9C(u8 taskIdA)
+{
+ if (gTasks[taskIdA].data[TDA_12])
+ {
+ gTasks[taskIdA].data[TDA_12] -= 1;
+ return;
+ }
+
+ BeginNormalPaletteFade(0xFFFFFFFF, 12, 0, 16, RGB_BLACK);
+ gTasks[taskIdA].func = sub_8175AE4;
+}
+
+static void sub_8175AE4(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_8176CA0(taskIdA);
+ gTasks[taskIdA].func = sub_8175B1C;
+ }
+}
+
+static void sub_8175B1C(u8 taskIdA)
+{
+ sub_8175CE4();
+ ResetPaletteFade();
+ sub_8176D1C(0, 0x3800, 0);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ BeginNormalPaletteFade(0xFFFFFFFF, 8, 16, 0, RGB_BLACK);
+
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON);
+
+ gTasks[taskIdA].data[TDA_0] = 0xEB;
+ gTasks[taskIdA].func = sub_8175B90;
+}
+
+static void sub_8175B90(u8 taskIdA)
+{
+ if (gTasks[taskIdA].data[TDA_0])
+ {
+ gTasks[taskIdA].data[TDA_0] -= 1;
+ return;
+ }
+
+ BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 16, RGB_BLACK);
+ gTasks[taskIdA].func = sub_8175BD8;
+}
+
+static void sub_8175BD8(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_8176E40(0x3800, 0);
+
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0, RGB_BLACK);
+ gTasks[taskIdA].data[TDA_0] = 7200;
+ gTasks[taskIdA].func = sub_8175C34;
+ }
+}
+
+static void sub_8175C34(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gTasks[taskIdA].data[TDA_0] == 0 || gMain.newKeys)
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA);
+ gTasks[taskIdA].func = sub_8175CC8;
+ return;
+ }
+
+ if (gTasks[taskIdA].data[TDA_0] == 7144)
+ FadeOutBGM(8);
+
+ if (gTasks[taskIdA].data[TDA_0] == 6840)
+ m4aSongNumStart(MUS_END);
+
+ gTasks[taskIdA].data[TDA_0] -= 1;
+ }
+}
+
+static void sub_8175CC8(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ SoftReset(0xFF);
+}
+
+static void sub_8175CE4(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_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);
+}
+
+static void sub_8175DA0(u8 taskIdB)
+{
+ int i;
+
+ switch (gTasks[taskIdB].data[TDB_0])
+ {
+ case 0:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ default:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskIdB].data[TDB_0] = 1;
+ gTasks[taskIdB].data[TDB_3] = 0x48;
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0;
+ gUnknown_0203BCE0 = 0;
+ }
+ return;
+ case 1:
+ if (gTasks[taskIdB].data[TDB_3] != 0)
+ {
+ gTasks[taskIdB].data[TDB_3] -= 1;
+ return;
+ }
+ gTasks[taskIdB].data[TDB_0] += 1;
+ return;
+ case 2:
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == sub_8175774)
+ {
+ if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT)
+ {
+ for (i = 0; i < 5; i++)
+ sub_81755BC(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 5 + i * 16, gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->var_1);
+
+ CopyWindowToVram(0, 2);
+
+ gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1;
+ gTasks[taskIdB].data[TDB_0] += 1;
+
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1;
+
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1)
+ BeginNormalPaletteFade(0x00000300, 0, 16, 0, COLOR_LIGHT_GREEN);
+ else
+ BeginNormalPaletteFade(0x00000300, 0, 16, 0, COLOR_DARK_GREEN);
+ return;
+ }
+ gTasks[taskIdB].data[TDB_0] = 10;
+ return;
+ }
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0;
+ return;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskIdB].data[TDB_3] = 0x73;
+ gTasks[taskIdB].data[TDB_0] += 1;
+ }
+ return;
+ case 4:
+ if (gTasks[taskIdB].data[TDB_3] != 0)
+ {
+ gTasks[taskIdB].data[TDB_3] -= 1;
+ return;
+ }
+
+ if (sub_817603C((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID]))
+ {
+ gTasks[taskIdB].data[TDB_0] += 1;
+ return;
+ }
+ gTasks[taskIdB].data[TDB_0] += 1;
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1)
+ BeginNormalPaletteFade(0x00000300, 0, 0, 16, COLOR_LIGHT_GREEN);
+ else
+ BeginNormalPaletteFade(0x00000300, 0, 0, 16, COLOR_DARK_GREEN);
+ return;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ FillWindowPixelBuffer(0, 0);
+ CopyWindowToVram(0, 2);
+ gTasks[taskIdB].data[TDB_0] = 2;
+ }
+ return;
+ case 10:
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1;
+ DestroyTask(taskIdB);
+ sub_81755A4();
+ FREE_AND_SET_NULL(gUnknown_0203BCE8);
+ return;
+ }
+}
+
+static u8 sub_817603C(u8 page, u8 taskIdA)
+{
+ // Starts with bike + ocean + morning
+
+ if (page == 6)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == 12)
+ {
+ // Bike + ocean + sunset
+ gTasks[taskIdA].data[TDA_7] = 1;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (page == 18)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == 24)
+ {
+ // Bike + forest + sunset
+ gTasks[taskIdA].data[TDA_7] = 2;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (page == 30)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == 36)
+ {
+ // Bike + forest + sunset
+ gTasks[taskIdA].data[TDA_7] = 3;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (page == 42)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == 48)
+ {
+ // Bike + town + night
+ gTasks[taskIdA].data[TDA_7] = 4;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (gTasks[taskIdA].data[TDA_11] != 0)
+ {
+ // Returns true if changed?
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_81760FC(u8 taskIdD)
+{
+ u8 r2;
+
+ switch (gTasks[taskIdD].data[TDD_STATE])
+ {
+ case 0:
+ break;
+ case 1:
+ if (gUnknown_0203BCE8->unk90 == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0)
+ break;
+ gTasks[taskIdD].data[TDD_STATE]++;
+ break;
+ case 2:
+ if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != sub_8175774)
+ break;
+ r2 = sub_8177224(gUnknown_0203BCE8->unk0[gUnknown_0203BCE8->unk92], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][0], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][1], gUnknown_0203BCE8->unk90);
+ if (gUnknown_0203BCE8->unk92 < gUnknown_0203BCE8->unk94 - 1)
+ {
+ gUnknown_0203BCE8->unk92++;
+ gSprites[r2].data[3] = 50;
+ }
+ else
+ {
+ gUnknown_0203BCE8->unk92 = 0;
+ gSprites[r2].data[3] = 512;
+ }
+ gUnknown_0203BCE8->unk8E++;
+ if (gUnknown_0203BCE8->unk90 == 2)
+ gUnknown_0203BCE8->unk90 = 0;
+ else
+ gUnknown_0203BCE8->unk90++;
+ 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;
+ }
+}
+
+static void sub_817624C(u8 taskIdC)
+{
+ switch (gTasks[taskIdC].data[TDC_0])
+ {
+ case 0:
+ gUnknown_0203BD26 = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12);
+ gTasks[taskIdC].data[TDC_5]++;
+ break;
+ case 1:
+ if (gUnknown_0203BD26 != 0)
+ {
+ gUnknown_0203BD26 = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12);
+ gTasks[taskIdC].data[TDC_5]++;
+ }
+ else
+ {
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 2;
+ gTasks[taskIdC].data[TDC_5] = 0;
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 2:
+ if (gTasks[taskIdC].data[TDC_5] < 64)
+ {
+ gTasks[taskIdC].data[TDC_5]++;
+ gUnknown_0203BD26 = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20);
+ }
+ else
+ {
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 3:
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 3;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 1;
+ gTasks[taskIdC].data[TDC_4] = 120;
+ gTasks[taskIdC].data[TDC_0]++;
+ break;
+ case 4:
+ if (gTasks[taskIdC].data[TDC_4] != 0)
+ {
+ gTasks[taskIdC].data[TDC_4]--;
+ }
+ else
+ {
+ gTasks[taskIdC].data[TDC_5] = 64;
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 5:
+ if (gTasks[taskIdC].data[TDC_5] > 0)
+ {
+ gTasks[taskIdC].data[TDC_5]--;
+ gUnknown_0203BD26 = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20);
+ }
+ else
+ {
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 1;
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 6:
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 10:
+ gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 2;
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 20:
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 4;
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 30:
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 5;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 3;
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 50:
+ gTasks[taskIdC].data[TDC_0] = 0;
+ break;
+ }
+}
+
+static void sub_817651C(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] == 2)
+ {
+ 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_817B540(0);
+ break;
+ case 1:
+ sub_817B540(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_817B540(1);
+ break;
+ case 3:
+ if (gTasks[taskIdE].data[TDE_1] != 0x7FFF)
+ {
+
+ if (gTasks[taskIdE].data[TDE_1] == 0x248)
+ {
+ 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_817B540(1);
+ break;
+ case 4:
+ sub_817B540(2);
+ break;
+ }
+}
+
+static void sub_817664C(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]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_817B3DC(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]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_817B3DC(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]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_817B3DC(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]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_817B3DC(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]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_817B3DC(2, 0x2000, 0x200, 8);
+ break;
+ }
+
+ gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(sub_817651C, 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(sub_817624C, 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] = 0x45;
+}
+
+static bool8 sub_8176AB0(u8 data, u8 taskIdA)
+{
+ u8 spriteId;
+
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 8);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gMain.state = 1;
+ break;
+ case 1:
+ gUnknown_0203BD24 = 34;
+ gUnknown_0203BD26 = 0;
+ sub_817B1C8(data);
+ gMain.state += 1;
+ break;
+ case 2:
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ {
+ LoadCompressedObjectPic(gUnknown_085F5334);
+ LoadCompressedObjectPic(gUnknown_085F53BC);
+ LoadCompressedObjectPic(gUnknown_085F5354);
+ LoadSpritePalettes(gUnknown_085F5384);
+
+ spriteId = intro_create_brendan_sprite(120, 46);
+ gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = sub_8176EE8;
+ gSprites[spriteId].anims = gUnknown_085E6FD0;
+
+ spriteId = intro_create_may_sprite(272, 46);
+ gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = sub_8176F90;
+ gSprites[spriteId].anims = gUnknown_085E7010;
+ }
+ else
+ {
+ LoadCompressedObjectPic(gUnknown_085F5344);
+ LoadCompressedObjectPic(gUnknown_085F53AC);
+ LoadCompressedObjectPic(gUnknown_085F5354);
+ LoadSpritePalettes(gUnknown_085F5384);
+
+ spriteId = intro_create_may_sprite(120, 46);
+ gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = sub_8176EE8;
+ gSprites[spriteId].anims = gUnknown_085E6FD0;
+
+ spriteId = intro_create_brendan_sprite(272, 46);
+ gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = sub_8176F90;
+ gSprites[spriteId].anims = gUnknown_085E7010;
+ };
+ gMain.state += 1;
+ break;
+ case 3:
+ sub_817664C(data, taskIdA);
+ sub_817B3A8(data);
+ gMain.state = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_8176CA0(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_0203BD28 = 1;
+}
+
+static void sub_8176D1C(u16 arg0, u16 arg1, u16 arg2)
+{
+ u16 baseTile;
+ u16 i;
+
+ LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *)(VRAM + arg0));
+ LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal));
+
+ baseTile = (arg2 / 16) << 12;
+
+ for (i = 0; i < 32 * 32; i++)
+ ((u16 *) (VRAM + arg1))[i] = baseTile + 1;
+}
+
+static u16 sub_8176D78(u8 arg0)
+{
+ u16 out = (arg0 & 0x3F) + 80;
+
+ if (arg0 == 0xFF)
+ return 1;
+
+ if (arg0 & (1 << 7))
+ out |= 1 << 11;
+ if (arg0 & (1 << 6))
+ out |= 1 << 10;
+
+ return out;
+}
+
+static void sub_8176DBC(const u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette)
+{
+ u8 y, x;
+ const u16 tileOffset = (palette / 16) << 12;
+
+ for (y = 0; y < 5; y++)
+ {
+ for (x = 0; x < 3; x++)
+ ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8176D78(arg0[y * 3 + x]);
+ }
+}
+
+static void sub_8176E40(u16 arg0, u16 palette)
+{
+ u16 pos;
+ u16 baseTile = (palette / 16) << 12;
+
+ for (pos = 0; pos < 32 * 32; pos++)
+ ((u16 *) (VRAM + arg0))[pos] = baseTile + 1;
+
+ sub_8176DBC(gUnknown_085E5BAC, 3, 7, arg0, palette);
+ sub_8176DBC(gUnknown_085E5BBB, 7, 7, arg0, palette);
+ sub_8176DBC(gUnknown_085E5BCA, 11, 7, arg0, palette);
+ sub_8176DBC(gUnknown_085E5BCA, 16, 7, arg0, palette);
+ sub_8176DBC(gUnknown_085E5BD9, 20, 7, arg0, palette);
+ sub_8176DBC(gUnknown_085E5BE8, 24, 7, arg0, palette);
+}
+
+static void sub_8176EE8(struct Sprite *sprite)
+{
+ if (gUnknown_0203BD28 != 0)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ switch (sprite->data[0])
+ {
+ 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 sub_8176F90(struct Sprite *sprite)
+{
+ if (gUnknown_0203BD28 != 0)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ switch (sprite->data[0])
+ {
+ 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_0203BD26;
+ break;
+ case 2:
+ sprite->data[7] += 1;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if ((sprite->data[7] & 3) == 0)
+ sprite->pos1.x += 1;
+ break;
+ case 3:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (sprite->pos1.x > -32)
+ sprite->pos1.x -= 1;
+ break;
+ }
+}
+
+static void sub_8177050(struct Sprite *sprite)
+{
+ if (gUnknown_0203BD28)
+ {
+ sub_818D820(sprite->data[6]);
+ return;
+ }
+
+ sprite->data[7] += 1;
+ switch (sprite->data[0])
+ {
+ case 0:
+ default:
+ sprite->oam.affineMode = 1;
+ sprite->oam.matrixNum = sprite->data[1];
+ sprite->data[2] = 16;
+ SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]);
+ sprite->invisible = FALSE;
+ sprite->data[0] = 1;
+ break;
+ case 1:
+ if (sprite->data[2] < 256)
+ {
+ sprite->data[2] += 8;
+ SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]);
+ }
+ else
+ {
+ sprite->data[0] += 1;
+ }
+ switch (sprite->data[1])
+ {
+ case 1:
+ if ((sprite->data[7] & 3) == 0)
+ sprite->pos1.y += 1;
+ sprite->pos1.x -= 2;
+ break;
+ case 2:
+ break;
+ case 3:
+ if ((sprite->data[7] & 3) == 0)
+ sprite->pos1.y += 1;
+ sprite->pos1.x += 2;
+ break;
+ }
+ break;
+ case 2:
+ if (sprite->data[3] != 0)
+ {
+ sprite->data[3] -= 1;
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0xF40);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x10);
+ sprite->oam.objMode = 1;
+ sprite->data[3] = 16;
+ sprite->data[0] += 1;
+ }
+ break;
+ case 3:
+ if (sprite->data[3] != 0)
+ {
+ int data3;
+
+ sprite->data[3] -= 1;
+
+ data3 = 16 - sprite->data[3];
+ SetGpuReg(REG_OFFSET_BLDALPHA, (data3 << 8) + sprite->data[3]);
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ sprite->data[0] = 9;
+ }
+ break;
+ case 9:
+ sprite->data[0] += 1;
+ break;
+ case 10:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ sub_818D820(sprite->data[6]);
+ break;
+ }
+}
+
+static u8 sub_8177224(u16 species, s16 x, s16 y, u16 position)
+{
+ u8 spriteId;
+ u8 spriteId2;
+
+ spriteId = sub_80C0E9C(species, x, y, position);
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].data[1] = position + 1;
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].callback = sub_8177050;
+ gSprites[spriteId].data[6] = spriteId;
+
+ spriteId2 = CreateSprite(&gUnknown_085E7068, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1);
+ gSprites[spriteId2].data[0] = spriteId;
+
+ StartSpriteAnimIfDifferent(&gSprites[spriteId2], position);
+
+ return spriteId;
+}
+
+static void sub_81772B8(struct Sprite *sprite)
+{
+ if (gSprites[sprite->data[0]].data[0] == 10 || gUnknown_0203BD28)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->oam.objMode = gSprites[sprite->data[0]].oam.objMode;
+ sprite->oam.affineMode = gSprites[sprite->data[0]].oam.affineMode;
+ sprite->oam.matrixNum = gSprites[sprite->data[0]].oam.matrixNum;
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
+}
+
+static void sub_8177388(void)
+{
+ u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE)));
+ u16 page;
+ u16 dexNum;
+ u16 j;
+
+ for (dexNum = 1, j = 0; dexNum < 386; dexNum++)
+ {
+ if (GetSetPokedexFlag(dexNum, 1))
+ {
+ gUnknown_0203BCE8->unk96[j] = dexNum;
+ j++;
+ }
+ }
+
+ for (dexNum = j; dexNum < 386; dexNum++)
+ gUnknown_0203BCE8->unk96[dexNum] = 0;
+
+ gUnknown_0203BCE8->unk39A = j;
+ if (gUnknown_0203BCE8->unk39A < 71)
+ gUnknown_0203BCE8->unk94 = j;
+ else
+ gUnknown_0203BCE8->unk94 = 71;
+
+ j = 0;
+ do
+ {
+ page = Random() % gUnknown_0203BCE8->unk39A;
+ gUnknown_0203BCE8->unk0[j] = gUnknown_0203BCE8->unk96[page];
+
+ j++;
+ gUnknown_0203BCE8->unk96[page] = 0;
+ gUnknown_0203BCE8->unk39A--;
+ if (page != gUnknown_0203BCE8->unk39A)
+ {
+ gUnknown_0203BCE8->unk96[page] = gUnknown_0203BCE8->unk96[gUnknown_0203BCE8->unk39A];
+ gUnknown_0203BCE8->unk96[gUnknown_0203BCE8->unk39A] = 0;
+ }
+ }
+ while (gUnknown_0203BCE8->unk39A != 0 && j < 71);
+
+ if (gUnknown_0203BCE8->unk94 < 71)
+ {
+ for (j = gUnknown_0203BCE8->unk94, page = 0; j < 71; j++)
+ {
+ gUnknown_0203BCE8->unk0[j] = gUnknown_0203BCE8->unk0[page];
+
+ page++;
+ if (page == gUnknown_0203BCE8->unk94)
+ page = 0;
+ }
+ gUnknown_0203BCE8->unk0[70] = starter;
+ }
+ else
+ {
+ for (dexNum = 0; gUnknown_0203BCE8->unk0[dexNum] != starter && dexNum < 71; dexNum++);
+
+ if (dexNum < gUnknown_0203BCE8->unk94 - 1)
+ {
+ gUnknown_0203BCE8->unk0[dexNum] = gUnknown_0203BCE8->unk0[70];
+ gUnknown_0203BCE8->unk0[70] = starter;
+ }
+ else
+ {
+ gUnknown_0203BCE8->unk0[70] = starter;
+ }
+ }
+ gUnknown_0203BCE8->unk94 = 71;
+}
diff --git a/src/data/field_event_obj/base_oam.h b/src/data/field_event_obj/base_oam.h
new file mode 100755
index 000000000..1aa6987c3
--- /dev/null
+++ b/src/data/field_event_obj/base_oam.h
@@ -0,0 +1,52 @@
+#ifndef GUARD_BASE_OAM_H
+#define GUARD_BASE_OAM_H
+
+const struct OamData gEventObjectBaseOam_8x8 = {
+ .shape = 0,
+ .size = 0,
+ .priority = 2
+};
+
+const struct OamData gEventObjectBaseOam_16x8 = {
+ .shape = 1,
+ .size = 0,
+ .priority = 2
+};
+
+const struct OamData gEventObjectBaseOam_16x16 = {
+ .shape = 0,
+ .size = 1,
+ .priority = 2
+};
+
+const struct OamData gEventObjectBaseOam_32x8 = {
+ .shape = 1,
+ .size = 1,
+ .priority = 2
+};
+
+const struct OamData gEventObjectBaseOam_64x32 = {
+ .shape = 1,
+ .size = 3,
+ .priority = 2
+};
+
+const struct OamData gEventObjectBaseOam_16x32 = {
+ .shape = 2,
+ .size = 2,
+ .priority = 2
+};
+
+const struct OamData gEventObjectBaseOam_32x32 = {
+ .shape = 0,
+ .size = 2,
+ .priority = 2
+};
+
+const struct OamData gEventObjectBaseOam_64x64 = {
+ .shape = 0,
+ .size = 3,
+ .priority = 2
+};
+
+#endif //GUARD_BASE_OAM_H
diff --git a/src/data/field_event_obj/berry_tree_graphics_tables.h b/src/data/field_event_obj/berry_tree_graphics_tables.h
new file mode 100755
index 000000000..31d515a82
--- /dev/null
+++ b/src/data/field_event_obj/berry_tree_graphics_tables.h
@@ -0,0 +1,570 @@
+#ifndef GUARD_BERRY_TREE_GRAPHICS_TABLES_H
+#define GUARD_BERRY_TREE_GRAPHICS_TABLES_H
+
+const struct SpriteFrameImage gEventObjectPicTable_PechaBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_PechaBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_PechaBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_PechaBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_PechaBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_PechaBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_PechaBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Pecha[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_KelpsyBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Kelpsy[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_WepearBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_WepearBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_WepearBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_WepearBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_WepearBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_WepearBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_WepearBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Wepear[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_IapapaBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_IapapaBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_IapapaBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_IapapaBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_IapapaBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_IapapaBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_IapapaBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Iapapa[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_CheriBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_CheriBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_CheriBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_CheriBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_CheriBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_CheriBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_CheriBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Cheri[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_FigyBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_FigyBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_FigyBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_FigyBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_FigyBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_FigyBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_FigyBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Figy[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_MagoBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_MagoBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_MagoBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_MagoBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_MagoBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_MagoBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_MagoBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Mago[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_LumBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_LumBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_LumBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_LumBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_LumBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_LumBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_LumBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Lum[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_RazzBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_RazzBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_RazzBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_RazzBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_RazzBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_RazzBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_RazzBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Razz[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_GrepaBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_GrepaBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_GrepaBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_GrepaBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_GrepaBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_GrepaBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_GrepaBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Grepa[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_RabutaBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_RabutaBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_RabutaBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_RabutaBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_RabutaBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_RabutaBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_RabutaBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Rabuta[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_NomelBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_NomelBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_NomelBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_NomelBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_NomelBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_NomelBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_NomelBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Nomel[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_LeppaBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_LeppaBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_LeppaBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_LeppaBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_LeppaBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_LeppaBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_LeppaBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Leppa[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_LiechiBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_LiechiBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_LiechiBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_LiechiBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_LiechiBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_LiechiBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_LiechiBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Liechi[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_HondewBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_HondewBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_HondewBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_HondewBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_HondewBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_HondewBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_HondewBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Hondew[] = {3, 4, 5, 5, 5};
+
+const struct SpriteFrameImage gEventObjectPicTable_AguavBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_AguavBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_AguavBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_AguavBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_AguavBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_AguavBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_AguavBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Aguav[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_WikiBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_WikiBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_WikiBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_WikiBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_WikiBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_WikiBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_WikiBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Wiki[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_PomegBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_PomegBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_PomegBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_PomegBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_PomegBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_PomegBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_PomegBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Pomeg[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_RawstBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_RawstBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_RawstBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_RawstBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_RawstBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_RawstBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_RawstBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Rawst[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_SpelonBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_SpelonBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_SpelonBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_SpelonBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_SpelonBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_SpelonBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_SpelonBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Spelon[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_ChestoBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_ChestoBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_ChestoBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_ChestoBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_ChestoBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_ChestoBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_ChestoBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Chesto[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_OranBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_OranBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_OranBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_OranBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_OranBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_OranBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_OranBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Oran[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_PersimBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_PersimBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_PersimBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_PersimBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_PersimBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_PersimBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_PersimBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Persim[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_SitrusBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_SitrusBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_SitrusBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_SitrusBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_SitrusBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_SitrusBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_SitrusBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Sitrus[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_AspearBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_AspearBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_AspearBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_AspearBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_AspearBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_AspearBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_AspearBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Aspear[] = {3, 4, 3, 3, 3};
+
+const struct SpriteFrameImage gEventObjectPicTable_PamtreBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_PamtreBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_PamtreBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_PamtreBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_PamtreBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_PamtreBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_PamtreBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Pamtre[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_CornnBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_CornnBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_CornnBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_CornnBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_CornnBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_CornnBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_CornnBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Cornn[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_LansatBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_LansatBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_LansatBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_LansatBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_LansatBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_LansatBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_LansatBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Lansat[] = {3, 4, 2, 2, 2};
+
+const struct SpriteFrameImage gEventObjectPicTable_DurinBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_DurinBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_DurinBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_DurinBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_DurinBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_DurinBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_DurinBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Durin[] = {3, 4, 4, 4, 4};
+
+const struct SpriteFrameImage gEventObjectPicTable_TamatoBerryTree[] = {
+ obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0),
+ obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1),
+ obj_frame_tiles(gEventObjectPic_TamatoBerryTree_0),
+ obj_frame_tiles(gEventObjectPic_TamatoBerryTree_1),
+ obj_frame_tiles(gEventObjectPic_TamatoBerryTree_2),
+ obj_frame_tiles(gEventObjectPic_TamatoBerryTree_3),
+ obj_frame_tiles(gEventObjectPic_TamatoBerryTree_4),
+ obj_frame_tiles(gEventObjectPic_TamatoBerryTree_5),
+};
+
+const u8 gBerryTreePaletteSlotTable_Tamato[] = {3, 4, 2, 2, 2};
+
+const u8 gDeadBerryTreeEventObjectGraphicsIdTable[] = {EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES};
+
+const u8 gBerryTreeEventObjectGraphicsIdTable[] = {EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES, EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES, EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES};
+
+const struct SpriteFrameImage *const gBerryTreePicTablePointers[] = {
+ gEventObjectPicTable_CheriBerryTree,
+ gEventObjectPicTable_ChestoBerryTree,
+ gEventObjectPicTable_PechaBerryTree,
+ gEventObjectPicTable_RawstBerryTree,
+ gEventObjectPicTable_AspearBerryTree,
+ gEventObjectPicTable_LeppaBerryTree,
+ gEventObjectPicTable_OranBerryTree,
+ gEventObjectPicTable_PersimBerryTree,
+ gEventObjectPicTable_LumBerryTree,
+ gEventObjectPicTable_SitrusBerryTree,
+ gEventObjectPicTable_FigyBerryTree,
+ gEventObjectPicTable_WikiBerryTree,
+ gEventObjectPicTable_MagoBerryTree,
+ gEventObjectPicTable_AguavBerryTree,
+ gEventObjectPicTable_IapapaBerryTree,
+ gEventObjectPicTable_RazzBerryTree,
+ gEventObjectPicTable_RazzBerryTree,
+ gEventObjectPicTable_MagoBerryTree,
+ gEventObjectPicTable_WepearBerryTree,
+ gEventObjectPicTable_IapapaBerryTree,
+ gEventObjectPicTable_PomegBerryTree,
+ gEventObjectPicTable_KelpsyBerryTree,
+ gEventObjectPicTable_WepearBerryTree,
+ gEventObjectPicTable_HondewBerryTree,
+ gEventObjectPicTable_GrepaBerryTree,
+ gEventObjectPicTable_TamatoBerryTree,
+ gEventObjectPicTable_CornnBerryTree,
+ gEventObjectPicTable_PomegBerryTree,
+ gEventObjectPicTable_RabutaBerryTree,
+ gEventObjectPicTable_NomelBerryTree,
+ gEventObjectPicTable_SpelonBerryTree,
+ gEventObjectPicTable_PamtreBerryTree,
+ gEventObjectPicTable_RabutaBerryTree,
+ gEventObjectPicTable_DurinBerryTree,
+ gEventObjectPicTable_HondewBerryTree,
+ gEventObjectPicTable_LiechiBerryTree,
+ gEventObjectPicTable_HondewBerryTree,
+ gEventObjectPicTable_AguavBerryTree,
+ gEventObjectPicTable_PomegBerryTree,
+ gEventObjectPicTable_GrepaBerryTree,
+ gEventObjectPicTable_LansatBerryTree,
+ gEventObjectPicTable_CornnBerryTree,
+ gEventObjectPicTable_DurinBerryTree,
+};
+
+const u8 *const gBerryTreePaletteSlotTablePointers[] = {
+ gBerryTreePaletteSlotTable_Cheri,
+ gBerryTreePaletteSlotTable_Chesto,
+ gBerryTreePaletteSlotTable_Pecha,
+ gBerryTreePaletteSlotTable_Rawst,
+ gBerryTreePaletteSlotTable_Aspear,
+ gBerryTreePaletteSlotTable_Leppa,
+ gBerryTreePaletteSlotTable_Oran,
+ gBerryTreePaletteSlotTable_Persim,
+ gBerryTreePaletteSlotTable_Lum,
+ gBerryTreePaletteSlotTable_Sitrus,
+ gBerryTreePaletteSlotTable_Figy,
+ gBerryTreePaletteSlotTable_Wiki,
+ gBerryTreePaletteSlotTable_Mago,
+ gBerryTreePaletteSlotTable_Aguav,
+ gBerryTreePaletteSlotTable_Iapapa,
+ gBerryTreePaletteSlotTable_Razz,
+ gBerryTreePaletteSlotTable_Razz,
+ gBerryTreePaletteSlotTable_Mago,
+ gBerryTreePaletteSlotTable_Wepear,
+ gBerryTreePaletteSlotTable_Iapapa,
+ gBerryTreePaletteSlotTable_Pomeg,
+ gBerryTreePaletteSlotTable_Kelpsy,
+ gBerryTreePaletteSlotTable_Wepear,
+ gBerryTreePaletteSlotTable_Hondew,
+ gBerryTreePaletteSlotTable_Grepa,
+ gBerryTreePaletteSlotTable_Tamato,
+ gBerryTreePaletteSlotTable_Cornn,
+ gBerryTreePaletteSlotTable_Pomeg,
+ gBerryTreePaletteSlotTable_Rabuta,
+ gBerryTreePaletteSlotTable_Nomel,
+ gBerryTreePaletteSlotTable_Spelon,
+ gBerryTreePaletteSlotTable_Pamtre,
+ gBerryTreePaletteSlotTable_Rabuta,
+ gBerryTreePaletteSlotTable_Durin,
+ gBerryTreePaletteSlotTable_Hondew,
+ gBerryTreePaletteSlotTable_Liechi,
+ gBerryTreePaletteSlotTable_Hondew,
+ gBerryTreePaletteSlotTable_Aguav,
+ gBerryTreePaletteSlotTable_Pomeg,
+ gBerryTreePaletteSlotTable_Grepa,
+ gBerryTreePaletteSlotTable_Lansat,
+ gBerryTreePaletteSlotTable_Cornn,
+ gBerryTreePaletteSlotTable_Durin,
+};
+
+const u8 *const gBerryTreeEventObjectGraphicsIdTablePointers[] = {
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+ gBerryTreeEventObjectGraphicsIdTable,
+};
+
+
+#endif //GUARD_BERRY_TREE_GRAPHICS_TABLES_H
diff --git a/src/data/field_event_obj/event_object_anims.h b/src/data/field_event_obj/event_object_anims.h
new file mode 100755
index 000000000..9b897651d
--- /dev/null
+++ b/src/data/field_event_obj/event_object_anims.h
@@ -0,0 +1,1176 @@
+#ifndef GUARD_EVENT_OBJECT_ANIMS_H
+#define GUARD_EVENT_OBJECT_ANIMS_H
+
+const union AnimCmd gEventObjectImageAnim_StayStill[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceSouth[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceNorth[] =
+{
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceWest[] =
+{
+ ANIMCMD_FRAME(2, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceEast[] =
+{
+ ANIMCMD_FRAME(2, 16, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoSouth[] =
+{
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(3, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoNorth[] =
+{
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(4, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoWest[] =
+{
+ ANIMCMD_FRAME(5, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(6, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoEast[] =
+{
+ ANIMCMD_FRAME(5, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(6, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastSouth[] =
+{
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(3, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastNorth[] =
+{
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(4, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastWest[] =
+{
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastEast[] =
+{
+ ANIMCMD_FRAME(5, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(6, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterSouth[] =
+{
+ ANIMCMD_FRAME(3, 2),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(3, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterNorth[] =
+{
+ ANIMCMD_FRAME(4, 2),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_FRAME(4, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterWest[] =
+{
+ ANIMCMD_FRAME(5, 2),
+ ANIMCMD_FRAME(2, 2),
+ ANIMCMD_FRAME(6, 2),
+ ANIMCMD_FRAME(2, 2),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterEast[] =
+{
+ ANIMCMD_FRAME(5, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(6, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 2, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestSouth[] =
+{
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_FRAME(3, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestNorth[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_FRAME(4, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestWest[] =
+{
+ ANIMCMD_FRAME(5, 1),
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_FRAME(6, 1),
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestEast[] =
+{
+ ANIMCMD_FRAME(5, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(6, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 1, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_FaceSouth[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_FaceNorth[] =
+{
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_FaceWest[] =
+{
+ ANIMCMD_FRAME(2, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_FaceEast[] =
+{
+ ANIMCMD_FRAME(2, 16, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoSouth[] =
+{
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoNorth[] =
+{
+ ANIMCMD_FRAME(5, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(6, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoWest[] =
+{
+ ANIMCMD_FRAME(7, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(8, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoEast[] =
+{
+ ANIMCMD_FRAME(7, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(8, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastSouth[] =
+{
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastNorth[] =
+{
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastWest[] =
+{
+ ANIMCMD_FRAME(7, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastEast[] =
+{
+ ANIMCMD_FRAME(7, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(8, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFasterSouth[] =
+{
+ ANIMCMD_FRAME(3, 2),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(4, 2),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFasterNorth[] =
+{
+ ANIMCMD_FRAME(5, 2),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_FRAME(6, 2),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFasterWest[] =
+{
+ ANIMCMD_FRAME(7, 2),
+ ANIMCMD_FRAME(2, 2),
+ ANIMCMD_FRAME(8, 2),
+ ANIMCMD_FRAME(2, 2),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFasterEast[] =
+{
+ ANIMCMD_FRAME(7, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(8, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 2, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastestSouth[] =
+{
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastestNorth[] =
+{
+ ANIMCMD_FRAME(5, 1),
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_FRAME(6, 1),
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastestWest[] =
+{
+ ANIMCMD_FRAME(7, 1),
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GoFastestEast[] =
+{
+ ANIMCMD_FRAME(7, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(8, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 1, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_RunSouth[] =
+{
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_FRAME(9, 3),
+ ANIMCMD_FRAME(13, 5),
+ ANIMCMD_FRAME(9, 3),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_RunNorth[] =
+{
+ ANIMCMD_FRAME(14, 5),
+ ANIMCMD_FRAME(10, 3),
+ ANIMCMD_FRAME(15, 5),
+ ANIMCMD_FRAME(10, 3),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_RunWest[] =
+{
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_FRAME(11, 3),
+ ANIMCMD_FRAME(17, 5),
+ ANIMCMD_FRAME(11, 3),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_RunEast[] =
+{
+ ANIMCMD_FRAME(16, 5, .hFlip = TRUE),
+ ANIMCMD_FRAME(11, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(17, 5, .hFlip = TRUE),
+ ANIMCMD_FRAME(11, 3, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_FieldMove[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobSouth[] =
+{
+ ANIMCMD_FRAME(9, 32),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobNorth[] =
+{
+ ANIMCMD_FRAME(10, 32),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobWest[] =
+{
+ ANIMCMD_FRAME(11, 32),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobEast[] =
+{
+ ANIMCMD_FRAME(11, 32, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelSouth[] =
+{
+ ANIMCMD_FRAME(9, 4),
+ ANIMCMD_FRAME(10, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelNorth[] =
+{
+ ANIMCMD_FRAME(13, 4),
+ ANIMCMD_FRAME(14, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelWest[] =
+{
+ ANIMCMD_FRAME(17, 4),
+ ANIMCMD_FRAME(18, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelEast[] =
+{
+ ANIMCMD_FRAME(17, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(18, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelSouth[] =
+{
+ ANIMCMD_FRAME(11, 4),
+ ANIMCMD_FRAME(12, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelNorth[] =
+{
+ ANIMCMD_FRAME(15, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelWest[] =
+{
+ ANIMCMD_FRAME(19, 4),
+ ANIMCMD_FRAME(20, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelEast[] =
+{
+ ANIMCMD_FRAME(19, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(20, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelSouth[] =
+{
+ ANIMCMD_FRAME(9, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelNorth[] =
+{
+ ANIMCMD_FRAME(13, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelWest[] =
+{
+ ANIMCMD_FRAME(17, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelEast[] =
+{
+ ANIMCMD_FRAME(17, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelSouth[] =
+{
+ ANIMCMD_FRAME(11, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelNorth[] =
+{
+ ANIMCMD_FRAME(15, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelWest[] =
+{
+ ANIMCMD_FRAME(19, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelEast[] =
+{
+ ANIMCMD_FRAME(19, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_MovingWheelieSouth[] =
+{
+ ANIMCMD_FRAME(21, 4),
+ ANIMCMD_FRAME(10, 4),
+ ANIMCMD_FRAME(22, 4),
+ ANIMCMD_FRAME(10, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_MovingWheelieNorth[] =
+{
+ ANIMCMD_FRAME(23, 4),
+ ANIMCMD_FRAME(14, 4),
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_FRAME(14, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_MovingWheelieWest[] =
+{
+ ANIMCMD_FRAME(25, 4),
+ ANIMCMD_FRAME(18, 4),
+ ANIMCMD_FRAME(26, 4),
+ ANIMCMD_FRAME(18, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_MovingWheelieEast[] =
+{
+ ANIMCMD_FRAME(25, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(18, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(26, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(18, 4, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_BerryTreeStage0[] =
+{
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BerryTreeStage1[] =
+{
+ ANIMCMD_FRAME(1, 32),
+ ANIMCMD_FRAME(2, 32),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BerryTreeStage2[] =
+{
+ ANIMCMD_FRAME(3, 48),
+ ANIMCMD_FRAME(4, 48),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BerryTreeStage3[] =
+{
+ ANIMCMD_FRAME(5, 32),
+ ANIMCMD_FRAME(5, 32),
+ ANIMCMD_FRAME(6, 32),
+ ANIMCMD_FRAME(6, 32),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_BerryTreeStage4[] =
+{
+ ANIMCMD_FRAME(7, 48),
+ ANIMCMD_FRAME(7, 48),
+ ANIMCMD_FRAME(8, 48),
+ ANIMCMD_FRAME(8, 48),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_NurseBow[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(9, 32),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_RockBreak[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_TreeCut[] =
+{
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(1, 6),
+ ANIMCMD_FRAME(2, 6),
+ ANIMCMD_FRAME(3, 6),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_TakeOutRodSouth[] =
+{
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(9, 4),
+ ANIMCMD_FRAME(10, 4),
+ ANIMCMD_FRAME(11, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_TakeOutRodNorth[] =
+{
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_FRAME(7, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_TakeOutRodWest[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_TakeOutRodEast[] =
+{
+ ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(3, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_PutAwayRodSouth[] =
+{
+ ANIMCMD_FRAME(11, 4),
+ ANIMCMD_FRAME(10, 6),
+ ANIMCMD_FRAME(9, 6),
+ ANIMCMD_FRAME(8, 6),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_PutAwayRodNorth[] =
+{
+ ANIMCMD_FRAME(7, 4),
+ ANIMCMD_FRAME(6, 6),
+ ANIMCMD_FRAME(5, 6),
+ ANIMCMD_FRAME(4, 6),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_PutAwayRodWest[] =
+{
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_PutAwayRodEast[] =
+{
+ ANIMCMD_FRAME(3, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_HookedPokemonSouth[] =
+{
+ ANIMCMD_FRAME(10, 6),
+ ANIMCMD_FRAME(11, 6),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_FRAME(11, 30),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_HookedPokemonNorth[] =
+{
+ ANIMCMD_FRAME(6, 6),
+ ANIMCMD_FRAME(7, 6),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_FRAME(7, 30),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_HookedPokemonWest[] =
+{
+ ANIMCMD_FRAME(2, 6),
+ ANIMCMD_FRAME(3, 6),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_FRAME(3, 30),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_HookedPokemonEast[] =
+{
+ ANIMCMD_FRAME(2, 6, .hFlip = TRUE),
+ ANIMCMD_FRAME(3, 6, .hFlip = TRUE),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_FRAME(3, 30, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AffineAnimCmd gEventObjectRotScalAnim_8508FD8[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
+ AFFINEANIMCMD_LOOP(7),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+const union AffineAnimCmd gEventObjectRotScalAnim_8509008[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
+ AFFINEANIMCMD_LOOP(15),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
+ AFFINEANIMCMD_LOOP(15),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+const union AffineAnimCmd gEventObjectRotScalAnim_8509040[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 10, 0),
+ AFFINEANIMCMD_END,
+};
+
+const union AffineAnimCmd gEventObjectRotScalAnim_8509050[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 10, 0),
+ AFFINEANIMCMD_END,
+};
+
+const union AffineAnimCmd gEventObjectRotScalAnim_8509060[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 1),
+ AFFINEANIMCMD_LOOP(8),
+ AFFINEANIMCMD_END,
+};
+
+const union AffineAnimCmd gEventObjectRotScalAnim_8509078[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1),
+ AFFINEANIMCMD_LOOP(8),
+ AFFINEANIMCMD_END,
+};
+
+const union AnimCmd gEventObjectImageAnim_HoOhFlapWings[] =
+{
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_HoOhStayStill[] =
+{
+ ANIMCMD_FRAME(3, 16),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_Inanimate[] = {
+ gEventObjectImageAnim_StayStill,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_QuintyPlump[] = {
+ gEventObjectImageAnim_QuintyPlumpFaceSouth,
+ gEventObjectImageAnim_QuintyPlumpFaceNorth,
+ gEventObjectImageAnim_QuintyPlumpFaceWest,
+ gEventObjectImageAnim_QuintyPlumpFaceEast,
+ gEventObjectImageAnim_QuintyPlumpGoSouth,
+ gEventObjectImageAnim_QuintyPlumpGoNorth,
+ gEventObjectImageAnim_QuintyPlumpGoWest,
+ gEventObjectImageAnim_QuintyPlumpGoEast,
+ gEventObjectImageAnim_QuintyPlumpGoFastSouth,
+ gEventObjectImageAnim_QuintyPlumpGoFastNorth,
+ gEventObjectImageAnim_QuintyPlumpGoFastWest,
+ gEventObjectImageAnim_QuintyPlumpGoFastEast,
+ gEventObjectImageAnim_QuintyPlumpGoFasterSouth,
+ gEventObjectImageAnim_QuintyPlumpGoFasterNorth,
+ gEventObjectImageAnim_QuintyPlumpGoFasterWest,
+ gEventObjectImageAnim_QuintyPlumpGoFasterEast,
+ gEventObjectImageAnim_QuintyPlumpGoFastestSouth,
+ gEventObjectImageAnim_QuintyPlumpGoFastestNorth,
+ gEventObjectImageAnim_QuintyPlumpGoFastestWest,
+ gEventObjectImageAnim_QuintyPlumpGoFastestEast,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_Standard[] = {
+ gEventObjectImageAnim_FaceSouth,
+ gEventObjectImageAnim_FaceNorth,
+ gEventObjectImageAnim_FaceWest,
+ gEventObjectImageAnim_FaceEast,
+ gEventObjectImageAnim_GoSouth,
+ gEventObjectImageAnim_GoNorth,
+ gEventObjectImageAnim_GoWest,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoFastSouth,
+ gEventObjectImageAnim_GoFastNorth,
+ gEventObjectImageAnim_GoFastWest,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFasterSouth,
+ gEventObjectImageAnim_GoFasterNorth,
+ gEventObjectImageAnim_GoFasterWest,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFastestSouth,
+ gEventObjectImageAnim_GoFastestNorth,
+ gEventObjectImageAnim_GoFastestWest,
+ gEventObjectImageAnim_GoFastestEast,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_HoOh[] = {
+ gEventObjectImageAnim_FaceSouth,
+ gEventObjectImageAnim_FaceNorth,
+ gEventObjectImageAnim_FaceWest,
+ gEventObjectImageAnim_FaceEast,
+ gEventObjectImageAnim_HoOhFlapWings,
+ gEventObjectImageAnim_HoOhStayStill,
+ gEventObjectImageAnim_GoWest,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoFastSouth,
+ gEventObjectImageAnim_GoFastNorth,
+ gEventObjectImageAnim_GoFastWest,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFasterSouth,
+ gEventObjectImageAnim_GoFasterNorth,
+ gEventObjectImageAnim_GoFasterWest,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFastestSouth,
+ gEventObjectImageAnim_GoFastestNorth,
+ gEventObjectImageAnim_GoFastestWest,
+ gEventObjectImageAnim_GoFastestEast,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_Groudon3[] = {
+ gEventObjectImageAnim_FaceSouth,
+ gEventObjectImageAnim_FaceNorth,
+ gEventObjectImageAnim_FaceWest,
+ gEventObjectImageAnim_FaceEast,
+ gEventObjectImageAnim_GoSouth,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoWest,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoFastSouth,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFastWest,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFasterSouth,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFasterWest,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFastestSouth,
+ gEventObjectImageAnim_GoFastestEast,
+ gEventObjectImageAnim_GoFastestWest,
+ gEventObjectImageAnim_GoFastestEast,
+};
+
+const union AnimCmd gEventObjectImageAnim_85091F0[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_85091F8[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_8509200[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_8509208[] =
+{
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_8509210[] =
+{
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_8509218[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_8509220[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_8509228[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gEventObjectImageAnim_8509230[] =
+{
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_Rayquaza2[] = {
+ gEventObjectImageAnim_8509218,
+ gEventObjectImageAnim_8509220,
+ gEventObjectImageAnim_8509228,
+ gEventObjectImageAnim_8509230,
+ gEventObjectImageAnim_8509200,
+ gEventObjectImageAnim_85091F8,
+ gEventObjectImageAnim_8509208,
+ gEventObjectImageAnim_8509210,
+ gEventObjectImageAnim_8509200,
+ gEventObjectImageAnim_85091F8,
+ gEventObjectImageAnim_85091F0,
+ gEventObjectImageAnim_8509210,
+ gEventObjectImageAnim_8509200,
+ gEventObjectImageAnim_85091F8,
+ gEventObjectImageAnim_8509208,
+ gEventObjectImageAnim_8509210,
+ gEventObjectImageAnim_8509200,
+ gEventObjectImageAnim_85091F8,
+ gEventObjectImageAnim_8509208,
+ gEventObjectImageAnim_8509210,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_BrendanMayNormal[] = {
+ gEventObjectImageAnim_FaceSouth,
+ gEventObjectImageAnim_FaceNorth,
+ gEventObjectImageAnim_FaceWest,
+ gEventObjectImageAnim_FaceEast,
+ gEventObjectImageAnim_GoSouth,
+ gEventObjectImageAnim_GoNorth,
+ gEventObjectImageAnim_GoWest,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoFastSouth,
+ gEventObjectImageAnim_GoFastNorth,
+ gEventObjectImageAnim_GoFastWest,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFasterSouth,
+ gEventObjectImageAnim_GoFasterNorth,
+ gEventObjectImageAnim_GoFasterWest,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFastestSouth,
+ gEventObjectImageAnim_GoFastestNorth,
+ gEventObjectImageAnim_GoFastestWest,
+ gEventObjectImageAnim_GoFastestEast,
+ gEventObjectImageAnim_RunSouth,
+ gEventObjectImageAnim_RunNorth,
+ gEventObjectImageAnim_RunWest,
+ gEventObjectImageAnim_RunEast,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_AcroBike[] = {
+ gEventObjectImageAnim_FaceSouth,
+ gEventObjectImageAnim_FaceNorth,
+ gEventObjectImageAnim_FaceWest,
+ gEventObjectImageAnim_FaceEast,
+ gEventObjectImageAnim_GoSouth,
+ gEventObjectImageAnim_GoNorth,
+ gEventObjectImageAnim_GoWest,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoFastSouth,
+ gEventObjectImageAnim_GoFastNorth,
+ gEventObjectImageAnim_GoFastWest,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFasterSouth,
+ gEventObjectImageAnim_GoFasterNorth,
+ gEventObjectImageAnim_GoFasterWest,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFastestSouth,
+ gEventObjectImageAnim_GoFastestNorth,
+ gEventObjectImageAnim_GoFastestWest,
+ gEventObjectImageAnim_GoFastestEast,
+ gEventObjectImageAnim_BunnyHoppyBackWheelSouth,
+ gEventObjectImageAnim_BunnyHoppyBackWheelNorth,
+ gEventObjectImageAnim_BunnyHoppyBackWheelWest,
+ gEventObjectImageAnim_BunnyHoppyBackWheelEast,
+ gEventObjectImageAnim_BunnyHoppyFrontWheelSouth,
+ gEventObjectImageAnim_BunnyHoppyFrontWheelNorth,
+ gEventObjectImageAnim_BunnyHoppyFrontWheelWest,
+ gEventObjectImageAnim_BunnyHoppyFrontWheelEast,
+ gEventObjectImageAnim_StandingWheelieBackWheelSouth,
+ gEventObjectImageAnim_StandingWheelieBackWheelNorth,
+ gEventObjectImageAnim_StandingWheelieBackWheelWest,
+ gEventObjectImageAnim_StandingWheelieBackWheelEast,
+ gEventObjectImageAnim_StandingWheelieFrontWheelSouth,
+ gEventObjectImageAnim_StandingWheelieFrontWheelNorth,
+ gEventObjectImageAnim_StandingWheelieFrontWheelWest,
+ gEventObjectImageAnim_StandingWheelieFrontWheelEast,
+ gEventObjectImageAnim_MovingWheelieSouth,
+ gEventObjectImageAnim_MovingWheelieNorth,
+ gEventObjectImageAnim_MovingWheelieWest,
+ gEventObjectImageAnim_MovingWheelieEast,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_Surfing[] = {
+ gEventObjectImageAnim_FaceSouth,
+ gEventObjectImageAnim_FaceNorth,
+ gEventObjectImageAnim_FaceWest,
+ gEventObjectImageAnim_FaceEast,
+ gEventObjectImageAnim_GoSouth,
+ gEventObjectImageAnim_GoNorth,
+ gEventObjectImageAnim_GoWest,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoFastSouth,
+ gEventObjectImageAnim_GoFastNorth,
+ gEventObjectImageAnim_GoFastWest,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFasterSouth,
+ gEventObjectImageAnim_GoFasterNorth,
+ gEventObjectImageAnim_GoFasterWest,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFastestSouth,
+ gEventObjectImageAnim_GoFastestNorth,
+ gEventObjectImageAnim_GoFastestWest,
+ gEventObjectImageAnim_GoFastestEast,
+ gEventObjectImageAnim_GetOnOffSurfBlobSouth,
+ gEventObjectImageAnim_GetOnOffSurfBlobNorth,
+ gEventObjectImageAnim_GetOnOffSurfBlobWest,
+ gEventObjectImageAnim_GetOnOffSurfBlobEast,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_Nurse[] = {
+ gEventObjectImageAnim_FaceSouth,
+ gEventObjectImageAnim_FaceNorth,
+ gEventObjectImageAnim_FaceWest,
+ gEventObjectImageAnim_FaceEast,
+ gEventObjectImageAnim_GoSouth,
+ gEventObjectImageAnim_GoNorth,
+ gEventObjectImageAnim_GoWest,
+ gEventObjectImageAnim_GoEast,
+ gEventObjectImageAnim_GoFastSouth,
+ gEventObjectImageAnim_GoFastNorth,
+ gEventObjectImageAnim_GoFastWest,
+ gEventObjectImageAnim_GoFastEast,
+ gEventObjectImageAnim_GoFasterSouth,
+ gEventObjectImageAnim_GoFasterNorth,
+ gEventObjectImageAnim_GoFasterWest,
+ gEventObjectImageAnim_GoFasterEast,
+ gEventObjectImageAnim_GoFastestSouth,
+ gEventObjectImageAnim_GoFastestNorth,
+ gEventObjectImageAnim_GoFastestWest,
+ gEventObjectImageAnim_GoFastestEast,
+ gEventObjectImageAnim_NurseBow,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_FieldMove[] = {
+ gEventObjectImageAnim_FieldMove,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_BerryTree[] = {
+ gEventObjectImageAnim_BerryTreeStage0,
+ gEventObjectImageAnim_BerryTreeStage1,
+ gEventObjectImageAnim_BerryTreeStage2,
+ gEventObjectImageAnim_BerryTreeStage3,
+ gEventObjectImageAnim_BerryTreeStage4,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_BreakableRock[] = {
+ gEventObjectImageAnim_StayStill,
+ gEventObjectImageAnim_RockBreak,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_CuttableTree[] = {
+ gEventObjectImageAnim_StayStill,
+ gEventObjectImageAnim_TreeCut,
+};
+
+const union AnimCmd *const gEventObjectImageAnimTable_Fishing[] = {
+ gEventObjectImageAnim_TakeOutRodSouth,
+ gEventObjectImageAnim_TakeOutRodNorth,
+ gEventObjectImageAnim_TakeOutRodWest,
+ gEventObjectImageAnim_TakeOutRodEast,
+ gEventObjectImageAnim_PutAwayRodSouth,
+ gEventObjectImageAnim_PutAwayRodNorth,
+ gEventObjectImageAnim_PutAwayRodWest,
+ gEventObjectImageAnim_PutAwayRodEast,
+ gEventObjectImageAnim_HookedPokemonSouth,
+ gEventObjectImageAnim_HookedPokemonNorth,
+ gEventObjectImageAnim_HookedPokemonWest,
+ gEventObjectImageAnim_HookedPokemonEast,
+};
+
+const union AffineAnimCmd *const gEventObjectRotScalAnimTable_KyogreGroudon[] = {
+ gEventObjectRotScalAnim_8508FD8,
+ gEventObjectRotScalAnim_8509008,
+ gEventObjectRotScalAnim_8509050,
+ gEventObjectRotScalAnim_8509040,
+ gEventObjectRotScalAnim_8509078,
+ gEventObjectRotScalAnim_8509060,
+};
+
+const struct UnkStruct_085094AC gUnknown_085094AC[] = {
+ {
+ .anims = gEventObjectImageAnimTable_QuintyPlump,
+ .animPos = {1, 3, 0, 2},
+ },
+ {
+ .anims = gEventObjectImageAnimTable_Standard,
+ .animPos = {1, 3, 0, 2},
+ },
+ {
+ .anims = gEventObjectImageAnimTable_BrendanMayNormal,
+ .animPos = {1, 3, 0, 2},
+ },
+ {
+ .anims = gEventObjectImageAnimTable_AcroBike,
+ .animPos = {1, 3, 0, 2},
+ },
+ {
+ .anims = gEventObjectImageAnimTable_Surfing,
+ .animPos = {1, 3, 0, 2},
+ },
+ {
+ .anims = gEventObjectImageAnimTable_Nurse,
+ .animPos = {1, 3, 0, 2},
+ },
+ {
+ .anims = gEventObjectImageAnimTable_Fishing,
+ .animPos = {1, 3, 0, 2},
+ },
+ {
+ NULL,
+ {0, 0, 0, 0},
+ },
+};
+
+#endif //GUARD_EVENT_OBJECT_ANIMS_H
diff --git a/src/data/field_event_obj/event_object_graphics.h b/src/data/field_event_obj/event_object_graphics.h
new file mode 100755
index 000000000..b226b066a
--- /dev/null
+++ b/src/data/field_event_obj/event_object_graphics.h
@@ -0,0 +1,1669 @@
+#ifndef GUARD_EVENT_OBJECT_GFX_H
+#define GUARD_EVENT_OBJECT_GFX_H
+
+const u32 gEventObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/00.4bpp");
+const u32 gEventObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/01.4bpp");
+const u32 gEventObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/02.4bpp");
+const u32 gEventObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/03.4bpp");
+const u32 gEventObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/04.4bpp");
+const u32 gEventObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/05.4bpp");
+const u32 gEventObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/06.4bpp");
+const u32 gEventObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/07.4bpp");
+const u32 gEventObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/08.4bpp");
+const u32 gEventObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/09.4bpp");
+const u32 gEventObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/10.4bpp");
+const u32 gEventObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/11.4bpp");
+const u32 gEventObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/12.4bpp");
+const u32 gEventObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/13.4bpp");
+const u32 gEventObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/14.4bpp");
+const u32 gEventObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/15.4bpp");
+const u32 gEventObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/16.4bpp");
+const u32 gEventObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/17.4bpp");
+const u16 gEventObjectPalette8[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_08.gbapal");
+const u32 gEventObjectPic_RubySapphireBrendan_0[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/00.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_1[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/01.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_2[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/02.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_3[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/03.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_4[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/04.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_5[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/05.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_6[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/06.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_7[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/07.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_8[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/08.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_9[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/09.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_10[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/10.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_11[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/11.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_12[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/12.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_13[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/13.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_14[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/14.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_15[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/15.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_16[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/16.4bpp");
+const u32 gEventObjectPic_RubySapphireBrendan_17[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/17.4bpp");
+const u16 gEventObjectPalette33[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_33.gbapal");
+const u16 NullPalette_8499A38[16] = {};
+const u16 NullPalette_8499A58[16] = {};
+const u16 NullPalette_8499A78[16] = {};
+const u16 NullPalette_8499A98[16] = {};
+const u16 NullPalette_8499AB8[16] = {};
+const u16 NullPalette_8499AD8[16] = {};
+const u16 NullPalette_8499AF8[16] = {};
+const u16 NullPalette_8499B18[16] = {};
+const u16 NullPalette_8499B38[16] = {};
+const u16 NullPalette_8499B58[16] = {};
+const u16 NullPalette_8499B78[16] = {};
+const u16 NullPalette_8499B98[16] = {};
+const u16 NullPalette_8499BB8[16] = {};
+const u16 NullPalette_8499BD8[16] = {};
+const u16 NullPalette_8499BF8[16] = {};
+const u16 gEventObjectPalette9[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_09.gbapal");
+const u16 gEventObjectPalette10[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_10.gbapal");
+const u32 gEventObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/0.4bpp");
+const u32 gEventObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/1.4bpp");
+const u32 gEventObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/2.4bpp");
+const u32 gEventObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/3.4bpp");
+const u32 gEventObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/4.4bpp");
+const u32 gEventObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/0.4bpp");
+const u32 gEventObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/3.4bpp");
+const u32 gEventObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/1.4bpp");
+const u32 gEventObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/4.4bpp");
+const u32 gEventObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/2.4bpp");
+const u32 gEventObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/5.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/0.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/1.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/2.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/3.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/4.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/5.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/6.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/7.4bpp");
+const u32 gEventObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/8.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/00.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/01.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/02.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/03.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/04.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/05.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/06.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/07.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/08.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/09.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/10.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/11.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/12.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/13.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/14.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/15.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/16.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/17.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/18.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/19.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/20.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/21.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/22.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/23.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/24.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/25.4bpp");
+const u32 gEventObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/26.4bpp");
+const u32 gEventObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/00.4bpp");
+const u32 gEventObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/01.4bpp");
+const u32 gEventObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/02.4bpp");
+const u32 gEventObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/03.4bpp");
+const u32 gEventObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/04.4bpp");
+const u32 gEventObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/05.4bpp");
+const u32 gEventObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/06.4bpp");
+const u32 gEventObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/07.4bpp");
+const u32 gEventObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/08.4bpp");
+const u32 gEventObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/09.4bpp");
+const u32 gEventObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/10.4bpp");
+const u32 gEventObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/11.4bpp");
+const u32 gEventObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/0.4bpp");
+const u32 gEventObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/3.4bpp");
+const u32 gEventObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/1.4bpp");
+const u32 gEventObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/4.4bpp");
+const u32 gEventObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/2.4bpp");
+const u32 gEventObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/5.4bpp");
+const u32 gEventObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/decorating.4bpp");
+const u32 gEventObjectPic_MayDecorating[] = INCBIN_U32("graphics/event_objects/pics/people/may/decorating.4bpp");
+const u32 gEventObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/0.4bpp");
+const u32 gEventObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/1.4bpp");
+const u32 gEventObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/2.4bpp");
+const u32 gEventObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/3.4bpp");
+const u32 gEventObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/0.4bpp");
+const u32 gEventObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/1.4bpp");
+const u32 gEventObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/2.4bpp");
+const u32 gEventObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/3.4bpp");
+const u16 gEventObjectPalette11[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_11.gbapal");
+const u32 gEventObjectPic_MayNormal_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/00.4bpp");
+const u32 gEventObjectPic_MayNormal_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/01.4bpp");
+const u32 gEventObjectPic_MayNormal_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/02.4bpp");
+const u32 gEventObjectPic_MayNormal_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/03.4bpp");
+const u32 gEventObjectPic_MayNormal_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/04.4bpp");
+const u32 gEventObjectPic_MayNormal_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/05.4bpp");
+const u32 gEventObjectPic_MayNormal_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/06.4bpp");
+const u32 gEventObjectPic_MayNormal_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/07.4bpp");
+const u32 gEventObjectPic_MayNormal_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/08.4bpp");
+const u32 gEventObjectPic_MayNormal_9[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/09.4bpp");
+const u32 gEventObjectPic_MayNormal_10[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/10.4bpp");
+const u32 gEventObjectPic_MayNormal_11[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/11.4bpp");
+const u32 gEventObjectPic_MayNormal_12[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/12.4bpp");
+const u32 gEventObjectPic_MayNormal_13[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/13.4bpp");
+const u32 gEventObjectPic_MayNormal_14[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/14.4bpp");
+const u32 gEventObjectPic_MayNormal_15[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/15.4bpp");
+const u32 gEventObjectPic_MayNormal_16[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/16.4bpp");
+const u32 gEventObjectPic_MayNormal_17[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/17.4bpp");
+const u16 gEventObjectPalette17[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_17.gbapal");
+const u16 gEventObjectPalette18[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_18.gbapal");
+const u32 gEventObjectPic_RubySapphireMay_0[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/00.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_1[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/01.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_2[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/02.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_3[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/03.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_4[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/04.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_5[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/05.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_6[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/06.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_7[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/07.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_8[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/08.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_9[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/09.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_10[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/10.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_11[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/11.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_12[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/12.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_13[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/13.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_14[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/14.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_15[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/15.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_16[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/16.4bpp");
+const u32 gEventObjectPic_RubySapphireMay_17[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/17.4bpp");
+const u16 gEventObjectPalette34[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_34.gbapal");
+const u16 gUnusedEventObjectPalette[] = INCBIN_U16("graphics/event_objects/palettes/unused_palette.gbapal");
+const u16 NullPalette_84A54F8[16] = {};
+const u16 NullPalette_84A5518[16] = {};
+const u16 NullPalette_84A5538[16] = {};
+const u16 NullPalette_84A5558[16] = {};
+const u16 NullPalette_84A5578[16] = {};
+const u16 NullPalette_84A5598[16] = {};
+const u16 NullPalette_84A55B8[16] = {};
+const u16 NullPalette_84A55D8[16] = {};
+const u16 NullPalette_84A55F8[16] = {};
+const u16 NullPalette_84A5618[16] = {};
+const u16 NullPalette_84A5638[16] = {};
+const u16 NullPalette_84A5658[16] = {};
+const u16 NullPalette_84A5678[16] = {};
+const u16 NullPalette_84A5698[16] = {};
+const u32 gEventObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/0.4bpp");
+const u32 gEventObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/1.4bpp");
+const u32 gEventObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/2.4bpp");
+const u32 gEventObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/3.4bpp");
+const u32 gEventObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/4.4bpp");
+const u32 gEventObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/5.4bpp");
+const u32 gEventObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/6.4bpp");
+const u32 gEventObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/7.4bpp");
+const u32 gEventObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/8.4bpp");
+const u32 gEventObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/00.4bpp");
+const u32 gEventObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/01.4bpp");
+const u32 gEventObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/02.4bpp");
+const u32 gEventObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/03.4bpp");
+const u32 gEventObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/04.4bpp");
+const u32 gEventObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/05.4bpp");
+const u32 gEventObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/06.4bpp");
+const u32 gEventObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/07.4bpp");
+const u32 gEventObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/08.4bpp");
+const u32 gEventObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/09.4bpp");
+const u32 gEventObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/10.4bpp");
+const u32 gEventObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/11.4bpp");
+const u32 gEventObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/12.4bpp");
+const u32 gEventObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/13.4bpp");
+const u32 gEventObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/14.4bpp");
+const u32 gEventObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/15.4bpp");
+const u32 gEventObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/16.4bpp");
+const u32 gEventObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/17.4bpp");
+const u32 gEventObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/18.4bpp");
+const u32 gEventObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/19.4bpp");
+const u32 gEventObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/20.4bpp");
+const u32 gEventObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/21.4bpp");
+const u32 gEventObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/22.4bpp");
+const u32 gEventObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/23.4bpp");
+const u32 gEventObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/24.4bpp");
+const u32 gEventObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/25.4bpp");
+const u32 gEventObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/26.4bpp");
+const u32 gEventObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/0.4bpp");
+const u32 gEventObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/3.4bpp");
+const u32 gEventObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/1.4bpp");
+const u32 gEventObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/4.4bpp");
+const u32 gEventObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/2.4bpp");
+const u32 gEventObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/5.4bpp");
+const u32 gEventObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/0.4bpp");
+const u32 gEventObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/1.4bpp");
+const u32 gEventObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/2.4bpp");
+const u32 gEventObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/3.4bpp");
+const u32 gEventObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/4.4bpp");
+const u32 gEventObjectPic_MayFishing_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/00.4bpp");
+const u32 gEventObjectPic_MayFishing_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/01.4bpp");
+const u32 gEventObjectPic_MayFishing_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/02.4bpp");
+const u32 gEventObjectPic_MayFishing_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/03.4bpp");
+const u32 gEventObjectPic_MayFishing_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/04.4bpp");
+const u32 gEventObjectPic_MayFishing_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/05.4bpp");
+const u32 gEventObjectPic_MayFishing_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/06.4bpp");
+const u32 gEventObjectPic_MayFishing_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/07.4bpp");
+const u32 gEventObjectPic_MayFishing_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/08.4bpp");
+const u32 gEventObjectPic_MayFishing_9[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/09.4bpp");
+const u32 gEventObjectPic_MayFishing_10[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/10.4bpp");
+const u32 gEventObjectPic_MayFishing_11[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/11.4bpp");
+const u32 gEventObjectPic_MayWatering_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/0.4bpp");
+const u32 gEventObjectPic_MayWatering_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/3.4bpp");
+const u32 gEventObjectPic_MayWatering_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/1.4bpp");
+const u32 gEventObjectPic_MayWatering_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/4.4bpp");
+const u32 gEventObjectPic_MayWatering_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/2.4bpp");
+const u32 gEventObjectPic_MayWatering_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/5.4bpp");
+const u16 gEventObjectPalette0[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_00.gbapal");
+const u16 gEventObjectPalette1[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_01.gbapal");
+const u16 gEventObjectPalette2[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_02.gbapal");
+const u16 gEventObjectPalette3[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_03.gbapal");
+const u16 gEventObjectPalette4[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_04.gbapal");
+const u16 gEventObjectPalette5[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_05.gbapal");
+const u16 gEventObjectPalette6[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_06.gbapal");
+const u16 gEventObjectPalette7[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_07.gbapal");
+const u32 gEventObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/0.4bpp");
+const u32 gEventObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/1.4bpp");
+const u32 gEventObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/2.4bpp");
+const u32 gEventObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/3.4bpp");
+const u32 gEventObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/4.4bpp");
+const u32 gEventObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/5.4bpp");
+const u32 gEventObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/6.4bpp");
+const u32 gEventObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/7.4bpp");
+const u32 gEventObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/8.4bpp");
+const u32 gEventObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/0.4bpp");
+const u32 gEventObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/1.4bpp");
+const u32 gEventObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/2.4bpp");
+const u32 gEventObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/3.4bpp");
+const u32 gEventObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/4.4bpp");
+const u32 gEventObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/5.4bpp");
+const u32 gEventObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/6.4bpp");
+const u32 gEventObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/7.4bpp");
+const u32 gEventObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/8.4bpp");
+const u32 gEventObjectPic_Boy1_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/0.4bpp");
+const u32 gEventObjectPic_Boy1_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/1.4bpp");
+const u32 gEventObjectPic_Boy1_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/2.4bpp");
+const u32 gEventObjectPic_Boy1_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/3.4bpp");
+const u32 gEventObjectPic_Boy1_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/4.4bpp");
+const u32 gEventObjectPic_Boy1_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/5.4bpp");
+const u32 gEventObjectPic_Boy1_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/6.4bpp");
+const u32 gEventObjectPic_Boy1_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/7.4bpp");
+const u32 gEventObjectPic_Boy1_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/8.4bpp");
+const u32 gEventObjectPic_Girl1_0[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/0.4bpp");
+const u32 gEventObjectPic_Girl1_1[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/1.4bpp");
+const u32 gEventObjectPic_Girl1_2[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/2.4bpp");
+const u32 gEventObjectPic_Girl1_3[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/3.4bpp");
+const u32 gEventObjectPic_Girl1_4[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/4.4bpp");
+const u32 gEventObjectPic_Girl1_5[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/5.4bpp");
+const u32 gEventObjectPic_Girl1_6[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/6.4bpp");
+const u32 gEventObjectPic_Girl1_7[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/7.4bpp");
+const u32 gEventObjectPic_Girl1_8[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/8.4bpp");
+const u32 gEventObjectPic_Boy2_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/0.4bpp");
+const u32 gEventObjectPic_Boy2_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/1.4bpp");
+const u32 gEventObjectPic_Boy2_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/2.4bpp");
+const u32 gEventObjectPic_Boy2_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/3.4bpp");
+const u32 gEventObjectPic_Boy2_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/4.4bpp");
+const u32 gEventObjectPic_Boy2_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/5.4bpp");
+const u32 gEventObjectPic_Boy2_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/6.4bpp");
+const u32 gEventObjectPic_Boy2_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/7.4bpp");
+const u32 gEventObjectPic_Boy2_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/8.4bpp");
+const u32 gEventObjectPic_Girl2_0[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/0.4bpp");
+const u32 gEventObjectPic_Girl2_1[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/1.4bpp");
+const u32 gEventObjectPic_Girl2_2[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/2.4bpp");
+const u32 gEventObjectPic_Girl2_3[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/3.4bpp");
+const u32 gEventObjectPic_Girl2_4[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/4.4bpp");
+const u32 gEventObjectPic_Girl2_5[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/5.4bpp");
+const u32 gEventObjectPic_Girl2_6[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/6.4bpp");
+const u32 gEventObjectPic_Girl2_7[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/7.4bpp");
+const u32 gEventObjectPic_Girl2_8[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/8.4bpp");
+const u32 gEventObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/0.4bpp");
+const u32 gEventObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/1.4bpp");
+const u32 gEventObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/2.4bpp");
+const u32 gEventObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/3.4bpp");
+const u32 gEventObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/4.4bpp");
+const u32 gEventObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/5.4bpp");
+const u32 gEventObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/6.4bpp");
+const u32 gEventObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/7.4bpp");
+const u32 gEventObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/8.4bpp");
+const u32 gEventObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/0.4bpp");
+const u32 gEventObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/1.4bpp");
+const u32 gEventObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/2.4bpp");
+const u32 gEventObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/3.4bpp");
+const u32 gEventObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/4.4bpp");
+const u32 gEventObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/5.4bpp");
+const u32 gEventObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/6.4bpp");
+const u32 gEventObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/7.4bpp");
+const u32 gEventObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/8.4bpp");
+const u32 gEventObjectPic_Boy3_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/0.4bpp");
+const u32 gEventObjectPic_Boy3_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/1.4bpp");
+const u32 gEventObjectPic_Boy3_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/2.4bpp");
+const u32 gEventObjectPic_Boy3_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/3.4bpp");
+const u32 gEventObjectPic_Boy3_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/4.4bpp");
+const u32 gEventObjectPic_Boy3_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/5.4bpp");
+const u32 gEventObjectPic_Boy3_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/6.4bpp");
+const u32 gEventObjectPic_Boy3_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/7.4bpp");
+const u32 gEventObjectPic_Boy3_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/8.4bpp");
+const u32 gEventObjectPic_Girl3_0[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/0.4bpp");
+const u32 gEventObjectPic_Girl3_1[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/1.4bpp");
+const u32 gEventObjectPic_Girl3_2[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/2.4bpp");
+const u32 gEventObjectPic_Girl3_3[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/3.4bpp");
+const u32 gEventObjectPic_Girl3_4[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/4.4bpp");
+const u32 gEventObjectPic_Girl3_5[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/5.4bpp");
+const u32 gEventObjectPic_Girl3_6[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/6.4bpp");
+const u32 gEventObjectPic_Girl3_7[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/7.4bpp");
+const u32 gEventObjectPic_Girl3_8[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/8.4bpp");
+const u32 gEventObjectPic_Boy4_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/0.4bpp");
+const u32 gEventObjectPic_Boy4_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/1.4bpp");
+const u32 gEventObjectPic_Boy4_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/2.4bpp");
+const u32 gEventObjectPic_Boy4_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/3.4bpp");
+const u32 gEventObjectPic_Boy4_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/4.4bpp");
+const u32 gEventObjectPic_Boy4_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/5.4bpp");
+const u32 gEventObjectPic_Boy4_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/6.4bpp");
+const u32 gEventObjectPic_Boy4_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/7.4bpp");
+const u32 gEventObjectPic_Boy4_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/8.4bpp");
+const u32 gEventObjectPic_Woman1_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/0.4bpp");
+const u32 gEventObjectPic_Woman1_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/1.4bpp");
+const u32 gEventObjectPic_Woman1_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/2.4bpp");
+const u32 gEventObjectPic_Woman1_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/3.4bpp");
+const u32 gEventObjectPic_Woman1_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/4.4bpp");
+const u32 gEventObjectPic_Woman1_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/5.4bpp");
+const u32 gEventObjectPic_Woman1_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/6.4bpp");
+const u32 gEventObjectPic_Woman1_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/7.4bpp");
+const u32 gEventObjectPic_Woman1_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/8.4bpp");
+const u32 gEventObjectPic_FatMan_0[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/0.4bpp");
+const u32 gEventObjectPic_FatMan_1[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/1.4bpp");
+const u32 gEventObjectPic_FatMan_2[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/2.4bpp");
+const u32 gEventObjectPic_FatMan_3[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/3.4bpp");
+const u32 gEventObjectPic_FatMan_4[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/4.4bpp");
+const u32 gEventObjectPic_FatMan_5[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/5.4bpp");
+const u32 gEventObjectPic_FatMan_6[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/6.4bpp");
+const u32 gEventObjectPic_FatMan_7[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/7.4bpp");
+const u32 gEventObjectPic_FatMan_8[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/8.4bpp");
+const u32 gEventObjectPic_Woman2_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/0.4bpp");
+const u32 gEventObjectPic_Woman2_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/1.4bpp");
+const u32 gEventObjectPic_Woman2_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/2.4bpp");
+const u32 gEventObjectPic_Woman2_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/3.4bpp");
+const u32 gEventObjectPic_Woman2_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/4.4bpp");
+const u32 gEventObjectPic_Woman2_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/5.4bpp");
+const u32 gEventObjectPic_Woman2_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/6.4bpp");
+const u32 gEventObjectPic_Woman2_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/7.4bpp");
+const u32 gEventObjectPic_Woman2_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/8.4bpp");
+const u32 gEventObjectPic_Man1_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/0.4bpp");
+const u32 gEventObjectPic_Man1_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/1.4bpp");
+const u32 gEventObjectPic_Man1_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/2.4bpp");
+const u32 gEventObjectPic_Man1_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/3.4bpp");
+const u32 gEventObjectPic_Man1_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/4.4bpp");
+const u32 gEventObjectPic_Man1_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/5.4bpp");
+const u32 gEventObjectPic_Man1_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/6.4bpp");
+const u32 gEventObjectPic_Man1_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/7.4bpp");
+const u32 gEventObjectPic_Man1_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/8.4bpp");
+const u32 gEventObjectPic_Woman3_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/0.4bpp");
+const u32 gEventObjectPic_Woman3_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/1.4bpp");
+const u32 gEventObjectPic_Woman3_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/2.4bpp");
+const u32 gEventObjectPic_Woman3_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/3.4bpp");
+const u32 gEventObjectPic_Woman3_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/4.4bpp");
+const u32 gEventObjectPic_Woman3_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/5.4bpp");
+const u32 gEventObjectPic_Woman3_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/6.4bpp");
+const u32 gEventObjectPic_Woman3_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/7.4bpp");
+const u32 gEventObjectPic_Woman3_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/8.4bpp");
+const u32 gEventObjectPic_OldMan1_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/0.4bpp");
+const u32 gEventObjectPic_OldMan1_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/1.4bpp");
+const u32 gEventObjectPic_OldMan1_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/2.4bpp");
+const u32 gEventObjectPic_OldMan1_3[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/3.4bpp");
+const u32 gEventObjectPic_OldMan1_4[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/4.4bpp");
+const u32 gEventObjectPic_OldMan1_5[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/5.4bpp");
+const u32 gEventObjectPic_OldMan1_6[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/6.4bpp");
+const u32 gEventObjectPic_OldMan1_7[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/7.4bpp");
+const u32 gEventObjectPic_OldMan1_8[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/8.4bpp");
+const u32 gEventObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/0.4bpp");
+const u32 gEventObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/1.4bpp");
+const u32 gEventObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/2.4bpp");
+const u32 gEventObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/3.4bpp");
+const u32 gEventObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/4.4bpp");
+const u32 gEventObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/5.4bpp");
+const u32 gEventObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/6.4bpp");
+const u32 gEventObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/7.4bpp");
+const u32 gEventObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/8.4bpp");
+const u32 gEventObjectPic_Man2_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/0.4bpp");
+const u32 gEventObjectPic_Man2_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/1.4bpp");
+const u32 gEventObjectPic_Man2_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/2.4bpp");
+const u32 gEventObjectPic_Man2_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/3.4bpp");
+const u32 gEventObjectPic_Man2_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/4.4bpp");
+const u32 gEventObjectPic_Man2_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/5.4bpp");
+const u32 gEventObjectPic_Man2_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/6.4bpp");
+const u32 gEventObjectPic_Man2_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/7.4bpp");
+const u32 gEventObjectPic_Man2_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/8.4bpp");
+const u32 gEventObjectPic_Woman4_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/0.4bpp");
+const u32 gEventObjectPic_Woman4_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/1.4bpp");
+const u32 gEventObjectPic_Woman4_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/2.4bpp");
+const u32 gEventObjectPic_Woman4_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/3.4bpp");
+const u32 gEventObjectPic_Woman4_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/4.4bpp");
+const u32 gEventObjectPic_Woman4_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/5.4bpp");
+const u32 gEventObjectPic_Woman4_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/6.4bpp");
+const u32 gEventObjectPic_Woman4_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/7.4bpp");
+const u32 gEventObjectPic_Woman4_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/8.4bpp");
+const u32 gEventObjectPic_Man3_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/0.4bpp");
+const u32 gEventObjectPic_Man3_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/1.4bpp");
+const u32 gEventObjectPic_Man3_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/2.4bpp");
+const u32 gEventObjectPic_Man3_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/3.4bpp");
+const u32 gEventObjectPic_Man3_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/4.4bpp");
+const u32 gEventObjectPic_Man3_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/5.4bpp");
+const u32 gEventObjectPic_Man3_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/6.4bpp");
+const u32 gEventObjectPic_Man3_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/7.4bpp");
+const u32 gEventObjectPic_Man3_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/8.4bpp");
+const u32 gEventObjectPic_Woman5_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/0.4bpp");
+const u32 gEventObjectPic_Woman5_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/1.4bpp");
+const u32 gEventObjectPic_Woman5_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/2.4bpp");
+const u32 gEventObjectPic_Woman5_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/3.4bpp");
+const u32 gEventObjectPic_Woman5_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/4.4bpp");
+const u32 gEventObjectPic_Woman5_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/5.4bpp");
+const u32 gEventObjectPic_Woman5_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/6.4bpp");
+const u32 gEventObjectPic_Woman5_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/7.4bpp");
+const u32 gEventObjectPic_Woman5_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/8.4bpp");
+const u32 gEventObjectPic_Cook_0[] = INCBIN_U32("graphics/event_objects/pics/people/cook/0.4bpp");
+const u32 gEventObjectPic_Cook_1[] = INCBIN_U32("graphics/event_objects/pics/people/cook/1.4bpp");
+const u32 gEventObjectPic_Cook_2[] = INCBIN_U32("graphics/event_objects/pics/people/cook/2.4bpp");
+const u32 gEventObjectPic_Woman6_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/0.4bpp");
+const u32 gEventObjectPic_Woman6_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/1.4bpp");
+const u32 gEventObjectPic_Woman6_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/2.4bpp");
+const u32 gEventObjectPic_Woman6_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/3.4bpp");
+const u32 gEventObjectPic_Woman6_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/4.4bpp");
+const u32 gEventObjectPic_Woman6_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/5.4bpp");
+const u32 gEventObjectPic_Woman6_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/6.4bpp");
+const u32 gEventObjectPic_Woman6_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/7.4bpp");
+const u32 gEventObjectPic_Woman6_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/8.4bpp");
+const u32 gEventObjectPic_OldMan2_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_2/0.4bpp");
+const u32 gEventObjectPic_OldMan2_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_2/1.4bpp");
+const u32 gEventObjectPic_OldMan2_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_2/2.4bpp");
+const u32 gEventObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/0.4bpp");
+const u32 gEventObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/1.4bpp");
+const u32 gEventObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/2.4bpp");
+const u32 gEventObjectPic_OldWoman2_3[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/3.4bpp");
+const u32 gEventObjectPic_OldWoman2_4[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/4.4bpp");
+const u32 gEventObjectPic_OldWoman2_5[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/5.4bpp");
+const u32 gEventObjectPic_OldWoman2_6[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/6.4bpp");
+const u32 gEventObjectPic_OldWoman2_7[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/7.4bpp");
+const u32 gEventObjectPic_OldWoman2_8[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/8.4bpp");
+const u32 gEventObjectPic_Camper_0[] = INCBIN_U32("graphics/event_objects/pics/people/camper/0.4bpp");
+const u32 gEventObjectPic_Camper_1[] = INCBIN_U32("graphics/event_objects/pics/people/camper/1.4bpp");
+const u32 gEventObjectPic_Camper_2[] = INCBIN_U32("graphics/event_objects/pics/people/camper/2.4bpp");
+const u32 gEventObjectPic_Camper_3[] = INCBIN_U32("graphics/event_objects/pics/people/camper/3.4bpp");
+const u32 gEventObjectPic_Camper_4[] = INCBIN_U32("graphics/event_objects/pics/people/camper/4.4bpp");
+const u32 gEventObjectPic_Camper_5[] = INCBIN_U32("graphics/event_objects/pics/people/camper/5.4bpp");
+const u32 gEventObjectPic_Camper_6[] = INCBIN_U32("graphics/event_objects/pics/people/camper/6.4bpp");
+const u32 gEventObjectPic_Camper_7[] = INCBIN_U32("graphics/event_objects/pics/people/camper/7.4bpp");
+const u32 gEventObjectPic_Camper_8[] = INCBIN_U32("graphics/event_objects/pics/people/camper/8.4bpp");
+const u32 gEventObjectPic_Picnicker_0[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/0.4bpp");
+const u32 gEventObjectPic_Picnicker_1[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/1.4bpp");
+const u32 gEventObjectPic_Picnicker_2[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/2.4bpp");
+const u32 gEventObjectPic_Picnicker_3[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/3.4bpp");
+const u32 gEventObjectPic_Picnicker_4[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/4.4bpp");
+const u32 gEventObjectPic_Picnicker_5[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/5.4bpp");
+const u32 gEventObjectPic_Picnicker_6[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/6.4bpp");
+const u32 gEventObjectPic_Picnicker_7[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/7.4bpp");
+const u32 gEventObjectPic_Picnicker_8[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/8.4bpp");
+const u32 gEventObjectPic_Man4_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/0.4bpp");
+const u32 gEventObjectPic_Man4_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/1.4bpp");
+const u32 gEventObjectPic_Man4_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/2.4bpp");
+const u32 gEventObjectPic_Man4_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/3.4bpp");
+const u32 gEventObjectPic_Man4_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/4.4bpp");
+const u32 gEventObjectPic_Man4_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/5.4bpp");
+const u32 gEventObjectPic_Man4_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/6.4bpp");
+const u32 gEventObjectPic_Man4_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/7.4bpp");
+const u32 gEventObjectPic_Man4_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/8.4bpp");
+const u32 gEventObjectPic_Woman7_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/0.4bpp");
+const u32 gEventObjectPic_Woman7_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/1.4bpp");
+const u32 gEventObjectPic_Woman7_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/2.4bpp");
+const u32 gEventObjectPic_Woman7_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/3.4bpp");
+const u32 gEventObjectPic_Woman7_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/4.4bpp");
+const u32 gEventObjectPic_Woman7_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/5.4bpp");
+const u32 gEventObjectPic_Woman7_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/6.4bpp");
+const u32 gEventObjectPic_Woman7_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/7.4bpp");
+const u32 gEventObjectPic_Woman7_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/8.4bpp");
+const u32 gEventObjectPic_Youngster_0[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/0.4bpp");
+const u32 gEventObjectPic_Youngster_1[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/1.4bpp");
+const u32 gEventObjectPic_Youngster_2[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/2.4bpp");
+const u32 gEventObjectPic_Youngster_3[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/3.4bpp");
+const u32 gEventObjectPic_Youngster_4[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/4.4bpp");
+const u32 gEventObjectPic_Youngster_5[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/5.4bpp");
+const u32 gEventObjectPic_Youngster_6[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/6.4bpp");
+const u32 gEventObjectPic_Youngster_7[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/7.4bpp");
+const u32 gEventObjectPic_Youngster_8[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/8.4bpp");
+const u32 gEventObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/0.4bpp");
+const u32 gEventObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/1.4bpp");
+const u32 gEventObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/2.4bpp");
+const u32 gEventObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/3.4bpp");
+const u32 gEventObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/4.4bpp");
+const u32 gEventObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/5.4bpp");
+const u32 gEventObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/6.4bpp");
+const u32 gEventObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/7.4bpp");
+const u32 gEventObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/8.4bpp");
+const u32 gEventObjectPic_PsychicM_0[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/0.4bpp");
+const u32 gEventObjectPic_PsychicM_1[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/1.4bpp");
+const u32 gEventObjectPic_PsychicM_2[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/2.4bpp");
+const u32 gEventObjectPic_PsychicM_3[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/3.4bpp");
+const u32 gEventObjectPic_PsychicM_4[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/4.4bpp");
+const u32 gEventObjectPic_PsychicM_5[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/5.4bpp");
+const u32 gEventObjectPic_PsychicM_6[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/6.4bpp");
+const u32 gEventObjectPic_PsychicM_7[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/7.4bpp");
+const u32 gEventObjectPic_PsychicM_8[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/8.4bpp");
+const u32 gEventObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/0.4bpp");
+const u32 gEventObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/1.4bpp");
+const u32 gEventObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/2.4bpp");
+const u32 gEventObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/3.4bpp");
+const u32 gEventObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/4.4bpp");
+const u32 gEventObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/5.4bpp");
+const u32 gEventObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/6.4bpp");
+const u32 gEventObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/7.4bpp");
+const u32 gEventObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/8.4bpp");
+const u32 gEventObjectPic_Maniac_0[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/0.4bpp");
+const u32 gEventObjectPic_Maniac_1[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/1.4bpp");
+const u32 gEventObjectPic_Maniac_2[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/2.4bpp");
+const u32 gEventObjectPic_Maniac_3[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/3.4bpp");
+const u32 gEventObjectPic_Maniac_4[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/4.4bpp");
+const u32 gEventObjectPic_Maniac_5[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/5.4bpp");
+const u32 gEventObjectPic_Maniac_6[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/6.4bpp");
+const u32 gEventObjectPic_Maniac_7[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/7.4bpp");
+const u32 gEventObjectPic_Maniac_8[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/8.4bpp");
+const u32 gEventObjectPic_HexManiac_0[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/0.4bpp");
+const u32 gEventObjectPic_HexManiac_1[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/1.4bpp");
+const u32 gEventObjectPic_HexManiac_2[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/2.4bpp");
+const u32 gEventObjectPic_HexManiac_3[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/3.4bpp");
+const u32 gEventObjectPic_HexManiac_4[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/4.4bpp");
+const u32 gEventObjectPic_HexManiac_5[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/5.4bpp");
+const u32 gEventObjectPic_HexManiac_6[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/6.4bpp");
+const u32 gEventObjectPic_HexManiac_7[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/7.4bpp");
+const u32 gEventObjectPic_HexManiac_8[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/8.4bpp");
+const u32 gEventObjectPic_UnusedWoman_0[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/0.4bpp");
+const u32 gEventObjectPic_UnusedWoman_1[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/1.4bpp");
+const u32 gEventObjectPic_UnusedWoman_2[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/2.4bpp");
+const u32 gEventObjectPic_UnusedWoman_3[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/3.4bpp");
+const u32 gEventObjectPic_UnusedWoman_4[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/4.4bpp");
+const u32 gEventObjectPic_UnusedWoman_5[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/5.4bpp");
+const u32 gEventObjectPic_UnusedWoman_6[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/6.4bpp");
+const u32 gEventObjectPic_UnusedWoman_7[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/7.4bpp");
+const u32 gEventObjectPic_UnusedWoman_8[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/8.4bpp");
+const u32 gEventObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/0.4bpp");
+const u32 gEventObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/1.4bpp");
+const u32 gEventObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/2.4bpp");
+const u32 gEventObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/3.4bpp");
+const u32 gEventObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/4.4bpp");
+const u32 gEventObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/5.4bpp");
+const u32 gEventObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/6.4bpp");
+const u32 gEventObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/7.4bpp");
+const u32 gEventObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/8.4bpp");
+const u32 gEventObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/0.4bpp");
+const u32 gEventObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/1.4bpp");
+const u32 gEventObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/2.4bpp");
+const u32 gEventObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/3.4bpp");
+const u32 gEventObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/4.4bpp");
+const u32 gEventObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/5.4bpp");
+const u32 gEventObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/6.4bpp");
+const u32 gEventObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/7.4bpp");
+const u32 gEventObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/8.4bpp");
+const u32 gEventObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/0.4bpp");
+const u32 gEventObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/1.4bpp");
+const u32 gEventObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/2.4bpp");
+const u32 gEventObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/3.4bpp");
+const u32 gEventObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/4.4bpp");
+const u32 gEventObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/5.4bpp");
+const u32 gEventObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/6.4bpp");
+const u32 gEventObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/7.4bpp");
+const u32 gEventObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/8.4bpp");
+const u32 gEventObjectPic_Beauty_0[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/0.4bpp");
+const u32 gEventObjectPic_Beauty_1[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/1.4bpp");
+const u32 gEventObjectPic_Beauty_2[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/2.4bpp");
+const u32 gEventObjectPic_Beauty_3[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/3.4bpp");
+const u32 gEventObjectPic_Beauty_4[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/4.4bpp");
+const u32 gEventObjectPic_Beauty_5[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/5.4bpp");
+const u32 gEventObjectPic_Beauty_6[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/6.4bpp");
+const u32 gEventObjectPic_Beauty_7[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/7.4bpp");
+const u32 gEventObjectPic_Beauty_8[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/8.4bpp");
+const u32 gEventObjectPic_Scientist1_0[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/0.4bpp");
+const u32 gEventObjectPic_Scientist1_1[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/1.4bpp");
+const u32 gEventObjectPic_Scientist1_2[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/2.4bpp");
+const u32 gEventObjectPic_Scientist1_3[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/3.4bpp");
+const u32 gEventObjectPic_Scientist1_4[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/4.4bpp");
+const u32 gEventObjectPic_Scientist1_5[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/5.4bpp");
+const u32 gEventObjectPic_Scientist1_6[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/6.4bpp");
+const u32 gEventObjectPic_Scientist1_7[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/7.4bpp");
+const u32 gEventObjectPic_Scientist1_8[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/8.4bpp");
+const u32 gEventObjectPic_Lass_0[] = INCBIN_U32("graphics/event_objects/pics/people/lass/0.4bpp");
+const u32 gEventObjectPic_Lass_1[] = INCBIN_U32("graphics/event_objects/pics/people/lass/1.4bpp");
+const u32 gEventObjectPic_Lass_2[] = INCBIN_U32("graphics/event_objects/pics/people/lass/2.4bpp");
+const u32 gEventObjectPic_Lass_3[] = INCBIN_U32("graphics/event_objects/pics/people/lass/3.4bpp");
+const u32 gEventObjectPic_Lass_4[] = INCBIN_U32("graphics/event_objects/pics/people/lass/4.4bpp");
+const u32 gEventObjectPic_Lass_5[] = INCBIN_U32("graphics/event_objects/pics/people/lass/5.4bpp");
+const u32 gEventObjectPic_Lass_6[] = INCBIN_U32("graphics/event_objects/pics/people/lass/6.4bpp");
+const u32 gEventObjectPic_Lass_7[] = INCBIN_U32("graphics/event_objects/pics/people/lass/7.4bpp");
+const u32 gEventObjectPic_Lass_8[] = INCBIN_U32("graphics/event_objects/pics/people/lass/8.4bpp");
+const u32 gEventObjectPic_Gentleman_0[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/0.4bpp");
+const u32 gEventObjectPic_Gentleman_1[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/1.4bpp");
+const u32 gEventObjectPic_Gentleman_2[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/2.4bpp");
+const u32 gEventObjectPic_Gentleman_3[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/3.4bpp");
+const u32 gEventObjectPic_Gentleman_4[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/4.4bpp");
+const u32 gEventObjectPic_Gentleman_5[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/5.4bpp");
+const u32 gEventObjectPic_Gentleman_6[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/6.4bpp");
+const u32 gEventObjectPic_Gentleman_7[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/7.4bpp");
+const u32 gEventObjectPic_Gentleman_8[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/8.4bpp");
+const u32 gEventObjectPic_Sailor_0[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/0.4bpp");
+const u32 gEventObjectPic_Sailor_1[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/1.4bpp");
+const u32 gEventObjectPic_Sailor_2[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/2.4bpp");
+const u32 gEventObjectPic_Sailor_3[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/3.4bpp");
+const u32 gEventObjectPic_Sailor_4[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/4.4bpp");
+const u32 gEventObjectPic_Sailor_5[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/5.4bpp");
+const u32 gEventObjectPic_Sailor_6[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/6.4bpp");
+const u32 gEventObjectPic_Sailor_7[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/7.4bpp");
+const u32 gEventObjectPic_Sailor_8[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/8.4bpp");
+const u32 gEventObjectPic_Fisherman_0[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/0.4bpp");
+const u32 gEventObjectPic_Fisherman_1[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/1.4bpp");
+const u32 gEventObjectPic_Fisherman_2[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/2.4bpp");
+const u32 gEventObjectPic_Fisherman_3[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/3.4bpp");
+const u32 gEventObjectPic_Fisherman_4[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/4.4bpp");
+const u32 gEventObjectPic_Fisherman_5[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/5.4bpp");
+const u32 gEventObjectPic_Fisherman_6[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/6.4bpp");
+const u32 gEventObjectPic_Fisherman_7[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/7.4bpp");
+const u32 gEventObjectPic_Fisherman_8[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/8.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/0.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/1.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/2.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/3.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/4.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/5.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/6.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/7.4bpp");
+const u32 gEventObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/8.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/0.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/1.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/2.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/3.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/4.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/5.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/6.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/7.4bpp");
+const u32 gEventObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/8.4bpp");
+const u32 gEventObjectPic_TuberF_0[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/0.4bpp");
+const u32 gEventObjectPic_TuberF_1[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/1.4bpp");
+const u32 gEventObjectPic_TuberF_2[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/2.4bpp");
+const u32 gEventObjectPic_TuberF_3[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/3.4bpp");
+const u32 gEventObjectPic_TuberF_4[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/4.4bpp");
+const u32 gEventObjectPic_TuberF_5[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/5.4bpp");
+const u32 gEventObjectPic_TuberF_6[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/6.4bpp");
+const u32 gEventObjectPic_TuberF_7[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/7.4bpp");
+const u32 gEventObjectPic_TuberF_8[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/8.4bpp");
+const u32 gEventObjectPic_TuberM_0[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/0.4bpp");
+const u32 gEventObjectPic_TuberM_1[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/1.4bpp");
+const u32 gEventObjectPic_TuberM_2[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/2.4bpp");
+const u32 gEventObjectPic_TuberM_3[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/3.4bpp");
+const u32 gEventObjectPic_TuberM_4[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/4.4bpp");
+const u32 gEventObjectPic_TuberM_5[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/5.4bpp");
+const u32 gEventObjectPic_TuberM_6[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/6.4bpp");
+const u32 gEventObjectPic_TuberM_7[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/7.4bpp");
+const u32 gEventObjectPic_TuberM_8[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/8.4bpp");
+const u32 gEventObjectPic_Hiker_0[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/0.4bpp");
+const u32 gEventObjectPic_Hiker_1[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/1.4bpp");
+const u32 gEventObjectPic_Hiker_2[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/2.4bpp");
+const u32 gEventObjectPic_Hiker_3[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/3.4bpp");
+const u32 gEventObjectPic_Hiker_4[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/4.4bpp");
+const u32 gEventObjectPic_Hiker_5[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/5.4bpp");
+const u32 gEventObjectPic_Hiker_6[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/6.4bpp");
+const u32 gEventObjectPic_Hiker_7[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/7.4bpp");
+const u32 gEventObjectPic_Hiker_8[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/8.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/0.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/1.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/2.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/3.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/4.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/5.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/6.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/7.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/8.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/0.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/1.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/2.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/3.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/4.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/5.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/6.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/7.4bpp");
+const u32 gEventObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/8.4bpp");
+const u32 gEventObjectPic_Man5_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/0.4bpp");
+const u32 gEventObjectPic_Man5_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/1.4bpp");
+const u32 gEventObjectPic_Man5_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/2.4bpp");
+const u32 gEventObjectPic_Man5_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/3.4bpp");
+const u32 gEventObjectPic_Man5_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/4.4bpp");
+const u32 gEventObjectPic_Man5_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/5.4bpp");
+const u32 gEventObjectPic_Man5_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/6.4bpp");
+const u32 gEventObjectPic_Man5_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/7.4bpp");
+const u32 gEventObjectPic_Man5_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/8.4bpp");
+const u32 gEventObjectPic_Man6_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/0.4bpp");
+const u32 gEventObjectPic_Man6_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/1.4bpp");
+const u32 gEventObjectPic_Man6_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/2.4bpp");
+const u32 gEventObjectPic_Man6_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/3.4bpp");
+const u32 gEventObjectPic_Man6_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/4.4bpp");
+const u32 gEventObjectPic_Man6_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/5.4bpp");
+const u32 gEventObjectPic_Man6_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/6.4bpp");
+const u32 gEventObjectPic_Man6_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/7.4bpp");
+const u32 gEventObjectPic_Man6_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/8.4bpp");
+const u32 gEventObjectPic_Nurse_0[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/0.4bpp");
+const u32 gEventObjectPic_Nurse_1[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/1.4bpp");
+const u32 gEventObjectPic_Nurse_2[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/2.4bpp");
+const u32 gEventObjectPic_Nurse_3[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/3.4bpp");
+const u32 gEventObjectPic_ItemBall[] = INCBIN_U32("graphics/event_objects/pics/misc/item_ball.4bpp");
+const u32 gEventObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/0.4bpp");
+const u32 gEventObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/1.4bpp");
+const u32 gEventObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/2.4bpp");
+const u32 gEventObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/3.4bpp");
+const u32 gEventObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/4.4bpp");
+const u32 gEventObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/5.4bpp");
+const u32 gEventObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/6.4bpp");
+const u32 gEventObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/7.4bpp");
+const u32 gEventObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/8.4bpp");
+const u32 gEventObjectPic_ReporterM_0[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/0.4bpp");
+const u32 gEventObjectPic_ReporterM_1[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/1.4bpp");
+const u32 gEventObjectPic_ReporterM_2[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/2.4bpp");
+const u32 gEventObjectPic_ReporterM_3[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/3.4bpp");
+const u32 gEventObjectPic_ReporterM_4[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/4.4bpp");
+const u32 gEventObjectPic_ReporterM_5[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/5.4bpp");
+const u32 gEventObjectPic_ReporterM_6[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/6.4bpp");
+const u32 gEventObjectPic_ReporterM_7[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/7.4bpp");
+const u32 gEventObjectPic_ReporterM_8[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/8.4bpp");
+const u32 gEventObjectPic_ReporterF_0[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/0.4bpp");
+const u32 gEventObjectPic_ReporterF_1[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/1.4bpp");
+const u32 gEventObjectPic_ReporterF_2[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/2.4bpp");
+const u32 gEventObjectPic_ReporterF_3[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/3.4bpp");
+const u32 gEventObjectPic_ReporterF_4[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/4.4bpp");
+const u32 gEventObjectPic_ReporterF_5[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/5.4bpp");
+const u32 gEventObjectPic_ReporterF_6[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/6.4bpp");
+const u32 gEventObjectPic_ReporterF_7[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/7.4bpp");
+const u32 gEventObjectPic_ReporterF_8[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/8.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/0.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/1.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/2.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/3.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/4.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/5.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/6.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/7.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/8.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/0.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/1.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/2.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/3.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/4.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/5.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/6.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/7.4bpp");
+const u32 gEventObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/8.4bpp");
+const u32 gEventObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/0.4bpp");
+const u32 gEventObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/1.4bpp");
+const u32 gEventObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/2.4bpp");
+const u32 gEventObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/3.4bpp");
+const u32 gEventObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/4.4bpp");
+const u32 gEventObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/5.4bpp");
+const u32 gEventObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/6.4bpp");
+const u32 gEventObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/7.4bpp");
+const u32 gEventObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/8.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/0.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/1.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/2.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/3.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/4.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/5.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/6.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/7.4bpp");
+const u32 gEventObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/8.4bpp");
+const u32 gEventObjectPic_Teala_0[] = INCBIN_U32("graphics/event_objects/pics/people/teala/0.4bpp");
+const u32 gEventObjectPic_Teala_1[] = INCBIN_U32("graphics/event_objects/pics/people/teala/1.4bpp");
+const u32 gEventObjectPic_Teala_2[] = INCBIN_U32("graphics/event_objects/pics/people/teala/2.4bpp");
+const u32 gEventObjectPic_Teala_3[] = INCBIN_U32("graphics/event_objects/pics/people/teala/3.4bpp");
+const u32 gEventObjectPic_Teala_4[] = INCBIN_U32("graphics/event_objects/pics/people/teala/4.4bpp");
+const u32 gEventObjectPic_Teala_5[] = INCBIN_U32("graphics/event_objects/pics/people/teala/5.4bpp");
+const u32 gEventObjectPic_Teala_6[] = INCBIN_U32("graphics/event_objects/pics/people/teala/6.4bpp");
+const u32 gEventObjectPic_Teala_7[] = INCBIN_U32("graphics/event_objects/pics/people/teala/7.4bpp");
+const u32 gEventObjectPic_Teala_8[] = INCBIN_U32("graphics/event_objects/pics/people/teala/8.4bpp");
+const u32 gEventObjectPic_Artist_0[] = INCBIN_U32("graphics/event_objects/pics/people/artist/0.4bpp");
+const u32 gEventObjectPic_Artist_1[] = INCBIN_U32("graphics/event_objects/pics/people/artist/1.4bpp");
+const u32 gEventObjectPic_Artist_2[] = INCBIN_U32("graphics/event_objects/pics/people/artist/2.4bpp");
+const u32 gEventObjectPic_Artist_3[] = INCBIN_U32("graphics/event_objects/pics/people/artist/3.4bpp");
+const u32 gEventObjectPic_Artist_4[] = INCBIN_U32("graphics/event_objects/pics/people/artist/4.4bpp");
+const u32 gEventObjectPic_Artist_5[] = INCBIN_U32("graphics/event_objects/pics/people/artist/5.4bpp");
+const u32 gEventObjectPic_Artist_6[] = INCBIN_U32("graphics/event_objects/pics/people/artist/6.4bpp");
+const u32 gEventObjectPic_Artist_7[] = INCBIN_U32("graphics/event_objects/pics/people/artist/7.4bpp");
+const u32 gEventObjectPic_Artist_8[] = INCBIN_U32("graphics/event_objects/pics/people/artist/8.4bpp");
+const u32 gEventObjectPic_Cameraman_0[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/0.4bpp");
+const u32 gEventObjectPic_Cameraman_1[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/1.4bpp");
+const u32 gEventObjectPic_Cameraman_2[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/2.4bpp");
+const u32 gEventObjectPic_Cameraman_3[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/3.4bpp");
+const u32 gEventObjectPic_Cameraman_4[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/4.4bpp");
+const u32 gEventObjectPic_Cameraman_5[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/5.4bpp");
+const u32 gEventObjectPic_Cameraman_6[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/6.4bpp");
+const u32 gEventObjectPic_Cameraman_7[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/7.4bpp");
+const u32 gEventObjectPic_Cameraman_8[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/8.4bpp");
+const u32 gEventObjectPic_Scientist2_0[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/0.4bpp");
+const u32 gEventObjectPic_Scientist2_1[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/1.4bpp");
+const u32 gEventObjectPic_Scientist2_2[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/2.4bpp");
+const u32 gEventObjectPic_Scientist2_3[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/3.4bpp");
+const u32 gEventObjectPic_Scientist2_4[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/4.4bpp");
+const u32 gEventObjectPic_Scientist2_5[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/5.4bpp");
+const u32 gEventObjectPic_Scientist2_6[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/6.4bpp");
+const u32 gEventObjectPic_Scientist2_7[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/7.4bpp");
+const u32 gEventObjectPic_Scientist2_8[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/8.4bpp");
+const u32 gEventObjectPic_Man7_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/0.4bpp");
+const u32 gEventObjectPic_Man7_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/1.4bpp");
+const u32 gEventObjectPic_Man7_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/2.4bpp");
+const u32 gEventObjectPic_Man7_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/3.4bpp");
+const u32 gEventObjectPic_Man7_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/4.4bpp");
+const u32 gEventObjectPic_Man7_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/5.4bpp");
+const u32 gEventObjectPic_Man7_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/6.4bpp");
+const u32 gEventObjectPic_Man7_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/7.4bpp");
+const u32 gEventObjectPic_Man7_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/8.4bpp");
+const u32 gEventObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/0.4bpp");
+const u32 gEventObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/1.4bpp");
+const u32 gEventObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/2.4bpp");
+const u32 gEventObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/3.4bpp");
+const u32 gEventObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/4.4bpp");
+const u32 gEventObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/5.4bpp");
+const u32 gEventObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/6.4bpp");
+const u32 gEventObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/7.4bpp");
+const u32 gEventObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/8.4bpp");
+const u32 gEventObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/0.4bpp");
+const u32 gEventObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/1.4bpp");
+const u32 gEventObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/2.4bpp");
+const u32 gEventObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/3.4bpp");
+const u32 gEventObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/4.4bpp");
+const u32 gEventObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/5.4bpp");
+const u32 gEventObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/6.4bpp");
+const u32 gEventObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/7.4bpp");
+const u32 gEventObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/8.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/0.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/1.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/2.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/3.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/4.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/5.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/6.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/7.4bpp");
+const u32 gEventObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/8.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/0.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/1.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/2.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/3.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/4.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/5.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/6.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/7.4bpp");
+const u32 gEventObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/8.4bpp");
+const u32 gEventObjectPic_Sidney_0[] = INCBIN_U32("graphics/event_objects/pics/people/sidney/0.4bpp");
+const u32 gEventObjectPic_Sidney_1[] = INCBIN_U32("graphics/event_objects/pics/people/sidney/1.4bpp");
+const u32 gEventObjectPic_Sidney_2[] = INCBIN_U32("graphics/event_objects/pics/people/sidney/2.4bpp");
+const u32 gEventObjectPic_Phoebe_0[] = INCBIN_U32("graphics/event_objects/pics/people/phoebe/0.4bpp");
+const u32 gEventObjectPic_Phoebe_1[] = INCBIN_U32("graphics/event_objects/pics/people/phoebe/1.4bpp");
+const u32 gEventObjectPic_Phoebe_2[] = INCBIN_U32("graphics/event_objects/pics/people/phoebe/2.4bpp");
+const u32 gEventObjectPic_Glacia_0[] = INCBIN_U32("graphics/event_objects/pics/people/glacia/0.4bpp");
+const u32 gEventObjectPic_Glacia_1[] = INCBIN_U32("graphics/event_objects/pics/people/glacia/1.4bpp");
+const u32 gEventObjectPic_Glacia_2[] = INCBIN_U32("graphics/event_objects/pics/people/glacia/2.4bpp");
+const u32 gEventObjectPic_Drake_0[] = INCBIN_U32("graphics/event_objects/pics/people/drake/0.4bpp");
+const u32 gEventObjectPic_Drake_1[] = INCBIN_U32("graphics/event_objects/pics/people/drake/1.4bpp");
+const u32 gEventObjectPic_Drake_2[] = INCBIN_U32("graphics/event_objects/pics/people/drake/2.4bpp");
+const u32 gEventObjectPic_Roxanne_0[] = INCBIN_U32("graphics/event_objects/pics/people/roxanne/0.4bpp");
+const u32 gEventObjectPic_Roxanne_1[] = INCBIN_U32("graphics/event_objects/pics/people/roxanne/1.4bpp");
+const u32 gEventObjectPic_Roxanne_2[] = INCBIN_U32("graphics/event_objects/pics/people/roxanne/2.4bpp");
+const u32 gEventObjectPic_Brawly_0[] = INCBIN_U32("graphics/event_objects/pics/people/brawly/0.4bpp");
+const u32 gEventObjectPic_Brawly_1[] = INCBIN_U32("graphics/event_objects/pics/people/brawly/1.4bpp");
+const u32 gEventObjectPic_Brawly_2[] = INCBIN_U32("graphics/event_objects/pics/people/brawly/2.4bpp");
+const u32 gEventObjectPic_Wattson_0[] = INCBIN_U32("graphics/event_objects/pics/people/wattson/0.4bpp");
+const u32 gEventObjectPic_Wattson_1[] = INCBIN_U32("graphics/event_objects/pics/people/wattson/1.4bpp");
+const u32 gEventObjectPic_Wattson_2[] = INCBIN_U32("graphics/event_objects/pics/people/wattson/2.4bpp");
+const u32 gEventObjectPic_Flannery_0[] = INCBIN_U32("graphics/event_objects/pics/people/flannery/0.4bpp");
+const u32 gEventObjectPic_Flannery_1[] = INCBIN_U32("graphics/event_objects/pics/people/flannery/1.4bpp");
+const u32 gEventObjectPic_Flannery_2[] = INCBIN_U32("graphics/event_objects/pics/people/flannery/2.4bpp");
+const u32 gEventObjectPic_Norman_0[] = INCBIN_U32("graphics/event_objects/pics/people/norman/0.4bpp");
+const u32 gEventObjectPic_Norman_1[] = INCBIN_U32("graphics/event_objects/pics/people/norman/1.4bpp");
+const u32 gEventObjectPic_Norman_2[] = INCBIN_U32("graphics/event_objects/pics/people/norman/2.4bpp");
+const u32 gEventObjectPic_Norman_3[] = INCBIN_U32("graphics/event_objects/pics/people/norman/3.4bpp");
+const u32 gEventObjectPic_Norman_4[] = INCBIN_U32("graphics/event_objects/pics/people/norman/4.4bpp");
+const u32 gEventObjectPic_Norman_5[] = INCBIN_U32("graphics/event_objects/pics/people/norman/5.4bpp");
+const u32 gEventObjectPic_Norman_6[] = INCBIN_U32("graphics/event_objects/pics/people/norman/6.4bpp");
+const u32 gEventObjectPic_Norman_7[] = INCBIN_U32("graphics/event_objects/pics/people/norman/7.4bpp");
+const u32 gEventObjectPic_Norman_8[] = INCBIN_U32("graphics/event_objects/pics/people/norman/8.4bpp");
+const u32 gEventObjectPic_Winona_0[] = INCBIN_U32("graphics/event_objects/pics/people/winona/0.4bpp");
+const u32 gEventObjectPic_Winona_1[] = INCBIN_U32("graphics/event_objects/pics/people/winona/1.4bpp");
+const u32 gEventObjectPic_Winona_2[] = INCBIN_U32("graphics/event_objects/pics/people/winona/2.4bpp");
+const u32 gEventObjectPic_Liza_0[] = INCBIN_U32("graphics/event_objects/pics/people/liza/0.4bpp");
+const u32 gEventObjectPic_Liza_1[] = INCBIN_U32("graphics/event_objects/pics/people/liza/1.4bpp");
+const u32 gEventObjectPic_Liza_2[] = INCBIN_U32("graphics/event_objects/pics/people/liza/2.4bpp");
+const u32 gEventObjectPic_Tate_0[] = INCBIN_U32("graphics/event_objects/pics/people/tate/0.4bpp");
+const u32 gEventObjectPic_Tate_1[] = INCBIN_U32("graphics/event_objects/pics/people/tate/1.4bpp");
+const u32 gEventObjectPic_Tate_2[] = INCBIN_U32("graphics/event_objects/pics/people/tate/2.4bpp");
+const u32 gEventObjectPic_Wallace_0[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/0.4bpp");
+const u32 gEventObjectPic_Wallace_1[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/1.4bpp");
+const u32 gEventObjectPic_Wallace_2[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/2.4bpp");
+const u32 gEventObjectPic_Wallace_3[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/3.4bpp");
+const u32 gEventObjectPic_Wallace_4[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/4.4bpp");
+const u32 gEventObjectPic_Wallace_5[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/5.4bpp");
+const u32 gEventObjectPic_Wallace_6[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/6.4bpp");
+const u32 gEventObjectPic_Wallace_7[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/7.4bpp");
+const u32 gEventObjectPic_Wallace_8[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/8.4bpp");
+const u32 gEventObjectPic_Steven_0[] = INCBIN_U32("graphics/event_objects/pics/people/steven/0.4bpp");
+const u32 gEventObjectPic_Steven_1[] = INCBIN_U32("graphics/event_objects/pics/people/steven/1.4bpp");
+const u32 gEventObjectPic_Steven_2[] = INCBIN_U32("graphics/event_objects/pics/people/steven/2.4bpp");
+const u32 gEventObjectPic_Steven_3[] = INCBIN_U32("graphics/event_objects/pics/people/steven/3.4bpp");
+const u32 gEventObjectPic_Steven_4[] = INCBIN_U32("graphics/event_objects/pics/people/steven/4.4bpp");
+const u32 gEventObjectPic_Steven_5[] = INCBIN_U32("graphics/event_objects/pics/people/steven/5.4bpp");
+const u32 gEventObjectPic_Steven_6[] = INCBIN_U32("graphics/event_objects/pics/people/steven/6.4bpp");
+const u32 gEventObjectPic_Steven_7[] = INCBIN_U32("graphics/event_objects/pics/people/steven/7.4bpp");
+const u32 gEventObjectPic_Steven_8[] = INCBIN_U32("graphics/event_objects/pics/people/steven/8.4bpp");
+const u32 gEventObjectPic_Wally_0[] = INCBIN_U32("graphics/event_objects/pics/people/wally/0.4bpp");
+const u32 gEventObjectPic_Wally_1[] = INCBIN_U32("graphics/event_objects/pics/people/wally/1.4bpp");
+const u32 gEventObjectPic_Wally_2[] = INCBIN_U32("graphics/event_objects/pics/people/wally/2.4bpp");
+const u32 gEventObjectPic_Wally_3[] = INCBIN_U32("graphics/event_objects/pics/people/wally/3.4bpp");
+const u32 gEventObjectPic_Wally_4[] = INCBIN_U32("graphics/event_objects/pics/people/wally/4.4bpp");
+const u32 gEventObjectPic_Wally_5[] = INCBIN_U32("graphics/event_objects/pics/people/wally/5.4bpp");
+const u32 gEventObjectPic_Wally_6[] = INCBIN_U32("graphics/event_objects/pics/people/wally/6.4bpp");
+const u32 gEventObjectPic_Wally_7[] = INCBIN_U32("graphics/event_objects/pics/people/wally/7.4bpp");
+const u32 gEventObjectPic_Wally_8[] = INCBIN_U32("graphics/event_objects/pics/people/wally/8.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_0[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/0.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_1[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/1.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_2[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/2.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_3[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/3.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_4[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/4.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_5[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/5.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_6[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/6.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_7[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/7.4bpp");
+const u32 gEventObjectPic_RubySapphireLittleBoy_8[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/8.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/0.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/1.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/2.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/3.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/4.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/5.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/6.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/7.4bpp");
+const u32 gEventObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/8.4bpp");
+const u32 gEventObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/latias_latios/0.4bpp");
+const u32 gEventObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/latias_latios/1.4bpp");
+const u32 gEventObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/latias_latios/2.4bpp");
+const u32 gEventObjectPic_Boy5_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_5/0.4bpp");
+const u32 gEventObjectPic_Boy5_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_5/1.4bpp");
+const u32 gEventObjectPic_Boy5_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_5/2.4bpp");
+const u32 gEventObjectPic_ContestOldMan_0[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/0.4bpp");
+const u32 gEventObjectPic_ContestOldMan_1[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/1.4bpp");
+const u32 gEventObjectPic_ContestOldMan_2[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/2.4bpp");
+const u32 gEventObjectPic_ContestOldMan_3[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/3.4bpp");
+const u32 gEventObjectPic_ContestOldMan_4[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/4.4bpp");
+const u32 gEventObjectPic_ContestOldMan_5[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/5.4bpp");
+const u32 gEventObjectPic_ContestOldMan_6[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/6.4bpp");
+const u32 gEventObjectPic_ContestOldMan_7[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/7.4bpp");
+const u32 gEventObjectPic_ContestOldMan_8[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/8.4bpp");
+const u32 gEventObjectPic_Archie_0[] = INCBIN_U32("graphics/event_objects/pics/people/archie/0.4bpp");
+const u32 gEventObjectPic_Archie_1[] = INCBIN_U32("graphics/event_objects/pics/people/archie/1.4bpp");
+const u32 gEventObjectPic_Archie_2[] = INCBIN_U32("graphics/event_objects/pics/people/archie/2.4bpp");
+const u32 gEventObjectPic_Archie_3[] = INCBIN_U32("graphics/event_objects/pics/people/archie/3.4bpp");
+const u32 gEventObjectPic_Archie_4[] = INCBIN_U32("graphics/event_objects/pics/people/archie/4.4bpp");
+const u32 gEventObjectPic_Archie_5[] = INCBIN_U32("graphics/event_objects/pics/people/archie/5.4bpp");
+const u32 gEventObjectPic_Archie_6[] = INCBIN_U32("graphics/event_objects/pics/people/archie/6.4bpp");
+const u32 gEventObjectPic_Archie_7[] = INCBIN_U32("graphics/event_objects/pics/people/archie/7.4bpp");
+const u32 gEventObjectPic_Archie_8[] = INCBIN_U32("graphics/event_objects/pics/people/archie/8.4bpp");
+const u32 gEventObjectPic_Maxie_0[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/0.4bpp");
+const u32 gEventObjectPic_Maxie_1[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/1.4bpp");
+const u32 gEventObjectPic_Maxie_2[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/2.4bpp");
+const u32 gEventObjectPic_Maxie_3[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/3.4bpp");
+const u32 gEventObjectPic_Maxie_4[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/4.4bpp");
+const u32 gEventObjectPic_Maxie_5[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/5.4bpp");
+const u32 gEventObjectPic_Maxie_6[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/6.4bpp");
+const u32 gEventObjectPic_Maxie_7[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/7.4bpp");
+const u32 gEventObjectPic_Maxie_8[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/8.4bpp");
+const u32 gEventObjectPic_KyogreFront_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_front/0.4bpp");
+const u32 gEventObjectPic_KyogreFront_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_front/1.4bpp");
+const u32 gEventObjectPic_KyogreSide_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_side/0.4bpp");
+const u32 gEventObjectPic_KyogreSide_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_side/1.4bpp");
+const u32 gEventObjectPic_GroudonFront_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_front/0.4bpp");
+const u32 gEventObjectPic_GroudonFront_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_front/1.4bpp");
+const u32 gEventObjectPic_GroudonSide_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_side/0.4bpp");
+const u32 gEventObjectPic_GroudonSide_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_side/1.4bpp");
+const u32 gEventObjectPic_Regi[] = INCBIN_U32("graphics/event_objects/pics/pokemon/regi.4bpp");
+const u32 gEventObjectPic_Skitty_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/skitty/0.4bpp");
+const u32 gEventObjectPic_Skitty_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/skitty/1.4bpp");
+const u32 gEventObjectPic_Skitty_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/skitty/2.4bpp");
+const u32 gEventObjectPic_Kecleon_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kecleon/0.4bpp");
+const u32 gEventObjectPic_Kecleon_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kecleon/1.4bpp");
+const u32 gEventObjectPic_Kecleon_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kecleon/2.4bpp");
+const u32 gEventObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/0.4bpp");
+const u32 gEventObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/1.4bpp");
+const u32 gEventObjectPic_Rayquaza_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/2.4bpp");
+const u32 gEventObjectPic_Rayquaza_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/3.4bpp");
+const u32 gEventObjectPic_Rayquaza_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/4.4bpp");
+const u32 gEventObjectPic_RayquazaStill[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza_still.4bpp");
+const u32 gEventObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/zigzagoon/0.4bpp");
+const u32 gEventObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/zigzagoon/1.4bpp");
+const u32 gEventObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/zigzagoon/2.4bpp");
+const u32 gEventObjectPic_Pikachu_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/pikachu/0.4bpp");
+const u32 gEventObjectPic_Pikachu_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/pikachu/1.4bpp");
+const u32 gEventObjectPic_Pikachu_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/pikachu/2.4bpp");
+const u32 gEventObjectPic_Azumarill_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azumarill/0.4bpp");
+const u32 gEventObjectPic_Azumarill_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azumarill/1.4bpp");
+const u32 gEventObjectPic_Azumarill_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azumarill/2.4bpp");
+const u32 gEventObjectPic_Wingull_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/0.4bpp");
+const u32 gEventObjectPic_Wingull_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/3.4bpp");
+const u32 gEventObjectPic_Wingull_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/1.4bpp");
+const u32 gEventObjectPic_Wingull_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/4.4bpp");
+const u32 gEventObjectPic_Wingull_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/2.4bpp");
+const u32 gEventObjectPic_Wingull_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/5.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/0.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/1.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/2.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/3.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/4.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/5.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/6.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/7.4bpp");
+const u32 gEventObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/8.4bpp");
+const u32 gEventObjectPic_Azurill_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azurill/0.4bpp");
+const u32 gEventObjectPic_Azurill_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azurill/1.4bpp");
+const u32 gEventObjectPic_Azurill_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azurill/2.4bpp");
+const u32 gEventObjectPic_Mom_0[] = INCBIN_U32("graphics/event_objects/pics/people/mom/0.4bpp");
+const u32 gEventObjectPic_Mom_1[] = INCBIN_U32("graphics/event_objects/pics/people/mom/1.4bpp");
+const u32 gEventObjectPic_Mom_2[] = INCBIN_U32("graphics/event_objects/pics/people/mom/2.4bpp");
+const u32 gEventObjectPic_Mom_3[] = INCBIN_U32("graphics/event_objects/pics/people/mom/3.4bpp");
+const u32 gEventObjectPic_Mom_4[] = INCBIN_U32("graphics/event_objects/pics/people/mom/4.4bpp");
+const u32 gEventObjectPic_Mom_5[] = INCBIN_U32("graphics/event_objects/pics/people/mom/5.4bpp");
+const u32 gEventObjectPic_Mom_6[] = INCBIN_U32("graphics/event_objects/pics/people/mom/6.4bpp");
+const u32 gEventObjectPic_Mom_7[] = INCBIN_U32("graphics/event_objects/pics/people/mom/7.4bpp");
+const u32 gEventObjectPic_Mom_8[] = INCBIN_U32("graphics/event_objects/pics/people/mom/8.4bpp");
+const u16 gEventObjectPalette22[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_22.gbapal");
+const u16 gEventObjectPalette23[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_23.gbapal");
+const u16 gEventObjectPalette24[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_24.gbapal");
+const u16 gEventObjectPalette25[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_25.gbapal");
+const u32 gEventObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_natu_doll.4bpp");
+const u32 gEventObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_magnemite_doll.4bpp");
+const u32 gEventObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_squirtle_doll.4bpp");
+const u32 gEventObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_wooper_doll.4bpp");
+const u32 gEventObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_pikachu_doll.4bpp");
+const u32 gEventObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_porygon2_doll.4bpp");
+const u32 gEventObjectPic_PichuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/pichu_doll.4bpp");
+const u32 gEventObjectPic_PikachuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/pikachu_doll.4bpp");
+const u32 gEventObjectPic_MarillDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/marill_doll.4bpp");
+const u32 gEventObjectPic_TogepiDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/togepi_doll.4bpp");
+const u32 gEventObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/cyndaquil_doll.4bpp");
+const u32 gEventObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/chikorita_doll.4bpp");
+const u32 gEventObjectPic_TotodileDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/totodile_doll.4bpp");
+const u32 gEventObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/jigglypuff_doll.4bpp");
+const u32 gEventObjectPic_MeowthDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/meowth_doll.4bpp");
+const u32 gEventObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/clefairy_doll.4bpp");
+const u32 gEventObjectPic_DittoDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/ditto_doll.4bpp");
+const u32 gEventObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/smoochum_doll.4bpp");
+const u32 gEventObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/treecko_doll.4bpp");
+const u32 gEventObjectPic_TorchicDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/torchic_doll.4bpp");
+const u32 gEventObjectPic_MudkipDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/mudkip_doll.4bpp");
+const u32 gEventObjectPic_DuskullDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/duskull_doll.4bpp");
+const u32 gEventObjectPic_WynautDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/wynaut_doll.4bpp");
+const u32 gEventObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/baltoy_doll.4bpp");
+const u32 gEventObjectPic_KecleonDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/kecleon_doll.4bpp");
+const u32 gEventObjectPic_AzurillDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/azurill_doll.4bpp");
+const u32 gEventObjectPic_SkittyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/skitty_doll.4bpp");
+const u32 gEventObjectPic_SwabluDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/swablu_doll.4bpp");
+const u32 gEventObjectPic_GulpinDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/gulpin_doll.4bpp");
+const u32 gEventObjectPic_LotadDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/lotad_doll.4bpp");
+const u32 gEventObjectPic_SeedotDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/seedot_doll.4bpp");
+const u32 gEventObjectPic_PikaCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/pika_cushion.4bpp");
+const u32 gEventObjectPic_RoundCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/round_cushion.4bpp");
+const u32 gEventObjectPic_KissCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/kiss_cushion.4bpp");
+const u32 gEventObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/zigzag_cushion.4bpp");
+const u32 gEventObjectPic_SpinCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/spin_cushion.4bpp");
+const u32 gEventObjectPic_DiamondCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/diamond_cushion.4bpp");
+const u32 gEventObjectPic_BallCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/ball_cushion.4bpp");
+const u32 gEventObjectPic_GrassCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/grass_cushion.4bpp");
+const u32 gEventObjectPic_FireCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/fire_cushion.4bpp");
+const u32 gEventObjectPic_WaterCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/water_cushion.4bpp");
+const u32 gEventObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_snorlax_doll.4bpp");
+const u32 gEventObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_rhydon_doll.4bpp");
+const u32 gEventObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_lapras_doll.4bpp");
+const u32 gEventObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_venusaur_doll.4bpp");
+const u32 gEventObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_charizard_doll.4bpp");
+const u32 gEventObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_blastoise_doll.4bpp");
+const u32 gEventObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_wailmer_doll.4bpp");
+const u32 gEventObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_regirock_doll.4bpp");
+const u32 gEventObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_regice_doll.4bpp");
+const u32 gEventObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_registeel_doll.4bpp");
+const u32 gEventObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/0.4bpp");
+const u32 gEventObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/1.4bpp");
+const u32 gEventObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/2.4bpp");
+const u32 gEventObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/3.4bpp");
+const u32 gEventObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/0.4bpp");
+const u32 gEventObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/1.4bpp");
+const u32 gEventObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/2.4bpp");
+const u32 gEventObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/3.4bpp");
+const u32 gEventObjectPic_PushableBoulder[] = INCBIN_U32("graphics/event_objects/pics/misc/pushable_boulder.4bpp");
+const u32 gEventObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/event_objects/pics/misc/mr_brineys_boat/0.4bpp");
+const u32 gEventObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/event_objects/pics/misc/mr_brineys_boat/1.4bpp");
+const u32 gEventObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/event_objects/pics/misc/mr_brineys_boat/2.4bpp");
+const u32 gEventObjectPic_Fossil[] = INCBIN_U32("graphics/event_objects/pics/misc/fossil.4bpp");
+const u32 gEventObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/event_objects/pics/misc/submarine_shadow.4bpp");
+const u16 gEventObjectPalette26[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_26.gbapal");
+const u32 gEventObjectPic_Truck[] = INCBIN_U32("graphics/event_objects/pics/misc/truck.4bpp");
+const u16 gEventObjectPalette14[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_14.gbapal");
+const u32 gEventObjectPic_VigorothCarryingBox_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_carrying_box/0.4bpp");
+const u32 gEventObjectPic_VigorothCarryingBox_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_carrying_box/1.4bpp");
+const u32 gEventObjectPic_VigorothCarryingBox_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_carrying_box/2.4bpp");
+const u32 gEventObjectPic_VigorothFacingAway_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_facing_away/0.4bpp");
+const u32 gEventObjectPic_VigorothFacingAway_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_facing_away/1.4bpp");
+const u16 gEventObjectPalette15[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_15.gbapal");
+const u32 gEventObjectPic_BirchsBag[] = INCBIN_U32("graphics/event_objects/pics/misc/birchs_bag.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/0.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/1.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/2.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/3.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/4.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/5.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/6.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/7.4bpp");
+const u32 gEventObjectPic_EnemyZigzagoon_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/8.4bpp");
+const u16 gEventObjectPalette16[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_16.gbapal");
+const u32 gEventObjectPic_Poochyena_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/0.4bpp");
+const u32 gEventObjectPic_Poochyena_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/1.4bpp");
+const u32 gEventObjectPic_Poochyena_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/2.4bpp");
+const u32 gEventObjectPic_Poochyena_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/3.4bpp");
+const u32 gEventObjectPic_Poochyena_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/4.4bpp");
+const u32 gEventObjectPic_Poochyena_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/5.4bpp");
+const u32 gEventObjectPic_Poochyena_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/6.4bpp");
+const u32 gEventObjectPic_Poochyena_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/7.4bpp");
+const u32 gEventObjectPic_Poochyena_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/8.4bpp");
+const u16 gEventObjectPalette27[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_27.gbapal");
+const u32 gEventObjectPic_CableCar[] = INCBIN_U32("graphics/event_objects/pics/misc/cable_car.4bpp");
+const u16 gEventObjectPalette20[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_20.gbapal");
+const u32 gEventObjectPic_SSTidal[] = INCBIN_U32("graphics/event_objects/pics/misc/ss_tidal.4bpp");
+const u16 gEventObjectPalette21[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_21.gbapal");
+const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/0.4bpp");
+const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/1.4bpp");
+const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/2.4bpp");
+const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/3.4bpp");
+const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/4.4bpp");
+const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/5.4bpp");
+const u32 gEventObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/dirt_pile.4bpp");
+const u32 gEventObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sprout/0.4bpp");
+const u32 gEventObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sprout/1.4bpp");
+const u32 gEventObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/0.4bpp");
+const u32 gEventObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/1.4bpp");
+const u32 gEventObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/2.4bpp");
+const u32 gEventObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/3.4bpp");
+const u32 gEventObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/4.4bpp");
+const u32 gEventObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/5.4bpp");
+const u32 gEventObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/0.4bpp");
+const u32 gEventObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/1.4bpp");
+const u32 gEventObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/2.4bpp");
+const u32 gEventObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/3.4bpp");
+const u32 gEventObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/4.4bpp");
+const u32 gEventObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/5.4bpp");
+const u32 gEventObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/0.4bpp");
+const u32 gEventObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/1.4bpp");
+const u32 gEventObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/2.4bpp");
+const u32 gEventObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/3.4bpp");
+const u32 gEventObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/4.4bpp");
+const u32 gEventObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/5.4bpp");
+const u32 gEventObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/0.4bpp");
+const u32 gEventObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/1.4bpp");
+const u32 gEventObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/2.4bpp");
+const u32 gEventObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/3.4bpp");
+const u32 gEventObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/4.4bpp");
+const u32 gEventObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/5.4bpp");
+const u32 gEventObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/0.4bpp");
+const u32 gEventObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/1.4bpp");
+const u32 gEventObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/2.4bpp");
+const u32 gEventObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/3.4bpp");
+const u32 gEventObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/4.4bpp");
+const u32 gEventObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/5.4bpp");
+const u32 gEventObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/0.4bpp");
+const u32 gEventObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/1.4bpp");
+const u32 gEventObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/2.4bpp");
+const u32 gEventObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/3.4bpp");
+const u32 gEventObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/4.4bpp");
+const u32 gEventObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/5.4bpp");
+const u32 gEventObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/0.4bpp");
+const u32 gEventObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/1.4bpp");
+const u32 gEventObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/2.4bpp");
+const u32 gEventObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/3.4bpp");
+const u32 gEventObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/4.4bpp");
+const u32 gEventObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/5.4bpp");
+const u32 gEventObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/0.4bpp");
+const u32 gEventObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/1.4bpp");
+const u32 gEventObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/2.4bpp");
+const u32 gEventObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/3.4bpp");
+const u32 gEventObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/4.4bpp");
+const u32 gEventObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/5.4bpp");
+const u32 gEventObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/0.4bpp");
+const u32 gEventObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/1.4bpp");
+const u32 gEventObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/2.4bpp");
+const u32 gEventObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/3.4bpp");
+const u32 gEventObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/4.4bpp");
+const u32 gEventObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/5.4bpp");
+const u32 gEventObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/0.4bpp");
+const u32 gEventObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/1.4bpp");
+const u32 gEventObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/2.4bpp");
+const u32 gEventObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/3.4bpp");
+const u32 gEventObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/4.4bpp");
+const u32 gEventObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/5.4bpp");
+const u32 gEventObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/0.4bpp");
+const u32 gEventObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/1.4bpp");
+const u32 gEventObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/2.4bpp");
+const u32 gEventObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/3.4bpp");
+const u32 gEventObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/4.4bpp");
+const u32 gEventObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/5.4bpp");
+const u32 gEventObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/0.4bpp");
+const u32 gEventObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/1.4bpp");
+const u32 gEventObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/2.4bpp");
+const u32 gEventObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/3.4bpp");
+const u32 gEventObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/4.4bpp");
+const u32 gEventObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/5.4bpp");
+const u32 gEventObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/0.4bpp");
+const u32 gEventObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/1.4bpp");
+const u32 gEventObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/2.4bpp");
+const u32 gEventObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/3.4bpp");
+const u32 gEventObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/4.4bpp");
+const u32 gEventObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/5.4bpp");
+const u32 gEventObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/0.4bpp");
+const u32 gEventObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/1.4bpp");
+const u32 gEventObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/2.4bpp");
+const u32 gEventObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/3.4bpp");
+const u32 gEventObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/4.4bpp");
+const u32 gEventObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/5.4bpp");
+const u32 gEventObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/0.4bpp");
+const u32 gEventObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/1.4bpp");
+const u32 gEventObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/2.4bpp");
+const u32 gEventObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/3.4bpp");
+const u32 gEventObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/4.4bpp");
+const u32 gEventObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/5.4bpp");
+const u32 gEventObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/0.4bpp");
+const u32 gEventObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/1.4bpp");
+const u32 gEventObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/2.4bpp");
+const u32 gEventObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/3.4bpp");
+const u32 gEventObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/4.4bpp");
+const u32 gEventObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/5.4bpp");
+const u32 gEventObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/0.4bpp");
+const u32 gEventObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/1.4bpp");
+const u32 gEventObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/2.4bpp");
+const u32 gEventObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/3.4bpp");
+const u32 gEventObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/4.4bpp");
+const u32 gEventObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/5.4bpp");
+const u32 gEventObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/0.4bpp");
+const u32 gEventObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/1.4bpp");
+const u32 gEventObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/2.4bpp");
+const u32 gEventObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/3.4bpp");
+const u32 gEventObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/4.4bpp");
+const u32 gEventObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/5.4bpp");
+const u32 gEventObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/0.4bpp");
+const u32 gEventObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/1.4bpp");
+const u32 gEventObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/2.4bpp");
+const u32 gEventObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/3.4bpp");
+const u32 gEventObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/4.4bpp");
+const u32 gEventObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/5.4bpp");
+const u32 gEventObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/0.4bpp");
+const u32 gEventObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/1.4bpp");
+const u32 gEventObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/2.4bpp");
+const u32 gEventObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/3.4bpp");
+const u32 gEventObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/4.4bpp");
+const u32 gEventObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/5.4bpp");
+const u32 gEventObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/0.4bpp");
+const u32 gEventObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/1.4bpp");
+const u32 gEventObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/2.4bpp");
+const u32 gEventObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/3.4bpp");
+const u32 gEventObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/4.4bpp");
+const u32 gEventObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/5.4bpp");
+const u32 gEventObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/0.4bpp");
+const u32 gEventObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/1.4bpp");
+const u32 gEventObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/2.4bpp");
+const u32 gEventObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/3.4bpp");
+const u32 gEventObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/4.4bpp");
+const u32 gEventObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/5.4bpp");
+const u32 gEventObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/0.4bpp");
+const u32 gEventObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/1.4bpp");
+const u32 gEventObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/2.4bpp");
+const u32 gEventObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/3.4bpp");
+const u32 gEventObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/4.4bpp");
+const u32 gEventObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/5.4bpp");
+const u32 gEventObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/0.4bpp");
+const u32 gEventObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/1.4bpp");
+const u32 gEventObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/2.4bpp");
+const u32 gEventObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/3.4bpp");
+const u32 gEventObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/4.4bpp");
+const u32 gEventObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/5.4bpp");
+const u32 gEventObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/0.4bpp");
+const u32 gEventObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/1.4bpp");
+const u32 gEventObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/2.4bpp");
+const u32 gEventObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/3.4bpp");
+const u32 gEventObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/4.4bpp");
+const u32 gEventObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/5.4bpp");
+const u32 gEventObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/0.4bpp");
+const u32 gEventObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/1.4bpp");
+const u32 gEventObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/2.4bpp");
+const u32 gEventObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/3.4bpp");
+const u32 gEventObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/4.4bpp");
+const u32 gEventObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/5.4bpp");
+const u32 gEventObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/0.4bpp");
+const u32 gEventObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/1.4bpp");
+const u32 gEventObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/2.4bpp");
+const u32 gEventObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/3.4bpp");
+const u32 gEventObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/4.4bpp");
+const u32 gEventObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/5.4bpp");
+const u32 gEventObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/0.4bpp");
+const u32 gEventObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/1.4bpp");
+const u32 gEventObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/2.4bpp");
+const u32 gEventObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/3.4bpp");
+const u32 gEventObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/4.4bpp");
+const u32 gEventObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/5.4bpp");
+const u32 gEventObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/0.4bpp");
+const u32 gEventObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/1.4bpp");
+const u32 gEventObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/2.4bpp");
+const u32 gEventObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/3.4bpp");
+const u32 gEventObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/4.4bpp");
+const u32 gEventObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/5.4bpp");
+const u32 gEventObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/0.4bpp");
+const u32 gEventObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/1.4bpp");
+const u32 gEventObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/2.4bpp");
+const u32 gEventObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/3.4bpp");
+const u32 gEventObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/4.4bpp");
+const u32 gEventObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/5.4bpp");
+const u32 gFieldEffectObjectPic_SurfBlob_0[] = INCBIN_U32("graphics/event_objects/pics/effects/surf_blob/0.4bpp");
+const u32 gFieldEffectObjectPic_SurfBlob_1[] = INCBIN_U32("graphics/event_objects/pics/effects/surf_blob/1.4bpp");
+const u32 gFieldEffectObjectPic_SurfBlob_2[] = INCBIN_U32("graphics/event_objects/pics/effects/surf_blob/2.4bpp");
+const u32 gEventObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/0.4bpp");
+const u32 gEventObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/1.4bpp");
+const u32 gEventObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/2.4bpp");
+const u32 gEventObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/3.4bpp");
+const u32 gEventObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/4.4bpp");
+const u32 gEventObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/5.4bpp");
+const u32 gEventObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/6.4bpp");
+const u16 gEventObjectPalette12[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_12.gbapal");
+const u16 gEventObjectPalette13[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_13.gbapal");
+const u32 gFieldEffectObjectPic_ShadowSmall[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_small.4bpp");
+const u32 gFieldEffectObjectPic_ShadowMedium[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_medium.4bpp");
+const u32 gFieldEffectObjectPic_ShadowLarge[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_large.4bpp");
+const u32 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_extra_large.4bpp");
+const u32 filler_8368A08[0x48] = {};
+const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/event_objects/pics/effects/cut_grass.4bpp");
+const u32 gFieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/event_objects/pics/effects/cut_grass.4bpp");
+const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_06.gbapal");
+const u32 gFieldEffectObjectPic_Ripple_0[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/0.4bpp");
+const u32 gFieldEffectObjectPic_Ripple_1[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/1.4bpp");
+const u32 gFieldEffectObjectPic_Ripple_2[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/2.4bpp");
+const u32 gFieldEffectObjectPic_Ripple_3[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/3.4bpp");
+const u32 gFieldEffectObjectPic_Ripple_4[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/4.4bpp");
+const u32 gFieldEffectObjectPic_Ash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/0.4bpp");
+const u32 gFieldEffectObjectPic_Ash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/1.4bpp");
+const u32 gFieldEffectObjectPic_Ash_2[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/2.4bpp");
+const u32 gFieldEffectObjectPic_Ash_3[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/3.4bpp");
+const u32 gFieldEffectObjectPic_Ash_4[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/4.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_0[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/0.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_1[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/1.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_2[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/2.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_3[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/3.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_4[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/4.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_5[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/5.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_6[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/6.4bpp");
+const u32 gFieldEffectObjectPic_Arrow_7[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/7.4bpp");
+const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_00.gbapal");
+const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_01.gbapal");
+const u32 gFieldEffectObjectPic_GroundImpactDust_0[] = INCBIN_U32("graphics/event_objects/pics/effects/ground_impact_dust/0.4bpp");
+const u32 gFieldEffectObjectPic_GroundImpactDust_1[] = INCBIN_U32("graphics/event_objects/pics/effects/ground_impact_dust/1.4bpp");
+const u32 gFieldEffectObjectPic_GroundImpactDust_2[] = INCBIN_U32("graphics/event_objects/pics/effects/ground_impact_dust/2.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopTallGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/0.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopTallGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/1.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopTallGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/2.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopTallGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/3.4bpp");
+const u32 gUnusedGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/0.4bpp");
+const u32 gUnusedGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/1.4bpp");
+const u32 gUnusedGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/2.4bpp");
+const u32 gUnusedGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/3.4bpp");
+const u32 gFieldEffectObjectPic_Unknown16_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown16_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/1.4bpp");
+const u32 gFieldEffectObjectPic_Unknown16_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/2.4bpp");
+const u32 gFieldEffectObjectPic_Unknown16_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/3.4bpp");
+const u32 gFieldEffectObjectPic_Unknown16_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/4.4bpp");
+const u32 gUnknown_084F7E38[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_4F7E38/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown16_5[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/5.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/1.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/2.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/3.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/4.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_5[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/5.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_6[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/6.4bpp");
+const u32 gFieldEffectObjectPic_Unknown17_7[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/7.4bpp");
+const u32 gFieldEffectObjectPic_Unknown18_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown18_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/1.4bpp");
+const u32 gFieldEffectObjectPic_Unknown18_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/2.4bpp");
+const u32 gFieldEffectObjectPic_Unknown18_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/3.4bpp");
+const u32 gFieldEffectObjectPic_LongGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/0.4bpp");
+const u32 gFieldEffectObjectPic_LongGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/1.4bpp");
+const u32 gFieldEffectObjectPic_LongGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/2.4bpp");
+const u32 gFieldEffectObjectPic_LongGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/3.4bpp");
+const u32 gFieldEffectObjectPic_TallGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/0.4bpp");
+const u32 gFieldEffectObjectPic_TallGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/1.4bpp");
+const u32 gFieldEffectObjectPic_TallGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/2.4bpp");
+const u32 gFieldEffectObjectPic_TallGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/3.4bpp");
+const u32 gFieldEffectObjectPic_TallGrass_4[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/4.4bpp");
+const u32 gFieldEffectObjectPic_ShortGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/short_grass/0.4bpp");
+const u32 gFieldEffectObjectPic_ShortGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/short_grass/1.4bpp");
+const u32 gFieldEffectObjectPic_SandFootprints_0[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_footprints/0.4bpp");
+const u32 gFieldEffectObjectPic_SandFootprints_1[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_footprints/1.4bpp");
+const u32 gFieldEffectObjectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/event_objects/pics/effects/deep_sand_footprints/0.4bpp");
+const u32 gFieldEffectObjectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/event_objects/pics/effects/deep_sand_footprints/1.4bpp");
+const u32 gFieldEffectObjectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/0.4bpp");
+const u32 gFieldEffectObjectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/1.4bpp");
+const u32 gFieldEffectObjectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/2.4bpp");
+const u32 gFieldEffectObjectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/3.4bpp");
+const u32 gFieldEffectObjectPic_Unknown19_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown19_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/1.4bpp");
+const u32 gFieldEffectObjectPic_Unknown19_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/2.4bpp");
+const u32 gFieldEffectObjectPic_Unknown19_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/3.4bpp");
+const u32 gFieldEffectObjectPic_Unknown29_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_29/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown29_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_29/1.4bpp");
+const u32 gFieldEffectObjectPic_Unknown29_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_29/2.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopBigSplash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/0.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopBigSplash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/1.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopBigSplash_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/2.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopBigSplash_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/3.4bpp");
+const u32 gFieldEffectObjectPic_Splash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/splash/0.4bpp");
+const u32 gFieldEffectObjectPic_Splash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/splash/1.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopSmallSplash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_small_splash/0.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopSmallSplash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_small_splash/1.4bpp");
+const u32 gFieldEffectObjectPic_BikeHopSmallSplash_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_small_splash/2.4bpp");
+const u32 gFieldEffectObjectPic_Unknown20_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown20_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/1.4bpp");
+const u32 gFieldEffectObjectPic_Unknown20_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/2.4bpp");
+const u32 gFieldEffectObjectPic_Unknown20_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/3.4bpp");
+const u32 gFieldEffectObjectPic_Unknown20_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/4.4bpp");
+const u32 gFieldEffectObjectPic_TreeDisguise_0[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/0.4bpp");
+const u32 gFieldEffectObjectPic_TreeDisguise_1[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/1.4bpp");
+const u32 gFieldEffectObjectPic_TreeDisguise_2[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/2.4bpp");
+const u32 gFieldEffectObjectPic_TreeDisguise_3[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/3.4bpp");
+const u32 gFieldEffectObjectPic_TreeDisguise_4[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/4.4bpp");
+const u32 gFieldEffectObjectPic_TreeDisguise_5[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/5.4bpp");
+const u32 gFieldEffectObjectPic_TreeDisguise_6[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/6.4bpp");
+const u32 gFieldEffectObjectPic_MountainDisguise_0[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/0.4bpp");
+const u32 gFieldEffectObjectPic_MountainDisguise_1[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/1.4bpp");
+const u32 gFieldEffectObjectPic_MountainDisguise_2[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/2.4bpp");
+const u32 gFieldEffectObjectPic_MountainDisguise_3[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/3.4bpp");
+const u32 gFieldEffectObjectPic_MountainDisguise_4[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/4.4bpp");
+const u32 gFieldEffectObjectPic_MountainDisguise_5[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/5.4bpp");
+const u32 gFieldEffectObjectPic_MountainDisguise_6[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/6.4bpp");
+const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_0[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/0.4bpp");
+const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_1[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/1.4bpp");
+const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_2[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/2.4bpp");
+const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_3[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/3.4bpp");
+const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_4[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/4.4bpp");
+const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_5[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/5.4bpp");
+const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_6[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/6.4bpp");
+const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/event_objects/pics/effects/hot_springs_water.4bpp");
+const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_02.gbapal");
+const u32 gFieldEffectObjectPic_JumpOutOfAsh_0[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/0.4bpp");
+const u32 gFieldEffectObjectPic_JumpOutOfAsh_1[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/1.4bpp");
+const u32 gFieldEffectObjectPic_JumpOutOfAsh_2[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/2.4bpp");
+const u32 gFieldEffectObjectPic_JumpOutOfAsh_3[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/3.4bpp");
+const u32 gFieldEffectObjectPic_JumpOutOfAsh_4[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/4.4bpp");
+const u32 gFieldEffectObjectPic_Unknown33_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown33_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/1.4bpp");
+const u32 gFieldEffectObjectPic_Unknown33_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/2.4bpp");
+const u32 gFieldEffectObjectPic_Unknown33_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/3.4bpp");
+const u32 gFieldEffectObjectPic_Unknown33_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/4.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/0.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/1.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/2.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/3.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_4[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/4.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_5[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/5.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_6[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/6.4bpp");
+const u32 gFieldEffectObjectPic_Bubbles_7[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/7.4bpp");
+const u32 gFieldEffectObjectPic_Unknown35_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_35/0.4bpp");
+const u32 gFieldEffectObjectPic_Unknown35_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_35/1.4bpp");
+const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_03.gbapal");
+const u32 gFieldEffectObjectPic_Bird[] = INCBIN_U32("graphics/event_objects/pics/effects/bird.4bpp");
+const u32 gEventObjectPic_Juan_0[] = INCBIN_U32("graphics/event_objects/pics/people/juan/0.4bpp");
+const u32 gEventObjectPic_Juan_1[] = INCBIN_U32("graphics/event_objects/pics/people/juan/1.4bpp");
+const u32 gEventObjectPic_Juan_2[] = INCBIN_U32("graphics/event_objects/pics/people/juan/2.4bpp");
+const u32 gEventObjectPic_Juan_3[] = INCBIN_U32("graphics/event_objects/pics/people/juan/3.4bpp");
+const u32 gEventObjectPic_Juan_4[] = INCBIN_U32("graphics/event_objects/pics/people/juan/4.4bpp");
+const u32 gEventObjectPic_Juan_5[] = INCBIN_U32("graphics/event_objects/pics/people/juan/5.4bpp");
+const u32 gEventObjectPic_Juan_6[] = INCBIN_U32("graphics/event_objects/pics/people/juan/6.4bpp");
+const u32 gEventObjectPic_Juan_7[] = INCBIN_U32("graphics/event_objects/pics/people/juan/7.4bpp");
+const u32 gEventObjectPic_Juan_8[] = INCBIN_U32("graphics/event_objects/pics/people/juan/8.4bpp");
+const u32 gEventObjectPic_Scott_0[] = INCBIN_U32("graphics/event_objects/pics/people/scott/0.4bpp");
+const u32 gEventObjectPic_Scott_1[] = INCBIN_U32("graphics/event_objects/pics/people/scott/1.4bpp");
+const u32 gEventObjectPic_Scott_2[] = INCBIN_U32("graphics/event_objects/pics/people/scott/2.4bpp");
+const u32 gEventObjectPic_Scott_3[] = INCBIN_U32("graphics/event_objects/pics/people/scott/3.4bpp");
+const u32 gEventObjectPic_Scott_4[] = INCBIN_U32("graphics/event_objects/pics/people/scott/4.4bpp");
+const u32 gEventObjectPic_Scott_5[] = INCBIN_U32("graphics/event_objects/pics/people/scott/5.4bpp");
+const u32 gEventObjectPic_Scott_6[] = INCBIN_U32("graphics/event_objects/pics/people/scott/6.4bpp");
+const u32 gEventObjectPic_Scott_7[] = INCBIN_U32("graphics/event_objects/pics/people/scott/7.4bpp");
+const u32 gEventObjectPic_Scott_8[] = INCBIN_U32("graphics/event_objects/pics/people/scott/8.4bpp");
+const u32 gEventObjectPic_Statue[] = INCBIN_U32("graphics/event_objects/pics/misc/statue.4bpp");
+const u32 gEventObjectPic_Kirlia_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/0.4bpp");
+const u32 gEventObjectPic_Kirlia_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/1.4bpp");
+const u32 gEventObjectPic_Kirlia_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/2.4bpp");
+const u32 gEventObjectPic_Kirlia_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/3.4bpp");
+const u32 gEventObjectPic_Kirlia_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/4.4bpp");
+const u32 gEventObjectPic_Kirlia_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/5.4bpp");
+const u32 gEventObjectPic_Kirlia_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/6.4bpp");
+const u32 gEventObjectPic_Kirlia_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/7.4bpp");
+const u32 gEventObjectPic_Kirlia_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/8.4bpp");
+const u32 gEventObjectPic_Dusclops_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/0.4bpp");
+const u32 gEventObjectPic_Dusclops_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/1.4bpp");
+const u32 gEventObjectPic_Dusclops_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/2.4bpp");
+const u32 gEventObjectPic_Dusclops_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/3.4bpp");
+const u32 gEventObjectPic_Dusclops_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/4.4bpp");
+const u32 gEventObjectPic_Dusclops_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/5.4bpp");
+const u32 gEventObjectPic_Dusclops_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/6.4bpp");
+const u32 gEventObjectPic_Dusclops_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/7.4bpp");
+const u32 gEventObjectPic_Dusclops_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/8.4bpp");
+const u32 gEventObjectPic_MysteryEventDeliveryman_0[] = INCBIN_U32("graphics/event_objects/pics/people/mystery_event_deliveryman/0.4bpp");
+const u32 gEventObjectPic_MysteryEventDeliveryman_1[] = INCBIN_U32("graphics/event_objects/pics/people/mystery_event_deliveryman/1.4bpp");
+const u32 gEventObjectPic_MysteryEventDeliveryman_2[] = INCBIN_U32("graphics/event_objects/pics/people/mystery_event_deliveryman/2.4bpp");
+const u32 gEventObjectPic_UnionRoomAttendant_0[] = INCBIN_U32("graphics/event_objects/pics/people/union_room_attendant/0.4bpp");
+const u32 gEventObjectPic_UnionRoomAttendant_1[] = INCBIN_U32("graphics/event_objects/pics/people/union_room_attendant/1.4bpp");
+const u32 gEventObjectPic_UnionRoomAttendant_2[] = INCBIN_U32("graphics/event_objects/pics/people/union_room_attendant/2.4bpp");
+const u32 gEventObjectPic_MovingBox[] = INCBIN_U32("graphics/event_objects/pics/misc/moving_box.4bpp");
+const u16 gEventObjectPalette19[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_19.gbapal");
+const u32 gEventObjectPic_Sudowoodo_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/sudowoodo/0.4bpp");
+const u32 gEventObjectPic_Sudowoodo_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/sudowoodo/1.4bpp");
+const u32 gEventObjectPic_Sudowoodo_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/sudowoodo/2.4bpp");
+const u32 gEventObjectPic_Mew_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/0.4bpp");
+const u32 gEventObjectPic_Mew_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/1.4bpp");
+const u32 gEventObjectPic_Mew_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/2.4bpp");
+const u32 gEventObjectPic_Mew_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/3.4bpp");
+const u32 gEventObjectPic_Mew_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/4.4bpp");
+const u32 gEventObjectPic_Mew_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/5.4bpp");
+const u32 gEventObjectPic_Mew_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/6.4bpp");
+const u32 gEventObjectPic_Mew_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/7.4bpp");
+const u32 gEventObjectPic_Mew_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/8.4bpp");
+const u16 gEventObjectPalette28[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_28.gbapal");
+const u32 gEventObjectPic_Red_0[] = INCBIN_U32("graphics/event_objects/pics/people/red/0.4bpp");
+const u32 gEventObjectPic_Red_1[] = INCBIN_U32("graphics/event_objects/pics/people/red/1.4bpp");
+const u32 gEventObjectPic_Red_2[] = INCBIN_U32("graphics/event_objects/pics/people/red/2.4bpp");
+const u32 gEventObjectPic_Red_3[] = INCBIN_U32("graphics/event_objects/pics/people/red/3.4bpp");
+const u32 gEventObjectPic_Red_4[] = INCBIN_U32("graphics/event_objects/pics/people/red/4.4bpp");
+const u32 gEventObjectPic_Red_5[] = INCBIN_U32("graphics/event_objects/pics/people/red/5.4bpp");
+const u32 gEventObjectPic_Red_6[] = INCBIN_U32("graphics/event_objects/pics/people/red/6.4bpp");
+const u32 gEventObjectPic_Red_7[] = INCBIN_U32("graphics/event_objects/pics/people/red/7.4bpp");
+const u32 gEventObjectPic_Red_8[] = INCBIN_U32("graphics/event_objects/pics/people/red/8.4bpp");
+const u32 gEventObjectPic_Leaf_0[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/0.4bpp");
+const u32 gEventObjectPic_Leaf_1[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/1.4bpp");
+const u32 gEventObjectPic_Leaf_2[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/2.4bpp");
+const u32 gEventObjectPic_Leaf_3[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/3.4bpp");
+const u32 gEventObjectPic_Leaf_4[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/4.4bpp");
+const u32 gEventObjectPic_Leaf_5[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/5.4bpp");
+const u32 gEventObjectPic_Leaf_6[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/6.4bpp");
+const u32 gEventObjectPic_Leaf_7[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/7.4bpp");
+const u32 gEventObjectPic_Leaf_8[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/8.4bpp");
+const u16 gEventObjectPalette30[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_30.gbapal");
+const u32 gEventObjectPic_BirthIslandStone[] = INCBIN_U32("graphics/event_objects/pics/misc/birth_island_stone.4bpp");
+const u16 gEventObjectPalette29[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_29.gbapal");
+const u32 gEventObjectPic_Deoxys_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/deoxys/0.4bpp");
+const u32 gEventObjectPic_Deoxys_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/deoxys/1.4bpp");
+const u32 gEventObjectPic_Anabel_0[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/0.4bpp");
+const u32 gEventObjectPic_Anabel_1[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/1.4bpp");
+const u32 gEventObjectPic_Anabel_2[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/2.4bpp");
+const u32 gEventObjectPic_Anabel_3[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/3.4bpp");
+const u32 gEventObjectPic_Anabel_4[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/4.4bpp");
+const u32 gEventObjectPic_Anabel_5[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/5.4bpp");
+const u32 gEventObjectPic_Anabel_6[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/6.4bpp");
+const u32 gEventObjectPic_Anabel_7[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/7.4bpp");
+const u32 gEventObjectPic_Anabel_8[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/8.4bpp");
+const u32 gEventObjectPic_Tucker_0[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/0.4bpp");
+const u32 gEventObjectPic_Tucker_1[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/1.4bpp");
+const u32 gEventObjectPic_Tucker_2[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/2.4bpp");
+const u32 gEventObjectPic_Tucker_3[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/3.4bpp");
+const u32 gEventObjectPic_Tucker_4[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/4.4bpp");
+const u32 gEventObjectPic_Tucker_5[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/5.4bpp");
+const u32 gEventObjectPic_Tucker_6[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/6.4bpp");
+const u32 gEventObjectPic_Tucker_7[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/7.4bpp");
+const u32 gEventObjectPic_Tucker_8[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/8.4bpp");
+const u32 gEventObjectPic_Spenser_0[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/0.4bpp");
+const u32 gEventObjectPic_Spenser_1[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/1.4bpp");
+const u32 gEventObjectPic_Spenser_2[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/2.4bpp");
+const u32 gEventObjectPic_Spenser_3[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/3.4bpp");
+const u32 gEventObjectPic_Spenser_4[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/4.4bpp");
+const u32 gEventObjectPic_Spenser_5[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/5.4bpp");
+const u32 gEventObjectPic_Spenser_6[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/6.4bpp");
+const u32 gEventObjectPic_Spenser_7[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/7.4bpp");
+const u32 gEventObjectPic_Spenser_8[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/8.4bpp");
+const u32 gEventObjectPic_Greta_0[] = INCBIN_U32("graphics/event_objects/pics/people/greta/0.4bpp");
+const u32 gEventObjectPic_Greta_1[] = INCBIN_U32("graphics/event_objects/pics/people/greta/1.4bpp");
+const u32 gEventObjectPic_Greta_2[] = INCBIN_U32("graphics/event_objects/pics/people/greta/2.4bpp");
+const u32 gEventObjectPic_Greta_3[] = INCBIN_U32("graphics/event_objects/pics/people/greta/3.4bpp");
+const u32 gEventObjectPic_Greta_4[] = INCBIN_U32("graphics/event_objects/pics/people/greta/4.4bpp");
+const u32 gEventObjectPic_Greta_5[] = INCBIN_U32("graphics/event_objects/pics/people/greta/5.4bpp");
+const u32 gEventObjectPic_Greta_6[] = INCBIN_U32("graphics/event_objects/pics/people/greta/6.4bpp");
+const u32 gEventObjectPic_Greta_7[] = INCBIN_U32("graphics/event_objects/pics/people/greta/7.4bpp");
+const u32 gEventObjectPic_Greta_8[] = INCBIN_U32("graphics/event_objects/pics/people/greta/8.4bpp");
+const u32 gEventObjectPic_Noland_0[] = INCBIN_U32("graphics/event_objects/pics/people/noland/0.4bpp");
+const u32 gEventObjectPic_Noland_1[] = INCBIN_U32("graphics/event_objects/pics/people/noland/1.4bpp");
+const u32 gEventObjectPic_Noland_2[] = INCBIN_U32("graphics/event_objects/pics/people/noland/2.4bpp");
+const u32 gEventObjectPic_Noland_3[] = INCBIN_U32("graphics/event_objects/pics/people/noland/3.4bpp");
+const u32 gEventObjectPic_Noland_4[] = INCBIN_U32("graphics/event_objects/pics/people/noland/4.4bpp");
+const u32 gEventObjectPic_Noland_5[] = INCBIN_U32("graphics/event_objects/pics/people/noland/5.4bpp");
+const u32 gEventObjectPic_Noland_6[] = INCBIN_U32("graphics/event_objects/pics/people/noland/6.4bpp");
+const u32 gEventObjectPic_Noland_7[] = INCBIN_U32("graphics/event_objects/pics/people/noland/7.4bpp");
+const u32 gEventObjectPic_Noland_8[] = INCBIN_U32("graphics/event_objects/pics/people/noland/8.4bpp");
+const u32 gEventObjectPic_Lucy_0[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/0.4bpp");
+const u32 gEventObjectPic_Lucy_1[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/1.4bpp");
+const u32 gEventObjectPic_Lucy_2[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/2.4bpp");
+const u32 gEventObjectPic_Lucy_3[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/3.4bpp");
+const u32 gEventObjectPic_Lucy_4[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/4.4bpp");
+const u32 gEventObjectPic_Lucy_5[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/5.4bpp");
+const u32 gEventObjectPic_Lucy_6[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/6.4bpp");
+const u32 gEventObjectPic_Lucy_7[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/7.4bpp");
+const u32 gEventObjectPic_Lucy_8[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/8.4bpp");
+const u32 gEventObjectPic_Brandon_0[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/0.4bpp");
+const u32 gEventObjectPic_Brandon_1[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/1.4bpp");
+const u32 gEventObjectPic_Brandon_2[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/2.4bpp");
+const u32 gEventObjectPic_Brandon_3[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/3.4bpp");
+const u32 gEventObjectPic_Brandon_4[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/4.4bpp");
+const u32 gEventObjectPic_Brandon_5[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/5.4bpp");
+const u32 gEventObjectPic_Brandon_6[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/6.4bpp");
+const u32 gEventObjectPic_Brandon_7[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/7.4bpp");
+const u32 gEventObjectPic_Brandon_8[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/8.4bpp");
+const u32 gEventObjectPic_Lugia_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/lugia/0.4bpp");
+const u32 gEventObjectPic_Lugia_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/lugia/1.4bpp");
+const u16 gEventObjectPalette32[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_32.gbapal");
+const u32 gEventObjectPic_HoOh_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/ho_oh/0.4bpp");
+const u32 gEventObjectPic_HoOh_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/ho_oh/1.4bpp");
+const u16 gEventObjectPalette31[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_31.gbapal");
+
+#endif //GUARD_EVENT_OBJECT_GFX_H
diff --git a/src/data/field_event_obj/event_object_graphics_info.h b/src/data/field_event_obj/event_object_graphics_info.h
new file mode 100755
index 000000000..14ef4983d
--- /dev/null
+++ b/src/data/field_event_obj/event_object_graphics_info.h
@@ -0,0 +1,250 @@
+#ifndef GUARD_EVENT_OBJECT_GRAPHICS_INFO_H
+#define GUARD_EVENT_OBJECT_GRAPHICS_INFO_H
+
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanNormal = {0xFFFF, 0x1100, 0x1102, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanMachBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanMachBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanAcroBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanSurfing = {0xFFFF, 0x1100, 0x11FF, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_BrendanSurfing, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFieldMove = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_QuintyPlump = {0xFFFF, 0x110B, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_L, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_QuintyPlump, gEventObjectPicTable_QuintyPlump, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy1 = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleBoy1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl1 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleGirl1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl1 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Girl1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy2 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl2 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Girl2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy2 = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleBoy2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl2 = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleGirl2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy3 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy3, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl3 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Girl3, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy4 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy4, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman1 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FatMan = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_FatMan, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman2 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman3 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman3, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan1 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldMan1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman1 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldWoman1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man2 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman4 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman4, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man3 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man3, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman5 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman5, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cook = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Cook, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman6 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman6, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan2 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldMan2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman2 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldWoman2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Camper = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Camper, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Picnicker = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Picnicker, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man4 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man4, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman7 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman7, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Youngster = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Youngster, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BugCatcher = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BugCatcher, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PsychicM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_PsychicM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SchoolKidM = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SchoolKidM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maniac = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Maniac, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HexManiac = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_HexManiac, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza1 = {0xFFFF, 0x1105, 0x11FF, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_64x64, gEventObjectSpriteOamTables_64x64, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RayquazaStill, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerM = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SwimmerM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerF = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SwimmerF, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BlackBelt = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BlackBelt, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Beauty = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Beauty, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Scientist1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lass = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Lass, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Gentleman = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Gentleman, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sailor = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Sailor, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fisherman = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Fisherman, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RunningTriathleteM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteF = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RunningTriathleteF, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberF = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_TuberF, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberM = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_TuberM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hiker = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Hiker, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteM = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_CyclingTriathleteM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteF = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_CyclingTriathleteF, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Nurse = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Nurse, gEventObjectPicTable_Nurse, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ItemBall = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ItemBall, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTree = {0xFFFF, 0x1103, 0x11FF, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, NULL, gEventObjectImageAnimTable_BerryTree, gEventObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeEarlyStages = {0xFFFF, 0x1103, 0x11FF, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_BerryTree, gEventObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeLateStages = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BerryTree, gEventObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ProfBirch = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ProfBirch, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man5 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man5, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man6 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man6, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ReporterM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterF = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ReporterF, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Bard = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hipster = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Trader = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Storyteller = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Giddy = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan2 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedNatuDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedNatuDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMagnemiteDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedMagnemiteDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedSquirtleDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedSquirtleDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedWooperDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedWooperDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPikachuDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedPikachuDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPorygon2Doll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedPorygon2Doll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CuttableTree = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_CuttableTree, gEventObjectPicTable_CuttableTree, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MartEmployee = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MartEmployee, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RooftopSaleWoman = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RooftopSaleWoman, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Teala = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Teala, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BreakableRock = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_BreakableRock, gEventObjectPicTable_BreakableRock, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PushableBoulder = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PushableBoulder, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MrBrineysBoat = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MrBrineysBoat, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayNormal = {0xFFFF, 0x1110, 0x1102, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_MayNormal, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayMachBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayMachBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayAcroBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_MayAcroBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MaySurfing = {0xFFFF, 0x1110, 0x11FF, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_MaySurfing, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFieldMove = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_MayFieldMove, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Truck = {0xFFFF, 0x110D, 0x11FF, 1152, 48, 48, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_Truck, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_Truck, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothCarryingBox = {0xFFFF, 0x110E, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_VigorothCarryingBox, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothFacingAway = {0xFFFF, 0x110E, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_VigorothFacingAway, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirchsBag = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BirchsBag, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_EnemyZigzagoon = {0xFFFF, 0x110F, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_EnemyZigzagoon, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Poochyena = {0xFFFF, 0x111C, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Poochyena, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Artist = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Artist, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanNormal = {0xFFFF, 0x1100, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanMachBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanMachBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanAcroBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanSurfing = {0xFFFF, 0x1100, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_BrendanSurfing, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanFieldMove = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayNormal = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_MayNormal, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayMachBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayMachBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayAcroBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_MayAcroBike, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMaySurfing = {0xFFFF, 0x1110, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_MaySurfing, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayFieldMove = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_MayFieldMove, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cameraman = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Cameraman, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanUnderwater = {0xFFFF, 0x1115, 0x11FF, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanUnderwater, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayUnderwater = {0xFFFF, 0x1115, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayUnderwater, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MovingBox = {0xFFFF, 0x1112, 0x11FF, 128, 16, 16, 10, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MovingBox, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CableCar = {0xFFFF, 0x1113, 0x11FF, 2048, 64, 64, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_64x64, gEventObjectSpriteOamTables_64x64, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_CableCar, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist2 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Scientist2, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man7 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man7, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_AquaMemberM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberF = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_AquaMemberF, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberM = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MagmaMemberM, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberF = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MagmaMemberF, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sidney = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Sidney, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Phoebe = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Phoebe, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Glacia = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Glacia, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Drake = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Drake, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Roxanne = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Roxanne, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brawly = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Brawly, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wattson = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wattson, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Flannery = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Flannery, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Norman = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Norman, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Winona = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Winona, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Liza = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Liza, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tate = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Tate, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wallace = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wallace, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Steven = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Steven, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wally = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wally, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireLittleBoy = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RubySapphireLittleBoy, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFishing = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Fishing, gEventObjectPicTable_BrendanFishing, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFishing = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Fishing, gEventObjectPicTable_MayFishing, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HotSpringsOldWoman = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_HotSpringsOldWoman, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SSTidal = {0xFFFF, 0x1114, 0x11FF, 1920, 96, 40, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_8x8, gEventObjectSpriteOamTables_SSTidal, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SSTidal, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SubmarineShadow = {0xFFFF, 0x111B, 0x11FF, 1408, 88, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_8x8, gEventObjectSpriteOamTables_SubmarineShadow, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SubmarineShadow, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PichuDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PichuDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikachuDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PikachuDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MarillDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MarillDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TogepiDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TogepiDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyndaquilDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_CyndaquilDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ChikoritaDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ChikoritaDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TotodileDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TotodileDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_JigglypuffDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_JigglypuffDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MeowthDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MeowthDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ClefairyDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ClefairyDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DittoDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_DittoDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SmoochumDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SmoochumDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TreeckoDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TreeckoDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TorchicDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TorchicDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MudkipDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MudkipDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DuskullDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_DuskullDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WynautDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_WynautDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BaltoyDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BaltoyDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KecleonDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_KecleonDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AzurillDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_AzurillDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SkittyDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SkittyDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwabluDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SwabluDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GulpinDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_GulpinDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LotadDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_LotadDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SeedotDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SeedotDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikaCushion = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PikaCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RoundCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_RoundCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KissCushion = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_KissCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ZigzagCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ZigzagCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SpinCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SpinCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DiamondCushion = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_DiamondCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BallCushion = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BallCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GrassCushion = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_GrassCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FireCushion = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_FireCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WaterCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_WaterCushion, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigSnorlaxDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigSnorlaxDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRhydonDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRhydonDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigLaprasDoll = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigLaprasDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigVenusaurDoll = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigVenusaurDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigCharizardDoll = {0xFFFF, 0x1104, 0x11FF, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigCharizardDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigBlastoiseDoll = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigBlastoiseDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigWailmerDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigWailmerDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegirockDoll = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRegirockDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegiceDoll = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRegiceDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegisteelDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRegisteelDoll, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latias = {0xFFFF, 0x1104, 0x11FF, 512, 32, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LatiasLatios, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latios = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LatiasLatios, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy5 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy5, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ContestOldMan = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ContestOldMan, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanWatering = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanWatering, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayWatering = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayWatering, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanDecorating = {0xFFFF, 0x1100, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BrendanDecorating, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayDecorating = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MayDecorating, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Archie = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Archie, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maxie = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Maxie, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre1 = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_KyogreFront, gEventObjectRotScalAnimTable_KyogreGroudon};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon1 = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_GroudonFront, gEventObjectRotScalAnimTable_KyogreGroudon};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre3 = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_KyogreSide, gEventObjectRotScalAnimTable_KyogreGroudon};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon3 = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Groudon3, gEventObjectPicTable_GroudonSide, gEventObjectRotScalAnimTable_KyogreGroudon};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fossil = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_Fossil, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regirock = {0xFFFF, 0x1104, 0x11FF, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Regi, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regice = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Regi, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Registeel = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Regi, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Skitty = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Skitty, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon1 = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Kecleon, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre2 = {0xFFFF, 0x1116, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_KyogreFront, gEventObjectRotScalAnimTable_KyogreGroudon};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon2 = {0xFFFF, 0x1118, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_GroudonFront, gEventObjectRotScalAnimTable_KyogreGroudon};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza2 = {0xFFFF, 0x1105, 0x11FF, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_64x64, gEventObjectSpriteOamTables_64x64, gEventObjectImageAnimTable_Rayquaza2, gEventObjectPicTable_Rayquaza, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Zigzagoon = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Zigzagoon, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Pikachu = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Pikachu, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azumarill = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Azumarill, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wingull = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wingull, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon2 = {0xFFFF, 0x1105, 0x1102, 128, 16, 16, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Kecleon, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberMSwimming = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_TuberMSwimming, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azurill = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Azurill, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mom = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Mom, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkBrendan = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkMay = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_MayNormal, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Juan = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Juan, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scott = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Scott, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MysteryEventDeliveryman = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MysteryEventDeliveryman, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Statue = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_Statue, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kirlia = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_S, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Kirlia, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Dusclops = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Dusclops, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnionRoomAttendant = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_UnionRoomAttendant, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Red = {0xFFFF, 0x111D, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Red, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Leaf = {0xFFFF, 0x111D, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Leaf, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sudowoodo = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Sudowoodo, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mew = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Mew, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Deoxys = {0xFFFF, 0x111E, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Deoxys, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirthIslandStone = {0xFFFF, 0x111F, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BirthIslandStone, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Anabel = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Anabel, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tucker = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Tucker, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Greta = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Greta, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Spenser = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Spenser, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Noland = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Noland, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lucy = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Lucy, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brandon = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Brandon, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireBrendan = {0xFFFF, 0x1122, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RubySapphireBrendan, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireMay = {0xFFFF, 0x1123, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RubySapphireMay, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lugia = {0xFFFF, 0x1121, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Lugia, gDummySpriteAffineAnimTable};
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HoOh = {0xFFFF, 0x1120, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_HoOh, gEventObjectPicTable_HoOh, gDummySpriteAffineAnimTable};
+
+#endif //GUARD_EVENT_OBJECT_GRAPHICS_INFO_H
diff --git a/src/data/field_event_obj/event_object_graphics_info_pointers.h b/src/data/field_event_obj/event_object_graphics_info_pointers.h
new file mode 100755
index 000000000..c0ca57b60
--- /dev/null
+++ b/src/data/field_event_obj/event_object_graphics_info_pointers.h
@@ -0,0 +1,504 @@
+#ifndef GUARD_EVENT_OBJECT_GRAPHICS_INFO_POINTERS_H
+#define GUARD_EVENT_OBJECT_GRAPHICS_INFO_POINTERS_H
+
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanNormal;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanMachBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanSurfing;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFieldMove;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_QuintyPlump;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy3;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl3;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy4;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FatMan;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman3;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman4;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man3;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman5;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cook;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman6;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Camper;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Picnicker;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man4;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman7;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Youngster;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BugCatcher;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PsychicM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SchoolKidM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maniac;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HexManiac;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerF;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BlackBelt;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Beauty;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lass;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Gentleman;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sailor;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fisherman;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteF;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberF;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hiker;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteF;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Nurse;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ItemBall;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTree;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeEarlyStages;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeLateStages;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanAcroBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ProfBirch;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man5;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man6;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterF;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Bard;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Anabel;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tucker;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Greta;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Spenser;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Noland;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lucy;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedNatuDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMagnemiteDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedSquirtleDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedWooperDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPikachuDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPorygon2Doll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CuttableTree;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MartEmployee;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RooftopSaleWoman;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Teala;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BreakableRock;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PushableBoulder;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MrBrineysBoat;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayNormal;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayMachBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayAcroBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MaySurfing;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFieldMove;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Truck;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothCarryingBox;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothFacingAway;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirchsBag;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_EnemyZigzagoon;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Artist;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanNormal;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanMachBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanAcroBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanSurfing;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanFieldMove;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayNormal;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayMachBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayAcroBike;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMaySurfing;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayFieldMove;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cameraman;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanUnderwater;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayUnderwater;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MovingBox;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CableCar;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man7;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberF;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberM;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberF;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sidney;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Phoebe;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Glacia;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Drake;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Roxanne;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brawly;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wattson;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Flannery;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Norman;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Winona;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Liza;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tate;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wallace;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Steven;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wally;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireLittleBoy;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFishing;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFishing;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HotSpringsOldWoman;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SSTidal;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SubmarineShadow;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PichuDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikachuDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MarillDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TogepiDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyndaquilDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ChikoritaDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TotodileDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_JigglypuffDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MeowthDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ClefairyDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DittoDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SmoochumDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TreeckoDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TorchicDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MudkipDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DuskullDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WynautDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BaltoyDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KecleonDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AzurillDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SkittyDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwabluDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GulpinDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LotadDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SeedotDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikaCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RoundCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KissCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ZigzagCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SpinCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DiamondCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BallCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GrassCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FireCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WaterCushion;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigSnorlaxDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRhydonDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigLaprasDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigVenusaurDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigCharizardDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigBlastoiseDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigWailmerDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegirockDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegiceDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegisteelDoll;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latias;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latios;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy5;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ContestOldMan;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanWatering;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayWatering;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanDecorating;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayDecorating;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Archie;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maxie;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fossil;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regirock;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regice;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Registeel;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Skitty;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Zigzagoon;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Pikachu;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azumarill;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wingull;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon2;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberMSwimming;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azurill;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mom;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkBrendan;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkMay;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Juan;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scott;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Poochyena;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre3;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon3;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MysteryEventDeliveryman;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Statue;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kirlia;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Dusclops;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnionRoomAttendant;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sudowoodo;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mew;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Red;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Leaf;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Deoxys;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirthIslandStone;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brandon;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireBrendan;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireMay;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lugia;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HoOh;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Bard;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hipster;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Trader;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Storyteller;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Giddy;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan1;
+const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan2;
+
+
+const struct EventObjectGraphicsInfo *const gEventObjectGraphicsInfoPointers[] = {
+ &gEventObjectGraphicsInfo_BrendanNormal,
+ &gEventObjectGraphicsInfo_BrendanMachBike,
+ &gEventObjectGraphicsInfo_BrendanSurfing,
+ &gEventObjectGraphicsInfo_BrendanFieldMove,
+ &gEventObjectGraphicsInfo_QuintyPlump,
+ &gEventObjectGraphicsInfo_LittleBoy1,
+ &gEventObjectGraphicsInfo_LittleGirl1,
+ &gEventObjectGraphicsInfo_Boy1,
+ &gEventObjectGraphicsInfo_Girl1,
+ &gEventObjectGraphicsInfo_Boy2,
+ &gEventObjectGraphicsInfo_Girl2,
+ &gEventObjectGraphicsInfo_LittleBoy2,
+ &gEventObjectGraphicsInfo_LittleGirl2,
+ &gEventObjectGraphicsInfo_Boy3,
+ &gEventObjectGraphicsInfo_Girl3,
+ &gEventObjectGraphicsInfo_Boy4,
+ &gEventObjectGraphicsInfo_Woman1,
+ &gEventObjectGraphicsInfo_FatMan,
+ &gEventObjectGraphicsInfo_Woman2,
+ &gEventObjectGraphicsInfo_Man1,
+ &gEventObjectGraphicsInfo_Woman3,
+ &gEventObjectGraphicsInfo_OldMan1,
+ &gEventObjectGraphicsInfo_OldWoman1,
+ &gEventObjectGraphicsInfo_Man2,
+ &gEventObjectGraphicsInfo_Woman4,
+ &gEventObjectGraphicsInfo_Man3,
+ &gEventObjectGraphicsInfo_Woman5,
+ &gEventObjectGraphicsInfo_Cook,
+ &gEventObjectGraphicsInfo_Woman6,
+ &gEventObjectGraphicsInfo_OldMan2,
+ &gEventObjectGraphicsInfo_OldWoman2,
+ &gEventObjectGraphicsInfo_Camper,
+ &gEventObjectGraphicsInfo_Picnicker,
+ &gEventObjectGraphicsInfo_Man4,
+ &gEventObjectGraphicsInfo_Woman7,
+ &gEventObjectGraphicsInfo_Youngster,
+ &gEventObjectGraphicsInfo_BugCatcher,
+ &gEventObjectGraphicsInfo_PsychicM,
+ &gEventObjectGraphicsInfo_SchoolKidM,
+ &gEventObjectGraphicsInfo_Maniac,
+ &gEventObjectGraphicsInfo_HexManiac,
+ &gEventObjectGraphicsInfo_Rayquaza1,
+ &gEventObjectGraphicsInfo_SwimmerM,
+ &gEventObjectGraphicsInfo_SwimmerF,
+ &gEventObjectGraphicsInfo_BlackBelt,
+ &gEventObjectGraphicsInfo_Beauty,
+ &gEventObjectGraphicsInfo_Scientist1,
+ &gEventObjectGraphicsInfo_Lass,
+ &gEventObjectGraphicsInfo_Gentleman,
+ &gEventObjectGraphicsInfo_Sailor,
+ &gEventObjectGraphicsInfo_Fisherman,
+ &gEventObjectGraphicsInfo_RunningTriathleteM,
+ &gEventObjectGraphicsInfo_RunningTriathleteF,
+ &gEventObjectGraphicsInfo_TuberF,
+ &gEventObjectGraphicsInfo_TuberM,
+ &gEventObjectGraphicsInfo_Hiker,
+ &gEventObjectGraphicsInfo_CyclingTriathleteM,
+ &gEventObjectGraphicsInfo_CyclingTriathleteF,
+ &gEventObjectGraphicsInfo_Nurse,
+ &gEventObjectGraphicsInfo_ItemBall,
+ &gEventObjectGraphicsInfo_BerryTree,
+ &gEventObjectGraphicsInfo_BerryTreeEarlyStages,
+ &gEventObjectGraphicsInfo_BerryTreeLateStages,
+ &gEventObjectGraphicsInfo_BrendanAcroBike,
+ &gEventObjectGraphicsInfo_ProfBirch,
+ &gEventObjectGraphicsInfo_Man5,
+ &gEventObjectGraphicsInfo_Man6,
+ &gEventObjectGraphicsInfo_ReporterM,
+ &gEventObjectGraphicsInfo_ReporterF,
+ &gEventObjectGraphicsInfo_Bard,
+ &gEventObjectGraphicsInfo_Anabel,
+ &gEventObjectGraphicsInfo_Tucker,
+ &gEventObjectGraphicsInfo_Greta,
+ &gEventObjectGraphicsInfo_Spenser,
+ &gEventObjectGraphicsInfo_Noland,
+ &gEventObjectGraphicsInfo_Lucy,
+ &gEventObjectGraphicsInfo_UnusedNatuDoll,
+ &gEventObjectGraphicsInfo_UnusedMagnemiteDoll,
+ &gEventObjectGraphicsInfo_UnusedSquirtleDoll,
+ &gEventObjectGraphicsInfo_UnusedWooperDoll,
+ &gEventObjectGraphicsInfo_UnusedPikachuDoll,
+ &gEventObjectGraphicsInfo_UnusedPorygon2Doll,
+ &gEventObjectGraphicsInfo_CuttableTree,
+ &gEventObjectGraphicsInfo_MartEmployee,
+ &gEventObjectGraphicsInfo_RooftopSaleWoman,
+ &gEventObjectGraphicsInfo_Teala,
+ &gEventObjectGraphicsInfo_BreakableRock,
+ &gEventObjectGraphicsInfo_PushableBoulder,
+ &gEventObjectGraphicsInfo_MrBrineysBoat,
+ &gEventObjectGraphicsInfo_MayNormal,
+ &gEventObjectGraphicsInfo_MayMachBike,
+ &gEventObjectGraphicsInfo_MayAcroBike,
+ &gEventObjectGraphicsInfo_MaySurfing,
+ &gEventObjectGraphicsInfo_MayFieldMove,
+ &gEventObjectGraphicsInfo_Truck,
+ &gEventObjectGraphicsInfo_VigorothCarryingBox,
+ &gEventObjectGraphicsInfo_VigorothFacingAway,
+ &gEventObjectGraphicsInfo_BirchsBag,
+ &gEventObjectGraphicsInfo_EnemyZigzagoon,
+ &gEventObjectGraphicsInfo_Artist,
+ &gEventObjectGraphicsInfo_RivalBrendanNormal,
+ &gEventObjectGraphicsInfo_RivalBrendanMachBike,
+ &gEventObjectGraphicsInfo_RivalBrendanAcroBike,
+ &gEventObjectGraphicsInfo_RivalBrendanSurfing,
+ &gEventObjectGraphicsInfo_RivalBrendanFieldMove,
+ &gEventObjectGraphicsInfo_RivalMayNormal,
+ &gEventObjectGraphicsInfo_RivalMayMachBike,
+ &gEventObjectGraphicsInfo_RivalMayAcroBike,
+ &gEventObjectGraphicsInfo_RivalMaySurfing,
+ &gEventObjectGraphicsInfo_RivalMayFieldMove,
+ &gEventObjectGraphicsInfo_Cameraman,
+ &gEventObjectGraphicsInfo_BrendanUnderwater,
+ &gEventObjectGraphicsInfo_MayUnderwater,
+ &gEventObjectGraphicsInfo_MovingBox,
+ &gEventObjectGraphicsInfo_CableCar,
+ &gEventObjectGraphicsInfo_Scientist2,
+ &gEventObjectGraphicsInfo_Man7,
+ &gEventObjectGraphicsInfo_AquaMemberM,
+ &gEventObjectGraphicsInfo_AquaMemberF,
+ &gEventObjectGraphicsInfo_MagmaMemberM,
+ &gEventObjectGraphicsInfo_MagmaMemberF,
+ &gEventObjectGraphicsInfo_Sidney,
+ &gEventObjectGraphicsInfo_Phoebe,
+ &gEventObjectGraphicsInfo_Glacia,
+ &gEventObjectGraphicsInfo_Drake,
+ &gEventObjectGraphicsInfo_Roxanne,
+ &gEventObjectGraphicsInfo_Brawly,
+ &gEventObjectGraphicsInfo_Wattson,
+ &gEventObjectGraphicsInfo_Flannery,
+ &gEventObjectGraphicsInfo_Norman,
+ &gEventObjectGraphicsInfo_Winona,
+ &gEventObjectGraphicsInfo_Liza,
+ &gEventObjectGraphicsInfo_Tate,
+ &gEventObjectGraphicsInfo_Wallace,
+ &gEventObjectGraphicsInfo_Steven,
+ &gEventObjectGraphicsInfo_Wally,
+ &gEventObjectGraphicsInfo_RubySapphireLittleBoy,
+ &gEventObjectGraphicsInfo_BrendanFishing,
+ &gEventObjectGraphicsInfo_MayFishing,
+ &gEventObjectGraphicsInfo_HotSpringsOldWoman,
+ &gEventObjectGraphicsInfo_SSTidal,
+ &gEventObjectGraphicsInfo_SubmarineShadow,
+ &gEventObjectGraphicsInfo_PichuDoll,
+ &gEventObjectGraphicsInfo_PikachuDoll,
+ &gEventObjectGraphicsInfo_MarillDoll,
+ &gEventObjectGraphicsInfo_TogepiDoll,
+ &gEventObjectGraphicsInfo_CyndaquilDoll,
+ &gEventObjectGraphicsInfo_ChikoritaDoll,
+ &gEventObjectGraphicsInfo_TotodileDoll,
+ &gEventObjectGraphicsInfo_JigglypuffDoll,
+ &gEventObjectGraphicsInfo_MeowthDoll,
+ &gEventObjectGraphicsInfo_ClefairyDoll,
+ &gEventObjectGraphicsInfo_DittoDoll,
+ &gEventObjectGraphicsInfo_SmoochumDoll,
+ &gEventObjectGraphicsInfo_TreeckoDoll,
+ &gEventObjectGraphicsInfo_TorchicDoll,
+ &gEventObjectGraphicsInfo_MudkipDoll,
+ &gEventObjectGraphicsInfo_DuskullDoll,
+ &gEventObjectGraphicsInfo_WynautDoll,
+ &gEventObjectGraphicsInfo_BaltoyDoll,
+ &gEventObjectGraphicsInfo_KecleonDoll,
+ &gEventObjectGraphicsInfo_AzurillDoll,
+ &gEventObjectGraphicsInfo_SkittyDoll,
+ &gEventObjectGraphicsInfo_SwabluDoll,
+ &gEventObjectGraphicsInfo_GulpinDoll,
+ &gEventObjectGraphicsInfo_LotadDoll,
+ &gEventObjectGraphicsInfo_SeedotDoll,
+ &gEventObjectGraphicsInfo_PikaCushion,
+ &gEventObjectGraphicsInfo_RoundCushion,
+ &gEventObjectGraphicsInfo_KissCushion,
+ &gEventObjectGraphicsInfo_ZigzagCushion,
+ &gEventObjectGraphicsInfo_SpinCushion,
+ &gEventObjectGraphicsInfo_DiamondCushion,
+ &gEventObjectGraphicsInfo_BallCushion,
+ &gEventObjectGraphicsInfo_GrassCushion,
+ &gEventObjectGraphicsInfo_FireCushion,
+ &gEventObjectGraphicsInfo_WaterCushion,
+ &gEventObjectGraphicsInfo_BigSnorlaxDoll,
+ &gEventObjectGraphicsInfo_BigRhydonDoll,
+ &gEventObjectGraphicsInfo_BigLaprasDoll,
+ &gEventObjectGraphicsInfo_BigVenusaurDoll,
+ &gEventObjectGraphicsInfo_BigCharizardDoll,
+ &gEventObjectGraphicsInfo_BigBlastoiseDoll,
+ &gEventObjectGraphicsInfo_BigWailmerDoll,
+ &gEventObjectGraphicsInfo_BigRegirockDoll,
+ &gEventObjectGraphicsInfo_BigRegiceDoll,
+ &gEventObjectGraphicsInfo_BigRegisteelDoll,
+ &gEventObjectGraphicsInfo_Latias,
+ &gEventObjectGraphicsInfo_Latios,
+ &gEventObjectGraphicsInfo_Boy5,
+ &gEventObjectGraphicsInfo_ContestOldMan,
+ &gEventObjectGraphicsInfo_BrendanWatering,
+ &gEventObjectGraphicsInfo_MayWatering,
+ &gEventObjectGraphicsInfo_BrendanDecorating,
+ &gEventObjectGraphicsInfo_MayDecorating,
+ &gEventObjectGraphicsInfo_Archie,
+ &gEventObjectGraphicsInfo_Maxie,
+ &gEventObjectGraphicsInfo_Kyogre1,
+ &gEventObjectGraphicsInfo_Groudon1,
+ &gEventObjectGraphicsInfo_Fossil,
+ &gEventObjectGraphicsInfo_Regirock,
+ &gEventObjectGraphicsInfo_Regice,
+ &gEventObjectGraphicsInfo_Registeel,
+ &gEventObjectGraphicsInfo_Skitty,
+ &gEventObjectGraphicsInfo_Kecleon1,
+ &gEventObjectGraphicsInfo_Kyogre2,
+ &gEventObjectGraphicsInfo_Groudon2,
+ &gEventObjectGraphicsInfo_Rayquaza2,
+ &gEventObjectGraphicsInfo_Zigzagoon,
+ &gEventObjectGraphicsInfo_Pikachu,
+ &gEventObjectGraphicsInfo_Azumarill,
+ &gEventObjectGraphicsInfo_Wingull,
+ &gEventObjectGraphicsInfo_Kecleon2,
+ &gEventObjectGraphicsInfo_TuberMSwimming,
+ &gEventObjectGraphicsInfo_Azurill,
+ &gEventObjectGraphicsInfo_Mom,
+ &gEventObjectGraphicsInfo_LinkBrendan,
+ &gEventObjectGraphicsInfo_LinkMay,
+ &gEventObjectGraphicsInfo_Juan,
+ &gEventObjectGraphicsInfo_Scott,
+ &gEventObjectGraphicsInfo_Poochyena,
+ &gEventObjectGraphicsInfo_Kyogre3,
+ &gEventObjectGraphicsInfo_Groudon3,
+ &gEventObjectGraphicsInfo_MysteryEventDeliveryman,
+ &gEventObjectGraphicsInfo_Statue,
+ &gEventObjectGraphicsInfo_Kirlia,
+ &gEventObjectGraphicsInfo_Dusclops,
+ &gEventObjectGraphicsInfo_UnionRoomAttendant,
+ &gEventObjectGraphicsInfo_Sudowoodo,
+ &gEventObjectGraphicsInfo_Mew,
+ &gEventObjectGraphicsInfo_Red,
+ &gEventObjectGraphicsInfo_Leaf,
+ &gEventObjectGraphicsInfo_Deoxys,
+ &gEventObjectGraphicsInfo_BirthIslandStone,
+ &gEventObjectGraphicsInfo_Brandon,
+ &gEventObjectGraphicsInfo_RubySapphireBrendan,
+ &gEventObjectGraphicsInfo_RubySapphireMay,
+ &gEventObjectGraphicsInfo_Lugia,
+ &gEventObjectGraphicsInfo_HoOh,
+};
+
+const struct EventObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = {
+ &gEventObjectGraphicsInfo_Bard,
+ &gEventObjectGraphicsInfo_Hipster,
+ &gEventObjectGraphicsInfo_Trader,
+ &gEventObjectGraphicsInfo_Storyteller,
+ &gEventObjectGraphicsInfo_Giddy,
+ &gEventObjectGraphicsInfo_UnusedMauvilleOldMan1,
+ &gEventObjectGraphicsInfo_UnusedMauvilleOldMan2,
+};
+
+#endif //GUARD_EVENT_OBJECT_GRAPHICS_INFO_POINTERS_H
diff --git a/src/data/field_event_obj/event_object_pic_tables.h b/src/data/field_event_obj/event_object_pic_tables.h
new file mode 100755
index 000000000..892af7e9b
--- /dev/null
+++ b/src/data/field_event_obj/event_object_pic_tables.h
@@ -0,0 +1,2179 @@
+#ifndef GUARD_EVENT_OBJECT_PIC_TABLES_H
+#define GUARD_EVENT_OBJECT_PIC_TABLES_H
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanNormal[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_0),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_1),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_2),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_3),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_4),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_5),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_6),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_7),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_8),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_9),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_10),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_11),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_12),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_13),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_14),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_15),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_16),
+ obj_frame_tiles(gEventObjectPic_BrendanNormal_17),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanMachBike[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_0),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_1),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_2),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_3),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_4),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_5),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_6),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_7),
+ obj_frame_tiles(gEventObjectPic_BrendanMachBike_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanAcroBike[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_0),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_1),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_2),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_3),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_4),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_5),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_6),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_7),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_8),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_9),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_10),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_11),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_12),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_13),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_14),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_15),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_16),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_17),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_18),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_19),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_20),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_21),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_22),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_23),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_24),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_25),
+ obj_frame_tiles(gEventObjectPic_BrendanAcroBike_26),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanSurfing[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_0),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_1),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_2),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_0),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_0),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_1),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_1),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_2),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_2),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_3),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_4),
+ obj_frame_tiles(gEventObjectPic_BrendanSurfing_5),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanUnderwater[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_0),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_1),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_2),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_0),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_0),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_1),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_1),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_2),
+ obj_frame_tiles(gEventObjectPic_BrendanUnderwater_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanFieldMove[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanFieldMove_0),
+ obj_frame_tiles(gEventObjectPic_BrendanFieldMove_1),
+ obj_frame_tiles(gEventObjectPic_BrendanFieldMove_2),
+ obj_frame_tiles(gEventObjectPic_BrendanFieldMove_3),
+ obj_frame_tiles(gEventObjectPic_BrendanFieldMove_4),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_QuintyPlump[] = {
+ obj_frame_tiles(gEventObjectPic_QuintyPlump_0),
+ obj_frame_tiles(gEventObjectPic_QuintyPlump_1),
+ obj_frame_tiles(gEventObjectPic_QuintyPlump_2),
+ obj_frame_tiles(gEventObjectPic_QuintyPlump_3),
+ obj_frame_tiles(gEventObjectPic_QuintyPlump_4),
+ obj_frame_tiles(gEventObjectPic_QuintyPlump_5),
+ obj_frame_tiles(gEventObjectPic_QuintyPlump_6),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_LittleBoy1[] = {
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_0),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_1),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_2),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_3),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_4),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_5),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_6),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_7),
+ obj_frame_tiles(gEventObjectPic_LittleBoy1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_LittleGirl1[] = {
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_0),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_1),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_2),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_3),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_4),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_5),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_6),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_7),
+ obj_frame_tiles(gEventObjectPic_LittleGirl1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Boy1[] = {
+ obj_frame_tiles(gEventObjectPic_Boy1_0),
+ obj_frame_tiles(gEventObjectPic_Boy1_1),
+ obj_frame_tiles(gEventObjectPic_Boy1_2),
+ obj_frame_tiles(gEventObjectPic_Boy1_3),
+ obj_frame_tiles(gEventObjectPic_Boy1_4),
+ obj_frame_tiles(gEventObjectPic_Boy1_5),
+ obj_frame_tiles(gEventObjectPic_Boy1_6),
+ obj_frame_tiles(gEventObjectPic_Boy1_7),
+ obj_frame_tiles(gEventObjectPic_Boy1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Girl1[] = {
+ obj_frame_tiles(gEventObjectPic_Girl1_0),
+ obj_frame_tiles(gEventObjectPic_Girl1_1),
+ obj_frame_tiles(gEventObjectPic_Girl1_2),
+ obj_frame_tiles(gEventObjectPic_Girl1_3),
+ obj_frame_tiles(gEventObjectPic_Girl1_4),
+ obj_frame_tiles(gEventObjectPic_Girl1_5),
+ obj_frame_tiles(gEventObjectPic_Girl1_6),
+ obj_frame_tiles(gEventObjectPic_Girl1_7),
+ obj_frame_tiles(gEventObjectPic_Girl1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Boy2[] = {
+ obj_frame_tiles(gEventObjectPic_Boy2_0),
+ obj_frame_tiles(gEventObjectPic_Boy2_1),
+ obj_frame_tiles(gEventObjectPic_Boy2_2),
+ obj_frame_tiles(gEventObjectPic_Boy2_3),
+ obj_frame_tiles(gEventObjectPic_Boy2_4),
+ obj_frame_tiles(gEventObjectPic_Boy2_5),
+ obj_frame_tiles(gEventObjectPic_Boy2_6),
+ obj_frame_tiles(gEventObjectPic_Boy2_7),
+ obj_frame_tiles(gEventObjectPic_Boy2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Girl2[] = {
+ obj_frame_tiles(gEventObjectPic_Girl2_0),
+ obj_frame_tiles(gEventObjectPic_Girl2_1),
+ obj_frame_tiles(gEventObjectPic_Girl2_2),
+ obj_frame_tiles(gEventObjectPic_Girl2_3),
+ obj_frame_tiles(gEventObjectPic_Girl2_4),
+ obj_frame_tiles(gEventObjectPic_Girl2_5),
+ obj_frame_tiles(gEventObjectPic_Girl2_6),
+ obj_frame_tiles(gEventObjectPic_Girl2_7),
+ obj_frame_tiles(gEventObjectPic_Girl2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_LittleBoy2[] = {
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_0),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_1),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_2),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_3),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_4),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_5),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_6),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_7),
+ obj_frame_tiles(gEventObjectPic_LittleBoy2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_LittleGirl2[] = {
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_0),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_1),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_2),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_3),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_4),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_5),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_6),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_7),
+ obj_frame_tiles(gEventObjectPic_LittleGirl2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Boy3[] = {
+ obj_frame_tiles(gEventObjectPic_Boy3_0),
+ obj_frame_tiles(gEventObjectPic_Boy3_1),
+ obj_frame_tiles(gEventObjectPic_Boy3_2),
+ obj_frame_tiles(gEventObjectPic_Boy3_3),
+ obj_frame_tiles(gEventObjectPic_Boy3_4),
+ obj_frame_tiles(gEventObjectPic_Boy3_5),
+ obj_frame_tiles(gEventObjectPic_Boy3_6),
+ obj_frame_tiles(gEventObjectPic_Boy3_7),
+ obj_frame_tiles(gEventObjectPic_Boy3_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Girl3[] = {
+ obj_frame_tiles(gEventObjectPic_Girl3_0),
+ obj_frame_tiles(gEventObjectPic_Girl3_1),
+ obj_frame_tiles(gEventObjectPic_Girl3_2),
+ obj_frame_tiles(gEventObjectPic_Girl3_3),
+ obj_frame_tiles(gEventObjectPic_Girl3_4),
+ obj_frame_tiles(gEventObjectPic_Girl3_5),
+ obj_frame_tiles(gEventObjectPic_Girl3_6),
+ obj_frame_tiles(gEventObjectPic_Girl3_7),
+ obj_frame_tiles(gEventObjectPic_Girl3_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Boy4[] = {
+ obj_frame_tiles(gEventObjectPic_Boy4_0),
+ obj_frame_tiles(gEventObjectPic_Boy4_1),
+ obj_frame_tiles(gEventObjectPic_Boy4_2),
+ obj_frame_tiles(gEventObjectPic_Boy4_3),
+ obj_frame_tiles(gEventObjectPic_Boy4_4),
+ obj_frame_tiles(gEventObjectPic_Boy4_5),
+ obj_frame_tiles(gEventObjectPic_Boy4_6),
+ obj_frame_tiles(gEventObjectPic_Boy4_7),
+ obj_frame_tiles(gEventObjectPic_Boy4_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Woman1[] = {
+ obj_frame_tiles(gEventObjectPic_Woman1_0),
+ obj_frame_tiles(gEventObjectPic_Woman1_1),
+ obj_frame_tiles(gEventObjectPic_Woman1_2),
+ obj_frame_tiles(gEventObjectPic_Woman1_3),
+ obj_frame_tiles(gEventObjectPic_Woman1_4),
+ obj_frame_tiles(gEventObjectPic_Woman1_5),
+ obj_frame_tiles(gEventObjectPic_Woman1_6),
+ obj_frame_tiles(gEventObjectPic_Woman1_7),
+ obj_frame_tiles(gEventObjectPic_Woman1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_FatMan[] = {
+ obj_frame_tiles(gEventObjectPic_FatMan_0),
+ obj_frame_tiles(gEventObjectPic_FatMan_1),
+ obj_frame_tiles(gEventObjectPic_FatMan_2),
+ obj_frame_tiles(gEventObjectPic_FatMan_3),
+ obj_frame_tiles(gEventObjectPic_FatMan_4),
+ obj_frame_tiles(gEventObjectPic_FatMan_5),
+ obj_frame_tiles(gEventObjectPic_FatMan_6),
+ obj_frame_tiles(gEventObjectPic_FatMan_7),
+ obj_frame_tiles(gEventObjectPic_FatMan_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Woman2[] = {
+ obj_frame_tiles(gEventObjectPic_Woman2_0),
+ obj_frame_tiles(gEventObjectPic_Woman2_1),
+ obj_frame_tiles(gEventObjectPic_Woman2_2),
+ obj_frame_tiles(gEventObjectPic_Woman2_3),
+ obj_frame_tiles(gEventObjectPic_Woman2_4),
+ obj_frame_tiles(gEventObjectPic_Woman2_5),
+ obj_frame_tiles(gEventObjectPic_Woman2_6),
+ obj_frame_tiles(gEventObjectPic_Woman2_7),
+ obj_frame_tiles(gEventObjectPic_Woman2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Man1[] = {
+ obj_frame_tiles(gEventObjectPic_Man1_0),
+ obj_frame_tiles(gEventObjectPic_Man1_1),
+ obj_frame_tiles(gEventObjectPic_Man1_2),
+ obj_frame_tiles(gEventObjectPic_Man1_3),
+ obj_frame_tiles(gEventObjectPic_Man1_4),
+ obj_frame_tiles(gEventObjectPic_Man1_5),
+ obj_frame_tiles(gEventObjectPic_Man1_6),
+ obj_frame_tiles(gEventObjectPic_Man1_7),
+ obj_frame_tiles(gEventObjectPic_Man1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Woman3[] = {
+ obj_frame_tiles(gEventObjectPic_Woman3_0),
+ obj_frame_tiles(gEventObjectPic_Woman3_1),
+ obj_frame_tiles(gEventObjectPic_Woman3_2),
+ obj_frame_tiles(gEventObjectPic_Woman3_3),
+ obj_frame_tiles(gEventObjectPic_Woman3_4),
+ obj_frame_tiles(gEventObjectPic_Woman3_5),
+ obj_frame_tiles(gEventObjectPic_Woman3_6),
+ obj_frame_tiles(gEventObjectPic_Woman3_7),
+ obj_frame_tiles(gEventObjectPic_Woman3_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_OldMan1[] = {
+ obj_frame_tiles(gEventObjectPic_OldMan1_0),
+ obj_frame_tiles(gEventObjectPic_OldMan1_1),
+ obj_frame_tiles(gEventObjectPic_OldMan1_2),
+ obj_frame_tiles(gEventObjectPic_OldMan1_3),
+ obj_frame_tiles(gEventObjectPic_OldMan1_4),
+ obj_frame_tiles(gEventObjectPic_OldMan1_5),
+ obj_frame_tiles(gEventObjectPic_OldMan1_6),
+ obj_frame_tiles(gEventObjectPic_OldMan1_7),
+ obj_frame_tiles(gEventObjectPic_OldMan1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_OldWoman1[] = {
+ obj_frame_tiles(gEventObjectPic_OldWoman1_0),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_1),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_2),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_3),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_4),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_5),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_6),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_7),
+ obj_frame_tiles(gEventObjectPic_OldWoman1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Man2[] = {
+ obj_frame_tiles(gEventObjectPic_Man2_0),
+ obj_frame_tiles(gEventObjectPic_Man2_1),
+ obj_frame_tiles(gEventObjectPic_Man2_2),
+ obj_frame_tiles(gEventObjectPic_Man2_3),
+ obj_frame_tiles(gEventObjectPic_Man2_4),
+ obj_frame_tiles(gEventObjectPic_Man2_5),
+ obj_frame_tiles(gEventObjectPic_Man2_6),
+ obj_frame_tiles(gEventObjectPic_Man2_7),
+ obj_frame_tiles(gEventObjectPic_Man2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Woman4[] = {
+ obj_frame_tiles(gEventObjectPic_Woman4_0),
+ obj_frame_tiles(gEventObjectPic_Woman4_1),
+ obj_frame_tiles(gEventObjectPic_Woman4_2),
+ obj_frame_tiles(gEventObjectPic_Woman4_3),
+ obj_frame_tiles(gEventObjectPic_Woman4_4),
+ obj_frame_tiles(gEventObjectPic_Woman4_5),
+ obj_frame_tiles(gEventObjectPic_Woman4_6),
+ obj_frame_tiles(gEventObjectPic_Woman4_7),
+ obj_frame_tiles(gEventObjectPic_Woman4_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Man3[] = {
+ obj_frame_tiles(gEventObjectPic_Man3_0),
+ obj_frame_tiles(gEventObjectPic_Man3_1),
+ obj_frame_tiles(gEventObjectPic_Man3_2),
+ obj_frame_tiles(gEventObjectPic_Man3_3),
+ obj_frame_tiles(gEventObjectPic_Man3_4),
+ obj_frame_tiles(gEventObjectPic_Man3_5),
+ obj_frame_tiles(gEventObjectPic_Man3_6),
+ obj_frame_tiles(gEventObjectPic_Man3_7),
+ obj_frame_tiles(gEventObjectPic_Man3_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Woman5[] = {
+ obj_frame_tiles(gEventObjectPic_Woman5_0),
+ obj_frame_tiles(gEventObjectPic_Woman5_1),
+ obj_frame_tiles(gEventObjectPic_Woman5_2),
+ obj_frame_tiles(gEventObjectPic_Woman5_3),
+ obj_frame_tiles(gEventObjectPic_Woman5_4),
+ obj_frame_tiles(gEventObjectPic_Woman5_5),
+ obj_frame_tiles(gEventObjectPic_Woman5_6),
+ obj_frame_tiles(gEventObjectPic_Woman5_7),
+ obj_frame_tiles(gEventObjectPic_Woman5_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Cook[] = {
+ obj_frame_tiles(gEventObjectPic_Cook_0),
+ obj_frame_tiles(gEventObjectPic_Cook_1),
+ obj_frame_tiles(gEventObjectPic_Cook_2),
+ obj_frame_tiles(gEventObjectPic_Cook_0),
+ obj_frame_tiles(gEventObjectPic_Cook_0),
+ obj_frame_tiles(gEventObjectPic_Cook_1),
+ obj_frame_tiles(gEventObjectPic_Cook_1),
+ obj_frame_tiles(gEventObjectPic_Cook_2),
+ obj_frame_tiles(gEventObjectPic_Cook_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Woman6[] = {
+ obj_frame_tiles(gEventObjectPic_Woman6_0),
+ obj_frame_tiles(gEventObjectPic_Woman6_1),
+ obj_frame_tiles(gEventObjectPic_Woman6_2),
+ obj_frame_tiles(gEventObjectPic_Woman6_3),
+ obj_frame_tiles(gEventObjectPic_Woman6_4),
+ obj_frame_tiles(gEventObjectPic_Woman6_5),
+ obj_frame_tiles(gEventObjectPic_Woman6_6),
+ obj_frame_tiles(gEventObjectPic_Woman6_7),
+ obj_frame_tiles(gEventObjectPic_Woman6_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_OldMan2[] = {
+ obj_frame_tiles(gEventObjectPic_OldMan2_0),
+ obj_frame_tiles(gEventObjectPic_OldMan2_1),
+ obj_frame_tiles(gEventObjectPic_OldMan2_2),
+ obj_frame_tiles(gEventObjectPic_OldMan2_0),
+ obj_frame_tiles(gEventObjectPic_OldMan2_0),
+ obj_frame_tiles(gEventObjectPic_OldMan2_1),
+ obj_frame_tiles(gEventObjectPic_OldMan2_1),
+ obj_frame_tiles(gEventObjectPic_OldMan2_2),
+ obj_frame_tiles(gEventObjectPic_OldMan2_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_OldWoman2[] = {
+ obj_frame_tiles(gEventObjectPic_OldWoman2_0),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_1),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_2),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_3),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_4),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_5),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_6),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_7),
+ obj_frame_tiles(gEventObjectPic_OldWoman2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Camper[] = {
+ obj_frame_tiles(gEventObjectPic_Camper_0),
+ obj_frame_tiles(gEventObjectPic_Camper_1),
+ obj_frame_tiles(gEventObjectPic_Camper_2),
+ obj_frame_tiles(gEventObjectPic_Camper_3),
+ obj_frame_tiles(gEventObjectPic_Camper_4),
+ obj_frame_tiles(gEventObjectPic_Camper_5),
+ obj_frame_tiles(gEventObjectPic_Camper_6),
+ obj_frame_tiles(gEventObjectPic_Camper_7),
+ obj_frame_tiles(gEventObjectPic_Camper_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Picnicker[] = {
+ obj_frame_tiles(gEventObjectPic_Picnicker_0),
+ obj_frame_tiles(gEventObjectPic_Picnicker_1),
+ obj_frame_tiles(gEventObjectPic_Picnicker_2),
+ obj_frame_tiles(gEventObjectPic_Picnicker_3),
+ obj_frame_tiles(gEventObjectPic_Picnicker_4),
+ obj_frame_tiles(gEventObjectPic_Picnicker_5),
+ obj_frame_tiles(gEventObjectPic_Picnicker_6),
+ obj_frame_tiles(gEventObjectPic_Picnicker_7),
+ obj_frame_tiles(gEventObjectPic_Picnicker_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Man4[] = {
+ obj_frame_tiles(gEventObjectPic_Man4_0),
+ obj_frame_tiles(gEventObjectPic_Man4_1),
+ obj_frame_tiles(gEventObjectPic_Man4_2),
+ obj_frame_tiles(gEventObjectPic_Man4_3),
+ obj_frame_tiles(gEventObjectPic_Man4_4),
+ obj_frame_tiles(gEventObjectPic_Man4_5),
+ obj_frame_tiles(gEventObjectPic_Man4_6),
+ obj_frame_tiles(gEventObjectPic_Man4_7),
+ obj_frame_tiles(gEventObjectPic_Man4_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Woman7[] = {
+ obj_frame_tiles(gEventObjectPic_Woman7_0),
+ obj_frame_tiles(gEventObjectPic_Woman7_1),
+ obj_frame_tiles(gEventObjectPic_Woman7_2),
+ obj_frame_tiles(gEventObjectPic_Woman7_3),
+ obj_frame_tiles(gEventObjectPic_Woman7_4),
+ obj_frame_tiles(gEventObjectPic_Woman7_5),
+ obj_frame_tiles(gEventObjectPic_Woman7_6),
+ obj_frame_tiles(gEventObjectPic_Woman7_7),
+ obj_frame_tiles(gEventObjectPic_Woman7_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Youngster[] = {
+ obj_frame_tiles(gEventObjectPic_Youngster_0),
+ obj_frame_tiles(gEventObjectPic_Youngster_1),
+ obj_frame_tiles(gEventObjectPic_Youngster_2),
+ obj_frame_tiles(gEventObjectPic_Youngster_3),
+ obj_frame_tiles(gEventObjectPic_Youngster_4),
+ obj_frame_tiles(gEventObjectPic_Youngster_5),
+ obj_frame_tiles(gEventObjectPic_Youngster_6),
+ obj_frame_tiles(gEventObjectPic_Youngster_7),
+ obj_frame_tiles(gEventObjectPic_Youngster_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BugCatcher[] = {
+ obj_frame_tiles(gEventObjectPic_BugCatcher_0),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_1),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_2),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_3),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_4),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_5),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_6),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_7),
+ obj_frame_tiles(gEventObjectPic_BugCatcher_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_PsychicM[] = {
+ obj_frame_tiles(gEventObjectPic_PsychicM_0),
+ obj_frame_tiles(gEventObjectPic_PsychicM_1),
+ obj_frame_tiles(gEventObjectPic_PsychicM_2),
+ obj_frame_tiles(gEventObjectPic_PsychicM_3),
+ obj_frame_tiles(gEventObjectPic_PsychicM_4),
+ obj_frame_tiles(gEventObjectPic_PsychicM_5),
+ obj_frame_tiles(gEventObjectPic_PsychicM_6),
+ obj_frame_tiles(gEventObjectPic_PsychicM_7),
+ obj_frame_tiles(gEventObjectPic_PsychicM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SchoolKidM[] = {
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_0),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_1),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_2),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_3),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_4),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_5),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_6),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_7),
+ obj_frame_tiles(gEventObjectPic_SchoolKidM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Maniac[] = {
+ obj_frame_tiles(gEventObjectPic_Maniac_0),
+ obj_frame_tiles(gEventObjectPic_Maniac_1),
+ obj_frame_tiles(gEventObjectPic_Maniac_2),
+ obj_frame_tiles(gEventObjectPic_Maniac_3),
+ obj_frame_tiles(gEventObjectPic_Maniac_4),
+ obj_frame_tiles(gEventObjectPic_Maniac_5),
+ obj_frame_tiles(gEventObjectPic_Maniac_6),
+ obj_frame_tiles(gEventObjectPic_Maniac_7),
+ obj_frame_tiles(gEventObjectPic_Maniac_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_HexManiac[] = {
+ obj_frame_tiles(gEventObjectPic_HexManiac_0),
+ obj_frame_tiles(gEventObjectPic_HexManiac_1),
+ obj_frame_tiles(gEventObjectPic_HexManiac_2),
+ obj_frame_tiles(gEventObjectPic_HexManiac_3),
+ obj_frame_tiles(gEventObjectPic_HexManiac_4),
+ obj_frame_tiles(gEventObjectPic_HexManiac_5),
+ obj_frame_tiles(gEventObjectPic_HexManiac_6),
+ obj_frame_tiles(gEventObjectPic_HexManiac_7),
+ obj_frame_tiles(gEventObjectPic_HexManiac_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SwimmerM[] = {
+ obj_frame_tiles(gEventObjectPic_SwimmerM_0),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_1),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_2),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_3),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_4),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_5),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_6),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_7),
+ obj_frame_tiles(gEventObjectPic_SwimmerM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SwimmerF[] = {
+ obj_frame_tiles(gEventObjectPic_SwimmerF_0),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_1),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_2),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_3),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_4),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_5),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_6),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_7),
+ obj_frame_tiles(gEventObjectPic_SwimmerF_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BlackBelt[] = {
+ obj_frame_tiles(gEventObjectPic_BlackBelt_0),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_1),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_2),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_3),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_4),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_5),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_6),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_7),
+ obj_frame_tiles(gEventObjectPic_BlackBelt_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Beauty[] = {
+ obj_frame_tiles(gEventObjectPic_Beauty_0),
+ obj_frame_tiles(gEventObjectPic_Beauty_1),
+ obj_frame_tiles(gEventObjectPic_Beauty_2),
+ obj_frame_tiles(gEventObjectPic_Beauty_3),
+ obj_frame_tiles(gEventObjectPic_Beauty_4),
+ obj_frame_tiles(gEventObjectPic_Beauty_5),
+ obj_frame_tiles(gEventObjectPic_Beauty_6),
+ obj_frame_tiles(gEventObjectPic_Beauty_7),
+ obj_frame_tiles(gEventObjectPic_Beauty_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Scientist1[] = {
+ obj_frame_tiles(gEventObjectPic_Scientist1_0),
+ obj_frame_tiles(gEventObjectPic_Scientist1_1),
+ obj_frame_tiles(gEventObjectPic_Scientist1_2),
+ obj_frame_tiles(gEventObjectPic_Scientist1_3),
+ obj_frame_tiles(gEventObjectPic_Scientist1_4),
+ obj_frame_tiles(gEventObjectPic_Scientist1_5),
+ obj_frame_tiles(gEventObjectPic_Scientist1_6),
+ obj_frame_tiles(gEventObjectPic_Scientist1_7),
+ obj_frame_tiles(gEventObjectPic_Scientist1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Lass[] = {
+ obj_frame_tiles(gEventObjectPic_Lass_0),
+ obj_frame_tiles(gEventObjectPic_Lass_1),
+ obj_frame_tiles(gEventObjectPic_Lass_2),
+ obj_frame_tiles(gEventObjectPic_Lass_3),
+ obj_frame_tiles(gEventObjectPic_Lass_4),
+ obj_frame_tiles(gEventObjectPic_Lass_5),
+ obj_frame_tiles(gEventObjectPic_Lass_6),
+ obj_frame_tiles(gEventObjectPic_Lass_7),
+ obj_frame_tiles(gEventObjectPic_Lass_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Gentleman[] = {
+ obj_frame_tiles(gEventObjectPic_Gentleman_0),
+ obj_frame_tiles(gEventObjectPic_Gentleman_1),
+ obj_frame_tiles(gEventObjectPic_Gentleman_2),
+ obj_frame_tiles(gEventObjectPic_Gentleman_3),
+ obj_frame_tiles(gEventObjectPic_Gentleman_4),
+ obj_frame_tiles(gEventObjectPic_Gentleman_5),
+ obj_frame_tiles(gEventObjectPic_Gentleman_6),
+ obj_frame_tiles(gEventObjectPic_Gentleman_7),
+ obj_frame_tiles(gEventObjectPic_Gentleman_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Sailor[] = {
+ obj_frame_tiles(gEventObjectPic_Sailor_0),
+ obj_frame_tiles(gEventObjectPic_Sailor_1),
+ obj_frame_tiles(gEventObjectPic_Sailor_2),
+ obj_frame_tiles(gEventObjectPic_Sailor_3),
+ obj_frame_tiles(gEventObjectPic_Sailor_4),
+ obj_frame_tiles(gEventObjectPic_Sailor_5),
+ obj_frame_tiles(gEventObjectPic_Sailor_6),
+ obj_frame_tiles(gEventObjectPic_Sailor_7),
+ obj_frame_tiles(gEventObjectPic_Sailor_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Fisherman[] = {
+ obj_frame_tiles(gEventObjectPic_Fisherman_0),
+ obj_frame_tiles(gEventObjectPic_Fisherman_1),
+ obj_frame_tiles(gEventObjectPic_Fisherman_2),
+ obj_frame_tiles(gEventObjectPic_Fisherman_3),
+ obj_frame_tiles(gEventObjectPic_Fisherman_4),
+ obj_frame_tiles(gEventObjectPic_Fisherman_5),
+ obj_frame_tiles(gEventObjectPic_Fisherman_6),
+ obj_frame_tiles(gEventObjectPic_Fisherman_7),
+ obj_frame_tiles(gEventObjectPic_Fisherman_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RunningTriathleteM[] = {
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_0),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_1),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_2),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_3),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_4),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_5),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_6),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_7),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RunningTriathleteF[] = {
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_0),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_1),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_2),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_3),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_4),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_5),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_6),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_7),
+ obj_frame_tiles(gEventObjectPic_RunningTriathleteF_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_TuberF[] = {
+ obj_frame_tiles(gEventObjectPic_TuberF_0),
+ obj_frame_tiles(gEventObjectPic_TuberF_1),
+ obj_frame_tiles(gEventObjectPic_TuberF_2),
+ obj_frame_tiles(gEventObjectPic_TuberF_3),
+ obj_frame_tiles(gEventObjectPic_TuberF_4),
+ obj_frame_tiles(gEventObjectPic_TuberF_5),
+ obj_frame_tiles(gEventObjectPic_TuberF_6),
+ obj_frame_tiles(gEventObjectPic_TuberF_7),
+ obj_frame_tiles(gEventObjectPic_TuberF_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_TuberM[] = {
+ obj_frame_tiles(gEventObjectPic_TuberM_0),
+ obj_frame_tiles(gEventObjectPic_TuberM_1),
+ obj_frame_tiles(gEventObjectPic_TuberM_2),
+ obj_frame_tiles(gEventObjectPic_TuberM_3),
+ obj_frame_tiles(gEventObjectPic_TuberM_4),
+ obj_frame_tiles(gEventObjectPic_TuberM_5),
+ obj_frame_tiles(gEventObjectPic_TuberM_6),
+ obj_frame_tiles(gEventObjectPic_TuberM_7),
+ obj_frame_tiles(gEventObjectPic_TuberM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Hiker[] = {
+ obj_frame_tiles(gEventObjectPic_Hiker_0),
+ obj_frame_tiles(gEventObjectPic_Hiker_1),
+ obj_frame_tiles(gEventObjectPic_Hiker_2),
+ obj_frame_tiles(gEventObjectPic_Hiker_3),
+ obj_frame_tiles(gEventObjectPic_Hiker_4),
+ obj_frame_tiles(gEventObjectPic_Hiker_5),
+ obj_frame_tiles(gEventObjectPic_Hiker_6),
+ obj_frame_tiles(gEventObjectPic_Hiker_7),
+ obj_frame_tiles(gEventObjectPic_Hiker_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_CyclingTriathleteM[] = {
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_0),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_1),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_2),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_3),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_4),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_5),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_6),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_7),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_CyclingTriathleteF[] = {
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_0),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_1),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_2),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_3),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_4),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_5),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_6),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_7),
+ obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Nurse[] = {
+ obj_frame_tiles(gEventObjectPic_Nurse_0),
+ obj_frame_tiles(gEventObjectPic_Nurse_1),
+ obj_frame_tiles(gEventObjectPic_Nurse_2),
+ obj_frame_tiles(gEventObjectPic_Nurse_0),
+ obj_frame_tiles(gEventObjectPic_Nurse_0),
+ obj_frame_tiles(gEventObjectPic_Nurse_1),
+ obj_frame_tiles(gEventObjectPic_Nurse_1),
+ obj_frame_tiles(gEventObjectPic_Nurse_2),
+ obj_frame_tiles(gEventObjectPic_Nurse_2),
+ obj_frame_tiles(gEventObjectPic_Nurse_3),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ItemBall[] = {
+ obj_frame_tiles(gEventObjectPic_ItemBall),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ProfBirch[] = {
+ obj_frame_tiles(gEventObjectPic_ProfBirch_0),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_1),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_2),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_3),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_4),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_5),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_6),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_7),
+ obj_frame_tiles(gEventObjectPic_ProfBirch_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Man5[] = {
+ obj_frame_tiles(gEventObjectPic_Man5_0),
+ obj_frame_tiles(gEventObjectPic_Man5_1),
+ obj_frame_tiles(gEventObjectPic_Man5_2),
+ obj_frame_tiles(gEventObjectPic_Man5_3),
+ obj_frame_tiles(gEventObjectPic_Man5_4),
+ obj_frame_tiles(gEventObjectPic_Man5_5),
+ obj_frame_tiles(gEventObjectPic_Man5_6),
+ obj_frame_tiles(gEventObjectPic_Man5_7),
+ obj_frame_tiles(gEventObjectPic_Man5_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Man6[] = {
+ obj_frame_tiles(gEventObjectPic_Man6_0),
+ obj_frame_tiles(gEventObjectPic_Man6_1),
+ obj_frame_tiles(gEventObjectPic_Man6_2),
+ obj_frame_tiles(gEventObjectPic_Man6_3),
+ obj_frame_tiles(gEventObjectPic_Man6_4),
+ obj_frame_tiles(gEventObjectPic_Man6_5),
+ obj_frame_tiles(gEventObjectPic_Man6_6),
+ obj_frame_tiles(gEventObjectPic_Man6_7),
+ obj_frame_tiles(gEventObjectPic_Man6_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ReporterM[] = {
+ obj_frame_tiles(gEventObjectPic_ReporterM_0),
+ obj_frame_tiles(gEventObjectPic_ReporterM_1),
+ obj_frame_tiles(gEventObjectPic_ReporterM_2),
+ obj_frame_tiles(gEventObjectPic_ReporterM_3),
+ obj_frame_tiles(gEventObjectPic_ReporterM_4),
+ obj_frame_tiles(gEventObjectPic_ReporterM_5),
+ obj_frame_tiles(gEventObjectPic_ReporterM_6),
+ obj_frame_tiles(gEventObjectPic_ReporterM_7),
+ obj_frame_tiles(gEventObjectPic_ReporterM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ReporterF[] = {
+ obj_frame_tiles(gEventObjectPic_ReporterF_0),
+ obj_frame_tiles(gEventObjectPic_ReporterF_1),
+ obj_frame_tiles(gEventObjectPic_ReporterF_2),
+ obj_frame_tiles(gEventObjectPic_ReporterF_3),
+ obj_frame_tiles(gEventObjectPic_ReporterF_4),
+ obj_frame_tiles(gEventObjectPic_ReporterF_5),
+ obj_frame_tiles(gEventObjectPic_ReporterF_6),
+ obj_frame_tiles(gEventObjectPic_ReporterF_7),
+ obj_frame_tiles(gEventObjectPic_ReporterF_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MauvilleOldMan1[] = {
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_0),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_1),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_2),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_3),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_4),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_5),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_6),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_7),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MauvilleOldMan2[] = {
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_0),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_1),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_2),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_3),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_4),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_5),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_6),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_7),
+ obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_UnusedNatuDoll[] = {
+ obj_frame_tiles(gEventObjectPic_UnusedNatuDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_UnusedMagnemiteDoll[] = {
+ obj_frame_tiles(gEventObjectPic_UnusedMagnemiteDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_UnusedSquirtleDoll[] = {
+ obj_frame_tiles(gEventObjectPic_UnusedSquirtleDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_UnusedWooperDoll[] = {
+ obj_frame_tiles(gEventObjectPic_UnusedWooperDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_UnusedPikachuDoll[] = {
+ obj_frame_tiles(gEventObjectPic_UnusedPikachuDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_UnusedPorygon2Doll[] = {
+ obj_frame_tiles(gEventObjectPic_UnusedPorygon2Doll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_CuttableTree[] = {
+ obj_frame_tiles(gEventObjectPic_CuttableTree_0),
+ obj_frame_tiles(gEventObjectPic_CuttableTree_1),
+ obj_frame_tiles(gEventObjectPic_CuttableTree_2),
+ obj_frame_tiles(gEventObjectPic_CuttableTree_3),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MartEmployee[] = {
+ obj_frame_tiles(gEventObjectPic_MartEmployee_0),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_1),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_2),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_3),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_4),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_5),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_6),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_7),
+ obj_frame_tiles(gEventObjectPic_MartEmployee_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RooftopSaleWoman[] = {
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_0),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_1),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_2),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_3),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_4),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_5),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_6),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_7),
+ obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Teala[] = {
+ obj_frame_tiles(gEventObjectPic_Teala_0),
+ obj_frame_tiles(gEventObjectPic_Teala_1),
+ obj_frame_tiles(gEventObjectPic_Teala_2),
+ obj_frame_tiles(gEventObjectPic_Teala_3),
+ obj_frame_tiles(gEventObjectPic_Teala_4),
+ obj_frame_tiles(gEventObjectPic_Teala_5),
+ obj_frame_tiles(gEventObjectPic_Teala_6),
+ obj_frame_tiles(gEventObjectPic_Teala_7),
+ obj_frame_tiles(gEventObjectPic_Teala_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BreakableRock[] = {
+ obj_frame_tiles(gEventObjectPic_BreakableRock_0),
+ obj_frame_tiles(gEventObjectPic_BreakableRock_1),
+ obj_frame_tiles(gEventObjectPic_BreakableRock_2),
+ obj_frame_tiles(gEventObjectPic_BreakableRock_3),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_PushableBoulder[] = {
+ obj_frame_tiles(gEventObjectPic_PushableBoulder),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MrBrineysBoat[] = {
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_0),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_1),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_2),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_0),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_0),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_1),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_1),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_2),
+ obj_frame_tiles(gEventObjectPic_MrBrineysBoat_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Truck[] = {
+ obj_frame_tiles(gEventObjectPic_Truck),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_VigorothCarryingBox[] = {
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_0),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_0),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_0),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_1),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_2),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_1),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_2),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_1),
+ obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_VigorothFacingAway[] = {
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_0),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_0),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_0),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1),
+ obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BirchsBag[] = {
+ obj_frame_tiles(gEventObjectPic_BirchsBag),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_EnemyZigzagoon[] = {
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_0),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_1),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_2),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_3),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_4),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_5),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_6),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_7),
+ obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Poochyena[] = {
+ obj_frame_tiles(gEventObjectPic_Poochyena_0),
+ obj_frame_tiles(gEventObjectPic_Poochyena_1),
+ obj_frame_tiles(gEventObjectPic_Poochyena_2),
+ obj_frame_tiles(gEventObjectPic_Poochyena_3),
+ obj_frame_tiles(gEventObjectPic_Poochyena_4),
+ obj_frame_tiles(gEventObjectPic_Poochyena_5),
+ obj_frame_tiles(gEventObjectPic_Poochyena_6),
+ obj_frame_tiles(gEventObjectPic_Poochyena_7),
+ obj_frame_tiles(gEventObjectPic_Poochyena_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Artist[] = {
+ obj_frame_tiles(gEventObjectPic_Artist_0),
+ obj_frame_tiles(gEventObjectPic_Artist_1),
+ obj_frame_tiles(gEventObjectPic_Artist_2),
+ obj_frame_tiles(gEventObjectPic_Artist_3),
+ obj_frame_tiles(gEventObjectPic_Artist_4),
+ obj_frame_tiles(gEventObjectPic_Artist_5),
+ obj_frame_tiles(gEventObjectPic_Artist_6),
+ obj_frame_tiles(gEventObjectPic_Artist_7),
+ obj_frame_tiles(gEventObjectPic_Artist_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayNormal[] = {
+ obj_frame_tiles(gEventObjectPic_MayNormal_0),
+ obj_frame_tiles(gEventObjectPic_MayNormal_1),
+ obj_frame_tiles(gEventObjectPic_MayNormal_2),
+ obj_frame_tiles(gEventObjectPic_MayNormal_3),
+ obj_frame_tiles(gEventObjectPic_MayNormal_4),
+ obj_frame_tiles(gEventObjectPic_MayNormal_5),
+ obj_frame_tiles(gEventObjectPic_MayNormal_6),
+ obj_frame_tiles(gEventObjectPic_MayNormal_7),
+ obj_frame_tiles(gEventObjectPic_MayNormal_8),
+ obj_frame_tiles(gEventObjectPic_MayNormal_9),
+ obj_frame_tiles(gEventObjectPic_MayNormal_10),
+ obj_frame_tiles(gEventObjectPic_MayNormal_11),
+ obj_frame_tiles(gEventObjectPic_MayNormal_12),
+ obj_frame_tiles(gEventObjectPic_MayNormal_13),
+ obj_frame_tiles(gEventObjectPic_MayNormal_14),
+ obj_frame_tiles(gEventObjectPic_MayNormal_15),
+ obj_frame_tiles(gEventObjectPic_MayNormal_16),
+ obj_frame_tiles(gEventObjectPic_MayNormal_17),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayMachBike[] = {
+ obj_frame_tiles(gEventObjectPic_MayMachBike_0),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_1),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_2),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_3),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_4),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_5),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_6),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_7),
+ obj_frame_tiles(gEventObjectPic_MayMachBike_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayAcroBike[] = {
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_0),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_1),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_2),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_3),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_4),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_5),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_6),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_7),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_8),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_9),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_10),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_11),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_12),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_13),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_14),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_15),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_16),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_17),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_18),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_19),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_20),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_21),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_22),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_23),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_24),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_25),
+ obj_frame_tiles(gEventObjectPic_MayAcroBike_26),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MaySurfing[] = {
+ obj_frame_tiles(gEventObjectPic_MaySurfing_0),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_1),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_2),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_0),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_0),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_1),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_1),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_2),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_2),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_3),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_4),
+ obj_frame_tiles(gEventObjectPic_MaySurfing_5),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayUnderwater[] = {
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_0),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_1),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_2),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_0),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_0),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_1),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_1),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_2),
+ obj_frame_tiles(gEventObjectPic_MayUnderwater_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayFieldMove[] = {
+ obj_frame_tiles(gEventObjectPic_MayFieldMove_0),
+ obj_frame_tiles(gEventObjectPic_MayFieldMove_1),
+ obj_frame_tiles(gEventObjectPic_MayFieldMove_2),
+ obj_frame_tiles(gEventObjectPic_MayFieldMove_3),
+ obj_frame_tiles(gEventObjectPic_MayFieldMove_4),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Cameraman[] = {
+ obj_frame_tiles(gEventObjectPic_Cameraman_0),
+ obj_frame_tiles(gEventObjectPic_Cameraman_1),
+ obj_frame_tiles(gEventObjectPic_Cameraman_2),
+ obj_frame_tiles(gEventObjectPic_Cameraman_3),
+ obj_frame_tiles(gEventObjectPic_Cameraman_4),
+ obj_frame_tiles(gEventObjectPic_Cameraman_5),
+ obj_frame_tiles(gEventObjectPic_Cameraman_6),
+ obj_frame_tiles(gEventObjectPic_Cameraman_7),
+ obj_frame_tiles(gEventObjectPic_Cameraman_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MovingBox[] = {
+ obj_frame_tiles(gEventObjectPic_MovingBox),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_CableCar[] = {
+ obj_frame_tiles(gEventObjectPic_CableCar),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Scientist2[] = {
+ obj_frame_tiles(gEventObjectPic_Scientist2_0),
+ obj_frame_tiles(gEventObjectPic_Scientist2_1),
+ obj_frame_tiles(gEventObjectPic_Scientist2_2),
+ obj_frame_tiles(gEventObjectPic_Scientist2_3),
+ obj_frame_tiles(gEventObjectPic_Scientist2_4),
+ obj_frame_tiles(gEventObjectPic_Scientist2_5),
+ obj_frame_tiles(gEventObjectPic_Scientist2_6),
+ obj_frame_tiles(gEventObjectPic_Scientist2_7),
+ obj_frame_tiles(gEventObjectPic_Scientist2_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Man7[] = {
+ obj_frame_tiles(gEventObjectPic_Man7_0),
+ obj_frame_tiles(gEventObjectPic_Man7_1),
+ obj_frame_tiles(gEventObjectPic_Man7_2),
+ obj_frame_tiles(gEventObjectPic_Man7_3),
+ obj_frame_tiles(gEventObjectPic_Man7_4),
+ obj_frame_tiles(gEventObjectPic_Man7_5),
+ obj_frame_tiles(gEventObjectPic_Man7_6),
+ obj_frame_tiles(gEventObjectPic_Man7_7),
+ obj_frame_tiles(gEventObjectPic_Man7_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_AquaMemberM[] = {
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_0),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_1),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_2),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_3),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_4),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_5),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_6),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_7),
+ obj_frame_tiles(gEventObjectPic_AquaMemberM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_AquaMemberF[] = {
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_0),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_1),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_2),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_3),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_4),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_5),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_6),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_7),
+ obj_frame_tiles(gEventObjectPic_AquaMemberF_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MagmaMemberM[] = {
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_0),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_1),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_2),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_3),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_4),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_5),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_6),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_7),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberM_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MagmaMemberF[] = {
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_0),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_1),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_2),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_3),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_4),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_5),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_6),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_7),
+ obj_frame_tiles(gEventObjectPic_MagmaMemberF_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Sidney[] = {
+ obj_frame_tiles(gEventObjectPic_Sidney_0),
+ obj_frame_tiles(gEventObjectPic_Sidney_1),
+ obj_frame_tiles(gEventObjectPic_Sidney_2),
+ obj_frame_tiles(gEventObjectPic_Sidney_0),
+ obj_frame_tiles(gEventObjectPic_Sidney_0),
+ obj_frame_tiles(gEventObjectPic_Sidney_1),
+ obj_frame_tiles(gEventObjectPic_Sidney_1),
+ obj_frame_tiles(gEventObjectPic_Sidney_2),
+ obj_frame_tiles(gEventObjectPic_Sidney_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Phoebe[] = {
+ obj_frame_tiles(gEventObjectPic_Phoebe_0),
+ obj_frame_tiles(gEventObjectPic_Phoebe_1),
+ obj_frame_tiles(gEventObjectPic_Phoebe_2),
+ obj_frame_tiles(gEventObjectPic_Phoebe_0),
+ obj_frame_tiles(gEventObjectPic_Phoebe_0),
+ obj_frame_tiles(gEventObjectPic_Phoebe_1),
+ obj_frame_tiles(gEventObjectPic_Phoebe_1),
+ obj_frame_tiles(gEventObjectPic_Phoebe_2),
+ obj_frame_tiles(gEventObjectPic_Phoebe_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Glacia[] = {
+ obj_frame_tiles(gEventObjectPic_Glacia_0),
+ obj_frame_tiles(gEventObjectPic_Glacia_1),
+ obj_frame_tiles(gEventObjectPic_Glacia_2),
+ obj_frame_tiles(gEventObjectPic_Glacia_0),
+ obj_frame_tiles(gEventObjectPic_Glacia_0),
+ obj_frame_tiles(gEventObjectPic_Glacia_1),
+ obj_frame_tiles(gEventObjectPic_Glacia_1),
+ obj_frame_tiles(gEventObjectPic_Glacia_2),
+ obj_frame_tiles(gEventObjectPic_Glacia_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Drake[] = {
+ obj_frame_tiles(gEventObjectPic_Drake_0),
+ obj_frame_tiles(gEventObjectPic_Drake_1),
+ obj_frame_tiles(gEventObjectPic_Drake_2),
+ obj_frame_tiles(gEventObjectPic_Drake_0),
+ obj_frame_tiles(gEventObjectPic_Drake_0),
+ obj_frame_tiles(gEventObjectPic_Drake_1),
+ obj_frame_tiles(gEventObjectPic_Drake_1),
+ obj_frame_tiles(gEventObjectPic_Drake_2),
+ obj_frame_tiles(gEventObjectPic_Drake_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Roxanne[] = {
+ obj_frame_tiles(gEventObjectPic_Roxanne_0),
+ obj_frame_tiles(gEventObjectPic_Roxanne_1),
+ obj_frame_tiles(gEventObjectPic_Roxanne_2),
+ obj_frame_tiles(gEventObjectPic_Roxanne_0),
+ obj_frame_tiles(gEventObjectPic_Roxanne_0),
+ obj_frame_tiles(gEventObjectPic_Roxanne_1),
+ obj_frame_tiles(gEventObjectPic_Roxanne_1),
+ obj_frame_tiles(gEventObjectPic_Roxanne_2),
+ obj_frame_tiles(gEventObjectPic_Roxanne_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Brawly[] = {
+ obj_frame_tiles(gEventObjectPic_Brawly_0),
+ obj_frame_tiles(gEventObjectPic_Brawly_1),
+ obj_frame_tiles(gEventObjectPic_Brawly_2),
+ obj_frame_tiles(gEventObjectPic_Brawly_0),
+ obj_frame_tiles(gEventObjectPic_Brawly_0),
+ obj_frame_tiles(gEventObjectPic_Brawly_1),
+ obj_frame_tiles(gEventObjectPic_Brawly_1),
+ obj_frame_tiles(gEventObjectPic_Brawly_2),
+ obj_frame_tiles(gEventObjectPic_Brawly_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Wattson[] = {
+ obj_frame_tiles(gEventObjectPic_Wattson_0),
+ obj_frame_tiles(gEventObjectPic_Wattson_1),
+ obj_frame_tiles(gEventObjectPic_Wattson_2),
+ obj_frame_tiles(gEventObjectPic_Wattson_0),
+ obj_frame_tiles(gEventObjectPic_Wattson_0),
+ obj_frame_tiles(gEventObjectPic_Wattson_1),
+ obj_frame_tiles(gEventObjectPic_Wattson_1),
+ obj_frame_tiles(gEventObjectPic_Wattson_2),
+ obj_frame_tiles(gEventObjectPic_Wattson_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Flannery[] = {
+ obj_frame_tiles(gEventObjectPic_Flannery_0),
+ obj_frame_tiles(gEventObjectPic_Flannery_1),
+ obj_frame_tiles(gEventObjectPic_Flannery_2),
+ obj_frame_tiles(gEventObjectPic_Flannery_0),
+ obj_frame_tiles(gEventObjectPic_Flannery_0),
+ obj_frame_tiles(gEventObjectPic_Flannery_1),
+ obj_frame_tiles(gEventObjectPic_Flannery_1),
+ obj_frame_tiles(gEventObjectPic_Flannery_2),
+ obj_frame_tiles(gEventObjectPic_Flannery_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Norman[] = {
+ obj_frame_tiles(gEventObjectPic_Norman_0),
+ obj_frame_tiles(gEventObjectPic_Norman_1),
+ obj_frame_tiles(gEventObjectPic_Norman_2),
+ obj_frame_tiles(gEventObjectPic_Norman_3),
+ obj_frame_tiles(gEventObjectPic_Norman_4),
+ obj_frame_tiles(gEventObjectPic_Norman_5),
+ obj_frame_tiles(gEventObjectPic_Norman_6),
+ obj_frame_tiles(gEventObjectPic_Norman_7),
+ obj_frame_tiles(gEventObjectPic_Norman_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Winona[] = {
+ obj_frame_tiles(gEventObjectPic_Winona_0),
+ obj_frame_tiles(gEventObjectPic_Winona_1),
+ obj_frame_tiles(gEventObjectPic_Winona_2),
+ obj_frame_tiles(gEventObjectPic_Winona_0),
+ obj_frame_tiles(gEventObjectPic_Winona_0),
+ obj_frame_tiles(gEventObjectPic_Winona_1),
+ obj_frame_tiles(gEventObjectPic_Winona_1),
+ obj_frame_tiles(gEventObjectPic_Winona_2),
+ obj_frame_tiles(gEventObjectPic_Winona_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Liza[] = {
+ obj_frame_tiles(gEventObjectPic_Liza_0),
+ obj_frame_tiles(gEventObjectPic_Liza_1),
+ obj_frame_tiles(gEventObjectPic_Liza_2),
+ obj_frame_tiles(gEventObjectPic_Liza_0),
+ obj_frame_tiles(gEventObjectPic_Liza_0),
+ obj_frame_tiles(gEventObjectPic_Liza_1),
+ obj_frame_tiles(gEventObjectPic_Liza_1),
+ obj_frame_tiles(gEventObjectPic_Liza_2),
+ obj_frame_tiles(gEventObjectPic_Liza_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Tate[] = {
+ obj_frame_tiles(gEventObjectPic_Tate_0),
+ obj_frame_tiles(gEventObjectPic_Tate_1),
+ obj_frame_tiles(gEventObjectPic_Tate_2),
+ obj_frame_tiles(gEventObjectPic_Tate_0),
+ obj_frame_tiles(gEventObjectPic_Tate_0),
+ obj_frame_tiles(gEventObjectPic_Tate_1),
+ obj_frame_tiles(gEventObjectPic_Tate_1),
+ obj_frame_tiles(gEventObjectPic_Tate_2),
+ obj_frame_tiles(gEventObjectPic_Tate_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Wallace[] = {
+ obj_frame_tiles(gEventObjectPic_Wallace_0),
+ obj_frame_tiles(gEventObjectPic_Wallace_1),
+ obj_frame_tiles(gEventObjectPic_Wallace_2),
+ obj_frame_tiles(gEventObjectPic_Wallace_3),
+ obj_frame_tiles(gEventObjectPic_Wallace_4),
+ obj_frame_tiles(gEventObjectPic_Wallace_5),
+ obj_frame_tiles(gEventObjectPic_Wallace_6),
+ obj_frame_tiles(gEventObjectPic_Wallace_7),
+ obj_frame_tiles(gEventObjectPic_Wallace_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Steven[] = {
+ obj_frame_tiles(gEventObjectPic_Steven_0),
+ obj_frame_tiles(gEventObjectPic_Steven_1),
+ obj_frame_tiles(gEventObjectPic_Steven_2),
+ obj_frame_tiles(gEventObjectPic_Steven_3),
+ obj_frame_tiles(gEventObjectPic_Steven_4),
+ obj_frame_tiles(gEventObjectPic_Steven_5),
+ obj_frame_tiles(gEventObjectPic_Steven_6),
+ obj_frame_tiles(gEventObjectPic_Steven_7),
+ obj_frame_tiles(gEventObjectPic_Steven_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Wally[] = {
+ obj_frame_tiles(gEventObjectPic_Wally_0),
+ obj_frame_tiles(gEventObjectPic_Wally_1),
+ obj_frame_tiles(gEventObjectPic_Wally_2),
+ obj_frame_tiles(gEventObjectPic_Wally_3),
+ obj_frame_tiles(gEventObjectPic_Wally_4),
+ obj_frame_tiles(gEventObjectPic_Wally_5),
+ obj_frame_tiles(gEventObjectPic_Wally_6),
+ obj_frame_tiles(gEventObjectPic_Wally_7),
+ obj_frame_tiles(gEventObjectPic_Wally_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RubySapphireLittleBoy[] = {
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_0),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_1),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_2),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_3),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_4),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_5),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_6),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_7),
+ obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanFishing[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_0),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_1),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_2),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_3),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_4),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_5),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_6),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_7),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_8),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_9),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_10),
+ obj_frame_tiles(gEventObjectPic_BrendanFishing_11),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayFishing[] = {
+ obj_frame_tiles(gEventObjectPic_MayFishing_0),
+ obj_frame_tiles(gEventObjectPic_MayFishing_1),
+ obj_frame_tiles(gEventObjectPic_MayFishing_2),
+ obj_frame_tiles(gEventObjectPic_MayFishing_3),
+ obj_frame_tiles(gEventObjectPic_MayFishing_4),
+ obj_frame_tiles(gEventObjectPic_MayFishing_5),
+ obj_frame_tiles(gEventObjectPic_MayFishing_6),
+ obj_frame_tiles(gEventObjectPic_MayFishing_7),
+ obj_frame_tiles(gEventObjectPic_MayFishing_8),
+ obj_frame_tiles(gEventObjectPic_MayFishing_9),
+ obj_frame_tiles(gEventObjectPic_MayFishing_10),
+ obj_frame_tiles(gEventObjectPic_MayFishing_11),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_HotSpringsOldWoman[] = {
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_0),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_1),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_2),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_3),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_4),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_5),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_6),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_7),
+ obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SSTidal[] = {
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+ obj_frame_tiles(gEventObjectPic_SSTidal),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SubmarineShadow[] = {
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+ obj_frame_tiles(gEventObjectPic_SubmarineShadow),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_PichuDoll[] = {
+ obj_frame_tiles(gEventObjectPic_PichuDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_PikachuDoll[] = {
+ obj_frame_tiles(gEventObjectPic_PikachuDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MarillDoll[] = {
+ obj_frame_tiles(gEventObjectPic_MarillDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_TogepiDoll[] = {
+ obj_frame_tiles(gEventObjectPic_TogepiDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_CyndaquilDoll[] = {
+ obj_frame_tiles(gEventObjectPic_CyndaquilDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ChikoritaDoll[] = {
+ obj_frame_tiles(gEventObjectPic_ChikoritaDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_TotodileDoll[] = {
+ obj_frame_tiles(gEventObjectPic_TotodileDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_JigglypuffDoll[] = {
+ obj_frame_tiles(gEventObjectPic_JigglypuffDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MeowthDoll[] = {
+ obj_frame_tiles(gEventObjectPic_MeowthDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ClefairyDoll[] = {
+ obj_frame_tiles(gEventObjectPic_ClefairyDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_DittoDoll[] = {
+ obj_frame_tiles(gEventObjectPic_DittoDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SmoochumDoll[] = {
+ obj_frame_tiles(gEventObjectPic_SmoochumDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_TreeckoDoll[] = {
+ obj_frame_tiles(gEventObjectPic_TreeckoDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_TorchicDoll[] = {
+ obj_frame_tiles(gEventObjectPic_TorchicDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MudkipDoll[] = {
+ obj_frame_tiles(gEventObjectPic_MudkipDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_DuskullDoll[] = {
+ obj_frame_tiles(gEventObjectPic_DuskullDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_WynautDoll[] = {
+ obj_frame_tiles(gEventObjectPic_WynautDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BaltoyDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BaltoyDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_KecleonDoll[] = {
+ obj_frame_tiles(gEventObjectPic_KecleonDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_AzurillDoll[] = {
+ obj_frame_tiles(gEventObjectPic_AzurillDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SkittyDoll[] = {
+ obj_frame_tiles(gEventObjectPic_SkittyDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SwabluDoll[] = {
+ obj_frame_tiles(gEventObjectPic_SwabluDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_GulpinDoll[] = {
+ obj_frame_tiles(gEventObjectPic_GulpinDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_LotadDoll[] = {
+ obj_frame_tiles(gEventObjectPic_LotadDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SeedotDoll[] = {
+ obj_frame_tiles(gEventObjectPic_SeedotDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_PikaCushion[] = {
+ obj_frame_tiles(gEventObjectPic_PikaCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RoundCushion[] = {
+ obj_frame_tiles(gEventObjectPic_RoundCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_KissCushion[] = {
+ obj_frame_tiles(gEventObjectPic_KissCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ZigzagCushion[] = {
+ obj_frame_tiles(gEventObjectPic_ZigzagCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_SpinCushion[] = {
+ obj_frame_tiles(gEventObjectPic_SpinCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_DiamondCushion[] = {
+ obj_frame_tiles(gEventObjectPic_DiamondCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BallCushion[] = {
+ obj_frame_tiles(gEventObjectPic_BallCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_GrassCushion[] = {
+ obj_frame_tiles(gEventObjectPic_GrassCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_FireCushion[] = {
+ obj_frame_tiles(gEventObjectPic_FireCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_WaterCushion[] = {
+ obj_frame_tiles(gEventObjectPic_WaterCushion),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigSnorlaxDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigSnorlaxDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigRhydonDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigRhydonDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigLaprasDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigLaprasDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigVenusaurDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigVenusaurDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigCharizardDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigCharizardDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigBlastoiseDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigBlastoiseDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigWailmerDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigWailmerDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigRegirockDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigRegirockDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigRegiceDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigRegiceDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BigRegisteelDoll[] = {
+ obj_frame_tiles(gEventObjectPic_BigRegisteelDoll),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_LatiasLatios[] = {
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_0),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_0),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_0),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_1),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_2),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_1),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_2),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_1),
+ obj_frame_tiles(gEventObjectPic_LatiasLatios_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Boy5[] = {
+ obj_frame_tiles(gEventObjectPic_Boy5_0),
+ obj_frame_tiles(gEventObjectPic_Boy5_1),
+ obj_frame_tiles(gEventObjectPic_Boy5_2),
+ obj_frame_tiles(gEventObjectPic_Boy5_0),
+ obj_frame_tiles(gEventObjectPic_Boy5_0),
+ obj_frame_tiles(gEventObjectPic_Boy5_1),
+ obj_frame_tiles(gEventObjectPic_Boy5_1),
+ obj_frame_tiles(gEventObjectPic_Boy5_2),
+ obj_frame_tiles(gEventObjectPic_Boy5_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_ContestOldMan[] = {
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_0),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_1),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_2),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_3),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_4),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_5),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_6),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_7),
+ obj_frame_tiles(gEventObjectPic_ContestOldMan_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanWatering[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_0),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_1),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_2),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_3),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_3),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_4),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_4),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_5),
+ obj_frame_tiles(gEventObjectPic_BrendanWatering_5),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayWatering[] = {
+ obj_frame_tiles(gEventObjectPic_MayWatering_0),
+ obj_frame_tiles(gEventObjectPic_MayWatering_1),
+ obj_frame_tiles(gEventObjectPic_MayWatering_2),
+ obj_frame_tiles(gEventObjectPic_MayWatering_3),
+ obj_frame_tiles(gEventObjectPic_MayWatering_3),
+ obj_frame_tiles(gEventObjectPic_MayWatering_4),
+ obj_frame_tiles(gEventObjectPic_MayWatering_4),
+ obj_frame_tiles(gEventObjectPic_MayWatering_5),
+ obj_frame_tiles(gEventObjectPic_MayWatering_5),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BrendanDecorating[] = {
+ obj_frame_tiles(gEventObjectPic_BrendanDecorating),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MayDecorating[] = {
+ obj_frame_tiles(gEventObjectPic_MayDecorating),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Archie[] = {
+ obj_frame_tiles(gEventObjectPic_Archie_0),
+ obj_frame_tiles(gEventObjectPic_Archie_1),
+ obj_frame_tiles(gEventObjectPic_Archie_2),
+ obj_frame_tiles(gEventObjectPic_Archie_3),
+ obj_frame_tiles(gEventObjectPic_Archie_4),
+ obj_frame_tiles(gEventObjectPic_Archie_5),
+ obj_frame_tiles(gEventObjectPic_Archie_6),
+ obj_frame_tiles(gEventObjectPic_Archie_7),
+ obj_frame_tiles(gEventObjectPic_Archie_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Maxie[] = {
+ obj_frame_tiles(gEventObjectPic_Maxie_0),
+ obj_frame_tiles(gEventObjectPic_Maxie_1),
+ obj_frame_tiles(gEventObjectPic_Maxie_2),
+ obj_frame_tiles(gEventObjectPic_Maxie_3),
+ obj_frame_tiles(gEventObjectPic_Maxie_4),
+ obj_frame_tiles(gEventObjectPic_Maxie_5),
+ obj_frame_tiles(gEventObjectPic_Maxie_6),
+ obj_frame_tiles(gEventObjectPic_Maxie_7),
+ obj_frame_tiles(gEventObjectPic_Maxie_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_KyogreFront[] = {
+ obj_frame_tiles(gEventObjectPic_KyogreFront_0),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_0),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_0),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_1),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_1),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_1),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_1),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_1),
+ obj_frame_tiles(gEventObjectPic_KyogreFront_1),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_GroudonFront[] = {
+ obj_frame_tiles(gEventObjectPic_GroudonFront_0),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_0),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_0),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_1),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_1),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_1),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_1),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_1),
+ obj_frame_tiles(gEventObjectPic_GroudonFront_1),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_KyogreSide[] = {
+ obj_frame_tiles(gEventObjectPic_KyogreSide_0),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_0),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_0),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_1),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_1),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_1),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_1),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_1),
+ obj_frame_tiles(gEventObjectPic_KyogreSide_1),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_GroudonSide[] = {
+ obj_frame_tiles(gEventObjectPic_GroudonSide_0),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_0),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_0),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_1),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_1),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_1),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_1),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_1),
+ obj_frame_tiles(gEventObjectPic_GroudonSide_1),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Fossil[] = {
+ obj_frame_tiles(gEventObjectPic_Fossil),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Regi[] = {
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+ obj_frame_tiles(gEventObjectPic_Regi),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Skitty[] = {
+ obj_frame_tiles(gEventObjectPic_Skitty_0),
+ obj_frame_tiles(gEventObjectPic_Skitty_1),
+ obj_frame_tiles(gEventObjectPic_Skitty_2),
+ obj_frame_tiles(gEventObjectPic_Skitty_0),
+ obj_frame_tiles(gEventObjectPic_Skitty_0),
+ obj_frame_tiles(gEventObjectPic_Skitty_1),
+ obj_frame_tiles(gEventObjectPic_Skitty_1),
+ obj_frame_tiles(gEventObjectPic_Skitty_2),
+ obj_frame_tiles(gEventObjectPic_Skitty_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Kecleon[] = {
+ obj_frame_tiles(gEventObjectPic_Kecleon_0),
+ obj_frame_tiles(gEventObjectPic_Kecleon_1),
+ obj_frame_tiles(gEventObjectPic_Kecleon_2),
+ obj_frame_tiles(gEventObjectPic_Kecleon_0),
+ obj_frame_tiles(gEventObjectPic_Kecleon_0),
+ obj_frame_tiles(gEventObjectPic_Kecleon_1),
+ obj_frame_tiles(gEventObjectPic_Kecleon_1),
+ obj_frame_tiles(gEventObjectPic_Kecleon_2),
+ obj_frame_tiles(gEventObjectPic_Kecleon_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Rayquaza[] = {
+ obj_frame_tiles(gEventObjectPic_Rayquaza_0),
+ obj_frame_tiles(gEventObjectPic_Rayquaza_1),
+ obj_frame_tiles(gEventObjectPic_Rayquaza_2),
+ obj_frame_tiles(gEventObjectPic_Rayquaza_3),
+ obj_frame_tiles(gEventObjectPic_Rayquaza_4),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RayquazaStill[] = {
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+ obj_frame_tiles(gEventObjectPic_RayquazaStill),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Zigzagoon[] = {
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_0),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_1),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_2),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_0),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_0),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_1),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_1),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_2),
+ obj_frame_tiles(gEventObjectPic_Zigzagoon_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Pikachu[] = {
+ obj_frame_tiles(gEventObjectPic_Pikachu_0),
+ obj_frame_tiles(gEventObjectPic_Pikachu_1),
+ obj_frame_tiles(gEventObjectPic_Pikachu_2),
+ obj_frame_tiles(gEventObjectPic_Pikachu_0),
+ obj_frame_tiles(gEventObjectPic_Pikachu_0),
+ obj_frame_tiles(gEventObjectPic_Pikachu_1),
+ obj_frame_tiles(gEventObjectPic_Pikachu_1),
+ obj_frame_tiles(gEventObjectPic_Pikachu_2),
+ obj_frame_tiles(gEventObjectPic_Pikachu_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Azumarill[] = {
+ obj_frame_tiles(gEventObjectPic_Azumarill_0),
+ obj_frame_tiles(gEventObjectPic_Azumarill_1),
+ obj_frame_tiles(gEventObjectPic_Azumarill_2),
+ obj_frame_tiles(gEventObjectPic_Azumarill_0),
+ obj_frame_tiles(gEventObjectPic_Azumarill_0),
+ obj_frame_tiles(gEventObjectPic_Azumarill_1),
+ obj_frame_tiles(gEventObjectPic_Azumarill_1),
+ obj_frame_tiles(gEventObjectPic_Azumarill_2),
+ obj_frame_tiles(gEventObjectPic_Azumarill_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Wingull[] = {
+ obj_frame_tiles(gEventObjectPic_Wingull_0),
+ obj_frame_tiles(gEventObjectPic_Wingull_1),
+ obj_frame_tiles(gEventObjectPic_Wingull_2),
+ obj_frame_tiles(gEventObjectPic_Wingull_3),
+ obj_frame_tiles(gEventObjectPic_Wingull_3),
+ obj_frame_tiles(gEventObjectPic_Wingull_4),
+ obj_frame_tiles(gEventObjectPic_Wingull_4),
+ obj_frame_tiles(gEventObjectPic_Wingull_5),
+ obj_frame_tiles(gEventObjectPic_Wingull_5),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_TuberMSwimming[] = {
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_0),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_1),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_2),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_3),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_4),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_5),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_6),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_7),
+ obj_frame_tiles(gEventObjectPic_TuberMSwimming_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Azurill[] = {
+ obj_frame_tiles(gEventObjectPic_Azurill_0),
+ obj_frame_tiles(gEventObjectPic_Azurill_1),
+ obj_frame_tiles(gEventObjectPic_Azurill_2),
+ obj_frame_tiles(gEventObjectPic_Azurill_0),
+ obj_frame_tiles(gEventObjectPic_Azurill_0),
+ obj_frame_tiles(gEventObjectPic_Azurill_1),
+ obj_frame_tiles(gEventObjectPic_Azurill_1),
+ obj_frame_tiles(gEventObjectPic_Azurill_2),
+ obj_frame_tiles(gEventObjectPic_Azurill_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Mom[] = {
+ obj_frame_tiles(gEventObjectPic_Mom_0),
+ obj_frame_tiles(gEventObjectPic_Mom_1),
+ obj_frame_tiles(gEventObjectPic_Mom_2),
+ obj_frame_tiles(gEventObjectPic_Mom_3),
+ obj_frame_tiles(gEventObjectPic_Mom_4),
+ obj_frame_tiles(gEventObjectPic_Mom_5),
+ obj_frame_tiles(gEventObjectPic_Mom_6),
+ obj_frame_tiles(gEventObjectPic_Mom_7),
+ obj_frame_tiles(gEventObjectPic_Mom_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Scott[] = {
+ obj_frame_tiles(gEventObjectPic_Scott_0),
+ obj_frame_tiles(gEventObjectPic_Scott_1),
+ obj_frame_tiles(gEventObjectPic_Scott_2),
+ obj_frame_tiles(gEventObjectPic_Scott_3),
+ obj_frame_tiles(gEventObjectPic_Scott_4),
+ obj_frame_tiles(gEventObjectPic_Scott_5),
+ obj_frame_tiles(gEventObjectPic_Scott_6),
+ obj_frame_tiles(gEventObjectPic_Scott_7),
+ obj_frame_tiles(gEventObjectPic_Scott_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Juan[] = {
+ obj_frame_tiles(gEventObjectPic_Juan_0),
+ obj_frame_tiles(gEventObjectPic_Juan_1),
+ obj_frame_tiles(gEventObjectPic_Juan_2),
+ obj_frame_tiles(gEventObjectPic_Juan_3),
+ obj_frame_tiles(gEventObjectPic_Juan_4),
+ obj_frame_tiles(gEventObjectPic_Juan_5),
+ obj_frame_tiles(gEventObjectPic_Juan_6),
+ obj_frame_tiles(gEventObjectPic_Juan_7),
+ obj_frame_tiles(gEventObjectPic_Juan_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_MysteryEventDeliveryman[] = {
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_0),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_1),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_2),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_0),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_0),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_1),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_1),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_2),
+ obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Statue[] = {
+ obj_frame_tiles(gEventObjectPic_Statue),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Dusclops[] = {
+ obj_frame_tiles(gEventObjectPic_Dusclops_0),
+ obj_frame_tiles(gEventObjectPic_Dusclops_1),
+ obj_frame_tiles(gEventObjectPic_Dusclops_2),
+ obj_frame_tiles(gEventObjectPic_Dusclops_3),
+ obj_frame_tiles(gEventObjectPic_Dusclops_4),
+ obj_frame_tiles(gEventObjectPic_Dusclops_5),
+ obj_frame_tiles(gEventObjectPic_Dusclops_6),
+ obj_frame_tiles(gEventObjectPic_Dusclops_7),
+ obj_frame_tiles(gEventObjectPic_Dusclops_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Kirlia[] = {
+ obj_frame_tiles(gEventObjectPic_Kirlia_0),
+ obj_frame_tiles(gEventObjectPic_Kirlia_1),
+ obj_frame_tiles(gEventObjectPic_Kirlia_2),
+ obj_frame_tiles(gEventObjectPic_Kirlia_3),
+ obj_frame_tiles(gEventObjectPic_Kirlia_4),
+ obj_frame_tiles(gEventObjectPic_Kirlia_5),
+ obj_frame_tiles(gEventObjectPic_Kirlia_6),
+ obj_frame_tiles(gEventObjectPic_Kirlia_7),
+ obj_frame_tiles(gEventObjectPic_Kirlia_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_UnionRoomAttendant[] = {
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_0),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_1),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_2),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_0),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_0),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_1),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_1),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_2),
+ obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Sudowoodo[] = {
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_0),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_0),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_1),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_0),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_0),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_0),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_0),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_1),
+ obj_frame_tiles(gEventObjectPic_Sudowoodo_2),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Mew[] = {
+ obj_frame_tiles(gEventObjectPic_Mew_0),
+ obj_frame_tiles(gEventObjectPic_Mew_1),
+ obj_frame_tiles(gEventObjectPic_Mew_2),
+ obj_frame_tiles(gEventObjectPic_Mew_3),
+ obj_frame_tiles(gEventObjectPic_Mew_4),
+ obj_frame_tiles(gEventObjectPic_Mew_5),
+ obj_frame_tiles(gEventObjectPic_Mew_6),
+ obj_frame_tiles(gEventObjectPic_Mew_7),
+ obj_frame_tiles(gEventObjectPic_Mew_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Red[] = {
+ obj_frame_tiles(gEventObjectPic_Red_0),
+ obj_frame_tiles(gEventObjectPic_Red_1),
+ obj_frame_tiles(gEventObjectPic_Red_2),
+ obj_frame_tiles(gEventObjectPic_Red_3),
+ obj_frame_tiles(gEventObjectPic_Red_4),
+ obj_frame_tiles(gEventObjectPic_Red_5),
+ obj_frame_tiles(gEventObjectPic_Red_6),
+ obj_frame_tiles(gEventObjectPic_Red_7),
+ obj_frame_tiles(gEventObjectPic_Red_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Leaf[] = {
+ obj_frame_tiles(gEventObjectPic_Leaf_0),
+ obj_frame_tiles(gEventObjectPic_Leaf_1),
+ obj_frame_tiles(gEventObjectPic_Leaf_2),
+ obj_frame_tiles(gEventObjectPic_Leaf_3),
+ obj_frame_tiles(gEventObjectPic_Leaf_4),
+ obj_frame_tiles(gEventObjectPic_Leaf_5),
+ obj_frame_tiles(gEventObjectPic_Leaf_6),
+ obj_frame_tiles(gEventObjectPic_Leaf_7),
+ obj_frame_tiles(gEventObjectPic_Leaf_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Deoxys[] = {
+ obj_frame_tiles(gEventObjectPic_Deoxys_0),
+ obj_frame_tiles(gEventObjectPic_Deoxys_0),
+ obj_frame_tiles(gEventObjectPic_Deoxys_0),
+ obj_frame_tiles(gEventObjectPic_Deoxys_0),
+ obj_frame_tiles(gEventObjectPic_Deoxys_1),
+ obj_frame_tiles(gEventObjectPic_Deoxys_0),
+ obj_frame_tiles(gEventObjectPic_Deoxys_1),
+ obj_frame_tiles(gEventObjectPic_Deoxys_0),
+ obj_frame_tiles(gEventObjectPic_Deoxys_0),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_BirthIslandStone[] = {
+ obj_frame_tiles(gEventObjectPic_BirthIslandStone),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Anabel[] = {
+ obj_frame_tiles(gEventObjectPic_Anabel_0),
+ obj_frame_tiles(gEventObjectPic_Anabel_1),
+ obj_frame_tiles(gEventObjectPic_Anabel_2),
+ obj_frame_tiles(gEventObjectPic_Anabel_3),
+ obj_frame_tiles(gEventObjectPic_Anabel_4),
+ obj_frame_tiles(gEventObjectPic_Anabel_5),
+ obj_frame_tiles(gEventObjectPic_Anabel_6),
+ obj_frame_tiles(gEventObjectPic_Anabel_7),
+ obj_frame_tiles(gEventObjectPic_Anabel_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Tucker[] = {
+ obj_frame_tiles(gEventObjectPic_Tucker_0),
+ obj_frame_tiles(gEventObjectPic_Tucker_1),
+ obj_frame_tiles(gEventObjectPic_Tucker_2),
+ obj_frame_tiles(gEventObjectPic_Tucker_3),
+ obj_frame_tiles(gEventObjectPic_Tucker_4),
+ obj_frame_tiles(gEventObjectPic_Tucker_5),
+ obj_frame_tiles(gEventObjectPic_Tucker_6),
+ obj_frame_tiles(gEventObjectPic_Tucker_7),
+ obj_frame_tiles(gEventObjectPic_Tucker_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Spenser[] = {
+ obj_frame_tiles(gEventObjectPic_Spenser_0),
+ obj_frame_tiles(gEventObjectPic_Spenser_1),
+ obj_frame_tiles(gEventObjectPic_Spenser_2),
+ obj_frame_tiles(gEventObjectPic_Spenser_3),
+ obj_frame_tiles(gEventObjectPic_Spenser_4),
+ obj_frame_tiles(gEventObjectPic_Spenser_5),
+ obj_frame_tiles(gEventObjectPic_Spenser_6),
+ obj_frame_tiles(gEventObjectPic_Spenser_7),
+ obj_frame_tiles(gEventObjectPic_Spenser_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Greta[] = {
+ obj_frame_tiles(gEventObjectPic_Greta_0),
+ obj_frame_tiles(gEventObjectPic_Greta_1),
+ obj_frame_tiles(gEventObjectPic_Greta_2),
+ obj_frame_tiles(gEventObjectPic_Greta_3),
+ obj_frame_tiles(gEventObjectPic_Greta_4),
+ obj_frame_tiles(gEventObjectPic_Greta_5),
+ obj_frame_tiles(gEventObjectPic_Greta_6),
+ obj_frame_tiles(gEventObjectPic_Greta_7),
+ obj_frame_tiles(gEventObjectPic_Greta_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Noland[] = {
+ obj_frame_tiles(gEventObjectPic_Noland_0),
+ obj_frame_tiles(gEventObjectPic_Noland_1),
+ obj_frame_tiles(gEventObjectPic_Noland_2),
+ obj_frame_tiles(gEventObjectPic_Noland_3),
+ obj_frame_tiles(gEventObjectPic_Noland_4),
+ obj_frame_tiles(gEventObjectPic_Noland_5),
+ obj_frame_tiles(gEventObjectPic_Noland_6),
+ obj_frame_tiles(gEventObjectPic_Noland_7),
+ obj_frame_tiles(gEventObjectPic_Noland_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Lucy[] = {
+ obj_frame_tiles(gEventObjectPic_Lucy_0),
+ obj_frame_tiles(gEventObjectPic_Lucy_1),
+ obj_frame_tiles(gEventObjectPic_Lucy_2),
+ obj_frame_tiles(gEventObjectPic_Lucy_3),
+ obj_frame_tiles(gEventObjectPic_Lucy_4),
+ obj_frame_tiles(gEventObjectPic_Lucy_5),
+ obj_frame_tiles(gEventObjectPic_Lucy_6),
+ obj_frame_tiles(gEventObjectPic_Lucy_7),
+ obj_frame_tiles(gEventObjectPic_Lucy_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Brandon[] = {
+ obj_frame_tiles(gEventObjectPic_Brandon_0),
+ obj_frame_tiles(gEventObjectPic_Brandon_1),
+ obj_frame_tiles(gEventObjectPic_Brandon_2),
+ obj_frame_tiles(gEventObjectPic_Brandon_3),
+ obj_frame_tiles(gEventObjectPic_Brandon_4),
+ obj_frame_tiles(gEventObjectPic_Brandon_5),
+ obj_frame_tiles(gEventObjectPic_Brandon_6),
+ obj_frame_tiles(gEventObjectPic_Brandon_7),
+ obj_frame_tiles(gEventObjectPic_Brandon_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_Lugia[] = {
+ obj_frame_tiles(gEventObjectPic_Lugia_0),
+ obj_frame_tiles(gEventObjectPic_Lugia_0),
+ obj_frame_tiles(gEventObjectPic_Lugia_0),
+ obj_frame_tiles(gEventObjectPic_Lugia_0),
+ obj_frame_tiles(gEventObjectPic_Lugia_1),
+ obj_frame_tiles(gEventObjectPic_Lugia_0),
+ obj_frame_tiles(gEventObjectPic_Lugia_1),
+ obj_frame_tiles(gEventObjectPic_Lugia_0),
+ obj_frame_tiles(gEventObjectPic_Lugia_1),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_HoOh[] = {
+ obj_frame_tiles(gEventObjectPic_HoOh_0),
+ obj_frame_tiles(gEventObjectPic_HoOh_0),
+ obj_frame_tiles(gEventObjectPic_HoOh_0),
+ obj_frame_tiles(gEventObjectPic_HoOh_0),
+ obj_frame_tiles(gEventObjectPic_HoOh_1),
+ obj_frame_tiles(gEventObjectPic_HoOh_0),
+ obj_frame_tiles(gEventObjectPic_HoOh_1),
+ obj_frame_tiles(gEventObjectPic_HoOh_0),
+ obj_frame_tiles(gEventObjectPic_HoOh_1),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RubySapphireBrendan[] = {
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_0),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_1),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_2),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_3),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_4),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_5),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_6),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_7),
+ obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_8),
+};
+
+const struct SpriteFrameImage gEventObjectPicTable_RubySapphireMay[] = {
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_0),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_1),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_2),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_3),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_4),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_5),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_6),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_7),
+ obj_frame_tiles(gEventObjectPic_RubySapphireMay_8),
+};
+
+#endif //GUARD_EVENT_OBJECT_PIC_TABLES_H
diff --git a/src/data/field_event_obj/event_object_subsprites.h b/src/data/field_event_obj/event_object_subsprites.h
new file mode 100755
index 000000000..db5fddf1e
--- /dev/null
+++ b/src/data/field_event_obj/event_object_subsprites.h
@@ -0,0 +1,342 @@
+#ifndef GUARD_EVENT_OBJECT_SUBSPRITES_H
+#define GUARD_EVENT_OBJECT_SUBSPRITES_H
+
+const struct Subsprite gEventObjectSpriteOamTable_16x16_0[] = {
+ { -8, -8, 0, 1, 0, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x16_1[] = {
+ { -8, -8, 0, 1, 0, 1}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x16_2[] = {
+ { -8, -8, 1, 0, 0, 2},
+ { -8, 0, 1, 0, 2, 3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x16_3[] = {
+ { -8, -8, 0, 1, 0, 2},
+ { -8, -8, 0, 1, 0, 3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x16_4[] = {
+ { -8, -8, 0, 1, 0, 1},
+ { -8, -8, 0, 1, 0, 3}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_16x16[] = {
+ {0, NULL},
+ {1, gEventObjectSpriteOamTable_16x16_0},
+ {1, gEventObjectSpriteOamTable_16x16_1},
+ {2, gEventObjectSpriteOamTable_16x16_2},
+ {2, gEventObjectSpriteOamTable_16x16_3},
+ {2, gEventObjectSpriteOamTable_16x16_4}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x32_0[] = {
+ { -8, -16, 2, 2, 0, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x32_1[] = {
+ { -8, -16, 2, 2, 0, 1}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x32_2[] = {
+ { -8, -16, 0, 1, 0, 2},
+ { -8, 0, 1, 0, 4, 2},
+ { -8, 8, 1, 0, 6, 3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x32_3[] = {
+ { -8, -16, 0, 1, 0, 2},
+ { -8, 0, 0, 1, 4, 3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_16x32_4[] = {
+ { -8, -16, 0, 1, 0, 1},
+ { -8, 0, 0, 1, 4, 3}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_16x32[] = {
+ {0, NULL},
+ {1, gEventObjectSpriteOamTable_16x32_0},
+ {1, gEventObjectSpriteOamTable_16x32_1},
+ {3, gEventObjectSpriteOamTable_16x32_2},
+ {2, gEventObjectSpriteOamTable_16x32_3},
+ {2, gEventObjectSpriteOamTable_16x32_4}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_32x32_0[] = {
+ {-16, -16, 0, 2, 0, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_32x32_1[] = {
+ {-16, -16, 0, 2, 0, 1}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_32x32_2[] = {
+ {-16, -16, 1, 2, 0, 2},
+ {-16, 0, 1, 1, 8, 2},
+ {-16, 8, 1, 1, 12, 3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_32x32_3[] = {
+ {-16, -16, 1, 2, 0, 2},
+ {-16, 0, 1, 2, 8, 3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_32x32_4[] = {
+ {-16, -16, 1, 2, 0, 1},
+ {-16, 0, 1, 2, 8, 3}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_32x32[] = {
+ {0, NULL},
+ {1, gEventObjectSpriteOamTable_32x32_0},
+ {1, gEventObjectSpriteOamTable_32x32_1},
+ {3, gEventObjectSpriteOamTable_32x32_2},
+ {2, gEventObjectSpriteOamTable_32x32_3},
+ {2, gEventObjectSpriteOamTable_32x32_4}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_Truck_0[] = {
+ {-24, -24, 1, 1, 0, 2},
+ { 8, -24, 1, 0, 4, 2},
+ {-24, -16, 1, 1, 6, 2},
+ { 8, -16, 1, 0, 10, 2},
+ {-24, -8, 1, 1, 12, 2},
+ { 8, -8, 1, 0, 16, 2},
+ {-24, 0, 1, 1, 18, 2},
+ { 8, 0, 1, 0, 22, 2},
+ {-24, 8, 1, 1, 24, 2},
+ { 8, 8, 1, 0, 28, 2},
+ {-24, 16, 1, 1, 30, 2},
+ { 8, 16, 1, 0, 34, 2}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_Truck[] = {
+ {12, gEventObjectSpriteOamTable_Truck_0},
+ {12, gEventObjectSpriteOamTable_Truck_0},
+ {12, gEventObjectSpriteOamTable_Truck_0},
+ {12, gEventObjectSpriteOamTable_Truck_0},
+ {12, gEventObjectSpriteOamTable_Truck_0},
+ {12, gEventObjectSpriteOamTable_Truck_0}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_Unused_0[] = {
+ {-32, -16, 1, 3, 0, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_Unused_1[] = {
+ {-32, -16, 1, 3, 0, 1}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_Unused_2[] = {
+ {-32, -16, 1, 3, 0, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_Unused_3[] = {
+ {-32, -16, 1, 3, 0, 2}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_Unused[] = {
+ {0, NULL},
+ {1, gEventObjectSpriteOamTable_Unused_0},
+ {1, gEventObjectSpriteOamTable_Unused_1},
+ {1, gEventObjectSpriteOamTable_Unused_2},
+ {1, gEventObjectSpriteOamTable_Unused_3},
+ {1, gEventObjectSpriteOamTable_Unused_3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_64x64_0[] = {
+ {-32, -32, 0, 3, 0, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_64x64_1[] = {
+ {-32, -32, 0, 3, 0, 1}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_64x64_2[] = {
+ {-32, -32, 0, 3, 0, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_64x64_3[] = {
+ {-32, -32, 0, 3, 0, 2}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_64x64[] = {
+ {0, NULL},
+ {1, gEventObjectSpriteOamTable_64x64_0},
+ {1, gEventObjectSpriteOamTable_64x64_1},
+ {1, gEventObjectSpriteOamTable_64x64_2},
+ {1, gEventObjectSpriteOamTable_64x64_3},
+ {1, gEventObjectSpriteOamTable_64x64_3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SSTidal_0[] = {
+ {-48, -20, 1, 1, 0, 2},
+ {-16, -20, 1, 1, 4, 2},
+ { 16, -20, 1, 1, 8, 2},
+ {-48, -12, 1, 1, 12, 2},
+ {-16, -12, 1, 1, 16, 2},
+ { 16, -12, 1, 1, 20, 2},
+ {-48, -4, 1, 1, 24, 2},
+ {-16, -4, 1, 1, 28, 2},
+ { 16, -4, 1, 1, 32, 2},
+ {-48, 4, 1, 1, 36, 2},
+ {-16, 4, 1, 1, 40, 2},
+ { 16, 4, 1, 1, 44, 2},
+ {-48, 12, 1, 1, 48, 2},
+ {-16, 12, 1, 1, 52, 2},
+ { 16, 12, 1, 1, 56, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SSTidal_1[] = {
+ {-48, -20, 1, 1, 0, 1},
+ {-16, -20, 1, 1, 4, 1},
+ { 16, -20, 1, 1, 8, 1},
+ {-48, -12, 1, 1, 12, 1},
+ {-16, -12, 1, 1, 16, 1},
+ { 16, -12, 1, 1, 20, 1},
+ {-48, -4, 1, 1, 24, 1},
+ {-16, -4, 1, 1, 28, 1},
+ { 16, -4, 1, 1, 32, 1},
+ {-48, 4, 1, 1, 36, 1},
+ {-16, 4, 1, 1, 40, 1},
+ { 16, 4, 1, 1, 44, 1},
+ {-48, 12, 1, 1, 48, 1},
+ {-16, 12, 1, 1, 52, 1},
+ { 16, 12, 1, 1, 56, 1}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SSTidal_2[] = {
+ {-48, -20, 1, 1, 0, 2},
+ {-16, -20, 1, 1, 4, 2},
+ { 16, -20, 1, 1, 8, 2},
+ {-48, -12, 1, 1, 12, 2},
+ {-16, -12, 1, 1, 16, 2},
+ { 16, -12, 1, 1, 20, 2},
+ {-48, -4, 1, 1, 24, 2},
+ {-16, -4, 1, 1, 28, 2},
+ { 16, -4, 1, 1, 32, 2},
+ {-48, 4, 1, 1, 36, 2},
+ {-16, 4, 1, 1, 40, 2},
+ { 16, 4, 1, 1, 44, 2},
+ {-48, 12, 1, 1, 48, 2},
+ {-16, 12, 1, 1, 52, 2},
+ { 16, 12, 1, 1, 56, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SSTidal_3[] = {
+ {-48, -20, 1, 1, 0, 1},
+ {-16, -20, 1, 1, 4, 1},
+ { 16, -20, 1, 1, 8, 1},
+ {-48, -12, 1, 1, 12, 1},
+ {-16, -12, 1, 1, 16, 1},
+ { 16, -12, 1, 1, 20, 1},
+ {-48, -4, 1, 1, 24, 2},
+ {-16, -4, 1, 1, 28, 2},
+ { 16, -4, 1, 1, 32, 2},
+ {-48, 4, 1, 1, 36, 2},
+ {-16, 4, 1, 1, 40, 2},
+ { 16, 4, 1, 1, 44, 2},
+ {-48, 12, 1, 1, 48, 2},
+ {-16, 12, 1, 1, 52, 2},
+ { 16, 12, 1, 1, 56, 2}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_SSTidal[] = {
+ {15, gEventObjectSpriteOamTable_SSTidal_0},
+ {15, gEventObjectSpriteOamTable_SSTidal_0},
+ {15, gEventObjectSpriteOamTable_SSTidal_1},
+ {15, gEventObjectSpriteOamTable_SSTidal_2},
+ {15, gEventObjectSpriteOamTable_SSTidal_3},
+ {15, gEventObjectSpriteOamTable_SSTidal_3}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_0[] = {
+ {-48, -20, 1, 1, 0, 2},
+ {-16, -20, 1, 1, 4, 2},
+ { 16, -20, 1, 0, 8, 2},
+ { 32, -20, 0, 0, 10, 2},
+ {-48, -12, 1, 1, 11, 2},
+ {-16, -12, 1, 1, 15, 2},
+ { 16, -12, 1, 0, 19, 2},
+ { 32, -12, 0, 0, 21, 2},
+ {-48, -4, 1, 1, 22, 2},
+ {-16, -4, 1, 1, 26, 2},
+ { 16, -4, 1, 0, 30, 2},
+ { 32, -4, 0, 0, 32, 2},
+ {-48, 4, 1, 1, 33, 2},
+ {-16, 4, 1, 1, 37, 2},
+ { 16, 4, 1, 0, 41, 2},
+ { 32, 4, 0, 0, 43, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_1[] = {
+ {-48, -20, 1, 1, 0, 1},
+ {-16, -20, 1, 1, 4, 1},
+ { 16, -20, 1, 0, 8, 1},
+ { 32, -20, 0, 0, 10, 1},
+ {-48, -12, 1, 1, 11, 1},
+ {-16, -12, 1, 1, 15, 1},
+ { 16, -12, 1, 0, 19, 1},
+ { 32, -12, 0, 0, 21, 1},
+ {-48, -4, 1, 1, 22, 1},
+ {-16, -4, 1, 1, 26, 1},
+ { 16, -4, 1, 0, 30, 1},
+ { 32, -4, 0, 0, 32, 1},
+ {-48, 4, 1, 1, 33, 1},
+ {-16, 4, 1, 1, 37, 1},
+ { 16, 4, 1, 0, 41, 1},
+ { 32, 4, 0, 0, 43, 1}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_2[] = {
+ {-48, -20, 1, 1, 0, 2},
+ {-16, -20, 1, 1, 4, 2},
+ { 16, -20, 1, 0, 8, 2},
+ { 32, -20, 0, 0, 10, 2},
+ {-48, -12, 1, 1, 11, 2},
+ {-16, -12, 1, 1, 15, 2},
+ { 16, -12, 1, 0, 19, 2},
+ { 32, -12, 0, 0, 21, 2},
+ {-48, -4, 1, 1, 22, 2},
+ {-16, -4, 1, 1, 26, 2},
+ { 16, -4, 1, 0, 30, 2},
+ { 32, -4, 0, 0, 32, 2},
+ {-48, 4, 1, 1, 33, 2},
+ {-16, 4, 1, 1, 37, 2},
+ { 16, 4, 1, 0, 41, 2},
+ { 32, 4, 0, 0, 43, 2}
+};
+
+const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_3[] = {
+ {-48, -20, 1, 1, 0, 1},
+ {-16, -20, 1, 1, 4, 1},
+ { 16, -20, 1, 0, 8, 1},
+ { 32, -20, 0, 0, 10, 1},
+ {-48, -12, 1, 1, 11, 1},
+ {-16, -12, 1, 1, 15, 1},
+ { 16, -12, 1, 0, 19, 1},
+ { 32, -12, 0, 0, 21, 1},
+ {-48, -4, 1, 1, 22, 2},
+ {-16, -4, 1, 1, 26, 2},
+ { 16, -4, 1, 0, 30, 2},
+ { 32, -4, 0, 0, 32, 2},
+ {-48, 4, 1, 1, 33, 2},
+ {-16, 4, 1, 1, 37, 2},
+ { 16, 4, 1, 0, 41, 2},
+ { 32, 4, 0, 0, 43, 2}
+};
+
+const struct SubspriteTable gEventObjectSpriteOamTables_SubmarineShadow[] = {
+ {16, gEventObjectSpriteOamTable_SubmarineShadow_0},
+ {16, gEventObjectSpriteOamTable_SubmarineShadow_0},
+ {16, gEventObjectSpriteOamTable_SubmarineShadow_1},
+ {16, gEventObjectSpriteOamTable_SubmarineShadow_2},
+ {16, gEventObjectSpriteOamTable_SubmarineShadow_3},
+ {16, gEventObjectSpriteOamTable_SubmarineShadow_3}
+};
+
+#endif //GUARD_EVENT_OBJECT_SUBSPRITES_H
diff --git a/src/data/field_event_obj/field_effect_object_template_pointers.h b/src/data/field_event_obj/field_effect_object_template_pointers.h
new file mode 100755
index 000000000..3b08a5ff1
--- /dev/null
+++ b/src/data/field_event_obj/field_effect_object_template_pointers.h
@@ -0,0 +1,82 @@
+#ifndef GUARD_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H
+#define GUARD_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall;
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium;
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge;
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge;
+const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Ash;
+const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow;
+const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust;
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopTallGrass;
+const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints;
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopBigSplash;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Splash;
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopSmallSplash;
+const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown16;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown17;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown18;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown19;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown20;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown21;
+const struct SpriteTemplate gFieldEffectObjectTemplate_BerryTreeGrowthSparkle;
+const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints;
+const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise;
+const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Bird;
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks;
+const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown29;
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass;
+const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater;
+const struct SpriteTemplate gFieldEffectObjectTemplate_JumpOutOfAsh;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown33;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown35;
+const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza;
+
+const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
+ &gFieldEffectObjectTemplate_ShadowSmall,
+ &gFieldEffectObjectTemplate_ShadowMedium,
+ &gFieldEffectObjectTemplate_ShadowLarge,
+ &gFieldEffectObjectTemplate_ShadowExtraLarge,
+ &gFieldEffectObjectTemplate_TallGrass,
+ &gFieldEffectObjectTemplate_Ripple,
+ &gFieldEffectObjectTemplate_Ash,
+ &gFieldEffectObjectTemplate_SurfBlob,
+ &gFieldEffectObjectTemplate_Arrow,
+ &gFieldEffectObjectTemplate_GroundImpactDust,
+ &gFieldEffectObjectTemplate_BikeHopTallGrass,
+ &gFieldEffectObjectTemplate_SandFootprints,
+ &gFieldEffectObjectTemplate_BikeHopBigSplash,
+ &gFieldEffectObjectTemplate_Splash,
+ &gFieldEffectObjectTemplate_BikeHopSmallSplash,
+ &gFieldEffectObjectTemplate_LongGrass,
+ &gFieldEffectObjectTemplate_Unknown16,
+ &gFieldEffectObjectTemplate_Unknown17,
+ &gFieldEffectObjectTemplate_Unknown18,
+ &gFieldEffectObjectTemplate_Unknown19,
+ &gFieldEffectObjectTemplate_Unknown20,
+ &gFieldEffectObjectTemplate_Unknown21,
+ &gFieldEffectObjectTemplate_BerryTreeGrowthSparkle,
+ &gFieldEffectObjectTemplate_DeepSandFootprints,
+ &gFieldEffectObjectTemplate_TreeDisguise,
+ &gFieldEffectObjectTemplate_MountainDisguise,
+ &gFieldEffectObjectTemplate_Bird,
+ &gFieldEffectObjectTemplate_BikeTireTracks,
+ &gFieldEffectObjectTemplate_SandDisguisePlaceholder,
+ &gFieldEffectObjectTemplate_Unknown29,
+ &gFieldEffectObjectTemplate_ShortGrass,
+ &gFieldEffectObjectTemplate_HotSpringsWater,
+ &gFieldEffectObjectTemplate_JumpOutOfAsh,
+ &gFieldEffectObjectTemplate_Unknown33,
+ &gFieldEffectObjectTemplate_Bubbles,
+ &gFieldEffectObjectTemplate_Unknown35,
+ &gFieldEffectObjectTemplate_Rayquaza,
+};
+
+#endif //GUARD_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H
diff --git a/src/data/field_event_obj/field_effect_objects.h b/src/data/field_event_obj/field_effect_objects.h
new file mode 100755
index 000000000..c8633daa7
--- /dev/null
+++ b/src/data/field_event_obj/field_effect_objects.h
@@ -0,0 +1,997 @@
+#ifndef GUARD_FIELD_EFFECT_OBJECTS_H
+#define GUARD_FIELD_EFFECT_OBJECTS_H
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo0 = {gFieldEffectObjectPalette0, 0x1004};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo1 = {gFieldEffectObjectPalette1, 0x1005};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850C9D0[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Shadow[] =
+{
+ gFieldEffectObjectImageAnim_850C9D0,
+};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowSmall[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_ShadowSmall),
+};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowMedium[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_ShadowMedium),
+};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowLarge[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_ShadowLarge),
+};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowExtraLarge[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge),
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_8x8, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowSmall, gDummySpriteAffineAnimTable, oamc_shadow};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowMedium, gDummySpriteAffineAnimTable, oamc_shadow};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x8, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowLarge, gDummySpriteAffineAnimTable, oamc_shadow};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_64x32, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, oamc_shadow};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_TallGrass[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_TallGrass_0),
+ obj_frame_tiles(gFieldEffectObjectPic_TallGrass_1),
+ obj_frame_tiles(gFieldEffectObjectPic_TallGrass_2),
+ obj_frame_tiles(gFieldEffectObjectPic_TallGrass_3),
+ obj_frame_tiles(gFieldEffectObjectPic_TallGrass_4),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CA84[] =
+{
+ ANIMCMD_FRAME(1, 10),
+ ANIMCMD_FRAME(2, 10),
+ ANIMCMD_FRAME(3, 10),
+ ANIMCMD_FRAME(4, 10),
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_TallGrass[] =
+{
+ gFieldEffectObjectImageAnim_850CA84,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_TallGrass, gFieldEffectObjectPicTable_TallGrass, gDummySpriteAffineAnimTable, unc_grass_normal};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Ripple[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Ripple_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Ripple_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Ripple_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Ripple_3),
+ obj_frame_tiles(gFieldEffectObjectPic_Ripple_4),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CAE0[] =
+{
+ ANIMCMD_FRAME(0, 12),
+ ANIMCMD_FRAME(1, 9),
+ ANIMCMD_FRAME(2, 9),
+ ANIMCMD_FRAME(3, 9),
+ ANIMCMD_FRAME(0, 9),
+ ANIMCMD_FRAME(1, 9),
+ ANIMCMD_FRAME(2, 11),
+ ANIMCMD_FRAME(4, 11),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Ripple[] =
+{
+ gFieldEffectObjectImageAnim_850CAE0,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Ripple, gFieldEffectObjectPicTable_Ripple, gDummySpriteAffineAnimTable, sub_81561D0};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Ash[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Ash_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Ash_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Ash_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Ash_3),
+ obj_frame_tiles(gFieldEffectObjectPic_Ash_4),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CB48[] =
+{
+ ANIMCMD_FRAME(0, 12),
+ ANIMCMD_FRAME(1, 12),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 12),
+ ANIMCMD_FRAME(4, 12),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Ash[] =
+{
+ gFieldEffectObjectImageAnim_850CB48,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Ash, gFieldEffectObjectPicTable_Ash, gDummySpriteAffineAnimTable, sub_8155460};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_SurfBlob[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_SurfBlob_0),
+ obj_frame_tiles(gFieldEffectObjectPic_SurfBlob_1),
+ obj_frame_tiles(gFieldEffectObjectPic_SurfBlob_2),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CB94[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CB9C[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CBA4[] =
+{
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CBAC[] =
+{
+ ANIMCMD_FRAME(2, 1, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_SurfBlob[] =
+{
+ gFieldEffectObjectImageAnim_850CB94,
+ gFieldEffectObjectImageAnim_850CB9C,
+ gFieldEffectObjectImageAnim_850CBA4,
+ gFieldEffectObjectImageAnim_850CBAC,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x32, gFieldEffectObjectImageAnimTable_SurfBlob, gFieldEffectObjectPicTable_SurfBlob, gDummySpriteAffineAnimTable, sub_8155658};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Arrow[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_3),
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_4),
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_5),
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_6),
+ obj_frame_tiles(gFieldEffectObjectPic_Arrow_7),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CC1C[] =
+{
+ ANIMCMD_FRAME(3, 32),
+ ANIMCMD_FRAME(7, 32),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CC28[] =
+{
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(4, 32),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CC34[] =
+{
+ ANIMCMD_FRAME(1, 32),
+ ANIMCMD_FRAME(5, 32),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CC40[] =
+{
+ ANIMCMD_FRAME(2, 32),
+ ANIMCMD_FRAME(6, 32),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Arrow[] =
+{
+ gFieldEffectObjectImageAnim_850CC1C,
+ gFieldEffectObjectImageAnim_850CC28,
+ gFieldEffectObjectImageAnim_850CC34,
+ gFieldEffectObjectImageAnim_850CC40,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Arrow, gFieldEffectObjectPicTable_Arrow, gDummySpriteAffineAnimTable, SpriteCallbackDummy};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_GroundImpactDust[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_GroundImpactDust_0),
+ obj_frame_tiles(gFieldEffectObjectPic_GroundImpactDust_1),
+ obj_frame_tiles(gFieldEffectObjectPic_GroundImpactDust_2),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CC8C[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_GroundImpactDust[] =
+{
+ gFieldEffectObjectImageAnim_850CC8C,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_GroundImpactDust, gFieldEffectObjectPicTable_GroundImpactDust, gDummySpriteAffineAnimTable, sub_8156194};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeHopTallGrass[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_0),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_1),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_2),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_3),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CCD8[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeHopTallGrass[] =
+{
+ gFieldEffectObjectImageAnim_850CCD8,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopTallGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_BikeHopTallGrass, gFieldEffectObjectPicTable_BikeHopTallGrass, gDummySpriteAffineAnimTable, sub_8156194};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_SandFootprints[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_SandFootprints_0),
+ obj_frame_tiles(gFieldEffectObjectPic_SandFootprints_1),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD18[] =
+{
+ ANIMCMD_FRAME(0, 1, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD20[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD28[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD30[] =
+{
+ ANIMCMD_FRAME(1, 1, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_SandFootprints[] =
+{
+ gFieldEffectObjectImageAnim_850CD18,
+ gFieldEffectObjectImageAnim_850CD18,
+ gFieldEffectObjectImageAnim_850CD20,
+ gFieldEffectObjectImageAnim_850CD28,
+ gFieldEffectObjectImageAnim_850CD30,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_SandFootprints, gFieldEffectObjectPicTable_SandFootprints, gDummySpriteAffineAnimTable, sub_8154C60};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_DeepSandFootprints[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_DeepSandFootprints_0),
+ obj_frame_tiles(gFieldEffectObjectPic_DeepSandFootprints_1),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD74[] =
+{
+ ANIMCMD_FRAME(0, 1, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD7C[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD84[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CD8C[] =
+{
+ ANIMCMD_FRAME(1, 1, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_DeepSandFootprints[] =
+{
+ gFieldEffectObjectImageAnim_850CD74,
+ gFieldEffectObjectImageAnim_850CD74,
+ gFieldEffectObjectImageAnim_850CD7C,
+ gFieldEffectObjectImageAnim_850CD84,
+ gFieldEffectObjectImageAnim_850CD8C,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_DeepSandFootprints, gFieldEffectObjectPicTable_DeepSandFootprints, gDummySpriteAffineAnimTable, sub_8154C60};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeTireTracks[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_0),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_1),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_2),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_3),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CDE0[] =
+{
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CDE8[] =
+{
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CDF0[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CDF8[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CE00[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CE08[] =
+{
+ ANIMCMD_FRAME(0, 1, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CE10[] =
+{
+ ANIMCMD_FRAME(3, 1, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CE18[] =
+{
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeTireTracks[] =
+{
+ gFieldEffectObjectImageAnim_850CDE0,
+ gFieldEffectObjectImageAnim_850CDE0,
+ gFieldEffectObjectImageAnim_850CDE8,
+ gFieldEffectObjectImageAnim_850CDF0,
+ gFieldEffectObjectImageAnim_850CDF8,
+ gFieldEffectObjectImageAnim_850CE00,
+ gFieldEffectObjectImageAnim_850CE08,
+ gFieldEffectObjectImageAnim_850CE10,
+ gFieldEffectObjectImageAnim_850CE18,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BikeTireTracks, gFieldEffectObjectPicTable_BikeTireTracks, gDummySpriteAffineAnimTable, sub_8154C60};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeHopBigSplash[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_0),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_1),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_2),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_3),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CE7C[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeHopBigSplash[] =
+{
+ gFieldEffectObjectImageAnim_850CE7C,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopBigSplash = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BikeHopBigSplash, gFieldEffectObjectPicTable_BikeHopBigSplash, gDummySpriteAffineAnimTable, sub_8156194};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Splash[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Splash_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Splash_1),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CEBC[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CEC8[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(1, 6),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(1, 6),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Splash[] =
+{
+ gFieldEffectObjectImageAnim_850CEBC,
+ gFieldEffectObjectImageAnim_850CEC8,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_Splash, gFieldEffectObjectPicTable_Splash, gDummySpriteAffineAnimTable, sub_8154D90};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeHopSmallSplash[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopSmallSplash_0),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopSmallSplash_1),
+ obj_frame_tiles(gFieldEffectObjectPic_BikeHopSmallSplash_2),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CF24[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeHopSmallSplash[] =
+{
+ gFieldEffectObjectImageAnim_850CF24,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopSmallSplash = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_BikeHopSmallSplash, gFieldEffectObjectPicTable_BikeHopSmallSplash, gDummySpriteAffineAnimTable, sub_8156194};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_LongGrass[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_LongGrass_0),
+ obj_frame_tiles(gFieldEffectObjectPic_LongGrass_1),
+ obj_frame_tiles(gFieldEffectObjectPic_LongGrass_2),
+ obj_frame_tiles(gFieldEffectObjectPic_LongGrass_3),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CF70[] =
+{
+ ANIMCMD_FRAME(1, 3),
+ ANIMCMD_FRAME(2, 3),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_LongGrass[] =
+{
+ gFieldEffectObjectImageAnim_850CF70,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_LongGrass, gFieldEffectObjectPicTable_LongGrass, gDummySpriteAffineAnimTable, unc_grass_tall};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown16[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown16_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown16_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown16_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown16_3),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown16_4),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown16_5),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850CFDC[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(5, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown16[] =
+{
+ gFieldEffectObjectImageAnim_850CFDC,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown16 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown16, gFieldEffectObjectPicTable_Unknown16, gDummySpriteAffineAnimTable, sub_8156194};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown17[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown16_5),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_3),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_4),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_5),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_6),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown17_7),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D05C[] =
+{
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_FRAME(7, 4),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_JUMP(7),
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown17[] =
+{
+ gFieldEffectObjectImageAnim_850D05C,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown17 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown17, gFieldEffectObjectPicTable_Unknown17, gDummySpriteAffineAnimTable, sub_81561D0};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown18[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown18_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown18_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown18_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown18_3),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D0C0[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown18[] =
+{
+ gFieldEffectObjectImageAnim_850D0C0,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown18 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown18, gFieldEffectObjectPicTable_Unknown18, gDummySpriteAffineAnimTable, sub_81561D0};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown19[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown19_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown19_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown19_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown19_3),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D118[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown19[] =
+{
+ gFieldEffectObjectImageAnim_850D118,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown19 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown19, gFieldEffectObjectPicTable_Unknown19, gDummySpriteAffineAnimTable, sub_81561D0};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown29[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown29_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown29_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown29_2),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D160[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown29[] =
+{
+ gFieldEffectObjectImageAnim_850D160,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown29 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_Unknown29, gFieldEffectObjectPicTable_Unknown29, gDummySpriteAffineAnimTable, sub_81559BC};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown20[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown20_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown20_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown20_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown20_3),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D1AC[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown20[] =
+{
+ gFieldEffectObjectImageAnim_850D1AC,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown20 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown20, gFieldEffectObjectPicTable_Unknown20, gDummySpriteAffineAnimTable, sub_81561D0};
+
+const union AffineAnimCmd gFieldEffectObjectRotScalAnim_850D1E4[] =
+{
+ AFFINEANIMCMD_FRAME(0xFF00, 0x100, -128, 0),
+ AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+const union AffineAnimCmd gFieldEffectObjectRotScalAnim_850D234[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0),
+ AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+const union AffineAnimCmd *const gFieldEffectObjectRotScalAnimTable_Unknown21[] =
+{
+ gFieldEffectObjectRotScalAnim_850D1E4,
+ gFieldEffectObjectRotScalAnim_850D234,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown21 = {0x0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gFieldEffectObjectRotScalAnimTable_Unknown21, SpriteCallbackDummy};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_BerryTreeGrowthSparkle[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_0),
+ obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_1),
+ obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_2),
+ obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_3),
+ obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_4),
+ obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_5),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D2D4[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(5, 8),
+ ANIMCMD_LOOP(0),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_LOOP(3),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(5, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_BerryTreeGrowthSparkle[] =
+{
+ gFieldEffectObjectImageAnim_850D2D4,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_BerryTreeGrowthSparkle = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BerryTreeGrowthSparkle, gFieldEffectObjectPicTable_BerryTreeGrowthSparkle, gDummySpriteAffineAnimTable, sub_81561D0};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_TreeDisguise[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_0),
+ obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_1),
+ obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_2),
+ obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_3),
+ obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_4),
+ obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_5),
+ obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_6),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D37C[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D384[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_TreeDisguise[] =
+{
+ gFieldEffectObjectImageAnim_850D37C,
+ gFieldEffectObjectImageAnim_850D384,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_TreeDisguise, gFieldEffectObjectPicTable_TreeDisguise, gDummySpriteAffineAnimTable, sub_8155C88};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_MountainDisguise[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_0),
+ obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_1),
+ obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_2),
+ obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_3),
+ obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_4),
+ obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_5),
+ obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_6),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D3FC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D404[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_MountainDisguise[] =
+{
+ gFieldEffectObjectImageAnim_850D3FC,
+ gFieldEffectObjectImageAnim_850D404,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_MountainDisguise, gFieldEffectObjectPicTable_MountainDisguise, gDummySpriteAffineAnimTable, sub_8155C88};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_SandDisguisePlaceholder[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_0),
+ obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_1),
+ obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_2),
+ obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_3),
+ obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_4),
+ obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_5),
+ obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_6),
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_TreeDisguise, gFieldEffectObjectPicTable_SandDisguisePlaceholder, gDummySpriteAffineAnimTable, sub_8155C88};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Bird[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Bird),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D49C[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Bird[] =
+{
+ gFieldEffectObjectImageAnim_850D49C,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x32, gFieldEffectObjectImageAnimTable_Bird, gFieldEffectObjectPicTable_Bird, gDummySpriteAffineAnimTable, SpriteCallbackDummy};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_ShortGrass[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_ShortGrass_0),
+ obj_frame_tiles(gFieldEffectObjectPic_ShortGrass_1),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D4D0[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_ShortGrass[] =
+{
+ gFieldEffectObjectImageAnim_850D4D0,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_ShortGrass, gFieldEffectObjectPicTable_ShortGrass, gDummySpriteAffineAnimTable, sub_8154A10};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_HotSpringsWater[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_HotSpringsWater),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D500[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_HotSpringsWater[] =
+{
+ gFieldEffectObjectImageAnim_850D500,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_HotSpringsWater, gFieldEffectObjectPicTable_HotSpringsWater, gDummySpriteAffineAnimTable, sub_8155158};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_JumpOutOfAsh[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_0),
+ obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_1),
+ obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_2),
+ obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_3),
+ obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_4),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D54C[] =
+{
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(1, 6),
+ ANIMCMD_FRAME(2, 6),
+ ANIMCMD_FRAME(3, 6),
+ ANIMCMD_FRAME(4, 6),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_JumpOutOfAsh[] =
+{
+ gFieldEffectObjectImageAnim_850D54C,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_JumpOutOfAsh = {0xFFFF, 0x100D, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_JumpOutOfAsh, gFieldEffectObjectPicTable_JumpOutOfAsh, gDummySpriteAffineAnimTable, sub_80B7CAC};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo2 = {gFieldEffectObjectPalette2, 0x100D};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown33[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown33_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown33_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown33_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown33_3),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown33_4),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D5B0[] =
+{
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(1, 6),
+ ANIMCMD_FRAME(2, 6),
+ ANIMCMD_FRAME(3, 6),
+ ANIMCMD_FRAME(4, 6),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown33[] =
+{
+ gFieldEffectObjectImageAnim_850D5B0,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown33 = {0xFFFF, 0x100D, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown33, gFieldEffectObjectPicTable_Unknown33, gDummySpriteAffineAnimTable, sub_80B7A58};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Bubbles[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_1),
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_2),
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_3),
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_4),
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_5),
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_6),
+ obj_frame_tiles(gFieldEffectObjectPic_Bubbles_7),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D624[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_FRAME(3, 6),
+ ANIMCMD_FRAME(4, 6),
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_FRAME(7, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Bubbles[] =
+{
+ gFieldEffectObjectImageAnim_850D624,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_Bubbles, gFieldEffectObjectPicTable_Bubbles, gDummySpriteAffineAnimTable, sub_8155AEC};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown35[] = {
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown35_0),
+ obj_frame_tiles(gFieldEffectObjectPic_Unknown35_1),
+};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D674[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown35[] =
+{
+ gFieldEffectObjectImageAnim_850D674,
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown35 = {0xFFFF, 0x100F, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown35, gFieldEffectObjectPicTable_Unknown35, gDummySpriteAffineAnimTable, sub_8155E50};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo3 = {gFieldEffectObjectPalette3, 0x100F};
+
+const union AnimCmd gFieldEffectObjectImageAnim_850D6A8[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gFieldEffectObjectImageAnimTable_Rayquaza[] = {
+ gFieldEffectObjectImageAnim_850D6A8,
+};
+
+const struct SpriteFrameImage gFieldEffectObjectPicTable_Rayquaza[] = {
+ {.data = (u8*)gEventObjectPic_Rayquaza_0, .size = (sizeof gEventObjectPic_Rayquaza_0) / 4}
+};
+
+const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x32, gFieldEffectObjectImageAnimTable_Rayquaza, gFieldEffectObjectPicTable_Rayquaza, gDummySpriteAffineAnimTable, sub_8155F80};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfoUnused = {gEventObjectPalette2, 0x1011};
+
+#endif //GUARD_FIELD_EFFECT_OBJECTS_H
diff --git a/src/data/field_event_obj/movement_action_func_tables.h b/src/data/field_event_obj/movement_action_func_tables.h
new file mode 100755
index 000000000..b24f5dea4
--- /dev/null
+++ b/src/data/field_event_obj/movement_action_func_tables.h
@@ -0,0 +1,1518 @@
+#ifndef GUARD_MOVEMENT_ACTION_FUNC_TABLES_H
+#define GUARD_MOVEMENT_ACTION_FUNC_TABLES_H
+
+u8 MovementAction_FaceDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_FaceDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_PauseSpriteAnim(struct EventObject *, struct Sprite *);
+u8 MovementAction_FaceUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_FaceLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_FaceRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalUpLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalUpLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalUpRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalUpRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalDownLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalDownLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalDownRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDiagonalDownRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkSlowRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalUpLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalUpLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalUpRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalUpRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalDownLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalDownLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalDownRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkNormalRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Down_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Down_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Up_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Up_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Left_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Left_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Right_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Jump2Right_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Delay1_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Delay_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Finish(struct EventObject *, struct Sprite *);
+u8 MovementAction_Delay2_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Delay4_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Delay8_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Delay16_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceSlowDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceSlow_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceSlowUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceSlowLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceSlowRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceNormalDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlace_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceNormalUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceNormalLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceNormalRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastestDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastestUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastestLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkInPlaceFastestRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RideWaterCurrentRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkFastestRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_SlideRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_PlayerRunRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_StartAnimInDirection_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WaitSpriteAnim(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpSpecialRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_FacePlayer_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_FaceAwayPlayer_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_LockFacingDirection_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_UnlockFacingDirection_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceDownUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceDownUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceUpDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceUpDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceLeftRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceLeftRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceRightLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_JumpInPlaceRightLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_FaceOriginalDirection_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_NurseJoyBowDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_DisableAnimation_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RestoreAnimation_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_SetInvisible_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_SetVisible_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_EmoteExclamationMark_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_EmoteQuestionMark_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_EmoteHeart_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RevealTrainer_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RevealTrainer_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_RockSmashBreak_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_RockSmashBreak_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_RockSmashBreak_Step2(struct EventObject *, struct Sprite *);
+u8 MovementAction_CutTree_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_CutTree_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_CutTree_Step2(struct EventObject *, struct Sprite *);
+u8 MovementAction_SetFixedPriority_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_ClearFixedPriority_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_InitAffineAnim_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_ClearAffineAnim_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Unknown1_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Unknown2_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkDownStartAffine_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkDownStartAffine_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkDownAffine_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkDownAffine_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkLeftAffine_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkLeftAffine_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkRightAffine_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_WalkRightAffine_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieFaceDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieFaceUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieFaceLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieFaceRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieFaceDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieFaceUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieFaceRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_UnusedAcroActionDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_UnusedAcroActionUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_UnusedAcroActionLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_UnusedAcroActionRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Figure8_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Figure8_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopFaceRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieHopRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieJumpRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieInPlaceDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieInPlaceUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieInPlaceRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroPopWheelieMoveRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroWheelieMoveRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveDown_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveRight_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_AcroEndWheelieMoveRight_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Levitate_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_StopLevitate_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_DestroyExtraTaskIfAtTop_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_StoreAndLockAnim_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_Finish(struct EventObject *, struct Sprite *);
+u8 MovementAction_FreeAndUnlockAnim_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_FlyUp_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_FlyUp_Step1(struct EventObject *, struct Sprite *);
+u8 MovementAction_Fly_Finish(struct EventObject *, struct Sprite *);
+u8 MovementAction_FlyDown_Step0(struct EventObject *, struct Sprite *);
+u8 MovementAction_FlyDown_Step1(struct EventObject *, struct Sprite *);
+
+u8 (*const gMovementActionFuncs_FaceDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FaceUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FaceLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FaceRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Jump2Down[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Jump2Up[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Jump2Left[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Jump2Right[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Delay1[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Delay2[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Delay4[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Delay8[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Delay16[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_RideWaterCurrentDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_RideWaterCurrentUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_RideWaterCurrentLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_RideWaterCurrentRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastestDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastestUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastestLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkFastestRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_SlideDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_SlideUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_SlideLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_SlideRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_PlayerRunDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_PlayerRunUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_PlayerRunLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_PlayerRunRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_StartAnimInDirection[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpSpecialDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpSpecialUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpSpecialLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpSpecialRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FacePlayer[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FaceAwayPlayer[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_LockFacingDirection[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_UnlockFacingDirection[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceDownUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceUpDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceLeftRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_JumpInPlaceRightLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FaceOriginalDirection[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_NurseJoyBowDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_DisableAnimation[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_RestoreAnimation[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_SetInvisible[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_SetVisible[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_EmoteExclamationMark[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_EmoteQuestionMark[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_EmoteHeart[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_RevealTrainer[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_RockSmashBreak[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_CutTree[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_SetFixedPriority[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_ClearFixedPriority[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_InitAffineAnim[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_ClearAffineAnim[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Unknown1[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Unknown2[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkDownStartAffine[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkDownAffine[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieFaceDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieFaceUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieFaceLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieFaceRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieHopRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieJumpDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieJumpUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieJumpLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieJumpRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieMoveDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieMoveUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieMoveLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroWheelieMoveRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveDown[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownLeft[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownRight[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_StoreAndLockAnim[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FreeAndUnlockAnim[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkLeftAffine[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_WalkRightAffine[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Levitate[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_StopLevitate[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_Figure8[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FlyUp[])(struct EventObject *, struct Sprite *);
+u8 (*const gMovementActionFuncs_FlyDown[])(struct EventObject *, struct Sprite *);
+
+u8 (*const *const gMovementActionFuncs[])(struct EventObject *, struct Sprite *) = {
+ gMovementActionFuncs_FaceDown, // MOVEMENT_ACTION_FACE_DOWN
+ gMovementActionFuncs_FaceUp, // MOVEMENT_ACTION_FACE_UP
+ gMovementActionFuncs_FaceLeft, // MOVEMENT_ACTION_FACE_LEFT
+ gMovementActionFuncs_FaceRight, // MOVEMENT_ACTION_FACE_RIGHT
+ gMovementActionFuncs_WalkSlowDown, // MOVEMENT_ACTION_WALK_SLOW_DOWN
+ gMovementActionFuncs_WalkSlowUp, // MOVEMENT_ACTION_WALK_SLOW_UP
+ gMovementActionFuncs_WalkSlowLeft, // MOVEMENT_ACTION_WALK_SLOW_LEFT
+ gMovementActionFuncs_WalkSlowRight, // MOVEMENT_ACTION_WALK_SLOW_RIGHT
+ gMovementActionFuncs_WalkNormalDown, // MOVEMENT_ACTION_WALK_NORMAL_DOWN
+ gMovementActionFuncs_WalkNormalUp, // MOVEMENT_ACTION_WALK_NORMAL_UP
+ gMovementActionFuncs_WalkNormalLeft, // MOVEMENT_ACTION_WALK_NORMAL_LEFT
+ gMovementActionFuncs_WalkNormalRight, // MOVEMENT_ACTION_WALK_NORMAL_RIGHT
+ gMovementActionFuncs_Jump2Down, // MOVEMENT_ACTION_JUMP_2_DOWN
+ gMovementActionFuncs_Jump2Up, // MOVEMENT_ACTION_JUMP_2_UP
+ gMovementActionFuncs_Jump2Left, // MOVEMENT_ACTION_JUMP_2_LEFT
+ gMovementActionFuncs_Jump2Right, // MOVEMENT_ACTION_JUMP_2_RIGHT
+ gMovementActionFuncs_Delay1, // MOVEMENT_ACTION_DELAY_1
+ gMovementActionFuncs_Delay2, // MOVEMENT_ACTION_DELAY_2
+ gMovementActionFuncs_Delay4, // MOVEMENT_ACTION_DELAY_4
+ gMovementActionFuncs_Delay8, // MOVEMENT_ACTION_DELAY_8
+ gMovementActionFuncs_Delay16, // MOVEMENT_ACTION_DELAY_16
+ gMovementActionFuncs_WalkFastDown, // MOVEMENT_ACTION_WALK_FAST_DOWN
+ gMovementActionFuncs_WalkFastUp, // MOVEMENT_ACTION_WALK_FAST_UP
+ gMovementActionFuncs_WalkFastLeft, // MOVEMENT_ACTION_WALK_FAST_LEFT
+ gMovementActionFuncs_WalkFastRight, // MOVEMENT_ACTION_WALK_FAST_RIGHT
+ gMovementActionFuncs_WalkInPlaceSlowDown, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN
+ gMovementActionFuncs_WalkInPlaceSlowUp, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP
+ gMovementActionFuncs_WalkInPlaceSlowLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT
+ gMovementActionFuncs_WalkInPlaceSlowRight, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT
+ gMovementActionFuncs_WalkInPlaceNormalDown, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN
+ gMovementActionFuncs_WalkInPlaceNormalUp, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP
+ gMovementActionFuncs_WalkInPlaceNormalLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT
+ gMovementActionFuncs_WalkInPlaceNormalRight, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT
+ gMovementActionFuncs_WalkInPlaceFastDown, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN
+ gMovementActionFuncs_WalkInPlaceFastUp, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP
+ gMovementActionFuncs_WalkInPlaceFastLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT
+ gMovementActionFuncs_WalkInPlaceFastRight, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT
+ gMovementActionFuncs_WalkInPlaceFastestDown, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN
+ gMovementActionFuncs_WalkInPlaceFastestUp, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_UP
+ gMovementActionFuncs_WalkInPlaceFastestLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT
+ gMovementActionFuncs_WalkInPlaceFastestRight, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT
+ gMovementActionFuncs_RideWaterCurrentDown, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN
+ gMovementActionFuncs_RideWaterCurrentUp, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP
+ gMovementActionFuncs_RideWaterCurrentLeft, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT
+ gMovementActionFuncs_RideWaterCurrentRight, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT
+ gMovementActionFuncs_WalkFastestDown, // MOVEMENT_ACTION_WALK_FASTEST_DOWN
+ gMovementActionFuncs_WalkFastestUp, // MOVEMENT_ACTION_WALK_FASTEST_UP
+ gMovementActionFuncs_WalkFastestLeft, // MOVEMENT_ACTION_WALK_FASTEST_LEFT
+ gMovementActionFuncs_WalkFastestRight, // MOVEMENT_ACTION_WALK_FASTEST_RIGHT
+ gMovementActionFuncs_SlideDown, // MOVEMENT_ACTION_SLIDE_DOWN
+ gMovementActionFuncs_SlideUp, // MOVEMENT_ACTION_SLIDE_UP
+ gMovementActionFuncs_SlideLeft, // MOVEMENT_ACTION_SLIDE_LEFT
+ gMovementActionFuncs_SlideRight, // MOVEMENT_ACTION_SLIDE_RIGHT
+ gMovementActionFuncs_PlayerRunDown, // MOVEMENT_ACTION_PLAYER_RUN_DOWN
+ gMovementActionFuncs_PlayerRunUp, // MOVEMENT_ACTION_PLAYER_RUN_UP
+ gMovementActionFuncs_PlayerRunLeft, // MOVEMENT_ACTION_PLAYER_RUN_LEFT
+ gMovementActionFuncs_PlayerRunRight, // MOVEMENT_ACTION_PLAYER_RUN_RIGHT
+ gMovementActionFuncs_StartAnimInDirection, // MOVEMENT_ACTION_START_ANIM_IN_DIRECTION
+ gMovementActionFuncs_JumpSpecialDown, // MOVEMENT_ACTION_JUMP_SPECIAL_DOWN
+ gMovementActionFuncs_JumpSpecialUp, // MOVEMENT_ACTION_JUMP_SPECIAL_UP
+ gMovementActionFuncs_JumpSpecialLeft, // MOVEMENT_ACTION_JUMP_SPECIAL_LEFT
+ gMovementActionFuncs_JumpSpecialRight, // MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT
+ gMovementActionFuncs_FacePlayer, // MOVEMENT_ACTION_FACE_PLAYER
+ gMovementActionFuncs_FaceAwayPlayer, // MOVEMENT_ACTION_FACE_AWAY_PLAYER
+ gMovementActionFuncs_LockFacingDirection, // MOVEMENT_ACTION_LOCK_FACING_DIRECTION
+ gMovementActionFuncs_UnlockFacingDirection, // MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION
+ gMovementActionFuncs_JumpDown, // MOVEMENT_ACTION_JUMP_DOWN
+ gMovementActionFuncs_JumpUp, // MOVEMENT_ACTION_JUMP_UP
+ gMovementActionFuncs_JumpLeft, // MOVEMENT_ACTION_JUMP_LEFT
+ gMovementActionFuncs_JumpRight, // MOVEMENT_ACTION_JUMP_RIGHT
+ gMovementActionFuncs_JumpInPlaceDown, // MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN
+ gMovementActionFuncs_JumpInPlaceUp, // MOVEMENT_ACTION_JUMP_IN_PLACE_UP
+ gMovementActionFuncs_JumpInPlaceLeft, // MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT
+ gMovementActionFuncs_JumpInPlaceRight, // MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT
+ gMovementActionFuncs_JumpInPlaceDownUp, // MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP
+ gMovementActionFuncs_JumpInPlaceUpDown, // MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN
+ gMovementActionFuncs_JumpInPlaceLeftRight, // MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT
+ gMovementActionFuncs_JumpInPlaceRightLeft, // MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT
+ gMovementActionFuncs_FaceOriginalDirection, // MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION
+ gMovementActionFuncs_NurseJoyBowDown, // MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN
+ gMovementActionFuncs_EnableJumpLandingGroundEffect, // MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT
+ gMovementActionFuncs_DisableJumpLandingGroundEffect, // MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT
+ gMovementActionFuncs_DisableAnimation, // MOVEMENT_ACTION_DISABLE_ANIMATION
+ gMovementActionFuncs_RestoreAnimation, // MOVEMENT_ACTION_RESTORE_ANIMATION
+ gMovementActionFuncs_SetInvisible, // MOVEMENT_ACTION_SET_INVISIBLE
+ gMovementActionFuncs_SetVisible, // MOVEMENT_ACTION_SET_VISIBLE
+ gMovementActionFuncs_EmoteExclamationMark, // MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK
+ gMovementActionFuncs_EmoteQuestionMark, // MOVEMENT_ACTION_EMOTE_QUESTION_MARK
+ gMovementActionFuncs_EmoteHeart, // MOVEMENT_ACTION_EMOTE_HEART
+ gMovementActionFuncs_RevealTrainer, // MOVEMENT_ACTION_REVEAL_TRAINER
+ gMovementActionFuncs_RockSmashBreak, // MOVEMENT_ACTION_ROCK_SMASH_BREAK
+ gMovementActionFuncs_CutTree, // MOVEMENT_ACTION_CUT_TREE
+ gMovementActionFuncs_SetFixedPriority, // MOVEMENT_ACTION_SET_FIXED_PRIORITY
+ gMovementActionFuncs_ClearFixedPriority, // MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY
+ gMovementActionFuncs_InitAffineAnim, // MOVEMENT_ACTION_INIT_AFFINE_ANIM
+ gMovementActionFuncs_ClearAffineAnim, // MOVEMENT_ACTION_CLEAR_AFFINE_ANIM
+ gMovementActionFuncs_Unknown1, // MOVEMENT_ACTION_UNKNOWN1
+ gMovementActionFuncs_Unknown2, // MOVEMENT_ACTION_UNKNOWN2
+ gMovementActionFuncs_WalkDownStartAffine, // MOVEMENT_ACTION_WALK_DOWN_START_AFFINE
+ gMovementActionFuncs_WalkDownAffine, // MOVEMENT_ACTION_WALK_DOWN_AFFINE
+ gMovementActionFuncs_AcroWheelieFaceDown, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN
+ gMovementActionFuncs_AcroWheelieFaceUp, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP
+ gMovementActionFuncs_AcroWheelieFaceLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT
+ gMovementActionFuncs_AcroWheelieFaceRight, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT
+ gMovementActionFuncs_AcroPopWheelieDown, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN
+ gMovementActionFuncs_AcroPopWheelieUp, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP
+ gMovementActionFuncs_AcroPopWheelieLeft, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT
+ gMovementActionFuncs_AcroPopWheelieRight, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT
+ gMovementActionFuncs_AcroEndWheelieFaceDown, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN
+ gMovementActionFuncs_AcroEndWheelieFaceUp, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP
+ gMovementActionFuncs_AcroEndWheelieFaceLeft, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT
+ gMovementActionFuncs_AcroEndWheelieFaceRight, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT
+ gMovementActionFuncs_AcroWheelieHopFaceDown, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN
+ gMovementActionFuncs_AcroWheelieHopFaceUp, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP
+ gMovementActionFuncs_AcroWheelieHopFaceLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT
+ gMovementActionFuncs_AcroWheelieHopFaceRight, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT
+ gMovementActionFuncs_AcroWheelieHopDown, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN
+ gMovementActionFuncs_AcroWheelieHopUp, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP
+ gMovementActionFuncs_AcroWheelieHopLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT
+ gMovementActionFuncs_AcroWheelieHopRight, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT
+ gMovementActionFuncs_AcroWheelieJumpDown, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN
+ gMovementActionFuncs_AcroWheelieJumpUp, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP
+ gMovementActionFuncs_AcroWheelieJumpLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT
+ gMovementActionFuncs_AcroWheelieJumpRight, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT
+ gMovementActionFuncs_AcroWheelieInPlaceDown, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN
+ gMovementActionFuncs_AcroWheelieInPlaceUp, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP
+ gMovementActionFuncs_AcroWheelieInPlaceLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT
+ gMovementActionFuncs_AcroWheelieInPlaceRight, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT
+ gMovementActionFuncs_AcroPopWheelieMoveDown, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN
+ gMovementActionFuncs_AcroPopWheelieMoveUp, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP
+ gMovementActionFuncs_AcroPopWheelieMoveLeft, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT
+ gMovementActionFuncs_AcroPopWheelieMoveRight, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT
+ gMovementActionFuncs_AcroWheelieMoveDown, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN
+ gMovementActionFuncs_AcroWheelieMoveUp, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP
+ gMovementActionFuncs_AcroWheelieMoveLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT
+ gMovementActionFuncs_AcroWheelieMoveRight, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT
+ gMovementActionFuncs_AcroEndWheelieMoveDown, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN
+ gMovementActionFuncs_AcroEndWheelieMoveUp, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP
+ gMovementActionFuncs_AcroEndWheelieMoveLeft, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT
+ gMovementActionFuncs_AcroEndWheelieMoveRight, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT
+ gMovementActionFuncs_WalkNormalDiagonalUpLeft, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_UP_LEFT
+ gMovementActionFuncs_WalkNormalDiagonalUpRight, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_UP_RIGHT
+ gMovementActionFuncs_WalkNormalDiagonalDownLeft, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_DOWN_LEFT
+ gMovementActionFuncs_WalkNormalDiagonalDownRight, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_DOWN_RIGHT
+ gMovementActionFuncs_WalkSlowDiagonalUpLeft, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_LEFT
+ gMovementActionFuncs_WalkSlowDiagonalUpRight, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_RIGHT
+ gMovementActionFuncs_WalkSlowDiagonalDownLeft, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_LEFT
+ gMovementActionFuncs_WalkSlowDiagonalDownRight, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_RIGHT
+ gMovementActionFuncs_StoreAndLockAnim, // MOVEMENT_ACTION_STORE_AND_LOCK_ANIM
+ gMovementActionFuncs_FreeAndUnlockAnim, // MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM
+ gMovementActionFuncs_WalkLeftAffine, // MOVEMENT_ACTION_WALK_LEFT_AFFINE
+ gMovementActionFuncs_WalkRightAffine, // MOVEMENT_ACTION_WALK_RIGHT_AFFINE
+ gMovementActionFuncs_Levitate, // MOVEMENT_ACTION_LEVITATE
+ gMovementActionFuncs_StopLevitate, // MOVEMENT_ACTION_STOP_LEVITATE
+ gMovementActionFuncs_DestroyExtraTaskIfAtTop, // MOVEMENT_ACTION_DESTROY_EXTRA_TASK_IF_AT_TOP
+ gMovementActionFuncs_Figure8, // MOVEMENT_ACTION_FIGURE_8
+ gMovementActionFuncs_FlyUp, // MOVEMENT_ACTION_FLY_UP
+ gMovementActionFuncs_FlyDown, // MOVEMENT_ACTION_FLY_DOWN
+};
+
+u8 (*const gMovementActionFuncs_FaceDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FaceDown_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_FaceUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FaceUp_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_FaceLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FaceLeft_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_FaceRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FaceRight_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gUnknown_0850DEE8[])(u8) = {
+ GetMoveDirectionAnimNum,
+ GetMoveDirectionFastAnimNum,
+ GetMoveDirectionFastAnimNum,
+ GetMoveDirectionFasterAnimNum,
+ GetMoveDirectionFastestAnimNum,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowDiagonalUpLeft_Step0,
+ MovementAction_WalkSlowDiagonalUpLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowDiagonalUpRight_Step0,
+ MovementAction_WalkSlowDiagonalUpRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowDiagonalDownLeft_Step0,
+ MovementAction_WalkSlowDiagonalDownLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowDiagonalDownRight_Step0,
+ MovementAction_WalkSlowDiagonalDownRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowDown_Step0,
+ MovementAction_WalkSlowDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowUp_Step0,
+ MovementAction_WalkSlowUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowLeft_Step0,
+ MovementAction_WalkSlowLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkSlowRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkSlowRight_Step0,
+ MovementAction_WalkSlowRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalDiagonalUpLeft_Step0,
+ MovementAction_WalkNormalDiagonalUpLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalDiagonalUpRight_Step0,
+ MovementAction_WalkNormalDiagonalUpRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalDiagonalDownLeft_Step0,
+ MovementAction_WalkNormalDiagonalDownLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalDiagonalDownRight_Step0,
+ MovementAction_WalkNormalDiagonalDownRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalDown_Step0,
+ MovementAction_WalkNormalDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalUp_Step0,
+ MovementAction_WalkNormalUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalLeft_Step0,
+ MovementAction_WalkNormalLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkNormalRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkNormalRight_Step0,
+ MovementAction_WalkNormalRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+const s16 gUnknown_0850DFBC[] = {0, 1, 1};
+const s16 gUnknown_0850DFC2[] = {0, 0, 1};
+
+u8 (*const gMovementActionFuncs_Jump2Down[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Jump2Down_Step0,
+ MovementAction_Jump2Down_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_Jump2Up[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Jump2Up_Step0,
+ MovementAction_Jump2Up_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_Jump2Left[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Jump2Left_Step0,
+ MovementAction_Jump2Left_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_Jump2Right[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Jump2Right_Step0,
+ MovementAction_Jump2Right_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_Delay1[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Delay1_Step0,
+ MovementAction_Delay_Step1,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_Delay2[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Delay2_Step0,
+ MovementAction_Delay_Step1,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_Delay4[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Delay4_Step0,
+ MovementAction_Delay_Step1,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_Delay8[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Delay8_Step0,
+ MovementAction_Delay_Step1,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_Delay16[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Delay16_Step0,
+ MovementAction_Delay_Step1,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastDown_Step0,
+ MovementAction_WalkFastDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastUp_Step0,
+ MovementAction_WalkFastUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastLeft_Step0,
+ MovementAction_WalkFastLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastRight_Step0,
+ MovementAction_WalkFastRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceSlowDown_Step0,
+ MovementAction_WalkInPlaceSlow_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceSlowUp_Step0,
+ MovementAction_WalkInPlaceSlow_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceSlowLeft_Step0,
+ MovementAction_WalkInPlaceSlow_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceSlowRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceSlowRight_Step0,
+ MovementAction_WalkInPlaceSlow_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceNormalDown_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceNormalUp_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceNormalLeft_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceNormalRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceNormalRight_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastDown_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastUp_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastLeft_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastRight_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastestDown_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastestUp_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastestLeft_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkInPlaceFastestRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkInPlaceFastestRight_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_RideWaterCurrentDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_RideWaterCurrentDown_Step0,
+ MovementAction_RideWaterCurrentDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_RideWaterCurrentUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_RideWaterCurrentUp_Step0,
+ MovementAction_RideWaterCurrentUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_RideWaterCurrentLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_RideWaterCurrentLeft_Step0,
+ MovementAction_RideWaterCurrentLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_RideWaterCurrentRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_RideWaterCurrentRight_Step0,
+ MovementAction_RideWaterCurrentRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastestDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastestDown_Step0,
+ MovementAction_WalkFastestDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastestUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastestUp_Step0,
+ MovementAction_WalkFastestUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastestLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastestLeft_Step0,
+ MovementAction_WalkFastestLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkFastestRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkFastestRight_Step0,
+ MovementAction_WalkFastestRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_SlideDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_SlideDown_Step0,
+ MovementAction_SlideDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_SlideUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_SlideUp_Step0,
+ MovementAction_SlideUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_SlideLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_SlideLeft_Step0,
+ MovementAction_SlideLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_SlideRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_SlideRight_Step0,
+ MovementAction_SlideRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_PlayerRunDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_PlayerRunDown_Step0,
+ MovementAction_PlayerRunDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_PlayerRunUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_PlayerRunUp_Step0,
+ MovementAction_PlayerRunUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_PlayerRunLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_PlayerRunLeft_Step0,
+ MovementAction_PlayerRunLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_PlayerRunRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_PlayerRunRight_Step0,
+ MovementAction_PlayerRunRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_StartAnimInDirection[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_StartAnimInDirection_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpSpecialDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpSpecialDown_Step0,
+ MovementAction_JumpSpecialDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpSpecialUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpSpecialUp_Step0,
+ MovementAction_JumpSpecialUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpSpecialLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpSpecialLeft_Step0,
+ MovementAction_JumpSpecialLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpSpecialRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpSpecialRight_Step0,
+ MovementAction_JumpSpecialRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_FacePlayer[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FacePlayer_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_FaceAwayPlayer[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FaceAwayPlayer_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_LockFacingDirection[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_LockFacingDirection_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_UnlockFacingDirection[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_UnlockFacingDirection_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpDown_Step0,
+ MovementAction_JumpDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpUp_Step0,
+ MovementAction_JumpUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpLeft_Step0,
+ MovementAction_JumpLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpRight_Step0,
+ MovementAction_JumpRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceDown_Step0,
+ MovementAction_JumpInPlaceDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceUp_Step0,
+ MovementAction_JumpInPlaceUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceLeft_Step0,
+ MovementAction_JumpInPlaceLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceRight_Step0,
+ MovementAction_JumpInPlaceRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceDownUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceDownUp_Step0,
+ MovementAction_JumpInPlaceDownUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceUpDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceUpDown_Step0,
+ MovementAction_JumpInPlaceUpDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceLeftRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceLeftRight_Step0,
+ MovementAction_JumpInPlaceLeftRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_JumpInPlaceRightLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_JumpInPlaceRightLeft_Step0,
+ MovementAction_JumpInPlaceRightLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_FaceOriginalDirection[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FaceOriginalDirection_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_NurseJoyBowDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_NurseJoyBowDown_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_EnableJumpLandingGroundEffect_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_DisableJumpLandingGroundEffect_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_DisableAnimation[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_DisableAnimation_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_RestoreAnimation[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_RestoreAnimation_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_SetInvisible[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_SetInvisible_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_SetVisible[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_SetVisible_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_EmoteExclamationMark[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_EmoteExclamationMark_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_EmoteQuestionMark[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_EmoteQuestionMark_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_EmoteHeart[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_EmoteHeart_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_RevealTrainer[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_RevealTrainer_Step0,
+ MovementAction_RevealTrainer_Step1,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_RockSmashBreak[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_RockSmashBreak_Step0,
+ MovementAction_RockSmashBreak_Step1,
+ MovementAction_RockSmashBreak_Step2,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_CutTree[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_CutTree_Step0,
+ MovementAction_CutTree_Step1,
+ MovementAction_CutTree_Step2,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_SetFixedPriority[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_SetFixedPriority_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_ClearFixedPriority[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_ClearFixedPriority_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_InitAffineAnim[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_InitAffineAnim_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_ClearAffineAnim[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_ClearAffineAnim_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_Unknown1[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Unknown1_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_Unknown2[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Unknown2_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_WalkDownStartAffine[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkDownStartAffine_Step0,
+ MovementAction_WalkDownStartAffine_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkDownAffine[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkDownAffine_Step0,
+ MovementAction_WalkDownAffine_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkLeftAffine[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkLeftAffine_Step0,
+ MovementAction_WalkLeftAffine_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_WalkRightAffine[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_WalkRightAffine_Step0,
+ MovementAction_WalkRightAffine_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieFaceDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieFaceDown_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieFaceUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieFaceUp_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieFaceLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieFaceLeft_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieFaceRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieFaceRight_Step0,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieDown_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieUp_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieLeft_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieRight_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieFaceDown_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieFaceUp_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieFaceLeft_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieFaceRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieFaceRight_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroUnusedAcroActionDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_UnusedAcroActionDown_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroUnusedAcroActionUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_UnusedAcroActionUp_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroUnusedAcroActionLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_UnusedAcroActionLeft_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroUnusedAcroActionRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_UnusedAcroActionRight_Step0,
+ MovementAction_WaitSpriteAnim,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_Figure8[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Figure8_Step0,
+ MovementAction_Figure8_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopFaceDown_Step0,
+ MovementAction_AcroWheelieHopFaceDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopFaceUp_Step0,
+ MovementAction_AcroWheelieHopFaceUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopFaceLeft_Step0,
+ MovementAction_AcroWheelieHopFaceLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopFaceRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopFaceRight_Step0,
+ MovementAction_AcroWheelieHopFaceRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopDown_Step0,
+ MovementAction_AcroWheelieHopDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopUp_Step0,
+ MovementAction_AcroWheelieHopUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopLeft_Step0,
+ MovementAction_AcroWheelieHopLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieHopRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieHopRight_Step0,
+ MovementAction_AcroWheelieHopRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieJumpDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieJumpDown_Step0,
+ MovementAction_AcroWheelieJumpDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieJumpUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieJumpUp_Step0,
+ MovementAction_AcroWheelieJumpUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieJumpLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieJumpLeft_Step0,
+ MovementAction_AcroWheelieJumpLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieJumpRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieJumpRight_Step0,
+ MovementAction_AcroWheelieJumpRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieInPlaceDown_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieInPlaceUp_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieInPlaceLeft_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieInPlaceRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieInPlaceRight_Step0,
+ MovementAction_WalkInPlace_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieMoveDown_Step0,
+ MovementAction_AcroPopWheelieMoveDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieMoveUp_Step0,
+ MovementAction_AcroPopWheelieMoveUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieMoveLeft_Step0,
+ MovementAction_AcroPopWheelieMoveLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroPopWheelieMoveRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroPopWheelieMoveRight_Step0,
+ MovementAction_AcroPopWheelieMoveRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieMoveDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieMoveDown_Step0,
+ MovementAction_AcroWheelieMoveDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieMoveUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieMoveUp_Step0,
+ MovementAction_AcroWheelieMoveUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieMoveLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieMoveLeft_Step0,
+ MovementAction_AcroWheelieMoveLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroWheelieMoveRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroWheelieMoveRight_Step0,
+ MovementAction_AcroWheelieMoveRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieMoveDown_Step0,
+ MovementAction_AcroEndWheelieMoveDown_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieMoveUp_Step0,
+ MovementAction_AcroEndWheelieMoveUp_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieMoveLeft_Step0,
+ MovementAction_AcroEndWheelieMoveLeft_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_AcroEndWheelieMoveRight[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_AcroEndWheelieMoveRight_Step0,
+ MovementAction_AcroEndWheelieMoveRight_Step1,
+ MovementAction_PauseSpriteAnim,
+};
+
+u8 (*const gMovementActionFuncs_Levitate[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_Levitate_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_StopLevitate[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_StopLevitate_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_DestroyExtraTaskIfAtTop_Step0,
+ MovementAction_Finish,
+};
+
+#endif //GUARD_MOVEMENT_ACTION_FUNC_TABLES_H
diff --git a/src/data/field_event_obj/movement_type_func_tables.h b/src/data/field_event_obj/movement_type_func_tables.h
new file mode 100755
index 000000000..165e96220
--- /dev/null
+++ b/src/data/field_event_obj/movement_type_func_tables.h
@@ -0,0 +1,443 @@
+#ifndef GUARD_MOVEMENT_TYPE_FUNC_TABLES_H
+#define GUARD_MOVEMENT_TYPE_FUNC_TABLES_H
+
+u8 (*const gMovementTypeFuncs_WanderAround[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WanderAround_Step0,
+ MovementType_WanderAround_Step1,
+ MovementType_WanderAround_Step2,
+ MovementType_WanderAround_Step3,
+ MovementType_WanderAround_Step4,
+ MovementType_WanderAround_Step5,
+ MovementType_WanderAround_Step6,
+};
+
+const u8 gStandardDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST};
+
+u8 (*const gGetVectorDirectionFuncs[])(s16, s16, s16, s16) = {
+ GetVectorDirection,
+ GetLimitedVectorDirection_SouthNorth,
+ GetLimitedVectorDirection_WestEast,
+ GetLimitedVectorDirection_WestNorth,
+ GetLimitedVectorDirection_EastNorth,
+ GetLimitedVectorDirection_WestSouth,
+ GetLimitedVectorDirection_EastSouth,
+ GetLimitedVectorDirection_SouthNorthWest,
+ GetLimitedVectorDirection_SouthNorthEast,
+ GetLimitedVectorDirection_NorthWestEast,
+ GetLimitedVectorDirection_SouthWestEast,
+};
+
+u8 (*const gMovementTypeFuncs_LookAround[])(struct EventObject *, struct Sprite *) = {
+ MovementType_LookAround_Step0,
+ MovementType_LookAround_Step1,
+ MovementType_LookAround_Step2,
+ MovementType_LookAround_Step3,
+ MovementType_LookAround_Step4,
+};
+
+u8 (*const gMovementTypeFuncs_WanderUpAndDown[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WanderUpAndDown_Step0,
+ MovementType_WanderUpAndDown_Step1,
+ MovementType_WanderUpAndDown_Step2,
+ MovementType_WanderUpAndDown_Step3,
+ MovementType_WanderUpAndDown_Step4,
+ MovementType_WanderUpAndDown_Step5,
+ MovementType_WanderUpAndDown_Step6,
+};
+
+const u8 gUpAndDownDirections[] = {DIR_SOUTH, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_WanderLeftAndRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WanderLeftAndRight_Step0,
+ MovementType_WanderLeftAndRight_Step1,
+ MovementType_WanderLeftAndRight_Step2,
+ MovementType_WanderLeftAndRight_Step3,
+ MovementType_WanderLeftAndRight_Step4,
+ MovementType_WanderLeftAndRight_Step5,
+ MovementType_WanderLeftAndRight_Step6,
+};
+
+const u8 gLeftAndRightDirections[] = {DIR_WEST, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_FaceDirection[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceDirection_Step0,
+ MovementType_FaceDirection_Step1,
+ MovementType_FaceDirection_Step2,
+};
+
+u8 (*const gMovementTypeFuncs_BerryTreeGrowth[])(struct EventObject *, struct Sprite *) = {
+ MovementType_BerryTreeGrowth_Step0,
+ MovementType_BerryTreeGrowth_Step1,
+ MovementType_BerryTreeGrowth_Step2,
+ MovementType_BerryTreeGrowth_Step3,
+ MovementType_BerryTreeGrowth_Step4,
+};
+
+u8 (*const gMovementTypeFuncs_FaceDownAndUp[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceDownAndUp_Step0,
+ MovementType_FaceDownAndUp_Step1,
+ MovementType_FaceDownAndUp_Step2,
+ MovementType_FaceDownAndUp_Step3,
+ MovementType_FaceDownAndUp_Step4,
+};
+
+u8 (*const gMovementTypeFuncs_FaceLeftAndRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceLeftAndRight_Step0,
+ MovementType_FaceLeftAndRight_Step1,
+ MovementType_FaceLeftAndRight_Step2,
+ MovementType_FaceLeftAndRight_Step3,
+ MovementType_FaceLeftAndRight_Step4,
+};
+
+u8 (*const gMovementTypeFuncs_FaceUpAndLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceUpAndLeft_Step0,
+ MovementType_FaceUpAndLeft_Step1,
+ MovementType_FaceUpAndLeft_Step2,
+ MovementType_FaceUpAndLeft_Step3,
+ MovementType_FaceUpAndLeft_Step4,
+};
+
+const u8 gUpAndLeftDirections[] = {DIR_NORTH, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_FaceUpAndRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceUpAndRight_Step0,
+ MovementType_FaceUpAndRight_Step1,
+ MovementType_FaceUpAndRight_Step2,
+ MovementType_FaceUpAndRight_Step3,
+ MovementType_FaceUpAndRight_Step4,
+};
+
+const u8 gUpAndRightDirections[] = {DIR_NORTH, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_FaceDownAndLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceDownAndLeft_Step0,
+ MovementType_FaceDownAndLeft_Step1,
+ MovementType_FaceDownAndLeft_Step2,
+ MovementType_FaceDownAndLeft_Step3,
+ MovementType_FaceDownAndLeft_Step4,
+};
+
+const u8 gDownAndLeftDirections[] = {DIR_SOUTH, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_FaceDownAndRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceDownAndRight_Step0,
+ MovementType_FaceDownAndRight_Step1,
+ MovementType_FaceDownAndRight_Step2,
+ MovementType_FaceDownAndRight_Step3,
+ MovementType_FaceDownAndRight_Step4,
+};
+
+const u8 gDownAndRightDirections[] = {DIR_SOUTH, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_FaceDownUpAndLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceDownUpAndLeft_Step0,
+ MovementType_FaceDownUpAndLeft_Step1,
+ MovementType_FaceDownUpAndLeft_Step2,
+ MovementType_FaceDownUpAndLeft_Step3,
+ MovementType_FaceDownUpAndLeft_Step4,
+};
+
+const u8 gDownUpAndLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_FaceDownUpAndRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceDownUpAndRight_Step0,
+ MovementType_FaceDownUpAndRight_Step1,
+ MovementType_FaceDownUpAndRight_Step2,
+ MovementType_FaceDownUpAndRight_Step3,
+ MovementType_FaceDownUpAndRight_Step4,
+};
+
+const u8 gDownUpAndRightDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_FaceUpLeftAndRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceUpLeftAndRight_Step0,
+ MovementType_FaceUpLeftAndRight_Step1,
+ MovementType_FaceUpLeftAndRight_Step2,
+ MovementType_FaceUpLeftAndRight_Step3,
+ MovementType_FaceUpLeftAndRight_Step4,
+};
+
+const u8 gUpLeftAndRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_FaceDownLeftAndRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_FaceDownLeftAndRight_Step0,
+ MovementType_FaceDownLeftAndRight_Step1,
+ MovementType_FaceDownLeftAndRight_Step2,
+ MovementType_FaceDownLeftAndRight_Step3,
+ MovementType_FaceDownLeftAndRight_Step4,
+};
+
+const u8 gDownLeftAndRightDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_RotateCounterclockwise[])(struct EventObject *, struct Sprite *) = {
+ MovementType_RotateCounterclockwise_Step0,
+ MovementType_RotateCounterclockwise_Step1,
+ MovementType_RotateCounterclockwise_Step2,
+ MovementType_RotateCounterclockwise_Step3,
+};
+
+const u8 gCounterclockwiseDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_RotateClockwise[])(struct EventObject *, struct Sprite *) = {
+ MovementType_RotateClockwise_Step0,
+ MovementType_RotateClockwise_Step1,
+ MovementType_RotateClockwise_Step2,
+ MovementType_RotateClockwise_Step3,
+};
+
+const u8 gClockwiseDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_WalkBackAndForth[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkBackAndForth_Step0,
+ MovementType_WalkBackAndForth_Step1,
+ MovementType_WalkBackAndForth_Step2,
+ MovementType_WalkBackAndForth_Step3,
+};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceUpRightLeftDown[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceUpRightLeftDown_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gUpRightLeftDownDirections[] = {DIR_NORTH, DIR_EAST, DIR_WEST, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceRightLeftDownUp[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceRightLeftDownUp_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gRightLeftDownUpDirections[] = {DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceDownUpRightLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceDownUpRightLeft_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gDownUpRightLeftDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceLeftDownUpRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceLeftDownUpRight_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gLeftDownUpRightDirections[] = {DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceUpLeftRightDown[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceUpLeftRightDown_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gUpLeftRightDownDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceLeftRightDownUp[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceLeftRightDownUp_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gLeftRightDownUpDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceDownUpLeftRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceDownUpLeftRight_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceRightDownUpLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceRightDownUpLeft_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gRightDownUpLeftDirections[] = {DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceLeftUpDownRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceLeftUpDownRight_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gLeftUpDownRightDirections[] = {DIR_WEST, DIR_NORTH, DIR_SOUTH, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceUpDownRightLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceUpDownRightLeft_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gUpDownRightLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceRightLeftUpDown[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceRightLeftUpDown_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gRightLeftUpDownDirections[] = {DIR_EAST, DIR_WEST, DIR_NORTH, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceDownRightLeftUp[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceDownRightLeftUp_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gDownRightLeftUpDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceRightUpDownLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceRightUpDownLeft_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gRightUpDownLeftDirections[] = {DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceUpDownLeftRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceUpDownLeftRight_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gUpDownLeftRightDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceLeftRightUpDown[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceLeftRightUpDown_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gLeftRightUpDownDirections[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceDownLeftRightUp[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceDownLeftRightUp_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gDownLeftRightUpDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceUpLeftDownRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceUpLeftDownRight_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gUpLeftDownRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceDownRightUpLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceDownRightUpLeft_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gDownRightUpLeftDirections[] = {DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceLeftDownRightUp[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceLeftDownRightUp_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gLeftDownRightUpDirections[] = {DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceRightUpLeftDown[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceRightUpLeftDown_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gRightUpLeftDownDirections[] = {DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceUpRightDownLeft[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceUpRightDownLeft_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gUpRightDownLeftDirections[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceDownLeftUpRight[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceDownLeftUpRight_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gDownLeftUpRightDirections[] = {DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceLeftUpRightDown[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceLeftUpRightDown_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gLeftUpRightDownDirections[] = {DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH};
+
+u8 (*const gMovementTypeFuncs_WalkSequenceRightDownLeftUp[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSequence_Step0,
+ MovementType_WalkSequenceRightDownLeftUp_Step1,
+ MovementType_WalkSequence_Step2,
+};
+
+const u8 gRightDownLeftUpDirections[] = {DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH};
+
+u8 (*const gMovementTypeFuncs_CopyPlayer[])(struct EventObject *, struct Sprite *) = {
+ MovementType_CopyPlayer_Step0,
+ MovementType_CopyPlayer_Step1,
+ MovementType_CopyPlayer_Step2,
+};
+
+bool8 (*const gCopyPlayerMovementFuncs[])(struct EventObject *, struct Sprite *, u8, bool8(u8)) = {
+ CopyablePlayerMovement_None,
+ CopyablePlayerMovement_FaceDirection,
+ CopyablePlayerMovement_GoSpeed0,
+ CopyablePlayerMovement_GoSpeed1,
+ CopyablePlayerMovement_GoSpeed2,
+ CopyablePlayerMovement_Slide,
+ cph_IM_DIFFERENT,
+ CopyablePlayerMovement_GoSpeed4,
+ CopyablePlayerMovement_Jump,
+ CopyablePlayerMovement_None,
+ CopyablePlayerMovement_None,
+};
+
+u8 (*const gMovementTypeFuncs_CopyPlayerInGrass[])(struct EventObject *, struct Sprite *) = {
+ MovementType_CopyPlayer_Step0,
+ MovementType_CopyPlayerInGrass_Step1,
+ MovementType_CopyPlayer_Step2,
+};
+
+u8 (*const gMovementTypeFuncs_Hidden[])(struct EventObject *, struct Sprite *) = {
+ MovementType_Hidden_Step0,
+};
+
+u8 (*const gMovementTypeFuncs_WalkInPlace[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkInPlace_Step0,
+ MovementType_MoveInPlace_Step1,
+};
+
+u8 (*const gMovementTypeFuncs_WalkSlowlyInPlace[])(struct EventObject *, struct Sprite *) = {
+ MovementType_WalkSlowlyInPlace_Step0,
+ MovementType_MoveInPlace_Step1,
+};
+
+u8 (*const gMovementTypeFuncs_JogInPlace[])(struct EventObject *, struct Sprite *) = {
+ MovementType_JogInPlace_Step0,
+ MovementType_MoveInPlace_Step1,
+};
+
+u8 (*const gMovementTypeFuncs_RunInPlace[])(struct EventObject *, struct Sprite *) = {
+ MovementType_RunInPlace_Step0,
+ MovementType_MoveInPlace_Step1,
+};
+
+u8 (*const gMovementTypeFuncs_Invisible[])(struct EventObject *, struct Sprite *) = {
+ MovementType_Invisible_Step0,
+ MovementType_Invisible_Step1,
+ MovementType_Invisible_Step2,
+};
+
+#endif //GUARD_MOVEMENT_TYPE_FUNC_TABLES_H
diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h
new file mode 100644
index 000000000..3df7c886b
--- /dev/null
+++ b/src/data/text/move_names.h
@@ -0,0 +1,357 @@
+const u8 gMoveNames[][13] = {
+ [MOVE_NONE] = _("-"),
+ [MOVE_POUND] = _("POUND"),
+ [MOVE_KARATE_CHOP] = _("KARATE CHOP"),
+ [MOVE_DOUBLE_SLAP] = _("DOUBLESLAP"),
+ [MOVE_COMET_PUNCH] = _("COMET PUNCH"),
+ [MOVE_MEGA_PUNCH] = _("MEGA PUNCH"),
+ [MOVE_PAY_DAY] = _("PAY DAY"),
+ [MOVE_FIRE_PUNCH] = _("FIRE PUNCH"),
+ [MOVE_ICE_PUNCH] = _("ICE PUNCH"),
+ [MOVE_THUNDER_PUNCH] = _("THUNDERPUNCH"),
+ [MOVE_SCRATCH] = _("SCRATCH"),
+ [MOVE_VICE_GRIP] = _("VICEGRIP"),
+ [MOVE_GUILLOTINE] = _("GUILLOTINE"),
+ [MOVE_RAZOR_WIND] = _("RAZOR WIND"),
+ [MOVE_SWORDS_DANCE] = _("SWORDS DANCE"),
+ [MOVE_CUT] = _("CUT"),
+ [MOVE_GUST] = _("GUST"),
+ [MOVE_WING_ATTACK] = _("WING ATTACK"),
+ [MOVE_WHIRLWIND] = _("WHIRLWIND"),
+ [MOVE_FLY] = _("FLY"),
+ [MOVE_BIND] = _("BIND"),
+ [MOVE_SLAM] = _("SLAM"),
+ [MOVE_VINE_WHIP] = _("VINE WHIP"),
+ [MOVE_STOMP] = _("STOMP"),
+ [MOVE_DOUBLE_KICK] = _("DOUBLE KICK"),
+ [MOVE_MEGA_KICK] = _("MEGA KICK"),
+ [MOVE_JUMP_KICK] = _("JUMP KICK"),
+ [MOVE_ROLLING_KICK] = _("ROLLING KICK"),
+ [MOVE_SAND_ATTACK] = _("SAND-ATTACK"),
+ [MOVE_HEADBUTT] = _("HEADBUTT"),
+ [MOVE_HORN_ATTACK] = _("HORN ATTACK"),
+ [MOVE_FURY_ATTACK] = _("FURY ATTACK"),
+ [MOVE_HORN_DRILL] = _("HORN DRILL"),
+ [MOVE_TACKLE] = _("TACKLE"),
+ [MOVE_BODY_SLAM] = _("BODY SLAM"),
+ [MOVE_WRAP] = _("WRAP"),
+ [MOVE_TAKE_DOWN] = _("TAKE DOWN"),
+ [MOVE_THRASH] = _("THRASH"),
+ [MOVE_DOUBLE_EDGE] = _("DOUBLE-EDGE"),
+ [MOVE_TAIL_WHIP] = _("TAIL WHIP"),
+ [MOVE_POISON_STING] = _("POISON STING"),
+ [MOVE_TWINEEDLE] = _("TWINEEDLE"),
+ [MOVE_PIN_MISSILE] = _("PIN MISSILE"),
+ [MOVE_LEER] = _("LEER"),
+ [MOVE_BITE] = _("BITE"),
+ [MOVE_GROWL] = _("GROWL"),
+ [MOVE_ROAR] = _("ROAR"),
+ [MOVE_SING] = _("SING"),
+ [MOVE_SUPERSONIC] = _("SUPERSONIC"),
+ [MOVE_SONIC_BOOM] = _("SONICBOOM"),
+ [MOVE_DISABLE] = _("DISABLE"),
+ [MOVE_ACID] = _("ACID"),
+ [MOVE_EMBER] = _("EMBER"),
+ [MOVE_FLAMETHROWER] = _("FLAMETHROWER"),
+ [MOVE_MIST] = _("MIST"),
+ [MOVE_WATER_GUN] = _("WATER GUN"),
+ [MOVE_HYDRO_PUMP] = _("HYDRO PUMP"),
+ [MOVE_SURF] = _("SURF"),
+ [MOVE_ICE_BEAM] = _("ICE BEAM"),
+ [MOVE_BLIZZARD] = _("BLIZZARD"),
+ [MOVE_PSYBEAM] = _("PSYBEAM"),
+ [MOVE_BUBBLE_BEAM] = _("BUBBLEBEAM"),
+ [MOVE_AURORA_BEAM] = _("AURORA BEAM"),
+ [MOVE_HYPER_BEAM] = _("HYPER BEAM"),
+ [MOVE_PECK] = _("PECK"),
+ [MOVE_DRILL_PECK] = _("DRILL PECK"),
+ [MOVE_SUBMISSION] = _("SUBMISSION"),
+ [MOVE_LOW_KICK] = _("LOW KICK"),
+ [MOVE_COUNTER] = _("COUNTER"),
+ [MOVE_SEISMIC_TOSS] = _("SEISMIC TOSS"),
+ [MOVE_STRENGTH] = _("STRENGTH"),
+ [MOVE_ABSORB] = _("ABSORB"),
+ [MOVE_MEGA_DRAIN] = _("MEGA DRAIN"),
+ [MOVE_LEECH_SEED] = _("LEECH SEED"),
+ [MOVE_GROWTH] = _("GROWTH"),
+ [MOVE_RAZOR_LEAF] = _("RAZOR LEAF"),
+ [MOVE_SOLAR_BEAM] = _("SOLARBEAM"),
+ [MOVE_POISON_POWDER] = _("POISONPOWDER"),
+ [MOVE_STUN_SPORE] = _("STUN SPORE"),
+ [MOVE_SLEEP_POWDER] = _("SLEEP POWDER"),
+ [MOVE_PETAL_DANCE] = _("PETAL DANCE"),
+ [MOVE_STRING_SHOT] = _("STRING SHOT"),
+ [MOVE_DRAGON_RAGE] = _("DRAGON RAGE"),
+ [MOVE_FIRE_SPIN] = _("FIRE SPIN"),
+ [MOVE_THUNDER_SHOCK] = _("THUNDERSHOCK"),
+ [MOVE_THUNDERBOLT] = _("THUNDERBOLT"),
+ [MOVE_THUNDER_WAVE] = _("THUNDER WAVE"),
+ [MOVE_THUNDER] = _("THUNDER"),
+ [MOVE_ROCK_THROW] = _("ROCK THROW"),
+ [MOVE_EARTHQUAKE] = _("EARTHQUAKE"),
+ [MOVE_FISSURE] = _("FISSURE"),
+ [MOVE_DIG] = _("DIG"),
+ [MOVE_TOXIC] = _("TOXIC"),
+ [MOVE_CONFUSION] = _("CONFUSION"),
+ [MOVE_PSYCHIC] = _("PSYCHIC"),
+ [MOVE_HYPNOSIS] = _("HYPNOSIS"),
+ [MOVE_MEDITATE] = _("MEDITATE"),
+ [MOVE_AGILITY] = _("AGILITY"),
+ [MOVE_QUICK_ATTACK] = _("QUICK ATTACK"),
+ [MOVE_RAGE] = _("RAGE"),
+ [MOVE_TELEPORT] = _("TELEPORT"),
+ [MOVE_NIGHT_SHADE] = _("NIGHT SHADE"),
+ [MOVE_MIMIC] = _("MIMIC"),
+ [MOVE_SCREECH] = _("SCREECH"),
+ [MOVE_DOUBLE_TEAM] = _("DOUBLE TEAM"),
+ [MOVE_RECOVER] = _("RECOVER"),
+ [MOVE_HARDEN] = _("HARDEN"),
+ [MOVE_MINIMIZE] = _("MINIMIZE"),
+ [MOVE_SMOKESCREEN] = _("SMOKESCREEN"),
+ [MOVE_CONFUSE_RAY] = _("CONFUSE RAY"),
+ [MOVE_WITHDRAW] = _("WITHDRAW"),
+ [MOVE_DEFENSE_CURL] = _("DEFENSE CURL"),
+ [MOVE_BARRIER] = _("BARRIER"),
+ [MOVE_LIGHT_SCREEN] = _("LIGHT SCREEN"),
+ [MOVE_HAZE] = _("HAZE"),
+ [MOVE_REFLECT] = _("REFLECT"),
+ [MOVE_FOCUS_ENERGY] = _("FOCUS ENERGY"),
+ [MOVE_BIDE] = _("BIDE"),
+ [MOVE_METRONOME] = _("METRONOME"),
+ [MOVE_MIRROR_MOVE] = _("MIRROR MOVE"),
+ [MOVE_SELF_DESTRUCT] = _("SELFDESTRUCT"),
+ [MOVE_EGG_BOMB] = _("EGG BOMB"),
+ [MOVE_LICK] = _("LICK"),
+ [MOVE_SMOG] = _("SMOG"),
+ [MOVE_SLUDGE] = _("SLUDGE"),
+ [MOVE_BONE_CLUB] = _("BONE CLUB"),
+ [MOVE_FIRE_BLAST] = _("FIRE BLAST"),
+ [MOVE_WATERFALL] = _("WATERFALL"),
+ [MOVE_CLAMP] = _("CLAMP"),
+ [MOVE_SWIFT] = _("SWIFT"),
+ [MOVE_SKULL_BASH] = _("SKULL BASH"),
+ [MOVE_SPIKE_CANNON] = _("SPIKE CANNON"),
+ [MOVE_CONSTRICT] = _("CONSTRICT"),
+ [MOVE_AMNESIA] = _("AMNESIA"),
+ [MOVE_KINESIS] = _("KINESIS"),
+ [MOVE_SOFT_BOILED] = _("SOFTBOILED"),
+ [MOVE_HI_JUMP_KICK] = _("HI JUMP KICK"),
+ [MOVE_GLARE] = _("GLARE"),
+ [MOVE_DREAM_EATER] = _("DREAM EATER"),
+ [MOVE_POISON_GAS] = _("POISON GAS"),
+ [MOVE_BARRAGE] = _("BARRAGE"),
+ [MOVE_LEECH_LIFE] = _("LEECH LIFE"),
+ [MOVE_LOVELY_KISS] = _("LOVELY KISS"),
+ [MOVE_SKY_ATTACK] = _("SKY ATTACK"),
+ [MOVE_TRANSFORM] = _("TRANSFORM"),
+ [MOVE_BUBBLE] = _("BUBBLE"),
+ [MOVE_DIZZY_PUNCH] = _("DIZZY PUNCH"),
+ [MOVE_SPORE] = _("SPORE"),
+ [MOVE_FLASH] = _("FLASH"),
+ [MOVE_PSYWAVE] = _("PSYWAVE"),
+ [MOVE_SPLASH] = _("SPLASH"),
+ [MOVE_ACID_ARMOR] = _("ACID ARMOR"),
+ [MOVE_CRABHAMMER] = _("CRABHAMMER"),
+ [MOVE_EXPLOSION] = _("EXPLOSION"),
+ [MOVE_FURY_SWIPES] = _("FURY SWIPES"),
+ [MOVE_BONEMERANG] = _("BONEMERANG"),
+ [MOVE_REST] = _("REST"),
+ [MOVE_ROCK_SLIDE] = _("ROCK SLIDE"),
+ [MOVE_HYPER_FANG] = _("HYPER FANG"),
+ [MOVE_SHARPEN] = _("SHARPEN"),
+ [MOVE_CONVERSION] = _("CONVERSION"),
+ [MOVE_TRI_ATTACK] = _("TRI ATTACK"),
+ [MOVE_SUPER_FANG] = _("SUPER FANG"),
+ [MOVE_SLASH] = _("SLASH"),
+ [MOVE_SUBSTITUTE] = _("SUBSTITUTE"),
+ [MOVE_STRUGGLE] = _("STRUGGLE"),
+ [MOVE_SKETCH] = _("SKETCH"),
+ [MOVE_TRIPLE_KICK] = _("TRIPLE KICK"),
+ [MOVE_THIEF] = _("THIEF"),
+ [MOVE_SPIDER_WEB] = _("SPIDER WEB"),
+ [MOVE_MIND_READER] = _("MIND READER"),
+ [MOVE_NIGHTMARE] = _("NIGHTMARE"),
+ [MOVE_FLAME_WHEEL] = _("FLAME WHEEL"),
+ [MOVE_SNORE] = _("SNORE"),
+ [MOVE_CURSE] = _("CURSE"),
+ [MOVE_FLAIL] = _("FLAIL"),
+ [MOVE_CONVERSION_2] = _("CONVERSION 2"),
+ [MOVE_AEROBLAST] = _("AEROBLAST"),
+ [MOVE_COTTON_SPORE] = _("COTTON SPORE"),
+ [MOVE_REVERSAL] = _("REVERSAL"),
+ [MOVE_SPITE] = _("SPITE"),
+ [MOVE_POWDER_SNOW] = _("POWDER SNOW"),
+ [MOVE_PROTECT] = _("PROTECT"),
+ [MOVE_MACH_PUNCH] = _("MACH PUNCH"),
+ [MOVE_SCARY_FACE] = _("SCARY FACE"),
+ [MOVE_FAINT_ATTACK] = _("FAINT ATTACK"),
+ [MOVE_SWEET_KISS] = _("SWEET KISS"),
+ [MOVE_BELLY_DRUM] = _("BELLY DRUM"),
+ [MOVE_SLUDGE_BOMB] = _("SLUDGE BOMB"),
+ [MOVE_MUD_SLAP] = _("MUD-SLAP"),
+ [MOVE_OCTAZOOKA] = _("OCTAZOOKA"),
+ [MOVE_SPIKES] = _("SPIKES"),
+ [MOVE_ZAP_CANNON] = _("ZAP CANNON"),
+ [MOVE_FORESIGHT] = _("FORESIGHT"),
+ [MOVE_DESTINY_BOND] = _("DESTINY BOND"),
+ [MOVE_PERISH_SONG] = _("PERISH SONG"),
+ [MOVE_ICY_WIND] = _("ICY WIND"),
+ [MOVE_DETECT] = _("DETECT"),
+ [MOVE_BONE_RUSH] = _("BONE RUSH"),
+ [MOVE_LOCK_ON] = _("LOCK-ON"),
+ [MOVE_OUTRAGE] = _("OUTRAGE"),
+ [MOVE_SANDSTORM] = _("SANDSTORM"),
+ [MOVE_GIGA_DRAIN] = _("GIGA DRAIN"),
+ [MOVE_ENDURE] = _("ENDURE"),
+ [MOVE_CHARM] = _("CHARM"),
+ [MOVE_ROLLOUT] = _("ROLLOUT"),
+ [MOVE_FALSE_SWIPE] = _("FALSE SWIPE"),
+ [MOVE_SWAGGER] = _("SWAGGER"),
+ [MOVE_MILK_DRINK] = _("MILK DRINK"),
+ [MOVE_SPARK] = _("SPARK"),
+ [MOVE_FURY_CUTTER] = _("FURY CUTTER"),
+ [MOVE_STEEL_WING] = _("STEEL WING"),
+ [MOVE_MEAN_LOOK] = _("MEAN LOOK"),
+ [MOVE_ATTRACT] = _("ATTRACT"),
+ [MOVE_SLEEP_TALK] = _("SLEEP TALK"),
+ [MOVE_HEAL_BELL] = _("HEAL BELL"),
+ [MOVE_RETURN] = _("RETURN"),
+ [MOVE_PRESENT] = _("PRESENT"),
+ [MOVE_FRUSTRATION] = _("FRUSTRATION"),
+ [MOVE_SAFEGUARD] = _("SAFEGUARD"),
+ [MOVE_PAIN_SPLIT] = _("PAIN SPLIT"),
+ [MOVE_SACRED_FIRE] = _("SACRED FIRE"),
+ [MOVE_MAGNITUDE] = _("MAGNITUDE"),
+ [MOVE_DYNAMIC_PUNCH] = _("DYNAMICPUNCH"),
+ [MOVE_MEGAHORN] = _("MEGAHORN"),
+ [MOVE_DRAGON_BREATH] = _("DRAGONBREATH"),
+ [MOVE_BATON_PASS] = _("BATON PASS"),
+ [MOVE_ENCORE] = _("ENCORE"),
+ [MOVE_PURSUIT] = _("PURSUIT"),
+ [MOVE_RAPID_SPIN] = _("RAPID SPIN"),
+ [MOVE_SWEET_SCENT] = _("SWEET SCENT"),
+ [MOVE_IRON_TAIL] = _("IRON TAIL"),
+ [MOVE_METAL_CLAW] = _("METAL CLAW"),
+ [MOVE_VITAL_THROW] = _("VITAL THROW"),
+ [MOVE_MORNING_SUN] = _("MORNING SUN"),
+ [MOVE_SYNTHESIS] = _("SYNTHESIS"),
+ [MOVE_MOONLIGHT] = _("MOONLIGHT"),
+ [MOVE_HIDDEN_POWER] = _("HIDDEN POWER"),
+ [MOVE_CROSS_CHOP] = _("CROSS CHOP"),
+ [MOVE_TWISTER] = _("TWISTER"),
+ [MOVE_RAIN_DANCE] = _("RAIN DANCE"),
+ [MOVE_SUNNY_DAY] = _("SUNNY DAY"),
+ [MOVE_CRUNCH] = _("CRUNCH"),
+ [MOVE_MIRROR_COAT] = _("MIRROR COAT"),
+ [MOVE_PSYCH_UP] = _("PSYCH UP"),
+ [MOVE_EXTREME_SPEED] = _("EXTREMESPEED"),
+ [MOVE_ANCIENT_POWER] = _("ANCIENTPOWER"),
+ [MOVE_SHADOW_BALL] = _("SHADOW BALL"),
+ [MOVE_FUTURE_SIGHT] = _("FUTURE SIGHT"),
+ [MOVE_ROCK_SMASH] = _("ROCK SMASH"),
+ [MOVE_WHIRLPOOL] = _("WHIRLPOOL"),
+ [MOVE_BEAT_UP] = _("BEAT UP"),
+ [MOVE_FAKE_OUT] = _("FAKE OUT"),
+ [MOVE_UPROAR] = _("UPROAR"),
+ [MOVE_STOCKPILE] = _("STOCKPILE"),
+ [MOVE_SPIT_UP] = _("SPIT UP"),
+ [MOVE_SWALLOW] = _("SWALLOW"),
+ [MOVE_HEAT_WAVE] = _("HEAT WAVE"),
+ [MOVE_HAIL] = _("HAIL"),
+ [MOVE_TORMENT] = _("TORMENT"),
+ [MOVE_FLATTER] = _("FLATTER"),
+ [MOVE_WILL_O_WISP] = _("WILL-O-WISP"),
+ [MOVE_MEMENTO] = _("MEMENTO"),
+ [MOVE_FACADE] = _("FACADE"),
+ [MOVE_FOCUS_PUNCH] = _("FOCUS PUNCH"),
+ [MOVE_SMELLING_SALT] = _("SMELLINGSALT"),
+ [MOVE_FOLLOW_ME] = _("FOLLOW ME"),
+ [MOVE_NATURE_POWER] = _("NATURE POWER"),
+ [MOVE_CHARGE] = _("CHARGE"),
+ [MOVE_TAUNT] = _("TAUNT"),
+ [MOVE_HELPING_HAND] = _("HELPING HAND"),
+ [MOVE_TRICK] = _("TRICK"),
+ [MOVE_ROLE_PLAY] = _("ROLE PLAY"),
+ [MOVE_WISH] = _("WISH"),
+ [MOVE_ASSIST] = _("ASSIST"),
+ [MOVE_INGRAIN] = _("INGRAIN"),
+ [MOVE_SUPERPOWER] = _("SUPERPOWER"),
+ [MOVE_MAGIC_COAT] = _("MAGIC COAT"),
+ [MOVE_RECYCLE] = _("RECYCLE"),
+ [MOVE_REVENGE] = _("REVENGE"),
+ [MOVE_BRICK_BREAK] = _("BRICK BREAK"),
+ [MOVE_YAWN] = _("YAWN"),
+ [MOVE_KNOCK_OFF] = _("KNOCK OFF"),
+ [MOVE_ENDEAVOR] = _("ENDEAVOR"),
+ [MOVE_ERUPTION] = _("ERUPTION"),
+ [MOVE_SKILL_SWAP] = _("SKILL SWAP"),
+ [MOVE_IMPRISON] = _("IMPRISON"),
+ [MOVE_REFRESH] = _("REFRESH"),
+ [MOVE_GRUDGE] = _("GRUDGE"),
+ [MOVE_SNATCH] = _("SNATCH"),
+ [MOVE_SECRET_POWER] = _("SECRET POWER"),
+ [MOVE_DIVE] = _("DIVE"),
+ [MOVE_ARM_THRUST] = _("ARM THRUST"),
+ [MOVE_CAMOUFLAGE] = _("CAMOUFLAGE"),
+ [MOVE_TAIL_GLOW] = _("TAIL GLOW"),
+ [MOVE_LUSTER_PURGE] = _("LUSTER PURGE"),
+ [MOVE_MIST_BALL] = _("MIST BALL"),
+ [MOVE_FEATHER_DANCE] = _("FEATHERDANCE"),
+ [MOVE_TEETER_DANCE] = _("TEETER DANCE"),
+ [MOVE_BLAZE_KICK] = _("BLAZE KICK"),
+ [MOVE_MUD_SPORT] = _("MUD SPORT"),
+ [MOVE_ICE_BALL] = _("ICE BALL"),
+ [MOVE_NEEDLE_ARM] = _("NEEDLE ARM"),
+ [MOVE_SLACK_OFF] = _("SLACK OFF"),
+ [MOVE_HYPER_VOICE] = _("HYPER VOICE"),
+ [MOVE_POISON_FANG] = _("POISON FANG"),
+ [MOVE_CRUSH_CLAW] = _("CRUSH CLAW"),
+ [MOVE_BLAST_BURN] = _("BLAST BURN"),
+ [MOVE_HYDRO_CANNON] = _("HYDRO CANNON"),
+ [MOVE_METEOR_MASH] = _("METEOR MASH"),
+ [MOVE_ASTONISH] = _("ASTONISH"),
+ [MOVE_WEATHER_BALL] = _("WEATHER BALL"),
+ [MOVE_AROMATHERAPY] = _("AROMATHERAPY"),
+ [MOVE_FAKE_TEARS] = _("FAKE TEARS"),
+ [MOVE_AIR_CUTTER] = _("AIR CUTTER"),
+ [MOVE_OVERHEAT] = _("OVERHEAT"),
+ [MOVE_ODOR_SLEUTH] = _("ODOR SLEUTH"),
+ [MOVE_ROCK_TOMB] = _("ROCK TOMB"),
+ [MOVE_SILVER_WIND] = _("SILVER WIND"),
+ [MOVE_METAL_SOUND] = _("METAL SOUND"),
+ [MOVE_GRASS_WHISTLE] = _("GRASSWHISTLE"),
+ [MOVE_TICKLE] = _("TICKLE"),
+ [MOVE_COSMIC_POWER] = _("COSMIC POWER"),
+ [MOVE_WATER_SPOUT] = _("WATER SPOUT"),
+ [MOVE_SIGNAL_BEAM] = _("SIGNAL BEAM"),
+ [MOVE_SHADOW_PUNCH] = _("SHADOW PUNCH"),
+ [MOVE_EXTRASENSORY] = _("EXTRASENSORY"),
+ [MOVE_SKY_UPPERCUT] = _("SKY UPPERCUT"),
+ [MOVE_SAND_TOMB] = _("SAND TOMB"),
+ [MOVE_SHEER_COLD] = _("SHEER COLD"),
+ [MOVE_MUDDY_WATER] = _("MUDDY WATER"),
+ [MOVE_BULLET_SEED] = _("BULLET SEED"),
+ [MOVE_AERIAL_ACE] = _("AERIAL ACE"),
+ [MOVE_ICICLE_SPEAR] = _("ICICLE SPEAR"),
+ [MOVE_IRON_DEFENSE] = _("IRON DEFENSE"),
+ [MOVE_BLOCK] = _("BLOCK"),
+ [MOVE_HOWL] = _("HOWL"),
+ [MOVE_DRAGON_CLAW] = _("DRAGON CLAW"),
+ [MOVE_FRENZY_PLANT] = _("FRENZY PLANT"),
+ [MOVE_BULK_UP] = _("BULK UP"),
+ [MOVE_BOUNCE] = _("BOUNCE"),
+ [MOVE_MUD_SHOT] = _("MUD SHOT"),
+ [MOVE_POISON_TAIL] = _("POISON TAIL"),
+ [MOVE_COVET] = _("COVET"),
+ [MOVE_VOLT_TACKLE] = _("VOLT TACKLE"),
+ [MOVE_MAGICAL_LEAF] = _("MAGICAL LEAF"),
+ [MOVE_WATER_SPORT] = _("WATER SPORT"),
+ [MOVE_CALM_MIND] = _("CALM MIND"),
+ [MOVE_LEAF_BLADE] = _("LEAF BLADE"),
+ [MOVE_DRAGON_DANCE] = _("DRAGON DANCE"),
+ [MOVE_ROCK_BLAST] = _("ROCK BLAST"),
+ [MOVE_SHOCK_WAVE] = _("SHOCK WAVE"),
+ [MOVE_WATER_PULSE] = _("WATER PULSE"),
+ [MOVE_DOOM_DESIRE] = _("DOOM DESIRE"),
+ [MOVE_PSYCHO_BOOST] = _("PSYCHO BOOST"),
+};
diff --git a/src/data/text/species_names.h b/src/data/text/species_names.h
new file mode 100644
index 000000000..840beb22b
--- /dev/null
+++ b/src/data/text/species_names.h
@@ -0,0 +1,414 @@
+const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = {
+ [SPECIES_NONE] = _("??????????"),
+ [SPECIES_BULBASAUR] = _("BULBASAUR"),
+ [SPECIES_IVYSAUR] = _("IVYSAUR"),
+ [SPECIES_VENUSAUR] = _("VENUSAUR"),
+ [SPECIES_CHARMANDER] = _("CHARMANDER"),
+ [SPECIES_CHARMELEON] = _("CHARMELEON"),
+ [SPECIES_CHARIZARD] = _("CHARIZARD"),
+ [SPECIES_SQUIRTLE] = _("SQUIRTLE"),
+ [SPECIES_WARTORTLE] = _("WARTORTLE"),
+ [SPECIES_BLASTOISE] = _("BLASTOISE"),
+ [SPECIES_CATERPIE] = _("CATERPIE"),
+ [SPECIES_METAPOD] = _("METAPOD"),
+ [SPECIES_BUTTERFREE] = _("BUTTERFREE"),
+ [SPECIES_WEEDLE] = _("WEEDLE"),
+ [SPECIES_KAKUNA] = _("KAKUNA"),
+ [SPECIES_BEEDRILL] = _("BEEDRILL"),
+ [SPECIES_PIDGEY] = _("PIDGEY"),
+ [SPECIES_PIDGEOTTO] = _("PIDGEOTTO"),
+ [SPECIES_PIDGEOT] = _("PIDGEOT"),
+ [SPECIES_RATTATA] = _("RATTATA"),
+ [SPECIES_RATICATE] = _("RATICATE"),
+ [SPECIES_SPEAROW] = _("SPEAROW"),
+ [SPECIES_FEAROW] = _("FEAROW"),
+ [SPECIES_EKANS] = _("EKANS"),
+ [SPECIES_ARBOK] = _("ARBOK"),
+ [SPECIES_PIKACHU] = _("PIKACHU"),
+ [SPECIES_RAICHU] = _("RAICHU"),
+ [SPECIES_SANDSHREW] = _("SANDSHREW"),
+ [SPECIES_SANDSLASH] = _("SANDSLASH"),
+ [SPECIES_NIDORAN_F] = _("NIDORAN♀"),
+ [SPECIES_NIDORINA] = _("NIDORINA"),
+ [SPECIES_NIDOQUEEN] = _("NIDOQUEEN"),
+ [SPECIES_NIDORAN_M] = _("NIDORAN♂"),
+ [SPECIES_NIDORINO] = _("NIDORINO"),
+ [SPECIES_NIDOKING] = _("NIDOKING"),
+ [SPECIES_CLEFAIRY] = _("CLEFAIRY"),
+ [SPECIES_CLEFABLE] = _("CLEFABLE"),
+ [SPECIES_VULPIX] = _("VULPIX"),
+ [SPECIES_NINETALES] = _("NINETALES"),
+ [SPECIES_JIGGLYPUFF] = _("JIGGLYPUFF"),
+ [SPECIES_WIGGLYTUFF] = _("WIGGLYTUFF"),
+ [SPECIES_ZUBAT] = _("ZUBAT"),
+ [SPECIES_GOLBAT] = _("GOLBAT"),
+ [SPECIES_ODDISH] = _("ODDISH"),
+ [SPECIES_GLOOM] = _("GLOOM"),
+ [SPECIES_VILEPLUME] = _("VILEPLUME"),
+ [SPECIES_PARAS] = _("PARAS"),
+ [SPECIES_PARASECT] = _("PARASECT"),
+ [SPECIES_VENONAT] = _("VENONAT"),
+ [SPECIES_VENOMOTH] = _("VENOMOTH"),
+ [SPECIES_DIGLETT] = _("DIGLETT"),
+ [SPECIES_DUGTRIO] = _("DUGTRIO"),
+ [SPECIES_MEOWTH] = _("MEOWTH"),
+ [SPECIES_PERSIAN] = _("PERSIAN"),
+ [SPECIES_PSYDUCK] = _("PSYDUCK"),
+ [SPECIES_GOLDUCK] = _("GOLDUCK"),
+ [SPECIES_MANKEY] = _("MANKEY"),
+ [SPECIES_PRIMEAPE] = _("PRIMEAPE"),
+ [SPECIES_GROWLITHE] = _("GROWLITHE"),
+ [SPECIES_ARCANINE] = _("ARCANINE"),
+ [SPECIES_POLIWAG] = _("POLIWAG"),
+ [SPECIES_POLIWHIRL] = _("POLIWHIRL"),
+ [SPECIES_POLIWRATH] = _("POLIWRATH"),
+ [SPECIES_ABRA] = _("ABRA"),
+ [SPECIES_KADABRA] = _("KADABRA"),
+ [SPECIES_ALAKAZAM] = _("ALAKAZAM"),
+ [SPECIES_MACHOP] = _("MACHOP"),
+ [SPECIES_MACHOKE] = _("MACHOKE"),
+ [SPECIES_MACHAMP] = _("MACHAMP"),
+ [SPECIES_BELLSPROUT] = _("BELLSPROUT"),
+ [SPECIES_WEEPINBELL] = _("WEEPINBELL"),
+ [SPECIES_VICTREEBEL] = _("VICTREEBEL"),
+ [SPECIES_TENTACOOL] = _("TENTACOOL"),
+ [SPECIES_TENTACRUEL] = _("TENTACRUEL"),
+ [SPECIES_GEODUDE] = _("GEODUDE"),
+ [SPECIES_GRAVELER] = _("GRAVELER"),
+ [SPECIES_GOLEM] = _("GOLEM"),
+ [SPECIES_PONYTA] = _("PONYTA"),
+ [SPECIES_RAPIDASH] = _("RAPIDASH"),
+ [SPECIES_SLOWPOKE] = _("SLOWPOKE"),
+ [SPECIES_SLOWBRO] = _("SLOWBRO"),
+ [SPECIES_MAGNEMITE] = _("MAGNEMITE"),
+ [SPECIES_MAGNETON] = _("MAGNETON"),
+ [SPECIES_FARFETCHD] = _("FARFETCH’D"),
+ [SPECIES_DODUO] = _("DODUO"),
+ [SPECIES_DODRIO] = _("DODRIO"),
+ [SPECIES_SEEL] = _("SEEL"),
+ [SPECIES_DEWGONG] = _("DEWGONG"),
+ [SPECIES_GRIMER] = _("GRIMER"),
+ [SPECIES_MUK] = _("MUK"),
+ [SPECIES_SHELLDER] = _("SHELLDER"),
+ [SPECIES_CLOYSTER] = _("CLOYSTER"),
+ [SPECIES_GASTLY] = _("GASTLY"),
+ [SPECIES_HAUNTER] = _("HAUNTER"),
+ [SPECIES_GENGAR] = _("GENGAR"),
+ [SPECIES_ONIX] = _("ONIX"),
+ [SPECIES_DROWZEE] = _("DROWZEE"),
+ [SPECIES_HYPNO] = _("HYPNO"),
+ [SPECIES_KRABBY] = _("KRABBY"),
+ [SPECIES_KINGLER] = _("KINGLER"),
+ [SPECIES_VOLTORB] = _("VOLTORB"),
+ [SPECIES_ELECTRODE] = _("ELECTRODE"),
+ [SPECIES_EXEGGCUTE] = _("EXEGGCUTE"),
+ [SPECIES_EXEGGUTOR] = _("EXEGGUTOR"),
+ [SPECIES_CUBONE] = _("CUBONE"),
+ [SPECIES_MAROWAK] = _("MAROWAK"),
+ [SPECIES_HITMONLEE] = _("HITMONLEE"),
+ [SPECIES_HITMONCHAN] = _("HITMONCHAN"),
+ [SPECIES_LICKITUNG] = _("LICKITUNG"),
+ [SPECIES_KOFFING] = _("KOFFING"),
+ [SPECIES_WEEZING] = _("WEEZING"),
+ [SPECIES_RHYHORN] = _("RHYHORN"),
+ [SPECIES_RHYDON] = _("RHYDON"),
+ [SPECIES_CHANSEY] = _("CHANSEY"),
+ [SPECIES_TANGELA] = _("TANGELA"),
+ [SPECIES_KANGASKHAN] = _("KANGASKHAN"),
+ [SPECIES_HORSEA] = _("HORSEA"),
+ [SPECIES_SEADRA] = _("SEADRA"),
+ [SPECIES_GOLDEEN] = _("GOLDEEN"),
+ [SPECIES_SEAKING] = _("SEAKING"),
+ [SPECIES_STARYU] = _("STARYU"),
+ [SPECIES_STARMIE] = _("STARMIE"),
+ [SPECIES_MR_MIME] = _("MR. MIME"),
+ [SPECIES_SCYTHER] = _("SCYTHER"),
+ [SPECIES_JYNX] = _("JYNX"),
+ [SPECIES_ELECTABUZZ] = _("ELECTABUZZ"),
+ [SPECIES_MAGMAR] = _("MAGMAR"),
+ [SPECIES_PINSIR] = _("PINSIR"),
+ [SPECIES_TAUROS] = _("TAUROS"),
+ [SPECIES_MAGIKARP] = _("MAGIKARP"),
+ [SPECIES_GYARADOS] = _("GYARADOS"),
+ [SPECIES_LAPRAS] = _("LAPRAS"),
+ [SPECIES_DITTO] = _("DITTO"),
+ [SPECIES_EEVEE] = _("EEVEE"),
+ [SPECIES_VAPOREON] = _("VAPOREON"),
+ [SPECIES_JOLTEON] = _("JOLTEON"),
+ [SPECIES_FLAREON] = _("FLAREON"),
+ [SPECIES_PORYGON] = _("PORYGON"),
+ [SPECIES_OMANYTE] = _("OMANYTE"),
+ [SPECIES_OMASTAR] = _("OMASTAR"),
+ [SPECIES_KABUTO] = _("KABUTO"),
+ [SPECIES_KABUTOPS] = _("KABUTOPS"),
+ [SPECIES_AERODACTYL] = _("AERODACTYL"),
+ [SPECIES_SNORLAX] = _("SNORLAX"),
+ [SPECIES_ARTICUNO] = _("ARTICUNO"),
+ [SPECIES_ZAPDOS] = _("ZAPDOS"),
+ [SPECIES_MOLTRES] = _("MOLTRES"),
+ [SPECIES_DRATINI] = _("DRATINI"),
+ [SPECIES_DRAGONAIR] = _("DRAGONAIR"),
+ [SPECIES_DRAGONITE] = _("DRAGONITE"),
+ [SPECIES_MEWTWO] = _("MEWTWO"),
+ [SPECIES_MEW] = _("MEW"),
+ [SPECIES_CHIKORITA] = _("CHIKORITA"),
+ [SPECIES_BAYLEEF] = _("BAYLEEF"),
+ [SPECIES_MEGANIUM] = _("MEGANIUM"),
+ [SPECIES_CYNDAQUIL] = _("CYNDAQUIL"),
+ [SPECIES_QUILAVA] = _("QUILAVA"),
+ [SPECIES_TYPHLOSION] = _("TYPHLOSION"),
+ [SPECIES_TOTODILE] = _("TOTODILE"),
+ [SPECIES_CROCONAW] = _("CROCONAW"),
+ [SPECIES_FERALIGATR] = _("FERALIGATR"),
+ [SPECIES_SENTRET] = _("SENTRET"),
+ [SPECIES_FURRET] = _("FURRET"),
+ [SPECIES_HOOTHOOT] = _("HOOTHOOT"),
+ [SPECIES_NOCTOWL] = _("NOCTOWL"),
+ [SPECIES_LEDYBA] = _("LEDYBA"),
+ [SPECIES_LEDIAN] = _("LEDIAN"),
+ [SPECIES_SPINARAK] = _("SPINARAK"),
+ [SPECIES_ARIADOS] = _("ARIADOS"),
+ [SPECIES_CROBAT] = _("CROBAT"),
+ [SPECIES_CHINCHOU] = _("CHINCHOU"),
+ [SPECIES_LANTURN] = _("LANTURN"),
+ [SPECIES_PICHU] = _("PICHU"),
+ [SPECIES_CLEFFA] = _("CLEFFA"),
+ [SPECIES_IGGLYBUFF] = _("IGGLYBUFF"),
+ [SPECIES_TOGEPI] = _("TOGEPI"),
+ [SPECIES_TOGETIC] = _("TOGETIC"),
+ [SPECIES_NATU] = _("NATU"),
+ [SPECIES_XATU] = _("XATU"),
+ [SPECIES_MAREEP] = _("MAREEP"),
+ [SPECIES_FLAAFFY] = _("FLAAFFY"),
+ [SPECIES_AMPHAROS] = _("AMPHAROS"),
+ [SPECIES_BELLOSSOM] = _("BELLOSSOM"),
+ [SPECIES_MARILL] = _("MARILL"),
+ [SPECIES_AZUMARILL] = _("AZUMARILL"),
+ [SPECIES_SUDOWOODO] = _("SUDOWOODO"),
+ [SPECIES_POLITOED] = _("POLITOED"),
+ [SPECIES_HOPPIP] = _("HOPPIP"),
+ [SPECIES_SKIPLOOM] = _("SKIPLOOM"),
+ [SPECIES_JUMPLUFF] = _("JUMPLUFF"),
+ [SPECIES_AIPOM] = _("AIPOM"),
+ [SPECIES_SUNKERN] = _("SUNKERN"),
+ [SPECIES_SUNFLORA] = _("SUNFLORA"),
+ [SPECIES_YANMA] = _("YANMA"),
+ [SPECIES_WOOPER] = _("WOOPER"),
+ [SPECIES_QUAGSIRE] = _("QUAGSIRE"),
+ [SPECIES_ESPEON] = _("ESPEON"),
+ [SPECIES_UMBREON] = _("UMBREON"),
+ [SPECIES_MURKROW] = _("MURKROW"),
+ [SPECIES_SLOWKING] = _("SLOWKING"),
+ [SPECIES_MISDREAVUS] = _("MISDREAVUS"),
+ [SPECIES_UNOWN] = _("UNOWN"),
+ [SPECIES_WOBBUFFET] = _("WOBBUFFET"),
+ [SPECIES_GIRAFARIG] = _("GIRAFARIG"),
+ [SPECIES_PINECO] = _("PINECO"),
+ [SPECIES_FORRETRESS] = _("FORRETRESS"),
+ [SPECIES_DUNSPARCE] = _("DUNSPARCE"),
+ [SPECIES_GLIGAR] = _("GLIGAR"),
+ [SPECIES_STEELIX] = _("STEELIX"),
+ [SPECIES_SNUBBULL] = _("SNUBBULL"),
+ [SPECIES_GRANBULL] = _("GRANBULL"),
+ [SPECIES_QWILFISH] = _("QWILFISH"),
+ [SPECIES_SCIZOR] = _("SCIZOR"),
+ [SPECIES_SHUCKLE] = _("SHUCKLE"),
+ [SPECIES_HERACROSS] = _("HERACROSS"),
+ [SPECIES_SNEASEL] = _("SNEASEL"),
+ [SPECIES_TEDDIURSA] = _("TEDDIURSA"),
+ [SPECIES_URSARING] = _("URSARING"),
+ [SPECIES_SLUGMA] = _("SLUGMA"),
+ [SPECIES_MAGCARGO] = _("MAGCARGO"),
+ [SPECIES_SWINUB] = _("SWINUB"),
+ [SPECIES_PILOSWINE] = _("PILOSWINE"),
+ [SPECIES_CORSOLA] = _("CORSOLA"),
+ [SPECIES_REMORAID] = _("REMORAID"),
+ [SPECIES_OCTILLERY] = _("OCTILLERY"),
+ [SPECIES_DELIBIRD] = _("DELIBIRD"),
+ [SPECIES_MANTINE] = _("MANTINE"),
+ [SPECIES_SKARMORY] = _("SKARMORY"),
+ [SPECIES_HOUNDOUR] = _("HOUNDOUR"),
+ [SPECIES_HOUNDOOM] = _("HOUNDOOM"),
+ [SPECIES_KINGDRA] = _("KINGDRA"),
+ [SPECIES_PHANPY] = _("PHANPY"),
+ [SPECIES_DONPHAN] = _("DONPHAN"),
+ [SPECIES_PORYGON2] = _("PORYGON2"),
+ [SPECIES_STANTLER] = _("STANTLER"),
+ [SPECIES_SMEARGLE] = _("SMEARGLE"),
+ [SPECIES_TYROGUE] = _("TYROGUE"),
+ [SPECIES_HITMONTOP] = _("HITMONTOP"),
+ [SPECIES_SMOOCHUM] = _("SMOOCHUM"),
+ [SPECIES_ELEKID] = _("ELEKID"),
+ [SPECIES_MAGBY] = _("MAGBY"),
+ [SPECIES_MILTANK] = _("MILTANK"),
+ [SPECIES_BLISSEY] = _("BLISSEY"),
+ [SPECIES_RAIKOU] = _("RAIKOU"),
+ [SPECIES_ENTEI] = _("ENTEI"),
+ [SPECIES_SUICUNE] = _("SUICUNE"),
+ [SPECIES_LARVITAR] = _("LARVITAR"),
+ [SPECIES_PUPITAR] = _("PUPITAR"),
+ [SPECIES_TYRANITAR] = _("TYRANITAR"),
+ [SPECIES_LUGIA] = _("LUGIA"),
+ [SPECIES_HO_OH] = _("HO-OH"),
+ [SPECIES_CELEBI] = _("CELEBI"),
+ [SPECIES_OLD_UNOWN_B] = _("?"),
+ [SPECIES_OLD_UNOWN_C] = _("?"),
+ [SPECIES_OLD_UNOWN_D] = _("?"),
+ [SPECIES_OLD_UNOWN_E] = _("?"),
+ [SPECIES_OLD_UNOWN_F] = _("?"),
+ [SPECIES_OLD_UNOWN_G] = _("?"),
+ [SPECIES_OLD_UNOWN_H] = _("?"),
+ [SPECIES_OLD_UNOWN_I] = _("?"),
+ [SPECIES_OLD_UNOWN_J] = _("?"),
+ [SPECIES_OLD_UNOWN_K] = _("?"),
+ [SPECIES_OLD_UNOWN_L] = _("?"),
+ [SPECIES_OLD_UNOWN_M] = _("?"),
+ [SPECIES_OLD_UNOWN_N] = _("?"),
+ [SPECIES_OLD_UNOWN_O] = _("?"),
+ [SPECIES_OLD_UNOWN_P] = _("?"),
+ [SPECIES_OLD_UNOWN_Q] = _("?"),
+ [SPECIES_OLD_UNOWN_R] = _("?"),
+ [SPECIES_OLD_UNOWN_S] = _("?"),
+ [SPECIES_OLD_UNOWN_T] = _("?"),
+ [SPECIES_OLD_UNOWN_U] = _("?"),
+ [SPECIES_OLD_UNOWN_V] = _("?"),
+ [SPECIES_OLD_UNOWN_W] = _("?"),
+ [SPECIES_OLD_UNOWN_X] = _("?"),
+ [SPECIES_OLD_UNOWN_Y] = _("?"),
+ [SPECIES_OLD_UNOWN_Z] = _("?"),
+ [SPECIES_TREECKO] = _("TREECKO"),
+ [SPECIES_GROVYLE] = _("GROVYLE"),
+ [SPECIES_SCEPTILE] = _("SCEPTILE"),
+ [SPECIES_TORCHIC] = _("TORCHIC"),
+ [SPECIES_COMBUSKEN] = _("COMBUSKEN"),
+ [SPECIES_BLAZIKEN] = _("BLAZIKEN"),
+ [SPECIES_MUDKIP] = _("MUDKIP"),
+ [SPECIES_MARSHTOMP] = _("MARSHTOMP"),
+ [SPECIES_SWAMPERT] = _("SWAMPERT"),
+ [SPECIES_POOCHYENA] = _("POOCHYENA"),
+ [SPECIES_MIGHTYENA] = _("MIGHTYENA"),
+ [SPECIES_ZIGZAGOON] = _("ZIGZAGOON"),
+ [SPECIES_LINOONE] = _("LINOONE"),
+ [SPECIES_WURMPLE] = _("WURMPLE"),
+ [SPECIES_SILCOON] = _("SILCOON"),
+ [SPECIES_BEAUTIFLY] = _("BEAUTIFLY"),
+ [SPECIES_CASCOON] = _("CASCOON"),
+ [SPECIES_DUSTOX] = _("DUSTOX"),
+ [SPECIES_LOTAD] = _("LOTAD"),
+ [SPECIES_LOMBRE] = _("LOMBRE"),
+ [SPECIES_LUDICOLO] = _("LUDICOLO"),
+ [SPECIES_SEEDOT] = _("SEEDOT"),
+ [SPECIES_NUZLEAF] = _("NUZLEAF"),
+ [SPECIES_SHIFTRY] = _("SHIFTRY"),
+ [SPECIES_NINCADA] = _("NINCADA"),
+ [SPECIES_NINJASK] = _("NINJASK"),
+ [SPECIES_SHEDINJA] = _("SHEDINJA"),
+ [SPECIES_TAILLOW] = _("TAILLOW"),
+ [SPECIES_SWELLOW] = _("SWELLOW"),
+ [SPECIES_SHROOMISH] = _("SHROOMISH"),
+ [SPECIES_BRELOOM] = _("BRELOOM"),
+ [SPECIES_SPINDA] = _("SPINDA"),
+ [SPECIES_WINGULL] = _("WINGULL"),
+ [SPECIES_PELIPPER] = _("PELIPPER"),
+ [SPECIES_SURSKIT] = _("SURSKIT"),
+ [SPECIES_MASQUERAIN] = _("MASQUERAIN"),
+ [SPECIES_WAILMER] = _("WAILMER"),
+ [SPECIES_WAILORD] = _("WAILORD"),
+ [SPECIES_SKITTY] = _("SKITTY"),
+ [SPECIES_DELCATTY] = _("DELCATTY"),
+ [SPECIES_KECLEON] = _("KECLEON"),
+ [SPECIES_BALTOY] = _("BALTOY"),
+ [SPECIES_CLAYDOL] = _("CLAYDOL"),
+ [SPECIES_NOSEPASS] = _("NOSEPASS"),
+ [SPECIES_TORKOAL] = _("TORKOAL"),
+ [SPECIES_SABLEYE] = _("SABLEYE"),
+ [SPECIES_BARBOACH] = _("BARBOACH"),
+ [SPECIES_WHISCASH] = _("WHISCASH"),
+ [SPECIES_LUVDISC] = _("LUVDISC"),
+ [SPECIES_CORPHISH] = _("CORPHISH"),
+ [SPECIES_CRAWDAUNT] = _("CRAWDAUNT"),
+ [SPECIES_FEEBAS] = _("FEEBAS"),
+ [SPECIES_MILOTIC] = _("MILOTIC"),
+ [SPECIES_CARVANHA] = _("CARVANHA"),
+ [SPECIES_SHARPEDO] = _("SHARPEDO"),
+ [SPECIES_TRAPINCH] = _("TRAPINCH"),
+ [SPECIES_VIBRAVA] = _("VIBRAVA"),
+ [SPECIES_FLYGON] = _("FLYGON"),
+ [SPECIES_MAKUHITA] = _("MAKUHITA"),
+ [SPECIES_HARIYAMA] = _("HARIYAMA"),
+ [SPECIES_ELECTRIKE] = _("ELECTRIKE"),
+ [SPECIES_MANECTRIC] = _("MANECTRIC"),
+ [SPECIES_NUMEL] = _("NUMEL"),
+ [SPECIES_CAMERUPT] = _("CAMERUPT"),
+ [SPECIES_SPHEAL] = _("SPHEAL"),
+ [SPECIES_SEALEO] = _("SEALEO"),
+ [SPECIES_WALREIN] = _("WALREIN"),
+ [SPECIES_CACNEA] = _("CACNEA"),
+ [SPECIES_CACTURNE] = _("CACTURNE"),
+ [SPECIES_SNORUNT] = _("SNORUNT"),
+ [SPECIES_GLALIE] = _("GLALIE"),
+ [SPECIES_LUNATONE] = _("LUNATONE"),
+ [SPECIES_SOLROCK] = _("SOLROCK"),
+ [SPECIES_AZURILL] = _("AZURILL"),
+ [SPECIES_SPOINK] = _("SPOINK"),
+ [SPECIES_GRUMPIG] = _("GRUMPIG"),
+ [SPECIES_PLUSLE] = _("PLUSLE"),
+ [SPECIES_MINUN] = _("MINUN"),
+ [SPECIES_MAWILE] = _("MAWILE"),
+ [SPECIES_MEDITITE] = _("MEDITITE"),
+ [SPECIES_MEDICHAM] = _("MEDICHAM"),
+ [SPECIES_SWABLU] = _("SWABLU"),
+ [SPECIES_ALTARIA] = _("ALTARIA"),
+ [SPECIES_WYNAUT] = _("WYNAUT"),
+ [SPECIES_DUSKULL] = _("DUSKULL"),
+ [SPECIES_DUSCLOPS] = _("DUSCLOPS"),
+ [SPECIES_ROSELIA] = _("ROSELIA"),
+ [SPECIES_SLAKOTH] = _("SLAKOTH"),
+ [SPECIES_VIGOROTH] = _("VIGOROTH"),
+ [SPECIES_SLAKING] = _("SLAKING"),
+ [SPECIES_GULPIN] = _("GULPIN"),
+ [SPECIES_SWALOT] = _("SWALOT"),
+ [SPECIES_TROPIUS] = _("TROPIUS"),
+ [SPECIES_WHISMUR] = _("WHISMUR"),
+ [SPECIES_LOUDRED] = _("LOUDRED"),
+ [SPECIES_EXPLOUD] = _("EXPLOUD"),
+ [SPECIES_CLAMPERL] = _("CLAMPERL"),
+ [SPECIES_HUNTAIL] = _("HUNTAIL"),
+ [SPECIES_GOREBYSS] = _("GOREBYSS"),
+ [SPECIES_ABSOL] = _("ABSOL"),
+ [SPECIES_SHUPPET] = _("SHUPPET"),
+ [SPECIES_BANETTE] = _("BANETTE"),
+ [SPECIES_SEVIPER] = _("SEVIPER"),
+ [SPECIES_ZANGOOSE] = _("ZANGOOSE"),
+ [SPECIES_RELICANTH] = _("RELICANTH"),
+ [SPECIES_ARON] = _("ARON"),
+ [SPECIES_LAIRON] = _("LAIRON"),
+ [SPECIES_AGGRON] = _("AGGRON"),
+ [SPECIES_CASTFORM] = _("CASTFORM"),
+ [SPECIES_VOLBEAT] = _("VOLBEAT"),
+ [SPECIES_ILLUMISE] = _("ILLUMISE"),
+ [SPECIES_LILEEP] = _("LILEEP"),
+ [SPECIES_CRADILY] = _("CRADILY"),
+ [SPECIES_ANORITH] = _("ANORITH"),
+ [SPECIES_ARMALDO] = _("ARMALDO"),
+ [SPECIES_RALTS] = _("RALTS"),
+ [SPECIES_KIRLIA] = _("KIRLIA"),
+ [SPECIES_GARDEVOIR] = _("GARDEVOIR"),
+ [SPECIES_BAGON] = _("BAGON"),
+ [SPECIES_SHELGON] = _("SHELGON"),
+ [SPECIES_SALAMENCE] = _("SALAMENCE"),
+ [SPECIES_BELDUM] = _("BELDUM"),
+ [SPECIES_METANG] = _("METANG"),
+ [SPECIES_METAGROSS] = _("METAGROSS"),
+ [SPECIES_REGIROCK] = _("REGIROCK"),
+ [SPECIES_REGICE] = _("REGICE"),
+ [SPECIES_REGISTEEL] = _("REGISTEEL"),
+ [SPECIES_KYOGRE] = _("KYOGRE"),
+ [SPECIES_GROUDON] = _("GROUDON"),
+ [SPECIES_RAYQUAZA] = _("RAYQUAZA"),
+ [SPECIES_LATIAS] = _("LATIAS"),
+ [SPECIES_LATIOS] = _("LATIOS"),
+ [SPECIES_JIRACHI] = _("JIRACHI"),
+ [SPECIES_DEOXYS] = _("DEOXYS"),
+ [SPECIES_CHIMECHO] = _("CHIMECHO"),
+};
diff --git a/src/data/text/trainer_class_names.h b/src/data/text/trainer_class_names.h
new file mode 100644
index 000000000..7a126a128
--- /dev/null
+++ b/src/data/text/trainer_class_names.h
@@ -0,0 +1,73 @@
+#ifndef GUARD_TRAINER_CLASS_NAMES_H
+#define GUARD_TRAINER_CLASS_NAMES_H
+
+const u8 gTrainerClassNames[][13] = {
+ _("{PKMN} TRAINER"),
+ _("{PKMN} TRAINER"),
+ _("HIKER"),
+ _("TEAM AQUA"),
+ _("{PKMN} BREEDER"),
+ _("COOLTRAINER"),
+ _("BIRD KEEPER"),
+ _("COLLECTOR"),
+ _("SWIMMER♂"),
+ _("TEAM MAGMA"),
+ _("EXPERT"),
+ _("AQUA ADMIN"),
+ _("BLACK BELT"),
+ _("AQUA LEADER"),
+ _("HEX MANIAC"),
+ _("AROMA LADY"),
+ _("RUIN MANIAC"),
+ _("INTERVIEWER"),
+ _("TUBER"),
+ _("TUBER"),
+ _("LADY"),
+ _("BEAUTY"),
+ _("RICH BOY"),
+ _("POKéMANIAC"),
+ _("GUITARIST"),
+ _("KINDLER"),
+ _("CAMPER"),
+ _("PICNICKER"),
+ _("BUG MANIAC"),
+ _("PSYCHIC"),
+ _("GENTLEMAN"),
+ _("ELITE FOUR"),
+ _("LEADER"),
+ _("SCHOOL KID"),
+ _("SR. AND JR."),
+ _("WINSTRATE"),
+ _("POKéFAN"),
+ _("YOUNGSTER"),
+ _("CHAMPION"),
+ _("FISHERMAN"),
+ _("TRIATHLETE"),
+ _("DRAGON TAMER"),
+ _("NINJA BOY"),
+ _("BATTLE GIRL"),
+ _("PARASOL LADY"),
+ _("SWIMMER♀"),
+ _("TWINS"),
+ _("SAILOR"),
+ _("COOLTRAINER"),
+ _("MAGMA ADMIN"),
+ _("{PKMN} TRAINER"),
+ _("BUG CATCHER"),
+ _("{PKMN} RANGER"),
+ _("MAGMA LEADER"),
+ _("LASS"),
+ _("YOUNG COUPLE"),
+ _("OLD COUPLE"),
+ _("SIS AND BRO"),
+ _("SALON MAIDEN"),
+ _("DOME ACE"),
+ _("PALACE MAVEN"),
+ _("ARENA TYCOON"),
+ _("FACTORY HEAD"),
+ _("PIKE QUEEN"),
+ _("PYRAMID KING"),
+ _("{PKMN} TRAINER"),
+};
+
+#endif
diff --git a/src/data/trainer_parties.h b/src/data/trainer_parties.h
new file mode 100644
index 000000000..4993186d2
--- /dev/null
+++ b/src/data/trainer_parties.h
@@ -0,0 +1,12437 @@
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer1[] = {
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_GEODUDE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt1[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt2[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt3[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt4[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt5[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt6[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt7[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle1[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_SKITTY,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_LOTAD,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_SEEDOT,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_TAILLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt8[] = {
+ {
+ .iv = 0,
+ .lvl = 9,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marcel[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_SHIFTRY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alberto[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_XATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ed[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_ZANGOOSE,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_SEVIPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt9[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Declan[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt10[] = {
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt11[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt12[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt13[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt14[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt15[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt16[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt17[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt18[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt19[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt20[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt21[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt22[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fredrick[] = {
+ {
+ .iv = 100,
+ .lvl = 30,
+ .species = SPECIES_MAKUHITA,
+ },
+ {
+ .iv = 100,
+ .lvl = 30,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Matt[] = {
+ {
+ .iv = 50,
+ .lvl = 34,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 50,
+ .lvl = 34,
+ .species = SPECIES_GOLBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Zander[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelly1[] = {
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_CARVANHA,
+ },
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelly2[] = {
+ {
+ .iv = 100,
+ .lvl = 37,
+ .species = SPECIES_SHARPEDO,
+ },
+ {
+ .iv = 100,
+ .lvl = 37,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Archie[] = {
+ {
+ .iv = 150,
+ .lvl = 41,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 150,
+ .lvl = 41,
+ .species = SPECIES_CROBAT,
+ },
+ {
+ .iv = 150,
+ .lvl = 43,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leah[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_SPOINK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Daisy[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose1[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Felix[] = {
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_MEDICHAM,
+ .moves = MOVE_PSYCHIC, MOVE_NONE, MOVE_NONE, MOVE_NONE
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_CLAYDOL,
+ .moves = MOVE_SKILL_SWAP, MOVE_EARTHQUAKE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Violet[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_GLOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose2[] = {
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose3[] = {
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose4[] = {
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose5[] = {
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty1[] = {
+ {
+ .iv = 50,
+ .lvl = 23,
+ .species = SPECIES_SANDSLASH,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Chip[] = {
+ {
+ .iv = 50,
+ .lvl = 27,
+ .species = SPECIES_BALTOY,
+ .moves = MOVE_PSYBEAM, MOVE_SELF_DESTRUCT, MOVE_SANDSTORM, MOVE_ANCIENT_POWER
+ },
+ {
+ .iv = 50,
+ .lvl = 27,
+ .species = SPECIES_SANDSHREW,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ },
+ {
+ .iv = 50,
+ .lvl = 27,
+ .species = SPECIES_SANDSLASH,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Foster[] = {
+ {
+ .iv = 100,
+ .lvl = 25,
+ .species = SPECIES_SANDSHREW,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ },
+ {
+ .iv = 100,
+ .lvl = 25,
+ .species = SPECIES_SANDSLASH,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty2[] = {
+ {
+ .iv = 60,
+ .lvl = 27,
+ .species = SPECIES_SANDSLASH,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty3[] = {
+ {
+ .iv = 70,
+ .lvl = 30,
+ .species = SPECIES_SANDSLASH,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty4[] = {
+ {
+ .iv = 80,
+ .lvl = 33,
+ .species = SPECIES_SANDSLASH,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty5[] = {
+ {
+ .iv = 90,
+ .lvl = 36,
+ .species = SPECIES_SANDSLASH,
+ .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy1[] = {
+ {
+ .iv = 50,
+ .lvl = 17,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 50,
+ .lvl = 17,
+ .species = SPECIES_WHISMUR,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy2[] = {
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy3[] = {
+ {
+ .iv = 150,
+ .lvl = 30,
+ .species = SPECIES_MAGNETON,
+ },
+ {
+ .iv = 150,
+ .lvl = 30,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy4[] = {
+ {
+ .iv = 200,
+ .lvl = 33,
+ .species = SPECIES_MAGNETON,
+ },
+ {
+ .iv = 200,
+ .lvl = 33,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy5[] = {
+ {
+ .iv = 250,
+ .lvl = 36,
+ .species = SPECIES_MAGNETON,
+ },
+ {
+ .iv = 250,
+ .lvl = 36,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_GabbyAndTy6[] = {
+ {
+ .iv = 250,
+ .lvl = 39,
+ .species = SPECIES_MAGNETON,
+ .moves = MOVE_SONIC_BOOM, MOVE_THUNDER_WAVE, MOVE_METAL_SOUND, MOVE_THUNDERBOLT
+ },
+ {
+ .iv = 250,
+ .lvl = 39,
+ .species = SPECIES_EXPLOUD,
+ .moves = MOVE_ASTONISH, MOVE_STOMP, MOVE_SUPERSONIC, MOVE_HYPER_VOICE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola1[] = {
+ {
+ .iv = 10,
+ .lvl = 12,
+ .species = SPECIES_AZURILL,
+ },
+ {
+ .iv = 10,
+ .lvl = 12,
+ .species = SPECIES_AZURILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Austina[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gwen[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola2[] = {
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola4[] = {
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola5[] = {
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_AZUMARILL,
+ },
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_AZUMARILL,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky1[] = {
+ {
+ .iv = 10,
+ .lvl = 13,
+ .species = SPECIES_ZIGZAGOON,
+ .moves = MOVE_SAND_ATTACK, MOVE_HEADBUTT, MOVE_TAIL_WHIP, MOVE_SURF
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Simon[] = {
+ {
+ .iv = 0,
+ .lvl = 12,
+ .species = SPECIES_AZURILL,
+ },
+ {
+ .iv = 0,
+ .lvl = 12,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Charlie[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky2[] = {
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky3[] = {
+ {
+ .iv = 20,
+ .lvl = 30,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky4[] = {
+ {
+ .iv = 30,
+ .lvl = 33,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky5[] = {
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Randall[] = {
+ {
+ .iv = 255,
+ .lvl = 26,
+ .species = SPECIES_SWELLOW,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_QUICK_ATTACK, MOVE_AGILITY, MOVE_WING_ATTACK, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Parker[] = {
+ {
+ .iv = 255,
+ .lvl = 26,
+ .species = SPECIES_SPINDA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TEETER_DANCE, MOVE_DIZZY_PUNCH, MOVE_FOCUS_PUNCH, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_George[] = {
+ {
+ .iv = 255,
+ .lvl = 26,
+ .species = SPECIES_SLAKOTH,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SLACK_OFF, MOVE_COUNTER, MOVE_SHADOW_BALL, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Berke[] = {
+ {
+ .iv = 255,
+ .lvl = 26,
+ .species = SPECIES_VIGOROTH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FOCUS_ENERGY, MOVE_SLASH, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Braxton[] = {
+ {
+ .iv = 100,
+ .lvl = 28,
+ .species = SPECIES_SWELLOW,
+ .moves = MOVE_FOCUS_ENERGY, MOVE_QUICK_ATTACK, MOVE_WING_ATTACK, MOVE_ENDEAVOR
+ },
+ {
+ .iv = 100,
+ .lvl = 28,
+ .species = SPECIES_TRAPINCH,
+ .moves = MOVE_BITE, MOVE_DIG, MOVE_FAINT_ATTACK, MOVE_SAND_TOMB
+ },
+ {
+ .iv = 100,
+ .lvl = 28,
+ .species = SPECIES_WAILMER,
+ .moves = MOVE_ROLLOUT, MOVE_WHIRLPOOL, MOVE_ASTONISH, MOVE_WATER_PULSE
+ },
+ {
+ .iv = 100,
+ .lvl = 28,
+ .species = SPECIES_MAGNETON,
+ .moves = MOVE_THUNDERBOLT, MOVE_SUPERSONIC, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM
+ },
+ {
+ .iv = 100,
+ .lvl = 28,
+ .species = SPECIES_SHIFTRY,
+ .moves = MOVE_GIGA_DRAIN, MOVE_FAINT_ATTACK, MOVE_DOUBLE_TEAM, MOVE_SWAGGER
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Vincent[] = {
+ {
+ .iv = 100,
+ .lvl = 44,
+ .species = SPECIES_SABLEYE,
+ },
+ {
+ .iv = 100,
+ .lvl = 44,
+ .species = SPECIES_MEDICHAM,
+ },
+ {
+ .iv = 100,
+ .lvl = 44,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leroy[] = {
+ {
+ .iv = 100,
+ .lvl = 46,
+ .species = SPECIES_MAWILE,
+ },
+ {
+ .iv = 100,
+ .lvl = 46,
+ .species = SPECIES_STARMIE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton1[] = {
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edgar[] = {
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_CACTURNE,
+ },
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_PELIPPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Albert[] = {
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_MAGNETON,
+ },
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_MUK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Samuel[] = {
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_MAWILE,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_KADABRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Vito[] = {
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_DODRIO,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_ELECTRODE,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_SHIFTRY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Owen[] = {
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_KECLEON,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_WAILORD,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton2[] = {
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton3[] = {
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton4[] = {
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton5[] = {
+ {
+ .iv = 140,
+ .lvl = 35,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 140,
+ .lvl = 35,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 140,
+ .lvl = 35,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Warren[] = {
+ {
+ .iv = 100,
+ .lvl = 33,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 100,
+ .lvl = 33,
+ .species = SPECIES_LUDICOLO,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Mary[] = {
+ {
+ .iv = 255,
+ .lvl = 26,
+ .species = SPECIES_DELCATTY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FAINT_ATTACK, MOVE_SHOCK_WAVE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Alexia[] = {
+ {
+ .iv = 255,
+ .lvl = 26,
+ .species = SPECIES_WIGGLYTUFF,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Jody[] = {
+ {
+ .iv = 255,
+ .lvl = 26,
+ .species = SPECIES_ZANGOOSE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SWORDS_DANCE, MOVE_SLASH, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Wendy[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_MAWILE,
+ .moves = MOVE_BATON_PASS, MOVE_FAINT_ATTACK, MOVE_FAKE_TEARS, MOVE_BITE
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_MEGA_DRAIN, MOVE_MAGICAL_LEAF, MOVE_GRASS_WHISTLE, MOVE_LEECH_SEED
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_PELIPPER,
+ .moves = MOVE_FLY, MOVE_WATER_GUN, MOVE_MIST, MOVE_PROTECT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Keira[] = {
+ {
+ .iv = 100,
+ .lvl = 45,
+ .species = SPECIES_LAIRON,
+ },
+ {
+ .iv = 100,
+ .lvl = 45,
+ .species = SPECIES_MANECTRIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke1[] = {
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jennifer[] = {
+ {
+ .iv = 200,
+ .lvl = 30,
+ .species = SPECIES_SABLEYE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hope[] = {
+ {
+ .iv = 100,
+ .lvl = 45,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shannon[] = {
+ {
+ .iv = 100,
+ .lvl = 45,
+ .species = SPECIES_CLAYDOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Michelle[] = {
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_TORKOAL,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_MEDICHAM,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_LUDICOLO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Caroline[] = {
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_SKARMORY,
+ },
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_SABLEYE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Julie[] = {
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_SANDSLASH,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_NINETALES,
+ },
+ {
+ .iv = 100,
+ .lvl = 42,
+ .species = SPECIES_TROPIUS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke2[] = {
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke3[] = {
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke4[] = {
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke5[] = {
+ {
+ .iv = 140,
+ .lvl = 34,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 140,
+ .lvl = 34,
+ .species = SPECIES_CAMERUPT,
+ },
+ {
+ .iv = 140,
+ .lvl = 34,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Patricia[] = {
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_BANETTE,
+ },
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_LUNATONE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kindra[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_DUSKULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_SHUPPET,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tammy[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_DUSKULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_SHUPPET,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie1[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_SABLEYE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tasha[] = {
+ {
+ .iv = 50,
+ .lvl = 32,
+ .species = SPECIES_SHUPPET,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie2[] = {
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SABLEYE,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SPOINK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie3[] = {
+ {
+ .iv = 20,
+ .lvl = 35,
+ .species = SPECIES_SPOINK,
+ },
+ {
+ .iv = 20,
+ .lvl = 35,
+ .species = SPECIES_SABLEYE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie4[] = {
+ {
+ .iv = 30,
+ .lvl = 40,
+ .species = SPECIES_SPOINK,
+ },
+ {
+ .iv = 30,
+ .lvl = 40,
+ .species = SPECIES_SABLEYE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie5[] = {
+ {
+ .iv = 40,
+ .lvl = 42,
+ .species = SPECIES_DUSKULL,
+ },
+ {
+ .iv = 40,
+ .lvl = 42,
+ .species = SPECIES_SABLEYE,
+ },
+ {
+ .iv = 40,
+ .lvl = 42,
+ .species = SPECIES_GRUMPIG,
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy1[] = {
+ {
+ .iv = 0,
+ .lvl = 7,
+ .species = SPECIES_ZIGZAGOON,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Daphne[] = {
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_LUVDISC,
+ .heldItem = ITEM_NUGGET,
+ .moves = MOVE_ATTRACT, MOVE_SWEET_KISS, MOVE_FLAIL, MOVE_WATER_PULSE
+ },
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_LUVDISC,
+ .heldItem = ITEM_NUGGET,
+ .moves = MOVE_ATTRACT, MOVE_SAFEGUARD, MOVE_TAKE_DOWN, MOVE_WATER_PULSE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt23[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Cindy2[] = {
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_ZIGZAGOON,
+ .heldItem = ITEM_NUGGET,
+ .moves = MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Brianna[] = {
+ {
+ .iv = 150,
+ .lvl = 40,
+ .species = SPECIES_SEAKING,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Naomi[] = {
+ {
+ .iv = 100,
+ .lvl = 45,
+ .species = SPECIES_ROSELIA,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy3[] = {
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy4[] = {
+ {
+ .iv = 20,
+ .lvl = 30,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy5[] = {
+ {
+ .iv = 30,
+ .lvl = 33,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Cindy6[] = {
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET,
+ .moves = MOVE_FURY_SWIPES, MOVE_MUD_SPORT, MOVE_ODOR_SLEUTH, MOVE_SAND_ATTACK
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Melissa[] = {
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sheila[] = {
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_SHROOMISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shirley[] = {
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica1[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_KECLEON,
+ .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_SEVIPER,
+ .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Connie[] = {
+ {
+ .iv = 100,
+ .lvl = 40,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bridget[] = {
+ {
+ .iv = 150,
+ .lvl = 40,
+ .species = SPECIES_AZUMARILL,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Olivia[] = {
+ {
+ .iv = 100,
+ .lvl = 35,
+ .species = SPECIES_CLAMPERL,
+ .moves = MOVE_IRON_DEFENSE, MOVE_WHIRLPOOL, MOVE_RAIN_DANCE, MOVE_WATER_PULSE
+ },
+ {
+ .iv = 100,
+ .lvl = 37,
+ .species = SPECIES_CORPHISH,
+ .moves = MOVE_TAUNT, MOVE_CRABHAMMER, MOVE_WATER_PULSE, MOVE_NONE
+ },
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_LOMBRE,
+ .moves = MOVE_UPROAR, MOVE_FURY_SWIPES, MOVE_FAKE_OUT, MOVE_WATER_PULSE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tiffany[] = {
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_CARVANHA,
+ },
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica2[] = {
+ {
+ .iv = 10,
+ .lvl = 35,
+ .species = SPECIES_KECLEON,
+ .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 10,
+ .lvl = 35,
+ .species = SPECIES_SEVIPER,
+ .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica3[] = {
+ {
+ .iv = 20,
+ .lvl = 38,
+ .species = SPECIES_KECLEON,
+ .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 20,
+ .lvl = 38,
+ .species = SPECIES_SEVIPER,
+ .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica4[] = {
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_KECLEON,
+ .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_SEVIPER,
+ .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica5[] = {
+ {
+ .iv = 40,
+ .lvl = 44,
+ .species = SPECIES_KECLEON,
+ .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 40,
+ .lvl = 44,
+ .species = SPECIES_SEVIPER,
+ .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Winston1[] = {
+ {
+ .iv = 0,
+ .lvl = 7,
+ .species = SPECIES_ZIGZAGOON,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mollie[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WHISCASH,
+ },
+ {
+ .iv = 200,
+ .lvl = 33,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Garret[] = {
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_AZUMARILL,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Winston2[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Winston3[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Winston4[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Winston5[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NUGGET,
+ .moves = MOVE_FURY_SWIPES, MOVE_MUD_SPORT, MOVE_ODOR_SLEUTH, MOVE_SAND_ATTACK
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve1[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_ARON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia1[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_HORSEA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mark[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_RHYHORN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt24[] = {
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve2[] = {
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_LAIRON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_LAIRON,
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_RHYHORN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve4[] = {
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_LAIRON,
+ },
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_RHYHORN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve5[] = {
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_AGGRON,
+ },
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_RHYDON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Luis[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dominik[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Douglas[] = {
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darrin[] = {
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony1[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerome[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Matthew[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_David[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Spencer[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Roland[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nolen[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Stan[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_HORSEA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Barry[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dean[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_CARVANHA,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rodney[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Richard[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_PELIPPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Herman[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Santiago[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_TENTACRUEL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gilbert[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Franklin[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_SEALEO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kevin[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_SPHEAL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jack[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dudley[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chad[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony2[] = {
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony3[] = {
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony4[] = {
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_STARYU,
+ },
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony5[] = {
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_STARMIE,
+ },
+ {
+ .iv = 40,
+ .lvl = 39,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Takao[] = {
+ {
+ .iv = 127,
+ .lvl = 13,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hitoshi[] = {
+ {
+ .iv = 50,
+ .lvl = 32,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 200,
+ .lvl = 32,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kiyo[] = {
+ {
+ .iv = 100,
+ .lvl = 34,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koichi[] = {
+ {
+ .iv = 100,
+ .lvl = 24,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 150,
+ .lvl = 28,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob1[] = {
+ {
+ .iv = 100,
+ .lvl = 19,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob2[] = {
+ {
+ .iv = 110,
+ .lvl = 27,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob3[] = {
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob4[] = {
+ {
+ .iv = 130,
+ .lvl = 31,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 130,
+ .lvl = 31,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 130,
+ .lvl = 31,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Nob5[] = {
+ {
+ .iv = 140,
+ .lvl = 33,
+ .species = SPECIES_MACHOP,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 140,
+ .lvl = 33,
+ .species = SPECIES_MACHOKE,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 140,
+ .lvl = 33,
+ .species = SPECIES_MACHOKE,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 140,
+ .lvl = 33,
+ .species = SPECIES_MACHAMP,
+ .heldItem = ITEM_BLACK_BELT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Yuji[] = {
+ {
+ .iv = 100,
+ .lvl = 26,
+ .species = SPECIES_MAKUHITA,
+ },
+ {
+ .iv = 100,
+ .lvl = 26,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Daisuke[] = {
+ {
+ .iv = 100,
+ .lvl = 19,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Atsushi[] = {
+ {
+ .iv = 100,
+ .lvl = 32,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Kirk[] = {
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_ELECTRIKE,
+ .moves = MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_SPARK, MOVE_LEER
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_VOLTORB,
+ .moves = MOVE_CHARGE, MOVE_SHOCK_WAVE, MOVE_SCREECH, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt25[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt26[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shawn[] = {
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_VOLTORB,
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando1[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton1[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_WHISMUR,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton2[] = {
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_WHISMUR,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton3[] = {
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton4[] = {
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_MAGNETON,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_MAGNETON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton5[] = {
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_MAGNETON,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_EXPLOUD,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_MAGNETON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cole[] = {
+ {
+ .iv = 100,
+ .lvl = 23,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeff[] = {
+ {
+ .iv = 100,
+ .lvl = 22,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 100,
+ .lvl = 22,
+ .species = SPECIES_SLUGMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Axle[] = {
+ {
+ .iv = 100,
+ .lvl = 23,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jace[] = {
+ {
+ .iv = 100,
+ .lvl = 23,
+ .species = SPECIES_SLUGMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Keegan[] = {
+ {
+ .iv = 120,
+ .lvl = 23,
+ .species = SPECIES_SLUGMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie1[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie2[] = {
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_PELIPPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie4[] = {
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_PELIPPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie5[] = {
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_MAGCARGO,
+ },
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_PELIPPER,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Drew[] = {
+ {
+ .iv = 0,
+ .lvl = 23,
+ .species = SPECIES_SANDSHREW,
+ .moves = MOVE_DIG, MOVE_SAND_ATTACK, MOVE_POISON_STING, MOVE_SLASH
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Beau[] = {
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_BALTOY,
+ .moves = MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, MOVE_ROCK_TOMB
+ },
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_SANDSHREW,
+ .moves = MOVE_POISON_STING, MOVE_SAND_ATTACK, MOVE_SCRATCH, MOVE_DIG
+ },
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_BALTOY,
+ .moves = MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, MOVE_ROCK_TOMB
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Larry[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shane[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Justin[] = {
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_KECLEON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan1[] = {
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_TAILLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Autumn[] = {
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_SHROOMISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Travis[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SANDSHREW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan2[] = {
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_TAILLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_SWELLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan4[] = {
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_LINOONE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan5[] = {
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_SANDSLASH,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_LINOONE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brent[] = {
+ {
+ .iv = 100,
+ .lvl = 26,
+ .species = SPECIES_SURSKIT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Donald[] = {
+ {
+ .iv = 100,
+ .lvl = 24,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 100,
+ .lvl = 24,
+ .species = SPECIES_SILCOON,
+ },
+ {
+ .iv = 100,
+ .lvl = 24,
+ .species = SPECIES_BEAUTIFLY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Taylor[] = {
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_CASCOON,
+ },
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_DUSTOX,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey1[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_SURSKIT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Derek[] = {
+ {
+ .iv = 150,
+ .lvl = 16,
+ .species = SPECIES_DUSTOX,
+ },
+ {
+ .iv = 150,
+ .lvl = 16,
+ .species = SPECIES_BEAUTIFLY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey2[] = {
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SURSKIT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey3[] = {
+ {
+ .iv = 20,
+ .lvl = 34,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 20,
+ .lvl = 34,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 20,
+ .lvl = 34,
+ .species = SPECIES_MASQUERAIN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey4[] = {
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_MASQUERAIN,
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Jeffrey5[] = {
+ {
+ .iv = 40,
+ .lvl = 38,
+ .species = SPECIES_SURSKIT,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 40,
+ .lvl = 38,
+ .species = SPECIES_DUSTOX,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 40,
+ .lvl = 38,
+ .species = SPECIES_SURSKIT,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 40,
+ .lvl = 38,
+ .species = SPECIES_MASQUERAIN,
+ .heldItem = ITEM_SILVER_POWDER
+ },
+ {
+ .iv = 40,
+ .lvl = 38,
+ .species = SPECIES_BEAUTIFLY,
+ .heldItem = ITEM_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Edward[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_ABRA,
+ .moves = MOVE_HIDDEN_POWER, MOVE_NONE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Preston[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_KIRLIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Virgil[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_RALTS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Blake[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_GIRAFARIG,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_William[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_RALTS,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_RALTS,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_KIRLIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Joshua[] = {
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_SOLROCK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron1[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_SOLROCK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron2[] = {
+ {
+ .iv = 10,
+ .lvl = 33,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 10,
+ .lvl = 33,
+ .species = SPECIES_SOLROCK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron3[] = {
+ {
+ .iv = 20,
+ .lvl = 38,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 20,
+ .lvl = 38,
+ .species = SPECIES_SOLROCK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron4[] = {
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_SOLROCK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron5[] = {
+ {
+ .iv = 40,
+ .lvl = 45,
+ .species = SPECIES_SOLROCK,
+ },
+ {
+ .iv = 40,
+ .lvl = 45,
+ .species = SPECIES_ALAKAZAM,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Jaclyn[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_ABRA,
+ .moves = MOVE_HIDDEN_POWER, MOVE_NONE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hannah[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_KIRLIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Samantha[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_XATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maura[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_KADABRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kayla[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_WOBBUFFET,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_NATU,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_KADABRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alexis[] = {
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_KIRLIA,
+ },
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_XATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki1[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_LUNATONE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki2[] = {
+ {
+ .iv = 10,
+ .lvl = 34,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 10,
+ .lvl = 34,
+ .species = SPECIES_LUNATONE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki3[] = {
+ {
+ .iv = 20,
+ .lvl = 37,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 20,
+ .lvl = 37,
+ .species = SPECIES_LUNATONE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki4[] = {
+ {
+ .iv = 30,
+ .lvl = 40,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 30,
+ .lvl = 40,
+ .species = SPECIES_LUNATONE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki5[] = {
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_LUNATONE,
+ },
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_ALAKAZAM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Walter1[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_MANECTRIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Micah[] = {
+ {
+ .iv = 0,
+ .lvl = 44,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 0,
+ .lvl = 44,
+ .species = SPECIES_MANECTRIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thomas[] = {
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_ZANGOOSE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Walter2[] = {
+ {
+ .iv = 10,
+ .lvl = 34,
+ .species = SPECIES_MANECTRIC,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Walter3[] = {
+ {
+ .iv = 20,
+ .lvl = 36,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, MOVE_FURY_SWIPES
+ },
+ {
+ .iv = 20,
+ .lvl = 36,
+ .species = SPECIES_MANECTRIC,
+ .moves = MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, MOVE_ROAR
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Walter4[] = {
+ {
+ .iv = 30,
+ .lvl = 39,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, MOVE_FURY_SWIPES
+ },
+ {
+ .iv = 30,
+ .lvl = 39,
+ .species = SPECIES_MANECTRIC,
+ .moves = MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Walter5[] = {
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, MOVE_FURY_SWIPES
+ },
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_GOLDUCK,
+ .moves = MOVE_FURY_SWIPES, MOVE_DISABLE, MOVE_CONFUSION, MOVE_PSYCH_UP
+ },
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_MANECTRIC,
+ .moves = MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, MOVE_ROAR
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Sidney[] = {
+ {
+ .iv = 250,
+ .lvl = 46,
+ .species = SPECIES_MIGHTYENA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROAR, MOVE_DOUBLE_EDGE, MOVE_SAND_ATTACK, MOVE_CRUNCH
+ },
+ {
+ .iv = 250,
+ .lvl = 48,
+ .species = SPECIES_SHIFTRY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TORMENT, MOVE_DOUBLE_TEAM, MOVE_SWAGGER, MOVE_EXTRASENSORY
+ },
+ {
+ .iv = 250,
+ .lvl = 46,
+ .species = SPECIES_CACTURNE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_LEECH_SEED, MOVE_FAINT_ATTACK, MOVE_NEEDLE_ARM, MOVE_COTTON_SPORE
+ },
+ {
+ .iv = 250,
+ .lvl = 48,
+ .species = SPECIES_CRAWDAUNT,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SURF, MOVE_SWORDS_DANCE, MOVE_STRENGTH, MOVE_FACADE
+ },
+ {
+ .iv = 255,
+ .lvl = 49,
+ .species = SPECIES_ABSOL,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_AERIAL_ACE, MOVE_ROCK_SLIDE, MOVE_SWORDS_DANCE, MOVE_SLASH
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Phoebe[] = {
+ {
+ .iv = 250,
+ .lvl = 48,
+ .species = SPECIES_DUSCLOPS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHADOW_PUNCH, MOVE_CONFUSE_RAY, MOVE_CURSE, MOVE_PROTECT
+ },
+ {
+ .iv = 250,
+ .lvl = 49,
+ .species = SPECIES_BANETTE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHADOW_BALL, MOVE_GRUDGE, MOVE_WILL_O_WISP, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 250,
+ .lvl = 50,
+ .species = SPECIES_SABLEYE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHADOW_BALL, MOVE_DOUBLE_TEAM, MOVE_NIGHT_SHADE, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 250,
+ .lvl = 49,
+ .species = SPECIES_BANETTE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_FACADE
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_DUSCLOPS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SHADOW_BALL, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Glacia[] = {
+ {
+ .iv = 250,
+ .lvl = 50,
+ .species = SPECIES_SEALEO,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ENCORE, MOVE_BODY_SLAM, MOVE_HAIL, MOVE_ICE_BALL
+ },
+ {
+ .iv = 250,
+ .lvl = 50,
+ .species = SPECIES_GLALIE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_LIGHT_SCREEN, MOVE_CRUNCH, MOVE_ICY_WIND, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 250,
+ .lvl = 52,
+ .species = SPECIES_SEALEO,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ATTRACT, MOVE_DOUBLE_EDGE, MOVE_HAIL, MOVE_BLIZZARD
+ },
+ {
+ .iv = 250,
+ .lvl = 52,
+ .species = SPECIES_GLALIE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHADOW_BALL, MOVE_EXPLOSION, MOVE_HAIL, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_WALREIN,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SURF, MOVE_BODY_SLAM, MOVE_ICE_BEAM, MOVE_SHEER_COLD
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Drake[] = {
+ {
+ .iv = 250,
+ .lvl = 52,
+ .species = SPECIES_SHELGON,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROCK_TOMB, MOVE_DRAGON_CLAW, MOVE_PROTECT, MOVE_DOUBLE_EDGE
+ },
+ {
+ .iv = 250,
+ .lvl = 54,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_DOUBLE_EDGE, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 250,
+ .lvl = 53,
+ .species = SPECIES_KINGDRA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SMOKESCREEN, MOVE_DRAGON_DANCE, MOVE_SURF, MOVE_BODY_SLAM
+ },
+ {
+ .iv = 250,
+ .lvl = 53,
+ .species = SPECIES_FLYGON,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FLAMETHROWER, MOVE_CRUNCH, MOVE_DRAGON_BREATH, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_SALAMENCE,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_FLAMETHROWER, MOVE_DRAGON_CLAW, MOVE_ROCK_SLIDE, MOVE_CRUNCH
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne1[] = {
+ {
+ .iv = 100,
+ .lvl = 12,
+ .species = SPECIES_GEODUDE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, MOVE_ROCK_TOMB
+ },
+ {
+ .iv = 100,
+ .lvl = 12,
+ .species = SPECIES_GEODUDE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, MOVE_ROCK_TOMB
+ },
+ {
+ .iv = 200,
+ .lvl = 15,
+ .species = SPECIES_NOSEPASS,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_BLOCK, MOVE_HARDEN, MOVE_TACKLE, MOVE_ROCK_TOMB
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Brawly1[] = {
+ {
+ .iv = 100,
+ .lvl = 16,
+ .species = SPECIES_MACHOP,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_KARATE_CHOP, MOVE_LOW_KICK, MOVE_SEISMIC_TOSS, MOVE_BULK_UP
+ },
+ {
+ .iv = 100,
+ .lvl = 16,
+ .species = SPECIES_MEDITITE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_BULK_UP
+ },
+ {
+ .iv = 200,
+ .lvl = 19,
+ .species = SPECIES_MAKUHITA,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_ARM_THRUST, MOVE_VITAL_THROW, MOVE_REVERSAL, MOVE_BULK_UP
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Wattson1[] = {
+ {
+ .iv = 200,
+ .lvl = 20,
+ .species = SPECIES_VOLTORB,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROLLOUT, MOVE_SPARK, MOVE_SELF_DESTRUCT, MOVE_SHOCK_WAVE
+ },
+ {
+ .iv = 200,
+ .lvl = 20,
+ .species = SPECIES_ELECTRIKE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHOCK_WAVE, MOVE_LEER, MOVE_QUICK_ATTACK, MOVE_HOWL
+ },
+ {
+ .iv = 220,
+ .lvl = 22,
+ .species = SPECIES_MAGNETON,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SUPERSONIC, MOVE_SHOCK_WAVE, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM
+ },
+ {
+ .iv = 250,
+ .lvl = 24,
+ .species = SPECIES_MANECTRIC,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_SHOCK_WAVE, MOVE_HOWL
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Flannery1[] = {
+ {
+ .iv = 200,
+ .lvl = 24,
+ .species = SPECIES_NUMEL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_OVERHEAT, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, MOVE_SUNNY_DAY
+ },
+ {
+ .iv = 200,
+ .lvl = 24,
+ .species = SPECIES_SLUGMA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_OVERHEAT, MOVE_SMOG, MOVE_LIGHT_SCREEN, MOVE_SUNNY_DAY
+ },
+ {
+ .iv = 250,
+ .lvl = 26,
+ .species = SPECIES_CAMERUPT,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_OVERHEAT, MOVE_TACKLE, MOVE_SUNNY_DAY, MOVE_ATTRACT
+ },
+ {
+ .iv = 250,
+ .lvl = 29,
+ .species = SPECIES_TORKOAL,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_BODY_SLAM, MOVE_ATTRACT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Norman1[] = {
+ {
+ .iv = 200,
+ .lvl = 27,
+ .species = SPECIES_SPINDA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TEETER_DANCE, MOVE_PSYBEAM, MOVE_FACADE, MOVE_ENCORE
+ },
+ {
+ .iv = 200,
+ .lvl = 27,
+ .species = SPECIES_VIGOROTH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SLASH, MOVE_FACADE, MOVE_ENCORE, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 200,
+ .lvl = 29,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SLASH, MOVE_BELLY_DRUM, MOVE_FACADE, MOVE_HEADBUTT
+ },
+ {
+ .iv = 250,
+ .lvl = 31,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_COUNTER, MOVE_YAWN, MOVE_FACADE, MOVE_FAINT_ATTACK
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Winona1[] = {
+ {
+ .iv = 210,
+ .lvl = 29,
+ .species = SPECIES_SWABLU,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PERISH_SONG, MOVE_MIRROR_MOVE, MOVE_SAFEGUARD, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 210,
+ .lvl = 29,
+ .species = SPECIES_TROPIUS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_SYNTHESIS
+ },
+ {
+ .iv = 210,
+ .lvl = 30,
+ .species = SPECIES_PELIPPER,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_GUN, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 220,
+ .lvl = 31,
+ .species = SPECIES_SKARMORY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SAND_ATTACK, MOVE_FURY_ATTACK, MOVE_STEEL_WING, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 33,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_EARTHQUAKE, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE, MOVE_AERIAL_ACE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza1[] = {
+ {
+ .iv = 250,
+ .lvl = 41,
+ .species = SPECIES_CLAYDOL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 250,
+ .lvl = 41,
+ .species = SPECIES_XATU,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PSYCHIC, MOVE_SUNNY_DAY, MOVE_CONFUSE_RAY, MOVE_CALM_MIND
+ },
+ {
+ .iv = 250,
+ .lvl = 42,
+ .species = SPECIES_LUNATONE,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_LIGHT_SCREEN, MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_CALM_MIND
+ },
+ {
+ .iv = 250,
+ .lvl = 42,
+ .species = SPECIES_SOLROCK,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Juan1[] = {
+ {
+ .iv = 200,
+ .lvl = 41,
+ .species = SPECIES_LUVDISC,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_PULSE, MOVE_ATTRACT, MOVE_SWEET_KISS, MOVE_FLAIL
+ },
+ {
+ .iv = 200,
+ .lvl = 41,
+ .species = SPECIES_WHISCASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_AMNESIA, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 200,
+ .lvl = 43,
+ .species = SPECIES_SEALEO,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ENCORE, MOVE_BODY_SLAM, MOVE_AURORA_BEAM, MOVE_WATER_PULSE
+ },
+ {
+ .iv = 200,
+ .lvl = 43,
+ .species = SPECIES_CRAWDAUNT,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_PULSE, MOVE_CRABHAMMER, MOVE_TAUNT, MOVE_LEER
+ },
+ {
+ .iv = 250,
+ .lvl = 46,
+ .species = SPECIES_KINGDRA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry1[] = {
+ {
+ .iv = 10,
+ .lvl = 9,
+ .species = SPECIES_RALTS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ted[] = {
+ {
+ .iv = 10,
+ .lvl = 17,
+ .species = SPECIES_RALTS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Paul[] = {
+ {
+ .iv = 10,
+ .lvl = 15,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 10,
+ .lvl = 15,
+ .species = SPECIES_ODDISH,
+ },
+ {
+ .iv = 10,
+ .lvl = 15,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry2[] = {
+ {
+ .iv = 20,
+ .lvl = 26,
+ .species = SPECIES_RALTS,
+ },
+ {
+ .iv = 20,
+ .lvl = 26,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry3[] = {
+ {
+ .iv = 30,
+ .lvl = 29,
+ .species = SPECIES_KIRLIA,
+ },
+ {
+ .iv = 30,
+ .lvl = 29,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry4[] = {
+ {
+ .iv = 40,
+ .lvl = 32,
+ .species = SPECIES_KIRLIA,
+ },
+ {
+ .iv = 40,
+ .lvl = 32,
+ .species = SPECIES_MEDICHAM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry5[] = {
+ {
+ .iv = 50,
+ .lvl = 34,
+ .species = SPECIES_KIRLIA,
+ },
+ {
+ .iv = 50,
+ .lvl = 34,
+ .species = SPECIES_BANETTE,
+ },
+ {
+ .iv = 50,
+ .lvl = 34,
+ .species = SPECIES_MEDICHAM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen1[] = {
+ {
+ .iv = 10,
+ .lvl = 9,
+ .species = SPECIES_SHROOMISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Georgia[] = {
+ {
+ .iv = 10,
+ .lvl = 16,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 10,
+ .lvl = 16,
+ .species = SPECIES_BEAUTIFLY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen2[] = {
+ {
+ .iv = 20,
+ .lvl = 26,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 20,
+ .lvl = 26,
+ .species = SPECIES_WHISMUR,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen3[] = {
+ {
+ .iv = 30,
+ .lvl = 29,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 30,
+ .lvl = 29,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen4[] = {
+ {
+ .iv = 40,
+ .lvl = 32,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 40,
+ .lvl = 32,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen5[] = {
+ {
+ .iv = 50,
+ .lvl = 35,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 50,
+ .lvl = 35,
+ .species = SPECIES_EXPLOUD,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_KateAndJoy[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_SPINDA,
+ .moves = MOVE_HYPNOSIS, MOVE_PSYBEAM, MOVE_DIZZY_PUNCH, MOVE_TEETER_DANCE
+ },
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_SLAKING,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_YAWN, MOVE_SLACK_OFF, MOVE_FAINT_ATTACK
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg1[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_ZIGZAGOON,
+ .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_MAKUHITA,
+ .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg2[] = {
+ {
+ .iv = 10,
+ .lvl = 28,
+ .species = SPECIES_ZIGZAGOON,
+ .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH
+ },
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_MAKUHITA,
+ .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg3[] = {
+ {
+ .iv = 20,
+ .lvl = 31,
+ .species = SPECIES_ZIGZAGOON,
+ .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_MAKUHITA,
+ .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg4[] = {
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH
+ },
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_MAKUHITA,
+ .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg5[] = {
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_LINOONE,
+ .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH
+ },
+ {
+ .iv = 40,
+ .lvl = 38,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Victor[] = {
+ {
+ .iv = 25,
+ .lvl = 16,
+ .species = SPECIES_TAILLOW,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 25,
+ .lvl = 16,
+ .species = SPECIES_ZIGZAGOON,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel1[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Colton[] = {
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL
+ },
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL
+ },
+ {
+ .iv = 0,
+ .lvl = 40,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL
+ },
+ {
+ .iv = 0,
+ .lvl = 12,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL
+ },
+ {
+ .iv = 0,
+ .lvl = 42,
+ .species = SPECIES_DELCATTY,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel2[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel3[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_SKITTY,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel4[] = {
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_DELCATTY,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel5[] = {
+ {
+ .iv = 0,
+ .lvl = 38,
+ .species = SPECIES_DELCATTY,
+ .heldItem = ITEM_SITRUS_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Victoria[] = {
+ {
+ .iv = 50,
+ .lvl = 17,
+ .species = SPECIES_ROSELIA,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Vanessa[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_PIKACHU,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Bethany[] = {
+ {
+ .iv = 100,
+ .lvl = 35,
+ .species = SPECIES_AZURILL,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 100,
+ .lvl = 37,
+ .species = SPECIES_MARILL,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_AZUMARILL,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel1[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_PLUSLE,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_MINUN,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel2[] = {
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_PLUSLE,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_MINUN,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_PLUSLE,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_MINUN,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel4[] = {
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_PLUSLE,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_MINUN,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel5[] = {
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_PLUSLE,
+ .heldItem = ITEM_SITRUS_BERRY
+ },
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_MINUN,
+ .heldItem = ITEM_SITRUS_BERRY
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Timothy1[] = {
+ {
+ .iv = 200,
+ .lvl = 27,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy2[] = {
+ {
+ .iv = 210,
+ .lvl = 33,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_ARM_THRUST, MOVE_KNOCK_OFF, MOVE_SAND_ATTACK, MOVE_DIG
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy3[] = {
+ {
+ .iv = 220,
+ .lvl = 36,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_ARM_THRUST, MOVE_KNOCK_OFF, MOVE_SAND_ATTACK, MOVE_DIG
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy4[] = {
+ {
+ .iv = 230,
+ .lvl = 39,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_ARM_THRUST, MOVE_BELLY_DRUM, MOVE_SAND_ATTACK, MOVE_DIG
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy5[] = {
+ {
+ .iv = 240,
+ .lvl = 42,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_ARM_THRUST, MOVE_BELLY_DRUM, MOVE_SAND_ATTACK, MOVE_DIG
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Vicky[] = {
+ {
+ .iv = 200,
+ .lvl = 18,
+ .species = SPECIES_MEDITITE,
+ .moves = MOVE_HI_JUMP_KICK, MOVE_MEDITATE, MOVE_CONFUSION, MOVE_DETECT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby1[] = {
+ {
+ .iv = 200,
+ .lvl = 21,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 200,
+ .lvl = 21,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby2[] = {
+ {
+ .iv = 210,
+ .lvl = 30,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 210,
+ .lvl = 30,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby3[] = {
+ {
+ .iv = 220,
+ .lvl = 33,
+ .species = SPECIES_MEDICHAM,
+ },
+ {
+ .iv = 220,
+ .lvl = 33,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby4[] = {
+ {
+ .iv = 230,
+ .lvl = 36,
+ .species = SPECIES_MEDICHAM,
+ },
+ {
+ .iv = 230,
+ .lvl = 36,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby5[] = {
+ {
+ .iv = 240,
+ .lvl = 39,
+ .species = SPECIES_MEDICHAM,
+ },
+ {
+ .iv = 240,
+ .lvl = 39,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin1[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Billy[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 7,
+ .species = SPECIES_SEEDOT,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Josh[] = {
+ {
+ .iv = 100,
+ .lvl = 10,
+ .species = SPECIES_GEODUDE,
+ .moves = MOVE_TACKLE, MOVE_NONE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tommy[] = {
+ {
+ .iv = 110,
+ .lvl = 8,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 120,
+ .lvl = 8,
+ .species = SPECIES_GEODUDE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Joey[] = {
+ {
+ .iv = 0,
+ .lvl = 9,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Ben[] = {
+ {
+ .iv = 150,
+ .lvl = 17,
+ .species = SPECIES_ZIGZAGOON,
+ .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_GROWL, MOVE_THUNDERBOLT
+ },
+ {
+ .iv = 150,
+ .lvl = 17,
+ .species = SPECIES_GULPIN,
+ .moves = MOVE_AMNESIA, MOVE_SLUDGE, MOVE_YAWN, MOVE_POUND
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Quincy[] = {
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_SLAKING,
+ .moves = MOVE_ATTRACT, MOVE_ICE_BEAM, MOVE_THUNDERBOLT, MOVE_FLAMETHROWER
+ },
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_DUSCLOPS,
+ .moves = MOVE_SKILL_SWAP, MOVE_PROTECT, MOVE_WILL_O_WISP, MOVE_TOXIC
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Katelynn[] = {
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_GARDEVOIR,
+ .moves = MOVE_SKILL_SWAP, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_CALM_MIND
+ },
+ {
+ .iv = 100,
+ .lvl = 43,
+ .species = SPECIES_SLAKING,
+ .moves = MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_AERIAL_ACE, MOVE_BRICK_BREAK
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jaylen[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_TRAPINCH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dillon[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_ARON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin2[] = {
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin3[] = {
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 20,
+ .lvl = 30,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin4[] = {
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 30,
+ .lvl = 29,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 30,
+ .lvl = 33,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin5[] = {
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 40,
+ .lvl = 32,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Eddie[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_ZIGZAGOON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Allen[] = {
+ {
+ .iv = 0,
+ .lvl = 4,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 3,
+ .species = SPECIES_TAILLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Timmy[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_ARON,
+ },
+ {
+ .iv = 0,
+ .lvl = 13,
+ .species = SPECIES_ELECTRIKE,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Wallace[] = {
+ {
+ .iv = 255,
+ .lvl = 57,
+ .species = SPECIES_WAILORD,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_RAIN_DANCE, MOVE_WATER_SPOUT, MOVE_DOUBLE_EDGE, MOVE_BLIZZARD
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_TENTACRUEL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TOXIC, MOVE_HYDRO_PUMP, MOVE_SLUDGE_BOMB, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 56,
+ .species = SPECIES_LUDICOLO,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_GIGA_DRAIN, MOVE_SURF, MOVE_LEECH_SEED, MOVE_DOUBLE_TEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 56,
+ .species = SPECIES_WHISCASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_EARTHQUAKE, MOVE_SURF, MOVE_AMNESIA, MOVE_HYPER_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 56,
+ .species = SPECIES_GYARADOS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM, MOVE_SURF
+ },
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_MILOTIC,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_RECOVER, MOVE_SURF, MOVE_ICE_BEAM, MOVE_TOXIC
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andrew[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 10,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_MAGIKARP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ivan[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 7,
+ .species = SPECIES_MAGIKARP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Claude[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_GOLDEEN,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_BARBOACH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot1[] = {
+ {
+ .iv = 0,
+ .lvl = 10,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 7,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 10,
+ .species = SPECIES_MAGIKARP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ned[] = {
+ {
+ .iv = 10,
+ .lvl = 11,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dale[] = {
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nolan[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_BARBOACH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Barny[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wade[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carter[] = {
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot2[] = {
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 20,
+ .lvl = 26,
+ .species = SPECIES_CARVANHA,
+ },
+ {
+ .iv = 20,
+ .lvl = 26,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot4[] = {
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_CARVANHA,
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_TENTACRUEL,
+ },
+ {
+ .iv = 31,
+ .lvl = 31,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot5[] = {
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_SHARPEDO,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ronald[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 0,
+ .lvl = 23,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_GYARADOS,
+ },
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacob[] = {
+ {
+ .iv = 20,
+ .lvl = 6,
+ .species = SPECIES_VOLTORB,
+ },
+ {
+ .iv = 20,
+ .lvl = 6,
+ .species = SPECIES_VOLTORB,
+ },
+ {
+ .iv = 200,
+ .lvl = 14,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Anthony[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin1[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin2[] = {
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin3[] = {
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin4[] = {
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_MAGNETON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin5[] = {
+ {
+ .iv = 40,
+ .lvl = 39,
+ .species = SPECIES_MAGNETON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail1[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jasmine[] = {
+ {
+ .iv = 80,
+ .lvl = 14,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 80,
+ .lvl = 14,
+ .species = SPECIES_MAGNEMITE,
+ },
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_VOLTORB,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail2[] = {
+ {
+ .iv = 10,
+ .lvl = 28,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail3[] = {
+ {
+ .iv = 20,
+ .lvl = 31,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail4[] = {
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_MAGNETON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail5[] = {
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_MAGNETON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan1[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_DODUO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan2[] = {
+ {
+ .iv = 10,
+ .lvl = 28,
+ .species = SPECIES_DODUO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan3[] = {
+ {
+ .iv = 20,
+ .lvl = 31,
+ .species = SPECIES_DODUO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan4[] = {
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_DODRIO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan5[] = {
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_DODRIO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria1[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_DODUO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria2[] = {
+ {
+ .iv = 10,
+ .lvl = 28,
+ .species = SPECIES_DODUO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria3[] = {
+ {
+ .iv = 20,
+ .lvl = 31,
+ .species = SPECIES_DODUO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria4[] = {
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_DODRIO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria5[] = {
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_DODRIO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Camden[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_STARYU,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Demetrius[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_ELECTRIKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah1[] = {
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo1[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_STARYU,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chase[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 80,
+ .lvl = 34,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah2[] = {
+ {
+ .iv = 10,
+ .lvl = 39,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah3[] = {
+ {
+ .iv = 20,
+ .lvl = 42,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah4[] = {
+ {
+ .iv = 30,
+ .lvl = 45,
+ .species = SPECIES_STARMIE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah5[] = {
+ {
+ .iv = 40,
+ .lvl = 48,
+ .species = SPECIES_STARMIE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isobel[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Donny[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 160,
+ .lvl = 34,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Talia[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn1[] = {
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Allison[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 240,
+ .lvl = 33,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn2[] = {
+ {
+ .iv = 10,
+ .lvl = 39,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn3[] = {
+ {
+ .iv = 20,
+ .lvl = 42,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn4[] = {
+ {
+ .iv = 30,
+ .lvl = 45,
+ .species = SPECIES_STARMIE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn5[] = {
+ {
+ .iv = 40,
+ .lvl = 48,
+ .species = SPECIES_STARMIE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas1[] = {
+ {
+ .iv = 100,
+ .lvl = 37,
+ .species = SPECIES_ALTARIA,
+ },
+ {
+ .iv = 100,
+ .lvl = 37,
+ .species = SPECIES_ALTARIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas2[] = {
+ {
+ .iv = 110,
+ .lvl = 41,
+ .species = SPECIES_ALTARIA,
+ },
+ {
+ .iv = 110,
+ .lvl = 41,
+ .species = SPECIES_ALTARIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas3[] = {
+ {
+ .iv = 120,
+ .lvl = 44,
+ .species = SPECIES_ALTARIA,
+ },
+ {
+ .iv = 120,
+ .lvl = 44,
+ .species = SPECIES_ALTARIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas4[] = {
+ {
+ .iv = 130,
+ .lvl = 46,
+ .species = SPECIES_BAGON,
+ },
+ {
+ .iv = 130,
+ .lvl = 46,
+ .species = SPECIES_ALTARIA,
+ },
+ {
+ .iv = 130,
+ .lvl = 46,
+ .species = SPECIES_ALTARIA,
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Nicolas5[] = {
+ {
+ .iv = 140,
+ .lvl = 49,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 140,
+ .lvl = 49,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 140,
+ .lvl = 49,
+ .species = SPECIES_SHELGON,
+ .heldItem = ITEM_DRAGON_FANG
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Aaron[] = {
+ {
+ .iv = 255,
+ .lvl = 34,
+ .species = SPECIES_BAGON,
+ .moves = MOVE_DRAGON_BREATH, MOVE_HEADBUTT, MOVE_FOCUS_ENERGY, MOVE_EMBER
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Perry[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hugh[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_TROPIUS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Phil[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_SWELLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jared[] = {
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_DODUO,
+ },
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_SKARMORY,
+ },
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_TROPIUS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Humberto[] = {
+ {
+ .iv = 250,
+ .lvl = 30,
+ .species = SPECIES_SKARMORY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Presley[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_XATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwardo[] = {
+ {
+ .iv = 150,
+ .lvl = 29,
+ .species = SPECIES_DODUO,
+ },
+ {
+ .iv = 150,
+ .lvl = 29,
+ .species = SPECIES_PELIPPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Colin[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_NATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert1[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benny[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_XATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chester[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_TAILLOW,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_SWELLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert2[] = {
+ {
+ .iv = 10,
+ .lvl = 32,
+ .species = SPECIES_NATU,
+ },
+ {
+ .iv = 10,
+ .lvl = 32,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert3[] = {
+ {
+ .iv = 20,
+ .lvl = 35,
+ .species = SPECIES_NATU,
+ },
+ {
+ .iv = 20,
+ .lvl = 35,
+ .species = SPECIES_ALTARIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert4[] = {
+ {
+ .iv = 30,
+ .lvl = 38,
+ .species = SPECIES_NATU,
+ },
+ {
+ .iv = 30,
+ .lvl = 38,
+ .species = SPECIES_ALTARIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert5[] = {
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_ALTARIA,
+ },
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_XATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alex[] = {
+ {
+ .iv = 150,
+ .lvl = 33,
+ .species = SPECIES_NATU,
+ },
+ {
+ .iv = 150,
+ .lvl = 33,
+ .species = SPECIES_SWELLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Beck[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_TROPIUS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Yasu[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Takashi[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_NINJASK,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_KOFFING,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Dianne[] = {
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_CLAYDOL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SKILL_SWAP, MOVE_EARTHQUAKE, MOVE_NONE, MOVE_NONE
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_LANTURN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jani[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao1[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SMOG, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SMOG, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lung[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_KOFFING,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao2[] = {
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE
+ },
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao3[] = {
+ {
+ .iv = 20,
+ .lvl = 27,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 20,
+ .lvl = 27,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 20,
+ .lvl = 27,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao4[] = {
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE
+ },
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Lao5[] = {
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_KOFFING,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_KOFFING,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_KOFFING,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT
+ },
+ {
+ .iv = 40,
+ .lvl = 35,
+ .species = SPECIES_WEEZING,
+ .heldItem = ITEM_SMOKE_BALL,
+ .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jocelyn[] = {
+ {
+ .iv = 127,
+ .lvl = 13,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Laura[] = {
+ {
+ .iv = 150,
+ .lvl = 13,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy1[] = {
+ {
+ .iv = 100,
+ .lvl = 18,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 100,
+ .lvl = 18,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cora[] = {
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Paula[] = {
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy2[] = {
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 110,
+ .lvl = 26,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy3[] = {
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 120,
+ .lvl = 29,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy4[] = {
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_MEDICHAM,
+ },
+ {
+ .iv = 130,
+ .lvl = 32,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy5[] = {
+ {
+ .iv = 140,
+ .lvl = 35,
+ .species = SPECIES_MEDICHAM,
+ },
+ {
+ .iv = 140,
+ .lvl = 35,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline1[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_NUMEL,
+ .moves = MOVE_EMBER, MOVE_TACKLE, MOVE_MAGNITUDE, MOVE_SUNNY_DAY
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clarissa[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Angelica[] = {
+ {
+ .iv = 50,
+ .lvl = 30,
+ .species = SPECIES_CASTFORM,
+ .moves = MOVE_RAIN_DANCE, MOVE_WEATHER_BALL, MOVE_THUNDER, MOVE_WATER_PULSE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline2[] = {
+ {
+ .iv = 10,
+ .lvl = 29,
+ .species = SPECIES_NUMEL,
+ .moves = MOVE_EMBER, MOVE_TACKLE, MOVE_MAGNITUDE, MOVE_SUNNY_DAY
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline3[] = {
+ {
+ .iv = 20,
+ .lvl = 32,
+ .species = SPECIES_NUMEL,
+ .moves = MOVE_EMBER, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, MOVE_SUNNY_DAY
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline4[] = {
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_LEECH_SEED, MOVE_MEGA_DRAIN, MOVE_GRASS_WHISTLE, MOVE_SUNNY_DAY
+ },
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_NUMEL,
+ .moves = MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, MOVE_SUNNY_DAY
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline5[] = {
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_CAMERUPT,
+ .moves = MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_SUNNY_DAY
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Beverly[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Imani[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kyla[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Denise[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Beth[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tara[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_HORSEA,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Missy[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alice[] = {
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_GOLDEEN,
+ },
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny1[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grace[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tanya[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_LUVDISC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sharon[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_SEAKING,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nikki[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_SPHEAL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brenda[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katie[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_GOLDEEN,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_SPHEAL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Susie[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_LUVDISC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kara[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_SEAKING,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dana[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_AZUMARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sienna[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_LUVDISC,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_LUVDISC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Debra[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_SEAKING,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Linda[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_HORSEA,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_SEADRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kaylee[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_LANTURN,
+ },
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_PELIPPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Laurel[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_LUVDISC,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_LUVDISC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carlee[] = {
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_SEAKING,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny2[] = {
+ {
+ .iv = 0,
+ .lvl = 38,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny3[] = {
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny4[] = {
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_STARYU,
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny5[] = {
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_LUVDISC,
+ },
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_STARMIE,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Heidi[] = {
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_SANDSHREW,
+ .moves = MOVE_DIG, MOVE_SAND_ATTACK, MOVE_POISON_STING, MOVE_SLASH
+ },
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_BALTOY,
+ .moves = MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, MOVE_ROCK_TOMB
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Becky[] = {
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_SANDSHREW,
+ .moves = MOVE_SAND_ATTACK, MOVE_POISON_STING, MOVE_SLASH, MOVE_DIG
+ },
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_MARILL,
+ .moves = MOVE_ROLLOUT, MOVE_BUBBLE_BEAM, MOVE_TAIL_WHIP, MOVE_DEFENSE_CURL
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carol[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_TAILLOW,
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_LOMBRE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nancy[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_LOMBRE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Martha[] = {
+ {
+ .iv = 0,
+ .lvl = 23,
+ .species = SPECIES_SKITTY,
+ },
+ {
+ .iv = 0,
+ .lvl = 23,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana1[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_ODDISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Cedric[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_WOBBUFFET,
+ .moves = MOVE_DESTINY_BOND, MOVE_SAFEGUARD, MOVE_COUNTER, MOVE_MIRROR_COAT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Irene[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana2[] = {
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana3[] = {
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana4[] = {
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana5[] = {
+ {
+ .iv = 40,
+ .lvl = 40,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 40,
+ .lvl = 40,
+ .species = SPECIES_VILEPLUME,
+ },
+ {
+ .iv = 40,
+ .lvl = 40,
+ .species = SPECIES_ALTARIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv1[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_PLUSLE,
+ },
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_MINUN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv2[] = {
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_PLUSLE,
+ },
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_MINUN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_GinaAndMia1[] = {
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_SEEDOT,
+ },
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_LOTAD,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_MiuAndYuki[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_BEAUTIFLY,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_DUSTOX,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv3[] = {
+ {
+ .iv = 0,
+ .lvl = 9,
+ .species = SPECIES_PLUSLE,
+ },
+ {
+ .iv = 0,
+ .lvl = 9,
+ .species = SPECIES_MINUN,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_GinaAndMia2[] = {
+ {
+ .iv = 0,
+ .lvl = 10,
+ .species = SPECIES_DUSKULL,
+ .moves = MOVE_NIGHT_SHADE, MOVE_DISABLE, MOVE_NONE, MOVE_NONE
+ },
+ {
+ .iv = 0,
+ .lvl = 10,
+ .species = SPECIES_SHROOMISH,
+ .moves = MOVE_ABSORB, MOVE_LEECH_SEED, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv4[] = {
+ {
+ .iv = 20,
+ .lvl = 30,
+ .species = SPECIES_PLUSLE,
+ },
+ {
+ .iv = 20,
+ .lvl = 30,
+ .species = SPECIES_MINUN,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_AmyAndLiv5[] = {
+ {
+ .iv = 30,
+ .lvl = 33,
+ .species = SPECIES_PLUSLE,
+ .moves = MOVE_SPARK, MOVE_CHARGE, MOVE_FAKE_TEARS, MOVE_HELPING_HAND
+ },
+ {
+ .iv = 30,
+ .lvl = 33,
+ .species = SPECIES_MINUN,
+ .moves = MOVE_SPARK, MOVE_CHARGE, MOVE_CHARM, MOVE_HELPING_HAND
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_AmyAndLiv6[] = {
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_PLUSLE,
+ .moves = MOVE_THUNDER, MOVE_CHARGE, MOVE_FAKE_TEARS, MOVE_HELPING_HAND
+ },
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_MINUN,
+ .moves = MOVE_THUNDER, MOVE_CHARGE, MOVE_CHARM, MOVE_HELPING_HAND
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Huey[] = {
+ {
+ .iv = 10,
+ .lvl = 12,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 10,
+ .lvl = 12,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edmond[] = {
+ {
+ .iv = 0,
+ .lvl = 13,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest1[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dwayne[] = {
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Phillip[] = {
+ {
+ .iv = 0,
+ .lvl = 44,
+ .species = SPECIES_TENTACRUEL,
+ },
+ {
+ .iv = 0,
+ .lvl = 44,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leonard[] = {
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Duncan[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_SPHEAL,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest2[] = {
+ {
+ .iv = 10,
+ .lvl = 36,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 10,
+ .lvl = 36,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 10,
+ .lvl = 36,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest3[] = {
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest4[] = {
+ {
+ .iv = 30,
+ .lvl = 42,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 30,
+ .lvl = 42,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 30,
+ .lvl = 42,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest5[] = {
+ {
+ .iv = 40,
+ .lvl = 45,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 40,
+ .lvl = 45,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 40,
+ .lvl = 45,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Eli[] = {
+ {
+ .iv = 100,
+ .lvl = 23,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Annika[] = {
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_FEEBAS,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_FLAIL, MOVE_WATER_PULSE, MOVE_RETURN, MOVE_ATTRACT
+ },
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_FEEBAS,
+ .heldItem = ITEM_ORAN_BERRY,
+ .moves = MOVE_FLAIL, MOVE_WATER_PULSE, MOVE_RETURN, MOVE_ATTRACT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jazmyn[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_ABSOL,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Jonas[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_TOXIC, MOVE_THUNDER, MOVE_SELF_DESTRUCT, MOVE_SLUDGE_BOMB
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Kayley[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_CASTFORM,
+ .moves = MOVE_SUNNY_DAY, MOVE_WEATHER_BALL, MOVE_FLAMETHROWER, MOVE_SOLAR_BEAM
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Auron[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_MACHAMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kelvin[] = {
+ {
+ .iv = 150,
+ .lvl = 33,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 150,
+ .lvl = 33,
+ .species = SPECIES_SPHEAL,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Marley[] = {
+ {
+ .iv = 255,
+ .lvl = 34,
+ .species = SPECIES_MANECTRIC,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_BITE, MOVE_ROAR, MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Reyna[] = {
+ {
+ .iv = 50,
+ .lvl = 33,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 200,
+ .lvl = 33,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hudson[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Conor[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_CHINCHOU,
+ },
+ {
+ .iv = 200,
+ .lvl = 33,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin1[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hector[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_ZANGOOSE,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SEVIPER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tabitha1[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_CAMERUPT,
+ },
+ {
+ .iv = 100,
+ .lvl = 38,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 100,
+ .lvl = 40,
+ .species = SPECIES_GOLBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin2[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin3[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin4[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin5[] = {
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_LUDICOLO,
+ },
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_SHIFTRY,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally1[] = {
+ {
+ .iv = 150,
+ .lvl = 44,
+ .species = SPECIES_ALTARIA,
+ .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE
+ },
+ {
+ .iv = 150,
+ .lvl = 43,
+ .species = SPECIES_DELCATTY,
+ .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 150,
+ .lvl = 44,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC
+ },
+ {
+ .iv = 150,
+ .lvl = 41,
+ .species = SPECIES_MAGNETON,
+ .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH
+ },
+ {
+ .iv = 250,
+ .lvl = 45,
+ .species = SPECIES_GARDEVOIR,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan1[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_TREECKO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan2[] = {
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 100,
+ .lvl = 20,
+ .species = SPECIES_GROVYLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan3[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_GROVYLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan4[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_TORCHIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan5[] = {
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 100,
+ .lvl = 20,
+ .species = SPECIES_COMBUSKEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan6[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_COMBUSKEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan7[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_MUDKIP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan8[] = {
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 100,
+ .lvl = 20,
+ .species = SPECIES_MARSHTOMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan9[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_MARSHTOMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May1[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_TREECKO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May2[] = {
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 100,
+ .lvl = 20,
+ .species = SPECIES_GROVYLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May3[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_GROVYLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May4[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_TORCHIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May5[] = {
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 100,
+ .lvl = 20,
+ .species = SPECIES_COMBUSKEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May6[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_COMBUSKEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May7[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_MUDKIP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May8[] = {
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 100,
+ .lvl = 20,
+ .species = SPECIES_MARSHTOMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May9[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_MARSHTOMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac1[] = {
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_WHISMUR,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_ARON,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_TAILLOW,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Davis[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_PINSIR,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Mitchell[] = {
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_LUNATONE,
+ .moves = MOVE_EXPLOSION, MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_PSYCHIC
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_SOLROCK,
+ .moves = MOVE_EXPLOSION, MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_SHADOW_BALL
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac2[] = {
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_ARON,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac3[] = {
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_ARON,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac4[] = {
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_ARON,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac5[] = {
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_LAIRON,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_HARIYAMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia1[] = {
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_SKITTY,
+ },
+ {
+ .iv = 0,
+ .lvl = 11,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Halle[] = {
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_SABLEYE,
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_ABSOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Garrison[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_SANDSLASH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia2[] = {
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_SKITTY,
+ },
+ {
+ .iv = 10,
+ .lvl = 22,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia3[] = {
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_DELCATTY,
+ },
+ {
+ .iv = 20,
+ .lvl = 25,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia4[] = {
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_DELCATTY,
+ },
+ {
+ .iv = 30,
+ .lvl = 28,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia5[] = {
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_BRELOOM,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_AZUMARILL,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_DELCATTY,
+ },
+ {
+ .iv = 40,
+ .lvl = 31,
+ .species = SPECIES_SEAKING,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson1[] = {
+ {
+ .iv = 50,
+ .lvl = 27,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lorenzo[] = {
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_SEEDOT,
+ },
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_NUZLEAF,
+ },
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_LOMBRE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sebastian[] = {
+ {
+ .iv = 50,
+ .lvl = 39,
+ .species = SPECIES_CACTURNE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson2[] = {
+ {
+ .iv = 60,
+ .lvl = 31,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson3[] = {
+ {
+ .iv = 70,
+ .lvl = 34,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson4[] = {
+ {
+ .iv = 80,
+ .lvl = 37,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson5[] = {
+ {
+ .iv = 90,
+ .lvl = 39,
+ .species = SPECIES_KECLEON,
+ },
+ {
+ .iv = 90,
+ .lvl = 39,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine1[] = {
+ {
+ .iv = 50,
+ .lvl = 26,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 50,
+ .lvl = 26,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenna[] = {
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_LOTAD,
+ },
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 50,
+ .lvl = 28,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sophia[] = {
+ {
+ .iv = 50,
+ .lvl = 38,
+ .species = SPECIES_SWABLU,
+ },
+ {
+ .iv = 50,
+ .lvl = 38,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine2[] = {
+ {
+ .iv = 60,
+ .lvl = 30,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 60,
+ .lvl = 30,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine3[] = {
+ {
+ .iv = 70,
+ .lvl = 33,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 70,
+ .lvl = 33,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine4[] = {
+ {
+ .iv = 80,
+ .lvl = 36,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 80,
+ .lvl = 36,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine5[] = {
+ {
+ .iv = 90,
+ .lvl = 39,
+ .species = SPECIES_BELLOSSOM,
+ },
+ {
+ .iv = 90,
+ .lvl = 39,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Julio[] = {
+ {
+ .iv = 0,
+ .lvl = 21,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt27[] = {
+ {
+ .iv = 50,
+ .lvl = 35,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 50,
+ .lvl = 35,
+ .species = SPECIES_GOLBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt28[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt29[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt30[] = {
+ {
+ .iv = 50,
+ .lvl = 22,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 50,
+ .lvl = 22,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marc[] = {
+ {
+ .iv = 120,
+ .lvl = 8,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 130,
+ .lvl = 8,
+ .species = SPECIES_GEODUDE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brenden[] = {
+ {
+ .iv = 100,
+ .lvl = 13,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lilith[] = {
+ {
+ .iv = 150,
+ .lvl = 13,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristian[] = {
+ {
+ .iv = 200,
+ .lvl = 13,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sylvia[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leonardo[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Athena[] = {
+ {
+ .iv = 100,
+ .lvl = 32,
+ .species = SPECIES_MANECTRIC,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_THUNDER_WAVE, MOVE_QUICK_ATTACK, MOVE_NONE
+ },
+ {
+ .iv = 100,
+ .lvl = 32,
+ .species = SPECIES_LINOONE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SURF, MOVE_THIEF, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Harrison[] = {
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt31[] = {
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clarence[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Terry[] = {
+ {
+ .iv = 0,
+ .lvl = 37,
+ .species = SPECIES_GIRAFARIG,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nate[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_SPOINK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kathleen[] = {
+ {
+ .iv = 100,
+ .lvl = 36,
+ .species = SPECIES_KADABRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clifford[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_GIRAFARIG,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicholas[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_WOBBUFFET,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt32[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt33[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_BALTOY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt34[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt35[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt36[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_BALTOY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Macey[] = {
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_NATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan10[] = {
+ {
+ .iv = 25,
+ .lvl = 13,
+ .species = SPECIES_LOTAD,
+ },
+ {
+ .iv = 50,
+ .lvl = 15,
+ .species = SPECIES_TORCHIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan11[] = {
+ {
+ .iv = 25,
+ .lvl = 13,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 50,
+ .lvl = 15,
+ .species = SPECIES_TREECKO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Paxton[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isabella[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt37[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tabitha2[] = {
+ {
+ .iv = 50,
+ .lvl = 18,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 50,
+ .lvl = 20,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 50,
+ .lvl = 22,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 50,
+ .lvl = 22,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jonathan[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_KECLEON,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan12[] = {
+ {
+ .iv = 25,
+ .lvl = 13,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 50,
+ .lvl = 15,
+ .species = SPECIES_MUDKIP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May10[] = {
+ {
+ .iv = 25,
+ .lvl = 13,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 50,
+ .lvl = 15,
+ .species = SPECIES_TREECKO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maxie1[] = {
+ {
+ .iv = 150,
+ .lvl = 37,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 150,
+ .lvl = 38,
+ .species = SPECIES_CROBAT,
+ },
+ {
+ .iv = 150,
+ .lvl = 39,
+ .species = SPECIES_CAMERUPT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maxie2[] = {
+ {
+ .iv = 150,
+ .lvl = 24,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 150,
+ .lvl = 24,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 150,
+ .lvl = 25,
+ .species = SPECIES_CAMERUPT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tiana[] = {
+ {
+ .iv = 0,
+ .lvl = 4,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 4,
+ .species = SPECIES_SHROOMISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley1[] = {
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_LOTAD,
+ },
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_SHROOMISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Janice[] = {
+ {
+ .iv = 0,
+ .lvl = 9,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Vivi[] = {
+ {
+ .iv = 100,
+ .lvl = 15,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 100,
+ .lvl = 15,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 100,
+ .lvl = 15,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley2[] = {
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_SHROOMISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley4[] = {
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 30,
+ .lvl = 32,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley5[] = {
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 40,
+ .lvl = 34,
+ .species = SPECIES_BRELOOM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sally[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_ODDISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robin[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_SKITTY,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andrea[] = {
+ {
+ .iv = 100,
+ .lvl = 40,
+ .species = SPECIES_LUVDISC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Crissy[] = {
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_GOLDEEN,
+ },
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rick[] = {
+ {
+ .iv = 0,
+ .lvl = 4,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 0,
+ .lvl = 4,
+ .species = SPECIES_WURMPLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lyle[] = {
+ {
+ .iv = 0,
+ .lvl = 3,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 0,
+ .lvl = 3,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 0,
+ .lvl = 3,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 0,
+ .lvl = 3,
+ .species = SPECIES_WURMPLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jose[] = {
+ {
+ .iv = 50,
+ .lvl = 8,
+ .species = SPECIES_WURMPLE,
+ },
+ {
+ .iv = 50,
+ .lvl = 8,
+ .species = SPECIES_NINCADA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Doug[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_NINCADA,
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Greg[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_VOLBEAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_ILLUMISE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kent[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_James1[] = {
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_NINCADA,
+ },
+ {
+ .iv = 0,
+ .lvl = 6,
+ .species = SPECIES_NINCADA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_James2[] = {
+ {
+ .iv = 10,
+ .lvl = 27,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_James3[] = {
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_DUSTOX,
+ },
+ {
+ .iv = 20,
+ .lvl = 29,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_James4[] = {
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_DUSTOX,
+ },
+ {
+ .iv = 30,
+ .lvl = 31,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_James5[] = {
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_SURSKIT,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_NINJASK,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_DUSTOX,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_NINJASK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brice[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent1[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_GEODUDE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lenny[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lucas1[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alan[] = {
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_NOSEPASS,
+ },
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_GRAVELER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clark[] = {
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_GEODUDE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Eric[] = {
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_BALTOY,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Lucas2[] = {
+ {
+ .iv = 0,
+ .lvl = 9,
+ .species = SPECIES_WAILMER,
+ .moves = MOVE_SPLASH, MOVE_WATER_GUN, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Mike1[] = {
+ {
+ .iv = 0,
+ .lvl = 10,
+ .species = SPECIES_PELIPPER,
+ .moves = MOVE_GUST, MOVE_GROWL, MOVE_NONE, MOVE_NONE
+ },
+ {
+ .iv = 0,
+ .lvl = 10,
+ .species = SPECIES_POOCHYENA,
+ .moves = MOVE_BITE, MOVE_SCARY_FACE, MOVE_NONE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mike2[] = {
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 16,
+ .species = SPECIES_MACHOP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent2[] = {
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 10,
+ .lvl = 24,
+ .species = SPECIES_GRAVELER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent3[] = {
+ {
+ .iv = 20,
+ .lvl = 27,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 20,
+ .lvl = 27,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 20,
+ .lvl = 27,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 20,
+ .lvl = 27,
+ .species = SPECIES_GRAVELER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent4[] = {
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_GRAVELER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent5[] = {
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_GRAVELER,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_GOLEM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_DezAndLuke[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_DELCATTY,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_MANECTRIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_LeaAndJed[] = {
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_LUVDISC,
+ },
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_LUVDISC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan1[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_VOLBEAT,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_ILLUMISE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan2[] = {
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_VOLBEAT,
+ },
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_ILLUMISE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan3[] = {
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_VOLBEAT,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_ILLUMISE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan4[] = {
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_VOLBEAT,
+ },
+ {
+ .iv = 30,
+ .lvl = 36,
+ .species = SPECIES_ILLUMISE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan5[] = {
+ {
+ .iv = 40,
+ .lvl = 39,
+ .species = SPECIES_VOLBEAT,
+ },
+ {
+ .iv = 40,
+ .lvl = 39,
+ .species = SPECIES_ILLUMISE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Johanna[] = {
+ {
+ .iv = 0,
+ .lvl = 13,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Gerald[] = {
+ {
+ .iv = 100,
+ .lvl = 23,
+ .species = SPECIES_KECLEON,
+ .moves = MOVE_FLAMETHROWER, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK, MOVE_BIND
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Vivian[] = {
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_MEDITITE,
+ .moves = MOVE_BIDE, MOVE_DETECT, MOVE_CONFUSION, MOVE_THUNDER_PUNCH
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_MEDITITE,
+ .moves = MOVE_THUNDER_PUNCH, MOVE_DETECT, MOVE_CONFUSION, MOVE_MEDITATE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Danielle[] = {
+ {
+ .iv = 100,
+ .lvl = 23,
+ .species = SPECIES_MEDITITE,
+ .moves = MOVE_BIDE, MOVE_DETECT, MOVE_CONFUSION, MOVE_FIRE_PUNCH
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Hideo[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_TACKLE, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_TACKLE, MOVE_POISON_GAS, MOVE_SLUDGE, MOVE_SMOKESCREEN
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Keigo[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_POISON_GAS, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_NINJASK,
+ .moves = MOVE_SAND_ATTACK, MOVE_DOUBLE_TEAM, MOVE_FURY_CUTTER, MOVE_SWORDS_DANCE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Riley[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_NINCADA,
+ .moves = MOVE_LEECH_LIFE, MOVE_FURY_SWIPES, MOVE_MIND_READER, MOVE_DIG
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_KOFFING,
+ .moves = MOVE_TACKLE, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Flint[] = {
+ {
+ .iv = 150,
+ .lvl = 29,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 150,
+ .lvl = 29,
+ .species = SPECIES_XATU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ashley[] = {
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_SWABLU,
+ },
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_SWABLU,
+ },
+ {
+ .iv = 100,
+ .lvl = 27,
+ .species = SPECIES_SWABLU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wally2[] = {
+ {
+ .iv = 30,
+ .lvl = 16,
+ .species = SPECIES_RALTS,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally3[] = {
+ {
+ .iv = 150,
+ .lvl = 47,
+ .species = SPECIES_ALTARIA,
+ .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE
+ },
+ {
+ .iv = 150,
+ .lvl = 46,
+ .species = SPECIES_DELCATTY,
+ .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 150,
+ .lvl = 47,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC
+ },
+ {
+ .iv = 150,
+ .lvl = 44,
+ .species = SPECIES_MAGNETON,
+ .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH
+ },
+ {
+ .iv = 250,
+ .lvl = 48,
+ .species = SPECIES_GARDEVOIR,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally4[] = {
+ {
+ .iv = 150,
+ .lvl = 50,
+ .species = SPECIES_ALTARIA,
+ .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE
+ },
+ {
+ .iv = 150,
+ .lvl = 49,
+ .species = SPECIES_DELCATTY,
+ .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 150,
+ .lvl = 50,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC
+ },
+ {
+ .iv = 150,
+ .lvl = 47,
+ .species = SPECIES_MAGNETON,
+ .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH
+ },
+ {
+ .iv = 250,
+ .lvl = 51,
+ .species = SPECIES_GARDEVOIR,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally5[] = {
+ {
+ .iv = 150,
+ .lvl = 53,
+ .species = SPECIES_ALTARIA,
+ .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE
+ },
+ {
+ .iv = 150,
+ .lvl = 52,
+ .species = SPECIES_DELCATTY,
+ .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 150,
+ .lvl = 53,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC
+ },
+ {
+ .iv = 150,
+ .lvl = 50,
+ .species = SPECIES_MAGNETON,
+ .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH
+ },
+ {
+ .iv = 250,
+ .lvl = 54,
+ .species = SPECIES_GARDEVOIR,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally6[] = {
+ {
+ .iv = 150,
+ .lvl = 56,
+ .species = SPECIES_ALTARIA,
+ .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE
+ },
+ {
+ .iv = 150,
+ .lvl = 55,
+ .species = SPECIES_DELCATTY,
+ .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK
+ },
+ {
+ .iv = 150,
+ .lvl = 56,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC
+ },
+ {
+ .iv = 150,
+ .lvl = 53,
+ .species = SPECIES_MAGNETON,
+ .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH
+ },
+ {
+ .iv = 250,
+ .lvl = 57,
+ .species = SPECIES_GARDEVOIR,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan13[] = {
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 200,
+ .lvl = 34,
+ .species = SPECIES_GROVYLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan14[] = {
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_LUDICOLO,
+ },
+ {
+ .iv = 200,
+ .lvl = 34,
+ .species = SPECIES_COMBUSKEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan15[] = {
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_LUDICOLO,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 200,
+ .lvl = 34,
+ .species = SPECIES_MARSHTOMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May11[] = {
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 200,
+ .lvl = 34,
+ .species = SPECIES_GROVYLE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May12[] = {
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_LUDICOLO,
+ },
+ {
+ .iv = 200,
+ .lvl = 34,
+ .species = SPECIES_COMBUSKEN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May13[] = {
+ {
+ .iv = 150,
+ .lvl = 31,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_LUDICOLO,
+ },
+ {
+ .iv = 150,
+ .lvl = 32,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 200,
+ .lvl = 34,
+ .species = SPECIES_MARSHTOMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jonah[] = {
+ {
+ .iv = 0,
+ .lvl = 30,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Henry[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_CARVANHA,
+ },
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Roger[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_GYARADOS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alexa[] = {
+ {
+ .iv = 100,
+ .lvl = 34,
+ .species = SPECIES_GLOOM,
+ },
+ {
+ .iv = 100,
+ .lvl = 34,
+ .species = SPECIES_AZUMARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ruben[] = {
+ {
+ .iv = 100,
+ .lvl = 34,
+ .species = SPECIES_SHIFTRY,
+ },
+ {
+ .iv = 100,
+ .lvl = 34,
+ .species = SPECIES_NOSEPASS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji1[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wayne[] = {
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 31,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 36,
+ .species = SPECIES_WAILMER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Aidan[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_SKARMORY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Reed[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_SPHEAL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tisha[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_CHINCHOU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_ToriAndTia[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_SPINDA,
+ },
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_SPINDA,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_KimAndIris[] = {
+ {
+ .iv = 0,
+ .lvl = 32,
+ .species = SPECIES_SWABLU,
+ .moves = MOVE_SING, MOVE_FURY_ATTACK, MOVE_SAFEGUARD, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_NUMEL,
+ .moves = MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_REST, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_TyraAndIvy[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_ROSELIA,
+ .moves = MOVE_GROWTH, MOVE_STUN_SPORE, MOVE_MEGA_DRAIN, MOVE_LEECH_SEED
+ },
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_GRAVELER,
+ .moves = MOVE_DEFENSE_CURL, MOVE_ROLLOUT, MOVE_MUD_SPORT, MOVE_ROCK_THROW
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_MelAndPaul[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_DUSTOX,
+ .moves = MOVE_GUST, MOVE_PSYBEAM, MOVE_TOXIC, MOVE_PROTECT
+ },
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_BEAUTIFLY,
+ .moves = MOVE_GUST, MOVE_MEGA_DRAIN, MOVE_ATTRACT, MOVE_STUN_SPORE
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay1[] = {
+ {
+ .iv = 200,
+ .lvl = 39,
+ .species = SPECIES_MEDICHAM,
+ .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT
+ },
+ {
+ .iv = 200,
+ .lvl = 39,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay2[] = {
+ {
+ .iv = 210,
+ .lvl = 43,
+ .species = SPECIES_MEDICHAM,
+ .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT
+ },
+ {
+ .iv = 210,
+ .lvl = 43,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay3[] = {
+ {
+ .iv = 220,
+ .lvl = 46,
+ .species = SPECIES_MEDICHAM,
+ .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT
+ },
+ {
+ .iv = 220,
+ .lvl = 46,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay4[] = {
+ {
+ .iv = 230,
+ .lvl = 49,
+ .species = SPECIES_MEDICHAM,
+ .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT
+ },
+ {
+ .iv = 230,
+ .lvl = 49,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay5[] = {
+ {
+ .iv = 240,
+ .lvl = 52,
+ .species = SPECIES_MEDICHAM,
+ .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT
+ },
+ {
+ .iv = 240,
+ .lvl = 52,
+ .species = SPECIES_HARIYAMA,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_ReliAndIan[] = {
+ {
+ .iv = 0,
+ .lvl = 35,
+ .species = SPECIES_AZUMARILL,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy1[] = {
+ {
+ .iv = 0,
+ .lvl = 34,
+ .species = SPECIES_CHINCHOU,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy2[] = {
+ {
+ .iv = 0,
+ .lvl = 42,
+ .species = SPECIES_CHINCHOU,
+ },
+ {
+ .iv = 0,
+ .lvl = 40,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy3[] = {
+ {
+ .iv = 0,
+ .lvl = 45,
+ .species = SPECIES_LANTURN,
+ },
+ {
+ .iv = 0,
+ .lvl = 43,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy4[] = {
+ {
+ .iv = 0,
+ .lvl = 48,
+ .species = SPECIES_LANTURN,
+ },
+ {
+ .iv = 0,
+ .lvl = 46,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy5[] = {
+ {
+ .iv = 0,
+ .lvl = 51,
+ .species = SPECIES_LANTURN,
+ },
+ {
+ .iv = 0,
+ .lvl = 49,
+ .species = SPECIES_SHARPEDO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_LisaAndRay[] = {
+ {
+ .iv = 0,
+ .lvl = 27,
+ .species = SPECIES_GOLDEEN,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chris[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_MAGIKARP,
+ },
+ {
+ .iv = 0,
+ .lvl = 20,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_FEEBAS,
+ },
+ {
+ .iv = 0,
+ .lvl = 23,
+ .species = SPECIES_CARVANHA,
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Dawson[] = {
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_ZIGZAGOON,
+ .heldItem = ITEM_NUGGET
+ },
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_POOCHYENA,
+ .heldItem = ITEM_NONE
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Sarah[] = {
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_LOTAD,
+ .heldItem = ITEM_NONE
+ },
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_ZIGZAGOON,
+ .heldItem = ITEM_NUGGET
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darian[] = {
+ {
+ .iv = 0,
+ .lvl = 9,
+ .species = SPECIES_MAGIKARP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hailey[] = {
+ {
+ .iv = 0,
+ .lvl = 13,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chandler[] = {
+ {
+ .iv = 0,
+ .lvl = 12,
+ .species = SPECIES_TENTACOOL,
+ },
+ {
+ .iv = 0,
+ .lvl = 12,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonItemDefaultMoves gTrainerParty_Kaleb[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_MINUN,
+ .heldItem = ITEM_ORAN_BERRY
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_PLUSLE,
+ .heldItem = ITEM_ORAN_BERRY
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Joseph[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_VOLTORB,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alyssa[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_MAGNEMITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marcos[] = {
+ {
+ .iv = 100,
+ .lvl = 15,
+ .species = SPECIES_VOLTORB,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rhett[] = {
+ {
+ .iv = 100,
+ .lvl = 15,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tyron[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_SANDSHREW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Celina[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bianca[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SHROOMISH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hayden[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sophie[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_LOMBRE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Coby[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_SKARMORY,
+ },
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_SWELLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lawrence[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_BALTOY,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SANDSHREW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wyatt[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_ARON,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_ARON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Angelina[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kai[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_BARBOACH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Charlotte[] = {
+ {
+ .iv = 0,
+ .lvl = 19,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Deandre[] = {
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ARON,
+ },
+ {
+ .iv = 0,
+ .lvl = 14,
+ .species = SPECIES_ELECTRIKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt38[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt39[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt40[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt41[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_BALTOY,
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt42[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_BALTOY,
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt43[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt44[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt45[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_POOCHYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt46[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt47[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt48[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_BALTOY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt49[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt50[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_ZUBAT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt51[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_MIGHTYENA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt52[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt53[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_BALTOY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tabitha3[] = {
+ {
+ .iv = 75,
+ .lvl = 26,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 75,
+ .lvl = 28,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 75,
+ .lvl = 30,
+ .species = SPECIES_ZUBAT,
+ },
+ {
+ .iv = 75,
+ .lvl = 33,
+ .species = SPECIES_CAMERUPT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darcy[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_CAMERUPT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maxie3[] = {
+ {
+ .iv = 150,
+ .lvl = 42,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 150,
+ .lvl = 43,
+ .species = SPECIES_CROBAT,
+ },
+ {
+ .iv = 150,
+ .lvl = 44,
+ .species = SPECIES_CAMERUPT,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pete[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isabelle[] = {
+ {
+ .iv = 0,
+ .lvl = 15,
+ .species = SPECIES_MARILL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres1[] = {
+ {
+ .iv = 50,
+ .lvl = 25,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 50,
+ .lvl = 25,
+ .species = SPECIES_SANDSHREW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Josue[] = {
+ {
+ .iv = 50,
+ .lvl = 25,
+ .species = SPECIES_TAILLOW,
+ },
+ {
+ .iv = 50,
+ .lvl = 25,
+ .species = SPECIES_WINGULL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Camron[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory1[] = {
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 0,
+ .lvl = 24,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carolina[] = {
+ {
+ .iv = 50,
+ .lvl = 24,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 50,
+ .lvl = 24,
+ .species = SPECIES_SWELLOW,
+ },
+ {
+ .iv = 50,
+ .lvl = 24,
+ .species = SPECIES_MANECTRIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elijah[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_SKARMORY,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_SKARMORY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Celia[] = {
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_LOMBRE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bryan[] = {
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_SANDSLASH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Branden[] = {
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_TAILLOW,
+ },
+ {
+ .iv = 0,
+ .lvl = 22,
+ .species = SPECIES_NUZLEAF,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bryant[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SLUGMA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shayla[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_ROSELIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kyra[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_DODUO,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_DODRIO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jaiden[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_NINJASK,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_GULPIN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alix[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_KADABRA,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_KIRLIA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Helene[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marlene[] = {
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 0,
+ .lvl = 18,
+ .species = SPECIES_SPOINK,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Devan[] = {
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_GEODUDE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Johnson[] = {
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 0,
+ .lvl = 8,
+ .species = SPECIES_LOTAD,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Melina[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_DODUO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brandi[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_RALTS,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Aisha[] = {
+ {
+ .iv = 0,
+ .lvl = 17,
+ .species = SPECIES_MEDITITE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Makayla[] = {
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_ROSELIA,
+ },
+ {
+ .iv = 0,
+ .lvl = 33,
+ .species = SPECIES_MEDICHAM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fabian[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_MANECTRIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dayton[] = {
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_SLUGMA,
+ },
+ {
+ .iv = 0,
+ .lvl = 25,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rachel[] = {
+ {
+ .iv = 0,
+ .lvl = 26,
+ .species = SPECIES_GOLDEEN,
+ }
+};
+
+const struct TrainerMonNoItemCustomMoves gTrainerParty_Leonel[] = {
+ {
+ .iv = 100,
+ .lvl = 30,
+ .species = SPECIES_MANECTRIC,
+ .moves = MOVE_THUNDER, MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Callie[] = {
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_MEDITITE,
+ },
+ {
+ .iv = 0,
+ .lvl = 28,
+ .species = SPECIES_MAKUHITA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cale[] = {
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_DUSTOX,
+ },
+ {
+ .iv = 0,
+ .lvl = 29,
+ .species = SPECIES_BEAUTIFLY,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Myles[] = {
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_MAKUHITA,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_TROPIUS,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pat[] = {
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_POOCHYENA,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_SHROOMISH,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_MARILL,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 10,
+ .lvl = 25,
+ .species = SPECIES_GULPIN,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin1[] = {
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 100,
+ .lvl = 29,
+ .species = SPECIES_VIGOROTH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May14[] = {
+ {
+ .iv = 25,
+ .lvl = 13,
+ .species = SPECIES_LOTAD,
+ },
+ {
+ .iv = 50,
+ .lvl = 15,
+ .species = SPECIES_TORCHIC,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May15[] = {
+ {
+ .iv = 25,
+ .lvl = 13,
+ .species = SPECIES_TORKOAL,
+ },
+ {
+ .iv = 50,
+ .lvl = 15,
+ .species = SPECIES_MUDKIP,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne2[] = {
+ {
+ .iv = 255,
+ .lvl = 32,
+ .species = SPECIES_GOLEM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PROTECT, MOVE_ROLLOUT, MOVE_MAGNITUDE, MOVE_EXPLOSION
+ },
+ {
+ .iv = 255,
+ .lvl = 35,
+ .species = SPECIES_KABUTO,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 35,
+ .species = SPECIES_ONIX,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 37,
+ .species = SPECIES_NOSEPASS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne3[] = {
+ {
+ .iv = 255,
+ .lvl = 37,
+ .species = SPECIES_OMANYTE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_SURF
+ },
+ {
+ .iv = 255,
+ .lvl = 37,
+ .species = SPECIES_GOLEM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PROTECT, MOVE_ROLLOUT, MOVE_MAGNITUDE, MOVE_EXPLOSION
+ },
+ {
+ .iv = 255,
+ .lvl = 40,
+ .species = SPECIES_KABUTOPS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 40,
+ .species = SPECIES_ONIX,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 42,
+ .species = SPECIES_NOSEPASS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne4[] = {
+ {
+ .iv = 255,
+ .lvl = 42,
+ .species = SPECIES_OMASTAR,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_SURF
+ },
+ {
+ .iv = 255,
+ .lvl = 42,
+ .species = SPECIES_GOLEM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PROTECT, MOVE_ROLLOUT, MOVE_EARTHQUAKE, MOVE_EXPLOSION
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_KABUTOPS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_ONIX,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 47,
+ .species = SPECIES_NOSEPASS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne5[] = {
+ {
+ .iv = 255,
+ .lvl = 47,
+ .species = SPECIES_AERODACTYL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROCK_SLIDE, MOVE_HYPER_BEAM, MOVE_SUPERSONIC, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 47,
+ .species = SPECIES_GOLEM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_ROLLOUT, MOVE_EARTHQUAKE, MOVE_EXPLOSION
+ },
+ {
+ .iv = 255,
+ .lvl = 47,
+ .species = SPECIES_OMASTAR,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_SURF
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_KABUTOPS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_STEELIX,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 52,
+ .species = SPECIES_NOSEPASS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Brawly2[] = {
+ {
+ .iv = 255,
+ .lvl = 33,
+ .species = SPECIES_MACHAMP,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP
+ },
+ {
+ .iv = 255,
+ .lvl = 33,
+ .species = SPECIES_MEDITITE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PSYCHIC, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_FOCUS_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 35,
+ .species = SPECIES_HITMONTOP,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK
+ },
+ {
+ .iv = 255,
+ .lvl = 37,
+ .species = SPECIES_HARIYAMA,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Brawly3[] = {
+ {
+ .iv = 255,
+ .lvl = 38,
+ .species = SPECIES_MACHAMP,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP
+ },
+ {
+ .iv = 255,
+ .lvl = 38,
+ .species = SPECIES_MEDICHAM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PSYCHIC, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_FOCUS_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 40,
+ .species = SPECIES_HITMONTOP,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK
+ },
+ {
+ .iv = 255,
+ .lvl = 42,
+ .species = SPECIES_HARIYAMA,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Brawly4[] = {
+ {
+ .iv = 255,
+ .lvl = 40,
+ .species = SPECIES_HITMONCHAN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SKY_UPPERCUT, MOVE_PROTECT, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_MACHAMP,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_MEDICHAM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_PSYCHIC
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_HITMONTOP,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK
+ },
+ {
+ .iv = 255,
+ .lvl = 47,
+ .species = SPECIES_HARIYAMA,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Brawly5[] = {
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_HITMONLEE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_MEGA_KICK, MOVE_FOCUS_PUNCH, MOVE_EARTHQUAKE, MOVE_BULK_UP
+ },
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_HITMONCHAN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SKY_UPPERCUT, MOVE_PROTECT, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_MACHAMP,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_CROSS_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_MEDICHAM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_PSYCHIC
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_HITMONTOP,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK
+ },
+ {
+ .iv = 255,
+ .lvl = 52,
+ .species = SPECIES_HARIYAMA,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Wattson2[] = {
+ {
+ .iv = 255,
+ .lvl = 36,
+ .species = SPECIES_MAREEP,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 36,
+ .species = SPECIES_ELECTRODE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 38,
+ .species = SPECIES_MAGNETON,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 40,
+ .species = SPECIES_MANECTRIC,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Wattson3[] = {
+ {
+ .iv = 255,
+ .lvl = 39,
+ .species = SPECIES_PIKACHU,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, MOVE_SHOCK_WAVE
+ },
+ {
+ .iv = 255,
+ .lvl = 41,
+ .species = SPECIES_FLAAFFY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 41,
+ .species = SPECIES_ELECTRODE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_MAGNETON,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_MANECTRIC,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Wattson4[] = {
+ {
+ .iv = 255,
+ .lvl = 44,
+ .species = SPECIES_RAICHU,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_AMPHAROS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_ELECTRODE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_MAGNETON,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_MANECTRIC,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Wattson5[] = {
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_ELECTABUZZ,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SWIFT, MOVE_FOCUS_PUNCH, MOVE_THUNDER_PUNCH, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_RAICHU,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_AMPHAROS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_ELECTRODE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_MAGNETON,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_MANECTRIC,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Flannery2[] = {
+ {
+ .iv = 255,
+ .lvl = 38,
+ .species = SPECIES_MAGCARGO,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 36,
+ .species = SPECIES_PONYTA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE
+ },
+ {
+ .iv = 255,
+ .lvl = 38,
+ .species = SPECIES_CAMERUPT,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT
+ },
+ {
+ .iv = 255,
+ .lvl = 40,
+ .species = SPECIES_TORKOAL,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Flannery3[] = {
+ {
+ .iv = 255,
+ .lvl = 41,
+ .species = SPECIES_GROWLITHE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_ROAR, MOVE_SUNNY_DAY
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_MAGCARGO,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 41,
+ .species = SPECIES_PONYTA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_CAMERUPT,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_TORKOAL,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Flannery4[] = {
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_HOUNDOUR,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROAR, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_SUNNY_DAY
+ },
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_GROWLITHE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_SUNNY_DAY, MOVE_ROAR
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_MAGCARGO,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_RAPIDASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_CAMERUPT,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_TORKOAL,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Flannery5[] = {
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_ARCANINE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_SUNNY_DAY, MOVE_ROAR
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_MAGCARGO,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_HOUNDOOM,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_ROAR, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_SUNNY_DAY
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_RAPIDASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_CAMERUPT,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_TORKOAL,
+ .heldItem = ITEM_WHITE_HERB,
+ .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Norman2[] = {
+ {
+ .iv = 255,
+ .lvl = 42,
+ .species = SPECIES_CHANSEY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 42,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_SPINDA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Norman3[] = {
+ {
+ .iv = 255,
+ .lvl = 47,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST
+ },
+ {
+ .iv = 255,
+ .lvl = 47,
+ .species = SPECIES_CHANSEY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_KANGASKHAN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, MOVE_REVERSAL
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_SPINDA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Norman4[] = {
+ {
+ .iv = 255,
+ .lvl = 52,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST
+ },
+ {
+ .iv = 255,
+ .lvl = 52,
+ .species = SPECIES_BLISSEY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_KANGASKHAN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, MOVE_REVERSAL
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_SPINDA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Norman5[] = {
+ {
+ .iv = 255,
+ .lvl = 57,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST
+ },
+ {
+ .iv = 255,
+ .lvl = 57,
+ .species = SPECIES_BLISSEY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_PROTECT, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_KANGASKHAN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, MOVE_REVERSAL
+ },
+ {
+ .iv = 255,
+ .lvl = 57,
+ .species = SPECIES_TAUROS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TAKE_DOWN, MOVE_PROTECT, MOVE_FIRE_BLAST, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_SPINDA,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS
+ },
+ {
+ .iv = 255,
+ .lvl = 60,
+ .species = SPECIES_SLAKING,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Winona2[] = {
+ {
+ .iv = 255,
+ .lvl = 40,
+ .species = SPECIES_DRATINI,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 38,
+ .species = SPECIES_TROPIUS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 255,
+ .lvl = 41,
+ .species = SPECIES_PELIPPER,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_SKARMORY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Winona3[] = {
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_HOOTHOOT,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_DREAM_EATER
+ },
+ {
+ .iv = 255,
+ .lvl = 43,
+ .species = SPECIES_TROPIUS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 255,
+ .lvl = 45,
+ .species = SPECIES_DRAGONAIR,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_PELIPPER,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_SKARMORY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Winona4[] = {
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_NOCTOWL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_DREAM_EATER
+ },
+ {
+ .iv = 255,
+ .lvl = 49,
+ .species = SPECIES_TROPIUS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_DRAGONAIR,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_PELIPPER,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_SKARMORY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Winona5[] = {
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_NOCTOWL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_DREAM_EATER
+ },
+ {
+ .iv = 255,
+ .lvl = 54,
+ .species = SPECIES_TROPIUS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_PELIPPER,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_DRAGONITE,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_HYPER_BEAM, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_SKARMORY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE
+ },
+ {
+ .iv = 255,
+ .lvl = 60,
+ .species = SPECIES_ALTARIA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_SKY_ATTACK, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza2[] = {
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_SLOWPOKE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 49,
+ .species = SPECIES_CLAYDOL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 49,
+ .species = SPECIES_XATU,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_LUNATONE,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_SOLROCK,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza3[] = {
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_DROWZEE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_SLOWPOKE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 54,
+ .species = SPECIES_CLAYDOL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 54,
+ .species = SPECIES_XATU,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_LUNATONE,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 55,
+ .species = SPECIES_SOLROCK,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza4[] = {
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_HYPNO,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 59,
+ .species = SPECIES_CLAYDOL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_SLOWPOKE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 59,
+ .species = SPECIES_XATU,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 60,
+ .species = SPECIES_LUNATONE,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 60,
+ .species = SPECIES_SOLROCK,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza5[] = {
+ {
+ .iv = 255,
+ .lvl = 63,
+ .species = SPECIES_HYPNO,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 64,
+ .species = SPECIES_CLAYDOL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN
+ },
+ {
+ .iv = 255,
+ .lvl = 63,
+ .species = SPECIES_SLOWKING,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT
+ },
+ {
+ .iv = 255,
+ .lvl = 64,
+ .species = SPECIES_XATU,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 65,
+ .species = SPECIES_LUNATONE,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND
+ },
+ {
+ .iv = 255,
+ .lvl = 65,
+ .species = SPECIES_SOLROCK,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Juan2[] = {
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_POLIWAG,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, MOVE_HYDRO_PUMP
+ },
+ {
+ .iv = 255,
+ .lvl = 46,
+ .species = SPECIES_WHISCASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_WALREIN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 48,
+ .species = SPECIES_CRAWDAUNT,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_REST, MOVE_CRABHAMMER, MOVE_TAUNT, MOVE_DOUBLE_TEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_KINGDRA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Juan3[] = {
+ {
+ .iv = 255,
+ .lvl = 50,
+ .species = SPECIES_POLIWHIRL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, MOVE_HYDRO_PUMP
+ },
+ {
+ .iv = 255,
+ .lvl = 51,
+ .species = SPECIES_WHISCASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_WALREIN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 53,
+ .species = SPECIES_CRAWDAUNT,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, MOVE_DOUBLE_TEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 56,
+ .species = SPECIES_KINGDRA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Juan4[] = {
+ {
+ .iv = 255,
+ .lvl = 56,
+ .species = SPECIES_LAPRAS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYDRO_PUMP, MOVE_PERISH_SONG, MOVE_ICE_BEAM, MOVE_CONFUSE_RAY
+ },
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_WHISCASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE
+ },
+ {
+ .iv = 255,
+ .lvl = 56,
+ .species = SPECIES_POLIWHIRL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, MOVE_HYDRO_PUMP
+ },
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_WALREIN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_ICE_BEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 58,
+ .species = SPECIES_CRAWDAUNT,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, MOVE_DOUBLE_TEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 61,
+ .species = SPECIES_KINGDRA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Juan5[] = {
+ {
+ .iv = 255,
+ .lvl = 61,
+ .species = SPECIES_LAPRAS,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYDRO_PUMP, MOVE_PERISH_SONG, MOVE_ICE_BEAM, MOVE_CONFUSE_RAY
+ },
+ {
+ .iv = 255,
+ .lvl = 63,
+ .species = SPECIES_WHISCASH,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE
+ },
+ {
+ .iv = 255,
+ .lvl = 61,
+ .species = SPECIES_POLITOED,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_HYDRO_PUMP, MOVE_PERISH_SONG
+ },
+ {
+ .iv = 255,
+ .lvl = 63,
+ .species = SPECIES_WALREIN,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_SHEER_COLD
+ },
+ {
+ .iv = 255,
+ .lvl = 63,
+ .species = SPECIES_CRAWDAUNT,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, MOVE_DOUBLE_TEAM
+ },
+ {
+ .iv = 255,
+ .lvl = 66,
+ .species = SPECIES_KINGDRA,
+ .heldItem = ITEM_CHESTO_BERRY,
+ .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Angelo[] = {
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_ILLUMISE,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHOCK_WAVE, MOVE_QUICK_ATTACK, MOVE_CHARM, MOVE_NONE
+ },
+ {
+ .iv = 100,
+ .lvl = 17,
+ .species = SPECIES_VOLBEAT,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_SHOCK_WAVE, MOVE_QUICK_ATTACK, MOVE_CONFUSE_RAY, MOVE_NONE
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darius[] = {
+ {
+ .iv = 200,
+ .lvl = 30,
+ .species = SPECIES_TROPIUS,
+ }
+};
+
+const struct TrainerMonItemCustomMoves gTrainerParty_Steven[] = {
+ {
+ .iv = 255,
+ .lvl = 77,
+ .species = SPECIES_SKARMORY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_TOXIC, MOVE_AERIAL_ACE, MOVE_SPIKES, MOVE_STEEL_WING
+ },
+ {
+ .iv = 255,
+ .lvl = 75,
+ .species = SPECIES_CLAYDOL,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_ANCIENT_POWER, MOVE_EARTHQUAKE
+ },
+ {
+ .iv = 255,
+ .lvl = 76,
+ .species = SPECIES_AGGRON,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_THUNDER, MOVE_EARTHQUAKE, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW
+ },
+ {
+ .iv = 255,
+ .lvl = 76,
+ .species = SPECIES_CRADILY,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_GIGA_DRAIN, MOVE_ANCIENT_POWER, MOVE_INGRAIN, MOVE_CONFUSE_RAY
+ },
+ {
+ .iv = 255,
+ .lvl = 76,
+ .species = SPECIES_ARMALDO,
+ .heldItem = ITEM_NONE,
+ .moves = MOVE_WATER_PULSE, MOVE_ANCIENT_POWER, MOVE_AERIAL_ACE, MOVE_SLASH
+ },
+ {
+ .iv = 255,
+ .lvl = 78,
+ .species = SPECIES_METAGROSS,
+ .heldItem = ITEM_SITRUS_BERRY,
+ .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_METEOR_MASH, MOVE_SHADOW_BALL
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Anabel[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BELDUM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tucker[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BELDUM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Spenser[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BELDUM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Greta[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BELDUM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Noland[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BELDUM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lucy[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BELDUM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brandon[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BELDUM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres2[] = {
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SANDSHREW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres3[] = {
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_NOSEPASS,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_SANDSHREW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres4[] = {
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_NOSEPASS,
+ },
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_SANDSHREW,
+ },
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_SANDSHREW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres5[] = {
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_NOSEPASS,
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_SANDSLASH,
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_SANDSLASH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory2[] = {
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 10,
+ .lvl = 30,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory3[] = {
+ {
+ .iv = 20,
+ .lvl = 32,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 20,
+ .lvl = 32,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 20,
+ .lvl = 32,
+ .species = SPECIES_TENTACOOL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory4[] = {
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 30,
+ .lvl = 34,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory5[] = {
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 40,
+ .lvl = 36,
+ .species = SPECIES_TENTACRUEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo2[] = {
+ {
+ .iv = 10,
+ .lvl = 37,
+ .species = SPECIES_STARYU,
+ },
+ {
+ .iv = 10,
+ .lvl = 37,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo3[] = {
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_WINGULL,
+ },
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_STARYU,
+ },
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo4[] = {
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_STARYU,
+ },
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_STARYU,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo5[] = {
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_PELIPPER,
+ },
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_STARMIE,
+ },
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_STARMIE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji2[] = {
+ {
+ .iv = 10,
+ .lvl = 37,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 10,
+ .lvl = 37,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji3[] = {
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_MAKUHITA,
+ },
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 20,
+ .lvl = 39,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji4[] = {
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_HARIYAMA,
+ },
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 30,
+ .lvl = 41,
+ .species = SPECIES_MACHOKE,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji5[] = {
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_HARIYAMA,
+ },
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_MACHAMP,
+ },
+ {
+ .iv = 40,
+ .lvl = 43,
+ .species = SPECIES_MACHAMP,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin2[] = {
+ {
+ .iv = 110,
+ .lvl = 35,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 110,
+ .lvl = 35,
+ .species = SPECIES_VIGOROTH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin3[] = {
+ {
+ .iv = 120,
+ .lvl = 37,
+ .species = SPECIES_SPINDA,
+ },
+ {
+ .iv = 120,
+ .lvl = 37,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 120,
+ .lvl = 37,
+ .species = SPECIES_VIGOROTH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin4[] = {
+ {
+ .iv = 130,
+ .lvl = 39,
+ .species = SPECIES_SPINDA,
+ },
+ {
+ .iv = 130,
+ .lvl = 39,
+ .species = SPECIES_LOUDRED,
+ },
+ {
+ .iv = 100,
+ .lvl = 39,
+ .species = SPECIES_VIGOROTH,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin5[] = {
+ {
+ .iv = 140,
+ .lvl = 41,
+ .species = SPECIES_SPINDA,
+ },
+ {
+ .iv = 140,
+ .lvl = 41,
+ .species = SPECIES_EXPLOUD,
+ },
+ {
+ .iv = 140,
+ .lvl = 41,
+ .species = SPECIES_SLAKING,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando2[] = {
+ {
+ .iv = 10,
+ .lvl = 35,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 10,
+ .lvl = 35,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 10,
+ .lvl = 35,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando3[] = {
+ {
+ .iv = 20,
+ .lvl = 37,
+ .species = SPECIES_ELECTRIKE,
+ },
+ {
+ .iv = 20,
+ .lvl = 37,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 20,
+ .lvl = 37,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando4[] = {
+ {
+ .iv = 30,
+ .lvl = 39,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 30,
+ .lvl = 39,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 30,
+ .lvl = 39,
+ .species = SPECIES_LOUDRED,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando5[] = {
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_MANECTRIC,
+ },
+ {
+ .iv = 40,
+ .lvl = 41,
+ .species = SPECIES_EXPLOUD,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer2[] = {
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_GEODUDE,
+ },
+ {
+ .iv = 10,
+ .lvl = 26,
+ .species = SPECIES_NUMEL,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer3[] = {
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 20,
+ .lvl = 28,
+ .species = SPECIES_GRAVELER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer4[] = {
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_MACHOP,
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_NUMEL,
+ },
+ {
+ .iv = 30,
+ .lvl = 30,
+ .species = SPECIES_GRAVELER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer5[] = {
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_MACHOKE,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_CAMERUPT,
+ },
+ {
+ .iv = 40,
+ .lvl = 33,
+ .species = SPECIES_GOLEM,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle2[] = {
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SKITTY,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_ZIGZAGOON,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_LOTAD,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_SEEDOT,
+ },
+ {
+ .iv = 10,
+ .lvl = 31,
+ .species = SPECIES_TAILLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle3[] = {
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_SKITTY,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_NUZLEAF,
+ },
+ {
+ .iv = 20,
+ .lvl = 33,
+ .species = SPECIES_TAILLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle4[] = {
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_DELCATTY,
+ },
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_LOMBRE,
+ },
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_NUZLEAF,
+ },
+ {
+ .iv = 30,
+ .lvl = 35,
+ .species = SPECIES_SWELLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle5[] = {
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_DELCATTY,
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_MIGHTYENA,
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_LINOONE,
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_LUDICOLO,
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_SHIFTRY,
+ },
+ {
+ .iv = 40,
+ .lvl = 37,
+ .species = SPECIES_SWELLOW,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia2[] = {
+ {
+ .iv = 10,
+ .lvl = 34,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 10,
+ .lvl = 34,
+ .species = SPECIES_HORSEA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia3[] = {
+ {
+ .iv = 20,
+ .lvl = 36,
+ .species = SPECIES_LUVDISC,
+ },
+ {
+ .iv = 20,
+ .lvl = 36,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 20,
+ .lvl = 36,
+ .species = SPECIES_SEADRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia4[] = {
+ {
+ .iv = 30,
+ .lvl = 38,
+ .species = SPECIES_LUVDISC,
+ },
+ {
+ .iv = 30,
+ .lvl = 38,
+ .species = SPECIES_WAILMER,
+ },
+ {
+ .iv = 30,
+ .lvl = 38,
+ .species = SPECIES_SEADRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia5[] = {
+ {
+ .iv = 40,
+ .lvl = 40,
+ .species = SPECIES_LUVDISC,
+ },
+ {
+ .iv = 40,
+ .lvl = 40,
+ .species = SPECIES_WAILORD,
+ },
+ {
+ .iv = 40,
+ .lvl = 40,
+ .species = SPECIES_KINGDRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mariela[] = {
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_CHIMECHO,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alvaro[] = {
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_BANETTE,
+ },
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_KADABRA,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Everett[] = {
+ {
+ .iv = 0,
+ .lvl = 41,
+ .species = SPECIES_WOBBUFFET,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Red[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_CHARMANDER,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leaf[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_BULBASAUR,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan16[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_GROUDON,
+ }
+};
+
+const struct TrainerMonNoItemDefaultMoves gTrainerParty_May16[] = {
+ {
+ .iv = 0,
+ .lvl = 5,
+ .species = SPECIES_KYOGRE,
+ }
+};
+
diff --git a/src/data/trainers.h b/src/data/trainers.h
new file mode 100644
index 000000000..19e210acc
--- /dev/null
+++ b/src/data/trainers.h
@@ -0,0 +1,11971 @@
+const struct Trainer gTrainers[] = {
+ [TRAINER_NONE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _(""),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 0,
+ .party = {.NoItemDefaultMoves = NULL }
+ },
+
+ [TRAINER_SAWYER_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("SAWYER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer1 }
+ },
+
+ [TRAINER_GRUNT_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt1 }
+ },
+
+ [TRAINER_GRUNT_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt2 }
+ },
+
+ [TRAINER_GRUNT_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt3 }
+ },
+
+ [TRAINER_GRUNT_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt4 }
+ },
+
+ [TRAINER_GRUNT_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt5 }
+ },
+
+ [TRAINER_GRUNT_6] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt6 }
+ },
+
+ [TRAINER_GRUNT_7] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt7 }
+ },
+
+ [TRAINER_GABRIELLE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("GABRIELLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle1 }
+ },
+
+ [TRAINER_GRUNT_8] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt8 }
+ },
+
+ [TRAINER_MARCEL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("MARCEL"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Marcel }
+ },
+
+ [TRAINER_ALBERTO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ALBERTO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alberto }
+ },
+
+ [TRAINER_ED] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COLLECTOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_COLLECTOR,
+ .trainerName = _("ED"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ed }
+ },
+
+ [TRAINER_GRUNT_9] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt9 }
+ },
+
+ [TRAINER_DECLAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("DECLAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Declan }
+ },
+
+ [TRAINER_GRUNT_10] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt10 }
+ },
+
+ [TRAINER_GRUNT_11] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt11 }
+ },
+
+ [TRAINER_GRUNT_12] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt12 }
+ },
+
+ [TRAINER_GRUNT_13] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt13 }
+ },
+
+ [TRAINER_GRUNT_14] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt14 }
+ },
+
+ [TRAINER_GRUNT_15] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt15 }
+ },
+
+ [TRAINER_GRUNT_16] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt16 }
+ },
+
+ [TRAINER_GRUNT_17] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt17 }
+ },
+
+ [TRAINER_GRUNT_18] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt18 }
+ },
+
+ [TRAINER_GRUNT_19] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt19 }
+ },
+
+ [TRAINER_GRUNT_20] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt20 }
+ },
+
+ [TRAINER_GRUNT_21] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt21 }
+ },
+
+ [TRAINER_GRUNT_22] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt22 }
+ },
+
+ [TRAINER_FREDRICK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("FREDRICK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Fredrick }
+ },
+
+ [TRAINER_MATT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AQUA_ADMIN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_ADMIN_M,
+ .trainerName = _("MATT"),
+ .items = {ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Matt }
+ },
+
+ [TRAINER_ZANDER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("ZANDER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Zander }
+ },
+
+ [TRAINER_SHELLY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AQUA_ADMIN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_ADMIN_F,
+ .trainerName = _("SHELLY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shelly1 }
+ },
+
+ [TRAINER_SHELLY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AQUA_ADMIN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_ADMIN_F,
+ .trainerName = _("SHELLY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shelly2 }
+ },
+
+ [TRAINER_ARCHIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AQUA_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE,
+ .trainerName = _("ARCHIE"),
+ .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Archie }
+ },
+
+ [TRAINER_LEAH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("LEAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Leah }
+ },
+
+ [TRAINER_DAISY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("DAISY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Daisy }
+ },
+
+ [TRAINER_ROSE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("ROSE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rose1 }
+ },
+
+ [TRAINER_FELIX] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("FELIX"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Felix }
+ },
+
+ [TRAINER_VIOLET] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("VIOLET"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Violet }
+ },
+
+ [TRAINER_ROSE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("ROSE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rose2 }
+ },
+
+ [TRAINER_ROSE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("ROSE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rose3 }
+ },
+
+ [TRAINER_ROSE_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("ROSE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rose4 }
+ },
+
+ [TRAINER_ROSE_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("ROSE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rose5 }
+ },
+
+ [TRAINER_DUSTY_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("DUSTY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Dusty1 }
+ },
+
+ [TRAINER_CHIP] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("CHIP"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemCustomMoves = gTrainerParty_Chip }
+ },
+
+ [TRAINER_FOSTER] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("FOSTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Foster }
+ },
+
+ [TRAINER_DUSTY_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("DUSTY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Dusty2 }
+ },
+
+ [TRAINER_DUSTY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("DUSTY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Dusty3 }
+ },
+
+ [TRAINER_DUSTY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("DUSTY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Dusty4 }
+ },
+
+ [TRAINER_DUSTY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("DUSTY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Dusty5 }
+ },
+
+ [TRAINER_GABBY_AND_TY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_INTERVIEWER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER,
+ .trainerPic = TRAINER_PIC_INTERVIEWER,
+ .trainerName = _("GABBY & TY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy1 }
+ },
+
+ [TRAINER_GABBY_AND_TY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_INTERVIEWER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER,
+ .trainerPic = TRAINER_PIC_INTERVIEWER,
+ .trainerName = _("GABBY & TY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy2 }
+ },
+
+ [TRAINER_GABBY_AND_TY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_INTERVIEWER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER,
+ .trainerPic = TRAINER_PIC_INTERVIEWER,
+ .trainerName = _("GABBY & TY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy3 }
+ },
+
+ [TRAINER_GABBY_AND_TY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_INTERVIEWER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER,
+ .trainerPic = TRAINER_PIC_INTERVIEWER,
+ .trainerName = _("GABBY & TY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy4 }
+ },
+
+ [TRAINER_GABBY_AND_TY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_INTERVIEWER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER,
+ .trainerPic = TRAINER_PIC_INTERVIEWER,
+ .trainerName = _("GABBY & TY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy5 }
+ },
+
+ [TRAINER_GABBY_AND_TY_6] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_INTERVIEWER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER,
+ .trainerPic = TRAINER_PIC_INTERVIEWER,
+ .trainerName = _("GABBY & TY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_GabbyAndTy6 }
+ },
+
+ [TRAINER_LOLA_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("LOLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lola1 }
+ },
+
+ [TRAINER_AUSTINA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("AUSTINA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Austina }
+ },
+
+ [TRAINER_GWEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("GWEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Gwen }
+ },
+
+ [TRAINER_LOLA_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("LOLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lola2 }
+ },
+
+ [TRAINER_LOLA_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("LOLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lola3 }
+ },
+
+ [TRAINER_LOLA_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("LOLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lola4 }
+ },
+
+ [TRAINER_LOLA_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("LOLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lola5 }
+ },
+
+ [TRAINER_RICKY_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("RICKY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Ricky1 }
+ },
+
+ [TRAINER_SIMON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("SIMON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Simon }
+ },
+
+ [TRAINER_CHARLIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("CHARLIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Charlie }
+ },
+
+ [TRAINER_RICKY_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("RICKY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Ricky2 }
+ },
+
+ [TRAINER_RICKY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("RICKY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Ricky3 }
+ },
+
+ [TRAINER_RICKY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("RICKY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Ricky4 }
+ },
+
+ [TRAINER_RICKY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("RICKY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Ricky5 }
+ },
+
+ [TRAINER_RANDALL] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("RANDALL"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Randall }
+ },
+
+ [TRAINER_PARKER] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("PARKER"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Parker }
+ },
+
+ [TRAINER_GEORGE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("GEORGE"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_George }
+ },
+
+ [TRAINER_BERKE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("BERKE"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Berke }
+ },
+
+ [TRAINER_BRAXTON] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("BRAXTON"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.NoItemCustomMoves = gTrainerParty_Braxton }
+ },
+
+ [TRAINER_VINCENT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("VINCENT"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Vincent }
+ },
+
+ [TRAINER_LEROY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("LEROY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Leroy }
+ },
+
+ [TRAINER_WILTON_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("WILTON"),
+ .items = {ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wilton1 }
+ },
+
+ [TRAINER_EDGAR] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("EDGAR"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edgar }
+ },
+
+ [TRAINER_ALBERT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("ALBERT"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Albert }
+ },
+
+ [TRAINER_SAMUEL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("SAMUEL"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Samuel }
+ },
+
+ [TRAINER_VITO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("VITO"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Vito }
+ },
+
+ [TRAINER_OWEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("OWEN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Owen }
+ },
+
+ [TRAINER_WILTON_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("WILTON"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wilton2 }
+ },
+
+ [TRAINER_WILTON_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("WILTON"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wilton3 }
+ },
+
+ [TRAINER_WILTON_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("WILTON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wilton4 }
+ },
+
+ [TRAINER_WILTON_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("WILTON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wilton5 }
+ },
+
+ [TRAINER_WARREN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("WARREN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Warren }
+ },
+
+ [TRAINER_MARY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("MARY"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Mary }
+ },
+
+ [TRAINER_ALEXIA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("ALEXIA"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Alexia }
+ },
+
+ [TRAINER_JODY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("JODY"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Jody }
+ },
+
+ [TRAINER_WENDY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("WENDY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 3,
+ .party = {.NoItemCustomMoves = gTrainerParty_Wendy }
+ },
+
+ [TRAINER_KEIRA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("KEIRA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Keira }
+ },
+
+ [TRAINER_BROOKE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("BROOKE"),
+ .items = {ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brooke1 }
+ },
+
+ [TRAINER_JENNIFER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("JENNIFER"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jennifer }
+ },
+
+ [TRAINER_HOPE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("HOPE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hope }
+ },
+
+ [TRAINER_SHANNON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("SHANNON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shannon }
+ },
+
+ [TRAINER_MICHELLE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("MICHELLE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Michelle }
+ },
+
+ [TRAINER_CAROLINE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("CAROLINE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Caroline }
+ },
+
+ [TRAINER_JULIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("JULIE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Julie }
+ },
+
+ [TRAINER_BROOKE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("BROOKE"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brooke2 }
+ },
+
+ [TRAINER_BROOKE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("BROOKE"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brooke3 }
+ },
+
+ [TRAINER_BROOKE_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("BROOKE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brooke4 }
+ },
+
+ [TRAINER_BROOKE_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("BROOKE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brooke5 }
+ },
+
+ [TRAINER_PATRICIA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("PATRICIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Patricia }
+ },
+
+ [TRAINER_KINDRA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("KINDRA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kindra }
+ },
+
+ [TRAINER_TAMMY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("TAMMY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tammy }
+ },
+
+ [TRAINER_VALERIE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("VALERIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Valerie1 }
+ },
+
+ [TRAINER_TASHA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("TASHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tasha }
+ },
+
+ [TRAINER_VALERIE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("VALERIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Valerie2 }
+ },
+
+ [TRAINER_VALERIE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("VALERIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Valerie3 }
+ },
+
+ [TRAINER_VALERIE_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("VALERIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Valerie4 }
+ },
+
+ [TRAINER_VALERIE_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("VALERIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Valerie5 }
+ },
+
+ [TRAINER_CINDY_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("CINDY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Cindy1 }
+ },
+
+ [TRAINER_DAPHNE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("DAPHNE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemCustomMoves = gTrainerParty_Daphne }
+ },
+
+ [TRAINER_GRUNT_23] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt23 }
+ },
+
+ [TRAINER_CINDY_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("CINDY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Cindy2 }
+ },
+
+ [TRAINER_BRIANNA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("BRIANNA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Brianna }
+ },
+
+ [TRAINER_NAOMI] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("NAOMI"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Naomi }
+ },
+
+ [TRAINER_CINDY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("CINDY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Cindy3 }
+ },
+
+ [TRAINER_CINDY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("CINDY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Cindy4 }
+ },
+
+ [TRAINER_CINDY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("CINDY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Cindy5 }
+ },
+
+ [TRAINER_CINDY_6] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("CINDY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Cindy6 }
+ },
+
+ [TRAINER_MELISSA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("MELISSA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Melissa }
+ },
+
+ [TRAINER_SHEILA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("SHEILA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sheila }
+ },
+
+ [TRAINER_SHIRLEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("SHIRLEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shirley }
+ },
+
+ [TRAINER_JESSICA_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("JESSICA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Jessica1 }
+ },
+
+ [TRAINER_CONNIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("CONNIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Connie }
+ },
+
+ [TRAINER_BRIDGET] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("BRIDGET"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bridget }
+ },
+
+ [TRAINER_OLIVIA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("OLIVIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemCustomMoves = gTrainerParty_Olivia }
+ },
+
+ [TRAINER_TIFFANY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("TIFFANY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tiffany }
+ },
+
+ [TRAINER_JESSICA_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("JESSICA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Jessica2 }
+ },
+
+ [TRAINER_JESSICA_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("JESSICA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Jessica3 }
+ },
+
+ [TRAINER_JESSICA_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("JESSICA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Jessica4 }
+ },
+
+ [TRAINER_JESSICA_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("JESSICA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Jessica5 }
+ },
+
+ [TRAINER_WINSTON_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_RICH_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_RICH_BOY,
+ .trainerName = _("WINSTON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Winston1 }
+ },
+
+ [TRAINER_MOLLIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("MOLLIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Mollie }
+ },
+
+ [TRAINER_GARRET] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_RICH_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_RICH_BOY,
+ .trainerName = _("GARRET"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Garret }
+ },
+
+ [TRAINER_WINSTON_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_RICH_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_RICH_BOY,
+ .trainerName = _("WINSTON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Winston2 }
+ },
+
+ [TRAINER_WINSTON_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_RICH_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_RICH_BOY,
+ .trainerName = _("WINSTON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Winston3 }
+ },
+
+ [TRAINER_WINSTON_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_RICH_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_RICH_BOY,
+ .trainerName = _("WINSTON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Winston4 }
+ },
+
+ [TRAINER_WINSTON_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_RICH_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_RICH_BOY,
+ .trainerName = _("WINSTON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Winston5 }
+ },
+
+ [TRAINER_STEVE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_POKEMANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_POKEMANIAC,
+ .trainerName = _("STEVE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Steve1 }
+ },
+
+ [TRAINER_THALIA_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("THALIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Thalia1 }
+ },
+
+ [TRAINER_MARK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_POKEMANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_POKEMANIAC,
+ .trainerName = _("MARK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Mark }
+ },
+
+ [TRAINER_GRUNT_24] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt24 }
+ },
+
+ [TRAINER_STEVE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_POKEMANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_POKEMANIAC,
+ .trainerName = _("STEVE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Steve2 }
+ },
+
+ [TRAINER_STEVE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_POKEMANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_POKEMANIAC,
+ .trainerName = _("STEVE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Steve3 }
+ },
+
+ [TRAINER_STEVE_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_POKEMANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_POKEMANIAC,
+ .trainerName = _("STEVE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Steve4 }
+ },
+
+ [TRAINER_STEVE_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_POKEMANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_POKEMANIAC,
+ .trainerName = _("STEVE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Steve5 }
+ },
+
+ [TRAINER_LUIS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("LUIS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Luis }
+ },
+
+ [TRAINER_DOMINIK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("DOMINIK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dominik }
+ },
+
+ [TRAINER_DOUGLAS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("DOUGLAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Douglas }
+ },
+
+ [TRAINER_DARRIN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("DARRIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Darrin }
+ },
+
+ [TRAINER_TONY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("TONY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tony1 }
+ },
+
+ [TRAINER_JEROME] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("JEROME"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jerome }
+ },
+
+ [TRAINER_MATTHEW] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("MATTHEW"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Matthew }
+ },
+
+ [TRAINER_DAVID] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("DAVID"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_David }
+ },
+
+ [TRAINER_SPENCER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("SPENCER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Spencer }
+ },
+
+ [TRAINER_ROLAND] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("ROLAND"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Roland }
+ },
+
+ [TRAINER_NOLEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("NOLEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nolen }
+ },
+
+ [TRAINER_STAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("STAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Stan }
+ },
+
+ [TRAINER_BARRY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("BARRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Barry }
+ },
+
+ [TRAINER_DEAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("DEAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dean }
+ },
+
+ [TRAINER_RODNEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("RODNEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rodney }
+ },
+
+ [TRAINER_RICHARD] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("RICHARD"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Richard }
+ },
+
+ [TRAINER_HERMAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("HERMAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Herman }
+ },
+
+ [TRAINER_SANTIAGO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("SANTIAGO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Santiago }
+ },
+
+ [TRAINER_GILBERT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("GILBERT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Gilbert }
+ },
+
+ [TRAINER_FRANKLIN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("FRANKLIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Franklin }
+ },
+
+ [TRAINER_KEVIN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("KEVIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kevin }
+ },
+
+ [TRAINER_JACK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("JACK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jack }
+ },
+
+ [TRAINER_DUDLEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("DUDLEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dudley }
+ },
+
+ [TRAINER_CHAD] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("CHAD"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Chad }
+ },
+
+ [TRAINER_TONY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("TONY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tony2 }
+ },
+
+ [TRAINER_TONY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("TONY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tony3 }
+ },
+
+ [TRAINER_TONY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("TONY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tony4 }
+ },
+
+ [TRAINER_TONY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("TONY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tony5 }
+ },
+
+ [TRAINER_TAKAO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("TAKAO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Takao }
+ },
+
+ [TRAINER_HITOSHI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("HITOSHI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hitoshi }
+ },
+
+ [TRAINER_KIYO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("KIYO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kiyo }
+ },
+
+ [TRAINER_KOICHI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("KOICHI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Koichi }
+ },
+
+ [TRAINER_NOB_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("NOB"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nob1 }
+ },
+
+ [TRAINER_NOB_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("NOB"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nob2 }
+ },
+
+ [TRAINER_NOB_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("NOB"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nob3 }
+ },
+
+ [TRAINER_NOB_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("NOB"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nob4 }
+ },
+
+ [TRAINER_NOB_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("NOB"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.ItemDefaultMoves = gTrainerParty_Nob5 }
+ },
+
+ [TRAINER_YUJI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("YUJI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Yuji }
+ },
+
+ [TRAINER_DAISUKE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("DAISUKE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Daisuke }
+ },
+
+ [TRAINER_ATSUSHI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("ATSUSHI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Atsushi }
+ },
+
+ [TRAINER_KIRK] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("KIRK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Kirk }
+ },
+
+ [TRAINER_GRUNT_25] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt25 }
+ },
+
+ [TRAINER_GRUNT_26] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt26 }
+ },
+
+ [TRAINER_SHAWN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("SHAWN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shawn }
+ },
+
+ [TRAINER_FERNANDO_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("FERNANDO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Fernando1 }
+ },
+
+ [TRAINER_DALTON_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("DALTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dalton1 }
+ },
+
+ [TRAINER_DALTON_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("DALTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dalton2 }
+ },
+
+ [TRAINER_DALTON_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("DALTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dalton3 }
+ },
+
+ [TRAINER_DALTON_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("DALTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dalton4 }
+ },
+
+ [TRAINER_DALTON_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("DALTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dalton5 }
+ },
+
+ [TRAINER_COLE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("COLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cole }
+ },
+
+ [TRAINER_JEFF] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("JEFF"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jeff }
+ },
+
+ [TRAINER_AXLE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("AXLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Axle }
+ },
+
+ [TRAINER_JACE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("JACE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jace }
+ },
+
+ [TRAINER_KEEGAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("KEEGAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Keegan }
+ },
+
+ [TRAINER_BERNIE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("BERNIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bernie1 }
+ },
+
+ [TRAINER_BERNIE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("BERNIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bernie2 }
+ },
+
+ [TRAINER_BERNIE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("BERNIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bernie3 }
+ },
+
+ [TRAINER_BERNIE_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("BERNIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bernie4 }
+ },
+
+ [TRAINER_BERNIE_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("BERNIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bernie5 }
+ },
+
+ [TRAINER_DREW] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("DREW"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Drew }
+ },
+
+ [TRAINER_BEAU] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("BEAU"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemCustomMoves = gTrainerParty_Beau }
+ },
+
+ [TRAINER_LARRY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("LARRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Larry }
+ },
+
+ [TRAINER_SHANE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("SHANE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shane }
+ },
+
+ [TRAINER_JUSTIN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("JUSTIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Justin }
+ },
+
+ [TRAINER_ETHAN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("ETHAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ethan1 }
+ },
+
+ [TRAINER_AUTUMN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("AUTUMN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Autumn }
+ },
+
+ [TRAINER_TRAVIS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("TRAVIS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Travis }
+ },
+
+ [TRAINER_ETHAN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("ETHAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ethan2 }
+ },
+
+ [TRAINER_ETHAN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("ETHAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ethan3 }
+ },
+
+ [TRAINER_ETHAN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("ETHAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ethan4 }
+ },
+
+ [TRAINER_ETHAN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("ETHAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ethan5 }
+ },
+
+ [TRAINER_BRENT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("BRENT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brent }
+ },
+
+ [TRAINER_DONALD] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("DONALD"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Donald }
+ },
+
+ [TRAINER_TAYLOR] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("TAYLOR"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Taylor }
+ },
+
+ [TRAINER_JEFFREY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("JEFFREY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey1 }
+ },
+
+ [TRAINER_DEREK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("DEREK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Derek }
+ },
+
+ [TRAINER_JEFFREY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("JEFFREY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey2 }
+ },
+
+ [TRAINER_JEFFREY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("JEFFREY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey3 }
+ },
+
+ [TRAINER_JEFFREY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("JEFFREY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey4 }
+ },
+
+ [TRAINER_JEFFREY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("JEFFREY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 5,
+ .party = {.ItemDefaultMoves = gTrainerParty_Jeffrey5 }
+ },
+
+ [TRAINER_EDWARD] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("EDWARD"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Edward }
+ },
+
+ [TRAINER_PRESTON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("PRESTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Preston }
+ },
+
+ [TRAINER_VIRGIL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("VIRGIL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Virgil }
+ },
+
+ [TRAINER_BLAKE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("BLAKE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Blake }
+ },
+
+ [TRAINER_WILLIAM] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("WILLIAM"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_William }
+ },
+
+ [TRAINER_JOSHUA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("JOSHUA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Joshua }
+ },
+
+ [TRAINER_CAMERON_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("CAMERON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cameron1 }
+ },
+
+ [TRAINER_CAMERON_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("CAMERON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cameron2 }
+ },
+
+ [TRAINER_CAMERON_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("CAMERON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cameron3 }
+ },
+
+ [TRAINER_CAMERON_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("CAMERON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cameron4 }
+ },
+
+ [TRAINER_CAMERON_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("CAMERON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cameron5 }
+ },
+
+ [TRAINER_JACLYN] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("JACLYN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Jaclyn }
+ },
+
+ [TRAINER_HANNAH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("HANNAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hannah }
+ },
+
+ [TRAINER_SAMANTHA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("SAMANTHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Samantha }
+ },
+
+ [TRAINER_MAURA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("MAURA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maura }
+ },
+
+ [TRAINER_KAYLA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("KAYLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kayla }
+ },
+
+ [TRAINER_ALEXIS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("ALEXIS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alexis }
+ },
+
+ [TRAINER_JACKI_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("JACKI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jacki1 }
+ },
+
+ [TRAINER_JACKI_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("JACKI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jacki2 }
+ },
+
+ [TRAINER_JACKI_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("JACKI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jacki3 }
+ },
+
+ [TRAINER_JACKI_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("JACKI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jacki4 }
+ },
+
+ [TRAINER_JACKI_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("JACKI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jacki5 }
+ },
+
+ [TRAINER_WALTER_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("WALTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Walter1 }
+ },
+
+ [TRAINER_MICAH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("MICAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Micah }
+ },
+
+ [TRAINER_THOMAS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("THOMAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Thomas }
+ },
+
+ [TRAINER_WALTER_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("WALTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Walter2 }
+ },
+
+ [TRAINER_WALTER_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("WALTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Walter3 }
+ },
+
+ [TRAINER_WALTER_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("WALTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Walter4 }
+ },
+
+ [TRAINER_WALTER_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("WALTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemCustomMoves = gTrainerParty_Walter5 }
+ },
+
+ [TRAINER_SIDNEY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_ELITE_FOUR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,
+ .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY,
+ .trainerName = _("SIDNEY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xf,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Sidney }
+ },
+
+ [TRAINER_PHOEBE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_ELITE_FOUR,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,
+ .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE,
+ .trainerName = _("PHOEBE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Phoebe }
+ },
+
+ [TRAINER_GLACIA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_ELITE_FOUR,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,
+ .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA,
+ .trainerName = _("GLACIA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Glacia }
+ },
+
+ [TRAINER_DRAKE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_ELITE_FOUR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR,
+ .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE,
+ .trainerName = _("DRAKE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Drake }
+ },
+
+ [TRAINER_ROXANNE_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_ROXANNE,
+ .trainerName = _("ROXANNE"),
+ .items = {ITEM_POTION, ITEM_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.ItemCustomMoves = gTrainerParty_Roxanne1 }
+ },
+
+ [TRAINER_BRAWLY_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_BRAWLY,
+ .trainerName = _("BRAWLY"),
+ .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.ItemCustomMoves = gTrainerParty_Brawly1 }
+ },
+
+ [TRAINER_WATTSON_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_WATTSON,
+ .trainerName = _("WATTSON"),
+ .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Wattson1 }
+ },
+
+ [TRAINER_FLANNERY_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_FLANNERY,
+ .trainerName = _("FLANNERY"),
+ .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Flannery1 }
+ },
+
+ [TRAINER_NORMAN_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_NORMAN,
+ .trainerName = _("NORMAN"),
+ .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Norman1 }
+ },
+
+ [TRAINER_WINONA_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_WINONA,
+ .trainerName = _("WINONA"),
+ .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x17,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Winona1 }
+ },
+
+ [TRAINER_TATE_AND_LIZA_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA,
+ .trainerName = _("TATE&LIZA"),
+ .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza1 }
+ },
+
+ [TRAINER_JUAN_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_JUAN,
+ .trainerName = _("JUAN"),
+ .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Juan1 }
+ },
+
+ [TRAINER_JERRY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_M,
+ .trainerName = _("JERRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jerry1 }
+ },
+
+ [TRAINER_TED] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_M,
+ .trainerName = _("TED"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ted }
+ },
+
+ [TRAINER_PAUL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_M,
+ .trainerName = _("PAUL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Paul }
+ },
+
+ [TRAINER_JERRY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_M,
+ .trainerName = _("JERRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jerry2 }
+ },
+
+ [TRAINER_JERRY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_M,
+ .trainerName = _("JERRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jerry3 }
+ },
+
+ [TRAINER_JERRY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_M,
+ .trainerName = _("JERRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jerry4 }
+ },
+
+ [TRAINER_JERRY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_M,
+ .trainerName = _("JERRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jerry5 }
+ },
+
+ [TRAINER_KAREN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_F,
+ .trainerName = _("KAREN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Karen1 }
+ },
+
+ [TRAINER_GEORGIA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_F,
+ .trainerName = _("GEORGIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Georgia }
+ },
+
+ [TRAINER_KAREN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_F,
+ .trainerName = _("KAREN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Karen2 }
+ },
+
+ [TRAINER_KAREN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_F,
+ .trainerName = _("KAREN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Karen3 }
+ },
+
+ [TRAINER_KAREN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_F,
+ .trainerName = _("KAREN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Karen4 }
+ },
+
+ [TRAINER_KAREN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SCHOOL_KID,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_SCHOOL_KID_F,
+ .trainerName = _("KAREN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Karen5 }
+ },
+
+ [TRAINER_KATE_AND_JOY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("KATE & JOY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_KateAndJoy }
+ },
+
+ [TRAINER_ANNA_AND_MEG_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("ANNA & MEG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg1 }
+ },
+
+ [TRAINER_ANNA_AND_MEG_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("ANNA & MEG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg2 }
+ },
+
+ [TRAINER_ANNA_AND_MEG_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("ANNA & MEG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg3 }
+ },
+
+ [TRAINER_ANNA_AND_MEG_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("ANNA & MEG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg4 }
+ },
+
+ [TRAINER_ANNA_AND_MEG_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("ANNA & MEG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg5 }
+ },
+
+ [TRAINER_VICTOR] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_WINSTRATE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("VICTOR"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Victor }
+ },
+
+ [TRAINER_MIGUEL_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("MIGUEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Miguel1 }
+ },
+
+ [TRAINER_COLTON] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("COLTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Colton }
+ },
+
+ [TRAINER_MIGUEL_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("MIGUEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Miguel2 }
+ },
+
+ [TRAINER_MIGUEL_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("MIGUEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Miguel3 }
+ },
+
+ [TRAINER_MIGUEL_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("MIGUEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Miguel4 }
+ },
+
+ [TRAINER_MIGUEL_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("MIGUEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Miguel5 }
+ },
+
+ [TRAINER_VICTORIA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_WINSTRATE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("VICTORIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x3,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Victoria }
+ },
+
+ [TRAINER_VANESSA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("VANESSA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.ItemDefaultMoves = gTrainerParty_Vanessa }
+ },
+
+ [TRAINER_BETHANY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("BETHANY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.ItemDefaultMoves = gTrainerParty_Bethany }
+ },
+
+ [TRAINER_ISABEL_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("ISABEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Isabel1 }
+ },
+
+ [TRAINER_ISABEL_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("ISABEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Isabel2 }
+ },
+
+ [TRAINER_ISABEL_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("ISABEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Isabel3 }
+ },
+
+ [TRAINER_ISABEL_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("ISABEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Isabel4 }
+ },
+
+ [TRAINER_ISABEL_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("ISABEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Isabel5 }
+ },
+
+ [TRAINER_TIMOTHY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("TIMOTHY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Timothy1 }
+ },
+
+ [TRAINER_TIMOTHY_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("TIMOTHY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Timothy2 }
+ },
+
+ [TRAINER_TIMOTHY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("TIMOTHY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Timothy3 }
+ },
+
+ [TRAINER_TIMOTHY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("TIMOTHY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Timothy4 }
+ },
+
+ [TRAINER_TIMOTHY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("TIMOTHY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Timothy5 }
+ },
+
+ [TRAINER_VICKY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_WINSTRATE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("VICKY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Vicky }
+ },
+
+ [TRAINER_SHELBY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("SHELBY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shelby1 }
+ },
+
+ [TRAINER_SHELBY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("SHELBY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shelby2 }
+ },
+
+ [TRAINER_SHELBY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("SHELBY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shelby3 }
+ },
+
+ [TRAINER_SHELBY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("SHELBY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shelby4 }
+ },
+
+ [TRAINER_SHELBY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("SHELBY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shelby5 }
+ },
+
+ [TRAINER_CALVIN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("CALVIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Calvin1 }
+ },
+
+ [TRAINER_BILLY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("BILLY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Billy }
+ },
+
+ [TRAINER_JOSH] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("JOSH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Josh }
+ },
+
+ [TRAINER_TOMMY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("TOMMY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tommy }
+ },
+
+ [TRAINER_JOEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("JOEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Joey }
+ },
+
+ [TRAINER_BEN] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("BEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Ben }
+ },
+
+ [TRAINER_QUINCY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("QUINCY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Quincy }
+ },
+
+ [TRAINER_KATELYNN] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("KATELYNN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Katelynn }
+ },
+
+ [TRAINER_JAYLEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("JAYLEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jaylen }
+ },
+
+ [TRAINER_DILLON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("DILLON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dillon }
+ },
+
+ [TRAINER_CALVIN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("CALVIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Calvin2 }
+ },
+
+ [TRAINER_CALVIN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("CALVIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Calvin3 }
+ },
+
+ [TRAINER_CALVIN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("CALVIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Calvin4 }
+ },
+
+ [TRAINER_CALVIN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("CALVIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Calvin5 }
+ },
+
+ [TRAINER_EDDIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("EDDIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Eddie }
+ },
+
+ [TRAINER_ALLEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("ALLEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Allen }
+ },
+
+ [TRAINER_TIMMY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("TIMMY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Timmy }
+ },
+
+ [TRAINER_WALLACE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_CHAMPION,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CHAMPION_WALLACE,
+ .trainerName = _("WALLACE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Wallace }
+ },
+
+ [TRAINER_ANDREW] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("ANDREW"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Andrew }
+ },
+
+ [TRAINER_IVAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("IVAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ivan }
+ },
+
+ [TRAINER_CLAUDE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("CLAUDE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Claude }
+ },
+
+ [TRAINER_ELLIOT_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("ELLIOT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Elliot1 }
+ },
+
+ [TRAINER_NED] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("NED"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ned }
+ },
+
+ [TRAINER_DALE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("DALE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dale }
+ },
+
+ [TRAINER_NOLAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("NOLAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nolan }
+ },
+
+ [TRAINER_BARNY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("BARNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Barny }
+ },
+
+ [TRAINER_WADE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("WADE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wade }
+ },
+
+ [TRAINER_CARTER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("CARTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Carter }
+ },
+
+ [TRAINER_ELLIOT_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("ELLIOT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Elliot2 }
+ },
+
+ [TRAINER_ELLIOT_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("ELLIOT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Elliot3 }
+ },
+
+ [TRAINER_ELLIOT_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("ELLIOT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Elliot4 }
+ },
+
+ [TRAINER_ELLIOT_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("ELLIOT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x3,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Elliot5 }
+ },
+
+ [TRAINER_RONALD] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("RONALD"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ronald }
+ },
+
+ [TRAINER_JACOB] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("JACOB"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jacob }
+ },
+
+ [TRAINER_ANTHONY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("ANTHONY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Anthony }
+ },
+
+ [TRAINER_BENJAMIN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("BENJAMIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin1 }
+ },
+
+ [TRAINER_BENJAMIN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("BENJAMIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin2 }
+ },
+
+ [TRAINER_BENJAMIN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("BENJAMIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin3 }
+ },
+
+ [TRAINER_BENJAMIN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("BENJAMIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin4 }
+ },
+
+ [TRAINER_BENJAMIN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("BENJAMIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin5 }
+ },
+
+ [TRAINER_ABIGAIL_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,
+ .trainerName = _("ABIGAIL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Abigail1 }
+ },
+
+ [TRAINER_JASMINE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,
+ .trainerName = _("JASMINE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jasmine }
+ },
+
+ [TRAINER_ABIGAIL_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,
+ .trainerName = _("ABIGAIL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Abigail2 }
+ },
+
+ [TRAINER_ABIGAIL_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,
+ .trainerName = _("ABIGAIL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Abigail3 }
+ },
+
+ [TRAINER_ABIGAIL_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,
+ .trainerName = _("ABIGAIL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Abigail4 }
+ },
+
+ [TRAINER_ABIGAIL_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,
+ .trainerName = _("ABIGAIL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Abigail5 }
+ },
+
+ [TRAINER_DYLAN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M,
+ .trainerName = _("DYLAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dylan1 }
+ },
+
+ [TRAINER_DYLAN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M,
+ .trainerName = _("DYLAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dylan2 }
+ },
+
+ [TRAINER_DYLAN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M,
+ .trainerName = _("DYLAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dylan3 }
+ },
+
+ [TRAINER_DYLAN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M,
+ .trainerName = _("DYLAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dylan4 }
+ },
+
+ [TRAINER_DYLAN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M,
+ .trainerName = _("DYLAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dylan5 }
+ },
+
+ [TRAINER_MARIA_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,
+ .trainerName = _("MARIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maria1 }
+ },
+
+ [TRAINER_MARIA_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,
+ .trainerName = _("MARIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maria2 }
+ },
+
+ [TRAINER_MARIA_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,
+ .trainerName = _("MARIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maria3 }
+ },
+
+ [TRAINER_MARIA_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,
+ .trainerName = _("MARIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maria4 }
+ },
+
+ [TRAINER_MARIA_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,
+ .trainerName = _("MARIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maria5 }
+ },
+
+ [TRAINER_CAMDEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("CAMDEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Camden }
+ },
+
+ [TRAINER_DEMETRIUS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("DEMETRIUS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Demetrius }
+ },
+
+ [TRAINER_ISAIAH_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("ISAIAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah1 }
+ },
+
+ [TRAINER_PABLO_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("PABLO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Pablo1 }
+ },
+
+ [TRAINER_CHASE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("CHASE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Chase }
+ },
+
+ [TRAINER_ISAIAH_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("ISAIAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah2 }
+ },
+
+ [TRAINER_ISAIAH_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("ISAIAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah3 }
+ },
+
+ [TRAINER_ISAIAH_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("ISAIAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah4 }
+ },
+
+ [TRAINER_ISAIAH_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("ISAIAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah5 }
+ },
+
+ [TRAINER_ISOBEL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("ISOBEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isobel }
+ },
+
+ [TRAINER_DONNY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("DONNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Donny }
+ },
+
+ [TRAINER_TALIA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("TALIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Talia }
+ },
+
+ [TRAINER_KATELYN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("KATELYN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn1 }
+ },
+
+ [TRAINER_ALLISON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("ALLISON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Allison }
+ },
+
+ [TRAINER_KATELYN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("KATELYN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn2 }
+ },
+
+ [TRAINER_KATELYN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("KATELYN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn3 }
+ },
+
+ [TRAINER_KATELYN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("KATELYN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn4 }
+ },
+
+ [TRAINER_KATELYN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("KATELYN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn5 }
+ },
+
+ [TRAINER_NICOLAS_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_DRAGON_TAMER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_DRAGON_TAMER,
+ .trainerName = _("NICOLAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas1 }
+ },
+
+ [TRAINER_NICOLAS_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_DRAGON_TAMER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_DRAGON_TAMER,
+ .trainerName = _("NICOLAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas2 }
+ },
+
+ [TRAINER_NICOLAS_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_DRAGON_TAMER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_DRAGON_TAMER,
+ .trainerName = _("NICOLAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas3 }
+ },
+
+ [TRAINER_NICOLAS_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_DRAGON_TAMER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_DRAGON_TAMER,
+ .trainerName = _("NICOLAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas4 }
+ },
+
+ [TRAINER_NICOLAS_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_DRAGON_TAMER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_DRAGON_TAMER,
+ .trainerName = _("NICOLAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.ItemDefaultMoves = gTrainerParty_Nicolas5 }
+ },
+
+ [TRAINER_AARON] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_DRAGON_TAMER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_DRAGON_TAMER,
+ .trainerName = _("AARON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Aaron }
+ },
+
+ [TRAINER_PERRY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("PERRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Perry }
+ },
+
+ [TRAINER_HUGH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("HUGH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hugh }
+ },
+
+ [TRAINER_PHIL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("PHIL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Phil }
+ },
+
+ [TRAINER_JARED] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("JARED"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jared }
+ },
+
+ [TRAINER_HUMBERTO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("HUMBERTO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Humberto }
+ },
+
+ [TRAINER_PRESLEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("PRESLEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Presley }
+ },
+
+ [TRAINER_EDWARDO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("EDWARDO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edwardo }
+ },
+
+ [TRAINER_COLIN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("COLIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Colin }
+ },
+
+ [TRAINER_ROBERT_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ROBERT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Robert1 }
+ },
+
+ [TRAINER_BENNY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("BENNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Benny }
+ },
+
+ [TRAINER_CHESTER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("CHESTER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Chester }
+ },
+
+ [TRAINER_ROBERT_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ROBERT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Robert2 }
+ },
+
+ [TRAINER_ROBERT_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ROBERT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Robert3 }
+ },
+
+ [TRAINER_ROBERT_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ROBERT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Robert4 }
+ },
+
+ [TRAINER_ROBERT_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ROBERT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Robert5 }
+ },
+
+ [TRAINER_ALEX] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ALEX"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alex }
+ },
+
+ [TRAINER_BECK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("BECK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Beck }
+ },
+
+ [TRAINER_YASU] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("YASU"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x3,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Yasu }
+ },
+
+ [TRAINER_TAKASHI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("TAKASHI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x3,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Takashi }
+ },
+
+ [TRAINER_DIANNE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("DIANNE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 2,
+ .party = {.ItemCustomMoves = gTrainerParty_Dianne }
+ },
+
+ [TRAINER_JANI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("JANI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jani }
+ },
+
+ [TRAINER_LAO_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("LAO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 3,
+ .party = {.NoItemCustomMoves = gTrainerParty_Lao1 }
+ },
+
+ [TRAINER_LUNG] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("LUNG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lung }
+ },
+
+ [TRAINER_LAO_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("LAO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 4,
+ .party = {.NoItemCustomMoves = gTrainerParty_Lao2 }
+ },
+
+ [TRAINER_LAO_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("LAO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 4,
+ .party = {.NoItemCustomMoves = gTrainerParty_Lao3 }
+ },
+
+ [TRAINER_LAO_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("LAO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 4,
+ .party = {.NoItemCustomMoves = gTrainerParty_Lao4 }
+ },
+
+ [TRAINER_LAO_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("LAO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Lao5 }
+ },
+
+ [TRAINER_JOCELYN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("JOCELYN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jocelyn }
+ },
+
+ [TRAINER_LAURA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("LAURA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Laura }
+ },
+
+ [TRAINER_CYNDY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("CYNDY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy1 }
+ },
+
+ [TRAINER_CORA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("CORA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cora }
+ },
+
+ [TRAINER_PAULA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("PAULA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Paula }
+ },
+
+ [TRAINER_CYNDY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("CYNDY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy2 }
+ },
+
+ [TRAINER_CYNDY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("CYNDY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy3 }
+ },
+
+ [TRAINER_CYNDY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("CYNDY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy4 }
+ },
+
+ [TRAINER_CYNDY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("CYNDY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy5 }
+ },
+
+ [TRAINER_MADELINE_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("MADELINE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Madeline1 }
+ },
+
+ [TRAINER_CLARISSA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("CLARISSA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Clarissa }
+ },
+
+ [TRAINER_ANGELICA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("ANGELICA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Angelica }
+ },
+
+ [TRAINER_MADELINE_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("MADELINE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Madeline2 }
+ },
+
+ [TRAINER_MADELINE_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("MADELINE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Madeline3 }
+ },
+
+ [TRAINER_MADELINE_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("MADELINE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Madeline4 }
+ },
+
+ [TRAINER_MADELINE_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("MADELINE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Madeline5 }
+ },
+
+ [TRAINER_BEVERLY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("BEVERLY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Beverly }
+ },
+
+ [TRAINER_IMANI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("IMANI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Imani }
+ },
+
+ [TRAINER_KYLA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("KYLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kyla }
+ },
+
+ [TRAINER_DENISE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("DENISE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Denise }
+ },
+
+ [TRAINER_BETH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("BETH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Beth }
+ },
+
+ [TRAINER_TARA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("TARA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tara }
+ },
+
+ [TRAINER_MISSY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("MISSY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Missy }
+ },
+
+ [TRAINER_ALICE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("ALICE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alice }
+ },
+
+ [TRAINER_JENNY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("JENNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jenny1 }
+ },
+
+ [TRAINER_GRACE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("GRACE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grace }
+ },
+
+ [TRAINER_TANYA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("TANYA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tanya }
+ },
+
+ [TRAINER_SHARON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("SHARON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sharon }
+ },
+
+ [TRAINER_NIKKI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("NIKKI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nikki }
+ },
+
+ [TRAINER_BRENDA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("BRENDA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brenda }
+ },
+
+ [TRAINER_KATIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("KATIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Katie }
+ },
+
+ [TRAINER_SUSIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("SUSIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Susie }
+ },
+
+ [TRAINER_KARA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("KARA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kara }
+ },
+
+ [TRAINER_DANA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("DANA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dana }
+ },
+
+ [TRAINER_SIENNA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("SIENNA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sienna }
+ },
+
+ [TRAINER_DEBRA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("DEBRA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Debra }
+ },
+
+ [TRAINER_LINDA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("LINDA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Linda }
+ },
+
+ [TRAINER_KAYLEE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("KAYLEE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kaylee }
+ },
+
+ [TRAINER_LAUREL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("LAUREL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Laurel }
+ },
+
+ [TRAINER_CARLEE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("CARLEE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Carlee }
+ },
+
+ [TRAINER_JENNY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("JENNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jenny2 }
+ },
+
+ [TRAINER_JENNY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("JENNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jenny3 }
+ },
+
+ [TRAINER_JENNY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("JENNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jenny4 }
+ },
+
+ [TRAINER_JENNY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("JENNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jenny5 }
+ },
+
+ [TRAINER_HEIDI] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("HEIDI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Heidi }
+ },
+
+ [TRAINER_BECKY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("BECKY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Becky }
+ },
+
+ [TRAINER_CAROL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("CAROL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Carol }
+ },
+
+ [TRAINER_NANCY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("NANCY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nancy }
+ },
+
+ [TRAINER_MARTHA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("MARTHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Martha }
+ },
+
+ [TRAINER_DIANA_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("DIANA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Diana1 }
+ },
+
+ [TRAINER_CEDRIC] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("CEDRIC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Cedric }
+ },
+
+ [TRAINER_IRENE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("IRENE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Irene }
+ },
+
+ [TRAINER_DIANA_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("DIANA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Diana2 }
+ },
+
+ [TRAINER_DIANA_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("DIANA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Diana3 }
+ },
+
+ [TRAINER_DIANA_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("DIANA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Diana4 }
+ },
+
+ [TRAINER_DIANA_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("DIANA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Diana5 }
+ },
+
+ [TRAINER_AMY_AND_LIV_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("AMY & LIV"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv1 }
+ },
+
+ [TRAINER_AMY_AND_LIV_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("AMY & LIV"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv2 }
+ },
+
+ [TRAINER_GINA_AND_MIA_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("GINA & MIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_GinaAndMia1 }
+ },
+
+ [TRAINER_MIU_AND_YUKI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("MIU & YUKI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_MiuAndYuki }
+ },
+
+ [TRAINER_AMY_AND_LIV_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("AMY & LIV"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv3 }
+ },
+
+ [TRAINER_GINA_AND_MIA_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("GINA & MIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_GinaAndMia2 }
+ },
+
+ [TRAINER_AMY_AND_LIV_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("AMY & LIV"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv4 }
+ },
+
+ [TRAINER_AMY_AND_LIV_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("AMY & LIV"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_AmyAndLiv5 }
+ },
+
+ [TRAINER_AMY_AND_LIV_6] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("AMY & LIV"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_AmyAndLiv6 }
+ },
+
+ [TRAINER_HUEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("HUEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Huey }
+ },
+
+ [TRAINER_EDMOND] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("EDMOND"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edmond }
+ },
+
+ [TRAINER_ERNEST_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("ERNEST"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ernest1 }
+ },
+
+ [TRAINER_DWAYNE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("DWAYNE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dwayne }
+ },
+
+ [TRAINER_PHILLIP] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("PHILLIP"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Phillip }
+ },
+
+ [TRAINER_LEONARD] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("LEONARD"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Leonard }
+ },
+
+ [TRAINER_DUNCAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("DUNCAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Duncan }
+ },
+
+ [TRAINER_ERNEST_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("ERNEST"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ernest2 }
+ },
+
+ [TRAINER_ERNEST_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("ERNEST"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ernest3 }
+ },
+
+ [TRAINER_ERNEST_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("ERNEST"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ernest4 }
+ },
+
+ [TRAINER_ERNEST_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("ERNEST"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ernest5 }
+ },
+
+ [TRAINER_ELI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("ELI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Eli }
+ },
+
+ [TRAINER_ANNIKA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_F,
+ .trainerName = _("ANNIKA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemCustomMoves = gTrainerParty_Annika }
+ },
+
+ [TRAINER_JAZMYN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_2,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("JAZMYN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jazmyn }
+ },
+
+ [TRAINER_JONAS] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("JONAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Jonas }
+ },
+
+ [TRAINER_KAYLEY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("KAYLEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Kayley }
+ },
+
+ [TRAINER_AURON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("AURON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Auron }
+ },
+
+ [TRAINER_KELVIN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("KELVIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kelvin }
+ },
+
+ [TRAINER_MARLEY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("MARLEY"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.ItemCustomMoves = gTrainerParty_Marley }
+ },
+
+ [TRAINER_REYNA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("REYNA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Reyna }
+ },
+
+ [TRAINER_HUDSON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("HUDSON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hudson }
+ },
+
+ [TRAINER_CONOR] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("CONOR"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Conor }
+ },
+
+ [TRAINER_EDWIN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COLLECTOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_COLLECTOR,
+ .trainerName = _("EDWIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edwin1 }
+ },
+
+ [TRAINER_HECTOR] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COLLECTOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_COLLECTOR,
+ .trainerName = _("HECTOR"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hector }
+ },
+
+ [TRAINER_TABITHA_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_MAGMA_ADMIN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_ADMIN,
+ .trainerName = _("TABITHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tabitha1 }
+ },
+
+ [TRAINER_EDWIN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COLLECTOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_COLLECTOR,
+ .trainerName = _("EDWIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edwin2 }
+ },
+
+ [TRAINER_EDWIN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COLLECTOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_COLLECTOR,
+ .trainerName = _("EDWIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edwin3 }
+ },
+
+ [TRAINER_EDWIN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COLLECTOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_COLLECTOR,
+ .trainerName = _("EDWIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edwin4 }
+ },
+
+ [TRAINER_EDWIN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COLLECTOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_COLLECTOR,
+ .trainerName = _("EDWIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Edwin5 }
+ },
+
+ [TRAINER_WALLY_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_WALLY,
+ .trainerName = _("WALLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.NoItemCustomMoves = gTrainerParty_Wally1 }
+ },
+
+ [TRAINER_BRENDAN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan1 }
+ },
+
+ [TRAINER_BRENDAN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan2 }
+ },
+
+ [TRAINER_BRENDAN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan3 }
+ },
+
+ [TRAINER_BRENDAN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan4 }
+ },
+
+ [TRAINER_BRENDAN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan5 }
+ },
+
+ [TRAINER_BRENDAN_6] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan6 }
+ },
+
+ [TRAINER_BRENDAN_7] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan7 }
+ },
+
+ [TRAINER_BRENDAN_8] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan8 }
+ },
+
+ [TRAINER_BRENDAN_9] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan9 }
+ },
+
+ [TRAINER_MAY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May1 }
+ },
+
+ [TRAINER_MAY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May2 }
+ },
+
+ [TRAINER_MAY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May3 }
+ },
+
+ [TRAINER_MAY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May4 }
+ },
+
+ [TRAINER_MAY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May5 }
+ },
+
+ [TRAINER_MAY_6] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May6 }
+ },
+
+ [TRAINER_MAY_7] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May7 }
+ },
+
+ [TRAINER_MAY_8] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May8 }
+ },
+
+ [TRAINER_MAY_9] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May9 }
+ },
+
+ [TRAINER_ISAAC_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M,
+ .trainerName = _("ISAAC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaac1 }
+ },
+
+ [TRAINER_DAVIS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("DAVIS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Davis }
+ },
+
+ [TRAINER_MITCHELL] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("MITCHELL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Mitchell }
+ },
+
+ [TRAINER_ISAAC_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M,
+ .trainerName = _("ISAAC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaac2 }
+ },
+
+ [TRAINER_ISAAC_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M,
+ .trainerName = _("ISAAC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaac3 }
+ },
+
+ [TRAINER_ISAAC_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M,
+ .trainerName = _("ISAAC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaac4 }
+ },
+
+ [TRAINER_ISAAC_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M,
+ .trainerName = _("ISAAC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isaac5 }
+ },
+
+ [TRAINER_LYDIA_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("LYDIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lydia1 }
+ },
+
+ [TRAINER_HALLE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("HALLE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Halle }
+ },
+
+ [TRAINER_GARRISON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("GARRISON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Garrison }
+ },
+
+ [TRAINER_LYDIA_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("LYDIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lydia2 }
+ },
+
+ [TRAINER_LYDIA_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("LYDIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lydia3 }
+ },
+
+ [TRAINER_LYDIA_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("LYDIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lydia4 }
+ },
+
+ [TRAINER_LYDIA_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("LYDIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lydia5 }
+ },
+
+ [TRAINER_JACKSON_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,
+ .trainerName = _("JACKSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jackson1 }
+ },
+
+ [TRAINER_LORENZO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,
+ .trainerName = _("LORENZO"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lorenzo }
+ },
+
+ [TRAINER_SEBASTIAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,
+ .trainerName = _("SEBASTIAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sebastian }
+ },
+
+ [TRAINER_JACKSON_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,
+ .trainerName = _("JACKSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jackson2 }
+ },
+
+ [TRAINER_JACKSON_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,
+ .trainerName = _("JACKSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jackson3 }
+ },
+
+ [TRAINER_JACKSON_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,
+ .trainerName = _("JACKSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jackson4 }
+ },
+
+ [TRAINER_JACKSON_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_M,
+ .trainerName = _("JACKSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jackson5 }
+ },
+
+ [TRAINER_CATHERINE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,
+ .trainerName = _("CATHERINE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Catherine1 }
+ },
+
+ [TRAINER_JENNA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,
+ .trainerName = _("JENNA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jenna }
+ },
+
+ [TRAINER_SOPHIA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,
+ .trainerName = _("SOPHIA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sophia }
+ },
+
+ [TRAINER_CATHERINE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,
+ .trainerName = _("CATHERINE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Catherine2 }
+ },
+
+ [TRAINER_CATHERINE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,
+ .trainerName = _("CATHERINE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Catherine3 }
+ },
+
+ [TRAINER_CATHERINE_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,
+ .trainerName = _("CATHERINE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Catherine4 }
+ },
+
+ [TRAINER_CATHERINE_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_RANGER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_POKEMON_RANGER_F,
+ .trainerName = _("CATHERINE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Catherine5 }
+ },
+
+ [TRAINER_JULIO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M,
+ .trainerName = _("JULIO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Julio }
+ },
+
+ [TRAINER_GRUNT_27] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt27 }
+ },
+
+ [TRAINER_GRUNT_28] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt28 }
+ },
+
+ [TRAINER_GRUNT_29] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt29 }
+ },
+
+ [TRAINER_GRUNT_30] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt30 }
+ },
+
+ [TRAINER_MARC] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("MARC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Marc }
+ },
+
+ [TRAINER_BRENDEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("BRENDEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brenden }
+ },
+
+ [TRAINER_LILITH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("LILITH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lilith }
+ },
+
+ [TRAINER_CRISTIAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("CRISTIAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cristian }
+ },
+
+ [TRAINER_SYLVIA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("SYLVIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sylvia }
+ },
+
+ [TRAINER_LEONARDO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("LEONARDO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Leonardo }
+ },
+
+ [TRAINER_ATHENA] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("ATHENA"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.ItemCustomMoves = gTrainerParty_Athena }
+ },
+
+ [TRAINER_HARRISON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("HARRISON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Harrison }
+ },
+
+ [TRAINER_GRUNT_31] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt31 }
+ },
+
+ [TRAINER_CLARENCE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("CLARENCE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Clarence }
+ },
+
+ [TRAINER_TERRY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("TERRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Terry }
+ },
+
+ [TRAINER_NATE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("NATE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nate }
+ },
+
+ [TRAINER_KATHLEEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HEX_MANIAC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_HEX_MANIAC,
+ .trainerName = _("KATHLEEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kathleen }
+ },
+
+ [TRAINER_CLIFFORD] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("CLIFFORD"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Clifford }
+ },
+
+ [TRAINER_NICHOLAS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("NICHOLAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Nicholas }
+ },
+
+ [TRAINER_GRUNT_32] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt32 }
+ },
+
+ [TRAINER_GRUNT_33] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt33 }
+ },
+
+ [TRAINER_GRUNT_34] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt34 }
+ },
+
+ [TRAINER_GRUNT_35] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt35 }
+ },
+
+ [TRAINER_GRUNT_36] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt36 }
+ },
+
+ [TRAINER_MACEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("MACEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Macey }
+ },
+
+ [TRAINER_BRENDAN_10] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan10 }
+ },
+
+ [TRAINER_BRENDAN_11] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan11 }
+ },
+
+ [TRAINER_PAXTON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_M,
+ .trainerName = _("PAXTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Paxton }
+ },
+
+ [TRAINER_ISABELLA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F,
+ .trainerName = _("ISABELLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isabella }
+ },
+
+ [TRAINER_GRUNT_37] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_AQUA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA,
+ .trainerPic = TRAINER_PIC_AQUA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt37 }
+ },
+
+ [TRAINER_TABITHA_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_MAGMA_ADMIN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_ADMIN,
+ .trainerName = _("TABITHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tabitha2 }
+ },
+
+ [TRAINER_JONATHAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("JONATHAN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jonathan }
+ },
+
+ [TRAINER_BRENDAN_12] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan12 }
+ },
+
+ [TRAINER_MAY_10] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0xb,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May10 }
+ },
+
+ [TRAINER_MAXIE_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_MAGMA_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE,
+ .trainerName = _("MAXIE"),
+ .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maxie1 }
+ },
+
+ [TRAINER_MAXIE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_MAGMA_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE,
+ .trainerName = _("MAXIE"),
+ .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maxie2 }
+ },
+
+ [TRAINER_TIANA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("TIANA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tiana }
+ },
+
+ [TRAINER_HALEY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("HALEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Haley1 }
+ },
+
+ [TRAINER_JANICE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("JANICE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Janice }
+ },
+
+ [TRAINER_VIVI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_WINSTRATE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("VIVI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Vivi }
+ },
+
+ [TRAINER_HALEY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("HALEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Haley2 }
+ },
+
+ [TRAINER_HALEY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("HALEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Haley3 }
+ },
+
+ [TRAINER_HALEY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("HALEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Haley4 }
+ },
+
+ [TRAINER_HALEY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("HALEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Haley5 }
+ },
+
+ [TRAINER_SALLY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("SALLY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sally }
+ },
+
+ [TRAINER_ROBIN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("ROBIN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Robin }
+ },
+
+ [TRAINER_ANDREA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("ANDREA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Andrea }
+ },
+
+ [TRAINER_CRISSY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_LASS,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LASS,
+ .trainerName = _("CRISSY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Crissy }
+ },
+
+ [TRAINER_RICK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("RICK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rick }
+ },
+
+ [TRAINER_LYLE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("LYLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lyle }
+ },
+
+ [TRAINER_JOSE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("JOSE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jose }
+ },
+
+ [TRAINER_DOUG] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("DOUG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Doug }
+ },
+
+ [TRAINER_GREG] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("GREG"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Greg }
+ },
+
+ [TRAINER_KENT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("KENT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kent }
+ },
+
+ [TRAINER_JAMES_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("JAMES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_James1 }
+ },
+
+ [TRAINER_JAMES_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("JAMES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_James2 }
+ },
+
+ [TRAINER_JAMES_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("JAMES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_James3 }
+ },
+
+ [TRAINER_JAMES_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("JAMES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_James4 }
+ },
+
+ [TRAINER_JAMES_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_CATCHER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BUG_CATCHER,
+ .trainerName = _("JAMES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_James5 }
+ },
+
+ [TRAINER_BRICE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("BRICE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brice }
+ },
+
+ [TRAINER_TRENT_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("TRENT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Trent1 }
+ },
+
+ [TRAINER_LENNY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("LENNY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lenny }
+ },
+
+ [TRAINER_LUCAS_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("LUCAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lucas1 }
+ },
+
+ [TRAINER_ALAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("ALAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alan }
+ },
+
+ [TRAINER_CLARK] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("CLARK"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Clark }
+ },
+
+ [TRAINER_ERIC] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("ERIC"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Eric }
+ },
+
+ [TRAINER_LUCAS_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("LUCAS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Lucas2 }
+ },
+
+ [TRAINER_MIKE_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("MIKE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Mike1 }
+ },
+
+ [TRAINER_MIKE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("MIKE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Mike2 }
+ },
+
+ [TRAINER_TRENT_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("TRENT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Trent2 }
+ },
+
+ [TRAINER_TRENT_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("TRENT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Trent3 }
+ },
+
+ [TRAINER_TRENT_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("TRENT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Trent4 }
+ },
+
+ [TRAINER_TRENT_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("TRENT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Trent5 }
+ },
+
+ [TRAINER_DEZ_AND_LUKE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("DEZ & LUKE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_DezAndLuke }
+ },
+
+ [TRAINER_LEA_AND_JED] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("LEA & JED"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_LeaAndJed }
+ },
+
+ [TRAINER_KIRA_AND_DAN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("KIRA & DAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan1 }
+ },
+
+ [TRAINER_KIRA_AND_DAN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("KIRA & DAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan2 }
+ },
+
+ [TRAINER_KIRA_AND_DAN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("KIRA & DAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan3 }
+ },
+
+ [TRAINER_KIRA_AND_DAN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("KIRA & DAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan4 }
+ },
+
+ [TRAINER_KIRA_AND_DAN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("KIRA & DAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan5 }
+ },
+
+ [TRAINER_JOHANNA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("JOHANNA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Johanna }
+ },
+
+ [TRAINER_GERALD] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("GERALD"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Gerald }
+ },
+
+ [TRAINER_VIVIAN] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("VIVIAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Vivian }
+ },
+
+ [TRAINER_DANIELLE] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("DANIELLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Danielle }
+ },
+
+ [TRAINER_HIDEO] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("HIDEO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x3,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Hideo }
+ },
+
+ [TRAINER_KEIGO] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("KEIGO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x3,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Keigo }
+ },
+
+ [TRAINER_RILEY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("RILEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x3,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_Riley }
+ },
+
+ [TRAINER_FLINT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("FLINT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Flint }
+ },
+
+ [TRAINER_ASHLEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("ASHLEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ashley }
+ },
+
+ [TRAINER_WALLY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_WALLY,
+ .trainerName = _("WALLY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wally2 }
+ },
+
+ [TRAINER_WALLY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_WALLY,
+ .trainerName = _("WALLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.NoItemCustomMoves = gTrainerParty_Wally3 }
+ },
+
+ [TRAINER_WALLY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_WALLY,
+ .trainerName = _("WALLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.NoItemCustomMoves = gTrainerParty_Wally4 }
+ },
+
+ [TRAINER_WALLY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_WALLY,
+ .trainerName = _("WALLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.NoItemCustomMoves = gTrainerParty_Wally5 }
+ },
+
+ [TRAINER_WALLY_6] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_WALLY,
+ .trainerName = _("WALLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.NoItemCustomMoves = gTrainerParty_Wally6 }
+ },
+
+ [TRAINER_BRENDAN_13] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan13 }
+ },
+
+ [TRAINER_BRENDAN_14] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan14 }
+ },
+
+ [TRAINER_BRENDAN_15] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan15 }
+ },
+
+ [TRAINER_MAY_11] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May11 }
+ },
+
+ [TRAINER_MAY_12] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May12 }
+ },
+
+ [TRAINER_MAY_13] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May13 }
+ },
+
+ [TRAINER_JONAH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("JONAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jonah }
+ },
+
+ [TRAINER_HENRY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("HENRY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Henry }
+ },
+
+ [TRAINER_ROGER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("ROGER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Roger }
+ },
+
+ [TRAINER_ALEXA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("ALEXA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alexa }
+ },
+
+ [TRAINER_RUBEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("RUBEN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Ruben }
+ },
+
+ [TRAINER_KOJI_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("KOJI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Koji1 }
+ },
+
+ [TRAINER_WAYNE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("WAYNE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wayne }
+ },
+
+ [TRAINER_AIDAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("AIDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Aidan }
+ },
+
+ [TRAINER_REED] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("REED"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Reed }
+ },
+
+ [TRAINER_TISHA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("TISHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tisha }
+ },
+
+ [TRAINER_TORI_AND_TIA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TWINS,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_TWINS,
+ .trainerName = _("TORI & TIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_ToriAndTia }
+ },
+
+ [TRAINER_KIM_AND_IRIS] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("KIM & IRIS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_KimAndIris }
+ },
+
+ [TRAINER_TYRA_AND_IVY] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_SR_AND_JR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_SR_AND_JR,
+ .trainerName = _("TYRA & IVY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_TyraAndIvy }
+ },
+
+ [TRAINER_MEL_AND_PAUL] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_YOUNG_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_YOUNG_COUPLE,
+ .trainerName = _("MEL & PAUL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_MelAndPaul }
+ },
+
+ [TRAINER_JOHN_AND_JAY_1] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_OLD_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_OLD_COUPLE,
+ .trainerName = _("JOHN & JAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay1 }
+ },
+
+ [TRAINER_JOHN_AND_JAY_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_OLD_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_OLD_COUPLE,
+ .trainerName = _("JOHN & JAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay2 }
+ },
+
+ [TRAINER_JOHN_AND_JAY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_OLD_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_OLD_COUPLE,
+ .trainerName = _("JOHN & JAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay3 }
+ },
+
+ [TRAINER_JOHN_AND_JAY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_OLD_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_OLD_COUPLE,
+ .trainerName = _("JOHN & JAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0xb,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay4 }
+ },
+
+ [TRAINER_JOHN_AND_JAY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_OLD_COUPLE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_OLD_COUPLE,
+ .trainerName = _("JOHN & JAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay5 }
+ },
+
+ [TRAINER_RELI_AND_IAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SIS_AND_BRO,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SIS_AND_BRO,
+ .trainerName = _("RELI & IAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_ReliAndIan }
+ },
+
+ [TRAINER_LILA_AND_ROY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SIS_AND_BRO,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SIS_AND_BRO,
+ .trainerName = _("LILA & ROY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy1 }
+ },
+
+ [TRAINER_LILA_AND_ROY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SIS_AND_BRO,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SIS_AND_BRO,
+ .trainerName = _("LILA & ROY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy2 }
+ },
+
+ [TRAINER_LILA_AND_ROY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SIS_AND_BRO,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SIS_AND_BRO,
+ .trainerName = _("LILA & ROY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy3 }
+ },
+
+ [TRAINER_LILA_AND_ROY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SIS_AND_BRO,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SIS_AND_BRO,
+ .trainerName = _("LILA & ROY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy4 }
+ },
+
+ [TRAINER_LILA_AND_ROY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SIS_AND_BRO,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SIS_AND_BRO,
+ .trainerName = _("LILA & ROY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy5 }
+ },
+
+ [TRAINER_LISA_AND_RAY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SIS_AND_BRO,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SIS_AND_BRO,
+ .trainerName = _("LISA & RAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_LisaAndRay }
+ },
+
+ [TRAINER_CHRIS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("CHRIS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Chris }
+ },
+
+ [TRAINER_DAWSON] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_RICH_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_RICH_BOY,
+ .trainerName = _("DAWSON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Dawson }
+ },
+
+ [TRAINER_SARAH] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LADY,
+ .trainerName = _("SARAH"),
+ .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Sarah }
+ },
+
+ [TRAINER_DARIAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("DARIAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Darian }
+ },
+
+ [TRAINER_HAILEY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_F,
+ .trainerName = _("HAILEY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hailey }
+ },
+
+ [TRAINER_CHANDLER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TUBER_2,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_TUBER_M,
+ .trainerName = _("CHANDLER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Chandler }
+ },
+
+ [TRAINER_KALEB] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM,
+ .trainerClass = TRAINER_CLASS_POKEFAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS,
+ .trainerPic = TRAINER_PIC_WINSTRATE_M,
+ .trainerName = _("KALEB"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.ItemDefaultMoves = gTrainerParty_Kaleb }
+ },
+
+ [TRAINER_JOSEPH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("JOSEPH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Joseph }
+ },
+
+ [TRAINER_ALYSSA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F,
+ .trainerName = _("ALYSSA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alyssa }
+ },
+
+ [TRAINER_MARCOS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("MARCOS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Marcos }
+ },
+
+ [TRAINER_RHETT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("RHETT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rhett }
+ },
+
+ [TRAINER_TYRON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("TYRON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tyron }
+ },
+
+ [TRAINER_CELINA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("CELINA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Celina }
+ },
+
+ [TRAINER_BIANCA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("BIANCA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bianca }
+ },
+
+ [TRAINER_HAYDEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("HAYDEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Hayden }
+ },
+
+ [TRAINER_SOPHIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("SOPHIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sophie }
+ },
+
+ [TRAINER_COBY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("COBY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Coby }
+ },
+
+ [TRAINER_LAWRENCE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("LAWRENCE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lawrence }
+ },
+
+ [TRAINER_WYATT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_POKEMANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_POKEMANIAC,
+ .trainerName = _("WYATT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Wyatt }
+ },
+
+ [TRAINER_ANGELINA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("ANGELINA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Angelina }
+ },
+
+ [TRAINER_KAI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FISHERMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_FISHERMAN,
+ .trainerName = _("KAI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kai }
+ },
+
+ [TRAINER_CHARLOTTE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("CHARLOTTE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Charlotte }
+ },
+
+ [TRAINER_DEANDRE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("DEANDRE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Deandre }
+ },
+
+ [TRAINER_GRUNT_38] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt38 }
+ },
+
+ [TRAINER_GRUNT_39] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt39 }
+ },
+
+ [TRAINER_GRUNT_40] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt40 }
+ },
+
+ [TRAINER_GRUNT_41] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt41 }
+ },
+
+ [TRAINER_GRUNT_42] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt42 }
+ },
+
+ [TRAINER_GRUNT_43] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt43 }
+ },
+
+ [TRAINER_GRUNT_44] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt44 }
+ },
+
+ [TRAINER_GRUNT_45] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt45 }
+ },
+
+ [TRAINER_GRUNT_46] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt46 }
+ },
+
+ [TRAINER_GRUNT_47] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt47 }
+ },
+
+ [TRAINER_GRUNT_48] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt48 }
+ },
+
+ [TRAINER_GRUNT_49] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt49 }
+ },
+
+ [TRAINER_GRUNT_50] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt50 }
+ },
+
+ [TRAINER_GRUNT_51] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt51 }
+ },
+
+ [TRAINER_GRUNT_52] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt52 }
+ },
+
+ [TRAINER_GRUNT_53] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TEAM_MAGMA,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F,
+ .trainerName = _("GRUNT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Grunt53 }
+ },
+
+ [TRAINER_TABITHA_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_MAGMA_ADMIN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_ADMIN,
+ .trainerName = _("TABITHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 4,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tabitha3 }
+ },
+
+ [TRAINER_DARCY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("DARCY"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Darcy }
+ },
+
+ [TRAINER_MAXIE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_MAGMA_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA,
+ .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE,
+ .trainerName = _("MAXIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Maxie3 }
+ },
+
+ [TRAINER_PETE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_M,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_M,
+ .trainerName = _("PETE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Pete }
+ },
+
+ [TRAINER_ISABELLE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SWIMMER_F,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMER_F,
+ .trainerName = _("ISABELLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Isabelle }
+ },
+
+ [TRAINER_ANDRES_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("ANDRES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Andres1 }
+ },
+
+ [TRAINER_JOSUE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("JOSUE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Josue }
+ },
+
+ [TRAINER_CAMRON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("CAMRON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Camron }
+ },
+
+ [TRAINER_CORY_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("CORY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cory1 }
+ },
+
+ [TRAINER_CAROLINA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("CAROLINA"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Carolina }
+ },
+
+ [TRAINER_ELIJAH] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("ELIJAH"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Elijah }
+ },
+
+ [TRAINER_CELIA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PICNICKER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL,
+ .trainerPic = TRAINER_PIC_PICNICKER,
+ .trainerName = _("CELIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Celia }
+ },
+
+ [TRAINER_BRYAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("BRYAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bryan }
+ },
+
+ [TRAINER_BRANDEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_CAMPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_CAMPER,
+ .trainerName = _("BRANDEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Branden }
+ },
+
+ [TRAINER_BRYANT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("BRYANT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Bryant }
+ },
+
+ [TRAINER_SHAYLA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_AROMA_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_AROMA_LADY,
+ .trainerName = _("SHAYLA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Shayla }
+ },
+
+ [TRAINER_KYRA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,
+ .trainerName = _("KYRA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Kyra }
+ },
+
+ [TRAINER_JAIDEN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_NINJA_BOY,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_NINJA_BOY,
+ .trainerName = _("JAIDEN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Jaiden }
+ },
+
+ [TRAINER_ALIX] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("ALIX"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alix }
+ },
+
+ [TRAINER_HELENE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("HELENE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Helene }
+ },
+
+ [TRAINER_MARLENE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("MARLENE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Marlene }
+ },
+
+ [TRAINER_DEVAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("DEVAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Devan }
+ },
+
+ [TRAINER_JOHNSON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_YOUNGSTER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_YOUNGSTER,
+ .trainerName = _("JOHNSON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Johnson }
+ },
+
+ [TRAINER_MELINA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F,
+ .trainerName = _("MELINA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Melina }
+ },
+
+ [TRAINER_BRANDI] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("BRANDI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brandi }
+ },
+
+ [TRAINER_AISHA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("AISHA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Aisha }
+ },
+
+ [TRAINER_MAKAYLA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_EXPERT,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_EXPERT_F,
+ .trainerName = _("MAKAYLA"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Makayla }
+ },
+
+ [TRAINER_FABIAN] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("FABIAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Fabian }
+ },
+
+ [TRAINER_DAYTON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_KINDLER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_KINDLER,
+ .trainerName = _("DAYTON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Dayton }
+ },
+
+ [TRAINER_RACHEL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PARASOL_LADY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_PARASOL_LADY,
+ .trainerName = _("RACHEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Rachel }
+ },
+
+ [TRAINER_LEONEL] =
+ {
+ .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_M,
+ .trainerName = _("LEONEL"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemCustomMoves = gTrainerParty_Leonel }
+ },
+
+ [TRAINER_CALLIE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BATTLE_GIRL,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BATTLE_GIRL,
+ .trainerName = _("CALLIE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Callie }
+ },
+
+ [TRAINER_CALE] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("CALE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cale }
+ },
+
+ [TRAINER_MYLES] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M,
+ .trainerName = _("MYLES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Myles }
+ },
+
+ [TRAINER_PAT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("PAT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Pat }
+ },
+
+ [TRAINER_CRISTIN_1] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("CRISTIN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cristin1 }
+ },
+
+ [TRAINER_MAY_14] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May14 }
+ },
+
+ [TRAINER_MAY_15] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May15 }
+ },
+
+ [TRAINER_ROXANNE_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_ROXANNE,
+ .trainerName = _("ROXANNE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Roxanne2 }
+ },
+
+ [TRAINER_ROXANNE_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_ROXANNE,
+ .trainerName = _("ROXANNE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Roxanne3 }
+ },
+
+ [TRAINER_ROXANNE_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_ROXANNE,
+ .trainerName = _("ROXANNE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Roxanne4 }
+ },
+
+ [TRAINER_ROXANNE_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_ROXANNE,
+ .trainerName = _("ROXANNE"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Roxanne5 }
+ },
+
+ [TRAINER_BRAWLY_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_BRAWLY,
+ .trainerName = _("BRAWLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Brawly2 }
+ },
+
+ [TRAINER_BRAWLY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_BRAWLY,
+ .trainerName = _("BRAWLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Brawly3 }
+ },
+
+ [TRAINER_BRAWLY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_BRAWLY,
+ .trainerName = _("BRAWLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Brawly4 }
+ },
+
+ [TRAINER_BRAWLY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_BRAWLY,
+ .trainerName = _("BRAWLY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Brawly5 }
+ },
+
+ [TRAINER_WATTSON_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_WATTSON,
+ .trainerName = _("WATTSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Wattson2 }
+ },
+
+ [TRAINER_WATTSON_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_WATTSON,
+ .trainerName = _("WATTSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Wattson3 }
+ },
+
+ [TRAINER_WATTSON_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_WATTSON,
+ .trainerName = _("WATTSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Wattson4 }
+ },
+
+ [TRAINER_WATTSON_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_WATTSON,
+ .trainerName = _("WATTSON"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Wattson5 }
+ },
+
+ [TRAINER_FLANNERY_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_FLANNERY,
+ .trainerName = _("FLANNERY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Flannery2 }
+ },
+
+ [TRAINER_FLANNERY_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_FLANNERY,
+ .trainerName = _("FLANNERY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Flannery3 }
+ },
+
+ [TRAINER_FLANNERY_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_FLANNERY,
+ .trainerName = _("FLANNERY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Flannery4 }
+ },
+
+ [TRAINER_FLANNERY_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_FLANNERY,
+ .trainerName = _("FLANNERY"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Flannery5 }
+ },
+
+ [TRAINER_NORMAN_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_NORMAN,
+ .trainerName = _("NORMAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 4,
+ .party = {.ItemCustomMoves = gTrainerParty_Norman2 }
+ },
+
+ [TRAINER_NORMAN_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_NORMAN,
+ .trainerName = _("NORMAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Norman3 }
+ },
+
+ [TRAINER_NORMAN_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_NORMAN,
+ .trainerName = _("NORMAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Norman4 }
+ },
+
+ [TRAINER_NORMAN_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_NORMAN,
+ .trainerName = _("NORMAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Norman5 }
+ },
+
+ [TRAINER_WINONA_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_WINONA,
+ .trainerName = _("WINONA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x17,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Winona2 }
+ },
+
+ [TRAINER_WINONA_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_WINONA,
+ .trainerName = _("WINONA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x17,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Winona3 }
+ },
+
+ [TRAINER_WINONA_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_WINONA,
+ .trainerName = _("WINONA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x17,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Winona4 }
+ },
+
+ [TRAINER_WINONA_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_WINONA,
+ .trainerName = _("WINONA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x17,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Winona5 }
+ },
+
+ [TRAINER_TATE_AND_LIZA_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA,
+ .trainerName = _("TATE&LIZA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza2 }
+ },
+
+ [TRAINER_TATE_AND_LIZA_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA,
+ .trainerName = _("TATE&LIZA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza3 }
+ },
+
+ [TRAINER_TATE_AND_LIZA_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA,
+ .trainerName = _("TATE&LIZA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza4 }
+ },
+
+ [TRAINER_TATE_AND_LIZA_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA,
+ .trainerName = _("TATE&LIZA"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza5 }
+ },
+
+ [TRAINER_JUAN_2] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_JUAN,
+ .trainerName = _("JUAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Juan2 }
+ },
+
+ [TRAINER_JUAN_3] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_JUAN,
+ .trainerName = _("JUAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 5,
+ .party = {.ItemCustomMoves = gTrainerParty_Juan3 }
+ },
+
+ [TRAINER_JUAN_4] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_JUAN,
+ .trainerName = _("JUAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Juan4 }
+ },
+
+ [TRAINER_JUAN_5] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_LEADER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEADER_JUAN,
+ .trainerName = _("JUAN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE},
+ .doubleBattle = TRUE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Juan5 }
+ },
+
+ [TRAINER_ANGELO] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_BUG_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS,
+ .trainerPic = TRAINER_PIC_BUG_MANIAC,
+ .trainerName = _("ANGELO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.ItemCustomMoves = gTrainerParty_Angelo }
+ },
+
+ [TRAINER_DARIUS] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BIRD_KEEPER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_BIRD_KEEPER,
+ .trainerName = _("DARIUS"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Darius }
+ },
+
+ [TRAINER_STEVEN] =
+ {
+ .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_STEVEN,
+ .trainerName = _("STEVEN"),
+ .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 6,
+ .party = {.ItemCustomMoves = gTrainerParty_Steven }
+ },
+
+ [TRAINER_ANABEL] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SALON_MAIDEN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL,
+ .trainerName = _("ANABEL"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Anabel }
+ },
+
+ [TRAINER_TUCKER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_DOME_ACE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_DOME_ACE_TUCKER,
+ .trainerName = _("TUCKER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Tucker }
+ },
+
+ [TRAINER_SPENSER] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PALACE_MAVEN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_PALACE_MAVEN_SPENSER,
+ .trainerName = _("SPENSER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Spenser }
+ },
+
+ [TRAINER_GRETA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_ARENA_TYCOON,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA,
+ .trainerName = _("GRETA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Greta }
+ },
+
+ [TRAINER_NOLAND] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_FACTORY_HEAD,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_FACTORY_HEAD_NOLAND,
+ .trainerName = _("NOLAND"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Noland }
+ },
+
+ [TRAINER_LUCY] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PIKE_QUEEN,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY,
+ .trainerName = _("LUCY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Lucy }
+ },
+
+ [TRAINER_BRANDON] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PYRAMID_KING,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_PYRAMID_KING_BRANDON,
+ .trainerName = _("BRANDON"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brandon }
+ },
+
+ [TRAINER_ANDRES_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("ANDRES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Andres2 }
+ },
+
+ [TRAINER_ANDRES_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("ANDRES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Andres3 }
+ },
+
+ [TRAINER_ANDRES_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("ANDRES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Andres4 }
+ },
+
+ [TRAINER_ANDRES_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_RUIN_MANIAC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_RUIN_MANIAC,
+ .trainerName = _("ANDRES"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Andres5 }
+ },
+
+ [TRAINER_CORY_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("CORY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cory2 }
+ },
+
+ [TRAINER_CORY_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("CORY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cory3 }
+ },
+
+ [TRAINER_CORY_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("CORY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cory4 }
+ },
+
+ [TRAINER_CORY_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_SAILOR,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_SAILOR,
+ .trainerName = _("CORY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cory5 }
+ },
+
+ [TRAINER_PABLO_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("PABLO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Pablo2 }
+ },
+
+ [TRAINER_PABLO_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("PABLO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Pablo3 }
+ },
+
+ [TRAINER_PABLO_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("PABLO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Pablo4 }
+ },
+
+ [TRAINER_PABLO_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_TRIATHLETE,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER,
+ .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M,
+ .trainerName = _("PABLO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Pablo5 }
+ },
+
+ [TRAINER_KOJI_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("KOJI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Koji2 }
+ },
+
+ [TRAINER_KOJI_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("KOJI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Koji3 }
+ },
+
+ [TRAINER_KOJI_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("KOJI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Koji4 }
+ },
+
+ [TRAINER_KOJI_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BLACK_BELT,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_BLACK_BELT,
+ .trainerName = _("KOJI"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Koji5 }
+ },
+
+ [TRAINER_CRISTIN_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("CRISTIN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cristin2 }
+ },
+
+ [TRAINER_CRISTIN_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("CRISTIN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cristin3 }
+ },
+
+ [TRAINER_CRISTIN_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("CRISTIN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cristin4 }
+ },
+
+ [TRAINER_CRISTIN_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_COOLTRAINER_1,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL,
+ .trainerPic = TRAINER_PIC_COOL_TRAINER_F,
+ .trainerName = _("CRISTIN"),
+ .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Cristin5 }
+ },
+
+ [TRAINER_FERNANDO_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("FERNANDO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Fernando2 }
+ },
+
+ [TRAINER_FERNANDO_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("FERNANDO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Fernando3 }
+ },
+
+ [TRAINER_FERNANDO_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("FERNANDO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Fernando4 }
+ },
+
+ [TRAINER_FERNANDO_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GUITARIST,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_GUITARIST,
+ .trainerName = _("FERNANDO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Fernando5 }
+ },
+
+ [TRAINER_SAWYER_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("SAWYER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer2 }
+ },
+
+ [TRAINER_SAWYER_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("SAWYER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer3 }
+ },
+
+ [TRAINER_SAWYER_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("SAWYER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer4 }
+ },
+
+ [TRAINER_SAWYER_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_HIKER,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER,
+ .trainerPic = TRAINER_PIC_HIKER,
+ .trainerName = _("SAWYER"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x7,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer5 }
+ },
+
+ [TRAINER_GABRIELLE_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("GABRIELLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle2 }
+ },
+
+ [TRAINER_GABRIELLE_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("GABRIELLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle3 }
+ },
+
+ [TRAINER_GABRIELLE_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("GABRIELLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle4 }
+ },
+
+ [TRAINER_GABRIELLE_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_BREEDER,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F,
+ .trainerName = _("GABRIELLE"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 6,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle5 }
+ },
+
+ [TRAINER_THALIA_2] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("THALIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Thalia2 }
+ },
+
+ [TRAINER_THALIA_3] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("THALIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Thalia3 }
+ },
+
+ [TRAINER_THALIA_4] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("THALIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Thalia4 }
+ },
+
+ [TRAINER_THALIA_5] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_BEAUTY,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE,
+ .trainerPic = TRAINER_PIC_BEAUTY,
+ .trainerName = _("THALIA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x1,
+ .partySize = 3,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Thalia5 }
+ },
+
+ [TRAINER_MARIELA] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_F,
+ .trainerName = _("MARIELA"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Mariela }
+ },
+
+ [TRAINER_ALVARO] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PSYCHIC,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE,
+ .trainerPic = TRAINER_PIC_PSYCHIC_M,
+ .trainerName = _("ALVARO"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 2,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Alvaro }
+ },
+
+ [TRAINER_EVERETT] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_GENTLEMAN,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH,
+ .trainerPic = TRAINER_PIC_GENTLEMAN,
+ .trainerName = _("EVERETT"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Everett }
+ },
+
+ [TRAINER_RED] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RED,
+ .trainerName = _("RED"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Red }
+ },
+
+ [TRAINER_LEAF] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_LEAF,
+ .trainerName = _("LEAF"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Leaf }
+ },
+
+ [TRAINER_BRENDAN_16] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_4,
+ .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RUBY_SAPPHIRE_BRENDAN,
+ .trainerName = _("BRENDAN"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_Brendan16 }
+ },
+
+ [TRAINER_MAY_16] =
+ {
+ .partyFlags = 0,
+ .trainerClass = TRAINER_CLASS_PKMN_TRAINER_4,
+ .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE,
+ .trainerPic = TRAINER_PIC_RUBY_SAPPHIRE_MAY,
+ .trainerName = _("MAY"),
+ .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE},
+ .doubleBattle = FALSE,
+ .aiFlags = 0x0,
+ .partySize = 1,
+ .party = {.NoItemDefaultMoves = gTrainerParty_May16 }
+ },
+};
diff --git a/src/daycare.c b/src/daycare.c
index 8dd45863a..c73d91521 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -1,15 +1,16 @@
#include "global.h"
#include "pokemon.h"
+#include "battle.h"
#include "daycare.h"
#include "string_util.h"
-#include "species.h"
-#include "items.h"
+#include "constants/species.h"
+#include "constants/items.h"
#include "mail.h"
#include "pokemon_storage_system.h"
#include "event_data.h"
-#include "rng.h"
+#include "random.h"
#include "main.h"
-#include "moves.h"
+#include "constants/moves.h"
#include "egg_hatch.h"
#include "text.h"
#include "menu.h"
@@ -22,8 +23,6 @@
#define EGG_MOVES_ARRAY_COUNT 10
#define EGG_LVL_UP_MOVES_ARRAY_COUNT 50
-extern u16 gMoveToLearn;
-
// text
extern const u8 gText_MaleSymbol4[];
extern const u8 gText_FemaleSymbol4[];
@@ -40,16 +39,15 @@ extern const u8 gDaycareText_PlayOther[];
extern u8 GetCursorSelectionMonId(void);
extern u16 ItemIdToBattleMoveId(u16);
-extern s32 ListMenuHandleInput(u8);
-extern void sub_81AE6C8(u8, u16*, u16*);
+extern s32 ListMenuHandleInputGetItemId(u8);
+extern void DestroyListMenuTask(u8, u16*, u16*);
extern void sub_819746C(u8, bool8);
-extern void sub_81973FC(u8, bool8);
+extern void NewMenuHelpers_DrawStdWindowFrame(u8, bool8);
extern void sub_81B9328(void);
-extern void sub_81AF078(u32, bool8, struct ListMenu *);
-extern void c2_exit_to_overworld_2_switch(void);
+extern void CB2_ReturnToField(void);
// this file's functions
-static void ClearDaycareMonMisc(struct DaycareMiscMon *misc);
+static void ClearDaycareMonMail(struct DayCareMail *mail);
static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare);
static u8 GetDaycareCompatibilityScore(struct DayCare *daycare);
static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y);
@@ -75,22 +73,23 @@ static const struct ListMenuItem sLevelMenuItems[] =
static const struct ListMenuTemplate sDaycareListMenuLevelTemplate =
{
.items = sLevelMenuItems,
- .unk_04 = sub_81AF078,
- .unk_08 = DaycarePrintMonInfo,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = DaycarePrintMonInfo,
.totalItems = 3,
.maxShowed = 3,
- .unk_10 = 0,
- .unk_11 = 0,
- .unk_12 = 8,
- .cursor_Y = 0,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
.upText_Y = 1,
- .cursorColor = 2,
- .fillColor = 1,
- .cursorShadowColor = 3,
- .unk_16_0 = TRUE,
- .spaceBetweenItems = 0,
- .unk_16_7 = FALSE,
- .unk_17_0 = 1
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 1,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = LIST_NO_MULTIPLE_SCROLL,
+ .fontId = 1,
+ .cursorKind = 0
};
static const u8 *const sCompatibilityMessages[] =
@@ -180,13 +179,13 @@ static void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycar
{
u8 mailId;
- StringCopy(daycareMon->misc.OT_name, gSaveBlock2Ptr->playerName);
- GetMonNick(mon, daycareMon->misc.monName);
- StripExtCtrlCodes(daycareMon->misc.monName);
- daycareMon->misc.gameLanguage = LANGUAGE_ENGLISH;
- daycareMon->misc.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE);
+ StringCopy(daycareMon->mail.OT_name, gSaveBlock2Ptr->playerName);
+ GetMonNick(mon, daycareMon->mail.monName);
+ StripExtCtrlCodes(daycareMon->mail.monName);
+ daycareMon->mail.gameLanguage = LANGUAGE_ENGLISH;
+ daycareMon->mail.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE);
mailId = GetMonData(mon, MON_DATA_MAIL);
- daycareMon->misc.mail = gSaveBlock1Ptr->mail[mailId];
+ daycareMon->mail.message = gSaveBlock1Ptr->mail[mailId];
TakeMailFromMon(mon);
}
@@ -220,10 +219,10 @@ static void ShiftDaycareSlots(struct DayCare *daycare)
daycare->mons[0].mon = daycare->mons[1].mon;
ZeroBoxMonData(&daycare->mons[1].mon);
- daycare->mons[0].misc = daycare->mons[1].misc;
+ daycare->mons[0].mail = daycare->mons[1].mail;
daycare->mons[0].steps = daycare->mons[1].steps;
daycare->mons[1].steps = 0;
- ClearDaycareMonMisc(&daycare->mons[1].misc);
+ ClearDaycareMonMail(&daycare->mons[1].mail);
}
}
@@ -278,10 +277,10 @@ static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon)
}
gPlayerParty[PARTY_SIZE - 1] = pokemon;
- if (daycareMon->misc.mail.itemId)
+ if (daycareMon->mail.message.itemId)
{
- GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycareMon->misc.mail);
- ClearDaycareMonMisc(&daycareMon->misc);
+ GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycareMon->mail.message);
+ ClearDaycareMonMail(&daycareMon->mail);
}
ZeroBoxMonData(&daycareMon->mon);
@@ -365,23 +364,23 @@ u8 GetNumLevelsGainedFromDaycare(void)
return 0;
}
-static void ClearDaycareMonMisc(struct DaycareMiscMon *misc)
+static void ClearDaycareMonMail(struct DayCareMail *mail)
{
s32 i;
for (i = 0; i < OT_NAME_LENGTH + 1; i++)
- misc->OT_name[i] = 0;
+ mail->OT_name[i] = 0;
for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++)
- misc->monName[i] = 0;
+ mail->monName[i] = 0;
- ClearMailStruct(&misc->mail);
+ ClearMailStruct(&mail->message);
}
static void ClearDaycareMon(struct DaycareMon *daycareMon)
{
ZeroBoxMonData(&daycareMon->mon);
daycareMon->steps = 0;
- ClearDaycareMonMisc(&daycareMon->misc);
+ ClearDaycareMonMail(&daycareMon->mail);
}
static void ClearAllDaycareData(struct DayCare *daycare)
@@ -412,7 +411,7 @@ static u16 GetEggSpecies(u16 species)
{
for (k = 0; k < EVOS_PER_MON; k++)
{
- if (gEvolutionTable[j].evolutions[k].targetSpecies == species)
+ if (gEvolutionTable[j][k].targetSpecies == species)
{
species = j;
found = TRUE;
@@ -693,7 +692,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
{
for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++)
{
- if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j))
+ if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j))
{
if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == 0xffff)
DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]);
@@ -1211,7 +1210,7 @@ static void DaycareAddTextPrinter(u8 windowId, const u8 *text, u32 x, u32 y)
gTextFlags.flag_1 = 0;
printer.letterSpacing = 0;
printer.lineSpacing = 1;
- printer.fontColor_h = 2;
+ printer.fgColor = 2;
printer.bgColor = 1;
printer.shadowColor = 3;
@@ -1256,7 +1255,7 @@ static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y)
static void Task_HandleDaycareLevelMenuInput(u8 taskId)
{
- u32 var = ListMenuHandleInput(gTasks[taskId].tMenuListTaskId);
+ u32 var = ListMenuHandleInputGetItemId(gTasks[taskId].tMenuListTaskId);
if (gMain.newKeys & A_BUTTON)
{
@@ -1270,7 +1269,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
gSpecialVar_Result = 2;
break;
}
- sub_81AE6C8(gTasks[taskId].tMenuListTaskId, NULL, NULL);
+ DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
sub_819746C(gTasks[taskId].tWindowId, TRUE);
RemoveWindow(gTasks[taskId].tWindowId);
DestroyTask(taskId);
@@ -1279,7 +1278,7 @@ static void Task_HandleDaycareLevelMenuInput(u8 taskId)
else if (gMain.newKeys & B_BUTTON)
{
gSpecialVar_Result = 2;
- sub_81AE6C8(gTasks[taskId].tMenuListTaskId, NULL, NULL);
+ DestroyListMenuTask(gTasks[taskId].tMenuListTaskId, NULL, NULL);
sub_819746C(gTasks[taskId].tWindowId, TRUE);
RemoveWindow(gTasks[taskId].tWindowId);
DestroyTask(taskId);
@@ -1295,10 +1294,10 @@ void ShowDaycareLevelMenu(void)
u8 daycareMenuTaskId;
windowId = AddWindow(&sDaycareLevelMenuWindowTemplate);
- sub_81973FC(windowId, FALSE);
+ NewMenuHelpers_DrawStdWindowFrame(windowId, FALSE);
menuTemplate = sDaycareListMenuLevelTemplate;
- menuTemplate.unk_10 = windowId;
+ menuTemplate.windowId = windowId;
listMenuTaskId = ListMenuInit(&menuTemplate, 0, 0);
CopyWindowToVram(windowId, 3);
@@ -1314,5 +1313,5 @@ void ShowDaycareLevelMenu(void)
void ChooseSendDaycareMon(void)
{
sub_81B9328();
- gMain.savedCallback = c2_exit_to_overworld_2_switch;
+ gMain.savedCallback = CB2_ReturnToField;
}
diff --git a/src/decompress.c b/src/decompress.c
index 9210799ec..83a9db0b6 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -1,6 +1,6 @@
#include "global.h"
#include "decompress.h"
-#include "species.h"
+#include "constants/species.h"
#include "text.h"
#include "malloc.h"
#include "pokemon.h"
@@ -117,7 +117,7 @@ void Unused_LZDecompressWramIndirect(const void **src, void *dest)
}
// This one (unused) function is really challenging, won't even try to decompile it.
-__attribute__((naked))
+NAKED
void sub_803471C()
{
asm(".syntax unified\n\
@@ -459,10 +459,9 @@ _08034964:\n\
.syntax divided");
}
-u32 sub_8034974(void* ptr)
+u32 GetDecompressedDataSize(const u8 *ptr)
{
- u8* ptr_ = (u8*)(ptr);
- return (ptr_[3] << 16) | (ptr_[2] << 8) | (ptr_[1]);
+ return (ptr[3] << 16) | (ptr[2] << 8) | (ptr[1]);
}
bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src)
diff --git a/src/decoration.c b/src/decoration.c
index adcdc583b..b21d51278 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -1,13 +1,15 @@
#include "global.h"
+#include "constants/decorations.h"
#include "decompress.h"
#include "malloc.h"
+#include "text.h"
#include "string_util.h"
#include "international_string_util.h"
#include "script.h"
#include "task.h"
#include "main.h"
#include "palette.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "overworld.h"
#include "fieldmap.h"
#include "metatile_behavior.h"
@@ -15,15 +17,14 @@
#include "field_player_avatar.h"
#include "field_camera.h"
#include "field_screen.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "list_menu.h"
#include "menu_helpers.h"
-#include "new_menu_helpers.h"
-#include "menu_indicators.h"
+#include "menu.h"
#include "sound.h"
#include "event_scripts.h"
#include "event_data.h"
-#include "region_map.h"
+#include "constants/region_map_sections.h"
#include "player_pc.h"
#include "strings.h"
#include "tv.h"
@@ -31,7 +32,7 @@
#include "tilesets.h"
#include "item_icon.h"
#include "trader.h"
-#include "map_object_constants.h"
+#include "constants/event_objects.h"
#include "decoration_inventory.h"
#include "decoration.h"
#include "graphics.h"
@@ -109,7 +110,7 @@ void sub_812719C(u8 taskId);
void sub_81271CC(u8 taskId);
void sub_8127268(u8 taskId);
void sub_8127454(u8 *dest, u16 decorId);
-void sub_8127480(u32 a0, bool8 flag, struct ListMenu *menu);
+void sub_8127480(s32 a0, bool8 flag, struct ListMenu *menu);
void sub_81274A0(u8 a0, s32 a1, u8 a2);
void sub_8127620(u8 taskId);
void sub_812764C(u8 taskId);
@@ -498,7 +499,7 @@ void sub_8126B80(u8 taskId)
void sub_8126C08(void)
{
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParametrized(0, 1, sSecretBasePCMenuItemDescriptions[sSecretBasePCMenuCursorPos], 0, 0, 2, 1, 3);
+ AddTextPrinterParameterized(0, 1, sSecretBasePCMenuItemDescriptions[sSecretBasePCMenuCursorPos], 0, 0, 2, 1, 3);
}
void SecretBasePC_Decorate(u8 taskId)
@@ -527,7 +528,7 @@ void SecretBasePC_PutAway(u8 taskId)
{
sub_8126A58(0);
sub_8197434(0, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8129ABC;
}
@@ -558,7 +559,7 @@ void SecretBasePC_Cancel(u8 taskId)
}
else
{
- sub_816B060(taskId);
+ ReshowPlayerPC(taskId);
}
}
@@ -725,7 +726,7 @@ void sub_81271CC(u8 taskId)
{
sub_8126A58(1);
sub_8126A88();
- sub_81973C4(0, 0);
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
sub_8126C08();
gTasks[taskId].func = sub_8126B80;
}
@@ -790,17 +791,17 @@ void sub_8127330(u8 taskId)
for (i = 0; i < sDecorPCBuffer->unk_520 - 1; i ++)
{
sub_8127454(sDecorPCBuffer->names[i], gCurDecorInventoryItems[i]);
- sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i];
- sDecorPCBuffer->items[i].unk_04 = i;
+ sDecorPCBuffer->items[i].name = sDecorPCBuffer->names[i];
+ sDecorPCBuffer->items[i].id = i;
}
StringCopy(sDecorPCBuffer->names[i], gText_Cancel);
- sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i];
- sDecorPCBuffer->items[i].unk_04 = -2;
- gUnknown_03006310 = gUnknown_085A6BD0;
- gUnknown_03006310.unk_10 = sDecorMenuWindowIndices[1];
- gUnknown_03006310.totalItems = sDecorPCBuffer->unk_520;
- gUnknown_03006310.items = sDecorPCBuffer->items;
- gUnknown_03006310.maxShowed = sDecorPCBuffer->unk_521;
+ sDecorPCBuffer->items[i].name = sDecorPCBuffer->names[i];
+ sDecorPCBuffer->items[i].id = -2;
+ gMultiuseListMenuTemplate = gUnknown_085A6BD0;
+ gMultiuseListMenuTemplate.windowId = sDecorMenuWindowIndices[1];
+ gMultiuseListMenuTemplate.totalItems = sDecorPCBuffer->unk_520;
+ gMultiuseListMenuTemplate.items = sDecorPCBuffer->items;
+ gMultiuseListMenuTemplate.maxShowed = sDecorPCBuffer->unk_521;
}
void sub_8127454(u8 *dest, u16 decorId)
@@ -809,7 +810,7 @@ void sub_8127454(u8 *dest, u16 decorId)
StringAppend(dest, gDecorations[decorId].name);
}
-void sub_8127480(u32 a0, bool8 flag, struct ListMenu *menu)
+void sub_8127480(s32 a0, bool8 flag, struct ListMenu *menu)
{
if (flag != TRUE)
{
@@ -837,7 +838,7 @@ void sub_8127500(void)
{
if (sDecorPCBuffer->unk_522 == 0xFF)
{
- sDecorPCBuffer->unk_522 = AddScrollIndicatorArrowPairParametrized(0x02, 0x3c, 0x0c, 0x94, sDecorPCBuffer->unk_520 - sDecorPCBuffer->unk_521, 0x6e, 0x6e, &sSecretBasePCSelectDecorPageNo);
+ sDecorPCBuffer->unk_522 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0x3c, 0x0c, 0x94, sDecorPCBuffer->unk_520 - sDecorPCBuffer->unk_521, 0x6e, 0x6e, &sSecretBasePCSelectDecorPageNo);
}
}
@@ -869,7 +870,7 @@ void sub_812759C(u8 taskId)
sub_81272C8();
sub_81272F8();
sub_8127330(taskId);
- data[13] = ListMenuInit(&gUnknown_03006310, sSecretBasePCSelectDecorPageNo, sSecretBasePCSelectDecorLineNo);
+ data[13] = ListMenuInit(&gMultiuseListMenuTemplate, sSecretBasePCSelectDecorPageNo, sSecretBasePCSelectDecorLineNo);
sub_8127500();
}
@@ -887,8 +888,8 @@ void sub_812764C(u8 taskId)
data = gTasks[taskId].data;
if (!gPaletteFade.active)
{
- input = ListMenuHandleInput(data[13]);
- get_coro_args_x18_x1A(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
+ input = ListMenuHandleInputGetItemId(data[13]);
+ ListMenuGetScrollAndRow(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
switch (input)
{
case -1:
@@ -901,7 +902,7 @@ void sub_812764C(u8 taskId)
PlaySE(SE_SELECT);
gCurDecorationIndex = input;
sub_8127554();
- sub_81AE6C8(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
+ DestroyListMenuTask(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
sub_8126A58(1);
sub_81277A8();
free(sDecorPCBuffer);
@@ -1070,7 +1071,7 @@ void sub_8127A8C(u8 taskId)
data = gTasks[taskId].data;
sub_8127554();
sub_81277A8();
- sub_81AE6C8(data[13], NULL, NULL);
+ DestroyListMenuTask(data[13], NULL, NULL);
free(sDecorPCBuffer);
sub_8126E44(taskId);
}
@@ -1201,15 +1202,15 @@ void sub_8127E18(void)
if (FlagGet(0xAE + i) == TRUE)
{
FlagClear(0xAE + i);
- for (j = 0; j < gMapHeader.events->mapObjectCount; j ++)
+ for (j = 0; j < gMapHeader.events->eventObjectCount; j ++)
{
- if (gMapHeader.events->mapObjects[j].flagId == 0xAE + i)
+ if (gMapHeader.events->eventObjects[j].flagId == 0xAE + i)
{
break;
}
}
- VarSet(0x3F20 + gMapHeader.events->mapObjects[j].graphicsId, sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0]);
- gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId;
+ VarSet(0x3F20 + gMapHeader.events->eventObjects[j].graphicsId, sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0]);
+ gSpecialVar_0x8005 = gMapHeader.events->eventObjects[j].localId;
gSpecialVar_0x8006 = sCurDecorMapX;
gSpecialVar_0x8007 = sCurDecorMapY;
show_sprite(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
@@ -1245,7 +1246,7 @@ void sub_8127F68(u8 taskId)
{
if (sub_8127F38() == TRUE)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8128060;
}
@@ -1290,7 +1291,7 @@ void sub_8128060(u8 taskId)
gTasks[taskId].data[2] = 2;
break;
case 2:
- if (sub_80ABDFC() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].data[12] = 0;
sub_8128FD8(taskId);
@@ -1301,12 +1302,12 @@ void sub_8128060(u8 taskId)
void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor)
{
- sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0;
- gUnknown_03005DD0.unk4 = gpu_pal_decompress_alloc_tag_and_upload(data, decor);
- gSprites[gUnknown_03005DD0.unk4].oam.priority = 1;
- gSprites[gUnknown_03005DD0.unk4].callback = sub_81292D0;
- gSprites[gUnknown_03005DD0.unk4].pos1.x = gUnknown_085A7250[data->decoration->shape].x;
- gSprites[gUnknown_03005DD0.unk4].pos1.y = gUnknown_085A7250[data->decoration->shape].y;
+ sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.spriteId].data[0];
+ gUnknown_03005DD0.spriteId = gpu_pal_decompress_alloc_tag_and_upload(data, decor);
+ gSprites[gUnknown_03005DD0.spriteId].oam.priority = 1;
+ gSprites[gUnknown_03005DD0.spriteId].callback = sub_81292D0;
+ gSprites[gUnknown_03005DD0.spriteId].pos1.x = gUnknown_085A7250[data->decoration->shape].x;
+ gSprites[gUnknown_03005DD0.spriteId].pos1.y = gUnknown_085A7250[data->decoration->shape].y;
}
void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphicsDataBuffer *data)
@@ -1320,15 +1321,15 @@ void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphic
}
if (gSaveBlock2Ptr->playerGender == MALE)
{
- sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, v0, 0x48, 0);
+ sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC1, SpriteCallbackDummy, v0, 0x48, 0);
}
else
{
- sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, v0, 0x48, 0);
+ sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC2, SpriteCallbackDummy, v0, 0x48, 0);
}
gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1;
DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]);
- sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4;
+ sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId;
}
void sub_812826C(u8 taskId)
@@ -1382,8 +1383,8 @@ void sub_812826C(u8 taskId)
void sub_81283BC(u8 taskId)
{
gTasks[taskId].data[10] = 0;
- gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1;
- gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 1;
+ gSprites[sDecor_CameraSpriteObjectIdx2].data[7] = 1;
sub_8128DE0();
sub_8128950(taskId);
}
@@ -1391,8 +1392,8 @@ void sub_81283BC(u8 taskId)
void sub_8128414(u8 taskId)
{
gTasks[taskId].data[10] = 0;
- gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1;
- gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 1;
+ gSprites[sDecor_CameraSpriteObjectIdx2].data[7] = 1;
sub_8128DE0();
StringExpandPlaceholders(gStringVar4, gText_CancelDecorating);
DisplayItemMessageOnField(taskId, gStringVar4, sub_8128B80);
@@ -1465,7 +1466,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration)
{
return FALSE;
}
- behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0);
+ behaviorAt = GetEventObjectIdByXYZ(curX, curY, 0);
if (behaviorAt != 0 && behaviorAt != 16)
{
return FALSE;
@@ -1490,7 +1491,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration)
{
return FALSE;
}
- if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16)
+ if (GetEventObjectIdByXYZ(curX, curY, 0) != 16)
{
return FALSE;
}
@@ -1510,7 +1511,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration)
{
return FALSE;
}
- behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0);
+ behaviorAt = GetEventObjectIdByXYZ(curX, curY, 0);
if (behaviorAt != 0 && behaviorAt != 16)
{
return FALSE;
@@ -1555,7 +1556,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration)
return FALSE;
}
}
- if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16)
+ if (GetEventObjectIdByXYZ(curX, curY, 0) != 16)
{
return FALSE;
}
@@ -1659,7 +1660,7 @@ void sub_8128BA0(u8 taskId)
void sub_8128BBC(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = c1_overworld_prev_quest;
}
@@ -1680,7 +1681,7 @@ void c1_overworld_prev_quest(u8 taskId)
sub_812A3C8();
FreeSpritePaletteByTag(OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG);
gFieldCallback = sub_8128CD4;
- SetMainCallback2(c2_exit_to_overworld_2_switch);
+ SetMainCallback2(CB2_ReturnToField);
DestroyTask(taskId);
break;
}
@@ -1706,7 +1707,7 @@ void sub_8128C64(u8 taskId)
data[2] ++;
break;
case 3:
- if (sub_80ABDFC() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].func = sub_812764C;
}
@@ -1735,7 +1736,7 @@ bool8 sub_8128D10(u8 taskId)
data[1] ++;
return FALSE;
}
- if (sDecorationLastDirectionMoved == DIR_NORTH && data[1] - 7 >= gMapHeader.mapData->height)
+ if (sDecorationLastDirectionMoved == DIR_NORTH && data[1] - 7 >= gMapHeader.mapLayout->height)
{
data[1] --;
return FALSE;
@@ -1745,7 +1746,7 @@ bool8 sub_8128D10(u8 taskId)
data[0] ++;
return FALSE;
}
- if (sDecorationLastDirectionMoved == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width)
+ if (sDecorationLastDirectionMoved == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapLayout->width)
{
data[0] --;
return FALSE;
@@ -1768,8 +1769,8 @@ bool8 sub_8128DB4(void)
void sub_8128DE0(void)
{
sDecorationLastDirectionMoved = 0;
- gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0;
- gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0;
}
void sub_8128E18(u8 taskId)
@@ -1777,7 +1778,7 @@ void sub_8128E18(u8 taskId)
s16 *data;
data = gTasks[taskId].data;
- if (!gSprites[sDecor_CameraSpriteObjectIdx1].data4)
+ if (!gSprites[sDecor_CameraSpriteObjectIdx1].data[4])
{
if (data[10] == 1)
{
@@ -1791,29 +1792,29 @@ void sub_8128E18(u8 taskId)
if ((gMain.heldKeys & 0x0F0) == DPAD_UP)
{
sDecorationLastDirectionMoved = DIR_SOUTH;
- gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0;
- gSprites[sDecor_CameraSpriteObjectIdx1].data3 = -2;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = -2;
data[1]--;
}
if ((gMain.heldKeys & 0x0F0) == DPAD_DOWN)
{
sDecorationLastDirectionMoved = DIR_NORTH;
- gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0;
- gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 2;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 2;
data[1]++;
}
if ((gMain.heldKeys & 0x0F0) == DPAD_LEFT)
{
sDecorationLastDirectionMoved = DIR_WEST;
- gSprites[sDecor_CameraSpriteObjectIdx1].data2 = -2;
- gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = -2;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0;
data[0]--;
}
if ((gMain.heldKeys & 0x0F0) == DPAD_RIGHT)
{
sDecorationLastDirectionMoved = DIR_EAST;
- gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 2;
- gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 2;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0;
data[0]++;
}
if (!sub_8128DB4() || !sub_8128D10(taskId))
@@ -1823,8 +1824,8 @@ void sub_8128E18(u8 taskId)
}
if (sDecorationLastDirectionMoved)
{
- gSprites[sDecor_CameraSpriteObjectIdx1].data4++;
- gSprites[sDecor_CameraSpriteObjectIdx1].data4 &= 7;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[4]++;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[4] &= 7;
}
if (!data[10])
{
@@ -1842,7 +1843,7 @@ void sub_8128E18(u8 taskId)
void sub_8128FD8(u8 taskId)
{
sub_8197434(0, 1);
- gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 0;
gTasks[taskId].data[10] = 0;
gTasks[taskId].func = sub_8128E18;
}
@@ -1953,20 +1954,20 @@ void SetDecorSelectionBoxOamAttributes(u8 decorShape)
void sub_81292D0(struct Sprite *sprite)
{
- sprite->data2 = 0;
- sprite->data3 = 0;
- sprite->data4 = 0;
- sprite->data5 = 0;
- sprite->data6 = 0;
- sprite->data7 = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
sprite->callback = sub_81292E8;
}
void sub_81292E8(struct Sprite *sprite)
{
- if (sprite->data7 == 0)
+ if (sprite->data[7] == 0)
{
- if (sprite->data6 < 15)
+ if (sprite->data[6] < 15)
{
sprite->invisible = FALSE;
}
@@ -1974,8 +1975,8 @@ void sub_81292E8(struct Sprite *sprite)
{
sprite->invisible = TRUE;
}
- sprite->data6 ++;
- sprite->data6 &= 0x1F;
+ sprite->data[6] ++;
+ sprite->data[6] &= 0x1F;
}
else
{
@@ -1989,7 +1990,7 @@ u8 gpu_pal_decompress_alloc_tag_and_upload(struct PlaceDecorationGraphicsDataBuf
data->decoration = &gDecorations[decor];
if (data->decoration->permission == DECORPERM_SOLID_MAT)
{
- return AddPseudoFieldObject(data->decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1);
+ return AddPseudoEventObject(data->decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1);
}
FreeSpritePaletteByTag(OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG);
sub_81291E8(data);
@@ -2011,9 +2012,9 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
{
return MAX_SPRITES;
}
- LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gUnknown_0203CEBC);
- CopyItemIconPicTo4x4Buffer(gUnknown_0203CEBC, gUnknown_0203CEC0);
- sheet.data = gUnknown_0203CEC0;
+ LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gItemIconDecompressionBuffer);
+ CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
+ sheet.data = gItemIcon4x4Buffer;
sheet.size = 0x200;
sheet.tag = tilesTag;
LoadSpriteSheet(&sheet);
@@ -2021,7 +2022,7 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
palette.tag = paletteTag;
LoadCompressedObjectPalette(&palette);
template = malloc(sizeof(struct SpriteTemplate));
- *template = gUnknown_08614FF4;
+ *template = gItemIconSpriteTemplate;
template->tileTag = tilesTag;
template->paletteTag = paletteTag;
spriteId = CreateSprite(template, 0, 0, 0);
@@ -2039,7 +2040,7 @@ const u8 *GetDecorationIconPicOrPalette(u16 decor, u8 mode)
return gUnknown_085A6BE8[decor][mode];
}
-u8 AddDecorationIconObjectFromFieldObject(u16 tilesTag, u16 paletteTag, u8 decor)
+u8 AddDecorationIconObjectFromEventObject(u16 tilesTag, u16 paletteTag, u8 decor)
{
u8 spriteId;
struct SpriteSheet sheet;
@@ -2070,7 +2071,7 @@ u8 AddDecorationIconObjectFromFieldObject(u16 tilesTag, u16 paletteTag, u8 decor
}
else
{
- spriteId = AddPseudoFieldObject(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1);
+ spriteId = AddPseudoEventObject(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1);
}
return spriteId;
}
@@ -2091,7 +2092,7 @@ u8 AddDecorationIconObject(u8 decor, s16 x, s16 y, u8 priority, u16 tilesTag, u1
}
else if (gUnknown_085A6BE8[decor][0] == NULL)
{
- spriteId = AddDecorationIconObjectFromFieldObject(tilesTag, paletteTag, decor);
+ spriteId = AddDecorationIconObjectFromEventObject(tilesTag, paletteTag, decor);
if (spriteId == MAX_SPRITES)
{
return MAX_SPRITES;
@@ -2140,11 +2141,11 @@ void sub_8129708(void)
{
gSpecialVar_0x8005 = sDecorRearrangementDataBuffer[gSpecialVar_0x8004].flagId;
sub_81296EC(sDecorRearrangementDataBuffer[gSpecialVar_0x8004].idx);
- for (i = 0; i < gMapHeader.events->mapObjectCount; i ++)
+ for (i = 0; i < gMapHeader.events->eventObjectCount; i ++)
{
- if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005)
+ if (gMapHeader.events->eventObjects[i].flagId == gSpecialVar_0x8005)
{
- gSpecialVar_0x8006 = gMapHeader.events->mapObjects[i].localId;
+ gSpecialVar_0x8006 = gMapHeader.events->eventObjects[i].localId;
break;
}
}
@@ -2155,11 +2156,11 @@ void sub_81297AC(void)
{
u8 i;
- for (i = 0; i < gMapHeader.events->mapObjectCount; i ++)
+ for (i = 0; i < gMapHeader.events->eventObjectCount; i ++)
{
- if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8004)
+ if (gMapHeader.events->eventObjects[i].flagId == gSpecialVar_0x8004)
{
- gSpecialVar_0x8005 = gMapHeader.events->mapObjects[i].localId;
+ gSpecialVar_0x8005 = gMapHeader.events->eventObjects[i].localId;
break;
}
}
@@ -2185,7 +2186,7 @@ void sub_81297F8(void)
{
for (x = 0; x < sDecorRearrangementDataBuffer[i].width; x ++)
{
- MapGridSetMetatileEntryAt(posX + 7 + x, posY + 7 - y, gMapHeader.mapData->map[posX + x + gMapHeader.mapData->width * (posY - y)] | 0x3000);
+ MapGridSetMetatileEntryAt(posX + 7 + x, posY + 7 - y, gMapHeader.mapLayout->map[posX + x + gMapHeader.mapLayout->width * (posY - y)] | 0x3000);
}
}
sub_81296EC(sDecorRearrangementDataBuffer[i].idx);
@@ -2216,7 +2217,7 @@ void sub_81298EC(u8 taskId)
gTasks[taskId].data[2] = 3;
break;
case 3:
- if (sub_80ABDFC() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
StringExpandPlaceholders(gStringVar4, gText_DecorationReturnedToPC);
DisplayItemMessageOnField(taskId, gStringVar4, sub_8129D64);
@@ -2246,21 +2247,21 @@ bool8 sub_81299AC(u8 taskId)
void SetUpPuttingAwayDecorationPlayerAvatar(void)
{
- player_get_direction_lower_nybble();
- sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0;
+ GetPlayerFacingDirection();
+ sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.spriteId].data[0];
sub_812A39C();
- gUnknown_03005DD0.unk4 = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0);
+ gUnknown_03005DD0.spriteId = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0);
if (gSaveBlock2Ptr->playerGender == MALE)
{
- sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0);
+ sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0);
}
else
{
- sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, 0x88, 0x48, 0);
+ sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC2, SpriteCallbackDummy, 0x88, 0x48, 0);
}
gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1;
DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]);
- sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4;
+ sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId;
gSprites[sDecor_CameraSpriteObjectIdx1].oam.priority = 1;
}
@@ -2286,7 +2287,7 @@ void sub_8129ABC(u8 taskId)
data[2] = 2;
break;
case 2:
- if (sub_80ABDFC() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
data[12] = 1;
sub_8129B34(taskId);
@@ -2298,7 +2299,7 @@ void sub_8129ABC(u8 taskId)
void sub_8129B34(u8 taskId)
{
sub_8197434(0, 1);
- gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0;
+ gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].invisible = FALSE;
gSprites[sDecor_CameraSpriteObjectIdx1].callback = sub_812A36C;
gSprites[sDecor_CameraSpriteObjectIdx2].pos1.x = 0x88;
@@ -2450,9 +2451,9 @@ void sub_8129F20(void)
yOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].idx] & 0x0F;
for (i = 0; i < 0x40; i ++)
{
- if (gSaveBlock1Ptr->mapObjectTemplates[i].x == xOff && gSaveBlock1Ptr->mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1Ptr->mapObjectTemplates[i].flagId))
+ if (gSaveBlock1Ptr->eventObjectTemplates[i].x == xOff && gSaveBlock1Ptr->eventObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1Ptr->eventObjectTemplates[i].flagId))
{
- sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].flagId = gSaveBlock1Ptr->mapObjectTemplates[i].flagId;
+ sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].flagId = gSaveBlock1Ptr->eventObjectTemplates[i].flagId;
break;
}
}
@@ -2503,30 +2504,27 @@ void sub_812A040(u8 left, u8 top, u8 right, u8 bottom)
}
}
-#ifdef NONMATCHING
void sub_812A0E8(u8 taskId)
{
u8 i;
u8 xOff;
u8 yOff;
- u8 decor;
- register u8 decor asm("r1");
- struct DecorRearrangementDataBuffer *data;
+ u8 var1;
+ u32 var2;
sCurDecorSelectedInRearrangement = 0;
if (sub_8129FC8(taskId) != TRUE)
{
- for (i = 0; i < gUnknown_0203A17C.size; i ++)
+ for (i = 0; i < gUnknown_0203A17C.size; i++)
{
- decor = gUnknown_0203A17C.items[i];
- if (decor != DECOR_NONE)
+ var1 = gUnknown_0203A17C.items[i];
+ if (var1 != DECOR_NONE)
{
- data = &sDecorRearrangementDataBuffer[0];
- sub_8129D8C(decor, data);
- if (sub_8129E74(taskId, i, data) == TRUE)
+ sub_8129D8C(var1, &sDecorRearrangementDataBuffer[0]);
+ if (sub_8129E74(taskId, i, &sDecorRearrangementDataBuffer[0]) == TRUE)
{
- data->idx = i;
- sCurDecorSelectedInRearrangement ++;
+ sDecorRearrangementDataBuffer[0].idx = i;
+ sCurDecorSelectedInRearrangement++;
break;
}
}
@@ -2535,95 +2533,13 @@ void sub_812A0E8(u8 taskId)
{
xOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[0].idx] >> 4;
yOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[0].idx] & 0x0F;
- sub_812A040(xOff, yOff - sDecorRearrangementDataBuffer[0].height + 1, xOff + sDecorRearrangementDataBuffer[0].width - 1, yOff); // Arithmetic register swap at the r2 argument: `add r2, r0, r2` instead of `add r2, r2, r0`
+ var1 = yOff - sDecorRearrangementDataBuffer[0].height + 1;
+ var2 = sDecorRearrangementDataBuffer[0].width + xOff - 1;
+
+ sub_812A040(xOff, var1, var2, yOff);
}
}
}
-#else
-__attribute__((naked)) void sub_812A0E8(u8 taskId)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tlsls r0, 24\n"
- "\tlsrs r6, r0, 24\n"
- "\tldr r4, =sCurDecorSelectedInRearrangement\n"
- "\tmovs r0, 0\n"
- "\tstrb r0, [r4]\n"
- "\tadds r0, r6, 0\n"
- "\tbl sub_8129FC8\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r0, 0x1\n"
- "\tbeq _0812A18C\n"
- "\tmovs r5, 0\n"
- "\tldr r0, =gUnknown_0203A17C\n"
- "\tldrb r1, [r0, 0x8]\n"
- "\tcmp r5, r1\n"
- "\tbcs _0812A15A\n"
- "\tadds r7, r4, 0\n"
- "_0812A10E:\n"
- "\tldr r0, [r0]\n"
- "\tadds r0, r5\n"
- "\tldrb r1, [r0]\n"
- "\tcmp r1, 0\n"
- "\tbeq _0812A14C\n"
- "\tldr r4, =sDecorRearrangementDataBuffer\n"
- "\tadds r0, r1, 0\n"
- "\tadds r1, r4, 0\n"
- "\tbl sub_8129D8C\n"
- "\tadds r0, r6, 0\n"
- "\tadds r1, r5, 0\n"
- "\tadds r2, r4, 0\n"
- "\tbl sub_8129E74\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r0, 0x1\n"
- "\tbne _0812A14C\n"
- "\tstrb r5, [r4]\n"
- "\tldrb r0, [r7]\n"
- "\tadds r0, 0x1\n"
- "\tstrb r0, [r7]\n"
- "\tb _0812A15A\n"
- "\t.pool\n"
- "_0812A14C:\n"
- "\tadds r0, r5, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r5, r0, 24\n"
- "\tldr r0, =gUnknown_0203A17C\n"
- "\tldrb r1, [r0, 0x8]\n"
- "\tcmp r5, r1\n"
- "\tbcc _0812A10E\n"
- "_0812A15A:\n"
- "\tldr r0, =sCurDecorSelectedInRearrangement\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0\n"
- "\tbeq _0812A18C\n"
- "\tldr r0, =gUnknown_0203A17C\n"
- "\tldr r2, =sDecorRearrangementDataBuffer\n"
- "\tldrb r1, [r2]\n"
- "\tldr r0, [r0, 0x4]\n"
- "\tadds r0, r1\n"
- "\tldrb r1, [r0]\n"
- "\tlsrs r0, r1, 4\n"
- "\tmovs r3, 0xF\n"
- "\tands r3, r1\n"
- "\tldrb r1, [r2, 0x2]\n"
- "\tsubs r1, r3, r1\n"
- "\tadds r1, 0x1\n"
- "\tlsls r1, 24\n"
- "\tlsrs r1, 24\n"
- "\tldrb r2, [r2, 0x1]\n"
- "\tadds r2, r0\n"
- "\tsubs r2, 0x1\n"
- "\tlsls r2, 24\n"
- "\tlsrs r2, 24\n"
- "\tbl sub_812A040\n"
- "_0812A18C:\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.pool");
-}
-#endif
void sub_812A1A0(u8 taskId)
{
@@ -2633,7 +2549,7 @@ void sub_812A1A0(u8 taskId)
void sub_812A1C0(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_81298EC;
}
@@ -2652,7 +2568,7 @@ void sub_812A210(u8 taskId)
void sub_812A22C(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_812A25C;
}
@@ -2671,7 +2587,7 @@ void sub_812A25C(u8 taskId)
case 1:
sub_812A3C8();
gFieldCallback = sub_812A334;
- SetMainCallback2(c2_exit_to_overworld_2_switch);
+ SetMainCallback2(CB2_ReturnToField);
DestroyTask(taskId);
break;
}
@@ -2697,7 +2613,7 @@ void sub_812A2C4(u8 taskId)
data[2] ++;
break;
case 3:
- if (sub_80ABDFC() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].func = sub_8126B80;
}
@@ -2710,7 +2626,7 @@ void sub_812A334(void)
u8 taskId;
pal_fill_black();
- sub_81973C4(0, 1);
+ NewMenuHelpers_DrawDialogueFrame(0, 1);
sub_8126ABC();
taskId = CreateTask(sub_812A2C4, 8);
gTasks[taskId].data[2] = 0;
@@ -2718,9 +2634,9 @@ void sub_812A334(void)
void sub_812A36C(struct Sprite *sprite)
{
- sprite->data0 ++;
- sprite->data0 &= 0x1F;
- if (sprite->data0 > 15)
+ sprite->data[0] ++;
+ sprite->data[0] &= 0x1F;
+ if (sprite->data[0] > 15)
{
sprite->invisible = TRUE;
}
diff --git a/src/decoration_inventory.c b/src/decoration_inventory.c
index 03ab6c00c..308320206 100644
--- a/src/decoration_inventory.c
+++ b/src/decoration_inventory.c
@@ -1,6 +1,7 @@
// Includes
#include "global.h"
+#include "constants/decorations.h"
#include "decoration.h"
#include "decoration_inventory.h"
diff --git a/src/dewford_trend.c b/src/dewford_trend.c
new file mode 100644
index 000000000..44b42c123
--- /dev/null
+++ b/src/dewford_trend.c
@@ -0,0 +1,340 @@
+#include "global.h"
+#include "dewford_trend.h"
+#include "easy_chat.h"
+#include "constants/easy_chat.h"
+#include "event_data.h"
+#include "link.h"
+#include "malloc.h"
+#include "random.h"
+#include "text.h"
+#include "tv.h"
+
+// static functions
+static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c);
+static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c);
+static void sub_8122B28(struct EasyChatPair *s);
+static bool8 SB1ContainsWords(u16 *a);
+static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2);
+static s16 GetEqualEasyChatPairIndex(struct EasyChatPair *s, struct EasyChatPair *a, u16 b);
+
+// text
+void InitDewfordTrend(void)
+{
+ u16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ gSaveBlock1Ptr->easyChatPairs[i].words[0] = sub_811EE38(EC_GROUP_CONDITIONS);
+
+ if (Random() & 1)
+ gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_LIFESTYLE);
+ else
+ gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_HOBBIES);
+
+ gSaveBlock1Ptr->easyChatPairs[i].unk1_6 = Random() & 1;
+ sub_8122B28(&(gSaveBlock1Ptr->easyChatPairs[i]));
+ }
+ sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0);
+}
+
+void UpdateDewfordTrendPerDay(u16 a)
+{
+ u16 i;
+
+ if (a != 0)
+ {
+ u32 sp0 = a * 5;
+
+ for (i = 0; i < 5; i++)
+ {
+ u32 r4;
+ u32 r2 = sp0;
+ struct EasyChatPair *r5 = &(gSaveBlock1Ptr->easyChatPairs[i]);
+
+ if (r5->unk1_6 == 0)
+ {
+ if (r5->unk0_0 >= (u16)r2)
+ {
+ r5->unk0_0 -= r2;
+ if (r5->unk0_0 == 0)
+ r5->unk1_6 = 1;
+ continue;
+ }
+ r2 -= r5->unk0_0;
+ r5->unk0_0 = 0;
+ r5->unk1_6 = 1;
+ }
+ r4 = r5->unk0_0 + r2;
+ if ((u16)r4 > r5->unk0_7)
+ {
+ u32 sp4 = r4 % r5->unk0_7;
+ r4 = r4 / r5->unk0_7;
+
+ r5->unk1_6 = r4 ^ 1;
+ if (r5->unk1_6)
+ r5->unk0_0 = sp4;
+ else
+ r5->unk0_0 = r5->unk0_7 - sp4;
+ }
+ else
+ {
+ r5->unk0_0 = r4;
+
+ if (r5->unk0_0 == r5->unk0_7)
+ r5->unk1_6 = 0;
+ }
+ }
+ sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0);
+ }
+}
+
+
+bool8 sub_81226D8(u16 *a)
+{
+ struct EasyChatPair s = {0};
+ u16 i;
+
+ if (!SB1ContainsWords(a))
+ {
+ if (!FlagGet(FLAG_SYS_POPWORD_INPUT))
+ {
+ FlagSet(FLAG_SYS_POPWORD_INPUT);
+ if (!FlagGet(FLAG_SYS_MIX_RECORD))
+ {
+ gSaveBlock1Ptr->easyChatPairs[0].words[0] = a[0];
+ gSaveBlock1Ptr->easyChatPairs[0].words[1] = a[1];
+ return TRUE;
+ }
+ }
+
+ s.words[0] = a[0];
+ s.words[1] = a[1];
+ s.unk1_6 = 1;
+ sub_8122B28(&s);
+
+ for (i = 0; i < 5; i++)
+ {
+ if (sub_8122A58(&s, &(gSaveBlock1Ptr->easyChatPairs[i]), 0))
+ {
+ u16 r3 = 4;
+
+ while (r3 > i)
+ {
+ gSaveBlock1Ptr->easyChatPairs[r3] = gSaveBlock1Ptr->easyChatPairs[r3 - 1];
+ r3--;
+ }
+ gSaveBlock1Ptr->easyChatPairs[i] = s;
+ if(i == 4)
+ sub_80EDC60(a);
+ return (i == 0);
+ }
+ }
+ gSaveBlock1Ptr->easyChatPairs[4] = s;
+ sub_80EDC60(a);
+ }
+ return FALSE;
+}
+
+
+static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c)
+{
+ u16 h;
+
+ for (h = 0; h < b; h++)
+ {
+ u16 i;
+
+ for (i = h + 1; i < b; i++)
+ {
+ if (sub_8122A58(&s[i], &s[h], c))
+ {
+ struct EasyChatPair temp;
+
+ temp = s[i];
+ s[i] = s[h];
+ s[h] = temp;
+ }
+ }
+ }
+}
+
+void ReceiveEasyChatPairsData(void *a, u32 b, u8 unused)
+{
+ u16 i, j, r3, players;
+ struct EasyChatPair *buffer1, *buffer2, *src, *dst, *foo_of_buffer2;
+
+ buffer1 = Alloc(0x100);
+ if(buffer1 != NULL)
+ {
+ buffer2 = Alloc(0x100);
+ if(buffer2 == NULL)
+ {
+ Free(buffer1);
+ }
+ else
+ {
+ players = GetLinkPlayerCount();
+ for (i = 0; i < players; i++)
+ memcpy(&(buffer1[i * 5]), (u8 *)a + i * b, 40);
+ src = buffer1;
+ dst = buffer2;
+ r3 = 0;
+ for (i = 0; i < players; i++)
+ {
+ for (j = 0; j < 5; j++)
+ {
+ s16 foo = GetEqualEasyChatPairIndex(buffer2, src, r3);
+ if (foo < 0)
+ {
+ *(dst++) = *src;
+ r3++;
+ }
+ else
+ {
+ foo_of_buffer2 = (struct EasyChatPair *)((u32)buffer2 + (foo * 8)); //required to do this to reverse the order of register operands in add ASM statement
+ if (foo_of_buffer2->unk0_0 < src->unk0_0)
+ {
+ *foo_of_buffer2 = *src;
+ }
+ }
+ src++;
+ }
+ }
+ sub_8122804(buffer2, r3, 2);
+ src = buffer2;
+ dst = gSaveBlock1Ptr->easyChatPairs;
+ for (i = 0; i < 5; i++)
+ *(dst++) = *(src++);
+ Free(buffer1);
+ Free(buffer2);
+ }
+ }
+}
+
+void BufferTrendyPhraseString(void)
+{
+ struct EasyChatPair *s = &gSaveBlock1Ptr->easyChatPairs[gSpecialVar_0x8004];
+
+ ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1);
+}
+
+void TrendyPhraseIsOld(void)
+{
+ u16 result = 0;
+
+ if (gSaveBlock1Ptr->easyChatPairs[0].unk0_0 - gSaveBlock1Ptr->easyChatPairs[1].unk0_0 < 2)
+ {
+ asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2
+ if (!gSaveBlock1Ptr->easyChatPairs[0].unk1_6 && gSaveBlock1Ptr->easyChatPairs[1].unk1_6)
+ result = 1;
+ }
+ gSpecialVar_Result = result;
+}
+
+void GetDewfordHallPaintingNameIndex(void)
+{
+ gSpecialVar_Result = (gSaveBlock1Ptr->easyChatPairs[0].words[0] + gSaveBlock1Ptr->easyChatPairs[0].words[1]) & 7;
+}
+
+static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c)
+{
+ switch (c)
+ {
+ case 0:
+ if (a->unk0_0 > b->unk0_0)
+ return 1;
+ if (a->unk0_0 < b->unk0_0)
+ return 0;
+ if (a->unk0_7 > b->unk0_7)
+ return 1;
+ if (a->unk0_7 < b->unk0_7)
+ return 0;
+ break;
+ case 1:
+ if (a->unk0_7 > b->unk0_7)
+ return 1;
+ if (a->unk0_7 < b->unk0_7)
+ return 0;
+ if (a->unk0_0 > b->unk0_0)
+ return 1;
+ if (a->unk0_0 < b->unk0_0)
+ return 0;
+ break;
+ case 2:
+ if (a->unk0_0 > b->unk0_0)
+ return 1;
+ if (a->unk0_0 < b->unk0_0)
+ return 0;
+ if (a->unk0_7 > b->unk0_7)
+ return 1;
+ if (a->unk0_7 < b->unk0_7)
+ return 0;
+ if (a->unk2 > b->unk2)
+ return 1;
+ if (a->unk2 < b->unk2)
+ return 0;
+ if (a->words[0] > b->words[0])
+ return 1;
+ if (a->words[0] < b->words[0])
+ return 0;
+ if (a->words[1] > b->words[1])
+ return 1;
+ if (a->words[1] < b->words[1])
+ return 0;
+ return 1;
+ }
+ return Random() & 1;
+}
+
+static void sub_8122B28(struct EasyChatPair *s)
+{
+ u16 r4;
+
+ r4 = Random() % 98;
+ if (r4 > 50)
+ {
+ r4 = Random() % 98;
+ if (r4 > 80)
+ r4 = Random() % 98;
+ }
+ s->unk0_7 = r4 + 30;
+ s->unk0_0 = (Random() % (r4 + 1)) + 30;
+ s->unk2 = Random();
+}
+
+static bool8 SB1ContainsWords(u16 *a)
+{
+ u16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (IsEasyChatPairEqual(a, gSaveBlock1Ptr->easyChatPairs[i].words) != 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (*(words1++) != *(words2++))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static s16 GetEqualEasyChatPairIndex(struct EasyChatPair*s, struct EasyChatPair *a, u16 b)
+{
+ s16 i;
+
+ for (i = 0; i < b; i++)
+ {
+ if (IsEasyChatPairEqual(a->words, s->words))
+ return i;
+ s++;
+ }
+ return -1;
+}
diff --git a/src/diploma.c b/src/diploma.c
index d4a269757..599ceec72 100755..100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -3,7 +3,7 @@
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "task.h"
#include "malloc.h"
#include "decompress.h"
@@ -17,7 +17,7 @@ extern int decompress_and_copy_tile_data_to_vram(u8 bg_id, void *src, int size,
extern bool8 free_temp_tile_data_buffers_if_possible(void);
extern void sub_80861E8(void); // rom4
extern bool16 sub_80C0944(void);
-extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, u8 *str);
+extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 *color, s8 speed, u8 *str);
extern u16 gUnknown_0860F074[];
@@ -72,7 +72,7 @@ void CB2_ShowDiploma(void)
DmaFill16(3, 0, VRAM, VRAM_SIZE);
DmaFill32(3, 0, OAM, OAM_SIZE);
DmaFill16(3, 0, PLTT, PLTT_SIZE);
- remove_some_task();
+ ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
@@ -89,7 +89,7 @@ void CB2_ShowDiploma(void)
CopyBgTilemapBufferToVram(1);
DisplayDiplomaText();
BlendPalettes(-1, 16, 0);
- BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
EnableInterrupts(1);
SetVBlankCallback(VBlankCB);
SetMainCallback2(MainCB2);
@@ -114,7 +114,7 @@ static void Task_DiplomaWaitForKeyPress(u8 taskId)
{
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
- BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
gTasks[taskId].func = Task_DiplomaFadeOut;
}
}
@@ -208,12 +208,7 @@ static void InitDiplomaWindow(void)
static void PrintDiplomaText(u8 *text, u8 var1, u8 var2)
{
- struct TextColor color =
- {
- .fgColor = 0,
- .bgColor = 2,
- .shadowColor = 3,
- };
+ u8 color[3] = {0, 2, 3};
- AddTextPrinterParametrized2(0, 1, var1, var2, 0, 0, &color, -1, text);
+ AddTextPrinterParameterized2(0, 1, var1, var2, 0, 0, color, -1, text);
}
diff --git a/src/dma3_manager.c b/src/dma3_manager.c
index bb015c5cf..28df9d932 100644
--- a/src/dma3_manager.c
+++ b/src/dma3_manager.c
@@ -1,13 +1,24 @@
#include "global.h"
#include "dma3.h"
-IWRAM_DATA struct {
- /* 0x00 */ const u8 *src;
- /* 0x04 */ u8 *dest;
- /* 0x08 */ u16 size;
- /* 0x0A */ u16 mode;
- /* 0x0C */ u32 value;
-} gDma3Requests[128];
+// Maximum amount of data we will transfer in one operation
+#define MAX_DMA_BLOCK_SIZE 0x1000
+
+#define MAX_DMA_REQUESTS 128
+
+#define DMA_REQUEST_COPY32 1
+#define DMA_REQUEST_FILL32 2
+#define DMA_REQUEST_COPY16 3
+#define DMA_REQUEST_FILL16 4
+
+IWRAM_DATA struct
+{
+ const u8 *src;
+ u8 *dest;
+ u16 size;
+ u16 mode;
+ u32 value;
+} gDma3Requests[MAX_DMA_REQUESTS];
static bool8 gDma3ManagerLocked;
static u8 gDma3RequestCursor;
@@ -19,88 +30,103 @@ void ClearDma3Requests(void)
gDma3ManagerLocked = TRUE;
gDma3RequestCursor = 0;
- for(i = 0; i < (u8)ARRAY_COUNT(gDma3Requests); i++)
+ for (i = 0; i < MAX_DMA_REQUESTS; i++)
{
gDma3Requests[i].size = 0;
- gDma3Requests[i].src = 0;
- gDma3Requests[i].dest = 0;
+ gDma3Requests[i].src = NULL;
+ gDma3Requests[i].dest = NULL;
}
gDma3ManagerLocked = FALSE;
}
-#ifdef NONMATCHING
+#define Dma3CopyLarge_(src, dest, size, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaCopy##bit(3, _src, _dest, _size); \
+ break; \
+ } \
+ DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
+ _src += MAX_DMA_BLOCK_SIZE; \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
+#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
+
+#define Dma3FillLarge_(value, dest, size, bit) \
+{ \
+ void *_dest = dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaFill##bit(3, value, _dest, _size); \
+ break; \
+ } \
+ DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
+#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
+
+
void ProcessDma3Requests(void)
{
- // NOTE: the fillerA member of the DMA struct is actually u32 value;
- u16 total_size;
+ u16 bytesTransferred;
if (gDma3ManagerLocked)
return;
- total_size = 0;
+ bytesTransferred = 0;
// as long as there are DMA requests to process (unless size or vblank is an issue), do not exit
- while (gDma3Requests[gDma3RequestCursor].size)
+ while (gDma3Requests[gDma3RequestCursor].size != 0)
{
- total_size += gDma3Requests[gDma3RequestCursor].size;
+ bytesTransferred += gDma3Requests[gDma3RequestCursor].size;
- if (total_size > 0xA000)
- return; // don't do too much at once
-
- if (REG_VCOUNT > 224)
- return;// we're about to leave vblank, stop
+ if (bytesTransferred > 40 * 1024)
+ return; // don't transfer more than 40 KiB
+ if (*(u8 *)REG_ADDR_VCOUNT > 224)
+ return; // we're about to leave vblank, stop
switch (gDma3Requests[gDma3RequestCursor].mode)
{
- case 1: // regular 32-bit copy
- // _08000C8C
- if(gDma3Requests[gDma3RequestCursor].size <= 0x1000)
- {
- DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
- break;
- }
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].src += 0x1000;
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_COPY32: // regular 32-bit copy
+ Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
- case 2: // repeat a single 32-bit value across RAM
- // _08000CD0
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM
+ Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
- case 3: // regular 16-bit copy
- // _08000D3C
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].src += 0x1000;
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_COPY16: // regular 16-bit copy
+ Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
- case 4: // repeat a single 16-bit value across RAM
- // _08000D88
- while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
- {
- DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
- gDma3Requests[gDma3RequestCursor].dest += 0x1000;
- gDma3Requests[gDma3RequestCursor].size -= 0x1000;
- }
- DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
+ case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM
+ Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value,
+ gDma3Requests[gDma3RequestCursor].dest,
+ gDma3Requests[gDma3RequestCursor].size);
break;
}
+
+ // Free the request
gDma3Requests[gDma3RequestCursor].src = NULL;
gDma3Requests[gDma3RequestCursor].dest = NULL;
gDma3Requests[gDma3RequestCursor].size = 0;
@@ -108,375 +134,54 @@ void ProcessDma3Requests(void)
gDma3Requests[gDma3RequestCursor].value = 0;
gDma3RequestCursor++;
- if (gDma3RequestCursor >= 128) // loop back to the first DMA request
+ if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request
gDma3RequestCursor = 0;
}
}
-#else
-__attribute__((naked))
-void ProcessDma3Requests(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0xC\n\
- ldr r0, =gDma3ManagerLocked\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _08000C06\n\
- b _08000E46\n\
-_08000C06:\n\
- movs r0, 0\n\
- str r0, [sp, 0x8]\n\
- ldr r1, =gDma3Requests\n\
- ldr r2, =gDma3RequestCursor\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- ldrh r0, [r0, 0x8]\n\
- mov r12, r2\n\
- cmp r0, 0\n\
- bne _08000C1E\n\
- b _08000E46\n\
-_08000C1E:\n\
- mov r8, r1\n\
- adds r1, 0x4\n\
- mov r10, r1\n\
- movs r6, 0x80\n\
- lsls r6, 5\n\
- ldr r7, =0x040000D4 @REG_DMA3\n\
- movs r2, 0\n\
- mov r9, r2\n\
-_08000C2E:\n\
- mov r3, r12 @ gDma3RequestCursor\n\
- ldrb r0, [r3]\n\
- lsls r5, r0, 4\n\
- mov r0, r8 @ gDma3Requests\n\
- adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]\n\
- ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size\n\
- ldr r2, [sp, 0x8]\n\
- adds r0, r2, r0\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x8]\n\
- movs r0, 0xA0\n\
- lsls r0, 8\n\
- ldr r3, [sp, 0x8]\n\
- cmp r3, r0\n\
- bls _08000C50\n\
- b _08000E46\n\
-_08000C50:\n\
- ldr r0, =0x04000006 @REG_VCOUNT\n\
- ldrb r0, [r0]\n\
- cmp r0, 0xE0\n\
- bls _08000C5A\n\
- b _08000E46\n\
-_08000C5A:\n\
- ldrh r0, [r1, 0xA]\n\
- cmp r0, 0x2\n\
- beq _08000CD0\n\
- cmp r0, 0x2\n\
- bgt _08000C80\n\
- cmp r0, 0x1\n\
- beq _08000C8C\n\
- b _08000DF0\n\
- .pool\n\
-_08000C80:\n\
- cmp r0, 0x3\n\
- beq _08000D3C\n\
- cmp r0, 0x4\n\
- bne _08000C8A\n\
- b _08000D88\n\
-_08000C8A:\n\
- b _08000DF0\n\
-_08000C8C:\n\
- ldr r3, [r1]\n\
- mov r2, r10\n\
- adds r0, r5, r2\n\
- ldr r2, [r0]\n\
- ldrh r1, [r1, 0x8]\n\
- cmp r1, r6\n\
- bhi _08000CA6\n\
- str r3, [r7]\n\
- str r2, [r7, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x84\n\
- lsls r1, 24\n\
- b _08000DAA\n\
-_08000CA6:\n\
- ldr r4, =0x040000D4 @REG_DMA3\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- ldr r0, =0x84000400\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- adds r3, r6\n\
- adds r2, r6\n\
- subs r1, r6\n\
- cmp r1, r6\n\
- bhi _08000CA6\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x84\n\
- lsls r1, 24\n\
- b _08000D76\n\
- .pool\n\
-_08000CD0:\n\
- mov r3, r10\n\
- adds r0, r5, r3\n\
- ldr r4, [r0]\n\
- ldrh r1, [r1, 0x8]\n\
- cmp r1, r6\n\
- bhi _08000CF4\n\
- mov r0, r8\n\
- adds r0, 0xC\n\
- adds r0, r5, r0\n\
- ldr r0, [r0]\n\
- str r0, [sp]\n\
- mov r5, sp\n\
- str r5, [r7]\n\
- str r4, [r7, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x85\n\
- lsls r1, 24\n\
- b _08000DAA\n\
-_08000CF4:\n\
- mov r2, r12\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- mov r5, r8\n\
- adds r5, 0xC\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- str r0, [sp]\n\
- ldr r3, =0x040000D4 @REG_DMA3\n\
- mov r0, sp\n\
- str r0, [r3]\n\
- str r4, [r3, 0x4]\n\
- ldr r0, =0x85000400\n\
- str r0, [r3, 0x8]\n\
- ldr r0, [r3, 0x8]\n\
- adds r4, r6\n\
- subs r1, r6\n\
- cmp r1, r6\n\
- bhi _08000CF4\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- str r0, [sp]\n\
- mov r2, sp\n\
- str r2, [r3]\n\
- str r4, [r3, 0x4]\n\
- lsrs r0, r1, 2\n\
- movs r1, 0x85\n\
- lsls r1, 24\n\
- b _08000DEA\n\
- .pool\n\
-_08000D3C:\n\
- ldr r3, [r1]\n\
- mov r2, r10\n\
- adds r0, r5, r2\n\
- ldr r2, [r0]\n\
- ldrh r1, [r1, 0x8]\n\
- cmp r1, r6\n\
- bhi _08000D56\n\
- str r3, [r7]\n\
- str r2, [r7, 0x4]\n\
- lsrs r0, r1, 1\n\
- movs r1, 0x80\n\
- lsls r1, 24\n\
- b _08000DAA\n\
-_08000D56:\n\
- ldr r4, =0x040000D4 @REG_DMA3\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- ldr r0, =0x80000800\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- adds r3, r6\n\
- adds r2, r6\n\
- subs r1, r6\n\
- cmp r1, r6\n\
- bhi _08000D56\n\
- str r3, [r4]\n\
- str r2, [r4, 0x4]\n\
- lsrs r0, r1, 1\n\
- movs r1, 0x80\n\
- lsls r1, 24\n\
-_08000D76:\n\
- orrs r0, r1\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- b _08000DF0\n\
- .pool\n\
-_08000D88:\n\
- mov r3, r10\n\
- adds r0, r5, r3\n\
- ldr r2, [r0]\n\
- ldrh r4, [r1, 0x8]\n\
- add r1, sp, 0x4\n\
- cmp r4, r6\n\
- bhi _08000DB2\n\
- mov r0, r8\n\
- adds r0, 0xC\n\
- adds r0, r5, r0\n\
- ldr r0, [r0]\n\
- strh r0, [r1]\n\
- str r1, [r7]\n\
- str r2, [r7, 0x4]\n\
- lsrs r0, r4, 1\n\
- movs r1, 0x81\n\
- lsls r1, 24\n\
-_08000DAA:\n\
- orrs r0, r1\n\
- str r0, [r7, 0x8]\n\
- ldr r0, [r7, 0x8]\n\
- b _08000DF0\n\
-_08000DB2:\n\
- mov r5, r12\n\
- ldrb r0, [r5]\n\
- lsls r0, 4\n\
- ldr r3, =gDma3Requests + 0x0C\n\
- adds r0, r3\n\
- ldr r0, [r0]\n\
- strh r0, [r1]\n\
- ldr r3, =0x040000D4 @REG_DMA3\n\
- str r1, [r3]\n\
- str r2, [r3, 0x4]\n\
- ldr r0, =0x81000800\n\
- str r0, [r3, 0x8]\n\
- ldr r0, [r3, 0x8]\n\
- adds r2, r6\n\
- subs r4, r6\n\
- cmp r4, r6\n\
- bhi _08000DB2\n\
- ldrb r0, [r5]\n\
- lsls r0, 4\n\
- ldr r5, =gDma3Requests + 0x0C\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- strh r0, [r1]\n\
- str r1, [r3]\n\
- str r2, [r3, 0x4]\n\
- lsrs r0, r4, 1\n\
- movs r1, 0x81\n\
- lsls r1, 24\n\
-_08000DEA:\n\
- orrs r0, r1\n\
- str r0, [r3, 0x8]\n\
- ldr r0, [r3, 0x8]\n\
-_08000DF0:\n\
- ldr r1, =gDma3Requests\n\
- mov r3, r12\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- mov r2, r9\n\
- str r2, [r0]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- add r0, r10\n\
- str r2, [r0]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- movs r4, 0\n\
- strh r2, [r0, 0x8]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- mov r5, r9\n\
- strh r5, [r0, 0xA]\n\
- ldrb r0, [r3]\n\
- lsls r0, 4\n\
- adds r1, 0xC\n\
- adds r0, r1\n\
- mov r1, r9\n\
- str r1, [r0]\n\
- ldrb r0, [r3]\n\
- adds r0, 0x1\n\
- strb r0, [r3]\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bge _08000E34\n\
- strb r4, [r3]\n\
-_08000E34:\n\
- mov r2, r12\n\
- ldrb r0, [r2]\n\
- lsls r0, 4\n\
- ldr r3, =gDma3Requests\n\
- adds r0, r3\n\
- ldrh r0, [r0, 0x8]\n\
- cmp r0, 0\n\
- beq _08000E46\n\
- b _08000C2E\n\
-_08000E46:\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\
- .pool\n\
- .syntax divided");
-}
-#endif
-int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
+s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
{
int cursor;
- int var = 0;
-
- gDma3ManagerLocked = 1;
+ int i = 0;
+ gDma3ManagerLocked = TRUE;
cursor = gDma3RequestCursor;
- while(1)
+
+ while (i < MAX_DMA_REQUESTS)
{
- if(!gDma3Requests[cursor].size) // an empty copy was found and the current cursor will be returned.
+ if (gDma3Requests[cursor].size == 0) // an empty request was found.
{
gDma3Requests[cursor].src = src;
gDma3Requests[cursor].dest = dest;
gDma3Requests[cursor].size = size;
- if(mode == 1)
- gDma3Requests[cursor].mode = mode;
+ if (mode == 1)
+ gDma3Requests[cursor].mode = DMA_REQUEST_COPY32;
else
- gDma3Requests[cursor].mode = 3;
+ gDma3Requests[cursor].mode = DMA_REQUEST_COPY16;
gDma3ManagerLocked = FALSE;
- return (s16)cursor;
+ return cursor;
}
- if(++cursor >= 0x80) // loop back to start.
- {
+ if (++cursor >= MAX_DMA_REQUESTS) // loop back to start.
cursor = 0;
- }
- if(++var >= 0x80) // max checks were made. all resulted in failure.
- {
- break;
- }
+ i++;
}
gDma3ManagerLocked = FALSE;
- return -1;
+ return -1; // no free DMA request was found
}
-int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
+s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
{
int cursor;
- int var = 0;
+ int i = 0;
cursor = gDma3RequestCursor;
- gDma3ManagerLocked = 1;
+ gDma3ManagerLocked = TRUE;
- while(1)
+ while (i < MAX_DMA_REQUESTS)
{
- if(!gDma3Requests[cursor].size)
+ if (gDma3Requests[cursor].size == 0) // an empty request was found.
{
gDma3Requests[cursor].dest = dest;
gDma3Requests[cursor].size = size;
@@ -484,41 +189,39 @@ int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
gDma3Requests[cursor].value = value;
if(mode == 1)
- gDma3Requests[cursor].mode = 2;
+ gDma3Requests[cursor].mode = DMA_REQUEST_FILL32;
else
- gDma3Requests[cursor].mode = 4;
+ gDma3Requests[cursor].mode = DMA_REQUEST_FILL16;
gDma3ManagerLocked = FALSE;
- return (s16)cursor;
+ return cursor;
}
- if(++cursor >= 0x80) // loop back to start.
- {
+ if (++cursor >= MAX_DMA_REQUESTS) // loop back to start.
cursor = 0;
- }
- if(++var >= 0x80) // max checks were made. all resulted in failure.
- {
- break;
- }
+ i++;
}
gDma3ManagerLocked = FALSE;
- return -1;
+ return -1; // no free DMA request was found
}
-int CheckForSpaceForDma3Request(s16 index)
+s16 CheckForSpaceForDma3Request(s16 index)
{
- int current = 0;
+ int i = 0;
- if (index == -1)
+ if (index == -1) // check if all requests are free
{
- for (; current < 0x80; current ++)
- if (gDma3Requests[current].size)
+ while (i < MAX_DMA_REQUESTS)
+ {
+ if (gDma3Requests[i].size != 0)
return -1;
-
+ i++;
+ }
+ return 0;
+ }
+ else // check the specified request
+ {
+ if (gDma3Requests[index].size != 0)
+ return -1;
return 0;
}
-
- if (gDma3Requests[index].size)
- return -1;
-
- return 0;
}
diff --git a/src/dynamic_placeholder_text_util.c b/src/dynamic_placeholder_text_util.c
new file mode 100644
index 000000000..bdfcf6653
--- /dev/null
+++ b/src/dynamic_placeholder_text_util.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "text.h"
+#include "dynamic_placeholder_text_util.h"
+#include "string_util.h"
+
+static EWRAM_DATA const u8 *sStringPointers[8] = {};
+
+void DynamicPlaceholderTextUtil_Reset(void)
+{
+ const u8 **ptr;
+ u8 *fillval;
+ const u8 **ptr2;
+
+ ptr = sStringPointers;
+ fillval = NULL;
+ ptr2 = ptr + (ARRAY_COUNT(sStringPointers) - 1);
+ do
+ {
+ *ptr2-- = fillval;
+ } while ((int)ptr2 >= (int)ptr);
+}
+
+void DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr)
+{
+ if (idx < ARRAY_COUNT(sStringPointers))
+ {
+ sStringPointers[idx] = ptr;
+ }
+}
+
+u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src)
+{
+ while (*src != EOS)
+ {
+ if (*src != CHAR_SPECIAL_F7)
+ {
+ *dest++ = *src++;
+ }
+ else
+ {
+ src++;
+ if (sStringPointers[*src] != NULL)
+ {
+ dest = StringCopy(dest, sStringPointers[*src]);
+ }
+ src++;
+ }
+ }
+ *dest = EOS;
+ return dest;
+}
+
+const u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx)
+{
+ return sStringPointers[idx];
+}
diff --git a/src/easy_chat.c b/src/easy_chat.c
index 0ed5bdea9..26a69f9ff 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -2,7 +2,7 @@
// Includes
#include "global.h"
#include "malloc.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "overworld.h"
#include "task.h"
@@ -17,15 +17,16 @@
// Static type declarations
#define EZCHAT_TASK_STATE 0
-#define EZCHAT_TASK_KIND 1
+#define EZCHAT_TASK_KIND 1
#define EZCHAT_TASK_WORDS 2
#define EZCHAT_TASK_MAINCALLBACK 4
#define EZCHAT_TASK_UNK06 6
-#define EZCHAT_TASK_SIZE 7
+#define EZCHAT_TASK_SIZE 7
// Static RAM declarations
-EWRAM_DATA struct {
+EWRAM_DATA struct
+{
u8 kind;
u8 unk_01;
u8 unk_02;
@@ -58,7 +59,7 @@ static void sub_811A2FC(u8);
static void sub_811A4D0(MainCallback);
static bool32 sub_811A88C(u16);
static void sub_811A8A4(u16);
-static void sub_811A8F0(void);
+void sub_811A8F0(void);
static bool8 EasyChat_AllocateResources(u8, u16 *, u8);
static void EasyChat_FreeResources(void);
static u16 sub_811AAAC(void);
@@ -163,56 +164,56 @@ static void sub_811A2FC(u8 taskId)
data = gTasks[taskId].data;
switch (data[EZCHAT_TASK_STATE])
{
- case 0:
- SetVBlankCallback(sub_811A290);
- BlendPalettes(-1, 16, 0);
- BeginNormalPaletteFade(-1, -1, 16, 0, 0);
- data[EZCHAT_TASK_STATE] = 5;
- break;
- case 1:
- v0 = sub_811AAAC();
- if (sub_811A88C(v0))
- {
- BeginNormalPaletteFade(-1, -2, 0, 16, 0);
- data[EZCHAT_TASK_STATE] = 3;
- data[EZCHAT_TASK_UNK06] = v0;
- }
- else if (v0 == 0x18)
- {
- BeginNormalPaletteFade(-1, -1, 0, 16, 0);
- data[EZCHAT_TASK_STATE] = 4;
- }
- else if (v0 != 0)
- {
- PlaySE(SE_SELECT);
- sub_811C158(v0);
- data[EZCHAT_TASK_STATE] ++;
- }
- break;
- case 2:
- if (!sub_811C170())
- {
- data[EZCHAT_TASK_STATE] = 1;
- }
- break;
- case 3:
- if (!gPaletteFade.active)
- {
- sub_811A8A4(data[EZCHAT_TASK_UNK06]);
- }
- break;
- case 4:
- if (!gPaletteFade.active)
- {
- sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
- }
- break;
- case 5:
- if (!gPaletteFade.active)
- {
- data[EZCHAT_TASK_STATE] = 1;
- }
- break;
+ case 0:
+ SetVBlankCallback(sub_811A290);
+ BlendPalettes(-1, 16, 0);
+ BeginNormalPaletteFade(-1, -1, 16, 0, 0);
+ data[EZCHAT_TASK_STATE] = 5;
+ break;
+ case 1:
+ v0 = sub_811AAAC();
+ if (sub_811A88C(v0))
+ {
+ BeginNormalPaletteFade(-1, -2, 0, 16, 0);
+ data[EZCHAT_TASK_STATE] = 3;
+ data[EZCHAT_TASK_UNK06] = v0;
+ }
+ else if (v0 == 0x18)
+ {
+ BeginNormalPaletteFade(-1, -1, 0, 16, 0);
+ data[EZCHAT_TASK_STATE] = 4;
+ }
+ else if (v0 != 0)
+ {
+ PlaySE(SE_SELECT);
+ sub_811C158(v0);
+ data[EZCHAT_TASK_STATE] ++;
+ }
+ break;
+ case 2:
+ if (!sub_811C170())
+ {
+ data[EZCHAT_TASK_STATE] = 1;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ sub_811A8A4(data[EZCHAT_TASK_UNK06]);
+ }
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ data[EZCHAT_TASK_STATE] = 1;
+ }
+ break;
}
}
@@ -223,38 +224,38 @@ static bool8 sub_811A428(u8 taskId)
data = gTasks[taskId].data;
switch (data[EZCHAT_TASK_STATE])
{
- case 0:
- SetVBlankCallback(NULL);
- ResetSpriteData();
- FreeAllSpritePalettes();
- ResetPaletteFade();
- break;
- case 1:
- if (!sub_811F28C())
- {
- sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
- }
- break;
- case 2:
- if (!EasyChat_AllocateResources(data[EZCHAT_TASK_KIND], (u16 *)GetWordTaskArg(taskId, EZCHAT_TASK_WORDS), data[EZCHAT_TASK_SIZE]))
- {
- sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
- }
- break;
- case 3:
- if (!sub_811BF8C())
- {
- sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
- }
- break;
- case 4:
- if (sub_811BFA4())
- {
- return TRUE;
- }
- break;
- default:
- return FALSE;
+ case 0:
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ break;
+ case 1:
+ if (!sub_811F28C())
+ {
+ sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ case 2:
+ if (!EasyChat_AllocateResources(data[EZCHAT_TASK_KIND], (u16 *)GetWordTaskArg(taskId, EZCHAT_TASK_WORDS), data[EZCHAT_TASK_SIZE]))
+ {
+ sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ case 3:
+ if (!sub_811BF8C())
+ {
+ sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK));
+ }
+ break;
+ case 4:
+ if (sub_811BFA4())
+ {
+ return TRUE;
+ }
+ break;
+ default:
+ return FALSE;
}
data[EZCHAT_TASK_STATE] ++;
return TRUE;
@@ -273,94 +274,94 @@ void easy_chat_input_maybe(void)
{
int i;
u16 *words;
- OldMan *oldMan;
+ struct MauvilleManBard *bard;
u8 sizeParam = 3;
switch (gSpecialVar_0x8004)
{
- case 0:
- words = gSaveBlock1Ptr->unk2BB0;
- break;
- case 1:
- words = gSaveBlock1Ptr->unk2BBC;
- break;
- case 2:
- words = gSaveBlock1Ptr->unk2BC8;
- break;
- case 3:
- words = gSaveBlock1Ptr->unk2BD4;
- break;
- case 4:
- words = gSaveBlock1Ptr->mail[gSpecialVar_0x8005].words;
- break;
- case 6:
- oldMan = &gSaveBlock1Ptr->oldMan;
- for (i = 0; i < 6; i ++)
- {
- oldMan->oldMan1.mauvilleOldMan_ecArray2[i] = oldMan->oldMan1.mauvilleOldMan_ecArray[i];
- }
- words = oldMan->oldMan1.mauvilleOldMan_ecArray2;
- break;
- case 5:
- words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].bravoTrainer.words;
- sizeParam = gSpecialVar_0x8006;
- break;
- case 7:
- words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words[gSpecialVar_0x8006];
- sizeParam = 1;
- break;
- case 8:
- words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].unkShow04.words;
- sizeParam = 0;
- break;
- case 9:
- words = (u16 *)gStringVar3;
- words[0] = gSaveBlock1Ptr->easyChatPairs[0].words[0];
- words[1] = gSaveBlock1Ptr->easyChatPairs[0].words[1];
- break;
- case 10:
- words = gSaveBlock1Ptr->gabbyAndTyData.quote;
- *words = -1;
- sizeParam = 1;
- break;
- case 11:
- words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].bravoTrainer.words[gSpecialVar_0x8006];
- sizeParam = 0;
- break;
- case 12:
- words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words18;
- sizeParam = 1;
- break;
- case 13:
- words = (u16 *)gStringVar3;
- InitializeEasyChatWordArray(words, 2);
- break;
- case 14:
- words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanClubSpecial.words;
- words[0] = -1;
- sizeParam = 2;
- break;
- case 15:
- words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_016;
- break;
- case 16:
- return;
- case 17:
- words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_002;
- break;
- case 18:
- words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_014;
- break;
- case 19:
- words = gSaveBlock2Ptr->unk_104;
- break;
- case 20:
- words = sub_801B058();
- break;
- default:
- return;
+ case 0:
+ words = gSaveBlock1Ptr->unk2BB0;
+ break;
+ case 1:
+ words = gSaveBlock1Ptr->unk2BBC;
+ break;
+ case 2:
+ words = gSaveBlock1Ptr->unk2BC8;
+ break;
+ case 3:
+ words = gSaveBlock1Ptr->unk2BD4;
+ break;
+ case 4:
+ words = gSaveBlock1Ptr->mail[gSpecialVar_0x8005].words;
+ break;
+ case 6:
+ bard = &gSaveBlock1Ptr->oldMan.bard;
+ for (i = 0; i < 6; i ++)
+ {
+ bard->temporaryLyrics[i] = bard->songLyrics[i];
+ }
+ words = bard->temporaryLyrics;
+ break;
+ case 5:
+ words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].bravoTrainer.words;
+ sizeParam = gSpecialVar_0x8006;
+ break;
+ case 7:
+ words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words[gSpecialVar_0x8006];
+ sizeParam = 1;
+ break;
+ case 8:
+ words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].unkShow04.words;
+ sizeParam = 0;
+ break;
+ case 9:
+ words = (u16 *)gStringVar3;
+ words[0] = gSaveBlock1Ptr->easyChatPairs[0].words[0];
+ words[1] = gSaveBlock1Ptr->easyChatPairs[0].words[1];
+ break;
+ case 10:
+ words = gSaveBlock1Ptr->gabbyAndTyData.quote;
+ *words = -1;
+ sizeParam = 1;
+ break;
+ case 11:
+ words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].bravoTrainer.words[gSpecialVar_0x8006];
+ sizeParam = 0;
+ break;
+ case 12:
+ words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words18;
+ sizeParam = 1;
+ break;
+ case 13:
+ words = (u16 *)gStringVar3;
+ InitializeEasyChatWordArray(words, 2);
+ break;
+ case 14:
+ words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanClubSpecial.words;
+ words[0] = -1;
+ sizeParam = 2;
+ break;
+ case 15:
+ words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_016;
+ break;
+ case 16:
+ return;
+ case 17:
+ words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_002;
+ break;
+ case 18:
+ words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_014;
+ break;
+ case 19:
+ words = (u16 *)&gSaveBlock2Ptr->field_DC[0].field_0[0x28];
+ break;
+ case 20:
+ words = sub_801B058();
+ break;
+ default:
+ return;
}
overworld_free_bg_tilemaps();
- sub_811A20C(gSpecialVar_0x8004, words, sub_80861B0, sizeParam);
+ sub_811A20C(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript, sizeParam);
}
static void sub_811A7E4(void)
@@ -370,18 +371,18 @@ static void sub_811A7E4(void)
UpdatePaletteFade();
switch (gMain.state)
{
- case 0:
- fade_screen(1, 0);
- break;
- case 1:
- if (!gPaletteFade.active)
- {
- lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
- lilycoveLady->quiz.unk_016[0] = -1;
- overworld_free_bg_tilemaps();
- sub_811A8F0();
- }
- return;
+ case 0:
+ FadeScreen(1, 0);
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
+ lilycoveLady->quiz.unk_016[0] = -1;
+ overworld_free_bg_tilemaps();
+ sub_811A8F0();
+ }
+ return;
}
gMain.state ++;
}
@@ -398,9 +399,7 @@ static int sub_811A868(u16 word)
for (i = 0; i < ARRAY_COUNT(gUnknown_08597530); i ++)
{
if (word == gUnknown_08597530[i].word)
- {
return i;
- }
}
return -1;
}
@@ -419,31 +418,31 @@ static void sub_811A8A4(u16 word)
sub_811A4D0(gUnknown_08597530[i].callback);
}
-static void sub_811A8CC(void)
+void sub_811A8CC(void)
{
- sub_811A20C(0xF, gSaveBlock1Ptr->lilycoveLady.quiz.unk_016, sub_80861B0, 3);
+ sub_811A20C(0xF, gSaveBlock1Ptr->lilycoveLady.quiz.unk_016, CB2_ReturnToFieldContinueScript, 3);
}
-static void sub_811A8F0(void)
+void sub_811A8F0(void)
{
- sub_811A20C(0x10, gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, sub_80861B0, 3);
+ sub_811A20C(0x10, gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, CB2_ReturnToFieldContinueScript, 3);
}
-static void sub_811A914(void)
+void sub_811A914(void)
{
- sub_811A20C(0x12, gSaveBlock1Ptr->lilycoveLady.quiz.unk_014, sub_80861B0, 3);
+ sub_811A20C(0x12, gSaveBlock1Ptr->lilycoveLady.quiz.unk_014, CB2_ReturnToFieldContinueScript, 3);
}
-static void sub_811A938(void)
+void sub_811A938(void)
{
- sub_811A20C(0x11, gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, sub_80861B0, 3);
+ sub_811A20C(0x11, gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, CB2_ReturnToFieldContinueScript, 3);
}
static bool8 EasyChat_AllocateResources(u8 kind, u16 *words, u8 sizeParam)
{
u8 r6;
int i;
-
+
gUnknown_0203A118 = malloc(sizeof(*gUnknown_0203A118));
if (gUnknown_0203A118 == NULL)
{
@@ -505,28 +504,28 @@ static u16 sub_811AAAC(void)
{
switch (gUnknown_0203A118->unk_04)
{
- case 0:
- return sub_811AB68();
- case 1:
- return sub_811ACDC();
- case 2:
- return sub_811AE44();
- case 3:
- return sub_811AF00();
- case 4:
- return sub_811AF8C();
- case 5:
- return sub_811B040();
- case 6:
- return sub_811AFEC();
- case 7:
- return sub_811B08C();
- case 8:
- return sub_811B0BC();
- case 9:
- return sub_811B0E8();
- case 10:
- return sub_811B0F8();
+ case 0:
+ return sub_811AB68();
+ case 1:
+ return sub_811ACDC();
+ case 2:
+ return sub_811AE44();
+ case 3:
+ return sub_811AF00();
+ case 4:
+ return sub_811AF8C();
+ case 5:
+ return sub_811B040();
+ case 6:
+ return sub_811AFEC();
+ case 7:
+ return sub_811B08C();
+ case 8:
+ return sub_811B0BC();
+ case 9:
+ return sub_811B0E8();
+ case 10:
+ return sub_811B0F8();
}
return 0;
}
@@ -535,10 +534,10 @@ bool32 sub_811AB44(void)
{
switch (sub_811BA68())
{
- case 2:
- case 7:
- case 8:
- return TRUE;
+ case 2:
+ case 7:
+ case 8:
+ return TRUE;
}
return FALSE;
}
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index a3f7c2ab0..67876f33b 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -2,7 +2,7 @@
#include "pokemon.h"
#include "egg_hatch.h"
#include "pokedex.h"
-#include "items.h"
+#include "constants/items.h"
#include "script.h"
#include "decompress.h"
#include "task.h"
@@ -10,21 +10,22 @@
#include "main.h"
#include "event_data.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "text.h"
#include "text_window.h"
#include "string_util.h"
#include "menu.h"
#include "trig.h"
-#include "rng.h"
+#include "random.h"
#include "malloc.h"
#include "dma3.h"
#include "gpu_regs.h"
#include "bg.h"
#include "m4a.h"
#include "window.h"
-#include "abilities.h"
+#include "constants/abilities.h"
#include "daycare.h"
+#include "overworld.h"
#include "battle.h" // to get rid of later
struct EggHatchData
@@ -41,41 +42,27 @@ struct EggHatchData
u8 unused_9;
u8 unused_A;
u16 species;
- struct TextColor textColor;
+ u8 textColor[3];
};
-extern struct SpriteTemplate gUnknown_0202499C;
-extern void (*gFieldCallback)(void);
-
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
-extern const u8 gUnknown_08C00000[];
-extern const u8 gUnknown_08C00524[];
-extern const u8 gUnknown_08C004E0[];
-extern const u16 gUnknown_08DD7300[]; // palette, gameboy advance
-extern const u32 gUnknown_08DD7360[]; // tileset gameboy advance
+extern const u8 gBattleTextboxTiles[];
+extern const u8 gBattleTextboxTilemap[];
+extern const u8 gBattleTextboxPalette[];
+extern const u16 gTradeGba2_Pal[]; // palette, gameboy advance
+extern const u32 gTradeGba_Gfx[]; // tileset gameboy advance
extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle
extern const u8 gText_HatchedFromEgg[];
extern const u8 gText_NickHatchPrompt[];
-extern u8* GetMonNick(struct Pokemon* mon, u8* dst);
-extern u8* GetBoxMonNick(struct BoxPokemon* boxMon, u8* dst);
extern u8 sav1_map_get_name(void);
-extern s8 sub_8198C58(void);
extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8);
-extern void sub_806A068(u16, u8);
-extern void fade_screen(u8, u8);
+extern void FadeScreen(u8, u8);
extern void overworld_free_bg_tilemaps(void);
extern void sub_80AF168(void);
-extern void AllocateMonSpritesGfx(void);
-extern void FreeMonSpritesGfx(void);
-extern void remove_some_task(void);
-extern void reset_temp_tile_data_buffers(void);
-extern void c2_exit_to_overworld_2_switch(void);
+extern void ScanlineEffect_Stop(void);
extern void play_some_sound(void);
-extern void copy_decompressed_tile_data_to_vram_autofree(u8 bg_id, const void* src, u16 size, u16 offset, u8 mode);
-extern void CreateYesNoMenu(const struct WindowTemplate*, u16, u8, u8);
extern void DoNamingScreen(u8, const u8*, u16, u8, u32, MainCallback);
-extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str);
extern u16 sub_80D22D0(void);
extern u8 CountPartyAliveNonEggMonsExcept(u8);
@@ -94,7 +81,7 @@ static void CreateRandomEggShardSprite(void);
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex);
// IWRAM bss
-static IWRAM_DATA struct EggHatchData* sEggHatchData;
+static IWRAM_DATA struct EggHatchData *sEggHatchData;
// rom data
static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal");
@@ -401,13 +388,13 @@ static bool8 sub_807158C(struct DayCare *daycare, u8 daycareId)
struct DaycareMon *daycareMon = &daycare->mons[daycareId];
GetBoxMonNick(&daycareMon->mon, nick);
- if (daycareMon->misc.mail.itemId != 0
- && (StringCompareWithoutExtCtrlCodes(nick, daycareMon->misc.monName) != 0
- || StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->misc.OT_name) != 0))
+ if (daycareMon->mail.message.itemId != 0
+ && (StringCompareWithoutExtCtrlCodes(nick, daycareMon->mail.monName) != 0
+ || StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0))
{
StringCopy(gStringVar1, nick);
- TVShowConvertInternationalString(gStringVar2, daycareMon->misc.OT_name, daycareMon->misc.gameLanguage);
- TVShowConvertInternationalString(gStringVar3, daycareMon->misc.monName, daycareMon->misc.monLanguage);
+ TVShowConvertInternationalString(gStringVar2, daycareMon->mail.OT_name, daycareMon->mail.gameLanguage);
+ TVShowConvertInternationalString(gStringVar3, daycareMon->mail.monName, daycareMon->mail.monLanguage);
return TRUE;
}
return FALSE;
@@ -443,13 +430,13 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species],
gMonSpritesGfxPtr->sprites[(a0 * 2) + 1],
species, pid);
- LoadCompressedObjectPalette(sub_806E794(mon));
+ LoadCompressedObjectPalette(GetMonSpritePalStruct(mon));
*speciesLoc = species;
}
break;
case 1:
- sub_806A068(sub_806E794(mon)->tag, r5);
- spriteID = CreateSprite(&gUnknown_0202499C, 120, 75, 6);
+ SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, r5);
+ spriteID = CreateSprite(&gMultiuseSpriteTemplate, 120, 75, 6);
gSprites[spriteID].invisible = 1;
gSprites[spriteID].callback = SpriteCallbackDummy;
break;
@@ -468,7 +455,7 @@ void EggHatch(void)
{
ScriptContext2_Enable();
CreateTask(Task_EggHatch, 10);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_EggHatch(u8 taskID)
@@ -515,7 +502,7 @@ static void CB2_EggHatch_0(void)
FreeAllSpritePalettes();
ResetSpriteData();
ResetTasks();
- remove_some_task();
+ ScanlineEffect_Stop();
m4aSoundVSyncOn();
gMain.state++;
break;
@@ -525,9 +512,9 @@ static void CB2_EggHatch_0(void)
gMain.state++;
break;
case 2:
- copy_decompressed_tile_data_to_vram_autofree(0, gUnknown_08C00000, 0, 0, 0);
- CopyToBgTilemapBuffer(0, gUnknown_08C00524, 0, 0);
- LoadCompressedPalette(gUnknown_08C004E0, 0, 0x20);
+ copy_decompressed_tile_data_to_vram_autofree(0, gBattleTextboxTiles, 0, 0, 0);
+ CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
gMain.state++;
break;
case 3:
@@ -551,8 +538,8 @@ static void CB2_EggHatch_0(void)
break;
case 7:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
- LoadPalette(gUnknown_08DD7300, 0x10, 0xA0);
- LoadBgTiles(1, gUnknown_08DD7360, 0x1420, 0);
+ LoadPalette(gTradeGba2_Pal, 0x10, 0xA0);
+ LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0);
CopyToBgTilemapBuffer(1, gUnknown_08331F60, 0x1000, 0);
CopyBgTilemapBufferToVram(1);
gMain.state++;
@@ -574,7 +561,7 @@ static void EggHatchSetMonNickname(void)
SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3);
FreeMonSpritesGfx();
Free(sEggHatchData);
- SetMainCallback2(c2_exit_to_overworld_2_switch);
+ SetMainCallback2(CB2_ReturnToField);
}
static void Task_EggHatchPlayBGM(u8 taskID)
@@ -585,10 +572,10 @@ static void Task_EggHatchPlayBGM(u8 taskID)
play_some_sound();
}
if (gTasks[taskID].data[0] == 1)
- PlayBGM(376);
+ PlayBGM(MUS_ME_SHINKA);
if (gTasks[taskID].data[0] > 60)
{
- PlayBGM(377);
+ PlayBGM(MUS_SHINKA);
DestroyTask(taskID);
// UB: task is destroyed, yet the value is incremented
}
@@ -604,7 +591,7 @@ static void CB2_EggHatch_1(void)
switch (sEggHatchData->CB2_state)
{
case 0:
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5);
ShowBg(0);
ShowBg(1);
@@ -644,7 +631,7 @@ static void CB2_EggHatch_1(void)
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg);
EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF);
- PlayFanfare(371);
+ PlayFanfare(MUS_FANFA5);
sEggHatchData->CB2_state++;
PutWindowTilemap(sEggHatchData->windowId);
CopyWindowToVram(sEggHatchData->windowId, 3);
@@ -666,13 +653,13 @@ static void CB2_EggHatch_1(void)
case 9:
if (!IsTextPrinterActive(sEggHatchData->windowId))
{
- sub_809882C(sEggHatchData->windowId, 0x140, 0xE0);
+ LoadUserWindowBorderGfx(sEggHatchData->windowId, 0x140, 0xE0);
CreateYesNoMenu(&sYesNoWinTemplate, 0x140, 0xE, 0);
sEggHatchData->CB2_state++;
}
break;
case 10:
- switch (sub_8198C58())
+ switch (ProcessMenuInputNoWrap_())
{
case 0:
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
@@ -687,7 +674,7 @@ static void CB2_EggHatch_1(void)
}
break;
case 11:
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
sEggHatchData->CB2_state++;
break;
case 12:
@@ -698,7 +685,7 @@ static void CB2_EggHatch_1(void)
UnsetBgTilemapBuffer(0);
UnsetBgTilemapBuffer(1);
Free(sEggHatchData);
- SetMainCallback2(c2_exit_to_overworld_2_switch);
+ SetMainCallback2(CB2_ReturnToField);
}
break;
}
@@ -712,16 +699,16 @@ static void CB2_EggHatch_1(void)
static void SpriteCB_Egg_0(struct Sprite* sprite)
{
- if (++sprite->data0 > 20)
+ if (++sprite->data[0] > 20)
{
sprite->callback = SpriteCB_Egg_1;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
}
else
{
- sprite->data1 = (sprite->data1 + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data1, 1);
- if (sprite->data0 == 15)
+ sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 1);
+ if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 1);
@@ -732,19 +719,19 @@ static void SpriteCB_Egg_0(struct Sprite* sprite)
static void SpriteCB_Egg_1(struct Sprite* sprite)
{
- if (++sprite->data2 > 30)
+ if (++sprite->data[2] > 30)
{
- if (++sprite->data0 > 20)
+ if (++sprite->data[0] > 20)
{
sprite->callback = SpriteCB_Egg_2;
- sprite->data0 = 0;
- sprite->data2 = 0;
+ sprite->data[0] = 0;
+ sprite->data[2] = 0;
}
else
{
- sprite->data1 = (sprite->data1 + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data1, 2);
- if (sprite->data0 == 15)
+ sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 2);
+ if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 2);
@@ -755,30 +742,30 @@ static void SpriteCB_Egg_1(struct Sprite* sprite)
static void SpriteCB_Egg_2(struct Sprite* sprite)
{
- if (++sprite->data2 > 30)
+ if (++sprite->data[2] > 30)
{
- if (++sprite->data0 > 38)
+ if (++sprite->data[0] > 38)
{
u16 species;
sprite->callback = SpriteCB_Egg_3;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0;
gSprites[sEggHatchData->pokeSpriteID].pos2.y = 0;
}
else
{
- sprite->data1 = (sprite->data1 + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data1, 2);
- if (sprite->data0 == 15)
+ sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 2);
+ if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 2);
CreateRandomEggShardSprite();
CreateRandomEggShardSprite();
}
- if (sprite->data0 == 30)
+ if (sprite->data[0] == 30)
PlaySE(SE_BOWA);
}
}
@@ -786,60 +773,60 @@ static void SpriteCB_Egg_2(struct Sprite* sprite)
static void SpriteCB_Egg_3(struct Sprite* sprite)
{
- if (++sprite->data0 > 50)
+ if (++sprite->data[0] > 50)
{
sprite->callback = SpriteCB_Egg_4;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
}
}
static void SpriteCB_Egg_4(struct Sprite* sprite)
{
s16 i;
- if (sprite->data0 == 0)
- BeginNormalPaletteFade(-1, -1, 0, 0x10, 0xFFFF);
- if (sprite->data0 < 4u)
+ if (sprite->data[0] == 0)
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0xFFFF);
+ if (sprite->data[0] < 4u)
{
for (i = 0; i <= 3; i++)
CreateRandomEggShardSprite();
}
- sprite->data0++;
+ sprite->data[0]++;
if (!gPaletteFade.active)
{
PlaySE(SE_TAMAGO);
sprite->invisible = 1;
sprite->callback = SpriteCB_Egg_5;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
}
}
static void SpriteCB_Egg_5(struct Sprite* sprite)
{
- if (sprite->data0 == 0)
+ if (sprite->data[0] == 0)
{
gSprites[sEggHatchData->pokeSpriteID].invisible = 0;
StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1);
}
- if (sprite->data0 == 8)
- BeginNormalPaletteFade(-1, -1, 0x10, 0, 0xFFFF);
- if (sprite->data0 <= 9)
+ if (sprite->data[0] == 8)
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, 0xFFFF);
+ if (sprite->data[0] <= 9)
gSprites[sEggHatchData->pokeSpriteID].pos1.y -= 1;
- if (sprite->data0 > 40)
+ if (sprite->data[0] > 40)
sprite->callback = SpriteCallbackDummy;
- sprite->data0++;
+ sprite->data[0]++;
}
static void SpriteCB_EggShard(struct Sprite* sprite)
{
- sprite->data4 += sprite->data1;
- sprite->data5 += sprite->data2;
+ sprite->data[4] += sprite->data[1];
+ sprite->data[5] += sprite->data[2];
- sprite->pos2.x = sprite->data4 / 256;
- sprite->pos2.y = sprite->data5 / 256;
+ sprite->pos2.x = sprite->data[4] / 256;
+ sprite->pos2.y = sprite->data[5] / 256;
- sprite->data2 += sprite->data3;
+ sprite->data[2] += sprite->data[3];
- if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data2 > 0)
+ if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0)
DestroySprite(sprite);
}
@@ -857,19 +844,19 @@ static void CreateRandomEggShardSprite(void)
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex)
{
u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4);
- gSprites[spriteID].data1 = data1;
- gSprites[spriteID].data2 = data2;
- gSprites[spriteID].data3 = data3;
+ gSprites[spriteID].data[1] = data1;
+ gSprites[spriteID].data[2] = data2;
+ gSprites[spriteID].data[3] = data3;
StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex);
}
static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
{
FillWindowPixelBuffer(windowId, 0xFF);
- sEggHatchData->textColor.fgColor = 0;
- sEggHatchData->textColor.bgColor = 5;
- sEggHatchData->textColor.shadowColor = 6;
- AddTextPrinterParametrized2(windowId, 1, x, y, 0, 0, &sEggHatchData->textColor, speed, string);
+ sEggHatchData->textColor[0] = 0;
+ sEggHatchData->textColor[1] = 5;
+ sEggHatchData->textColor[2] = 6;
+ AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, sEggHatchData->textColor, speed, string);
}
u8 GetEggStepsToSubtract(void)
diff --git a/src/event_data.c b/src/event_data.c
index e3742a147..efd439a3c 100644
--- a/src/event_data.c
+++ b/src/event_data.c
@@ -44,7 +44,7 @@ void ClearTempFieldEventData(void)
FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
FlagClear(FLAG_SYS_USE_STRENGTH);
FlagClear(FLAG_SYS_CTRL_OBJ_DELETE);
- FlagClear(FLAG_SYS_UNKNOWN_880);
+ FlagClear(FLAG_0x880);
}
// probably had different flag splits at one point.
@@ -190,7 +190,7 @@ bool8 VarSet(u16 id, u16 value)
return TRUE;
}
-u8 VarGetFieldObjectGraphicsId(u8 id)
+u8 VarGetEventObjectGraphicsId(u8 id)
{
return VarGet(0x4010 + id);
}
diff --git a/src/event_obj_lock.c b/src/event_obj_lock.c
new file mode 100644
index 000000000..8c324ea82
--- /dev/null
+++ b/src/event_obj_lock.c
@@ -0,0 +1,186 @@
+#include "global.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "event_obj_lock.h"
+#include "script_movement.h"
+#include "task.h"
+#include "trainer_see.h"
+
+bool8 walkrun_is_standing_still(void)
+{
+ if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static void sub_80983A4(u8 taskId)
+{
+ if (walkrun_is_standing_still())
+ {
+ sub_808B864();
+ DestroyTask(taskId);
+ }
+}
+
+bool8 sub_80983C4(void)
+{
+ if (FuncIsActiveTask(sub_80983A4))
+ {
+ return FALSE;
+ }
+ else
+ {
+ sub_808BCF4();
+ return TRUE;
+ }
+}
+
+
+void ScriptFreezeEventObjects(void)
+{
+ FreezeEventObjects();
+ CreateTask(sub_80983A4, 80);
+}
+
+static void sub_8098400(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (!task->data[0] && walkrun_is_standing_still() == TRUE)
+ {
+ sub_808B864();
+ task->data[0] = 1;
+ }
+ if (!task->data[1] && !gEventObjects[gSelectedEventObject].singleMovementActive)
+ {
+ FreezeEventObject(&gEventObjects[gSelectedEventObject]);
+ task->data[1] = 1;
+ }
+ if (task->data[0] && task->data[1])
+ DestroyTask(taskId);
+}
+
+bool8 sub_809847C(void)
+{
+ if (FuncIsActiveTask(sub_8098400))
+ {
+ return FALSE;
+ }
+ else
+ {
+ sub_808BCF4();
+ return TRUE;
+ }
+}
+
+void LockSelectedEventObject(void)
+{
+ u8 taskId;
+ FreezeEventObjectsExceptOne(gSelectedEventObject);
+ taskId = CreateTask(sub_8098400, 80);
+ if (!gEventObjects[gSelectedEventObject].singleMovementActive)
+ {
+ FreezeEventObject(&gEventObjects[gSelectedEventObject]);
+ gTasks[taskId].data[1] = 1;
+ }
+}
+
+void ScriptUnfreezeEventObjects(void)
+{
+ u8 objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
+ sub_80D338C();
+ UnfreezeEventObjects();
+}
+
+void sub_8098524(void)
+{
+ u8 objectId;
+
+ if (gEventObjects[gSelectedEventObject].active)
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]);
+ objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
+ sub_80D338C();
+ UnfreezeEventObjects();
+}
+
+void sub_8098574(void)
+{
+ EventObjectFaceOppositeDirection(&gEventObjects[gSelectedEventObject], gSpecialVar_Facing);
+}
+
+void sub_809859C(void)
+{
+ EventObjectClearHeldMovementIfActive(&gEventObjects[gSelectedEventObject]);
+}
+
+static void sub_80985BC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ u8 eventObjectId = task->data[2];
+
+ if (!task->data[0] && walkrun_is_standing_still() == TRUE)
+ {
+ sub_808B864();
+ task->data[0] = 1;
+ }
+ if (!task->data[1] && !gEventObjects[eventObjectId].singleMovementActive)
+ {
+ FreezeEventObject(&gEventObjects[eventObjectId]);
+ task->data[1] = 1;
+ }
+ if (task->data[0] && task->data[1])
+ DestroyTask(taskId);
+}
+
+void sub_8098630(void)
+{
+ u8 trainerObjectId1, trainerObjectId2, taskId;
+ trainerObjectId1 = GetChosenApproachingTrainerEventObjectId(0);
+ if(gNoOfApproachingTrainers == 2)
+ {
+ trainerObjectId2 = GetChosenApproachingTrainerEventObjectId(1);
+ sub_8098074(trainerObjectId1, trainerObjectId2);
+ taskId = CreateTask(sub_80985BC, 80);
+ gTasks[taskId].data[2] = trainerObjectId1;
+ if(!gEventObjects[trainerObjectId1].singleMovementActive)
+ {
+ FreezeEventObject(&gEventObjects[trainerObjectId1]);
+ gTasks[taskId].data[1] = 1;
+ }
+ taskId = CreateTask(sub_80985BC, 81);
+ gTasks[taskId].data[2] = trainerObjectId2;
+ if(!gEventObjects[trainerObjectId2].singleMovementActive)
+ {
+ FreezeEventObject(&gEventObjects[trainerObjectId2]);
+ gTasks[taskId].data[1] = 1;
+ }
+ }
+ else
+ {
+ FreezeEventObjectsExceptOne(trainerObjectId1);
+ taskId = CreateTask(sub_80985BC, 80);
+ gTasks[taskId].data[2] = trainerObjectId1;
+ if(!gEventObjects[trainerObjectId1].singleMovementActive)
+ {
+ FreezeEventObject(&gEventObjects[trainerObjectId1]);
+ gTasks[taskId].data[1] = 1;
+ }
+ }
+}
+
+bool8 sub_8098734(void)
+{
+ if (FuncIsActiveTask(sub_80985BC))
+ {
+ return FALSE;
+ }
+ else
+ {
+ sub_808BCF4();
+ return TRUE;
+ }
+}
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
new file mode 100644
index 000000000..5fdceb4c3
--- /dev/null
+++ b/src/event_object_movement.c
@@ -0,0 +1,9160 @@
+#include "global.h"
+#include "berry.h"
+#include "decoration.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "event_scripts.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "field_effect_helpers.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "malloc.h"
+#include "mauville_old_man.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokenav.h"
+#include "random.h"
+#include "rom_818CFC8.h"
+#include "rom_81BE66C.h"
+#include "sprite.h"
+#include "trainer_see.h"
+#include "util.h"
+#include "constants/event_object_movement_constants.h"
+#include "constants/event_objects.h"
+
+// this file was known as evobjmv.c in Game Freak's original source
+
+extern u8 gUnknown_020375B4;
+extern u16 gUnknown_020375B6;
+extern struct LockedAnimEventObjects *gLockedAnimEventObjects;
+
+static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16);
+static bool8 EventObjectExecSingleMovementAction(struct EventObject *, struct Sprite *);
+static void SetMovementDelay(struct Sprite *, s16);
+static bool8 WaitForMovementDelay(struct Sprite *);
+static u8 GetCollisionInDirection(struct EventObject *, u8);
+static u32 state_to_direction(u8, u32, u32);
+static void TryEnableEventObjectAnim(struct EventObject *, struct Sprite *);
+static void EventObjectExecHeldMovementAction(struct EventObject *, struct Sprite *);
+static void UpdateEventObjectSpriteAnimPause(struct EventObject *, struct Sprite *);
+static bool8 IsCoordOutsideEventObjectMovementRange(struct EventObject *, s16, s16);
+static bool8 IsMetatileDirectionallyImpassable(struct EventObject *, s16, s16, u8);
+static bool8 DoesObjectCollideWithObjectAt(struct EventObject *, s16, s16);
+static void sub_8096530(struct EventObject *, struct Sprite *);
+static void npc_update_obj_anim_flag(struct EventObject *, struct Sprite *);
+static void EventObjectUpdateMetatileBehaviors(struct EventObject*);
+static void GetGroundEffectFlags_Reflection(struct EventObject*, u32*);
+static void GetGroundEffectFlags_TallGrassOnSpawn(struct EventObject*, u32*);
+static void GetGroundEffectFlags_LongGrassOnSpawn(struct EventObject*, u32*);
+static void GetGroundEffectFlags_SandHeap(struct EventObject*, u32*);
+static void GetGroundEffectFlags_ShallowFlowingWater(struct EventObject*, u32*);
+static void GetGroundEffectFlags_ShortGrass(struct EventObject*, u32*);
+static void GetGroundEffectFlags_HotSprings(struct EventObject*, u32*);
+static void GetGroundEffectFlags_TallGrassOnBeginStep(struct EventObject*, u32*);
+static void GetGroundEffectFlags_LongGrassOnBeginStep(struct EventObject*, u32*);
+static void GetGroundEffectFlags_Tracks(struct EventObject*, u32*);
+static void GetGroundEffectFlags_Puddle(struct EventObject*, u32*);
+static void GetGroundEffectFlags_Ripple(struct EventObject*, u32*);
+static void GetGroundEffectFlags_Seaweed(struct EventObject*, u32*);
+static void GetGroundEffectFlags_JumpLanding(struct EventObject*, u32*);
+static u8 EventObjectCheckForReflectiveSurface(struct EventObject*);
+static u8 GetReflectionTypeByMetatileBehavior(u32);
+static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z);
+static void EventObjectUpdateSubpriority(struct EventObject*, struct Sprite*);
+static void DoTracksGroundEffect_None(struct EventObject*, struct Sprite*, u8);
+static void DoTracksGroundEffect_Footprints(struct EventObject*, struct Sprite*, u8);
+static void DoTracksGroundEffect_BikeTireTracks(struct EventObject*, struct Sprite*, u8);
+static void DoRippleFieldEffect(struct EventObject*, struct Sprite*);
+static void DoGroundEffects_OnSpawn(struct EventObject*, struct Sprite*);
+static void DoGroundEffects_OnBeginStep(struct EventObject*, struct Sprite*);
+static void DoGroundEffects_OnFinishStep(struct EventObject*, struct Sprite*);
+static void sub_8097D68(struct Sprite*);
+static void ApplyLevitateMovement(u8);
+static bool8 MovementType_Disguise_Callback(struct EventObject *, struct Sprite *);
+static bool8 MovementType_Hidden_Callback(struct EventObject *, struct Sprite *);
+static void sub_808D450(void);
+static u8 GetEventObjectIdByLocalId(u8);
+static u8 GetEventObjectIdByLocalIdAndMapInternal(u8, u8, u8);
+static bool8 GetAvailableEventObjectId(u16, u8, u8, u8 *);
+static void SetEventObjectDynamicGraphicsId(struct EventObject *);
+static void RemoveEventObjectInternal(struct EventObject *);
+static u16 GetEventObjectFlagIdByEventObjectId(u8);
+static void UpdateEventObjectVisibility(struct EventObject *, struct Sprite *);
+static void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *, struct SpriteTemplate *, const struct SubspriteTable **);
+static void GetEventObjectMovingCameraOffset(s16 *, s16 *);
+static struct EventObjectTemplate *GetEventObjectTemplateByLocalIdAndMap(u8, u8, u8);
+static void sub_808E894(u16);
+static void RemoveEventObjectIfOutsideView(struct EventObject *);
+static void sub_808E1B8(u8, s16, s16);
+static void SetPlayerAvatarEventObjectIdAndObjectId(u8, u8);
+static void sub_808E38C(struct EventObject *);
+static u8 sub_808E8F4(const struct SpritePalette *);
+static u8 FindEventObjectPaletteIndexByTag(u16);
+static void sub_808EAB0(u16, u8);
+static bool8 EventObjectDoesZCoordMatch(struct EventObject *, u8);
+static void ObjectCB_CameraObject(struct Sprite *);
+static void CameraObject_0(struct Sprite *);
+static void CameraObject_1(struct Sprite *);
+static void CameraObject_2(struct Sprite *);
+static struct EventObjectTemplate *FindEventObjectTemplateByLocalId(u8 localId, struct EventObjectTemplate *templates, u8 count);
+static void ClearEventObjectMovement(struct EventObject *, struct Sprite *);
+static void EventObjectSetSingleMovement(struct EventObject *, struct Sprite *, u8);
+
+const u8 gUnknown_084975C4[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
+
+const struct SpriteTemplate gCameraSpriteTemplate = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject};
+
+void (*const gCameraObjectFuncs[])(struct Sprite *) = {
+ CameraObject_0,
+ CameraObject_1,
+ CameraObject_2,
+};
+
+#include "data/field_event_obj/event_object_graphics.h"
+
+// movement type callbacks
+static void (*const sMovementTypeCallbacks[])(struct Sprite *) =
+{
+ MovementType_None, // MOVEMENT_TYPE_NONE
+ MovementType_LookAround, // MOVEMENT_TYPE_LOOK_AROUND
+ MovementType_WanderAround, // MOVEMENT_TYPE_WANDER_AROUND
+ MovementType_WanderUpAndDown, // MOVEMENT_TYPE_WANDER_UP_AND_DOWN
+ MovementType_WanderUpAndDown, // MOVEMENT_TYPE_WANDER_DOWN_AND_UP
+ MovementType_WanderLeftAndRight, // MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT
+ MovementType_WanderLeftAndRight, // MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT
+ MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_UP
+ MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_DOWN
+ MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_LEFT
+ MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_RIGHT
+ MovementType_Player, // MOVEMENT_TYPE_PLAYER
+ MovementType_BerryTreeGrowth, // MOVEMENT_TYPE_BERRY_TREE_GROWTH
+ MovementType_FaceDownAndUp, // MOVEMENT_TYPE_FACE_DOWN_AND_UP
+ MovementType_FaceLeftAndRight, // MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT
+ MovementType_FaceUpAndLeft, // MOVEMENT_TYPE_FACE_UP_AND_LEFT
+ MovementType_FaceUpAndRight, // MOVEMENT_TYPE_FACE_UP_AND_RIGHT
+ MovementType_FaceDownAndLeft, // MOVEMENT_TYPE_FACE_DOWN_AND_LEFT
+ MovementType_FaceDownAndRight, // MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT
+ MovementType_FaceDownUpAndLeft, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT
+ MovementType_FaceDownUpAndRight, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT
+ MovementType_FaceUpRightAndLeft, // MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT
+ MovementType_FaceDownRightAndLeft, // MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT
+ MovementType_RotateCounterclockwise, // MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE
+ MovementType_RotateClockwise, // MOVEMENT_TYPE_ROTATE_CLOCKWISE
+ MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_UP_AND_DOWN
+ MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_DOWN_AND_UP
+ MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT
+ MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT
+ MovementType_WalkSequenceUpRightLeftDown, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN
+ MovementType_WalkSequenceRightLeftDownUp, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP
+ MovementType_WalkSequenceDownUpRightLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT
+ MovementType_WalkSequenceLeftDownUpRight, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT
+ MovementType_WalkSequenceUpLeftRightDown, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN
+ MovementType_WalkSequenceLeftRightDownUp, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP
+ MovementType_WalkSequenceDownUpLeftRight, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT
+ MovementType_WalkSequenceRightDownUpLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT
+ MovementType_WalkSequenceLeftUpDownRight, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT
+ MovementType_WalkSequenceUpDownRightLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT
+ MovementType_WalkSequenceRightLeftUpDown, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN
+ MovementType_WalkSequenceDownRightLeftUp, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP
+ MovementType_WalkSequenceRightUpDownLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT
+ MovementType_WalkSequenceUpDownLeftRight, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT
+ MovementType_WalkSequenceLeftRightUpDown, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN
+ MovementType_WalkSequenceDownLeftRightUp, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP
+ MovementType_WalkSequenceUpLeftDownRight, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT
+ MovementType_WalkSequenceDownRightUpLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT
+ MovementType_WalkSequenceLeftDownRightUp, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP
+ MovementType_WalkSequenceRightUpLeftDown, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN
+ MovementType_WalkSequenceUpRightDownLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT
+ MovementType_WalkSequenceDownLeftUpRight, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT
+ MovementType_WalkSequenceLeftUpRightDown, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN
+ MovementType_WalkSequenceRightDownLeftUp, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP
+ MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER
+ MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE
+ MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE
+ MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE
+ MovementType_TreeDisguise, // MOVEMENT_TYPE_TREE_DISGUISE
+ MovementType_MountainDisguise, // MOVEMENT_TYPE_MOUNTAIN_DISGUISE
+ MovementType_CopyPlayerInGrass, // MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS
+ MovementType_CopyPlayerInGrass, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS
+ MovementType_CopyPlayerInGrass, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS
+ MovementType_CopyPlayerInGrass, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS
+ MovementType_Hidden, // MOVEMENT_TYPE_HIDDEN
+ MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_DOWN
+ MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_UP
+ MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_LEFT
+ MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT
+ MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_DOWN
+ MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_UP
+ MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_LEFT
+ MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT
+ MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_DOWN
+ MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_UP
+ MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_LEFT
+ MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT
+ MovementType_Invisible, // MOVEMENT_TYPE_INVISIBLE
+ MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN
+ MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP
+ MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT
+ MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT
+};
+
+const u8 gRangedMovementTypes[] = {
+ 0, // MOVEMENT_TYPE_NONE
+ 0, // MOVEMENT_TYPE_LOOK_AROUND
+ 1, // MOVEMENT_TYPE_WANDER_AROUND
+ 1, // MOVEMENT_TYPE_WANDER_UP_AND_DOWN
+ 1, // MOVEMENT_TYPE_WANDER_DOWN_AND_UP
+ 1, // MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT
+ 1, // MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT
+ 0, // MOVEMENT_TYPE_FACE_UP
+ 0, // MOVEMENT_TYPE_FACE_DOWN
+ 0, // MOVEMENT_TYPE_FACE_LEFT
+ 0, // MOVEMENT_TYPE_FACE_RIGHT
+ 0, // MOVEMENT_TYPE_PLAYER
+ 0, // MOVEMENT_TYPE_BERRY_TREE_GROWTH
+ 0, // MOVEMENT_TYPE_FACE_DOWN_AND_UP
+ 0, // MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT
+ 0, // MOVEMENT_TYPE_FACE_UP_AND_LEFT
+ 0, // MOVEMENT_TYPE_FACE_UP_AND_RIGHT
+ 0, // MOVEMENT_TYPE_FACE_DOWN_AND_LEFT
+ 0, // MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT
+ 0, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT
+ 0, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT
+ 0, // MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT
+ 0, // MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT
+ 0, // MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE
+ 0, // MOVEMENT_TYPE_ROTATE_CLOCKWISE
+ 1, // MOVEMENT_TYPE_WALK_UP_AND_DOWN
+ 1, // MOVEMENT_TYPE_WALK_DOWN_AND_UP
+ 1, // MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT
+ 1, // MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN
+ 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP
+ 1, // MOVEMENT_TYPE_COPY_PLAYER
+ 1, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE
+ 1, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE
+ 1, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE
+ 0, // MOVEMENT_TYPE_TREE_DISGUISE
+ 0, // MOVEMENT_TYPE_MOUNTAIN_DISGUISE
+ 1, // MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS
+ 1, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS
+ 1, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS
+ 1, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS
+ 0, // MOVEMENT_TYPE_HIDDEN
+ 0, // MOVEMENT_TYPE_WALK_IN_PLACE_DOWN
+ 0, // MOVEMENT_TYPE_WALK_IN_PLACE_UP
+ 0, // MOVEMENT_TYPE_WALK_IN_PLACE_LEFT
+ 0, // MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT
+ 0, // MOVEMENT_TYPE_JOG_IN_PLACE_DOWN
+ 0, // MOVEMENT_TYPE_JOG_IN_PLACE_UP
+ 0, // MOVEMENT_TYPE_JOG_IN_PLACE_LEFT
+ 0, // MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT
+ 0, // MOVEMENT_TYPE_RUN_IN_PLACE_DOWN
+ 0, // MOVEMENT_TYPE_RUN_IN_PLACE_UP
+ 0, // MOVEMENT_TYPE_RUN_IN_PLACE_LEFT
+ 0, // MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT
+ 0, // MOVEMENT_TYPE_INVISIBLE
+ 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN
+ 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP
+ 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT
+ 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT
+};
+
+const u8 gInitialMovementTypeFacingDirections[] = {
+ DIR_SOUTH, // MOVEMENT_TYPE_NONE
+ DIR_SOUTH, // MOVEMENT_TYPE_LOOK_AROUND
+ DIR_SOUTH, // MOVEMENT_TYPE_WANDER_AROUND
+ DIR_NORTH, // MOVEMENT_TYPE_WANDER_UP_AND_DOWN
+ DIR_SOUTH, // MOVEMENT_TYPE_WANDER_DOWN_AND_UP
+ DIR_WEST, // MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT
+ DIR_EAST, // MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT
+ DIR_NORTH, // MOVEMENT_TYPE_FACE_UP
+ DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN
+ DIR_WEST, // MOVEMENT_TYPE_FACE_LEFT
+ DIR_EAST, // MOVEMENT_TYPE_FACE_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_PLAYER
+ DIR_SOUTH, // MOVEMENT_TYPE_BERRY_TREE_GROWTH
+ DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_AND_UP
+ DIR_WEST, // MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT
+ DIR_NORTH, // MOVEMENT_TYPE_FACE_UP_AND_LEFT
+ DIR_NORTH, // MOVEMENT_TYPE_FACE_UP_AND_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_AND_LEFT
+ DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT
+ DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT
+ DIR_NORTH, // MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE
+ DIR_SOUTH, // MOVEMENT_TYPE_ROTATE_CLOCKWISE
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_UP_AND_DOWN
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_DOWN_AND_UP
+ DIR_WEST, // MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT
+ DIR_EAST, // MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN
+ DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT
+ DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN
+ DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT
+ DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT
+ DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT
+ DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP
+ DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT
+ DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT
+ DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP
+ DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT
+ DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN
+ DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP
+ DIR_NORTH, // MOVEMENT_TYPE_COPY_PLAYER
+ DIR_SOUTH, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE
+ DIR_WEST, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE
+ DIR_EAST, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE
+ DIR_SOUTH, // MOVEMENT_TYPE_TREE_DISGUISE
+ DIR_SOUTH, // MOVEMENT_TYPE_MOUNTAIN_DISGUISE
+ DIR_NORTH, // MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS
+ DIR_SOUTH, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS
+ DIR_WEST, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS
+ DIR_EAST, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS
+ DIR_SOUTH, // MOVEMENT_TYPE_HIDDEN
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_IN_PLACE_DOWN
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_IN_PLACE_UP
+ DIR_WEST, // MOVEMENT_TYPE_WALK_IN_PLACE_LEFT
+ DIR_EAST, // MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_JOG_IN_PLACE_DOWN
+ DIR_NORTH, // MOVEMENT_TYPE_JOG_IN_PLACE_UP
+ DIR_WEST, // MOVEMENT_TYPE_JOG_IN_PLACE_LEFT
+ DIR_EAST, // MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_RUN_IN_PLACE_DOWN
+ DIR_NORTH, // MOVEMENT_TYPE_RUN_IN_PLACE_UP
+ DIR_WEST, // MOVEMENT_TYPE_RUN_IN_PLACE_LEFT
+ DIR_EAST, // MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT
+ DIR_SOUTH, // MOVEMENT_TYPE_INVISIBLE
+ DIR_SOUTH, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN
+ DIR_NORTH, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP
+ DIR_WEST, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT
+ DIR_EAST, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT
+};
+
+#include "data/field_event_obj/event_object_graphics_info_pointers.h"
+#include "data/field_event_obj/field_effect_object_template_pointers.h"
+#include "data/field_event_obj/event_object_pic_tables.h"
+#include "data/field_event_obj/event_object_anims.h"
+#include "data/field_event_obj/base_oam.h"
+#include "data/field_event_obj/event_object_subsprites.h"
+#include "data/field_event_obj/event_object_graphics_info.h"
+
+const struct SpritePalette gUnknown_0850BBC8[] = {
+ {gEventObjectPalette0, 0x1103},
+ {gEventObjectPalette1, 0x1104},
+ {gEventObjectPalette2, 0x1105},
+ {gEventObjectPalette3, 0x1106},
+ {gEventObjectPalette4, 0x1107},
+ {gEventObjectPalette5, 0x1108},
+ {gEventObjectPalette6, 0x1109},
+ {gEventObjectPalette7, 0x110A},
+ {gEventObjectPalette8, 0x1100},
+ {gEventObjectPalette9, 0x1101},
+ {gEventObjectPalette10, 0x1102},
+ {gEventObjectPalette11, 0x1115},
+ {gEventObjectPalette12, 0x110B},
+ {gEventObjectPalette13, 0x110C},
+ {gEventObjectPalette14, 0x110D},
+ {gEventObjectPalette15, 0x110E},
+ {gEventObjectPalette16, 0x110F},
+ {gEventObjectPalette17, 0x1110},
+ {gEventObjectPalette18, 0x1111},
+ {gEventObjectPalette19, 0x1112},
+ {gEventObjectPalette20, 0x1113},
+ {gEventObjectPalette21, 0x1114},
+ {gEventObjectPalette22, 0x1116},
+ {gEventObjectPalette23, 0x1117},
+ {gEventObjectPalette24, 0x1118},
+ {gEventObjectPalette25, 0x1119},
+ {gEventObjectPalette26, 0x111B},
+ {gEventObjectPalette27, 0x111C},
+ {gEventObjectPalette28, 0x111D},
+ {gEventObjectPalette29, 0x111E},
+ {gEventObjectPalette30, 0x111F},
+ {gEventObjectPalette31, 0x1120},
+ {gEventObjectPalette32, 0x1121},
+ {gEventObjectPalette33, 0x1122},
+ {gEventObjectPalette34, 0x1123},
+ {NULL, 0x0000},
+};
+
+const u16 Unknown_0850BCE8[] = {
+ 0x1101,
+ 0x1101,
+ 0x1101,
+ 0x1101,
+};
+
+const u16 Unknown_0850BCF0[] = {
+ 0x1111,
+ 0x1111,
+ 0x1111,
+ 0x1111,
+};
+
+const u16 Unknown_0850BCF8[] = {
+ 0x1115,
+ 0x1115,
+ 0x1115,
+ 0x1115,
+};
+
+const struct PairedPalettes gUnknown_0850BD00[] = {
+ {0x1100, Unknown_0850BCE8},
+ {0x1110, Unknown_0850BCF0},
+ {0x1115, Unknown_0850BCF8},
+ {0x11FF, NULL},
+};
+
+const u16 Unknown_0850BD20[] = {
+ 0x110C,
+ 0x110C,
+ 0x110C,
+ 0x110C,
+};
+
+const u16 Unknown_0850BD28[] = {
+ 0x110D,
+ 0x110D,
+ 0x110D,
+ 0x110D,
+};
+
+const u16 Unknown_0850BD30[] = {
+ 0x110E,
+ 0x110E,
+ 0x110E,
+ 0x110E,
+};
+
+const u16 Unknown_0850BD38[] = {
+ 0x1112,
+ 0x1112,
+ 0x1112,
+ 0x1112,
+};
+
+const u16 Unknown_0850BD40[] = {
+ 0x1113,
+ 0x1113,
+ 0x1113,
+ 0x1113,
+};
+
+const u16 Unknown_0850BD48[] = {
+ 0x1114,
+ 0x1114,
+ 0x1114,
+ 0x1114,
+};
+
+const u16 Unknown_0850BD50[] = {
+ 0x111B,
+ 0x111B,
+ 0x111B,
+ 0x111B,
+};
+
+const u16 Unknown_0850BD58[] = {
+ 0x1117,
+ 0x1117,
+ 0x1117,
+ 0x1117,
+};
+
+const u16 Unknown_0850BD60[] = {
+ 0x1119,
+ 0x1119,
+ 0x1119,
+ 0x1119,
+};
+
+const u16 Unknown_0850BD68[] = {
+ 0x1109,
+ 0x1109,
+ 0x1109,
+ 0x1109,
+};
+
+const u16 Unknown_0850BD70[] = {
+ 0x111D,
+ 0x111D,
+ 0x111D,
+ 0x111D,
+};
+
+const struct PairedPalettes gUnknown_0850BD78[] = {
+ {4352, Unknown_0850BCE8},
+ {4368, Unknown_0850BCF0},
+ {4363, Unknown_0850BD20},
+ {4365, Unknown_0850BD28},
+ {4366, Unknown_0850BD30},
+ {4370, Unknown_0850BD38},
+ {4371, Unknown_0850BD40},
+ {4372, Unknown_0850BD48},
+ {4374, Unknown_0850BD58},
+ {4376, Unknown_0850BD60},
+ {4357, Unknown_0850BD68},
+ {4379, Unknown_0850BD50},
+ {4381, Unknown_0850BD70},
+ {4607, NULL},
+};
+
+const u16 gUnknown_0850BDE8[] = {
+ 0x1100,
+ 0x1101,
+ 0x1103,
+ 0x1104,
+ 0x1105,
+ 0x1106,
+ 0x1107,
+ 0x1108,
+ 0x1109,
+ 0x110A,
+};
+
+const u16 gUnknown_0850BDFC[] = {
+ 0x1100,
+ 0x1101,
+ 0x1103,
+ 0x1104,
+ 0x1105,
+ 0x1106,
+ 0x1107,
+ 0x1108,
+ 0x1109,
+ 0x110A,
+};
+
+const u16 gUnknown_0850BE10[] = {
+ 0x1100,
+ 0x1101,
+ 0x1103,
+ 0x1104,
+ 0x1105,
+ 0x1106,
+ 0x1107,
+ 0x1108,
+ 0x1109,
+ 0x110A,
+};
+
+const u16 gUnknown_0850BE24[] = {
+ 0x1100,
+ 0x1101,
+ 0x1103,
+ 0x1104,
+ 0x1105,
+ 0x1106,
+ 0x1107,
+ 0x1108,
+ 0x1109,
+ 0x110A,
+};
+
+
+const u16 *const gUnknown_0850BE38[] = {
+ gUnknown_0850BDE8,
+ gUnknown_0850BDFC,
+ gUnknown_0850BE10,
+ gUnknown_0850BE24,
+};
+
+#include "data/field_event_obj/berry_tree_graphics_tables.h"
+#include "data/field_event_obj/field_effect_objects.h"
+
+const s16 gMovementDelaysMedium[] = {32, 64, 96, 128};
+const s16 gMovementDelaysLong[] = {32, 64, 128, 192};
+const s16 gMovementDelaysShort[] = {32, 48, 64, 80};
+
+#include "data/field_event_obj/movement_type_func_tables.h"
+
+const u8 gFaceDirectionAnimNums[] = {
+ 0, // DIR_NONE
+ 0, // DIR_SOUTH
+ 1, // DIR_NORTH
+ 2, // DIR_WEST
+ 3, // DIR_EAST
+ 0, // DIR_SOUTHWEST
+ 0, // DIR_SOUTHEAST
+ 1, // DIR_NORTHWEST
+ 1, // DIR_NORTHEAST
+};
+const u8 gMoveDirectionAnimNums[] = {
+ 4, // DIR_NONE
+ 4, // DIR_SOUTH
+ 5, // DIR_NORTH
+ 6, // DIR_WEST
+ 7, // DIR_EAST
+ 4, // DIR_SOUTHWEST
+ 4, // DIR_SOUTHEAST
+ 5, // DIR_NORTHWEST
+ 5, // DIR_NORTHEAST
+};
+const u8 gMoveDirectionFastAnimNums[] = {
+ 8, // DIR_NONE
+ 8, // DIR_SOUTH
+ 9, // DIR_NORTH
+ 10, // DIR_WEST
+ 11, // DIR_EAST
+ 8, // DIR_SOUTHWEST
+ 8, // DIR_SOUTHEAST
+ 9, // DIR_NORTHWEST
+ 9, // DIR_NORTHEAST
+};
+const u8 gMoveDirectionFasterAnimNums[] = {
+ 12, // DIR_NONE
+ 12, // DIR_SOUTH
+ 13, // DIR_NORTH
+ 14, // DIR_WEST
+ 15, // DIR_EAST
+ 12, // DIR_SOUTHWEST
+ 12, // DIR_SOUTHEAST
+ 13, // DIR_NORTHWEST
+ 13, // DIR_NORTHEAST
+};
+const u8 gMoveDirectionFastestAnimNums[] = {
+ 16, // DIR_NONE
+ 16, // DIR_SOUTH
+ 17, // DIR_NORTH
+ 18, // DIR_WEST
+ 19, // DIR_EAST
+ 16, // DIR_SOUTHWEST
+ 16, // DIR_SOUTHEAST
+ 17, // DIR_NORTHWEST
+ 17, // DIR_NORTHEAST
+};
+const u8 gJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon
+ 20, // DIR_NONE
+ 20, // DIR_SOUTH
+ 21, // DIR_NORTH
+ 22, // DIR_WEST
+ 23, // DIR_EAST
+ 20, // DIR_SOUTHWEST
+ 20, // DIR_SOUTHEAST
+ 21, // DIR_NORTHWEST
+ 21, // DIR_NORTHEAST
+};
+const u8 gAcroWheelieDirectionAnimNums[] = {
+ 20, // DIR_NONE
+ 20, // DIR_SOUTH
+ 21, // DIR_NORTH
+ 22, // DIR_WEST
+ 23, // DIR_EAST
+ 20, // DIR_SOUTHWEST
+ 20, // DIR_SOUTHEAST
+ 21, // DIR_NORTHWEST
+ 21, // DIR_NORTHEAST
+};
+const u8 gUnrefAnimNums_08375633[] = {
+ 24, // DIR_NONE
+ 24, // DIR_SOUTH
+ 25, // DIR_NORTH
+ 26, // DIR_WEST
+ 27, // DIR_EAST
+ 24, // DIR_SOUTHWEST
+ 24, // DIR_SOUTHEAST
+ 25, // DIR_NORTHWEST
+ 25, // DIR_NORTHEAST
+};
+const u8 gAcroEndWheelieDirectionAnimNums[] = {
+ 28, // DIR_NONE
+ 28, // DIR_SOUTH
+ 29, // DIR_NORTH
+ 30, // DIR_WEST
+ 31, // DIR_EAST
+ 28, // DIR_SOUTHWEST
+ 28, // DIR_SOUTHEAST
+ 29, // DIR_NORTHWEST
+ 29, // DIR_NORTHEAST
+};
+const u8 gAcroUnusedActionDirectionAnimNums[] = {
+ 32, // DIR_NONE
+ 32, // DIR_SOUTH
+ 33, // DIR_NORTH
+ 34, // DIR_WEST
+ 35, // DIR_EAST
+ 32, // DIR_SOUTHWEST
+ 32, // DIR_SOUTHEAST
+ 33, // DIR_NORTHWEST
+ 33, // DIR_NORTHEAST
+};
+const u8 gAcroWheeliePedalDirectionAnimNums[] = {
+ 36, // DIR_NONE
+ 36, // DIR_SOUTH
+ 37, // DIR_NORTH
+ 38, // DIR_WEST
+ 39, // DIR_EAST
+ 36, // DIR_SOUTHWEST
+ 36, // DIR_SOUTHEAST
+ 37, // DIR_NORTHWEST
+ 37, // DIR_NORTHEAST
+};
+const u8 gFishingDirectionAnimNums[] = {
+ 0, // DIR_NONE
+ 0, // DIR_SOUTH
+ 1, // DIR_NORTH
+ 2, // DIR_WEST
+ 3, // DIR_EAST
+ 0, // DIR_SOUTHWEST
+ 0, // DIR_SOUTHEAST
+ 1, // DIR_NORTHWEST
+ 1, // DIR_NORTHEAST
+};
+const u8 gFishingNoCatchDirectionAnimNums[] = {
+ 4, // DIR_NONE
+ 4, // DIR_SOUTH
+ 5, // DIR_NORTH
+ 6, // DIR_WEST
+ 7, // DIR_EAST
+ 4, // DIR_SOUTHWEST
+ 4, // DIR_SOUTHEAST
+ 5, // DIR_NORTHWEST
+ 5, // DIR_NORTHEAST
+};
+const u8 gFishingBiteDirectionAnimNums[] = {
+ 8, // DIR_NONE
+ 8, // DIR_SOUTH
+ 9, // DIR_NORTH
+ 10, // DIR_WEST
+ 11, // DIR_EAST
+ 8, // DIR_SOUTHWEST
+ 8, // DIR_SOUTHEAST
+ 9, // DIR_NORTHWEST
+ 9, // DIR_NORTHEAST
+};
+const u8 gRunningDirectionAnimNums[] = {
+ 20, // DIR_NONE
+ 20, // DIR_SOUTH
+ 21, // DIR_NORTH
+ 22, // DIR_WEST
+ 23, // DIR_EAST
+ 20, // DIR_SOUTHWEST
+ 20, // DIR_SOUTHEAST
+ 21, // DIR_NORTHWEST
+ 21, // DIR_NORTHEAST
+};
+
+const u8 gTrainerFacingDirectionMovementTypes[] = {
+ MOVEMENT_TYPE_FACE_DOWN, // DIR_NONE
+ MOVEMENT_TYPE_FACE_DOWN, // DIR_SOUTH
+ MOVEMENT_TYPE_FACE_UP, // DIR_NORTH
+ MOVEMENT_TYPE_FACE_LEFT, // DIR_WEST
+ MOVEMENT_TYPE_FACE_RIGHT, // DIR_EAST
+ MOVEMENT_TYPE_FACE_DOWN, // DIR_SOUTHWEST
+ MOVEMENT_TYPE_FACE_DOWN, // DIR_SOUTHEAST
+ MOVEMENT_TYPE_FACE_UP, // DIR_NORTHWEST
+ MOVEMENT_TYPE_FACE_UP, // DIR_NORTHEAST
+};
+
+bool8 (*const gOppositeDirectionBlockedMetatileFuncs[])(u8) = {
+ MetatileBehavior_IsSouthBlocked,
+ MetatileBehavior_IsNorthBlocked,
+ MetatileBehavior_IsWestBlocked,
+ MetatileBehavior_IsEastBlocked
+};
+
+bool8 (*const gDirectionBlockedMetatileFuncs[])(u8) = {
+ MetatileBehavior_IsNorthBlocked,
+ MetatileBehavior_IsSouthBlocked,
+ MetatileBehavior_IsEastBlocked,
+ MetatileBehavior_IsWestBlocked
+};
+
+const struct Coords16 gDirectionToVectors[] = {
+ { 0, 0},
+ { 0, 1},
+ { 0, -1},
+ {-1, 0},
+ { 1, 0},
+ {-1, 1},
+ { 1, 1},
+ {-1, -1},
+ { 1, -1}
+};
+
+const u8 gFaceDirectionMovementActions[] = {
+ MOVEMENT_ACTION_FACE_DOWN,
+ MOVEMENT_ACTION_FACE_DOWN,
+ MOVEMENT_ACTION_FACE_UP,
+ MOVEMENT_ACTION_FACE_LEFT,
+ MOVEMENT_ACTION_FACE_RIGHT,
+};
+const u8 gWalkSlowMovementActions[] = {
+ MOVEMENT_ACTION_WALK_SLOW_DOWN,
+ MOVEMENT_ACTION_WALK_SLOW_DOWN,
+ MOVEMENT_ACTION_WALK_SLOW_UP,
+ MOVEMENT_ACTION_WALK_SLOW_LEFT,
+ MOVEMENT_ACTION_WALK_SLOW_RIGHT,
+};
+const u8 gWalkNormalMovementActions[] = {
+ MOVEMENT_ACTION_WALK_NORMAL_DOWN,
+ MOVEMENT_ACTION_WALK_NORMAL_DOWN,
+ MOVEMENT_ACTION_WALK_NORMAL_UP,
+ MOVEMENT_ACTION_WALK_NORMAL_LEFT,
+ MOVEMENT_ACTION_WALK_NORMAL_RIGHT,
+};
+const u8 gWalkFastMovementActions[] = {
+ MOVEMENT_ACTION_WALK_FAST_DOWN,
+ MOVEMENT_ACTION_WALK_FAST_DOWN,
+ MOVEMENT_ACTION_WALK_FAST_UP,
+ MOVEMENT_ACTION_WALK_FAST_LEFT,
+ MOVEMENT_ACTION_WALK_FAST_RIGHT,
+};
+const u8 gRideWaterCurrentMovementActions[] = {
+ MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN,
+ MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN,
+ MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP,
+ MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT,
+ MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT,
+};
+const u8 gWalkFastestMovementActions[] = {
+ MOVEMENT_ACTION_WALK_FASTEST_DOWN,
+ MOVEMENT_ACTION_WALK_FASTEST_DOWN,
+ MOVEMENT_ACTION_WALK_FASTEST_UP,
+ MOVEMENT_ACTION_WALK_FASTEST_LEFT,
+ MOVEMENT_ACTION_WALK_FASTEST_RIGHT,
+};
+const u8 gSlideMovementActions[] = {
+ MOVEMENT_ACTION_SLIDE_DOWN,
+ MOVEMENT_ACTION_SLIDE_DOWN,
+ MOVEMENT_ACTION_SLIDE_UP,
+ MOVEMENT_ACTION_SLIDE_LEFT,
+ MOVEMENT_ACTION_SLIDE_RIGHT,
+};
+const u8 gPlayerRunMovementActions[] = {
+ MOVEMENT_ACTION_PLAYER_RUN_DOWN,
+ MOVEMENT_ACTION_PLAYER_RUN_DOWN,
+ MOVEMENT_ACTION_PLAYER_RUN_UP,
+ MOVEMENT_ACTION_PLAYER_RUN_LEFT,
+ MOVEMENT_ACTION_PLAYER_RUN_RIGHT,
+};
+const u8 gJump2MovementActions[] = {
+ MOVEMENT_ACTION_JUMP_2_DOWN,
+ MOVEMENT_ACTION_JUMP_2_DOWN,
+ MOVEMENT_ACTION_JUMP_2_UP,
+ MOVEMENT_ACTION_JUMP_2_LEFT,
+ MOVEMENT_ACTION_JUMP_2_RIGHT,
+};
+const u8 gJumpInPlaceMovementActions[] = {
+ MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_UP,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT,
+};
+const u8 gJumpInPlaceTurnAroundMovementActions[] = {
+ MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT,
+ MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT,
+};
+const u8 gJumpMovementActions[] = {
+ MOVEMENT_ACTION_JUMP_DOWN,
+ MOVEMENT_ACTION_JUMP_DOWN,
+ MOVEMENT_ACTION_JUMP_UP,
+ MOVEMENT_ACTION_JUMP_LEFT,
+ MOVEMENT_ACTION_JUMP_RIGHT,
+};
+const u8 gJumpSpecialMovementActions[] = {
+ MOVEMENT_ACTION_JUMP_SPECIAL_DOWN,
+ MOVEMENT_ACTION_JUMP_SPECIAL_DOWN,
+ MOVEMENT_ACTION_JUMP_SPECIAL_UP,
+ MOVEMENT_ACTION_JUMP_SPECIAL_LEFT,
+ MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT,
+};
+const u8 gWalkInPlaceSlowMovementActions[] = {
+ MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP,
+ MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT,
+ MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT,
+};
+const u8 gWalkInPlaceNormalMovementActions[] = {
+ MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP,
+ MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT,
+ MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT,
+};
+const u8 gWalkInPlaceFastMovementActions[] = {
+ MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT,
+};
+const u8 gWalkInPlaceFastestMovementActions[] = {
+ MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_UP,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT,
+ MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT,
+};
+const u8 gAcroWheelieFaceDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP,
+ MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT,
+ MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT,
+};
+const u8 gAcroPopWheelieFaceDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT,
+};
+const u8 gAcroEndWheelieFaceDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT,
+};
+const u8 gAcroWheelieHopFaceDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT,
+};
+const u8 gAcroWheelieHopDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT,
+ MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT,
+};
+const u8 gAcroWheelieJumpDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP,
+ MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT,
+ MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT,
+};
+const u8 gAcroWheelieInPlaceDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP,
+ MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT,
+ MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT,
+};
+const u8 gAcroPopWheelieMoveDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT,
+ MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT,
+};
+const u8 gAcroWheelieMoveDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN,
+ MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP,
+ MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT,
+ MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT,
+};
+const u8 gAcroEndWheelieMoveDirectionMovementActions[] = {
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT,
+ MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT,
+};
+
+const u8 gOppositeDirections[] = {
+ DIR_NORTH,
+ DIR_SOUTH,
+ DIR_EAST,
+ DIR_WEST,
+ DIR_NORTHEAST,
+ DIR_NORTHWEST,
+ DIR_SOUTHEAST,
+ DIR_SOUTHWEST,
+};
+
+const u8 gUnknown_0850DC2F[][4] = {
+ {2, 1, 4, 3},
+ {1, 2, 3, 4},
+ {3, 4, 2, 1},
+ {4, 3, 1, 2}
+};
+
+const u8 gUnknown_0850DC3F[][4] = {
+ {2, 1, 4, 3},
+ {1, 2, 3, 4},
+ {4, 3, 1, 2},
+ {3, 4, 2, 1}
+};
+
+#include "data/field_event_obj/movement_action_func_tables.h"
+
+// Code
+
+static void ClearEventObject(struct EventObject *eventObject)
+{
+ *eventObject = (struct EventObject){};
+ eventObject->localId = 0xFF;
+ eventObject->mapNum = 0xFF;
+ eventObject->mapGroup = 0xFF;
+ eventObject->movementActionId = 0xFF;
+}
+
+static void ClearAllEventObjects(void)
+{
+ u8 i;
+
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ ClearEventObject(&gEventObjects[i]);
+}
+
+void sub_808D438(void)
+{
+ ClearLinkPlayerEventObjects();
+ ClearAllEventObjects();
+ ClearPlayerAvatarInfo();
+ sub_808D450();
+}
+
+static void sub_808D450(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31);
+ gSprites[spriteId].oam.affineMode = 1;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ gSprites[spriteId].invisible = 1;
+
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31);
+ gSprites[spriteId].oam.affineMode = 1;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], 1);
+ gSprites[spriteId].invisible = 1;
+}
+
+u8 GetFirstInactiveEventObjectId(void)
+{
+ u8 i;
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (!gEventObjects[i].active)
+ break;
+ }
+
+ return i;
+}
+
+u8 GetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId)
+{
+ if (localId < 0xff)
+ {
+ return GetEventObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId);
+ }
+ return GetEventObjectIdByLocalId(localId);
+}
+
+bool8 TryGetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u8 *eventObjectId)
+{
+ *eventObjectId = GetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroupId);
+ if (*eventObjectId == NUM_EVENT_OBJECTS)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 GetEventObjectIdByXY(s16 x, s16 y)
+{
+ u8 i;
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (gEventObjects[i].active && gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y)
+ break;
+ }
+
+ return i;
+}
+
+static u8 GetEventObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroupId)
+{
+ u8 i;
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroupId)
+ return i;
+ }
+
+ return NUM_EVENT_OBJECTS;
+}
+
+static u8 GetEventObjectIdByLocalId(u8 localId)
+{
+ u8 i;
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (gEventObjects[i].active && gEventObjects[i].localId == localId)
+ return i;
+ }
+
+ return NUM_EVENT_OBJECTS;
+}
+
+// This function has the same nonmatching quirk as in Ruby/Sapphire.
+#ifdef NONMATCHING
+static u8 InitEventObjectStateFromTemplate(struct EventObjectTemplate *template, u8 mapNum, u8 mapGroup)
+{
+ struct EventObject *eventObject;
+ u8 eventObjectId;
+ s16 x;
+ s16 y;
+
+ // mapNum and mapGroup are in the wrong registers (r7/r6 instead of r6/r7)
+ if (GetAvailableEventObjectId(template->localId, mapNum, mapGroup, &eventObjectId))
+ {
+ return NUM_EVENT_OBJECTS;
+ }
+ eventObject = &gEventObjects[eventObjectId];
+ ClearEventObject(eventObject);
+ x = template->x + 7;
+ y = template->y + 7;
+ eventObject->active = TRUE;
+ eventObject->triggerGroundEffectsOnMove = TRUE;
+ eventObject->graphicsId = template->graphicsId;
+ eventObject->movementType = template->movementType;
+ eventObject->localId = template->localId;
+ eventObject->mapNum = mapNum;
+ eventObject->mapGroup = mapGroup;
+ eventObject->initialCoords.x = x;
+ eventObject->initialCoords.y = y;
+ eventObject->currentCoords.x = x;
+ eventObject->currentCoords.y = y;
+ eventObject->previousCoords.x = x;
+ eventObject->previousCoords.y = y;
+ eventObject->currentElevation = template->elevation;
+ eventObject->previousElevation = template->elevation;
+ // For some reason, 0x0F is placed in r9, to be used later
+ eventObject->range.as_nybbles.x = template->movementRangeX;
+ eventObject->range.as_nybbles.y = template->movementRangeY;
+ eventObject->trainerType = template->trainerType;
+ eventObject->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
+ eventObject->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType];
+ SetEventObjectDirection(eventObject, eventObject->previousMovementDirection);
+ SetEventObjectDynamicGraphicsId(eventObject);
+
+ if (gRangedMovementTypes[eventObject->movementType])
+ {
+ if ((eventObject->range.as_nybbles.x) == 0)
+ {
+ // r9 is invoked here
+ eventObject->range.as_nybbles.x++;
+ }
+ if ((eventObject->range.as_nybbles.y) == 0)
+ {
+ eventObject->range.as_nybbles.y++;
+ }
+ }
+ return eventObjectId;
+}
+#else
+static NAKED u8 InitEventObjectStateFromTemplate(struct EventObjectTemplate *template, u8 mapId, u8 mapGroupId)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r9\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6,r7}\n"
+ "\tsub sp, 0x4\n"
+ "\tadds r5, r0, 0\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r6, r1, 24\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r7, r2, 24\n"
+ "\tldrb r0, [r5]\n"
+ "\tadds r1, r6, 0\n"
+ "\tadds r2, r7, 0\n"
+ "\tmov r3, sp\n"
+ "\tbl GetAvailableEventObjectId\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0808D66E\n"
+ "\tmovs r0, 0x10\n"
+ "\tb _0808D762\n"
+ "_0808D66E:\n"
+ "\tmov r0, sp\n"
+ "\tldrb r1, [r0]\n"
+ "\tlsls r0, r1, 3\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, =gEventObjects\n"
+ "\tadds r4, r0, r1\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl ClearEventObject\n"
+ "\tldrh r3, [r5, 0x4]\n"
+ "\tadds r3, 0x7\n"
+ "\tlsls r3, 16\n"
+ "\tlsrs r3, 16\n"
+ "\tldrh r2, [r5, 0x6]\n"
+ "\tadds r2, 0x7\n"
+ "\tlsls r2, 16\n"
+ "\tlsrs r2, 16\n"
+ "\tldrb r0, [r4]\n"
+ "\tmovs r1, 0x1\n"
+ "\torrs r0, r1\n"
+ "\tmovs r1, 0x4\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r4]\n"
+ "\tldrb r0, [r5, 0x1]\n"
+ "\tstrb r0, [r4, 0x5]\n"
+ "\tldrb r0, [r5, 0x9]\n"
+ "\tstrb r0, [r4, 0x6]\n"
+ "\tldrb r0, [r5]\n"
+ "\tstrb r0, [r4, 0x8]\n"
+ "\tstrb r6, [r4, 0x9]\n"
+ "\tstrb r7, [r4, 0xA]\n"
+ "\tstrh r3, [r4, 0xC]\n"
+ "\tstrh r2, [r4, 0xE]\n"
+ "\tstrh r3, [r4, 0x10]\n"
+ "\tstrh r2, [r4, 0x12]\n"
+ "\tstrh r3, [r4, 0x14]\n"
+ "\tstrh r2, [r4, 0x16]\n"
+ "\tldrb r0, [r5, 0x8]\n"
+ "\tmovs r7, 0xF\n"
+ "\tadds r1, r7, 0\n"
+ "\tands r1, r0\n"
+ "\tldrb r2, [r4, 0xB]\n"
+ "\tmovs r0, 0x10\n"
+ "\tnegs r0, r0\n"
+ "\tmov r8, r0\n"
+ "\tands r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r4, 0xB]\n"
+ "\tldrb r1, [r5, 0x8]\n"
+ "\tlsls r1, 4\n"
+ "\tands r0, r7\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r4, 0xB]\n"
+ "\tldrb r1, [r5, 0xA]\n"
+ "\tlsls r1, 28\n"
+ "\tmovs r0, 0xF\n"
+ "\tmov r9, r0\n"
+ "\tlsrs r1, 28\n"
+ "\tldrb r2, [r4, 0x19]\n"
+ "\tmov r0, r8\n"
+ "\tands r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r4, 0x19]\n"
+ "\tldrb r1, [r5, 0xA]\n"
+ "\tlsrs r1, 4\n"
+ "\tlsls r1, 4\n"
+ "\tands r0, r7\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r4, 0x19]\n"
+ "\tldrh r0, [r5, 0xC]\n"
+ "\tstrb r0, [r4, 0x7]\n"
+ "\tldrh r0, [r5, 0xE]\n"
+ "\tstrb r0, [r4, 0x1D]\n"
+ "\tldr r1, =gInitialMovementTypeFacingDirections\n"
+ "\tldrb r0, [r5, 0x9]\n"
+ "\tadds r0, r1\n"
+ "\tldrb r1, [r0]\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r0, 0x20\n"
+ "\tstrb r1, [r0]\n"
+ "\tldrb r1, [r0]\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl SetEventObjectDirection\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl SetEventObjectDynamicGraphicsId\n"
+ "\tldr r1, =gRangedMovementTypes\n"
+ "\tldrb r0, [r4, 0x6]\n"
+ "\tadds r0, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0808D75E\n"
+ "\tldrb r2, [r4, 0x19]\n"
+ "\tadds r0, r7, 0\n"
+ "\tands r0, r2\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0808D746\n"
+ "\tlsls r0, r2, 28\n"
+ "\tlsrs r0, 28\n"
+ "\tadds r0, 0x1\n"
+ "\tmov r1, r9\n"
+ "\tands r0, r1\n"
+ "\tmov r1, r8\n"
+ "\tands r1, r2\n"
+ "\torrs r1, r0\n"
+ "\tstrb r1, [r4, 0x19]\n"
+ "_0808D746:\n"
+ "\tldrb r2, [r4, 0x19]\n"
+ "\tmovs r0, 0xF0\n"
+ "\tands r0, r2\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0808D75E\n"
+ "\tlsrs r1, r2, 4\n"
+ "\tadds r1, 0x1\n"
+ "\tlsls r1, 4\n"
+ "\tadds r0, r7, 0\n"
+ "\tands r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r4, 0x19]\n"
+ "_0808D75E:\n"
+ "\tmov r0, sp\n"
+ "\tldrb r0, [r0]\n"
+ "_0808D762:\n"
+ "\tadd sp, 0x4\n"
+ "\tpop {r3,r4}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r1}\n"
+ "\tbx r1\n"
+ ".pool");
+}
+#endif
+
+u8 Unref_TryInitLocalEventObject(u8 localId)
+{
+ u8 i;
+ u8 nObjects;
+ struct EventObjectTemplate *template;
+
+ if (gMapHeader.events != NULL)
+ {
+ if (InBattlePyramid())
+ {
+ nObjects = sub_81AAA40();
+ }
+ else if (InTrainerHill())
+ {
+ nObjects = 2;
+ }
+ else
+ {
+ nObjects = gMapHeader.events->eventObjectCount;
+ }
+ for (i = 0; i < nObjects; i++)
+ {
+ template = &gSaveBlock1Ptr->eventObjectTemplates[i];
+ if (template->localId == localId && !FlagGet(template->flagId))
+ {
+ return InitEventObjectStateFromTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ }
+ }
+ }
+ return NUM_EVENT_OBJECTS;
+}
+
+static bool8 GetAvailableEventObjectId(u16 localId, u8 mapNum, u8 mapGroup, u8 *eventObjectId)
+// Looks for an empty slot.
+// Returns FALSE and the location of the available slot
+// in *eventObjectId.
+// If no slots are available, or if the object is already
+// loaded, returns TRUE.
+{
+ u8 i = 0;
+
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (!gEventObjects[i].active)
+ break;
+ if (gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup)
+ return TRUE;
+ }
+ if (i >= NUM_EVENT_OBJECTS)
+ return TRUE;
+ *eventObjectId = i;
+ do
+ {
+ if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup)
+ return TRUE;
+ i++;
+ } while (i < NUM_EVENT_OBJECTS);
+ return FALSE;
+}
+
+static void RemoveEventObject(struct EventObject *eventObject)
+{
+ eventObject->active = FALSE;
+ RemoveEventObjectInternal(eventObject);
+}
+
+void RemoveEventObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 eventObjectId;
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ FlagSet(GetEventObjectFlagIdByEventObjectId(eventObjectId));
+ RemoveEventObject(&gEventObjects[eventObjectId]);
+ }
+}
+
+static void RemoveEventObjectInternal(struct EventObject *eventObject)
+{
+ struct SpriteFrameImage image;
+ image.size = GetEventObjectGraphicsInfo(eventObject->graphicsId)->size;
+ gSprites[eventObject->spriteId].images = &image;
+ DestroySprite(&gSprites[eventObject->spriteId]);
+}
+
+void RemoveAllEventObjectsExceptPlayer(void)
+{
+ u8 i;
+
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (i != gPlayerAvatar.eventObjectId)
+ RemoveEventObject(&gEventObjects[i]);
+ }
+}
+
+static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjectTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
+{
+ struct EventObject *eventObject;
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+ struct Sprite *sprite;
+ u8 eventObjectId;
+ u8 paletteSlot;
+ u8 spriteId;
+
+ eventObjectId = InitEventObjectStateFromTemplate(eventObjectTemplate, mapNum, mapGroup);
+ if (eventObjectId == NUM_EVENT_OBJECTS)
+ return NUM_EVENT_OBJECTS;
+
+ eventObject = &gEventObjects[eventObjectId];
+ graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
+ paletteSlot = graphicsInfo->paletteSlot;
+ if (paletteSlot == 0)
+ {
+ npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, 0);
+ }
+ else if (paletteSlot == 10)
+ {
+ npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, 10);
+ }
+ else if (paletteSlot >= 16)
+ {
+ paletteSlot -= 16;
+ sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
+ }
+ if (eventObject->movementType == 0x4c)
+ {
+ eventObject->invisible = TRUE;
+ }
+ *(u16 *)&spriteTemplate->paletteTag = 0xFFFF;
+ spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
+ if (spriteId == MAX_SPRITES)
+ {
+ gEventObjects[eventObjectId].active = FALSE;
+ return NUM_EVENT_OBJECTS;
+ }
+ sprite = &gSprites[spriteId];
+ sub_8092FF0(eventObject->currentCoords.x + cameraX, eventObject->currentCoords.y + cameraY, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
+ sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ sprite->oam.paletteNum = paletteSlot;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[0] = eventObjectId;
+ eventObject->spriteId = spriteId;
+ eventObject->inanimate = graphicsInfo->inanimate;
+ if (!eventObject->inanimate)
+ {
+ StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObject->facingDirection));
+ }
+ SetObjectSubpriorityByZCoord(eventObject->previousElevation, sprite, 1);
+ UpdateEventObjectVisibility(eventObject, sprite);
+ return eventObjectId;
+}
+
+static u8 TrySpawnEventObject(struct EventObjectTemplate *eventObjectTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
+{
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+ struct SpriteTemplate spriteTemplate;
+ const struct SubspriteTable *subspriteTables;
+ struct SpriteFrameImage spriteFrameImage;
+ u8 eventObjectId;
+
+ subspriteTables = NULL;
+ graphicsInfo = GetEventObjectGraphicsInfo(eventObjectTemplate->graphicsId);
+ MakeObjectTemplateFromEventObjectTemplate(eventObjectTemplate, &spriteTemplate, &subspriteTables);
+ spriteFrameImage.size = graphicsInfo->size;
+ spriteTemplate.images = &spriteFrameImage;
+ eventObjectId = TrySetupEventObjectSprite(eventObjectTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY);
+ if (eventObjectId == NUM_EVENT_OBJECTS)
+ {
+ return NUM_EVENT_OBJECTS;
+ }
+ gSprites[gEventObjects[eventObjectId].spriteId].images = graphicsInfo->images;
+ if (subspriteTables != NULL)
+ {
+ SetSubspriteTables(&gSprites[gEventObjects[eventObjectId].spriteId], subspriteTables);
+ }
+ return eventObjectId;
+}
+
+u8 SpawnSpecialEventObject(struct EventObjectTemplate *eventObjectTemplate)
+{
+ s16 cameraX;
+ s16 cameraY;
+
+ GetEventObjectMovingCameraOffset(&cameraX, &cameraY);
+ return TrySpawnEventObject(eventObjectTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);
+}
+
+u8 SpawnSpecialEventObjectParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z)
+{
+ struct EventObjectTemplate eventObjectTemplate;
+
+ x -= 7;
+ y -= 7;
+ eventObjectTemplate.localId = localId;
+ eventObjectTemplate.graphicsId = graphicsId;
+ eventObjectTemplate.unk2 = 0;
+ eventObjectTemplate.x = x;
+ eventObjectTemplate.y = y;
+ eventObjectTemplate.elevation = z;
+ eventObjectTemplate.movementType = movementBehavior;
+ eventObjectTemplate.movementRangeX = 0;
+ eventObjectTemplate.movementRangeY = 0;
+ eventObjectTemplate.trainerType = 0;
+ eventObjectTemplate.trainerRange_berryTreeId = 0;
+ return SpawnSpecialEventObject(&eventObjectTemplate);
+}
+
+u8 show_sprite(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ struct EventObjectTemplate *eventObjectTemplate;
+ s16 cameraX;
+ s16 cameraY;
+
+ eventObjectTemplate = GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup);
+ if (eventObjectTemplate == NULL)
+ {
+ return NUM_EVENT_OBJECTS;
+ }
+ GetEventObjectMovingCameraOffset(&cameraX, &cameraY);
+ return TrySpawnEventObject(eventObjectTemplate, mapNum, mapGroup, cameraX, cameraY);
+}
+
+static void MakeObjectTemplateFromEventObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables)
+{
+ const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(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;
+}
+
+static void MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables)
+{
+ MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, sMovementTypeCallbacks[callbackIndex], sprTemplate, subspriteTables);
+}
+
+static void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *eventObjectTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)
+{
+ MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(eventObjectTemplate->graphicsId, eventObjectTemplate->movementType, spriteTemplate, subspriteTables);
+}
+
+u8 AddPseudoEventObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority)
+{
+ struct SpriteTemplate *spriteTemplate;
+ const struct SubspriteTable *subspriteTables;
+ struct Sprite *sprite;
+ u8 spriteIdx;
+
+ spriteTemplate = malloc(sizeof(struct SpriteTemplate));
+ MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, callback, spriteTemplate, &subspriteTables);
+ if (spriteTemplate->paletteTag != 0xffff)
+ {
+ sub_808E894(spriteTemplate->paletteTag);
+ }
+ spriteIdx = CreateSprite(spriteTemplate, x, y, subpriority);
+ free(spriteTemplate);
+
+ if (spriteIdx != MAX_SPRITES && subspriteTables != NULL)
+ {
+ sprite = &gSprites[spriteIdx];
+ SetSubspriteTables(sprite, subspriteTables);
+ sprite->subspriteMode = 2;
+ }
+ return spriteIdx;
+}
+
+u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction)
+{
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+ struct SpriteTemplate spriteTemplate;
+ const struct SubspriteTable *subspriteTables;
+ u8 spriteId;
+ struct Sprite *sprite;
+
+ graphicsInfo = GetEventObjectGraphicsInfo(graphicsId);
+ MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, UpdateEventObjectSpriteSubpriorityAndVisibility, &spriteTemplate, &subspriteTables);
+ *(u16 *)&spriteTemplate.paletteTag = 0xffff;
+ x += 7;
+ y += 7;
+ sub_80930E0(&x, &y, 8, 16);
+ spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
+ sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
+ sprite->pos1.y += sprite->centerToCornerVecY;
+ sprite->oam.paletteNum = graphicsInfo->paletteSlot;
+ if (sprite->oam.paletteNum >= 16)
+ {
+ sprite->oam.paletteNum -= 16;
+ }
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[0] = a1;
+ sprite->data[1] = z;
+ if (graphicsInfo->paletteSlot == 10)
+ {
+ npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
+ }
+ else if (graphicsInfo->paletteSlot >= 16)
+ {
+ sub_808EAB0(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot | 0xf0);
+ }
+ if (subspriteTables != NULL)
+ {
+ SetSubspriteTables(sprite, subspriteTables);
+ sprite->subspriteMode = 2;
+ }
+ InitObjectPriorityByZCoord(sprite, z);
+ SetObjectSubpriorityByZCoord(z, sprite, 1);
+ StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction));
+ }
+ return spriteId;
+}
+
+void TrySpawnEventObjects(s16 cameraX, s16 cameraY)
+{
+ u8 i;
+ s16 left;
+ s16 right;
+ s16 top;
+ s16 bottom;
+ u8 objectCount;
+ s16 npcX;
+ s16 npcY;
+
+ if (gMapHeader.events != NULL)
+ {
+ left = gSaveBlock1Ptr->pos.x - 2;
+ right = gSaveBlock1Ptr->pos.x + 17;
+ top = gSaveBlock1Ptr->pos.y;
+ bottom = gSaveBlock1Ptr->pos.y + 16;
+
+ if (InBattlePyramid())
+ {
+ objectCount = sub_81AAA40();
+ }
+ else if (InTrainerHill())
+ {
+ objectCount = 2;
+ }
+ else
+ {
+ objectCount = gMapHeader.events->eventObjectCount;
+ }
+
+ for (i = 0; i < objectCount; i++)
+ {
+ struct EventObjectTemplate *template = &gSaveBlock1Ptr->eventObjectTemplates[i];
+ npcX = template->x + 7;
+ npcY = template->y + 7;
+
+ if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX
+ && !FlagGet(template->flagId))
+ TrySpawnEventObject(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);
+ }
+ }
+}
+
+void RemoveEventObjectsOutsideView(void)
+{
+ u8 i;
+ u8 j;
+ bool8 isActiveLinkPlayer;
+ struct EventObject *eventObject;
+
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ for (j = 0, isActiveLinkPlayer = FALSE; j < ARRAY_COUNT(gLinkPlayerEventObjects); j++)
+ {
+ if (gLinkPlayerEventObjects[j].active && i == gLinkPlayerEventObjects[j].eventObjId)
+ isActiveLinkPlayer = TRUE;
+ }
+ if (!isActiveLinkPlayer)
+ {
+ eventObject = &gEventObjects[i];
+
+ if (eventObject->active && !eventObject->isPlayer)
+ RemoveEventObjectIfOutsideView(eventObject);
+ }
+ }
+}
+
+static void RemoveEventObjectIfOutsideView(struct EventObject *eventObject)
+{
+ s16 left;
+ s16 right;
+ s16 top;
+ s16 bottom;
+
+ left = gSaveBlock1Ptr->pos.x - 2;
+ right = gSaveBlock1Ptr->pos.x + 17;
+ top = gSaveBlock1Ptr->pos.y;
+ bottom = gSaveBlock1Ptr->pos.y + 16;
+
+ if (eventObject->currentCoords.x >= left && eventObject->currentCoords.x <= right
+ && eventObject->currentCoords.y >= top && eventObject->currentCoords.y <= bottom)
+ return;
+ if (eventObject->initialCoords.x >= left && eventObject->initialCoords.x <= right
+ && eventObject->initialCoords.y >= top && eventObject->initialCoords.y <= bottom)
+ return;
+ RemoveEventObject(eventObject);
+}
+
+void sub_808E16C(s16 x, s16 y)
+{
+ u8 i;
+
+ ClearPlayerAvatarInfo();
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (gEventObjects[i].active)
+ {
+ sub_808E1B8(i, x, y);
+ }
+ }
+ sub_808D450();
+}
+
+static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y)
+{
+ u8 spriteId;
+ u8 paletteSlot;
+ struct EventObject *eventObject;
+ const struct SubspriteTable *subspriteTables;
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+ struct SpriteFrameImage spriteFrameImage;
+ struct SpriteTemplate spriteTemplate;
+ struct Sprite *sprite;
+
+#define i spriteId
+ for (i = 0; i < ARRAY_COUNT(gLinkPlayerEventObjects); i++)
+ {
+ if (gLinkPlayerEventObjects[i].active && eventObjectId == gLinkPlayerEventObjects[i].eventObjId)
+ {
+ return;
+ }
+ }
+#undef i
+
+ eventObject = &gEventObjects[eventObjectId];
+ subspriteTables = NULL;
+ graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
+ spriteFrameImage.size = graphicsInfo->size;
+ MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(eventObject->graphicsId, eventObject->movementType, &spriteTemplate, &subspriteTables);
+ spriteTemplate.images = &spriteFrameImage;
+ *(u16 *)&spriteTemplate.paletteTag = 0xffff;
+ paletteSlot = graphicsInfo->paletteSlot;
+ if (paletteSlot == 0)
+ {
+ npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
+ }
+ else if (paletteSlot == 10)
+ {
+ npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
+ }
+ else if (paletteSlot >= 16)
+ {
+ paletteSlot -= 16;
+ sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
+ }
+ *(u16 *)&spriteTemplate.paletteTag = 0xffff;
+ spriteId = CreateSprite(&spriteTemplate, 0, 0, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ sprite = &gSprites[spriteId];
+ sub_8092FF0(x + eventObject->currentCoords.x, y + eventObject->currentCoords.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
+ sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ sprite->images = graphicsInfo->images;
+ if (eventObject->movementType == 0x0b)
+ {
+ SetPlayerAvatarEventObjectIdAndObjectId(eventObjectId, spriteId);
+ eventObject->warpArrowSpriteId = sub_8154228();
+ }
+ if (subspriteTables != NULL)
+ {
+ SetSubspriteTables(sprite, subspriteTables);
+ }
+ sprite->oam.paletteNum = paletteSlot;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[0] = eventObjectId;
+ eventObject->spriteId = spriteId;
+ if (!eventObject->inanimate && eventObject->movementType != 0x0b)
+ {
+ StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObject->facingDirection));
+ }
+ sub_808E38C(eventObject);
+ SetObjectSubpriorityByZCoord(eventObject->previousElevation, sprite, 1);
+ }
+}
+
+static void sub_808E38C(struct EventObject *eventObject)
+{
+ eventObject->singleMovementActive = 0;
+ eventObject->triggerGroundEffectsOnMove = TRUE;
+ eventObject->hasShadow = FALSE;
+ eventObject->hasReflection = FALSE;
+ eventObject->inShortGrass = FALSE;
+ eventObject->inShallowFlowingWater = FALSE;
+ eventObject->inSandPile = FALSE;
+ eventObject->inHotSprings = FALSE;
+ EventObjectClearHeldMovement(eventObject);
+}
+
+static void SetPlayerAvatarEventObjectIdAndObjectId(u8 eventObjectId, u8 spriteId)
+{
+ gPlayerAvatar.eventObjectId = eventObjectId;
+ gPlayerAvatar.spriteId = spriteId;
+ gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gEventObjects[eventObjectId].graphicsId);
+ SetPlayerAvatarExtraStateTransition(gEventObjects[eventObjectId].graphicsId, 0x20);
+}
+
+void EventObjectSetGraphicsId(struct EventObject *eventObject, u8 graphicsId)
+{
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+ struct Sprite *sprite;
+ u8 paletteSlot;
+
+ graphicsInfo = GetEventObjectGraphicsInfo(graphicsId);
+ sprite = &gSprites[eventObject->spriteId];
+ paletteSlot = graphicsInfo->paletteSlot;
+ if (paletteSlot == 0)
+ {
+ pal_patch_for_npc(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
+ }
+ else if (paletteSlot == 10)
+ {
+ npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
+ }
+ else if (paletteSlot >= 16)
+ {
+ paletteSlot -= 16;
+ sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
+ }
+ sprite->oam.shape = graphicsInfo->oam->shape;
+ sprite->oam.size = graphicsInfo->oam->size;
+ sprite->images = graphicsInfo->images;
+ sprite->anims = graphicsInfo->anims;
+ sprite->subspriteTables = graphicsInfo->subspriteTables;
+ sprite->oam.paletteNum = paletteSlot;
+ eventObject->inanimate = graphicsInfo->inanimate;
+ eventObject->graphicsId = graphicsId;
+ sub_8093038(eventObject->currentCoords.x, eventObject->currentCoords.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
+ sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ if (eventObject->trackedByCamera)
+ {
+ CameraObjectReset1();
+ }
+}
+
+void EventObjectSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ EventObjectSetGraphicsId(&gEventObjects[eventObjectId], graphicsId);
+ }
+}
+
+void EventObjectTurn(struct EventObject *eventObject, u8 direction)
+{
+ SetEventObjectDirection(eventObject, direction);
+ if (!eventObject->inanimate)
+ {
+ StartSpriteAnim(&gSprites[eventObject->spriteId], GetFaceDirectionAnimNum(eventObject->facingDirection));
+ SeekSpriteAnim(&gSprites[eventObject->spriteId], 0);
+ }
+}
+
+void EventObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ EventObjectTurn(&gEventObjects[eventObjectId], direction);
+ }
+}
+
+void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction)
+{
+ EventObjectTurn(&gEventObjects[playerAvatar->eventObjectId], direction);
+}
+
+/*static*/ void get_berry_tree_graphics(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 berryStage;
+ u8 berryId;
+
+ eventObject->invisible = TRUE;
+ sprite->invisible = TRUE;
+ berryStage = GetStageByBerryTreeId(eventObject->trainerRange_berryTreeId);
+ if (berryStage != 0)
+ {
+ eventObject->invisible = FALSE;
+ sprite->invisible = FALSE;
+ berryId = GetBerryTypeByBerryTreeId(eventObject->trainerRange_berryTreeId) - 1;
+ berryStage -= 1;
+ if (berryId >= NUM_BERRIES)
+ {
+ berryId = 0;
+ }
+ EventObjectSetGraphicsId(eventObject, gBerryTreeEventObjectGraphicsIdTablePointers[berryId][berryStage]);
+ sprite->images = gBerryTreePicTablePointers[berryId];
+ sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[berryId][berryStage];
+ StartSpriteAnim(sprite, berryStage);
+ }
+}
+
+const struct EventObjectGraphicsInfo *GetEventObjectGraphicsInfo(u8 graphicsId)
+{
+ u8 bard;
+
+ if (graphicsId >= SPRITE_VAR)
+ {
+ graphicsId = VarGetEventObjectGraphicsId(graphicsId - SPRITE_VAR);
+ }
+ if (graphicsId == 0x45)
+ {
+ bard = GetCurrentMauvilleOldMan();
+ return gMauvilleOldManGraphicsInfoPointers[bard];
+ }
+ if (graphicsId >= NUM_OBJECT_GRAPHICS_INFO)
+ {
+ graphicsId = 0x05; // LittleBoy1
+ }
+ return gEventObjectGraphicsInfoPointers[graphicsId];
+}
+
+static void SetEventObjectDynamicGraphicsId(struct EventObject *eventObject)
+{
+ if (eventObject->graphicsId >= SPRITE_VAR)
+ {
+ eventObject->graphicsId = VarGetEventObjectGraphicsId(eventObject->graphicsId - SPRITE_VAR);
+ }
+}
+
+void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 state)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ gEventObjects[eventObjectId].invisible = state;
+ }
+}
+
+void EventObjectGetLocalIdAndMap(struct EventObject *eventObject, void *localId, void *mapNum, void *mapGroup)
+{
+ *(u8*)(localId) = eventObject->localId;
+ *(u8*)(mapNum) = eventObject->mapNum;
+ *(u8*)(mapGroup) = eventObject->mapGroup;
+}
+
+void sub_808E75C(s16 x, s16 y)
+{
+ u8 eventObjectId;
+ struct EventObject *eventObject;
+
+ eventObjectId = GetEventObjectIdByXY(x, y);
+ if (eventObjectId != NUM_EVENT_OBJECTS)
+ {
+ eventObject = &gEventObjects[eventObjectId];
+ eventObject->triggerGroundEffectsOnMove = TRUE;
+ }
+}
+
+void sub_808E78C(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority)
+{
+ u8 eventObjectId;
+ struct EventObject *eventObject;
+ struct Sprite *sprite;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ eventObject = &gEventObjects[eventObjectId];
+ sprite = &gSprites[eventObject->spriteId];
+ eventObject->fixedPriority = TRUE;
+ sprite->subpriority = subpriority;
+ }
+}
+
+void sub_808E7E4(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 eventObjectId;
+ struct EventObject *eventObject;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ eventObject = &gEventObjects[eventObjectId];
+ eventObject->fixedPriority = FALSE;
+ eventObject->triggerGroundEffectsOnMove = TRUE;
+ }
+}
+
+void sub_808E82C(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
+{
+ u8 eventObjectId;
+ struct Sprite *sprite;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ sprite = &gSprites[gEventObjects[eventObjectId].spriteId];
+ sprite->pos2.x = x;
+ sprite->pos2.y = y;
+ }
+}
+
+void gpu_pal_allocator_reset__manage_upper_four(void)
+{
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 12;
+}
+
+static void sub_808E894(u16 paletteTag)
+{
+ u16 paletteSlot;
+
+ paletteSlot = FindEventObjectPaletteIndexByTag(paletteTag);
+ if (paletteSlot != 0x11ff) // always true
+ {
+ sub_808E8F4(&gUnknown_0850BBC8[paletteSlot]);
+ }
+}
+
+void sub_808E8C0(u16 *paletteTags)
+{
+ u8 i;
+
+ for (i = 0; paletteTags[i] != 0x11ff; i++)
+ {
+ sub_808E894(paletteTags[i]);
+ }
+}
+
+static u8 sub_808E8F4(const struct SpritePalette *spritePalette)
+{
+ if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xff)
+ {
+ return 0xff;
+ }
+ return LoadSpritePalette(spritePalette);
+}
+
+void pal_patch_for_npc(u16 paletteTag, u8 paletteSlot)
+{
+ u16 paletteIdx;
+
+ paletteIdx = FindEventObjectPaletteIndexByTag(paletteTag);
+ LoadPalette(gUnknown_0850BBC8[paletteIdx].data, 16 * paletteSlot + 256, 0x20);
+}
+
+void pal_patch_for_npc_range(const u16 *paletteTags, u8 minSlot, u8 maxSlot)
+{
+ while (minSlot < maxSlot)
+ {
+ pal_patch_for_npc(*paletteTags, minSlot);
+ paletteTags++;
+ minSlot++;
+ }
+}
+
+static u8 FindEventObjectPaletteIndexByTag(u16 tag)
+{
+ u8 i;
+
+ for (i = 0; gUnknown_0850BBC8[i].tag != 0x11ff; i++)
+ {
+ if (gUnknown_0850BBC8[i].tag == tag)
+ {
+ return i;
+ }
+ }
+ return 0xff;
+}
+
+void npc_load_two_palettes__no_record(u16 tag, u8 slot)
+{
+ u8 i;
+
+ pal_patch_for_npc(tag, slot);
+ for (i = 0; gUnknown_0850BD00[i].tag != 0x11ff; i++)
+ {
+ if (gUnknown_0850BD00[i].tag == tag)
+ {
+ pal_patch_for_npc(gUnknown_0850BD00[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]);
+ return;
+ }
+ }
+}
+
+void npc_load_two_palettes__and_record(u16 tag, u8 slot)
+{
+ u8 i;
+
+ gUnknown_020375B6 = tag;
+ pal_patch_for_npc(tag, slot);
+ for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i++)
+ {
+ if (gUnknown_0850BD78[i].tag == tag)
+ {
+ pal_patch_for_npc(gUnknown_0850BD78[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]);
+ return;
+ }
+ }
+}
+
+static void sub_808EAB0(u16 tag, u8 slot)
+{
+ pal_patch_for_npc(tag, slot);
+}
+
+void unref_sub_808EAC4(struct EventObject *eventObject, s16 x, s16 y)
+{
+ eventObject->previousCoords.x = eventObject->currentCoords.x;
+ eventObject->previousCoords.y = eventObject->currentCoords.y;
+ eventObject->currentCoords.x += x;
+ eventObject->currentCoords.y += y;
+}
+
+void ShiftEventObjectCoords(struct EventObject *eventObject, s16 x, s16 y)
+{
+ eventObject->previousCoords.x = eventObject->currentCoords.x;
+ eventObject->previousCoords.y = eventObject->currentCoords.y;
+ eventObject->currentCoords.x = x;
+ eventObject->currentCoords.y = y;
+}
+
+/*static*/ void npc_coords_set(struct EventObject *eventObject, s16 x, s16 y)
+{
+ eventObject->previousCoords.x = x;
+ eventObject->previousCoords.y = y;
+ eventObject->currentCoords.x = x;
+ eventObject->currentCoords.y = y;
+}
+
+void sub_808EB08(struct EventObject *eventObject, s16 x, s16 y)
+{
+ struct Sprite *sprite;
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+
+ sprite = &gSprites[eventObject->spriteId];
+ graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
+ npc_coords_set(eventObject, x, y);
+ sub_8093038(eventObject->currentCoords.x, eventObject->currentCoords.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
+ sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ sub_808E38C(eventObject);
+ if (eventObject->trackedByCamera)
+ {
+ CameraObjectReset1();
+ }
+}
+
+void sub_808EBA8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ x += 7;
+ y += 7;
+ sub_808EB08(&gEventObjects[eventObjectId], x, y);
+ }
+}
+
+void ShiftStillEventObjectCoords(struct EventObject *eventObject)
+{
+ ShiftEventObjectCoords(eventObject, eventObject->currentCoords.x, eventObject->currentCoords.y);
+}
+
+void UpdateEventObjectCoordsForCameraUpdate(void)
+{
+ u8 i;
+ s16 dx;
+ s16 dy;
+
+ if (gCamera.active)
+ {
+ dx = gCamera.x;
+ dy = gCamera.y;
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (gEventObjects[i].active)
+ {
+ gEventObjects[i].initialCoords.x -= dx;
+ gEventObjects[i].initialCoords.y -= dy;
+ gEventObjects[i].currentCoords.x -= dx;
+ gEventObjects[i].currentCoords.y -= dy;
+ gEventObjects[i].previousCoords.x -= dx;
+ gEventObjects[i].previousCoords.y -= dy;
+ }
+ }
+ }
+}
+
+u8 GetEventObjectIdByXYZ(u16 x, u16 y, u8 z)
+{
+ u8 i;
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ if (gEventObjects[i].active)
+ {
+ if (gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y && EventObjectDoesZCoordMatch(&gEventObjects[i], z))
+ {
+ return i;
+ }
+ }
+ }
+ return NUM_EVENT_OBJECTS;
+}
+
+static bool8 EventObjectDoesZCoordMatch(struct EventObject *eventObject, u8 z)
+{
+ if (eventObject->currentElevation != 0 && z != 0 && eventObject->currentElevation != z)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void UpdateEventObjectsForCameraUpdate(s16 x, s16 y)
+{
+ UpdateEventObjectCoordsForCameraUpdate();
+ TrySpawnEventObjects(x, y);
+ RemoveEventObjectsOutsideView();
+}
+
+u8 AddCameraObject(u8 linkedSpriteId)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gCameraSpriteTemplate, 0, 0, 4);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data[0] = linkedSpriteId;
+ return spriteId;
+}
+
+static void ObjectCB_CameraObject(struct Sprite *sprite)
+{
+ void (*callbacks[ARRAY_COUNT(gCameraObjectFuncs)])(struct Sprite *);
+
+ memcpy(callbacks, gCameraObjectFuncs, sizeof gCameraObjectFuncs);
+ callbacks[sprite->data[1]](sprite);
+}
+
+static void CameraObject_0(struct Sprite *sprite)
+{
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
+ sprite->invisible = TRUE;
+ sprite->data[1] = 1;
+ CameraObject_1(sprite);
+}
+
+static void CameraObject_1(struct Sprite *sprite)
+{
+ s16 x;
+ s16 y;
+
+ y = gSprites[sprite->data[0]].pos1.y;
+ x = gSprites[sprite->data[0]].pos1.x;
+ sprite->data[2] = x - sprite->pos1.x;
+ sprite->data[3] = y - sprite->pos1.y;
+ sprite->pos1.x = x;
+ sprite->pos1.y = y;
+}
+
+static void CameraObject_2(struct Sprite *sprite)
+{
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+}
+
+static struct Sprite *FindCameraObject(void)
+{
+ u8 spriteId;
+
+ for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++)
+ {
+ if (gSprites[spriteId].inUse && gSprites[spriteId].callback == ObjectCB_CameraObject)
+ {
+ return &gSprites[spriteId];
+ }
+ }
+ return NULL;
+}
+
+void CameraObjectReset1(void)
+{
+ struct Sprite *cameraObject;
+
+ cameraObject = FindCameraObject();
+ if (cameraObject != NULL)
+ {
+ cameraObject->data[1] = 0;
+ cameraObject->callback(cameraObject);
+ }
+}
+
+void CameraObjectSetFollowedObjectId(u8 objectId)
+{
+ struct Sprite *cameraObject;
+
+ cameraObject = FindCameraObject();
+ if (cameraObject != NULL)
+ {
+ cameraObject->data[0] = objectId;
+ CameraObjectReset1();
+ }
+}
+
+u8 CameraObjectGetFollowedObjectId(void)
+{
+ struct Sprite *cameraObject;
+
+ cameraObject = FindCameraObject();
+ if (cameraObject == NULL)
+ {
+ return MAX_SPRITES;
+ }
+ return cameraObject->data[0];
+}
+
+void CameraObjectReset2(void)
+{
+ FindCameraObject()->data[1] = 2;
+}
+
+u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)
+{
+ u8 i;
+
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (!gSprites[i].inUse)
+ {
+ gSprites[i] = *sprite;
+ gSprites[i].pos1.x = x;
+ gSprites[i].pos1.y = y;
+ gSprites[i].subpriority = subpriority;
+ break;
+ }
+ }
+ return i;
+}
+
+u8 obj_unfreeze(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)
+{
+ s16 i;
+
+ for (i = MAX_SPRITES - 1; i > -1; i --)
+ {
+ if (!gSprites[i].inUse)
+ {
+ gSprites[i] = *sprite;
+ gSprites[i].pos1.x = x;
+ gSprites[i].pos1.y = y;
+ gSprites[i].subpriority = subpriority;
+ return i;
+ }
+ }
+ return MAX_SPRITES;
+}
+
+void SetEventObjectDirection(struct EventObject *eventObject, u8 direction)
+{
+ s8 d2;
+ eventObject->previousMovementDirection = eventObject->facingDirection;
+ if (!eventObject->facingDirectionLocked)
+ {
+ d2 = direction;
+ eventObject->facingDirection = d2;
+ }
+ eventObject->movementDirection = direction;
+}
+
+static const u8 *GetEventObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ return GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script;
+}
+
+const u8 *GetEventObjectScriptPointerByEventObjectId(u8 eventObjectId)
+{
+ return GetEventObjectScriptPointerByLocalIdAndMap(gEventObjects[eventObjectId].localId, gEventObjects[eventObjectId].mapNum, gEventObjects[eventObjectId].mapGroup);
+}
+
+static u16 GetEventObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ return GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->flagId;
+}
+
+static u16 GetEventObjectFlagIdByEventObjectId(u8 eventObjectId)
+{
+ return GetEventObjectFlagIdByLocalIdAndMap(gEventObjects[eventObjectId].localId, gEventObjects[eventObjectId].mapNum, gEventObjects[eventObjectId].mapGroup);
+}
+
+u8 sub_808F080(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 eventObjectId;
+
+ if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ return 0xFF;
+ }
+ return gEventObjects[eventObjectId].trainerType;
+}
+
+u8 sub_808F0BC(u8 eventObjectId)
+{
+ return gEventObjects[eventObjectId].trainerType;
+}
+
+u8 sub_808F0D4(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 eventObjectId;
+
+ if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ return 0xFF;
+ }
+ return gEventObjects[eventObjectId].trainerRange_berryTreeId;
+}
+
+u8 EventObjectGetBerryTreeId(u8 eventObjectId)
+{
+ return gEventObjects[eventObjectId].trainerRange_berryTreeId;
+}
+
+static struct EventObjectTemplate *GetEventObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ struct EventObjectTemplate *templates;
+ const struct MapHeader *mapHeader;
+ u8 count;
+
+ if (gSaveBlock1Ptr->location.mapNum == mapNum && gSaveBlock1Ptr->location.mapGroup == mapGroup)
+ {
+ templates = gSaveBlock1Ptr->eventObjectTemplates;
+ count = gMapHeader.events->eventObjectCount;
+ }
+ else
+ {
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);
+ templates = mapHeader->events->eventObjects;
+ count = mapHeader->events->eventObjectCount;
+ }
+ return FindEventObjectTemplateByLocalId(localId, templates, count);
+}
+
+static struct EventObjectTemplate *FindEventObjectTemplateByLocalId(u8 localId, struct EventObjectTemplate *templates, u8 count)
+{
+ u8 i;
+
+ for (i = 0; i < count; i++)
+ {
+ if (templates[i].localId == localId)
+ {
+ return &templates[i];
+ }
+ }
+ return NULL;
+}
+
+struct EventObjectTemplate *GetBaseTemplateForEventObject(const struct EventObject *eventObject)
+{
+ int i;
+
+ if (eventObject->mapNum != gSaveBlock1Ptr->location.mapNum || eventObject->mapGroup != gSaveBlock1Ptr->location.mapGroup)
+ {
+ return NULL;
+ }
+ for (i = 0; i < 64; i++) // Using ARRAY_COUNT here results in the wrong conditional branch instruction (bls instead of ble)
+ {
+ if (eventObject->localId == gSaveBlock1Ptr->eventObjectTemplates[i].localId)
+ {
+ return &gSaveBlock1Ptr->eventObjectTemplates[i];
+ }
+ }
+ return NULL;
+}
+
+void OverrideTemplateCoordsForEventObject(const struct EventObject *eventObject)
+{
+ struct EventObjectTemplate *eventObjectTemplate;
+
+ eventObjectTemplate = GetBaseTemplateForEventObject(eventObject);
+ if (eventObjectTemplate != NULL)
+ {
+ eventObjectTemplate->x = eventObject->currentCoords.x - 7;
+ eventObjectTemplate->y = eventObject->currentCoords.y - 7;
+ }
+}
+
+void OverrideMovementTypeForEventObject(const struct EventObject *eventObject, const u8 *script)
+{
+ struct EventObjectTemplate *eventObjectTemplate;
+
+ eventObjectTemplate = GetBaseTemplateForEventObject(eventObject);
+ if (eventObjectTemplate != NULL)
+ {
+ eventObjectTemplate->script = script;
+ }
+}
+
+void TryOverrideTemplateCoordsForEventObject(const struct EventObject *eventObject, u8 movementType)
+{
+ struct EventObjectTemplate *eventObjectTemplate;
+
+ eventObjectTemplate = GetBaseTemplateForEventObject(eventObject);
+ if (eventObjectTemplate != NULL)
+ {
+ eventObjectTemplate->movementType = movementType;
+ }
+}
+
+void sub_808F254(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ OverrideTemplateCoordsForEventObject(&gEventObjects[eventObjectId]);
+ }
+}
+
+void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ switch (decorCat)
+ {
+ case DECORCAT_DOLL:
+ OverrideMovementTypeForEventObject(&gEventObjects[eventObjectId], EventScript_2766A2);
+ break;
+ case DECORCAT_CUSHION:
+ OverrideMovementTypeForEventObject(&gEventObjects[eventObjectId], EventScript_2766A6);
+ break;
+ }
+ }
+}
+
+void npc_paltag_set_load(u8 palSlot)
+{
+ gpu_pal_allocator_reset__manage_upper_four();
+ gUnknown_020375B6 = 0x11ff;
+ gUnknown_020375B4 = palSlot;
+ if (palSlot == 1)
+ {
+ pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 6);
+ gReservedSpritePaletteCount = 8;
+ }
+ else
+ {
+ pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 10);
+ }
+}
+
+u16 npc_paltag_by_palslot(u8 palSlot)
+{
+ u8 i;
+
+ if (palSlot < 10)
+ {
+ return gUnknown_0850BE38[gUnknown_020375B4][palSlot];
+ }
+ for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i++)
+ {
+ if (gUnknown_0850BD78[i].tag == gUnknown_020375B6)
+ {
+ return gUnknown_0850BD78[i].data[gUnknown_020375B4];
+ }
+ }
+ return 0x11ff;
+}
+
+movement_type_empty_callback(MovementType_None)
+movement_type_def(MovementType_WanderAround, gMovementTypeFuncs_WanderAround)
+
+bool8 MovementType_WanderAround_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_WanderAround_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_WanderAround_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (!EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ return FALSE;
+ }
+ SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);
+ sprite->data[1] = 3;
+ return TRUE;
+}
+
+bool8 MovementType_WanderAround_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_WanderAround_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ u8 chosenDirection;
+
+ memcpy(directions, gStandardDirections, sizeof directions);
+ chosenDirection = directions[Random() & 3];
+ SetEventObjectDirection(eventObject, chosenDirection);
+ sprite->data[1] = 5;
+ if (GetCollisionInDirection(eventObject, chosenDirection))
+ {
+ sprite->data[1] = 1;
+ }
+ return TRUE;
+}
+
+bool8 MovementType_WanderAround_Step5(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(eventObject->movementDirection));
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 6;
+ return TRUE;
+}
+
+bool8 MovementType_WanderAround_Step6(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 1;
+ }
+ return FALSE;
+}
+
+bool8 EventObjectIsTrainerAndCloseToPlayer(struct EventObject *eventObject)
+{
+ s16 playerX;
+ s16 playerY;
+ s16 objX;
+ s16 objY;
+ s16 minX;
+ s16 maxX;
+ s16 minY;
+ s16 maxY;
+
+ if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH))
+ {
+ return FALSE;
+ }
+ if (eventObject->trainerType != 1 && eventObject->trainerType != 3)
+ {
+ return FALSE;
+ }
+ PlayerGetDestCoords(&playerX, &playerY);
+ objX = eventObject->currentCoords.x;
+ objY = eventObject->currentCoords.y;
+ minX = objX - eventObject->trainerRange_berryTreeId;
+ minY = objY - eventObject->trainerRange_berryTreeId;
+ maxX = objX + eventObject->trainerRange_berryTreeId;
+ maxY = objY + eventObject->trainerRange_berryTreeId;
+ if (minX > playerX || maxX < playerX || minY > playerY || maxY < playerY)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ if (absdx > absdy)
+ {
+ direction = DIR_EAST;
+ if (dx < 0)
+ {
+ direction = DIR_WEST;
+ }
+ }
+ else
+ {
+ direction = DIR_SOUTH;
+ if (dy < 0)
+ {
+ direction = DIR_NORTH;
+ }
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = DIR_SOUTH;
+ if (dy < 0)
+ {
+ direction = DIR_NORTH;
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = DIR_EAST;
+ if (dx < 0)
+ {
+ direction = DIR_WEST;
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_SOUTH)
+ {
+ direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);
+ if (direction == DIR_EAST)
+ {
+ direction = DIR_NORTH;
+ }
+ }
+ else if (direction == DIR_EAST)
+ {
+ direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);
+ if (direction == DIR_SOUTH)
+ {
+ direction = DIR_NORTH;
+ }
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_SOUTH)
+ {
+ direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);
+ if (direction == DIR_WEST)
+ {
+ direction = DIR_NORTH;
+ }
+ }
+ else if (direction == DIR_WEST)
+ {
+ direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);
+ if (direction == DIR_SOUTH)
+ {
+ direction = DIR_NORTH;
+ }
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_NORTH)
+ {
+ direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);
+ if (direction == DIR_EAST)
+ {
+ direction = DIR_SOUTH;
+ }
+ }
+ else if (direction == DIR_EAST)
+ {
+ direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);
+ if (direction == DIR_NORTH)
+ {
+ direction = DIR_SOUTH;
+ }
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_NORTH)
+ {
+ direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);
+ if (direction == DIR_WEST)
+ {
+ direction = DIR_SOUTH;
+ }
+ }
+ else if (direction == DIR_WEST)
+ {
+ direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);
+ if (direction == DIR_NORTH)
+ {
+ direction = DIR_SOUTH;
+ }
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_EAST)
+ {
+ direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_WEST)
+ {
+ direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy);
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_SOUTH)
+ {
+ direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);
+ }
+ return direction;
+}
+
+u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy)
+{
+ u8 direction;
+
+ direction = GetVectorDirection(dx, dy, absdx, absdy);
+ if (direction == DIR_NORTH)
+ {
+ direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy);
+ }
+ return direction;
+}
+
+u8 TryGetTrainerEncounterDirection(struct EventObject *eventObject, u8 movementType)
+{
+ s16 dx;
+ s16 dy;
+ s16 absdx;
+ s16 absdy;
+
+ if (!EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ return 0;
+ }
+ PlayerGetDestCoords(&dx, &dy);
+ dx -= eventObject->currentCoords.x;
+ dy -= eventObject->currentCoords.y;
+ absdx = dx;
+ absdy = dy;
+ if (absdx < 0)
+ {
+ absdx = -absdx;
+ }
+ if (absdy < 0)
+ {
+ absdy = -absdy;
+ }
+ return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy);
+}
+
+movement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround)
+
+bool8 MovementType_LookAround_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_LookAround_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_LookAround_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_LookAround_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_LookAround_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gStandardDirections, sizeof directions);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_ANY);
+ if (direction == DIR_NONE)
+ direction = directions[Random() & 3];
+
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_WanderUpAndDown, gMovementTypeFuncs_WanderUpAndDown)
+
+bool8 MovementType_WanderUpAndDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_WanderUpAndDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_WanderUpAndDown_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (!EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ return FALSE;
+ }
+ SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);
+ sprite->data[1] = 3;
+ return TRUE;
+}
+
+bool8 MovementType_WanderUpAndDown_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_WanderUpAndDown_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUpAndDownDirections, sizeof directions);
+ direction = directions[Random() & 1];
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 5;
+ if (GetCollisionInDirection(eventObject, direction))
+ {
+ sprite->data[1] = 1;
+ }
+ return TRUE;
+}
+
+bool8 MovementType_WanderUpAndDown_Step5(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(eventObject->movementDirection));
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 6;
+ return TRUE;
+}
+
+bool8 MovementType_WanderUpAndDown_Step6(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 1;
+ }
+ return FALSE;
+}
+
+movement_type_def(MovementType_WanderLeftAndRight, gMovementTypeFuncs_WanderLeftAndRight)
+
+bool8 MovementType_WanderLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_WanderLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_WanderLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (!EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ return FALSE;
+ }
+ SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);
+ sprite->data[1] = 3;
+ return TRUE;
+}
+
+bool8 MovementType_WanderLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_WanderLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gLeftAndRightDirections, sizeof directions);
+ direction = directions[Random() & 1];
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 5;
+ if (GetCollisionInDirection(eventObject, direction))
+ {
+ sprite->data[1] = 1;
+ }
+ return TRUE;
+}
+
+bool8 MovementType_WanderLeftAndRight_Step5(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(eventObject->movementDirection));
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 6;
+ return TRUE;
+}
+
+bool8 MovementType_WanderLeftAndRight_Step6(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 1;
+ }
+ return FALSE;
+}
+
+movement_type_def(MovementType_FaceDirection, gMovementTypeFuncs_FaceDirection)
+
+bool8 MovementType_FaceDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDirection_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ sprite->data[1] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDirection_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->singleMovementActive = 0;
+ return FALSE;
+}
+
+static bool8 EventObjectCB2_BerryTree(struct EventObject *eventObject, struct Sprite *sprite);
+extern bool8 (*const gMovementTypeFuncs_BerryTreeGrowth[])(struct EventObject *eventObject, struct Sprite *sprite);
+void MovementType_BerryTreeGrowth(struct Sprite *sprite)
+{
+ struct EventObject *eventObject;
+
+ eventObject = &gEventObjects[sprite->data[0]];
+ if (!(sprite->data[7] & 1))
+ {
+ get_berry_tree_graphics(eventObject, sprite);
+ sprite->data[7] |= 1;
+ }
+ UpdateEventObjectCurrentMovement(eventObject, sprite, EventObjectCB2_BerryTree);
+}
+static bool8 EventObjectCB2_BerryTree(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ return gMovementTypeFuncs_BerryTreeGrowth[sprite->data[1]](eventObject, sprite);
+}
+
+bool8 MovementType_BerryTreeGrowth_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 berryStage;
+ ClearEventObjectMovement(eventObject, sprite);
+ eventObject->invisible = TRUE;
+ sprite->invisible = TRUE;
+ berryStage = GetStageByBerryTreeId(eventObject->trainerRange_berryTreeId);
+ if (berryStage == 0)
+ {
+ if (!(sprite->data[7] & 4) && sprite->animNum == 4)
+ {
+ gFieldEffectArguments[0] = eventObject->currentCoords.x;
+ gFieldEffectArguments[1] = eventObject->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
+ sprite->animNum = berryStage;
+ }
+ return FALSE;
+ }
+ eventObject->invisible = FALSE;
+ sprite->invisible = FALSE;
+ berryStage --;
+ if (sprite->animNum != berryStage)
+ {
+ sprite->data[1] = 2;
+ return TRUE;
+ }
+ get_berry_tree_graphics(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_BerryTreeGrowth_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ sprite->data[1] = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_BerryTreeGrowth_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 3;
+ sprite->data[2] = 0;
+ sprite->data[7] |= 2;
+ gFieldEffectArguments[0] = eventObject->currentCoords.x;
+ gFieldEffectArguments[1] = eventObject->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
+ return TRUE;
+}
+
+bool8 MovementType_BerryTreeGrowth_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->data[2]++;
+ eventObject->invisible = (sprite->data[2] & 0x02) >> 1;
+ sprite->animPaused = TRUE;
+ if (sprite->data[2] > 64)
+ {
+ get_berry_tree_graphics(eventObject, sprite);
+ sprite->data[1] = 4;
+ sprite->data[2] = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_BerryTreeGrowth_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->data[2]++;
+ eventObject->invisible = (sprite->data[2] & 0x02) >> 1;
+ sprite->animPaused = TRUE;
+ if (sprite->data[2] > 64)
+ {
+ sprite->data[1] = 0;
+ sprite->data[7] &= ~0x0002;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+movement_type_def(MovementType_FaceDownAndUp, gMovementTypeFuncs_FaceDownAndUp)
+
+bool8 MovementType_FaceDownAndUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownAndUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownAndUp_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownAndUp_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownAndUp_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUpAndDownDirections, sizeof gUpAndDownDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_SOUTH);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceLeftAndRight, gMovementTypeFuncs_FaceLeftAndRight)
+
+bool8 MovementType_FaceLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gLeftAndRightDirections, sizeof gLeftAndRightDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_EAST_WEST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceUpAndLeft, gMovementTypeFuncs_FaceUpAndLeft)
+
+bool8 MovementType_FaceUpAndLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceUpAndLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceUpAndLeft_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceUpAndLeft_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceUpAndLeft_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUpAndLeftDirections, sizeof gUpAndLeftDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_WEST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceUpAndRight, gMovementTypeFuncs_FaceUpAndRight)
+
+bool8 MovementType_FaceUpAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceUpAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceUpAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceUpAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceUpAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUpAndRightDirections, sizeof gUpAndRightDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_EAST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceDownAndLeft, gMovementTypeFuncs_FaceDownAndLeft)
+
+bool8 MovementType_FaceDownAndLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownAndLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownAndLeft_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownAndLeft_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownAndLeft_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gDownAndLeftDirections, sizeof gDownAndLeftDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_SOUTH_WEST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceDownAndRight, gMovementTypeFuncs_FaceDownAndRight)
+
+bool8 MovementType_FaceDownAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gDownAndRightDirections, sizeof gDownAndRightDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_SOUTH_EAST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceDownUpAndLeft, gMovementTypeFuncs_FaceDownUpAndLeft)
+
+bool8 MovementType_FaceDownUpAndLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownUpAndLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownUpAndLeft_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownUpAndLeft_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownUpAndLeft_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gDownUpAndLeftDirections, sizeof gDownUpAndLeftDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_SOUTH_WEST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceDownUpAndRight, gMovementTypeFuncs_FaceDownUpAndRight)
+
+bool8 MovementType_FaceDownUpAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownUpAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownUpAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownUpAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownUpAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gDownUpAndRightDirections, sizeof gDownUpAndRightDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_SOUTH_EAST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceUpRightAndLeft, gMovementTypeFuncs_FaceUpLeftAndRight)
+
+bool8 MovementType_FaceUpLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceUpLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceUpLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceUpLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceUpLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gUpLeftAndRightDirections, sizeof gUpLeftAndRightDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_EAST_WEST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_FaceDownRightAndLeft, gMovementTypeFuncs_FaceDownLeftAndRight)
+
+bool8 MovementType_FaceDownLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_FaceDownLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]);
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 4;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_FaceDownLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gDownLeftAndRightDirections, sizeof gDownLeftAndRightDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_SOUTH_EAST_WEST);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_RotateCounterclockwise, gMovementTypeFuncs_RotateCounterclockwise)
+
+bool8 MovementType_RotateCounterclockwise_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_RotateCounterclockwise_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, 48);
+ sprite->data[1] = 2;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_RotateCounterclockwise_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_RotateCounterclockwise_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[5];
+ memcpy(directions, gCounterclockwiseDirections, sizeof gCounterclockwiseDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_ANY);
+ if (direction == 0)
+ {
+ direction = directions[eventObject->facingDirection];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 0;
+ return TRUE;
+}
+
+movement_type_def(MovementType_RotateClockwise, gMovementTypeFuncs_RotateClockwise)
+
+bool8 MovementType_RotateClockwise_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_RotateClockwise_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ SetMovementDelay(sprite, 48);
+ sprite->data[1] = 2;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_RotateClockwise_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject))
+ {
+ sprite->data[1] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_RotateClockwise_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[5];
+ memcpy(directions, gClockwiseDirections, sizeof gClockwiseDirections);
+ direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_ANY);
+ if (direction == 0)
+ {
+ direction = directions[eventObject->facingDirection];
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 0;
+ return TRUE;
+}
+
+movement_type_def(MovementType_WalkBackAndForth, gMovementTypeFuncs_WalkBackAndForth)
+
+bool8 MovementType_WalkBackAndForth_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_WalkBackAndForth_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 direction;
+
+ direction = gInitialMovementTypeFacingDirections[eventObject->movementType];
+ if (eventObject->directionSequenceIndex)
+ {
+ direction = GetOppositeDirection(direction);
+ }
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_WalkBackAndForth_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ bool8 collisionState;
+ u8 movementActionId;
+
+ if (eventObject->directionSequenceIndex && eventObject->initialCoords.x == eventObject->currentCoords.x && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 0;
+ SetEventObjectDirection(eventObject, GetOppositeDirection(eventObject->movementDirection));
+ }
+ collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection);
+ movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection);
+ if (collisionState == TRUE)
+ {
+ eventObject->directionSequenceIndex++;
+ SetEventObjectDirection(eventObject, GetOppositeDirection(eventObject->movementDirection));
+ movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection);
+ collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection);
+ }
+ if (collisionState)
+ {
+ movementActionId = GetWalkInPlaceNormalMovementAction(eventObject->facingDirection);
+ }
+ EventObjectSetSingleMovement(eventObject, sprite, movementActionId);
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 3;
+ return TRUE;
+}
+
+bool8 MovementType_WalkBackAndForth_Step3(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 1;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_WalkSequence_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MoveNextDirectionInSequence(struct EventObject *eventObject, struct Sprite *sprite, u8 *route)
+{
+ u8 collisionState;
+ u8 movementActionId;
+
+ if (eventObject->directionSequenceIndex == 3 && eventObject->initialCoords.x == eventObject->currentCoords.x && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 0;
+ }
+ SetEventObjectDirection(eventObject, route[eventObject->directionSequenceIndex]);
+ movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection);
+ collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection);
+ if (collisionState == TRUE)
+ {
+ eventObject->directionSequenceIndex++;
+ SetEventObjectDirection(eventObject, route[eventObject->directionSequenceIndex]);
+ movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection);
+ collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection);
+ }
+ if (collisionState)
+ {
+ movementActionId = GetWalkInPlaceNormalMovementAction(eventObject->facingDirection);
+ }
+ EventObjectSetSingleMovement(eventObject, sprite, movementActionId);
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 MovementType_WalkSequence_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 1;
+ }
+ return FALSE;
+}
+
+movement_type_def(MovementType_WalkSequenceUpRightLeftDown, gMovementTypeFuncs_WalkSequenceUpRightLeftDown)
+
+u8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gUpRightLeftDownDirections)];
+ memcpy(directions, gUpRightLeftDownDirections, sizeof(gUpRightLeftDownDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceRightLeftDownUp, gMovementTypeFuncs_WalkSequenceRightLeftDownUp)
+
+u8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gRightLeftDownUpDirections)];
+ memcpy(directions, gRightLeftDownUpDirections, sizeof(gRightLeftDownUpDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceDownUpRightLeft, gMovementTypeFuncs_WalkSequenceDownUpRightLeft)
+
+u8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gDownUpRightLeftDirections)];
+ memcpy(directions, gDownUpRightLeftDirections, sizeof(gDownUpRightLeftDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceLeftDownUpRight, gMovementTypeFuncs_WalkSequenceLeftDownUpRight)
+
+u8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gLeftDownUpRightDirections)];
+ memcpy(directions, gLeftDownUpRightDirections, sizeof(gLeftDownUpRightDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceUpLeftRightDown, gMovementTypeFuncs_WalkSequenceUpLeftRightDown)
+
+u8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gUpLeftRightDownDirections)];
+ memcpy(directions, gUpLeftRightDownDirections, sizeof(gUpLeftRightDownDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceLeftRightDownUp, gMovementTypeFuncs_WalkSequenceLeftRightDownUp)
+
+u8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gLeftRightDownUpDirections)];
+ memcpy(directions, gLeftRightDownUpDirections, sizeof(gLeftRightDownUpDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceDownUpLeftRight, gMovementTypeFuncs_WalkSequenceDownUpLeftRight)
+
+u8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gStandardDirections)];
+ memcpy(directions, gStandardDirections, sizeof(gStandardDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceRightDownUpLeft, gMovementTypeFuncs_WalkSequenceRightDownUpLeft)
+
+u8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gRightDownUpLeftDirections)];
+ memcpy(directions, gRightDownUpLeftDirections, sizeof(gRightDownUpLeftDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceLeftUpDownRight, gMovementTypeFuncs_WalkSequenceLeftUpDownRight)
+
+u8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gLeftUpDownRightDirections)];
+ memcpy(directions, gLeftUpDownRightDirections, sizeof(gLeftUpDownRightDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceUpDownRightLeft, gMovementTypeFuncs_WalkSequenceUpDownRightLeft)
+
+u8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gUpDownRightLeftDirections)];
+ memcpy(directions, gUpDownRightLeftDirections, sizeof(gUpDownRightLeftDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceRightLeftUpDown, gMovementTypeFuncs_WalkSequenceRightLeftUpDown)
+
+u8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gRightLeftUpDownDirections)];
+ memcpy(directions, gRightLeftUpDownDirections, sizeof(gRightLeftUpDownDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceDownRightLeftUp, gMovementTypeFuncs_WalkSequenceDownRightLeftUp)
+
+u8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gDownRightLeftUpDirections)];
+ memcpy(directions, gDownRightLeftUpDirections, sizeof(gDownRightLeftUpDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceRightUpDownLeft, gMovementTypeFuncs_WalkSequenceRightUpDownLeft)
+
+u8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gRightUpDownLeftDirections)];
+ memcpy(directions, gRightUpDownLeftDirections, sizeof(gRightUpDownLeftDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceUpDownLeftRight, gMovementTypeFuncs_WalkSequenceUpDownLeftRight)
+
+u8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gUpDownLeftRightDirections)];
+ memcpy(directions, gUpDownLeftRightDirections, sizeof(gUpDownLeftRightDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceLeftRightUpDown, gMovementTypeFuncs_WalkSequenceLeftRightUpDown)
+
+u8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gLeftRightUpDownDirections)];
+ memcpy(directions, gLeftRightUpDownDirections, sizeof(gLeftRightUpDownDirections));
+ if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 2;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceDownLeftRightUp, gMovementTypeFuncs_WalkSequenceDownLeftRightUp)
+
+u8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gDownLeftRightUpDirections)];
+ memcpy(directions, gDownLeftRightUpDirections, sizeof(gDownLeftRightUpDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceUpLeftDownRight, gMovementTypeFuncs_WalkSequenceUpLeftDownRight)
+
+u8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gUpLeftDownRightDirections)];
+ memcpy(directions, gUpLeftDownRightDirections, sizeof(gUpLeftDownRightDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceDownRightUpLeft, gMovementTypeFuncs_WalkSequenceDownRightUpLeft)
+
+u8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gDownRightUpLeftDirections)];
+ memcpy(directions, gDownRightUpLeftDirections, sizeof(gDownRightUpLeftDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceLeftDownRightUp, gMovementTypeFuncs_WalkSequenceLeftDownRightUp)
+
+u8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gLeftDownRightUpDirections)];
+ memcpy(directions, gLeftDownRightUpDirections, sizeof(gLeftDownRightUpDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceRightUpLeftDown, gMovementTypeFuncs_WalkSequenceRightUpLeftDown)
+
+u8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gRightUpLeftDownDirections)];
+ memcpy(directions, gRightUpLeftDownDirections, sizeof(gRightUpLeftDownDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceUpRightDownLeft, gMovementTypeFuncs_WalkSequenceUpRightDownLeft)
+
+u8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gUpRightDownLeftDirections)];
+ memcpy(directions, gUpRightDownLeftDirections, sizeof(gUpRightDownLeftDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceDownLeftUpRight, gMovementTypeFuncs_WalkSequenceDownLeftUpRight)
+
+u8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gDownLeftUpRightDirections)];
+ memcpy(directions, gDownLeftUpRightDirections, sizeof(gDownLeftUpRightDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceLeftUpRightDown, gMovementTypeFuncs_WalkSequenceLeftUpRightDown)
+
+u8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gLeftUpRightDownDirections)];
+ memcpy(directions, gLeftUpRightDownDirections, sizeof(gLeftUpRightDownDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_WalkSequenceRightDownLeftUp, gMovementTypeFuncs_WalkSequenceRightDownLeftUp)
+
+u8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 directions[sizeof(gRightDownLeftUpDirections)];
+ memcpy(directions, gRightDownLeftUpDirections, sizeof(gRightDownLeftUpDirections));
+ if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x)
+ {
+ eventObject->directionSequenceIndex = 3;
+ }
+ return MoveNextDirectionInSequence(eventObject, sprite, directions);
+}
+
+movement_type_def(MovementType_CopyPlayer, gMovementTypeFuncs_CopyPlayer)
+
+bool8 MovementType_CopyPlayer_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ if (eventObject->directionSequenceIndex == 0)
+ {
+ eventObject->directionSequenceIndex = GetPlayerFacingDirection();
+ }
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+bool8 MovementType_CopyPlayer_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (gEventObjects[gPlayerAvatar.eventObjectId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER)
+ {
+ return FALSE;
+ }
+ return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](eventObject, sprite, GetPlayerMovementDirection(), NULL);
+}
+
+bool8 MovementType_CopyPlayer_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ eventObject->singleMovementActive = 0;
+ sprite->data[1] = 1;
+ }
+ return FALSE;
+}
+
+bool8 CopyablePlayerMovement_None(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ return FALSE;
+}
+
+bool8 CopyablePlayerMovement_FaceDirection(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, playerDirection)));
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 CopyablePlayerMovement_GoSpeed0(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ u32 direction;
+ s16 x;
+ s16 y;
+
+ direction = playerDirection;
+ if (EventObjectIsFarawayIslandMew(eventObject))
+ {
+ direction = sub_81D427C();
+ if (direction == 0)
+ {
+ direction = playerDirection;
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ EventObjectMoveDestCoords(eventObject, direction, &x, &y);
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+ }
+ }
+ else
+ {
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ }
+ EventObjectMoveDestCoords(eventObject, direction, &x, &y);
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(direction));
+ if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
+ }
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 CopyablePlayerMovement_GoSpeed1(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ u32 direction;
+ s16 x;
+ s16 y;
+
+ direction = playerDirection;
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ EventObjectMoveDestCoords(eventObject, direction, &x, &y);
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkFastMovementAction(direction));
+ if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
+ }
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 CopyablePlayerMovement_GoSpeed2(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ u32 direction;
+ s16 x;
+ s16 y;
+
+ direction = playerDirection;
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ EventObjectMoveDestCoords(eventObject, direction, &x, &y);
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkFastestMovementAction(direction));
+ if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
+ }
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 CopyablePlayerMovement_Slide(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ u32 direction;
+ s16 x;
+ s16 y;
+
+ direction = playerDirection;
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ EventObjectMoveDestCoords(eventObject, direction, &x, &y);
+ EventObjectSetSingleMovement(eventObject, sprite, GetSlideMovementAction(direction));
+ if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
+ }
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 cph_IM_DIFFERENT(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ u32 direction;
+
+ direction = playerDirection;
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ EventObjectSetSingleMovement(eventObject, sprite, GetJumpInPlaceMovementAction(direction));
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 CopyablePlayerMovement_GoSpeed4(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ u32 direction;
+ s16 x;
+ s16 y;
+
+ direction = playerDirection;
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ EventObjectMoveDestCoords(eventObject, direction, &x, &y);
+ EventObjectSetSingleMovement(eventObject, sprite, GetJumpMovementAction(direction));
+ if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
+ }
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+bool8 CopyablePlayerMovement_Jump(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
+{
+ u32 direction;
+ s16 x;
+ s16 y;
+
+ direction = playerDirection;
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
+ x = eventObject->currentCoords.x;
+ y = eventObject->currentCoords.y;
+ MoveCoordsInDirection(direction, &x, &y, 2, 2);
+ EventObjectSetSingleMovement(eventObject, sprite, GetJump2MovementAction(direction));
+ if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
+ }
+ eventObject->singleMovementActive = 1;
+ sprite->data[1] = 2;
+ return TRUE;
+}
+
+movement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerInGrass)
+
+bool8 MovementType_CopyPlayerInGrass_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (gEventObjects[gPlayerAvatar.eventObjectId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER)
+ {
+ return FALSE;
+ }
+ return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](eventObject, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass);
+}
+
+void MovementType_TreeDisguise(struct Sprite *sprite)
+{
+ struct EventObject *eventObject;
+
+ eventObject = &gEventObjects[sprite->data[0]];
+ if (eventObject->directionSequenceIndex == 0 || (eventObject->directionSequenceIndex == 1 && !sprite->data[7]))
+ {
+ EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ eventObject->fieldEffectSpriteId = FieldEffectStart(FLDEFF_TREE_DISGUISE);
+ eventObject->directionSequenceIndex = 1;
+ sprite->data[7]++;
+ }
+ UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, MovementType_Disguise_Callback);
+}
+
+static bool8 MovementType_Disguise_Callback(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ return FALSE;
+}
+
+void MovementType_MountainDisguise(struct Sprite *sprite)
+{
+ struct EventObject *eventObject;
+
+ eventObject = &gEventObjects[sprite->data[0]];
+ if (eventObject->directionSequenceIndex == 0 || (eventObject->directionSequenceIndex == 1 && !sprite->data[7]))
+ {
+ EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ eventObject->fieldEffectSpriteId = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE);
+ eventObject->directionSequenceIndex = 1;
+ sprite->data[7]++;
+ }
+ UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, MovementType_Disguise_Callback);
+}
+
+void MovementType_Hidden(struct Sprite *sprite)
+{
+ if (!sprite->data[7])
+ {
+ gEventObjects[sprite->data[0]].fixedPriority = TRUE;
+ sprite->subspriteMode = 2;
+ sprite->oam.priority = 3;
+ sprite->data[7]++;
+ }
+ UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, MovementType_Hidden_Callback);
+}
+
+static bool8 MovementType_Hidden_Callback(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ return gMovementTypeFuncs_Hidden[sprite->data[1]](eventObject, sprite);
+}
+
+bool8 MovementType_Hidden_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ return FALSE;
+}
+
+bool8 MovementType_MoveInPlace_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ sprite->data[1] = 0;
+ }
+ return FALSE;
+}
+
+movement_type_def(MovementType_WalkInPlace, gMovementTypeFuncs_WalkInPlace)
+
+bool8 MovementType_WalkInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceNormalMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_WalkSlowlyInPlace, gMovementTypeFuncs_WalkSlowlyInPlace)
+
+bool8 MovementType_WalkSlowlyInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceSlowMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_JogInPlace, gMovementTypeFuncs_JogInPlace)
+
+bool8 MovementType_JogInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceFastMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_RunInPlace, gMovementTypeFuncs_RunInPlace)
+
+bool8 MovementType_RunInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceFastestMovementAction(eventObject->facingDirection));
+ sprite->data[1] = 1;
+ return TRUE;
+}
+
+movement_type_def(MovementType_Invisible, gMovementTypeFuncs_Invisible)
+
+bool8 MovementType_Invisible_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ ClearEventObjectMovement(eventObject, sprite);
+ EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection));
+ eventObject->invisible = TRUE;
+ sprite->data[1] = 1;
+ return TRUE;
+}
+bool8 MovementType_Invisible_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectExecSingleMovementAction(eventObject, sprite))
+ {
+ sprite->data[1] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementType_Invisible_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->singleMovementActive = 0;
+ return FALSE;
+}
+
+static void ClearEventObjectMovement(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->singleMovementActive = 0;
+ eventObject->heldMovementActive = FALSE;
+ eventObject->heldMovementFinished = FALSE;
+ eventObject->movementActionId = 0xFF;
+ sprite->data[1] = 0;
+}
+
+u8 GetFaceDirectionAnimNum(u8 direction)
+{
+ return gFaceDirectionAnimNums[direction];
+}
+
+u8 GetMoveDirectionAnimNum(u8 direction)
+{
+ return gMoveDirectionAnimNums[direction];
+}
+
+u8 GetMoveDirectionFastAnimNum(u8 direction)
+{
+ return gMoveDirectionFastAnimNums[direction];
+}
+
+u8 GetMoveDirectionFasterAnimNum(u8 direction)
+{
+ return gMoveDirectionFasterAnimNums[direction];
+}
+
+u8 GetMoveDirectionFastestAnimNum(u8 direction)
+{
+ return gMoveDirectionFastestAnimNums[direction];
+}
+
+u8 GetJumpSpecialDirectionAnimNum(u8 direction)
+{
+ return gJumpSpecialDirectionAnimNums[direction];
+}
+
+u8 GetAcroWheelieDirectionAnimNum(u8 direction)
+{
+ return gAcroWheelieDirectionAnimNums[direction];
+}
+
+u8 Unref_GetAnimNums_08375633(u8 direction)
+{
+ return gUnrefAnimNums_08375633[direction];
+}
+
+u8 GetAcroEndWheelieDirectionAnimNum(u8 direction)
+{
+ return gAcroEndWheelieDirectionAnimNums[direction];
+}
+
+u8 GetAcroUnusedActionDirectionAnimNum(u8 direction)
+{
+ return gAcroUnusedActionDirectionAnimNums[direction];
+}
+
+u8 GetAcroWheeliePedalDirectionAnimNum(u8 direction)
+{
+ return gAcroWheeliePedalDirectionAnimNums[direction];
+}
+
+u8 GetFishingDirectionAnimNum(u8 direction)
+{
+ return gFishingDirectionAnimNums[direction];
+}
+
+u8 GetFishingNoCatchDirectionAnimNum(u8 direction)
+{
+ return gFishingNoCatchDirectionAnimNums[direction];
+}
+
+u8 GetFishingBiteDirectionAnimNum(u8 direction)
+{
+ return gFishingBiteDirectionAnimNums[direction];
+}
+
+u8 GetRunningDirectionAnimNum(u8 direction)
+{
+ return gRunningDirectionAnimNums[direction];
+}
+
+static const struct UnkStruct_085094AC *sub_8092A4C(const union AnimCmd *const *anims)
+{
+ const struct UnkStruct_085094AC *retval;
+
+ for (retval = gUnknown_085094AC; retval->anims != NULL; retval++)
+ {
+ if (retval->anims == anims)
+ {
+ return retval;
+ }
+ }
+ return NULL;
+}
+
+void npc_apply_anim_looping(struct EventObject *eventObject, struct Sprite *sprite, u8 animNum)
+{
+ const struct UnkStruct_085094AC *unk85094AC;
+
+ if (!eventObject->inanimate)
+ {
+ sprite->animNum = animNum;
+ unk85094AC = sub_8092A4C(sprite->anims);
+ if (unk85094AC != NULL)
+ {
+ if (sprite->animCmdIndex == unk85094AC->animPos[0])
+ {
+ sprite->animCmdIndex = unk85094AC->animPos[3];
+ }
+ else if (sprite->animCmdIndex == unk85094AC->animPos[1])
+ {
+ sprite->animCmdIndex = unk85094AC->animPos[2];
+ }
+ }
+ SeekSpriteAnim(sprite, sprite->animCmdIndex);
+ }
+}
+
+void obj_npc_animation_step(struct EventObject *eventObject, struct Sprite *sprite, u8 animNum)
+{
+ const struct UnkStruct_085094AC *unk85094AC;
+
+ if (!eventObject->inanimate)
+ {
+ u8 animPos;
+
+ sprite->animNum = animNum;
+ unk85094AC = sub_8092A4C(sprite->anims);
+ if (unk85094AC != NULL)
+ {
+ animPos = unk85094AC->animPos[1];
+ if (sprite->animCmdIndex <= unk85094AC->animPos[0])
+ {
+ animPos = unk85094AC->animPos[0];
+ }
+ SeekSpriteAnim(sprite, animPos);
+ }
+ }
+}
+
+// file boundary?
+
+u8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2)
+{
+ if (x1 > x2)
+ {
+ return DIR_WEST;
+ }
+ if (x1 < x2)
+ {
+ return DIR_EAST;
+ }
+ if (y1 > y2)
+ {
+ return DIR_NORTH;
+ }
+ return DIR_SOUTH;
+}
+
+void SetTrainerMovementType(struct EventObject *eventObject, u8 movementType)
+{
+ eventObject->movementType = movementType;
+ eventObject->directionSequenceIndex = 0;
+ eventObject->playerCopyableMovement = 0;
+ gSprites[eventObject->spriteId].callback = sMovementTypeCallbacks[movementType];
+ gSprites[eventObject->spriteId].data[1] = 0;
+}
+
+u8 GetTrainerFacingDirectionMovementType(u8 direction)
+{
+ return gTrainerFacingDirectionMovementTypes[direction];
+}
+
+static u8 GetCollisionInDirection(struct EventObject *eventObject, u8 direction)
+{
+ s16 x;
+ s16 y;
+ x = eventObject->currentCoords.x;
+ y = eventObject->currentCoords.y;
+ MoveCoords(direction, &x, &y);
+ return GetCollisionAtCoords(eventObject, x, y, direction);
+}
+
+u8 GetCollisionAtCoords(struct EventObject *eventObject, s16 x, s16 y, u32 dirn)
+{
+ u8 direction;
+
+ direction = dirn;
+ if (IsCoordOutsideEventObjectMovementRange(eventObject, x, y))
+ return 1;
+ else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(eventObject, x, y, direction))
+ return 2;
+ else if (eventObject->trackedByCamera && !CanCameraMoveInDirection(direction))
+ return 2;
+ else if (IsZCoordMismatchAt(eventObject->currentElevation, x, y))
+ return 3;
+ else if (DoesObjectCollideWithObjectAt(eventObject, x, y))
+ return 4;
+ return 0;
+}
+
+u8 GetCollisionFlagsAtCoords(struct EventObject *eventObject, s16 x, s16 y, u8 direction)
+{
+ u8 flags = 0;
+
+ if (IsCoordOutsideEventObjectMovementRange(eventObject, x, y))
+ flags |= 1;
+ if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(eventObject, x, y, direction) || (eventObject->trackedByCamera && !CanCameraMoveInDirection(direction)))
+ flags |= 2;
+ if (IsZCoordMismatchAt(eventObject->currentElevation, x, y))
+ flags |= 4;
+ if (DoesObjectCollideWithObjectAt(eventObject, x, y))
+ flags |= 8;
+ return flags;
+}
+
+static bool8 IsCoordOutsideEventObjectMovementRange(struct EventObject *eventObject, s16 x, s16 y)
+{
+ s16 left;
+ s16 right;
+ s16 top;
+ s16 bottom;
+
+ if (eventObject->range.as_nybbles.x != 0)
+ {
+ left = eventObject->initialCoords.x - eventObject->range.as_nybbles.x;
+ right = eventObject->initialCoords.x + eventObject->range.as_nybbles.x;
+ if (left > x || right < x)
+ {
+ return TRUE;
+ }
+ }
+ if (eventObject->range.as_nybbles.y != 0)
+ {
+ top = eventObject->initialCoords.y - eventObject->range.as_nybbles.y;
+ bottom = eventObject->initialCoords.y + eventObject->range.as_nybbles.y;
+ if (top > y || bottom < y)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 IsMetatileDirectionallyImpassable(struct EventObject *eventObject, s16 x, s16 y, u8 direction)
+{
+ if (gOppositeDirectionBlockedMetatileFuncs[direction - 1](eventObject->currentMetatileBehavior)
+ || gDirectionBlockedMetatileFuncs[direction - 1](MapGridGetMetatileBehaviorAt(x, y)))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 DoesObjectCollideWithObjectAt(struct EventObject *eventObject, s16 x, s16 y)
+{
+ u8 i;
+ struct EventObject *curObject;
+
+ for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ {
+ curObject = &gEventObjects[i];
+ if (curObject->active && curObject != eventObject)
+ {
+ if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y))
+ {
+ if (AreZCoordsCompatible(eventObject->currentElevation, curObject->currentElevation))
+ {
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)
+ && gSprites[gEventObjects[eventObjectId].spriteId].data[7] & 2)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_8092EF0(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 eventObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId))
+ {
+ gSprites[gEventObjects[eventObjectId].spriteId].data[7] |= 0x04;
+ }
+}
+
+void MoveCoords(u8 direction, s16 *x, s16 *y)
+{
+ *x += gDirectionToVectors[direction].x;
+ *y += gDirectionToVectors[direction].y;
+}
+
+void sub_8092F60(u8 direction, s16 *x, s16 *y)
+{
+ *x += gDirectionToVectors[direction].x << 4;
+ *y += gDirectionToVectors[direction].y << 4;
+}
+
+static void MoveCoordsInDirection(u32 dir, s16 *x, s16 *y, s16 deltaX, s16 deltaY)
+{
+ u8 direction = dir;
+ s16 dx2 = (u16)deltaX;
+ s16 dy2 = (u16)deltaY;
+ if (gDirectionToVectors[direction].x > 0)
+ *x += dx2;
+ if (gDirectionToVectors[direction].x < 0)
+ *x -= dx2;
+ if (gDirectionToVectors[direction].y > 0)
+ *y += dy2;
+ if (gDirectionToVectors[direction].y < 0)
+ *y -= dy2;
+}
+
+void sub_8092FF0(s16 x, s16 y, s16 *dest_x, s16 *dest_y)
+{
+ *dest_x = (x - gSaveBlock1Ptr->pos.x) << 4;
+ *dest_y = (y - gSaveBlock1Ptr->pos.y) << 4;
+ *dest_x -= gUnknown_03005DEC;
+ *dest_y -= gUnknown_03005DE8;
+}
+
+void sub_8093038(s16 x, s16 y, s16 *dest_x, s16 *dest_y)
+{
+ s16 dx;
+ s16 dy;
+
+ dx = -gUnknown_03005DEC - gUnknown_03005DD0.x;
+ dy = -gUnknown_03005DE8 - gUnknown_03005DD0.y;
+ if (gUnknown_03005DD0.x > 0)
+ {
+ dx += 0x10;
+ }
+ if (gUnknown_03005DD0.x < 0)
+ {
+ dx -= 0x10;
+ }
+ if (gUnknown_03005DD0.y > 0)
+ {
+ dy += 0x10;
+ }
+ if (gUnknown_03005DD0.y < 0)
+ {
+ dy -= 0x10;
+ }
+ *dest_x = ((x - gSaveBlock1Ptr->pos.x) << 4) + dx;
+ *dest_y = ((y - gSaveBlock1Ptr->pos.y) << 4) + dy;
+}
+
+void sub_80930E0(s16 *x, s16 *y, s16 dx, s16 dy)
+{
+ sub_8093038(*x, *y, x, y);
+ *x += dx;
+ *y += dy;
+}
+
+static void GetEventObjectMovingCameraOffset(s16 *x, s16 *y)
+{
+ *x = 0;
+ *y = 0;
+ if (gUnknown_03005DD0.x > 0)
+ {
+ (*x)++;
+ }
+ if (gUnknown_03005DD0.x < 0)
+ {
+ (*x) --;
+ }
+ if (gUnknown_03005DD0.y > 0)
+ {
+ (*y)++;
+ }
+ if (gUnknown_03005DD0.y < 0)
+ {
+ (*y) --;
+ }
+}
+
+void EventObjectMoveDestCoords(struct EventObject *eventObject, u32 direction, s16 *x, s16 *y)
+{
+ u8 newDirn = direction;
+ *x = eventObject->currentCoords.x;
+ *y = eventObject->currentCoords.y;
+ MoveCoords(newDirn, x, y);
+}
+
+bool8 EventObjectIsMovementOverridden(struct EventObject *eventObject)
+{
+ if (eventObject->singleMovementActive || eventObject->heldMovementActive)
+ return TRUE;
+
+ return FALSE;
+}
+
+bool8 EventObjectIsHeldMovementActive(struct EventObject *eventObject)
+{
+ if (eventObject->heldMovementActive && eventObject->movementActionId != 0xFF)
+ return TRUE;
+
+ return FALSE;
+}
+
+bool8 EventObjectSetHeldMovement(struct EventObject *eventObject, u8 movementActionId)
+{
+ if (EventObjectIsMovementOverridden(eventObject))
+ return TRUE;
+
+ UnfreezeEventObject(eventObject);
+ eventObject->movementActionId = movementActionId;
+ eventObject->heldMovementActive = TRUE;
+ eventObject->heldMovementFinished = FALSE;
+ gSprites[eventObject->spriteId].data[2] = 0;
+ return FALSE;
+}
+
+void EventObjectForceSetHeldMovement(struct EventObject *eventObject, u8 movementActionId)
+{
+ EventObjectClearHeldMovementIfActive(eventObject);
+ EventObjectSetHeldMovement(eventObject, movementActionId);
+}
+
+void EventObjectClearHeldMovementIfActive(struct EventObject *eventObject)
+{
+ if (eventObject->heldMovementActive)
+ EventObjectClearHeldMovement(eventObject);
+}
+
+void EventObjectClearHeldMovement(struct EventObject *eventObject)
+{
+ eventObject->movementActionId = 0xFF;
+ eventObject->heldMovementActive = FALSE;
+ eventObject->heldMovementFinished = FALSE;
+ gSprites[eventObject->spriteId].data[1] = 0;
+ gSprites[eventObject->spriteId].data[2] = 0;
+}
+
+u8 EventObjectCheckHeldMovementStatus(struct EventObject *eventObject)
+{
+ if (eventObject->heldMovementActive)
+ return eventObject->heldMovementFinished;
+
+ return 16;
+}
+
+u8 EventObjectClearHeldMovementIfFinished(struct EventObject *eventObject)
+{
+ u8 heldMovementStatus = EventObjectCheckHeldMovementStatus(eventObject);
+ if (heldMovementStatus != 0 && heldMovementStatus != 16)
+ EventObjectClearHeldMovementIfActive(eventObject);
+
+ return heldMovementStatus;
+}
+
+u8 EventObjectGetHeldMovementActionId(struct EventObject *eventObject)
+{
+ if (eventObject->heldMovementActive)
+ return eventObject->movementActionId;
+
+ return 0xFF;
+}
+
+void UpdateEventObjectCurrentMovement(struct EventObject *eventObject, struct Sprite *sprite, bool8 (*callback)(struct EventObject *, struct Sprite *))
+{
+ DoGroundEffects_OnSpawn(eventObject, sprite);
+ TryEnableEventObjectAnim(eventObject, sprite);
+ if (EventObjectIsHeldMovementActive(eventObject))
+ {
+ EventObjectExecHeldMovementAction(eventObject, sprite);
+ }
+ else if (!eventObject->frozen)
+ {
+ while (callback(eventObject, sprite));
+ }
+ DoGroundEffects_OnBeginStep(eventObject, sprite);
+ DoGroundEffects_OnFinishStep(eventObject, sprite);
+ UpdateEventObjectSpriteAnimPause(eventObject, sprite);
+ UpdateEventObjectVisibility(eventObject, sprite);
+ EventObjectUpdateSubpriority(eventObject, sprite);
+}
+
+#define dirn_to_anim(name, table)\
+u8 name(u32 idx)\
+{\
+ u8 direction;\
+ u8 animIds[sizeof(table)];\
+ direction = idx;\
+ memcpy(animIds, (table), sizeof(table));\
+ if (direction > DIR_EAST) direction = 0;\
+ return animIds[direction];\
+}
+
+dirn_to_anim(GetFaceDirectionMovementAction, gFaceDirectionMovementActions);
+dirn_to_anim(GetWalkSlowMovementAction, gWalkSlowMovementActions);
+dirn_to_anim(GetWalkNormalMovementAction, gWalkNormalMovementActions);
+dirn_to_anim(GetWalkFastMovementAction, gWalkFastMovementActions);
+dirn_to_anim(GetRideWaterCurrentMovementAction, gRideWaterCurrentMovementActions);
+dirn_to_anim(GetWalkFastestMovementAction, gWalkFastestMovementActions);
+dirn_to_anim(GetSlideMovementAction, gSlideMovementActions);
+dirn_to_anim(GetPlayerRunMovementAction, gPlayerRunMovementActions);
+dirn_to_anim(GetJump2MovementAction, gJump2MovementActions);
+dirn_to_anim(GetJumpInPlaceMovementAction, gJumpInPlaceMovementActions);
+dirn_to_anim(GetJumpInPlaceTurnAroundMovementAction, gJumpInPlaceTurnAroundMovementActions);
+dirn_to_anim(GetJumpMovementAction, gJumpMovementActions);
+dirn_to_anim(GetJumpSpecialMovementAction, gJumpSpecialMovementActions);
+dirn_to_anim(GetWalkInPlaceSlowMovementAction, gWalkInPlaceSlowMovementActions);
+dirn_to_anim(GetWalkInPlaceNormalMovementAction, gWalkInPlaceNormalMovementActions);
+dirn_to_anim(GetWalkInPlaceFastMovementAction, gWalkInPlaceFastMovementActions);
+dirn_to_anim(GetWalkInPlaceFastestMovementAction, gWalkInPlaceFastestMovementActions);
+
+bool8 EventObjectFaceOppositeDirection(struct EventObject *eventObject, u8 direction)
+{
+ return EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(GetOppositeDirection(direction)));
+}
+
+dirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, gAcroWheelieFaceDirectionMovementActions);
+dirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, gAcroPopWheelieFaceDirectionMovementActions);
+dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, gAcroEndWheelieFaceDirectionMovementActions);
+dirn_to_anim(GetAcroWheelieHopFaceDirectionMovementAction, gAcroWheelieHopFaceDirectionMovementActions);
+dirn_to_anim(GetAcroWheelieHopDirectionMovementAction, gAcroWheelieHopDirectionMovementActions);
+dirn_to_anim(GetAcroWheelieJumpDirectionMovementAction, gAcroWheelieJumpDirectionMovementActions);
+dirn_to_anim(GetAcroWheelieInPlaceDirectionMovementAction, gAcroWheelieInPlaceDirectionMovementActions);
+dirn_to_anim(GetAcroPopWheelieMoveDirectionMovementAction, gAcroPopWheelieMoveDirectionMovementActions);
+dirn_to_anim(GetAcroWheelieMoveDirectionMovementAction, gAcroWheelieMoveDirectionMovementActions);
+dirn_to_anim(GetAcroEndWheelieMoveDirectionMovementAction, gAcroEndWheelieMoveDirectionMovementActions);
+
+u8 GetOppositeDirection(u8 direction)
+{
+ u8 directions[sizeof gOppositeDirections];
+
+ memcpy(directions, gOppositeDirections, sizeof gOppositeDirections);
+ if (direction < 1 || direction > (sizeof gOppositeDirections))
+ {
+ return direction;
+ }
+ return directions[direction - 1];
+}
+
+static u32 zffu_offset_calc(u8 a0, u8 a1)
+{
+ return gUnknown_0850DC2F[a0 - 1][a1 - 1];
+}
+
+static u32 state_to_direction(u8 a0, u32 a1, u32 a2)
+{
+ u32 zffuOffset;
+ u8 a1_2;
+ u8 a2_2;
+
+ a1_2 = a1;
+ a2_2 = a2;
+ if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST)
+ {
+ return 0;
+ }
+ zffuOffset = zffu_offset_calc(a1_2, a2);
+ return gUnknown_0850DC3F[a0 - 1][zffuOffset - 1];
+}
+
+static void EventObjectExecHeldMovementAction(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (gMovementActionFuncs[eventObject->movementActionId][sprite->data[2]](eventObject, sprite))
+ {
+ eventObject->heldMovementFinished = TRUE;
+ }
+}
+
+static bool8 EventObjectExecSingleMovementAction(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (gMovementActionFuncs[eventObject->movementActionId][sprite->data[2]](eventObject, sprite))
+ {
+ eventObject->movementActionId = 0xFF;
+ sprite->data[2] = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void EventObjectSetSingleMovement(struct EventObject *eventObject, struct Sprite *sprite, u8 animId)
+{
+ eventObject->movementActionId = animId;
+ sprite->data[2] = 0;
+}
+
+static void FaceDirection(struct EventObject *eventObject, struct Sprite *sprite, u8 direction)
+{
+ SetEventObjectDirection(eventObject, direction);
+ ShiftStillEventObjectCoords(eventObject);
+ obj_npc_animation_step(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection));
+ sprite->animPaused = TRUE;
+ sprite->data[2] = 1;
+}
+
+bool8 MovementAction_FaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FaceDirection(eventObject, sprite, DIR_SOUTH);
+ return TRUE;
+}
+
+bool8 MovementAction_FaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FaceDirection(eventObject, sprite, DIR_NORTH);
+ return TRUE;
+}
+
+bool8 MovementAction_FaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FaceDirection(eventObject, sprite, DIR_WEST);
+ return TRUE;
+}
+
+bool8 MovementAction_FaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FaceDirection(eventObject, sprite, DIR_EAST);
+ return TRUE;
+}
+
+void npc_apply_direction(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed)
+{
+ s16 x;
+ s16 y;
+
+ x = eventObject->currentCoords.x;
+ y = eventObject->currentCoords.y;
+ SetEventObjectDirection(eventObject, direction);
+ MoveCoords(direction, &x, &y);
+ ShiftEventObjectCoords(eventObject, x, y);
+ oamt_npc_ministep_reset(sprite, direction, speed);
+ sprite->animPaused = FALSE;
+ if (gLockedAnimEventObjects != NULL && FindLockedEventObjectIndex(eventObject) != NUM_EVENT_OBJECTS)
+ {
+ sprite->animPaused = TRUE;
+ }
+ eventObject->triggerGroundEffectsOnMove = TRUE;
+ sprite->data[2] = 1;
+}
+
+void do_go_anim(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed)
+{
+ u8 (*functions[ARRAY_COUNT(gUnknown_0850DEE8)])(u8);
+
+ memcpy(functions, gUnknown_0850DEE8, sizeof gUnknown_0850DEE8);
+ npc_apply_direction(eventObject, sprite, direction, speed);
+ npc_apply_anim_looping(eventObject, sprite, functions[speed](eventObject->facingDirection));
+}
+
+void StartRunningAnim(struct EventObject *eventObject, struct Sprite *sprite, u8 direction)
+{
+ npc_apply_direction(eventObject, sprite, direction, 1);
+ npc_apply_anim_looping(eventObject, sprite, GetRunningDirectionAnimNum(eventObject->facingDirection));
+}
+
+bool8 npc_obj_ministep_stop_on_arrival(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (obj_npc_ministep(sprite))
+ {
+ ShiftStillEventObjectCoords(eventObject);
+ eventObject->triggerGroundEffectsOnStop = TRUE;
+ sprite->animPaused = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8093AF0(struct EventObject *eventObject, struct Sprite *sprite, u8 direction)
+{
+ s16 x;
+ s16 y;
+
+ x = eventObject->currentCoords.x;
+ y = eventObject->currentCoords.y;
+ SetEventObjectDirection(eventObject, direction);
+ MoveCoords(direction, &x, &y);
+ ShiftEventObjectCoords(eventObject, x, y);
+ sub_80976DC(sprite, direction);
+ sprite->animPaused = FALSE;
+ eventObject->triggerGroundEffectsOnMove = TRUE;
+ sprite->data[2] = 1;
+}
+
+void sub_8093B60(struct EventObject *eventObject, struct Sprite *sprite, u8 direction)
+{
+ sub_8093AF0(eventObject, sprite, direction);
+ npc_apply_anim_looping(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection));
+}
+
+bool8 an_walk_any_2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80976EC(sprite))
+ {
+ ShiftStillEventObjectCoords(eventObject);
+ eventObject->triggerGroundEffectsOnStop = TRUE;
+ sprite->animPaused = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowDiagonalUpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_NORTHWEST);
+ return MovementAction_WalkSlowDiagonalUpLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowDiagonalUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowDiagonalUpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_NORTHEAST);
+ return MovementAction_WalkSlowDiagonalUpRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowDiagonalUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowDiagonalDownLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_SOUTHWEST);
+ return MovementAction_WalkSlowDiagonalDownLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowDiagonalDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowDiagonalDownRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_SOUTHEAST);
+ return MovementAction_WalkSlowDiagonalDownRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowDiagonalDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_SOUTH);
+ return MovementAction_WalkSlowDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_NORTH);
+ return MovementAction_WalkSlowUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_WEST);
+ return MovementAction_WalkSlowLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkSlowRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_EAST);
+ return MovementAction_WalkSlowRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkSlowRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalDiagonalUpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_NORTHWEST, 0);
+ return MovementAction_WalkNormalDiagonalUpLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalDiagonalUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalDiagonalUpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_NORTHEAST, 0);
+ return MovementAction_WalkNormalDiagonalUpRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalDiagonalUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalDiagonalDownLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_SOUTHWEST, 0);
+ return MovementAction_WalkNormalDiagonalDownLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalDiagonalDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalDiagonalDownRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_SOUTHEAST, 0);
+ return MovementAction_WalkNormalDiagonalDownRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_SOUTH, 0);
+ return MovementAction_WalkNormalDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_NORTH, 0);
+ return MovementAction_WalkNormalUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_WEST, 0);
+ return MovementAction_WalkNormalLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkNormalRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_EAST, 0);
+ return MovementAction_WalkNormalRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkNormalRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8093FC4(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a5)
+{
+ s16 displacements[ARRAY_COUNT(gUnknown_0850DFBC)];
+ s16 x;
+ s16 y;
+
+ memcpy(displacements, gUnknown_0850DFBC, sizeof gUnknown_0850DFBC);
+ x = 0;
+ y = 0;
+ SetEventObjectDirection(eventObject, direction);
+ MoveCoordsInDirection(direction, &x, &y, displacements[speed], displacements[speed]);
+ ShiftEventObjectCoords(eventObject, eventObject->currentCoords.x + x, eventObject->currentCoords.y + y);
+ sub_809783C(sprite, direction, speed, a5);
+ sprite->data[2] = 1;
+ sprite->animPaused = 0;
+ eventObject->triggerGroundEffectsOnMove = 1;
+ eventObject->disableCoveringGroundEffects = 1;
+}
+
+void maybe_shadow_1(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4)
+{
+ sub_8093FC4(eventObject, sprite, direction, speed, a4);
+ npc_apply_anim_looping(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection));
+ DoShadowFieldEffect(eventObject);
+}
+
+u8 sub_80940C4(struct EventObject *eventObject, struct Sprite *sprite, u8 callback(struct Sprite *))
+{
+ s16 displacements[ARRAY_COUNT(gUnknown_0850DFC2)];
+ s16 x;
+ s16 y;
+ u8 result;
+
+ memcpy(displacements, gUnknown_0850DFC2, sizeof gUnknown_0850DFC2);
+ result = callback(sprite);
+ if (result == 1 && displacements[sprite->data[4]] != 0)
+ {
+ x = 0;
+ y = 0;
+ MoveCoordsInDirection(eventObject->movementDirection, &x, &y, displacements[sprite->data[4]], displacements[sprite->data[4]]);
+ ShiftEventObjectCoords(eventObject, eventObject->currentCoords.x + x, eventObject->currentCoords.y + y);
+ eventObject->triggerGroundEffectsOnMove = TRUE;
+ eventObject->disableCoveringGroundEffects = TRUE;
+ }
+ else if (result == 0xFF)
+ {
+ ShiftStillEventObjectCoords(eventObject);
+ eventObject->triggerGroundEffectsOnStop = TRUE;
+ eventObject->landingJump = TRUE;
+ sprite->animPaused = TRUE;
+ }
+ return result;
+}
+
+u8 sub_8094188(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ return sub_80940C4(eventObject, sprite, sub_809785C);
+}
+
+u8 sub_809419C(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ return sub_80940C4(eventObject, sprite, sub_80978E4);
+}
+
+bool8 sub_80941B0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_8094188(eventObject, sprite) == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80941C8(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_809419C(eventObject, sprite) == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80941E0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ switch (sub_8094188(eventObject, sprite))
+ {
+ case 255:
+ return TRUE;
+ case 1:
+ SetEventObjectDirection(eventObject, GetOppositeDirection(eventObject->movementDirection));
+ obj_npc_animation_step(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection));
+ default:
+ return FALSE;
+ }
+}
+
+bool8 MovementAction_Jump2Down_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 2, 0);
+ return MovementAction_Jump2Down_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Jump2Down_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_Jump2Up_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_NORTH, 2, 0);
+ return MovementAction_Jump2Up_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Jump2Up_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_Jump2Left_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_WEST, 2, 0);
+ return MovementAction_Jump2Left_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Jump2Left_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_Jump2Right_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_EAST, 2, 0);
+ return MovementAction_Jump2Right_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Jump2Right_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+void sub_8094390(struct Sprite *sprite, u16 duration)
+{
+ sprite->data[2] = 1;
+ sprite->data[3] = duration;
+}
+
+bool8 MovementAction_Delay_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (-- sprite->data[3] == 0)
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_Delay1_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094390(sprite, 1);
+ return MovementAction_Delay_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Delay2_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094390(sprite, 2);
+ return MovementAction_Delay_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Delay4_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094390(sprite, 4);
+ return MovementAction_Delay_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Delay8_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094390(sprite, 8);
+ return MovementAction_Delay_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Delay16_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094390(sprite, 16);
+ return MovementAction_Delay_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_SOUTH, 1);
+ return MovementAction_WalkFastDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkFastUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_NORTH, 1);
+ return MovementAction_WalkFastUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkFastLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_WEST, 1);
+ return MovementAction_WalkFastLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkFastRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_EAST, 1);
+ return MovementAction_WalkFastRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+void sub_8094554(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration)
+{
+ SetEventObjectDirection(eventObject, direction);
+ npc_apply_anim_looping(eventObject, sprite, animNum);
+ sprite->animPaused = FALSE;
+ sprite->data[2] = 1;
+ sprite->data[3] = duration;
+}
+
+bool8 MovementAction_WalkInPlace_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (-- sprite->data[3] == 0)
+ {
+ sprite->data[2] = 2;
+ sprite->animPaused = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkInPlaceSlow_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sprite->data[3] & 1)
+ {
+ sprite->animDelayCounter++;
+ }
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 32);
+ return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32);
+ return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 32);
+ return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 32);
+ return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 16);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 16);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 16);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 16);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionFastAnimNum(DIR_SOUTH), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionFastAnimNum(DIR_NORTH), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionFastAnimNum(DIR_WEST), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionFastAnimNum(DIR_EAST), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastestDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionFasterAnimNum(DIR_SOUTH), 4);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastestUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionFasterAnimNum(DIR_NORTH), 4);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastestLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkInPlaceFastestRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_RideWaterCurrentDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_SOUTH, 2);
+ return MovementAction_RideWaterCurrentDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_RideWaterCurrentDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_RideWaterCurrentUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_NORTH, 2);
+ return MovementAction_RideWaterCurrentUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_RideWaterCurrentUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_RideWaterCurrentLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_WEST, 2);
+ return MovementAction_RideWaterCurrentLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_RideWaterCurrentLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_RideWaterCurrentRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_EAST, 2);
+ return MovementAction_RideWaterCurrentRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_RideWaterCurrentRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkFastestDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_SOUTH, 3);
+ return MovementAction_WalkFastestDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastestDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkFastestUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_NORTH, 3);
+ return MovementAction_WalkFastestUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastestUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkFastestLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_WEST, 3);
+ return MovementAction_WalkFastestLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastestLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkFastestRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_EAST, 3);
+ return MovementAction_WalkFastestRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkFastestRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_SlideDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_SOUTH, 4);
+ return MovementAction_SlideDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_SlideDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_SlideUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_NORTH, 4);
+ return MovementAction_SlideUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_SlideUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_SlideLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_WEST, 4);
+ return MovementAction_SlideLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_SlideLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_SlideRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_EAST, 4);
+ return MovementAction_SlideRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_SlideRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_PlayerRunDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartRunningAnim(eventObject, sprite, DIR_SOUTH);
+ return MovementAction_PlayerRunDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_PlayerRunDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_PlayerRunUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartRunningAnim(eventObject, sprite, DIR_NORTH);
+ return MovementAction_PlayerRunUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_PlayerRunUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_PlayerRunLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartRunningAnim(eventObject, sprite, DIR_WEST);
+ return MovementAction_PlayerRunLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_PlayerRunLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_PlayerRunRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartRunningAnim(eventObject, sprite, DIR_EAST);
+ return MovementAction_PlayerRunRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_PlayerRunRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void StartSpriteAnimInDirection(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 animNum)
+{
+ SetAndStartSpriteAnim(sprite, animNum, 0);
+ SetEventObjectDirection(eventObject, direction);
+ sprite->data[2] = 1;
+}
+
+bool8 MovementAction_StartAnimInDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, eventObject->movementDirection, sprite->animNum);
+ return FALSE;
+}
+
+bool8 MovementAction_WaitSpriteAnim(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (SpriteAnimEnded(sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8094DE4(struct EventObject *eventObject, struct Sprite *sprite, u8 direction)
+{
+ sub_8093FC4(eventObject, sprite, direction, 1, 0);
+ StartSpriteAnim(sprite, GetJumpSpecialDirectionAnimNum(direction));
+}
+
+bool8 MovementAction_JumpSpecialDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094DE4(eventObject, sprite, DIR_SOUTH);
+ return MovementAction_JumpSpecialDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpSpecialDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941C8(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ eventObject->landingJump = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpSpecialUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094DE4(eventObject, sprite, DIR_NORTH);
+ return MovementAction_JumpSpecialUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpSpecialUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941C8(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ eventObject->landingJump = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpSpecialLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094DE4(eventObject, sprite, DIR_WEST);
+ return MovementAction_JumpSpecialLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpSpecialLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941C8(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ eventObject->landingJump = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpSpecialRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094DE4(eventObject, sprite, DIR_EAST);
+ return MovementAction_JumpSpecialRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpSpecialRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941C8(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ eventObject->landingJump = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_FacePlayer_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 playerObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId))
+ {
+ FaceDirection(eventObject, sprite, GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y));
+ }
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_FaceAwayPlayer_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u8 playerObjectId;
+
+ if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId))
+ {
+ FaceDirection(eventObject, sprite, GetOppositeDirection(GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y)));
+ }
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_LockFacingDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->facingDirectionLocked = TRUE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_UnlockFacingDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->facingDirectionLocked = FALSE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_JumpDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 1, 2);
+ return MovementAction_JumpDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_NORTH, 1, 2);
+ return MovementAction_JumpUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_WEST, 1, 2);
+ return MovementAction_JumpLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_EAST, 1, 2);
+ return MovementAction_JumpRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 0, 0);
+ return MovementAction_JumpInPlaceDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_NORTH, 0, 0);
+ return MovementAction_JumpInPlaceUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_WEST, 0, 0);
+ return MovementAction_JumpInPlaceLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_EAST, 0, 0);
+ return MovementAction_JumpInPlaceRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceDownUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 0, 2);
+ return MovementAction_JumpInPlaceDownUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceDownUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941E0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceUpDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_NORTH, 0, 2);
+ return MovementAction_JumpInPlaceUpDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceUpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941E0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_WEST, 0, 2);
+ return MovementAction_JumpInPlaceLeftRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941E0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(eventObject, sprite, DIR_EAST, 0, 2);
+ return MovementAction_JumpInPlaceRightLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941E0(eventObject, sprite))
+ {
+ eventObject->hasShadow = 0;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_FaceOriginalDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FaceDirection(eventObject, sprite, gInitialMovementTypeFacingDirections[eventObject->movementType]);
+ return TRUE;
+}
+
+bool8 MovementAction_NurseJoyBowDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, 0x14);
+ return FALSE;
+}
+
+bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->disableJumpLandingGroundEffect = FALSE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->disableJumpLandingGroundEffect = TRUE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_DisableAnimation_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->inanimate = TRUE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_RestoreAnimation_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->inanimate = GetEventObjectGraphicsInfo(eventObject->graphicsId)->inanimate;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_SetInvisible_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->invisible = TRUE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_SetVisible_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->invisible = FALSE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_EmoteExclamationMark_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON);
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_EmoteQuestionMark_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_QUESTION_MARK_ICON);
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_EmoteHeart_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_HEART_ICON);
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_RevealTrainer_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (eventObject->movementType == MOVEMENT_TYPE_HIDDEN)
+ {
+ sub_80B4578(eventObject);
+ return FALSE;
+ }
+ if (eventObject->movementType != MOVEMENT_TYPE_TREE_DISGUISE && eventObject->movementType != MOVEMENT_TYPE_MOUNTAIN_DISGUISE)
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ sub_8155D78(eventObject);
+ sprite->data[2] = 1;
+ return MovementAction_RevealTrainer_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_RevealTrainer_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_8155DA0(eventObject))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_RockSmashBreak_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ SetAndStartSpriteAnim(sprite, 1, 0);
+ sprite->data[2] = 1;
+ return FALSE;
+}
+
+bool8 MovementAction_RockSmashBreak_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (SpriteAnimEnded(sprite))
+ {
+ SetMovementDelay(sprite, 32);
+ sprite->data[2] = 2;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_RockSmashBreak_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->invisible ^= TRUE;
+ if (WaitForMovementDelay(sprite))
+ {
+ eventObject->invisible = TRUE;
+ sprite->data[2] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_CutTree_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ SetAndStartSpriteAnim(sprite, 1, 0);
+ sprite->data[2] = 1;
+ return FALSE;
+}
+
+bool8 MovementAction_CutTree_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (SpriteAnimEnded(sprite))
+ {
+ SetMovementDelay(sprite, 32);
+ sprite->data[2] = 2;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_CutTree_Step2(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->invisible ^= TRUE;
+ if (WaitForMovementDelay(sprite))
+ {
+ eventObject->invisible = TRUE;
+ sprite->data[2] = 3;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_SetFixedPriority_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->fixedPriority = TRUE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_ClearFixedPriority_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->fixedPriority = FALSE;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_InitAffineAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ InitSpriteAffineAnim(sprite);
+ sprite->affineAnimPaused = TRUE;
+ sprite->subspriteMode = 0;
+ return TRUE;
+}
+
+bool8 MovementAction_ClearAffineAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
+ return TRUE;
+}
+
+bool8 MovementAction_Unknown1_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->unk3_3 = TRUE;
+ return TRUE;
+}
+
+bool8 MovementAction_Unknown2_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ eventObject->unk3_3 = FALSE;
+ return TRUE;
+}
+
+bool8 MovementAction_WalkDownStartAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_SOUTH);
+ sprite->affineAnimPaused = FALSE;
+ StartSpriteAffineAnimIfDifferent(sprite, 0);
+ return MovementAction_WalkDownStartAffine_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkDownStartAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->affineAnimPaused = TRUE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkDownAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8093B60(eventObject, sprite, DIR_SOUTH);
+ sprite->affineAnimPaused = FALSE;
+ ChangeSpriteAffineAnimIfDifferent(sprite, 1);
+ return MovementAction_WalkDownAffine_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkDownAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(eventObject, sprite))
+ {
+ sprite->affineAnimPaused = TRUE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkLeftAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_WEST, 1);
+ sprite->affineAnimPaused = FALSE;
+ ChangeSpriteAffineAnimIfDifferent(sprite, 2);
+ return MovementAction_WalkLeftAffine_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkLeftAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->affineAnimPaused = TRUE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_WalkRightAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ do_go_anim(eventObject, sprite, DIR_EAST, 1);
+ sprite->affineAnimPaused = FALSE;
+ ChangeSpriteAffineAnimIfDifferent(sprite, 3);
+ return MovementAction_WalkRightAffine_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_WalkRightAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->affineAnimPaused = TRUE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80958C0(struct EventObject *eventObject, struct Sprite *sprite, u8 direction)
+{
+ SetEventObjectDirection(eventObject, direction);
+ ShiftStillEventObjectCoords(eventObject);
+ obj_npc_animation_step(eventObject, sprite, GetAcroWheeliePedalDirectionAnimNum(direction));
+ sprite->animPaused = TRUE;
+ sprite->data[2] = 1;
+}
+
+bool8 MovementAction_AcroWheelieFaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80958C0(eventObject, sprite, DIR_SOUTH);
+ return TRUE;
+}
+
+bool8 MovementAction_AcroWheelieFaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80958C0(eventObject, sprite, DIR_NORTH);
+ return TRUE;
+}
+
+bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80958C0(eventObject, sprite, DIR_WEST);
+ return TRUE;
+}
+
+bool8 MovementAction_AcroWheelieFaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80958C0(eventObject, sprite, DIR_EAST);
+ return TRUE;
+}
+
+bool8 MovementAction_AcroPopWheelieDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, GetAcroWheelieDirectionAnimNum(DIR_SOUTH));
+ return FALSE;
+}
+
+bool8 MovementAction_AcroPopWheelieUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_NORTH, GetAcroWheelieDirectionAnimNum(DIR_NORTH));
+ return FALSE;
+}
+
+bool8 MovementAction_AcroPopWheelieLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_WEST, GetAcroWheelieDirectionAnimNum(DIR_WEST));
+ return FALSE;
+}
+
+bool8 MovementAction_AcroPopWheelieRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_EAST, GetAcroWheelieDirectionAnimNum(DIR_EAST));
+ return FALSE;
+}
+
+bool8 MovementAction_AcroEndWheelieFaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, GetAcroEndWheelieDirectionAnimNum(DIR_SOUTH));
+ return FALSE;
+}
+
+bool8 MovementAction_AcroEndWheelieFaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_NORTH, GetAcroEndWheelieDirectionAnimNum(DIR_NORTH));
+ return FALSE;
+}
+
+bool8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_WEST, GetAcroEndWheelieDirectionAnimNum(DIR_WEST));
+ return FALSE;
+}
+
+bool8 MovementAction_AcroEndWheelieFaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_EAST, GetAcroEndWheelieDirectionAnimNum(DIR_EAST));
+ return FALSE;
+}
+
+bool8 MovementAction_UnusedAcroActionDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, GetAcroUnusedActionDirectionAnimNum(DIR_SOUTH));
+ return FALSE;
+}
+
+bool8 MovementAction_UnusedAcroActionUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_NORTH, GetAcroUnusedActionDirectionAnimNum(DIR_NORTH));
+ return FALSE;
+}
+
+bool8 MovementAction_UnusedAcroActionLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_WEST, GetAcroUnusedActionDirectionAnimNum(DIR_WEST));
+ return FALSE;
+}
+
+bool8 MovementAction_UnusedAcroActionRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ StartSpriteAnimInDirection(eventObject, sprite, DIR_EAST, GetAcroUnusedActionDirectionAnimNum(DIR_EAST));
+ return FALSE;
+}
+
+void sub_8095AF0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8097750(sprite);
+ sprite->animPaused = FALSE;
+}
+
+bool8 sub_8095B0C(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_8097758(sprite))
+ {
+ ShiftStillEventObjectCoords(eventObject);
+ eventObject->triggerGroundEffectsOnStop = TRUE;
+ sprite->animPaused = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_Figure8_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095AF0(eventObject, sprite);
+ sprite->data[2] = 1;
+ return MovementAction_Figure8_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_Figure8_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_8095B0C(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8095B84(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4)
+{
+ sub_8093FC4(eventObject, sprite, direction, speed, a4);
+ StartSpriteAnimIfDifferent(sprite, GetAcroWheelieDirectionAnimNum(direction));
+ DoShadowFieldEffect(eventObject);
+}
+
+bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_SOUTH, 0, 1);
+ return MovementAction_AcroWheelieHopFaceDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_NORTH, 0, 1);
+ return MovementAction_AcroWheelieHopFaceUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_WEST, 0, 1);
+ return MovementAction_AcroWheelieHopFaceLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_EAST, 0, 1);
+ return MovementAction_AcroWheelieHopFaceRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieHopDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_SOUTH, 1, 1);
+ return MovementAction_AcroWheelieHopDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieHopUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_NORTH, 1, 1);
+ return MovementAction_AcroWheelieHopUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieHopLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_WEST, 1, 1);
+ return MovementAction_AcroWheelieHopLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieHopRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_EAST, 1, 1);
+ return MovementAction_AcroWheelieHopRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieHopRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieJumpDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_SOUTH, 2, 0);
+ return MovementAction_AcroWheelieJumpDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieJumpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieJumpUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_NORTH, 2, 0);
+ return MovementAction_AcroWheelieJumpUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieJumpUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_WEST, 2, 0);
+ return MovementAction_AcroWheelieJumpLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieJumpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8095B84(eventObject, sprite, DIR_EAST, 2, 0);
+ return MovementAction_AcroWheelieJumpRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieJumpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sub_80941B0(eventObject, sprite))
+ {
+ eventObject->hasShadow = FALSE;
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8094554(eventObject, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8);
+ return MovementAction_WalkInPlace_Step1(eventObject, sprite);
+}
+
+void sub_80960C8(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed)
+{
+ npc_apply_direction(eventObject, sprite, direction, speed);
+ StartSpriteAnim(sprite, GetAcroWheelieDirectionAnimNum(eventObject->facingDirection));
+ SeekSpriteAnim(sprite, 0);
+}
+
+bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80960C8(eventObject, sprite, DIR_SOUTH, 1);
+ return MovementAction_AcroPopWheelieMoveDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80960C8(eventObject, sprite, DIR_NORTH, 1);
+ return MovementAction_AcroPopWheelieMoveUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80960C8(eventObject, sprite, DIR_WEST, 1);
+ return MovementAction_AcroPopWheelieMoveLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_80960C8(eventObject, sprite, DIR_EAST, 1);
+ return MovementAction_AcroPopWheelieMoveRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8096200(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed)
+{
+ npc_apply_direction(eventObject, sprite, direction, speed);
+ npc_apply_anim_looping(eventObject, sprite, GetAcroWheeliePedalDirectionAnimNum(eventObject->facingDirection));
+}
+
+bool8 MovementAction_AcroWheelieMoveDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096200(eventObject, sprite, DIR_SOUTH, 1);
+ return MovementAction_AcroWheelieMoveDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieMoveDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieMoveUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096200(eventObject, sprite, DIR_NORTH, 1);
+ return MovementAction_AcroWheelieMoveUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieMoveUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096200(eventObject, sprite, DIR_WEST, 1);
+ return MovementAction_AcroWheelieMoveLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096200(eventObject, sprite, DIR_EAST, 1);
+ return MovementAction_AcroWheelieMoveRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroWheelieMoveRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8096330(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed)
+{
+ npc_apply_direction(eventObject, sprite, direction, speed);
+ StartSpriteAnim(sprite, GetAcroEndWheelieDirectionAnimNum(eventObject->facingDirection));
+ SeekSpriteAnim(sprite, 0);
+}
+
+bool8 MovementAction_AcroEndWheelieMoveDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096330(eventObject, sprite, DIR_SOUTH, 1);
+ return MovementAction_AcroEndWheelieMoveDown_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroEndWheelieMoveDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroEndWheelieMoveUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096330(eventObject, sprite, DIR_NORTH, 1);
+ return MovementAction_AcroEndWheelieMoveUp_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096330(eventObject, sprite, DIR_WEST, 1);
+ return MovementAction_AcroEndWheelieMoveLeft_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_AcroEndWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096330(eventObject, sprite, DIR_EAST, 1);
+ return MovementAction_AcroEndWheelieMoveRight_Step1(eventObject, sprite);
+}
+
+bool8 MovementAction_AcroEndWheelieMoveRight_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(eventObject, sprite))
+ {
+ sprite->data[2] = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 MovementAction_Levitate_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ CreateLevitateMovementTask(eventObject);
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_StopLevitate_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ DestroyExtraMovementTask(eventObject->warpArrowSpriteId);
+ sprite->pos2.y = 0;
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool8 MovementAction_DestroyExtraTaskIfAtTop_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (sprite->pos2.y == 0)
+ {
+ DestroyExtraMovementTask(eventObject->warpArrowSpriteId);
+ sprite->data[2] = 1;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u8 MovementAction_Finish(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ return TRUE;
+}
+
+bool8 MovementAction_PauseSpriteAnim(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->animPaused = TRUE;
+ return TRUE;
+}
+
+static void UpdateEventObjectSpriteAnimPause(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (eventObject->disableAnim)
+ {
+ sprite->animPaused = TRUE;
+ }
+}
+
+static void TryEnableEventObjectAnim(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (eventObject->enableAnim)
+ {
+ sprite->animPaused = FALSE;
+ eventObject->disableAnim = FALSE;
+ eventObject->enableAnim = FALSE;
+ }
+}
+
+static void UpdateEventObjectVisibility(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sub_8096530(eventObject, sprite);
+ npc_update_obj_anim_flag(eventObject, sprite);
+}
+
+static void sub_8096530(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u16 x;
+ u16 y;
+ u16 x2;
+ u16 y2;
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+
+ eventObject->offScreen = FALSE;
+ graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ }
+ else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+ x2 = graphicsInfo->width;
+ x2 += x;
+ y2 = y;
+ y2 += graphicsInfo->height;
+ if ((s16)x >= 0x100 || (s16)x2 < -0x10)
+ {
+ eventObject->offScreen = TRUE;
+ }
+ if ((s16)y >= 0xB0 || (s16)y2 < -0x10)
+ {
+ eventObject->offScreen = TRUE;
+ }
+}
+
+static void npc_update_obj_anim_flag(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->invisible = FALSE;
+ if (eventObject->invisible || eventObject->offScreen)
+ {
+ sprite->invisible = TRUE;
+ }
+}
+
+/*static*/ void GetAllGroundEffectFlags_OnSpawn(struct EventObject *eventObj, u32 *flags)
+{
+ EventObjectUpdateMetatileBehaviors(eventObj);
+ GetGroundEffectFlags_Reflection(eventObj, flags);
+ GetGroundEffectFlags_TallGrassOnSpawn(eventObj, flags);
+ GetGroundEffectFlags_LongGrassOnSpawn(eventObj, flags);
+ GetGroundEffectFlags_SandHeap(eventObj, flags);
+ GetGroundEffectFlags_ShallowFlowingWater(eventObj, flags);
+ GetGroundEffectFlags_ShortGrass(eventObj, flags);
+ GetGroundEffectFlags_HotSprings(eventObj, flags);
+}
+
+static void GetAllGroundEffectFlags_OnBeginStep(struct EventObject *eventObj, u32 *flags)
+{
+ EventObjectUpdateMetatileBehaviors(eventObj);
+ GetGroundEffectFlags_Reflection(eventObj, flags);
+ GetGroundEffectFlags_TallGrassOnBeginStep(eventObj, flags);
+ GetGroundEffectFlags_LongGrassOnBeginStep(eventObj, flags);
+ GetGroundEffectFlags_Tracks(eventObj, flags);
+ GetGroundEffectFlags_SandHeap(eventObj, flags);
+ GetGroundEffectFlags_ShallowFlowingWater(eventObj, flags);
+ GetGroundEffectFlags_Puddle(eventObj, flags);
+ GetGroundEffectFlags_ShortGrass(eventObj, flags);
+ GetGroundEffectFlags_HotSprings(eventObj, flags);
+}
+
+/*static*/ void GetAllGroundEffectFlags_OnFinishStep(struct EventObject *eventObj, u32 *flags)
+{
+ EventObjectUpdateMetatileBehaviors(eventObj);
+ GetGroundEffectFlags_ShallowFlowingWater(eventObj, flags);
+ GetGroundEffectFlags_SandHeap(eventObj, flags);
+ GetGroundEffectFlags_Puddle(eventObj, flags);
+ GetGroundEffectFlags_Ripple(eventObj, flags);
+ GetGroundEffectFlags_ShortGrass(eventObj, flags);
+ GetGroundEffectFlags_HotSprings(eventObj, flags);
+ GetGroundEffectFlags_Seaweed(eventObj, flags);
+ GetGroundEffectFlags_JumpLanding(eventObj, flags);
+}
+
+static void EventObjectUpdateMetatileBehaviors(struct EventObject *eventObj)
+{
+ eventObj->previousMetatileBehavior = MapGridGetMetatileBehaviorAt(eventObj->previousCoords.x, eventObj->previousCoords.y);
+ eventObj->currentMetatileBehavior = MapGridGetMetatileBehaviorAt(eventObj->currentCoords.x, eventObj->currentCoords.y);
+}
+
+static void GetGroundEffectFlags_Reflection(struct EventObject *eventObj, u32 *flags)
+{
+ u32 reflectionFlags[2] = { GROUND_EFFECT_FLAG_REFLECTION, GROUND_EFFECT_FLAG_ICE_REFLECTION };
+ u8 type = EventObjectCheckForReflectiveSurface(eventObj);
+
+ if (type)
+ {
+ if (!eventObj->hasReflection)
+ {
+ eventObj->hasReflection = 0;
+ eventObj->hasReflection = 1;
+ *flags |= reflectionFlags[type - 1];
+ }
+ }
+ else
+ {
+ eventObj->hasReflection = 0;
+ }
+}
+
+static void GetGroundEffectFlags_TallGrassOnSpawn(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsTallGrass(eventObj->currentMetatileBehavior))
+ *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN;
+}
+
+static void GetGroundEffectFlags_TallGrassOnBeginStep(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsTallGrass(eventObj->currentMetatileBehavior))
+ *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE;
+}
+
+static void GetGroundEffectFlags_LongGrassOnSpawn(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsLongGrass(eventObj->currentMetatileBehavior))
+ *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN;
+}
+
+static void GetGroundEffectFlags_LongGrassOnBeginStep(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsLongGrass(eventObj->currentMetatileBehavior))
+ *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE;
+}
+
+static void GetGroundEffectFlags_Tracks(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsDeepSand(eventObj->previousMetatileBehavior))
+ {
+ *flags |= GROUND_EFFECT_FLAG_DEEP_SAND;
+ }
+ else if (MetatileBehavior_IsSandOrDeepSand(eventObj->previousMetatileBehavior)
+ || MetatileBehavior_IsUnusedFootprintMetatile(eventObj->previousMetatileBehavior))
+ {
+ *flags |= GROUND_EFFECT_FLAG_SAND;
+ }
+}
+
+static void GetGroundEffectFlags_SandHeap(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsDeepSand(eventObj->currentMetatileBehavior)
+ && MetatileBehavior_IsDeepSand(eventObj->previousMetatileBehavior))
+ {
+ if (!eventObj->inSandPile)
+ {
+ eventObj->inSandPile = 0;
+ eventObj->inSandPile = 1;
+ *flags |= GROUND_EFFECT_FLAG_SAND_PILE;
+ }
+ }
+ else
+ {
+ eventObj->inSandPile = 0;
+ }
+}
+
+static void GetGroundEffectFlags_ShallowFlowingWater(struct EventObject *eventObj, u32 *flags)
+{
+ if ((MetatileBehavior_IsShallowFlowingWater(eventObj->currentMetatileBehavior)
+ && MetatileBehavior_IsShallowFlowingWater(eventObj->previousMetatileBehavior))
+ || (MetatileBehavior_IsPacifidlogLog(eventObj->currentMetatileBehavior)
+ && MetatileBehavior_IsPacifidlogLog(eventObj->previousMetatileBehavior)))
+ {
+ if (!eventObj->inShallowFlowingWater)
+ {
+ eventObj->inShallowFlowingWater = 0;
+ eventObj->inShallowFlowingWater = 1;
+ *flags |= GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER;
+ }
+ }
+ else
+ {
+ eventObj->inShallowFlowingWater = 0;
+ }
+}
+
+static void GetGroundEffectFlags_Puddle(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsPuddle(eventObj->currentMetatileBehavior)
+ && MetatileBehavior_IsPuddle(eventObj->previousMetatileBehavior))
+ {
+ *flags |= GROUND_EFFECT_FLAG_PUDDLE;
+ }
+}
+
+static void GetGroundEffectFlags_Ripple(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_HasRipples(eventObj->currentMetatileBehavior))
+ *flags |= GROUND_EFFECT_FLAG_RIPPLES;
+}
+
+static void GetGroundEffectFlags_ShortGrass(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsShortGrass(eventObj->currentMetatileBehavior)
+ && MetatileBehavior_IsShortGrass(eventObj->previousMetatileBehavior))
+ {
+ if (!eventObj->inShortGrass)
+ {
+ eventObj->inShortGrass = 0;
+ eventObj->inShortGrass = 1;
+ *flags |= GROUND_EFFECT_FLAG_SHORT_GRASS;
+ }
+ }
+ else
+ {
+ eventObj->inShortGrass = 0;
+ }
+}
+
+static void GetGroundEffectFlags_HotSprings(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsHotSprings(eventObj->currentMetatileBehavior)
+ && MetatileBehavior_IsHotSprings(eventObj->previousMetatileBehavior))
+ {
+ if (!eventObj->inHotSprings)
+ {
+ eventObj->inHotSprings = 0;
+ eventObj->inHotSprings = 1;
+ *flags |= GROUND_EFFECT_FLAG_HOT_SPRINGS;
+ }
+ }
+ else
+ {
+ eventObj->inHotSprings = 0;
+ }
+}
+
+static void GetGroundEffectFlags_Seaweed(struct EventObject *eventObj, u32 *flags)
+{
+ if (MetatileBehavior_IsSeaweed(eventObj->currentMetatileBehavior))
+ *flags |= GROUND_EFFECT_FLAG_SEAWEED;
+}
+
+static void GetGroundEffectFlags_JumpLanding(struct EventObject *eventObj, u32 *flags)
+{
+ typedef bool8 (*MetatileFunc)(u8);
+
+ static const MetatileFunc metatileFuncs[] = {
+ MetatileBehavior_IsTallGrass,
+ MetatileBehavior_IsLongGrass,
+ MetatileBehavior_IsPuddle,
+ MetatileBehavior_IsSurfableWaterOrUnderwater,
+ MetatileBehavior_IsShallowFlowingWater,
+ MetatileBehavior_IsATile,
+ };
+
+ static const u32 jumpLandingFlags[] = {
+ GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS,
+ GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS,
+ GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER,
+ GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER,
+ GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER,
+ GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND,
+ };
+
+ if (eventObj->landingJump && !eventObj->disableJumpLandingGroundEffect)
+ {
+ u8 i;
+
+ for (i = 0; i < ARRAY_COUNT(metatileFuncs); i++)
+ {
+ if (metatileFuncs[i](eventObj->currentMetatileBehavior))
+ {
+ *flags |= jumpLandingFlags[i];
+ return;
+ }
+ }
+ }
+}
+
+static u8 EventObjectCheckForReflectiveSurface(struct EventObject *eventObj)
+{
+ const struct EventObjectGraphicsInfo *info = GetEventObjectGraphicsInfo(eventObj->graphicsId);
+
+ // ceil div by tile width?
+ s16 width = (info->width + 8) >> 4;
+ s16 height = (info->height + 8) >> 4;
+ s16 i;
+ s16 j;
+ u8 result;
+ u8 b;
+ s16 one;
+
+#define RETURN_REFLECTION_TYPE_AT(x, y) \
+ b = MapGridGetMetatileBehaviorAt(x, y); \
+ result = GetReflectionTypeByMetatileBehavior(b); \
+ if (result != 0) \
+ return result;
+
+ for (i = 0, one = 1; i < height; i++)
+ {
+ RETURN_REFLECTION_TYPE_AT(eventObj->currentCoords.x, eventObj->currentCoords.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(eventObj->previousCoords.x, eventObj->previousCoords.y + one + i)
+ for (j = 1; j < width; j++)
+ {
+ RETURN_REFLECTION_TYPE_AT(eventObj->currentCoords.x + j, eventObj->currentCoords.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(eventObj->currentCoords.x - j, eventObj->currentCoords.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(eventObj->previousCoords.x + j, eventObj->previousCoords.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(eventObj->previousCoords.x - j, eventObj->previousCoords.y + one + i)
+ }
+ }
+ return 0;
+
+#undef RETURN_REFLECTION_TYPE_AT
+}
+
+static u8 GetReflectionTypeByMetatileBehavior(u32 behavior)
+{
+ if (MetatileBehavior_IsIce(behavior))
+ return 1;
+ else if (MetatileBehavior_IsReflective(behavior))
+ return 2;
+ else
+ return 0;
+}
+
+u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z)
+{
+ static bool8 (*const unknown_08376040[])(u8) = {
+ MetatileBehavior_IsJumpSouth,
+ MetatileBehavior_IsJumpNorth,
+ MetatileBehavior_IsJumpWest,
+ MetatileBehavior_IsJumpEast,
+ };
+
+ u8 b;
+ u8 index = z;
+
+ if (index == 0)
+ return 0;
+ else if (index > 4)
+ index -= 4;
+
+ index--;
+ b = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (unknown_08376040[index](b) == 1)
+ return index + 1;
+
+ return 0;
+}
+
+void EventObjectSetSpriteOamTableForLongGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ if (eventObj->disableCoveringGroundEffects)
+ return;
+
+ if (!MetatileBehavior_IsLongGrass(eventObj->currentMetatileBehavior))
+ return;
+
+ if (!MetatileBehavior_IsLongGrass(eventObj->previousMetatileBehavior))
+ return;
+
+ sprite->subspriteTableNum = 4;
+
+ if (ZCoordToPriority(eventObj->previousElevation) == 1)
+ sprite->subspriteTableNum = 5;
+}
+
+bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y)
+{
+ u8 mapZ;
+
+ if (z == 0)
+ return FALSE;
+
+ mapZ = MapGridGetZCoordAt(x, y);
+
+ if (mapZ == 0 || mapZ == 0xF)
+ return FALSE;
+
+ if (mapZ != z)
+ return TRUE;
+
+ return FALSE;
+}
+
+static const u8 sUnknown_08376050[] = {
+ 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73
+};
+
+// Each byte corresponds to a sprite priority for an event object.
+// This is directly the inverse of gEventObjectPriorities_08376070.
+static const u8 sEventObjectPriorities_08376060[] = {
+ 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2
+};
+
+// Each byte corresponds to a sprite priority for an event object.
+// This is the inverse of gEventObjectPriorities_08376060.
+// 1 = Above player sprite
+// 2 = Below player sprite
+static const u8 sEventObjectPriorities_08376070[] = {
+ 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1,
+};
+
+void EventObjectUpdateZCoordAndPriority(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ if (eventObj->fixedPriority)
+ return;
+
+ EventObjectUpdateZCoord(eventObj);
+
+ sprite->subspriteTableNum = sEventObjectPriorities_08376070[eventObj->previousElevation];
+ sprite->oam.priority = sEventObjectPriorities_08376060[eventObj->previousElevation];
+}
+
+static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z)
+{
+ sprite->subspriteTableNum = sEventObjectPriorities_08376070[z];
+ sprite->oam.priority = sEventObjectPriorities_08376060[z];
+}
+
+u8 ZCoordToPriority(u8 z)
+{
+ return sEventObjectPriorities_08376060[z];
+}
+
+void EventObjectUpdateZCoord(struct EventObject *eventObj)
+{
+ u8 z = MapGridGetZCoordAt(eventObj->currentCoords.x, eventObj->currentCoords.y);
+ u8 z2 = MapGridGetZCoordAt(eventObj->previousCoords.x, eventObj->previousCoords.y);
+
+ if (z == 0xF || z2 == 0xF)
+ return;
+
+ eventObj->currentElevation = z;
+
+ if (z != 0 && z != 0xF)
+ eventObj->previousElevation = z;
+}
+
+void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b)
+{
+ s32 tmp = sprite->centerToCornerVecY;
+ u32 tmpa = *(u16 *)&sprite->pos1.y;
+ u32 tmpb = *(u16 *)&gSpriteCoordOffsetY;
+ s32 tmp2 = (tmpa - tmp) + tmpb;
+ u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2;
+ sprite->subpriority = tmp3 + sUnknown_08376050[a] + b;
+}
+
+static void EventObjectUpdateSubpriority(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ if (eventObj->fixedPriority)
+ return;
+
+ SetObjectSubpriorityByZCoord(eventObj->previousElevation, sprite, 1);
+}
+
+bool8 AreZCoordsCompatible(u8 a, u8 b)
+{
+ if (a == 0 || b == 0)
+ return TRUE;
+
+ if (a != b)
+ return FALSE;
+
+ return TRUE;
+}
+
+void GroundEffect_SpawnOnTallGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] = eventObj->localId << 8 | eventObj->mapNum;
+ gFieldEffectArguments[5] = eventObj->mapGroup;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;
+ gFieldEffectArguments[7] = 1;
+ FieldEffectStart(FLDEFF_TALL_GRASS);
+}
+
+void GroundEffect_StepOnTallGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] = eventObj->localId << 8 | eventObj->mapNum;
+ gFieldEffectArguments[5] = eventObj->mapGroup;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;
+ gFieldEffectArguments[7] = 0;
+ FieldEffectStart(FLDEFF_TALL_GRASS);
+}
+
+void GroundEffect_SpawnOnLongGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] = eventObj->localId << 8 | eventObj->mapNum;
+ gFieldEffectArguments[5] = eventObj->mapGroup;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;
+ gFieldEffectArguments[7] = 1;
+ FieldEffectStart(FLDEFF_LONG_GRASS);
+}
+
+void GroundEffect_StepOnLongGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] = (eventObj->localId << 8) | eventObj->mapNum;
+ gFieldEffectArguments[5] = eventObj->mapGroup;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup;
+ gFieldEffectArguments[7] = 0;
+ FieldEffectStart(FLDEFF_LONG_GRASS);
+}
+
+void GroundEffect_WaterReflection(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ SetUpReflection(eventObj, sprite, 0);
+}
+
+void GroundEffect_IceReflection(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ SetUpReflection(eventObj, sprite, 1);
+}
+
+void GroundEffect_FlowingWater(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ StartFieldEffectForEventObject(FLDEFF_FEET_IN_FLOWING_WATER, eventObj);
+}
+
+static void (*const sGroundEffectTracksFuncs[])(struct EventObject *eventObj, struct Sprite *sprite, u8 a) = {
+ DoTracksGroundEffect_None,
+ DoTracksGroundEffect_Footprints,
+ DoTracksGroundEffect_BikeTireTracks,
+};
+
+void GroundEffect_SandTracks(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ const struct EventObjectGraphicsInfo *info = GetEventObjectGraphicsInfo(eventObj->graphicsId);
+ sGroundEffectTracksFuncs[info->tracks](eventObj, sprite, 0);
+}
+
+void GroundEffect_DeepSandTracks(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ const struct EventObjectGraphicsInfo *info = GetEventObjectGraphicsInfo(eventObj->graphicsId);
+ sGroundEffectTracksFuncs[info->tracks](eventObj, sprite, 1);
+}
+
+static void DoTracksGroundEffect_None(struct EventObject *eventObj, struct Sprite *sprite, u8 a)
+{
+}
+
+static void DoTracksGroundEffect_Footprints(struct EventObject *eventObj, struct Sprite *sprite, u8 a)
+{
+ // First half-word is a Field Effect script id. (gFieldEffectScriptPointers)
+ u16 sandFootprints_FieldEffectData[2] = {
+ FLDEFF_SAND_FOOTPRINTS,
+ FLDEFF_DEEP_SAND_FOOTPRINTS
+ };
+
+ gFieldEffectArguments[0] = eventObj->previousCoords.x;
+ gFieldEffectArguments[1] = eventObj->previousCoords.y;
+ gFieldEffectArguments[2] = 149;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] = eventObj->facingDirection;
+ FieldEffectStart(sandFootprints_FieldEffectData[a]);
+}
+
+static void DoTracksGroundEffect_BikeTireTracks(struct EventObject *eventObj, struct Sprite *sprite, u8 a)
+{
+ // Specifies which bike track shape to show next.
+ // For example, when the bike turns from up to right, it will show
+ // a track that curves to the right.
+ // Each 4-byte row corresponds to the initial direction of the bike, and
+ // each byte in that row is for the next direction of the bike in the order
+ // of down, up, left, right.
+ static const u8 bikeTireTracks_Transitions[4][4] = {
+ 1, 2, 7, 8,
+ 1, 2, 6, 5,
+ 5, 8, 3, 4,
+ 6, 7, 3, 4,
+ };
+
+ if (eventObj->currentCoords.x != eventObj->previousCoords.x || eventObj->currentCoords.y != eventObj->previousCoords.y)
+ {
+ gFieldEffectArguments[0] = eventObj->previousCoords.x;
+ gFieldEffectArguments[1] = eventObj->previousCoords.y;
+ gFieldEffectArguments[2] = 149;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] =
+ bikeTireTracks_Transitions[eventObj->previousMovementDirection][eventObj->facingDirection - 5];
+ FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS);
+ }
+}
+
+void GroundEffect_Ripple(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ DoRippleFieldEffect(eventObj, sprite);
+}
+
+void GroundEffect_StepOnPuddle(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ StartFieldEffectForEventObject(FLDEFF_SPLASH, eventObj);
+}
+
+void GroundEffect_SandHeap(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ StartFieldEffectForEventObject(FLDEFF_SAND_PILE, eventObj);
+}
+
+void GroundEffect_JumpOnTallGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ u8 spriteId;
+
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = 2;
+ FieldEffectStart(FLDEFF_JUMP_TALL_GRASS);
+
+ spriteId = sub_81546C8(
+ eventObj->localId, eventObj->mapNum, eventObj->mapGroup, eventObj->currentCoords.x, eventObj->currentCoords.y);
+
+ if (spriteId == MAX_SPRITES)
+ GroundEffect_SpawnOnTallGrass(eventObj, sprite);
+}
+
+void GroundEffect_JumpOnLongGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = 2;
+ FieldEffectStart(FLDEFF_JUMP_LONG_GRASS);
+}
+
+void GroundEffect_JumpOnShallowWater(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH);
+}
+
+void GroundEffect_JumpOnWater(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH);
+}
+
+void GroundEffect_JumpLandingDust(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ gFieldEffectArguments[2] = eventObj->previousElevation;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_DUST);
+}
+
+void GroundEffect_ShortGrass(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ StartFieldEffectForEventObject(FLDEFF_SHORT_GRASS, eventObj);
+}
+
+void GroundEffect_HotSprings(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ StartFieldEffectForEventObject(FLDEFF_HOT_SPRINGS_WATER, eventObj);
+}
+
+void GroundEffect_Seaweed(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = eventObj->currentCoords.x;
+ gFieldEffectArguments[1] = eventObj->currentCoords.y;
+ FieldEffectStart(FLDEFF_BUBBLES);
+}
+
+static void (*const sGroundEffectFuncs[])(struct EventObject *eventObj, struct Sprite *sprite) = {
+ GroundEffect_SpawnOnTallGrass,
+ GroundEffect_StepOnTallGrass,
+ GroundEffect_SpawnOnLongGrass,
+ GroundEffect_StepOnLongGrass,
+ GroundEffect_WaterReflection,
+ GroundEffect_IceReflection,
+ GroundEffect_FlowingWater,
+ GroundEffect_SandTracks,
+ GroundEffect_DeepSandTracks,
+ GroundEffect_Ripple,
+ GroundEffect_StepOnPuddle,
+ GroundEffect_SandHeap,
+ GroundEffect_JumpOnTallGrass,
+ GroundEffect_JumpOnLongGrass,
+ GroundEffect_JumpOnShallowWater,
+ GroundEffect_JumpOnWater,
+ GroundEffect_JumpLandingDust,
+ GroundEffect_ShortGrass,
+ GroundEffect_HotSprings,
+ GroundEffect_Seaweed
+};
+
+/*static*/ void DoFlaggedGroundEffects(struct EventObject *eventObj, struct Sprite *sprite, u32 flags)
+{
+ u8 i;
+
+ if (EventObjectIsFarawayIslandMew(eventObj) == TRUE && !sub_81D4A58(eventObj))
+ return;
+
+ for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1)
+ if (flags & 1)
+ sGroundEffectFuncs[i](eventObj, sprite);
+}
+
+void filters_out_some_ground_effects(struct EventObject *eventObj, u32 *flags)
+{
+ if (eventObj->disableCoveringGroundEffects)
+ {
+ eventObj->inShortGrass = 0;
+ eventObj->inSandPile = 0;
+ eventObj->inShallowFlowingWater = 0;
+ eventObj->inHotSprings = 0;
+ *flags &= ~(GROUND_EFFECT_FLAG_HOT_SPRINGS
+ | GROUND_EFFECT_FLAG_SHORT_GRASS
+ | GROUND_EFFECT_FLAG_SAND_PILE
+ | GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER
+ | GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE);
+ }
+}
+
+void FilterOutStepOnPuddleGroundEffectIfJumping(struct EventObject *eventObj, u32 *flags)
+{
+ if (eventObj->landingJump)
+ *flags &= ~GROUND_EFFECT_FLAG_PUDDLE;
+}
+
+static void DoGroundEffects_OnSpawn(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ u32 flags;
+
+ if (eventObj->triggerGroundEffectsOnMove)
+ {
+ flags = 0;
+ EventObjectUpdateZCoordAndPriority(eventObj, sprite);
+ GetAllGroundEffectFlags_OnSpawn(eventObj, &flags);
+ EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite);
+ DoFlaggedGroundEffects(eventObj, sprite, flags);
+ eventObj->triggerGroundEffectsOnMove = 0;
+ eventObj->disableCoveringGroundEffects = 0;
+ }
+}
+
+static void DoGroundEffects_OnBeginStep(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ u32 flags;
+
+ if (eventObj->triggerGroundEffectsOnMove)
+ {
+ flags = 0;
+ EventObjectUpdateZCoordAndPriority(eventObj, sprite);
+ GetAllGroundEffectFlags_OnBeginStep(eventObj, &flags);
+ EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite);
+ filters_out_some_ground_effects(eventObj, &flags);
+ DoFlaggedGroundEffects(eventObj, sprite, flags);
+ eventObj->triggerGroundEffectsOnMove = 0;
+ eventObj->disableCoveringGroundEffects = 0;
+ }
+}
+
+static void DoGroundEffects_OnFinishStep(struct EventObject *eventObj, struct Sprite *sprite)
+{
+ u32 flags;
+
+ if (eventObj->triggerGroundEffectsOnStop)
+ {
+ flags = 0;
+ EventObjectUpdateZCoordAndPriority(eventObj, sprite);
+ GetAllGroundEffectFlags_OnFinishStep(eventObj, &flags);
+ EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite);
+ FilterOutStepOnPuddleGroundEffectIfJumping(eventObj, &flags);
+ DoFlaggedGroundEffects(eventObj, sprite, flags);
+ eventObj->triggerGroundEffectsOnStop = 0;
+ eventObj->landingJump = 0;
+ }
+}
+
+bool8 FreezeEventObject(struct EventObject *eventObject)
+{
+ if (eventObject->heldMovementActive || eventObject->frozen)
+ {
+ return TRUE;
+ }
+ else
+ {
+ eventObject->frozen = 1;
+ eventObject->spriteAnimPausedBackup = gSprites[eventObject->spriteId].animPaused;
+ eventObject->spriteAffineAnimPausedBackup = gSprites[eventObject->spriteId].affineAnimPaused;
+ gSprites[eventObject->spriteId].animPaused = 1;
+ gSprites[eventObject->spriteId].affineAnimPaused = 1;
+ return FALSE;
+ }
+}
+
+void FreezeEventObjects(void)
+{
+ u8 i;
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ if (gEventObjects[i].active && i != gPlayerAvatar.eventObjectId)
+ FreezeEventObject(&gEventObjects[i]);
+}
+
+void FreezeEventObjectsExceptOne(u8 a1)
+{
+ u8 i;
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ if (i != a1 && gEventObjects[i].active && i != gPlayerAvatar.eventObjectId)
+ FreezeEventObject(&gEventObjects[i]);
+}
+
+void UnfreezeEventObject(struct EventObject *eventObject)
+{
+ if (eventObject->active && eventObject->frozen)
+ {
+ eventObject->frozen = 0;
+ gSprites[eventObject->spriteId].animPaused = eventObject->spriteAnimPausedBackup;
+ gSprites[eventObject->spriteId].affineAnimPaused = eventObject->spriteAffineAnimPausedBackup;
+ }
+}
+
+void UnfreezeEventObjects(void)
+{
+ u8 i;
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ if (gEventObjects[i].active)
+ UnfreezeEventObject(&gEventObjects[i]);
+}
+
+void Step1(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += gDirectionToVectors[dir].x;
+ sprite->pos1.y += gDirectionToVectors[dir].y;
+}
+
+void Step2(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gDirectionToVectors[dir].x;
+ sprite->pos1.y += 2 * (u16) gDirectionToVectors[dir].y;
+}
+
+void Step3(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gDirectionToVectors[dir].x + (u16) gDirectionToVectors[dir].x;
+ sprite->pos1.y += 2 * (u16) gDirectionToVectors[dir].y + (u16) gDirectionToVectors[dir].y;
+}
+
+void Step4(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 4 * (u16) gDirectionToVectors[dir].x;
+ sprite->pos1.y += 4 * (u16) gDirectionToVectors[dir].y;
+}
+
+void Step8(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 8 * (u16) gDirectionToVectors[dir].x;
+ sprite->pos1.y += 8 * (u16) gDirectionToVectors[dir].y;
+}
+
+void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = 0;
+}
+
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
+
+static const SpriteStepFunc gUnknown_0850E6C4[] = {
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+};
+
+static const SpriteStepFunc gUnknown_0850E704[] = {
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+};
+
+static const SpriteStepFunc gUnknown_0850E724[] = {
+ Step2,
+ Step3,
+ Step3,
+ Step2,
+ Step3,
+ Step3,
+};
+
+static const SpriteStepFunc gUnknown_0850E73C[] = {
+ Step4,
+ Step4,
+ Step4,
+ Step4,
+};
+
+static const SpriteStepFunc gUnknown_0850E74C[] = {
+ Step8,
+ Step8,
+};
+
+static const SpriteStepFunc *const gUnknown_0850E754[] = {
+ gUnknown_0850E6C4,
+ gUnknown_0850E704,
+ gUnknown_0850E724,
+ gUnknown_0850E73C,
+ gUnknown_0850E74C,
+};
+
+static const s16 gUnknown_0850E768[] = {
+ 16, 8, 6, 4, 2
+};
+
+bool8 obj_npc_ministep(struct Sprite *sprite)
+{
+ if (sprite->data[5] >= gUnknown_0850E768[sprite->data[4]])
+ return FALSE;
+
+ gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
+
+ sprite->data[5]++;
+
+ if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]])
+ return FALSE;
+
+ return TRUE;
+}
+
+void sub_80976DC(struct Sprite *sprite, u8 a2)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+}
+
+bool8 sub_80976EC(struct Sprite *sprite)
+{
+ if (!(sprite->data[4] & 1))
+ {
+ Step1(sprite, sprite->data[3]);
+ sprite->data[5]++;
+ }
+
+ sprite->data[4]++;
+
+ if (sprite->data[5] > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+const s8 gUnknown_0850E772[] = {
+ 1, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 1, 2, 2, 1, 2,
+ 2, 1, 2, 2, 1, 2, 1, 1,
+ 2, 1, 1, 2, 1, 1, 2, 1,
+ 1, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 1, 0, 1, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0,
+};
+
+const s8 gUnknown_0850E7BA[] = {
+ 0, 0, 1, 0, 0, 1, 0, 0,
+ 1, 0, 1, 1, 0, 1, 1, 0,
+ 1, 1, 0, 1, 1, 0, 1, 1,
+ 0, 0, 1, 0, 0, 1, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1, 0, 0, -1, 0, 0,
+ -1, 0, -1, -1, 0, -1, -1, 0,
+ -1, -1, -1, -1, -1, -1, -1, -2,
+};
+
+s16 sub_8097728(s16 a1)
+{
+ return gUnknown_0850E7BA[a1];
+}
+
+s16 sub_809773C(s16 a1)
+{
+ return gUnknown_0850E772[a1];
+}
+
+void sub_8097750(struct Sprite *sprite)
+{
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
+}
+
+bool8 sub_8097758(struct Sprite *sprite)
+{
+ bool8 result = FALSE;
+
+ switch(sprite->data[7])
+ {
+ case 0:
+ sprite->pos2.x += sub_809773C(sprite->data[6]);
+ sprite->pos2.y += sub_8097728(sprite->data[6]);
+ break;
+ case 1:
+ sprite->pos2.x -= sub_809773C(0x47 - sprite->data[6]);
+ sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
+ break;
+ case 2:
+ sprite->pos2.x -= sub_809773C(sprite->data[6]);
+ sprite->pos2.y += sub_8097728(sprite->data[6]);
+ break;
+ case 3:
+ sprite->pos2.x += sub_809773C(0x47 - sprite->data[6]);
+ sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
+ break;
+ }
+ if(++sprite->data[6] == 0x48)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7]++;
+ }
+ if(sprite->data[7] == 0x4)
+ {
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ result = TRUE;
+ }
+ return result;
+}
+
+static const s8 gUnknown_0850E802[] = {
+ -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0
+};
+
+static const s8 gUnknown_0850E812[] = {
+ 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0
+};
+
+static const s8 gUnknown_0850E822[] = {
+ -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0
+};
+
+static const s8 *const gUnknown_0850E834[] = {
+ gUnknown_0850E802,
+ gUnknown_0850E812,
+ gUnknown_0850E822
+};
+
+s16 sub_8097820(s16 a1, u8 a2)
+{
+ return gUnknown_0850E834[a2][a1];
+}
+
+void sub_809783C(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = a4;
+ sprite->data[6] = 0;
+}
+
+static const s16 gUnknown_0850E840[] = {
+ 16, 16, 32,
+};
+
+static const u8 gUnknown_0850E846[] = {
+ 0, 0, 1,
+};
+
+u8 sub_809785C(struct Sprite *sprite)
+{
+ s16 v5[3];
+ u8 v6[3];
+ u8 v2;
+
+ memcpy(v5, gUnknown_0850E840, 6); // TODO: get rid of memcpy
+ memcpy(v6, gUnknown_0850E846, 3);
+ v2 = 0;
+
+ if (sprite->data[4])
+ Step1(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+static const s16 gUnknown_0850E84A[] = {
+ 32, 32, 64,
+};
+
+static const u8 gUnknown_0850E850[] = {
+ 1, 1, 2,
+};
+
+u8 sub_80978E4(struct Sprite *sprite)
+{
+ s16 v5[3];
+ u8 v6[3];
+ u8 v2;
+
+ memcpy(v5, gUnknown_0850E84A, 6);
+ memcpy(v6, gUnknown_0850E850, 3);
+ v2 = 0;
+
+ if (sprite->data[4] && !(sprite->data[6] & 1))
+ Step1(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+void SetMovementDelay(struct Sprite *sprite, s16 timer)
+{
+ sprite->data[3] = timer;
+}
+
+static bool8 WaitForMovementDelay(struct Sprite *sprite)
+{
+ sprite->data[3]--;
+
+ if (sprite->data[3] == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void SetAndStartSpriteAnim(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->animNum = a2;
+ sprite->animPaused = 0 ;
+ SeekSpriteAnim(sprite, a3);
+}
+
+bool8 SpriteAnimEnded(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void UpdateEventObjectSpriteVisibility(struct Sprite *sprite, bool8 invisible)
+{
+ u16 x, y;
+ s16 x2, y2;
+
+ sprite->invisible = invisible;
+
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ }
+ else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+
+ x2 = x - (sprite->centerToCornerVecX >> 1);
+ y2 = y - (sprite->centerToCornerVecY >> 1);
+
+ if ((s16)x > 255 || x2 < -16)
+ sprite->invisible = 1;
+ if ((s16)y > 175 || y2 < -16)
+ sprite->invisible = 1;
+}
+
+void UpdateEventObjectSpriteSubpriorityAndVisibility(struct Sprite *sprite)
+{
+ sub_8097D68(sprite);
+ SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
+ UpdateEventObjectSpriteVisibility(sprite, sprite->data[2]);
+}
+
+void sub_8097AF0(void)
+{
+ int i;
+
+ for(i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if(sprite->inUse && sprite->callback == UpdateEventObjectSpriteSubpriorityAndVisibility)
+ DestroySprite(sprite);
+ }
+}
+
+int sub_8097B2C(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
+{
+ int i;
+
+ for(i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if(sprite->inUse && sprite->callback == UpdateEventObjectSpriteSubpriorityAndVisibility && (u8)sprite->data[0] == var)
+ return i;
+ }
+ return MAX_SPRITES;
+}
+
+void sub_8097B78(u8 var1, u8 var2)
+{
+ u8 spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(var2));
+}
+
+void sub_8097BB4(u8 var1, u8 var2)
+{
+ int spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(var2);
+ u16 tileNum = sprite->oam.tileNum;
+
+ sprite->oam = *gfxInfo->oam;
+ sprite->oam.tileNum = tileNum;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->images = gfxInfo->images;
+
+ if(gfxInfo->subspriteTables == NULL)
+ {
+ sprite->subspriteTables = NULL;
+ sprite->subspriteTableNum = 0;
+ sprite->subspriteMode = 0;
+ }
+ else
+ {
+ SetSubspriteTables(sprite, gfxInfo->subspriteTables);
+ sprite->subspriteMode = 2;
+ }
+ StartSpriteAnim(sprite, 0);
+ }
+}
+
+void sub_8097C44(u8 var, bool32 var2)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return;
+
+ if(var2)
+ gSprites[spriteId].data[2] = 1;
+ else
+ gSprites[spriteId].data[2] = 0;
+}
+
+bool32 sub_8097C8C(u8 var)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return FALSE;
+
+ return (gSprites[spriteId].data[2] == TRUE);
+}
+
+void sub_8097CC4(u8 var1, u8 var2)
+{
+ u8 spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[3] = var2;
+ gSprites[spriteId].data[4] = 0;
+ }
+}
+
+void sub_8097CF4(struct Sprite *sprite)
+{
+ switch(sprite->data[4])
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ sprite->data[4]++;
+ case 1:
+ sprite->pos2.y -= 8;
+ if(sprite->pos2.y == -160)
+ {
+ sprite->pos2.y = 0;
+ sprite->data[2] = 1;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+ }
+}
+
+void sub_8097D30(struct Sprite *sprite)
+{
+ switch(sprite->data[4])
+ {
+ case 0:
+ sprite->pos2.y = -160;
+ sprite->data[4]++;
+ case 1:
+ sprite->pos2.y += 8;
+ if(sprite->pos2.y == 0)
+ {
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+ }
+}
+
+static void sub_8097D68(struct Sprite *sprite)
+{
+ switch(sprite->data[3])
+ {
+ case 1:
+ sub_8097D30(sprite);
+ break;
+ case 2:
+ sub_8097CF4(sprite);
+ break;
+ case 0:
+ break;
+ default:
+ sprite->data[3] = 0;
+ break;
+ }
+}
+
+bool32 sub_8097D9C(u8 var)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return FALSE;
+
+ if(gSprites[spriteId].data[3] != FALSE)
+ return TRUE;
+
+ return FALSE;
+}
+
+u32 StartFieldEffectForEventObject(u8 fieldEffectId, struct EventObject *eventObject)
+{
+ EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ return FieldEffectStart(fieldEffectId);
+}
+
+void DoShadowFieldEffect(struct EventObject *eventObject)
+{
+ if (!eventObject->hasShadow)
+ {
+ eventObject->hasShadow = 1;
+ StartFieldEffectForEventObject(FLDEFF_SHADOW, eventObject);
+ }
+}
+
+static void DoRippleFieldEffect(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
+ gFieldEffectArguments[0] = sprite->pos1.x;
+ gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
+ gFieldEffectArguments[2] = 151;
+ gFieldEffectArguments[3] = 3;
+ FieldEffectStart(FLDEFF_RIPPLE);
+}
+
+u8 (*const gMovementActionFuncs_StoreAndLockAnim[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_StoreAndLockAnim_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_FreeAndUnlockAnim[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FreeAndUnlockAnim_Step0,
+ MovementAction_Finish,
+};
+
+u8 (*const gMovementActionFuncs_FlyUp[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FlyUp_Step0,
+ MovementAction_FlyUp_Step1,
+ MovementAction_Fly_Finish,
+};
+
+u8 (*const gMovementActionFuncs_FlyDown[])(struct EventObject *, struct Sprite *) = {
+ MovementAction_FlyDown_Step0,
+ MovementAction_FlyDown_Step1,
+ MovementAction_Fly_Finish,
+};
+
+u8 MovementAction_StoreAndLockAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ u32 one;
+ bool32 ableToStore = FALSE;
+ if (gLockedAnimEventObjects == NULL)
+ {
+ gLockedAnimEventObjects = AllocZeroed(sizeof(struct LockedAnimEventObjects));
+ gLockedAnimEventObjects->eventObjectIds[0] = eventObject->localId;
+ // needed to match
+ gLockedAnimEventObjects->count = (one = 1);
+ ableToStore = one;
+ }
+ else
+ {
+ u8 i;
+ u8 firstFreeSlot;
+ bool32 found;
+ for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
+ {
+ if (firstFreeSlot == 16 && gLockedAnimEventObjects->eventObjectIds[i] == 0)
+ firstFreeSlot = i;
+
+ if (gLockedAnimEventObjects->eventObjectIds[i] == eventObject->localId)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found && firstFreeSlot != 16)
+ {
+ gLockedAnimEventObjects->eventObjectIds[firstFreeSlot] = eventObject->localId;
+ gLockedAnimEventObjects->count++;
+ ableToStore = TRUE;
+ }
+ }
+
+ if (ableToStore == TRUE)
+ {
+ eventObject->inanimate = TRUE;
+ eventObject->facingDirectionLocked = TRUE;
+ }
+
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+u8 MovementAction_FreeAndUnlockAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ bool32 ableToStore;
+ u8 index;
+
+ sprite->data[2] = 1;
+ if (gLockedAnimEventObjects != NULL)
+ {
+ ableToStore = FALSE;
+ index = FindLockedEventObjectIndex(eventObject);
+ if (index != 16)
+ {
+ gLockedAnimEventObjects->eventObjectIds[index] = 0;
+ gLockedAnimEventObjects->count--;
+ ableToStore = TRUE;
+ }
+ if (gLockedAnimEventObjects->count == 0)
+ FREE_AND_SET_NULL(gLockedAnimEventObjects);
+ if (ableToStore == TRUE)
+ {
+ eventObject->inanimate = GetEventObjectGraphicsInfo(eventObject->graphicsId)->inanimate;
+ eventObject->facingDirectionLocked = FALSE;
+ sprite->animPaused = 0;
+ }
+ }
+
+ return TRUE;
+}
+
+u8 FindLockedEventObjectIndex(struct EventObject *eventObject)
+{
+ u8 i;
+
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ {
+ if (gLockedAnimEventObjects->eventObjectIds[i] == eventObject->localId)
+ return i;
+ }
+ return EVENT_OBJECTS_COUNT;
+}
+
+void CreateLevitateMovementTask(struct EventObject *eventObject)
+{
+ u8 taskId = CreateTask(ApplyLevitateMovement, 0xFF);
+ struct Task *task = &gTasks[taskId];
+
+ StoreWordInTwoHalfwords(&task->data[0], (u32)eventObject);
+ eventObject->warpArrowSpriteId = taskId;
+ task->data[3] = 0xFFFF;
+}
+
+static void ApplyLevitateMovement(u8 taskId)
+{
+ struct EventObject *eventObject;
+ struct Sprite *sprite;
+ struct Task *task = &gTasks[taskId];
+
+ LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&eventObject); // load the map object pointer.
+ sprite = &gSprites[eventObject->spriteId];
+
+ if(!(task->data[2] & 0x3))
+ sprite->pos2.y += task->data[3];
+
+ if(!(task->data[2] & 0xF))
+ task->data[3] = -task->data[3];
+
+ task->data[2]++;
+}
+
+void DestroyExtraMovementTask(u8 taskId)
+{
+ struct EventObject *eventObject;
+ struct Task *task = &gTasks[taskId];
+
+ LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&eventObject); // unused eventObject
+ DestroyTask(taskId);
+}
+
+void sub_8098074(u8 var1, u8 var2)
+{
+ u8 i;
+
+ for(i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ {
+ if(i != var1 && i != var2 &&
+ gEventObjects[i].active && i != gPlayerAvatar.eventObjectId)
+ FreezeEventObject(&gEventObjects[i]);
+ }
+}
+
+u8 MovementAction_FlyUp_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->pos2.y = 0;
+ sprite->data[2]++;
+ return FALSE;
+}
+
+u8 MovementAction_FlyUp_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->pos2.y -= 8;
+
+ if(sprite->pos2.y == -160)
+ sprite->data[2]++;
+ return FALSE;
+}
+
+u8 MovementAction_FlyDown_Step0(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->pos2.y = -160;
+ sprite->data[2]++;
+ return FALSE;
+}
+
+u8 MovementAction_FlyDown_Step1(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->pos2.y += 8;
+
+ if(!sprite->pos2.y)
+ sprite->data[2]++;
+ return FALSE;
+}
+
+// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it.
+u8 MovementAction_Fly_Finish(struct EventObject *eventObject, struct Sprite *sprite)
+{
+ return TRUE;
+}
diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c
index eca5d4bdc..8d02eef91 100644
--- a/src/evolution_graphics.c
+++ b/src/evolution_graphics.c
@@ -2,11 +2,11 @@
#include "evolution_graphics.h"
#include "sprite.h"
#include "trig.h"
-#include "rng.h"
+#include "random.h"
#include "decompress.h"
#include "task.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "palette.h"
// this file's functions
@@ -112,18 +112,18 @@ static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite)
{
u8 matrixNum;
- sprite->pos1.y = 88 - (sprite->data7 * sprite->data7) / 80;
- sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4;
- sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
- sprite->data6 += 4;
- if (sprite->data7 & 1)
- sprite->data5--;
- sprite->data7++;
+ sprite->pos1.y = 88 - (sprite->data[7] * sprite->data[7]) / 80;
+ sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4;
+ sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->data[6] += 4;
+ if (sprite->data[7] & 1)
+ sprite->data[5]--;
+ sprite->data[7]++;
if (sprite->pos2.y > 0)
sprite->subpriority = 1;
else
sprite->subpriority = 20;
- matrixNum = sprite->data5 / 4 + 20;
+ matrixNum = sprite->data[5] / 4 + 20;
if (matrixNum > 31)
matrixNum = 31;
sprite->oam.matrixNum = matrixNum;
@@ -137,9 +137,9 @@ static void CreatePreEvoSparkleSet1(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 88, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data5 = 48;
- gSprites[spriteID].data6 = arg0;
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[5] = 48;
+ gSprites[spriteID].data[6] = arg0;
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1;
@@ -150,11 +150,11 @@ static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite)
{
if (sprite->pos1.y < 88)
{
- sprite->pos1.y = 8 + (sprite->data7 * sprite->data7) / 5;
- sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4;
- sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
- sprite->data5 = 8 + Sin((u8)(sprite->data7 * 4), 40);
- sprite->data7++;
+ sprite->pos1.y = 8 + (sprite->data[7] * sprite->data[7]) / 5;
+ sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4;
+ sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->data[5] = 8 + Sin((u8)(sprite->data[7] * 4), 40);
+ sprite->data[7]++;
}
else
DestroySprite(sprite);
@@ -165,9 +165,9 @@ static void CreatePreEvoSparkleSet2(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 8, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data5 = 8;
- gSprites[spriteID].data6 = arg0;
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[5] = 8;
+ gSprites[spriteID].data[6] = arg0;
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 25;
gSprites[spriteID].subpriority = 1;
@@ -177,12 +177,12 @@ static void CreatePreEvoSparkleSet2(u8 arg0)
static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite)
{
- if (sprite->data5 > 8)
+ if (sprite->data[5] > 8)
{
- sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5);
- sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
- sprite->data5 -= sprite->data3;
- sprite->data6 += 4;
+ sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->data[5] -= sprite->data[3];
+ sprite->data[6] += 4;
}
else
DestroySprite(sprite);
@@ -193,10 +193,10 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data3 = arg1;
- gSprites[spriteID].data5 = 120;
- gSprites[spriteID].data6 = arg0;
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[3] = arg1;
+ gSprites[spriteID].data[5] = 120;
+ gSprites[spriteID].data[6] = arg0;
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].subpriority = 1;
@@ -206,29 +206,29 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1)
static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite)
{
- if (!(sprite->data7 & 3))
+ if (!(sprite->data[7] & 3))
sprite->pos1.y++;
- if (sprite->data6 < 128)
+ if (sprite->data[6] < 128)
{
u8 matrixNum;
- sprite->pos2.y = -Sin((u8)(sprite->data6), sprite->data5);
- sprite->pos1.x = 120 + (sprite->data3 * sprite->data7) / 3;
- sprite->data6++;
- matrixNum = 31 - (sprite->data6 * 12 / 128);
- if (sprite->data6 > 64)
+ sprite->pos2.y = -Sin((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->pos1.x = 120 + (sprite->data[3] * sprite->data[7]) / 3;
+ sprite->data[6]++;
+ matrixNum = 31 - (sprite->data[6] * 12 / 128);
+ if (sprite->data[6] > 64)
sprite->subpriority = 1;
else
{
sprite->invisible = 0;
sprite->subpriority = 20;
- if (sprite->data6 > 112 && sprite->data6 & 1)
+ if (sprite->data[6] > 112 && sprite->data[6] & 1)
sprite->invisible = 1;
}
if (matrixNum < 20)
matrixNum = 20;
sprite->oam.matrixNum = matrixNum;
- sprite->data7++;
+ sprite->data[7]++;
}
else
DestroySprite(sprite);
@@ -239,9 +239,9 @@ static void CreatePostEvoSparkleSet2(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data3 = 3 - (Random() % 7);
- gSprites[spriteID].data5 = 48 + (Random() & 0x3F);
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[3] = 3 - (Random() % 7);
+ gSprites[spriteID].data[5] = 48 + (Random() & 0x3F);
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].subpriority = 20;
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index 68731a14a..f039c5f24 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -11,16 +11,17 @@
#include "pokemon.h"
#include "string_util.h"
#include "battle.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "decompress.h"
#include "m4a.h"
#include "menu.h"
#include "pokedex.h"
-#include "species.h"
+#include "constants/species.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "overworld.h"
#include "battle_message.h"
+#include "constants/battle_string_ids.h"
#include "gpu_regs.h"
#include "bg.h"
#include "link.h"
@@ -47,44 +48,24 @@ extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
-extern u8 gBattleTerrain;
-extern struct SpriteTemplate gUnknown_0202499C;
extern bool8 gAffineAnimsDisabled;
-extern u16 gMoveToLearn;
+extern const u8 gSpeciesNames[][11];
-extern u8 gBattleCommunication[];
#define sEvoCursorPos gBattleCommunication[1] // when learning a new move
#define sEvoGraphicsTaskID gBattleCommunication[2]
extern const struct WindowTemplate gUnknown_0833900C;
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
-extern const u8 gUnknown_085B58C9[][4];
-extern const u16 gUnknown_085B5884[];
-extern const u8 gUnknown_085B58D9[];
-extern const u16 gUnknown_085B51E4[];
-extern const u32 gUnknown_085B4134[];
-extern const u32 gUnknown_085B482C[];
-extern const u32 gUnknown_085B4D10[];
// strings
-extern const u8 gText_ShedinjaJapaneseName2[];
-extern const u8 gText_PkmnIsEvolving[];
-extern const u8 gText_CongratsPkmnEvolved[];
-extern const u8 gText_BattleYesNoChoice[];
-extern const u8 gText_PkmnStoppedEvolving[];
-extern const u8 gText_EllipsisQuestionMark[];
extern const u8 gText_CommunicationStandby5[];
-extern void copy_decompressed_tile_data_to_vram_autofree(u8 arg0, const void *arg1, bool32 arg2, u16 arg3, u8 arg4);
-extern u32 sub_80391E0(u8, u8);
-extern void SpriteCallbackDummy_2(struct Sprite *sprite);
extern void sub_80356D0(void);
extern void sub_807B154(void);
-extern void sub_806A068(u16, u8);
extern void sub_807F19C(void);
extern void sub_807B140(void);
extern void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies);
-extern void sub_8085784(void);
+extern void Overworld_PlaySpecialMapMusic(void);
extern void sub_81BFA38(struct Pokemon *party, u8 monId, u8 partyCount, void *CB2_ptr, u16 move);
extern u8 sub_81C1B94(void);
extern void sub_807F1A8(u8 arg0, const u8 *arg1, u8 arg2);
@@ -106,6 +87,80 @@ static void InitMovingBackgroundTask(bool8 isLink);
static void sub_813FEE8(u8 taskId);
static void sub_8140174(void);
+// const data
+static const u16 sUnknown_085B4114[] = INCBIN_U16("graphics/evolution_scene/unknown_5B4114.gbapal");
+static const u32 sUnknown_085B4134[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz");
+static const u32 sUnknown_085B482C[] = INCBIN_U32("graphics/evolution_scene/bg.bin.lz");
+static const u32 sUnknown_085B4D10[] = INCBIN_U32("graphics/evolution_scene/bg2.bin.lz");
+static const u16 sUnknown_085B51E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_intro.gbapal");
+static const u16 sUnknown_085B53E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_lighten.gbapal");
+static const u16 sUnknown_085B5544[] = INCBIN_U16("graphics/evolution_scene/gray_transition_darken.gbapal");
+static const u16 sUnknown_085B56E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_outro.gbapal");
+static const u16 sUnknown_085B5884[] = INCBIN_U16("graphics/evolution_scene/transition.gbapal");
+
+static const u8 Text_ShedinjaJapaneseName[] = _("ヌケニン");
+
+static const u8 sUnknown_085B58C9[][4] =
+{
+ { 0x00, 0x0C, 0x01, 0x06 },
+ { 0x0D, 0x24, 0x05, 0x02 },
+ { 0x0D, 0x18, 0x01, 0x02 },
+ { 0x25, 0x31, 0x01, 0x06 },
+};
+
+static const u8 sUnknown_085B58D9[][16] = {
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x0B, 0x00, 0x00 },
+ { 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x00 },
+ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x00, 0x00 },
+ { 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x00, 0x00 },
+ { 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x00, 0x00 },
+ { 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x00, 0x00 },
+ { 0x00, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x00, 0x00 },
+ { 0x00, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x00, 0x00 },
+ { 0x00, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x00, 0x00 },
+ { 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x00, 0x00 },
+ { 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x00, 0x00 },
+ { 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x00, 0x00 },
+ { 0x00, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x00, 0x00 },
+ { 0x00, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x00, 0x00 },
+ { 0x00, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00 },
+ { 0x00, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x00, 0x00 },
+ { 0x00, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x00, 0x00 },
+ { 0x00, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00 },
+ { 0x00, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00 },
+ { 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 },
+ { 0x00, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00 },
+ { 0x00, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00 },
+ { 0x00, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00 },
+ { 0x00, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x00, 0x00 },
+ { 0x00, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00 },
+ { 0x00, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x00 },
+ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x00, 0x00 },
+ { 0x00, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00 },
+ { 0x00, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+};
+
static void CB2_BeginEvolutionScene(void)
{
UpdatePaletteFade();
@@ -133,7 +188,7 @@ static void Task_BeginEvolutionScene(u8 taskID)
switch (gTasks[taskID].tState)
{
case 0:
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
gTasks[taskID].tState++;
break;
case 1:
@@ -201,7 +256,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo,
sub_80356D0();
LoadBattleTextboxAndBackground();
ResetSpriteData();
- remove_some_task();
+ ScanlineEffect_Stop();
ResetTasks();
FreeAllSpritePalettes();
@@ -224,9 +279,9 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo,
pokePal = GetMonSpritePalStructFromOtIdPersonality(currSpecies, trainerId, personality);
LoadCompressedPalette(pokePal->data, 0x110, 0x20);
- sub_806A068(currSpecies, 1);
- gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable;
- sEvoStructPtr->preEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30);
+ SetMultiuseSpriteTemplateToPokemon(currSpecies, 1);
+ gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoStructPtr->preEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);
gSprites[ID].callback = SpriteCallbackDummy_2;
gSprites[ID].oam.paletteNum = 1;
@@ -239,9 +294,9 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo,
pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality);
LoadCompressedPalette(pokePal->data, 0x120, 0x20);
- sub_806A068(speciesToEvolve, 3);
- gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable;
- sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30);
+ SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 3);
+ gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);
gSprites[ID].callback = SpriteCallbackDummy_2;
gSprites[ID].oam.paletteNum = 2;
gSprites[ID].invisible = 1;
@@ -317,9 +372,9 @@ static void CB2_EvolutionSceneLoadGraphics(void)
LoadCompressedPalette(pokePal->data, 0x120, 0x20);
- sub_806A068(postEvoSpecies, 3);
- gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable;
- sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30);
+ SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 3);
+ gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);
gSprites[ID].callback = SpriteCallbackDummy_2;
gSprites[ID].oam.paletteNum = 2;
@@ -330,7 +385,7 @@ static void CB2_EvolutionSceneLoadGraphics(void)
SetVBlankCallback(VBlankCB_EvolutionScene);
SetMainCallback2(CB2_EvolutionSceneUpdate);
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
ShowBg(0);
ShowBg(1);
@@ -394,9 +449,9 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void)
{
u8 ID;
- sub_806A068(postEvoSpecies, 1);
- gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable;
- sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30);
+ SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 1);
+ gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);
gSprites[ID].callback = SpriteCallbackDummy_2;
gSprites[ID].oam.paletteNum = 2;
@@ -405,16 +460,16 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void)
}
break;
case 6:
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
{
sub_800E0E8();
- sub_800DFB4(0, 0);
+ CreateWirelessStatusIndicatorSprite(0, 0);
}
BlendPalettes(-1,0x10, 0);
gMain.state++;
break;
case 7:
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
sub_807B140();
ShowBg(0);
ShowBg(1);
@@ -453,9 +508,9 @@ void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpri
pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality);
LoadCompressedPalette(pokePal->data, 0x120, 0x20);
- sub_806A068(speciesToEvolve, 1);
- gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable;
- sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30);
+ SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 1);
+ gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30);
gSprites[ID].callback = SpriteCallbackDummy_2;
gSprites[ID].oam.paletteNum = 2;
@@ -507,16 +562,16 @@ static void CB2_TradeEvolutionSceneUpdate(void)
static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
{
u32 data = 0;
- if (gEvolutionTable[preEvoSpecies].evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6)
+ if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6)
{
s32 i;
- struct Pokemon* Shedinja = &gPlayerParty[gPlayerPartyCount];
- const struct EvolutionData* evoTable;
- const struct EvolutionData* evos;
+ struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount];
+ const struct Evolution *evos;
+ const struct Evolution *evos2;
CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon));
- SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies));
- SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies]));
+ SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies][1].targetSpecies));
+ SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, (&data));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, (&data));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_10, (&data));
@@ -534,15 +589,16 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
CalculatePlayerPartyCount();
// can't match it otherwise, ehh
- evoTable = gEvolutionTable;
- evos = evoTable + preEvoSpecies;
- GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos->evolutions[1].targetSpecies), FLAG_SET_SEEN);
- GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos->evolutions[1].targetSpecies), FLAG_SET_CAUGHT);
+ evos2 = gEvolutionTable[0];
+ evos = evos2 + EVOS_PER_MON * preEvoSpecies;
+
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_SEEN);
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_CAUGHT);
- if (GetMonData(Shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
- && GetMonData(Shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
+ if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
+ && GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
&& GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK)
- SetMonData(Shedinja, MON_DATA_NICKNAME, gText_ShedinjaJapaneseName2);
+ SetMonData(shedinja, MON_DATA_NICKNAME, Text_ShedinjaJapaneseName);
}
}
@@ -566,7 +622,7 @@ static void Task_EvolutionScene(u8 taskID)
switch (gTasks[taskID].tState)
{
case 0:
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
gSprites[sEvoStructPtr->preEvoSpriteID].invisible = 0;
gTasks[taskID].tState++;
ShowBg(0);
@@ -578,7 +634,7 @@ static void Task_EvolutionScene(u8 taskID)
if (!gPaletteFade.active)
{
StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving);
- BattleHandleAddTextPrinter(gStringVar4, 0);
+ BattlePutTextOnWindow(gStringVar4, 0);
gTasks[taskID].tState++;
}
break;
@@ -592,14 +648,14 @@ static void Task_EvolutionScene(u8 taskID)
case 3:
if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteID)) // wait for animation, play tu du SE
{
- PlaySE(BGM_ME_SHINKA);
+ PlaySE(MUS_ME_SHINKA);
gTasks[taskID].tState++;
}
break;
case 4: // play evolution music and fade screen black
if (!IsSEPlaying())
{
- PlayNewMapMusic(BGM_SHINKA);
+ PlayNewMapMusic(MUS_SHINKA);
gTasks[taskID].tState++;
BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
}
@@ -674,8 +730,8 @@ static void Task_EvolutionScene(u8 taskID)
if (IsCryFinished())
{
StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);
- BattleHandleAddTextPrinter(gStringVar4, 0);
- PlayBGM(BGM_FANFA5);
+ BattlePutTextOnWindow(gStringVar4, 0);
+ PlayBGM(MUS_FANFA5);
gTasks[taskID].tState++;
SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies));
CalculateMonStats(mon);
@@ -696,7 +752,7 @@ static void Task_EvolutionScene(u8 taskID)
if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE))
{
StopMapMusic();
- sub_8085784();
+ Overworld_PlaySpecialMapMusic();
}
gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE;
@@ -714,7 +770,7 @@ static void Task_EvolutionScene(u8 taskID)
}
else // no move to learn
{
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
gTasks[taskID].tState++;
}
}
@@ -725,7 +781,7 @@ static void Task_EvolutionScene(u8 taskID)
if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE))
{
StopMapMusic();
- sub_8085784();
+ Overworld_PlaySpecialMapMusic();
}
if (!gTasks[taskID].tEvoWasStopped)
CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon);
@@ -761,7 +817,7 @@ static void Task_EvolutionScene(u8 taskID)
else // Fire Red leftover probably
StringExpandPlaceholders(gStringVar4, gText_PkmnStoppedEvolving);
- BattleHandleAddTextPrinter(gStringVar4, 0);
+ BattlePutTextOnWindow(gStringVar4, 0);
gTasks[taskID].tEvoWasStopped = TRUE;
gTasks[taskID].tState = 15;
}
@@ -770,9 +826,9 @@ static void Task_EvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
- PlayFanfare(BGM_FANFA1);
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[3]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ PlayFanfare(MUS_FANFA1);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter
gTasks[taskID].tState++;
}
@@ -788,24 +844,24 @@ static void Task_EvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[4]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
}
break;
case 1:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[5]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
}
break;
case 2:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[6]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tData7 = 5;
gTasks[taskID].tData8 = 10;
gTasks[taskID].tLearnMoveState++;
@@ -814,7 +870,7 @@ static void Task_EvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
- BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC);
+ BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC);
gTasks[taskID].tLearnMoveState++;
sEvoCursorPos = 0;
BattleCreateYesNoCursorAt(0);
@@ -848,7 +904,7 @@ static void Task_EvolutionScene(u8 taskID)
{
gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7;
if (gTasks[taskID].tLearnMoveState == 5)
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
}
}
if (gMain.newKeys & B_BUTTON)
@@ -881,8 +937,8 @@ static void Task_EvolutionScene(u8 taskID)
u16 move = GetMonData(mon, var + MON_DATA_MOVE1);
if (IsHMMove2(move))
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[307]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState = 12;
}
else
@@ -897,36 +953,36 @@ static void Task_EvolutionScene(u8 taskID)
}
break;
case 7:
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[207]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
break;
case 8:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[7]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
}
break;
case 9:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[208]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tState = 20;
}
break;
case 10:
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[8]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tData7 = 11;
gTasks[taskID].tData8 = 0;
gTasks[taskID].tLearnMoveState = 3;
break;
case 11:
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[9]);
- BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gTasks[taskID].tState = 15;
break;
case 12:
@@ -960,15 +1016,15 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 2:
if (IsCryFinished())
{
- m4aSongNumStop(BGM_SHINKA);
- PlaySE(BGM_ME_SHINKA);
+ m4aSongNumStop(MUS_SHINKA);
+ PlaySE(MUS_ME_SHINKA);
gTasks[taskID].tState++;
}
break;
case 3:
if (!IsSEPlaying())
{
- PlayBGM(BGM_SHINKA);
+ PlayBGM(MUS_SHINKA);
gTasks[taskID].tState++;
BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
}
@@ -1038,7 +1094,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
{
StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);
sub_807F1A8(0, gStringVar4, 1);
- PlayFanfare(BGM_FANFA5);
+ PlayFanfare(MUS_FANFA5);
gTasks[taskID].tState++;
SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskID].tPostEvoSpecies));
CalculateMonStats(mon);
@@ -1071,7 +1127,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
}
else
{
- PlayBGM(BGM_SHINKA);
+ PlayBGM(MUS_SHINKA);
sub_807F1A8(0, gText_CommunicationStandby5, 1);
gTasks[taskID].tState++;
}
@@ -1115,8 +1171,8 @@ static void Task_TradeEvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
- PlayFanfare(BGM_FANFA1);
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[3]);
+ PlayFanfare(MUS_FANFA1);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter
gTasks[taskID].tState++;
@@ -1133,7 +1189,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[4]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1141,7 +1197,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 1:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[5]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1149,7 +1205,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 2:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[6]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tData7 = 5;
gTasks[taskID].tData8 = 9;
@@ -1158,7 +1214,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 3:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- sub_809882C(0, 0xA8, 0xE0);
+ LoadUserWindowBorderGfx(0, 0xA8, 0xE0);
CreateYesNoMenu(&gUnknown_0833900C, 0xA8, 0xE, 0);
sEvoCursorPos = 0;
gTasks[taskID].tLearnMoveState++;
@@ -1166,20 +1222,20 @@ static void Task_TradeEvolutionScene(u8 taskID)
}
break;
case 4:
- switch (sub_8198C58())
+ switch (ProcessMenuInputNoWrap_())
{
case 0:
sEvoCursorPos = 0;
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[292]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7;
if (gTasks[taskID].tLearnMoveState == 5)
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
break;
case 1:
case -1:
sEvoCursorPos = 1;
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[292]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState = gTasks[taskID].tData8;
break;
@@ -1188,7 +1244,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 5:
if (!gPaletteFade.active)
{
- if (gLinkVSyncDisabled)
+ if (gWirelessCommType)
sub_800E084();
Free(GetBgTilemapBuffer(3));
@@ -1215,7 +1271,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
u16 move = GetMonData(mon, var + MON_DATA_MOVE1);
if (IsHMMove2(move))
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[307]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState = 11;
}
@@ -1225,7 +1281,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
RemoveMonPPBonus(mon, var);
SetMonMoveSlot(mon, gMoveToLearn, var);
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[207]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1235,7 +1291,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 7:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[7]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1243,20 +1299,20 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 8:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[208]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tState = 18;
}
break;
case 9:
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[8]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tData7 = 10;
gTasks[taskID].tData8 = 0;
gTasks[taskID].tLearnMoveState = 3;
break;
case 10:
- BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[9]);
+ BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tState = 13;
break;
@@ -1299,7 +1355,7 @@ static void VBlankCB_EvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
static void VBlankCB_TradeEvolutionScene(void)
@@ -1316,7 +1372,7 @@ static void VBlankCB_TradeEvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
static void sub_813FDEC(u8 taskId)
@@ -1328,17 +1384,17 @@ static void sub_813FDEC(u8 taskId)
if (data[5]++ < 20)
return;
- if (data[0]++ > gUnknown_085B58C9[data[2]][3])
+ if (data[0]++ > sUnknown_085B58C9[data[2]][3])
{
- if (gUnknown_085B58C9[data[2]][1] == data[1])
+ if (sUnknown_085B58C9[data[2]][1] == data[1])
{
data[3]++;
- if (data[3] == gUnknown_085B58C9[data[2]][2])
+ if (data[3] == sUnknown_085B58C9[data[2]][2])
{
data[3] = 0;
data[2]++;
}
- data[1] = gUnknown_085B58C9[data[2]][0];
+ data[1] = sUnknown_085B58C9[data[2]][0];
}
else
{
@@ -1409,7 +1465,7 @@ static void InitMovingBgValues(u16 *movingBgs)
{
for (j = 0; j < 16; j++)
{
- movingBgs[i * 16 + j] = gUnknown_085B5884[gUnknown_085B58D9[i * 16 + j]];
+ movingBgs[i * 16 + j] = sUnknown_085B5884[sUnknown_085B58D9[i][j]];
}
}
}
@@ -1426,11 +1482,11 @@ static void InitMovingBackgroundTask(bool8 isLink)
else
innerBgId = 1, outerBgId = 3;
- LoadPalette(gUnknown_085B51E4, 0xA0, 0x20);
+ LoadPalette(sUnknown_085B51E4, 0xA0, 0x20);
- copy_decompressed_tile_data_to_vram_autofree(1, gUnknown_085B4134, FALSE, 0, 0);
- CopyToBgTilemapBuffer(1, gUnknown_085B482C, 0, 0);
- CopyToBgTilemapBuffer(outerBgId, gUnknown_085B4D10, 0, 0);
+ copy_decompressed_tile_data_to_vram_autofree(1, sUnknown_085B4134, FALSE, 0, 0);
+ CopyToBgTilemapBuffer(1, sUnknown_085B482C, 0, 0);
+ CopyToBgTilemapBuffer(outerBgId, sUnknown_085B4D10, 0, 0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(outerBgId);
diff --git a/src/field_camera.c b/src/field_camera.c
index 17ced6aa5..8629bec2b 100644
--- a/src/field_camera.c
+++ b/src/field_camera.c
@@ -1,9 +1,20 @@
-
-// Includes
#include "global.h"
+#include "berry.h"
+#include "bike.h"
+#include "field_camera.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "event_object_movement.h"
+#include "gpu_regs.h"
+#include "menu.h"
+#include "overworld.h"
+#include "rotating_gate.h"
+#include "sprite.h"
+#include "text.h"
-// Static type declarations
+EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE;
+// Static type declarations
struct FieldCameraUnknownStruct
{
u8 unk0;
@@ -13,16 +24,478 @@ struct FieldCameraUnknownStruct
bool8 unk4;
};
-// Static RAM declarations
+// static functions
+static void RedrawMapSliceNorth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout);
+static void RedrawMapSliceSouth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout);
+static void RedrawMapSliceEast(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout);
+static void RedrawMapSliceWest(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout);
+static s32 MapPosToBgTilemapOffset(struct FieldCameraUnknownStruct *a, s32 x, s32 y);
+static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout);
+static void DrawMetatileAt(const struct MapLayout *mapLayout, u16, int, int);
+static void DrawMetatile(s32 a, u16 *b, u16 c);
+static void CameraPanningCB_PanAhead(void);
+
+// IWRAM bss vars
+static IWRAM_DATA struct FieldCameraUnknownStruct gUnknown_03000E20;
+static IWRAM_DATA s16 gUnknown_03000E28;
+static IWRAM_DATA s16 gUnknown_03000E2A;
+static IWRAM_DATA u8 gUnknown_03000E2C;
+static IWRAM_DATA void (*gUnknown_03000E30)(void);
+
+struct CameraObject gUnknown_03005DD0;
+u16 gUnknown_03005DE8;
+u16 gUnknown_03005DEC;
+
+// text
+static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraUnknownStruct *a)
+{
+ a->unk2 = 0;
+ a->unk3 = 0;
+ a->unk0 = 0;
+ a->unk1 = 0;
+ a->unk4 = TRUE;
+}
+
+static void tilemap_move_something(struct FieldCameraUnknownStruct *a, u32 b, u32 c)
+{
+ a->unk2 += b;
+ a->unk2 %= 32;
+ a->unk3 += c;
+ a->unk3 %= 32;
+}
+
+static void coords8_add(struct FieldCameraUnknownStruct *a, u32 b, u32 c)
+{
+ a->unk0 += b;
+ a->unk1 += c;
+}
+
+void move_tilemap_camera_to_upper_left_corner(void)
+{
+ move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000E20);
+}
+
+void FieldUpdateBgTilemapScroll(void)
+{
+ u32 r4, r5;
+ r5 = gUnknown_03000E20.unk0 + gUnknown_03000E28;
+ r4 = gUnknown_03000E2A + gUnknown_03000E20.unk1 + 8;
+
+ SetGpuReg(REG_OFFSET_BG1HOFS, r5);
+ SetGpuReg(REG_OFFSET_BG1VOFS, r4);
+ SetGpuReg(REG_OFFSET_BG2HOFS, r5);
+ SetGpuReg(REG_OFFSET_BG2VOFS, r4);
+ SetGpuReg(REG_OFFSET_BG3HOFS, r5);
+ SetGpuReg(REG_OFFSET_BG3VOFS, r4);
+}
+
+void sub_8089C08(s16 *a, s16 *b)
+{
+ *a = gUnknown_03000E20.unk0 + gUnknown_03000E28;
+ *b = gUnknown_03000E20.unk1 + gUnknown_03000E2A + 8;
+}
+
+void DrawWholeMapView(void)
+{
+ DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapLayout);
+ gUnknown_03000E20.unk4 = TRUE;
+}
+
+static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 j;
+ u32 r6;
+ u8 temp;
+
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = gUnknown_03000E20.unk3 + i;
+ if (temp >= 32)
+ temp -= 32;
+ r6 = temp * 32;
+ for (j = 0; j < 32; j += 2)
+ {
+ temp = gUnknown_03000E20.unk2 + j;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, r6 + temp, x + j / 2, y + i / 2);
+ }
+ }
+}
+
+static void RedrawMapSlicesForCameraUpdate(struct FieldCameraUnknownStruct *a, int x, int y)
+{
+ const struct MapLayout *mapLayout = gMapHeader.mapLayout;
+
+ if (x > 0)
+ RedrawMapSliceWest(a, mapLayout);
+ if (x < 0)
+ RedrawMapSliceEast(a, mapLayout);
+ if (y > 0)
+ RedrawMapSliceNorth(a, mapLayout);
+ if (y < 0)
+ RedrawMapSliceSouth(a, mapLayout);
+ a->unk4 = TRUE;
+}
+
+static void RedrawMapSliceNorth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u32 r7;
+
+ temp = a->unk3 + 28;
+ if (temp >= 32)
+ temp -= 32;
+ r7 = temp * 32;
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = a->unk2 + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y + 14);
+ }
+}
+
+static void RedrawMapSliceSouth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u32 r7 = a->unk3 * 32;
+
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = a->unk2 + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y);
+ }
+}
+
+static void RedrawMapSliceEast(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u32 r6 = a->unk2;
+
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = a->unk3 + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, temp * 32 + r6, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y + i / 2);
+ }
+}
+
+static void RedrawMapSliceWest(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout)
+{
+ u8 i;
+ u8 temp;
+ u8 r5 = a->unk2 + 28;
+
+ if (r5 >= 32)
+ r5 -= 32;
+ for (i = 0; i < 32; i += 2)
+ {
+ temp = a->unk3 + i;
+ if (temp >= 32)
+ temp -= 32;
+ DrawMetatileAt(mapLayout, temp * 32 + r5, gSaveBlock1Ptr->pos.x + 14, gSaveBlock1Ptr->pos.y + i / 2);
+ }
+}
+
+void CurrentMapDrawMetatileAt(int a, int b)
+{
+ int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, a, b);
+
+ if (offset >= 0)
+ {
+ DrawMetatileAt(gMapHeader.mapLayout, offset, a, b);
+ gUnknown_03000E20.unk4 = TRUE;
+ }
+}
+
+void DrawDoorMetatileAt(int x, int y, u16 *arr)
+{
+ int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, x, y);
+
+ if (offset >= 0)
+ {
+ DrawMetatile(1, arr, offset);
+ gUnknown_03000E20.unk4 = TRUE;
+ }
+}
+
+static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 b, int c, int d)
+{
+ u16 metatileId = MapGridGetMetatileIdAt(c, d);
+ u16 *metatiles;
+
+ if (metatileId > 1024)
+ metatileId = 0;
+ if (metatileId < 512)
+ metatiles = mapLayout->primaryTileset->metatiles;
+ else
+ {
+ metatiles = mapLayout->secondaryTileset->metatiles;
+ metatileId -= 512;
+ }
+ DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b);
+}
+
+static void DrawMetatile(s32 a, u16 *b, u16 c)
+{
+ switch (a)
+ {
+ case 2:
+ gBGTilemapBuffers3[c] = b[0];
+ gBGTilemapBuffers3[c + 1] = b[1];
+ gBGTilemapBuffers3[c + 0x20] = b[2];
+ gBGTilemapBuffers3[c + 0x21] = b[3];
+
+ gBGTilemapBuffers1[c] = 0;
+ gBGTilemapBuffers1[c + 1] = 0;
+ gBGTilemapBuffers1[c + 0x20] = 0;
+ gBGTilemapBuffers1[c + 0x21] = 0;
+
+ gBGTilemapBuffers2[c] = b[4];
+ gBGTilemapBuffers2[c + 1] = b[5];
+ gBGTilemapBuffers2[c + 0x20] = b[6];
+ gBGTilemapBuffers2[c + 0x21] = b[7];
+ break;
+ case 1:
+ gBGTilemapBuffers3[c] = b[0];
+ gBGTilemapBuffers3[c + 1] = b[1];
+ gBGTilemapBuffers3[c + 0x20] = b[2];
+ gBGTilemapBuffers3[c + 0x21] = b[3];
+
+ gBGTilemapBuffers1[c] = b[4];
+ gBGTilemapBuffers1[c + 1] = b[5];
+ gBGTilemapBuffers1[c + 0x20] = b[6];
+ gBGTilemapBuffers1[c + 0x21] = b[7];
+
+ gBGTilemapBuffers2[c] = 0;
+ gBGTilemapBuffers2[c + 1] = 0;
+ gBGTilemapBuffers2[c + 0x20] = 0;
+ gBGTilemapBuffers2[c + 0x21] = 0;
+ break;
+ case 0:
+ gBGTilemapBuffers3[c] = 0x3014;
+ gBGTilemapBuffers3[c + 1] = 0x3014;
+ gBGTilemapBuffers3[c + 0x20] = 0x3014;
+ gBGTilemapBuffers3[c + 0x21] = 0x3014;
+
+ gBGTilemapBuffers1[c] = b[0];
+ gBGTilemapBuffers1[c + 1] = b[1];
+ gBGTilemapBuffers1[c + 0x20] = b[2];
+ gBGTilemapBuffers1[c + 0x21] = b[3];
+
+ gBGTilemapBuffers2[c] = b[4];
+ gBGTilemapBuffers2[c + 1] = b[5];
+ gBGTilemapBuffers2[c + 0x20] = b[6];
+ gBGTilemapBuffers2[c + 0x21] = b[7];
+ break;
+ }
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ schedule_bg_copy_tilemap_to_vram(3);
+}
+
+static s32 MapPosToBgTilemapOffset(struct FieldCameraUnknownStruct *a, s32 x, s32 y)
+{
+ x -= gSaveBlock1Ptr->pos.x;
+ x *= 2;
+ if (x >= 32 || x < 0)
+ return -1;
+ x = x + a->unk2;
+ if (x >= 32)
+ x -= 32;
+
+ y = (y - gSaveBlock1Ptr->pos.y) * 2;
+ if (y >= 32 || y < 0)
+ return -1;
+ y = y + a->unk3;
+ if (y >= 32)
+ y -= 32;
+
+ return y * 32 + x;
+}
+
+static void CameraUpdateCallback(struct CameraObject *a)
+{
+ if (a->spriteId != 0)
+ {
+ a->unk8 = gSprites[a->spriteId].data[2];
+ a->unkC = gSprites[a->spriteId].data[3];
+ }
+}
+
+void ResetCameraUpdateInfo(void)
+{
+ gUnknown_03005DD0.unk8 = 0;
+ gUnknown_03005DD0.unkC = 0;
+ gUnknown_03005DD0.x = 0;
+ gUnknown_03005DD0.y = 0;
+ gUnknown_03005DD0.spriteId = 0;
+ gUnknown_03005DD0.callback = NULL;
+}
-IWRAM_DATA struct FieldCameraUnknownStruct gUnknown_03000E20;
-IWRAM_DATA s16 gUnknown_03000E28;
-IWRAM_DATA s16 gUnknown_03000E2A;
-IWRAM_DATA u8 gUnknown_03000E2C;
-IWRAM_DATA void (*gUnknown_03000E30)(void);
+u32 InitCameraUpdateCallback(u8 a)
+{
+ if (gUnknown_03005DD0.spriteId != 0)
+ DestroySprite(&gSprites[gUnknown_03005DD0.spriteId]);
+ gUnknown_03005DD0.spriteId = AddCameraObject(a);
+ gUnknown_03005DD0.callback = CameraUpdateCallback;
+ return 0;
+}
+
+void CameraUpdate(void)
+{
+ int deltaX;
+ int deltaY;
+ int r0;
+ int r1;
+ int r7;
+ int r8;
+
+ if (gUnknown_03005DD0.callback != NULL)
+ gUnknown_03005DD0.callback(&gUnknown_03005DD0);
+ r7 = gUnknown_03005DD0.unk8;
+ r8 = gUnknown_03005DD0.unkC;
+ deltaX = 0;
+ deltaY = 0;
+ r1 = gUnknown_03005DD0.x;
+ r0 = gUnknown_03005DD0.y;
+
+
+ if (r1 == 0 && r7 != 0)
+ {
+ if (r7 > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+ if (r0 == 0 && r8 != 0)
+ {
+ if (r8 > 0)
+ deltaY = 1;
+ else
+ deltaY = -1;
+ }
+ if (r1 != 0 && r1 == -r7)
+ {
+ if (r7 > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+ if (r0 != 0 && r0 == -r8)
+ {
+ if (r8 > 0)
+ deltaX = 1;
+ else
+ deltaX = -1;
+ }
+
+ gUnknown_03005DD0.x += r7;
+ gUnknown_03005DD0.x = gUnknown_03005DD0.x - 16 * (gUnknown_03005DD0.x / 16);
+ gUnknown_03005DD0.y += r8;
+ gUnknown_03005DD0.y = gUnknown_03005DD0.y - 16 * (gUnknown_03005DD0.y / 16);
+
+ if (deltaX != 0 || deltaY != 0)
+ {
+ CameraMove(deltaX, deltaY);
+ UpdateEventObjectsForCameraUpdate(deltaX, deltaY);
+ RotatingGatePuzzleCameraUpdate(deltaX, deltaY);
+ ResetBerryTreeSparkleFlags();
+ tilemap_move_something(&gUnknown_03000E20, deltaX * 2, deltaY * 2);
+ RedrawMapSlicesForCameraUpdate(&gUnknown_03000E20, deltaX * 2, deltaY * 2);
+ }
+
+ coords8_add(&gUnknown_03000E20, r7, r8);
+ gUnknown_03005DEC -= r7;
+ gUnknown_03005DE8 -= r8;
+}
+
+void camera_move_and_redraw(int a, int b) //unused
+{
+ CameraMove(a, b);
+ UpdateEventObjectsForCameraUpdate(a, b);
+ DrawWholeMapView();
+ gUnknown_03005DEC -= a * 16;
+ gUnknown_03005DE8 -= b * 16;
+}
+
+void SetCameraPanningCallback(void (*a)(void))
+{
+ gUnknown_03000E30 = a;
+}
+
+void SetCameraPanning(s16 a, s16 b)
+{
+ gUnknown_03000E28 = a;
+ gUnknown_03000E2A = b + 32;
+}
+
+void InstallCameraPanAheadCallback(void)
+{
+ gUnknown_03000E30 = CameraPanningCB_PanAhead;
+ gUnknown_03000E2C = 0;
+ gUnknown_03000E28 = 0;
+ gUnknown_03000E2A = 32;
+}
+
+void UpdateCameraPanning(void)
+{
+ if (gUnknown_03000E30 != NULL)
+ gUnknown_03000E30();
+ //Update sprite offset of overworld objects
+ gSpriteCoordOffsetX = gUnknown_03005DEC - gUnknown_03000E28;
+ gSpriteCoordOffsetY = gUnknown_03005DE8 - gUnknown_03000E2A - 8;
+}
+
+static void CameraPanningCB_PanAhead(void)
+{
+ u8 var;
-// Static ROM declarations
+ if (gUnusedBikeCameraAheadPanback == FALSE)
+ {
+ InstallCameraPanAheadCallback();
+ }
+ else
+ {
+ // this code is never reached.
+ if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION)
+ {
+ gUnknown_03000E2C ^= 1;
+ if (gUnknown_03000E2C == 0)
+ return;
+ }
+ else
+ {
+ gUnknown_03000E2C = 0;
+ }
-// .rodata
+ var = GetPlayerMovementDirection();
+ if (var == 2)
+ {
+ if (gUnknown_03000E2A > -8)
+ gUnknown_03000E2A -= 2;
+ }
+ else if (var == 1)
+ {
+ if (gUnknown_03000E2A < 72)
+ gUnknown_03000E2A += 2;
+ }
+ else if (gUnknown_03000E2A < 32)
+ {
+ gUnknown_03000E2A += 2;
+ }
+ else if (gUnknown_03000E2A > 32)
+ {
+ gUnknown_03000E2A -= 2;
+ }
+ }
+}
-// .text
diff --git a/src/field_door.c b/src/field_door.c
new file mode 100644
index 000000000..fe9de01fd
--- /dev/null
+++ b/src/field_door.c
@@ -0,0 +1,898 @@
+#include "global.h"
+#include "field_door.h"
+#include "field_camera.h"
+#include "fieldmap.h"
+#include "metatile_behavior.h"
+#include "event_data.h"
+#include "constants/songs.h"
+#include "constants/flags.h"
+#include "constants/maps.h"
+#include "task.h"
+
+bool8 sub_808A964(void);
+
+const u8 DoorAnimTiles_04[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/04/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/04/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/04/2.4bpp"),
+};
+
+// TODO: Make these blank palette includes?
+asm(".space 32");
+
+const u8 DoorAnimTiles_05[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/05/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/05/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/05/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_08[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/08/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/08/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/08/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_15[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/15/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/15/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/15/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_16[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/16/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/16/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/16/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_00[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/00/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/00/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/00/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_01[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/01/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/01/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/01/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_02[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/02/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/02/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/02/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_03[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/03/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/03/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/03/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_06[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/06/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/06/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/06/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_07[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/07/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/07/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/07/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_09[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/09/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/09/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/09/2.4bpp"),
+};
+
+asm(".space 0x5900");
+
+const u8 DoorAnimTiles_UnusedTops[][0x40] =
+{
+ INCBIN_U8("graphics/door_anims/unused_848EDEC/0_top.4bpp"),
+ INCBIN_U8("graphics/door_anims/unused_848EDEC/1_top.4bpp"),
+ INCBIN_U8("graphics/door_anims/unused_848EDEC/2_top.4bpp"),
+};
+
+asm(".space 0x140");
+
+const u8 DoorAnimTiles_UnusedBottoms[][0x40] =
+{
+ INCBIN_U8("graphics/door_anims/unused_848EDEC/0_bottom.4bpp"),
+ INCBIN_U8("graphics/door_anims/unused_848EDEC/1_bottom.4bpp"),
+ INCBIN_U8("graphics/door_anims/unused_848EDEC/2_bottom.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_10[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/10/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/10/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/10/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_11[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/11/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/11/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/11/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_12[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/12/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/12/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/12/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_13[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/13/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/13/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/13/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_14[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/14/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/14/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/14/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_17[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/17/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/17/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/17/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_18[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/18/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/18/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/18/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_19[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/19/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/19/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/19/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_20[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/20/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/20/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/20/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_21[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/21/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/21/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/21/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_22[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/22/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/22/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/22/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_23[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/23/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/23/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/23/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_24[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/24/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/24/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/24/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_25[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/25/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/25/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/25/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_26[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/26/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/26/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/26/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_27[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/27/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/27/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/27/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_28[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/28/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/28/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/28/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_29[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/29/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/29/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/29/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_30[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/30/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/30/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/30/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_31[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/31/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/31/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/31/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_32[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/32/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/32/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/32/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_33[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/33/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/33/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/33/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_34[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/34/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/34/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/34/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_35[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/35/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/35/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/35/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_36[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/36/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/36/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/36/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_37[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/37/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/37/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/37/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_38[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/38/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/38/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/38/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_39[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/39/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/39/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/39/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_40[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/40/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/40/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/40/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_41[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/41/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/41/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/41/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_42[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/42/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/42/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/42/2.4bpp"),
+ INCBIN_U8("graphics/door_anims/42/3.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_43[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/43/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/43/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/43/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_44[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/44/0_left.4bpp"),
+ INCBIN_U8("graphics/door_anims/44/0_right.4bpp"),
+ INCBIN_U8("graphics/door_anims/44/1_left.4bpp"),
+ INCBIN_U8("graphics/door_anims/44/1_right.4bpp"),
+ INCBIN_U8("graphics/door_anims/44/2_left.4bpp"),
+ INCBIN_U8("graphics/door_anims/44/2_right.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_45[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/45/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/45/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/45/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_46[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/46/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/46/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/46/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_47[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/47/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/47/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/47/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_48[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/48/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/48/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/48/2.4bpp"),
+ INCBIN_U8("graphics/door_anims/48/3.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_49[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/49/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/49/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/49/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_50[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/50/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/50/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/50/2.4bpp"),
+};
+
+asm(".space 32");
+
+static const struct DoorAnimFrame gDoorOpenAnimFrames[] =
+{
+ {4, -1},
+ {4, 0},
+ {4, 0x100},
+ {4, 0x200},
+ {0, 0},
+};
+
+static const struct DoorAnimFrame gDoorCloseAnimFrames[] =
+{
+ {4, 0x200},
+ {4, 0x100},
+ {4, 0},
+ {4, -1},
+ {0, 0},
+};
+
+static const struct DoorAnimFrame gBigDoorOpenAnimFrames[] =
+{
+ {4, -1},
+ {4, 0},
+ {4, 0x200},
+ {4, 0x400},
+ {0, 0},
+};
+
+static const struct DoorAnimFrame gBigDoorCloseAnimFrames[] =
+{
+ {4, 0x400},
+ {4, 0x200},
+ {4, 0},
+ {4, -1},
+ {0, 0},
+};
+
+const u8 DoorAnimPalettes_8496FDC[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 00
+const u8 DoorAnimPalettes_8496FE4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 01
+const u8 DoorAnimPalettes_8496FEC[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 02
+const u8 DoorAnimPalettes_8496FF4[] = {0, 0, 1, 1, 1, 1, 1, 1}; // door 03
+const u8 DoorAnimPalettes_8496FFC[] = {10, 10, 6, 6, 6, 6, 6, 6}; // door 04
+const u8 DoorAnimPalettes_8497004[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 05
+const u8 DoorAnimPalettes_849700C[] = {11, 11, 11, 11, 11, 11, 11, 11}; // door 06
+const u8 DoorAnimPalettes_8497014[] = {10, 10, 10, 10, 10, 10, 10, 10}; // door 07
+const u8 DoorAnimPalettes_849701C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 08
+const u8 DoorAnimPalettes_8497024[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 09
+const u8 DoorAnimPalettes_849702C[] = {10, 10, 9, 9, 9, 9, 9, 9}; // door 10
+const u8 DoorAnimPalettes_8497034[] = {9, 9, 1, 1, 1, 1, 1, 1}; // door 11
+const u8 DoorAnimPalettes_849703C[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 12
+const u8 DoorAnimPalettes_8497044[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 13
+const u8 DoorAnimPalettes_849704C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 14
+const u8 DoorAnimPalettes_8497054[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 15
+const u8 DoorAnimPalettes_849705C[] = {0, 0, 5, 5, 5, 5, 5, 5}; // door 16
+const u8 DoorAnimPalettes_8497064[] = {6, 6, 1, 1, 1, 1, 1, 1}; // door 17
+const u8 DoorAnimPalettes_849706C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 18
+const u8 DoorAnimPalettes_8497074[] = {6, 6, 5, 5, 5, 5, 5, 5}; // door 19
+const u8 DoorAnimPalettes_849707C[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 20
+const u8 DoorAnimPalettes_8497084[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 21
+const u8 DoorAnimPalettes_849708C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 22
+const u8 DoorAnimPalettes_8497094[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 23
+const u8 DoorAnimPalettes_849709C[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 24
+const u8 DoorAnimPalettes_84970A4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 25
+const u8 DoorAnimPalettes_84970AC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 26
+const u8 DoorAnimPalettes_84970B4[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 27
+const u8 DoorAnimPalettes_84970BC[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 28
+const u8 DoorAnimPalettes_84970C4[] = {11, 11, 7, 7, 7, 7, 7, 7}; // door 29
+const u8 DoorAnimPalettes_84970CC[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 30
+const u8 DoorAnimPalettes_84970D4[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 31
+const u8 DoorAnimPalettes_84970DC[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 32
+const u8 DoorAnimPalettes_84970E4[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 33
+const u8 DoorAnimPalettes_84970EC[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 34
+const u8 DoorAnimPalettes_84970F4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 35
+const u8 DoorAnimPalettes_84970FC[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 36
+const u8 DoorAnimPalettes_8497104[] = {0, 0, 0, 0, 0, 0, 0, 0}; // door 37
+const u8 DoorAnimPalettes_849710C[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 38
+const u8 DoorAnimPalettes_8497114[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 39
+const u8 DoorAnimPalettes_849711C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 40
+const u8 DoorAnimPalettes_8497124[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 41
+const u8 DoorAnimPalettes_849712C[] = {1, 1, 1, 1, 1, 1, 1, 1}; // doors 42, 43, and 44
+const u8 DoorAnimPalettes_8497134[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 45
+const u8 DoorAnimPalettes_849713C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 46
+const u8 DoorAnimPalettes_8497144[] = {1, 1, 1, 1, 1, 1, 1, 1}; // unused
+const u8 DoorAnimPalettes_849714C[] = {1, 1, 1, 1, 1, 1, 1, 1}; // doors 47 and 48
+const u8 DoorAnimPalettes_8497154[] = {9, 9, 7, 7, 7, 7, 7, 7}; // door 49
+const u8 DoorAnimPalettes_849715C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 50
+const u8 DoorAnimPalettes_8497164[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 51
+const u8 DoorAnimPalettes_849716C[] = {9, 9, 7, 7, 7, 7, 7, 7}; // door 52
+
+static const struct DoorGraphics gDoorAnimGraphicsTable[] =
+{
+ {0x021, 0, 1, DoorAnimTiles_00, DoorAnimPalettes_8496FDC}, // door 00
+ {0x061, 1, 1, DoorAnimTiles_01, DoorAnimPalettes_8496FE4}, // door 01
+ {0x1CD, 1, 1, DoorAnimTiles_02, DoorAnimPalettes_8496FEC}, // door 02
+ {0x041, 1, 1, DoorAnimTiles_03, DoorAnimPalettes_8496FF4}, // door 03
+ {0x248, 0, 1, DoorAnimTiles_04, DoorAnimPalettes_8496FFC}, // door 04
+ {0x249, 0, 1, DoorAnimTiles_05, DoorAnimPalettes_8497004}, // door 05
+ {0x22F, 0, 1, DoorAnimTiles_06, DoorAnimPalettes_849700C}, // door 06
+ {0x21F, 0, 1, DoorAnimTiles_07, DoorAnimPalettes_8497014}, // door 07
+ {0x2A5, 0, 1, DoorAnimTiles_08, DoorAnimPalettes_849701C}, // door 08
+ {0x287, 0, 1, DoorAnimTiles_09, DoorAnimPalettes_849702C}, // door 09
+ {0x2AC, 0, 1, DoorAnimTiles_10, DoorAnimPalettes_849706C}, // door 10
+ {0x3A1, 0, 1, DoorAnimTiles_11, DoorAnimPalettes_8497074}, // door 11
+ {0x2DC, 0, 1, DoorAnimTiles_12, DoorAnimPalettes_8497064}, // door 12
+ {0x225, 0, 1, DoorAnimTiles_13, DoorAnimPalettes_849705C}, // door 13
+ {0x1DB, 1, 1, DoorAnimTiles_14, DoorAnimPalettes_8497084}, // door 14
+ {0x246, 0, 1, DoorAnimTiles_15, DoorAnimPalettes_8497024}, // door 15
+ {0x28E, 0, 1, DoorAnimTiles_16, DoorAnimPalettes_849707C}, // door 16
+ {0x2A1, 0, 1, DoorAnimTiles_17, DoorAnimPalettes_8497034}, // door 17
+ {0x21C, 0, 1, DoorAnimTiles_18, DoorAnimPalettes_849704C}, // door 18
+ {0x21E, 0, 1, DoorAnimTiles_19, DoorAnimPalettes_8497054}, // door 19
+ {0x21D, 1, 1, DoorAnimTiles_20, DoorAnimPalettes_849703C}, // door 20
+ {0x21A, 0, 1, DoorAnimTiles_21, DoorAnimPalettes_8497044}, // door 21
+ {0x224, 0, 1, DoorAnimTiles_22, DoorAnimPalettes_849708C}, // door 22
+ {0x289, 0, 1, DoorAnimTiles_23, DoorAnimPalettes_8497094}, // door 23
+ {0x30C, 1, 1, DoorAnimTiles_24, DoorAnimPalettes_849709C}, // door 24
+ {0x32D, 1, 1, DoorAnimTiles_25, DoorAnimPalettes_84970A4}, // door 25
+ {0x2ED, 1, 1, DoorAnimTiles_26, DoorAnimPalettes_84970AC}, // door 26
+ {0x264, 1, 1, DoorAnimTiles_27, DoorAnimPalettes_84970B4}, // door 27
+ {0x22B, 0, 1, DoorAnimTiles_28, DoorAnimPalettes_84970BC}, // door 28
+ {0x2F7, 0, 1, DoorAnimTiles_29, DoorAnimPalettes_84970C4}, // door 29
+ {0x297, 0, 1, DoorAnimTiles_30, DoorAnimPalettes_84970CC}, // door 30
+ {0x285, 1, 1, DoorAnimTiles_31, DoorAnimPalettes_84970D4}, // door 31
+ {0x25D, 1, 1, DoorAnimTiles_32, DoorAnimPalettes_84970DC}, // door 32
+ {0x20E, 1, 1, DoorAnimTiles_33, DoorAnimPalettes_84970E4}, // door 33
+ {0x3B0, 1, 1, DoorAnimTiles_34, DoorAnimPalettes_84970EC}, // door 34
+ {0x28A, 1, 1, DoorAnimTiles_35, DoorAnimPalettes_84970F4}, // door 35
+ {0x263, 1, 1, DoorAnimTiles_36, DoorAnimPalettes_84970FC}, // door 36
+ {0x329, 1, 1, DoorAnimTiles_37, DoorAnimPalettes_8497104}, // door 37
+ {0x291, 0, 1, DoorAnimTiles_38, DoorAnimPalettes_849710C}, // door 38
+ {0x21B, 2, 1, DoorAnimTiles_39, DoorAnimPalettes_8497114}, // door 39
+ {0x209, 1, 1, DoorAnimTiles_40, DoorAnimPalettes_849711C}, // door 40
+ {0x219, 0, 1, DoorAnimTiles_41, DoorAnimPalettes_8497124}, // door 41
+ {0x393, 1, 1, DoorAnimTiles_42, DoorAnimPalettes_849712C}, // door 42
+ {0x3D4, 1, 1, DoorAnimTiles_42, DoorAnimPalettes_849712C}, // door 43
+ {0x36C, 1, 1, DoorAnimTiles_42, DoorAnimPalettes_849712C}, // door 44
+ {0x25E, 1, 1, DoorAnimTiles_43, DoorAnimPalettes_8497134}, // door 45
+ {0x2AD, 1, 2, DoorAnimTiles_44, DoorAnimPalettes_849713C}, // door 46
+ {0x3FC, 0, 1, DoorAnimTiles_45, DoorAnimPalettes_849714C}, // door 47
+ {0x396, 1, 1, DoorAnimTiles_46, DoorAnimPalettes_849714C}, // door 48
+ {0x20A, 1, 1, DoorAnimTiles_47, DoorAnimPalettes_8497154}, // door 49
+ {0x26B, 1, 1, DoorAnimTiles_48, DoorAnimPalettes_849715C}, // door 50
+ {0x32C, 1, 1, DoorAnimTiles_49, DoorAnimPalettes_8497164}, // door 51
+ {0x383, 1, 1, DoorAnimTiles_50, DoorAnimPalettes_849716C}, // door 52
+ {0, 0, 0, NULL, NULL},
+};
+
+static void CopyDoorTilesToVram(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frame)
+{
+ if (gfx->size == 2)
+ CpuFastSet(gfx->tiles + frame->offset, (void *)(VRAM + 0x7E00), 0x80);
+ else
+ CpuFastSet(gfx->tiles + frame->offset, (void *)(VRAM + 0x7F00), 0x40);
+}
+
+static void door_build_blockdef(u16 *a, u16 b, const u8 *c)
+{
+ int i;
+ u16 unk;
+
+ for (i = 0; i < 4; i++)
+ {
+ unk = *(c++) << 12;
+ a[i] = unk | (b + i);
+ }
+ for (; i < 8; i++)
+ {
+ unk = *(c++) << 12;
+ a[i] = unk;
+ }
+}
+
+static void DrawCurrentDoorAnimFrame(const struct DoorGraphics *gfx, u32 x, u32 y, const u8 *pal)
+{
+ u16 arr[24];
+
+ if (gfx->size == 2)
+ {
+ door_build_blockdef(&arr[8], 0x3F0, pal);
+ DrawDoorMetatileAt(x, y - 1, &arr[8]);
+ door_build_blockdef(&arr[8], 0x3F4, pal + 4);
+ DrawDoorMetatileAt(x, y, &arr[8]);
+ door_build_blockdef(&arr[8], 0x3F8, pal);
+ DrawDoorMetatileAt(x + 1, y - 1, &arr[8]);
+ door_build_blockdef(&arr[8], 0x3FC, pal + 4);
+ DrawDoorMetatileAt(x + 1, y, &arr[8]);
+ }
+ else
+ {
+ door_build_blockdef(&arr[0], 0x3F8, pal);
+ DrawDoorMetatileAt(x, y - 1, &arr[0]);
+ door_build_blockdef(&arr[0], 0x3FC, pal + 4);
+ DrawDoorMetatileAt(x, y, &arr[0]);
+ }
+}
+
+static void DrawClosedDoorTiles(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ CurrentMapDrawMetatileAt(x, y - 1);
+ CurrentMapDrawMetatileAt(x, y);
+
+ if (gfx->size == 2)
+ {
+ CurrentMapDrawMetatileAt(x + 1, y - 1);
+ CurrentMapDrawMetatileAt(x + 1, y);
+ }
+}
+
+static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frame, u32 x, u32 y)
+{
+ if (frame->offset == 0xFFFF)
+ {
+ DrawClosedDoorTiles(gfx, x, y);
+ if (sub_808A964())
+ DrawClosedDoorTiles(gfx, gSpecialVar_0x8004 + 7, gSpecialVar_0x8005 + 7);
+ }
+ else
+ {
+ CopyDoorTilesToVram(gfx, frame);
+ DrawCurrentDoorAnimFrame(gfx, x, y, gfx->palette);
+ if (sub_808A964())
+ DrawCurrentDoorAnimFrame(gfx, gSpecialVar_0x8004 + 7, gSpecialVar_0x8005 + 7, gfx->palette);
+ }
+}
+
+enum
+{
+ TD_FRAMELIST = 0,
+ TD_GFX = 2,
+ TD_FRAME = 4,
+ TD_COUNTER,
+ TD_X,
+ TD_Y
+};
+
+static bool32 sub_808A5F0(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData)
+{
+ if (taskData[TD_COUNTER] == 0)
+ DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]);
+ if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time)
+ {
+ taskData[TD_COUNTER] = 0;
+ taskData[TD_FRAME]++;
+ if (frames[taskData[TD_FRAME]].time == 0)
+ return FALSE;
+ else
+ return TRUE;
+ }
+ taskData[TD_COUNTER]++;
+ return TRUE;
+}
+
+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_808A5F0(gfx, frames, taskData) == FALSE)
+ DestroyTask(taskId);
+}
+
+static const struct DoorAnimFrame *GetLastDoorFrame(const struct DoorAnimFrame *frame, const void *unused)
+{
+ while (frame->time != 0)
+ frame++;
+ return frame - 1;
+}
+
+static const struct DoorGraphics *GetDoorGraphics(const struct DoorGraphics *gfx, u16 metatileNum)
+{
+ while (gfx->tiles != NULL)
+ {
+ if (gfx->metatileNum == metatileNum)
+ return gfx;
+ gfx++;
+ }
+ return NULL;
+}
+
+static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, u32 x, u32 y)
+{
+ if (FuncIsActiveTask(Task_AnimateDoor) == TRUE)
+ return -1;
+ else
+ {
+ 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;
+ }
+}
+
+static void DrawClosedDoor(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ DrawClosedDoorTiles(gfx, x, y);
+}
+
+static void DrawOpenedDoor(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx != NULL)
+ DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y);
+}
+
+static s8 StartDoorOpenAnimation(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx == NULL)
+ {
+ return -1;
+ }
+ else
+ {
+ if (gfx->size == 2)
+ return StartDoorAnimationTask(gfx, gBigDoorOpenAnimFrames, x, y);
+ else
+ return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y);
+ }
+}
+
+static s8 StartDoorCloseAnimation(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx == NULL)
+ return -1;
+ else
+ return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y);
+}
+
+static s8 cur_mapdata_get_door_x2_at(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx == NULL)
+ return -1;
+ else
+ return gfx->sound;
+}
+
+void unref_sub_808A83C(u32 x, u32 y)
+{
+ StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
+}
+
+void FieldSetDoorOpened(u32 x, u32 y)
+{
+ if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ DrawOpenedDoor(gDoorAnimGraphicsTable, x, y);
+}
+
+void FieldSetDoorClosed(u32 x, u32 y)
+{
+ if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ DrawClosedDoor(gDoorAnimGraphicsTable, x, y);
+}
+
+s8 FieldAnimateDoorClose(u32 x, u32 y)
+{
+ if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ return -1;
+ else
+ return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y);
+}
+
+s8 FieldAnimateDoorOpen(u32 x, u32 y)
+{
+ if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ return -1;
+ else
+ return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
+}
+
+bool8 FieldIsDoorAnimationRunning(void)
+{
+ return FuncIsActiveTask(Task_AnimateDoor);
+}
+
+u32 GetDoorSoundEffect(u32 x, u32 y)
+{
+ int sound = cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y);
+
+ if (sound == 0)
+ return SE_DOOR;
+ else if (sound == 1)
+ return SE_JIDO_DOA;
+ else if (sound == 2)
+ return SE_TU_SAA;
+ else
+ return SE_DOOR;
+}
+
+bool8 sub_808A964(void)
+{
+ if (FlagGet(FLAG_SPECIAL_FLAG_0x4002))
+ {
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR2) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR2))
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
diff --git a/src/field_effect.c b/src/field_effect.c
index 628dc776a..f047c78a3 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -1,15 +1,3896 @@
// Includes
#include "global.h"
+#include "field_effect.h"
+#include "battle_dome_cards.h"
+#include "decompress.h"
+#include "field_camera.h"
+#include "field_effect_helpers.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "field_screen.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+#include "fldeff_groundshake.h"
+#include "gpu_regs.h"
+#include "main.h"
+#include "menu.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokemon.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "util.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+
+#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
+
+EWRAM_DATA s32 gFieldEffectArguments[8] = {0};
// Static type declarations
// Static RAM declarations
-IWRAM_DATA u8 gUnknown_03000F58[32];
+static IWRAM_DATA u8 sActiveList[32];
// Static ROM declarations
+extern u8 *gFieldEffectScriptPointers[];
+
// .rodata
+const u32 gNewGameBirchPic[] = INCBIN_U32("graphics/birch_speech/birch.4bpp");
+const u32 gUnusedBirchBeauty[] = INCBIN_U32("graphics/unused/intro_birch_beauty.4bpp");
+const u16 gNewGameBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal");
+const u32 gSpriteImage_855A970[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp");
+const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_04.gbapal");
+const u32 gSpriteImage_855A9B0[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp");
+const u32 gSpriteImage_855AA70[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp");
+const u32 gSpriteImage_855AB30[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp");
+const u8 gSpriteImage_855AD30[] = INCBIN_U8("graphics/misc/small_hof_monitor.4bpp");
+const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_05.gbapal");
+
+// Graphics for the lights streaking past your Pokemon when it uses a field move.
+const u32 gFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp");
+const u16 gFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal");
+const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin");
+
+// The following light streaks effect is used when the map is dark (e.g. a cave).
+const u32 gDarknessFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp");
+const u16 gDarknessFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal");
+const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin");
+
+const u16 gUnknown_0855B610[16] = INCBIN_U16("graphics/misc/spotlight.gbapal");
+const u8 gUnknown_0855B630[] = INCBIN_U8("graphics/misc/spotlight.4bpp");
+const u8 gUnknown_0855C170[] = INCBIN_U8("graphics/unknown/unknown_55C170.4bpp");
+const u8 gUnknown_0855C190[] = INCBIN_U8("graphics/unknown/unknown_55C190.4bpp");
+const u8 gUnknown_0855C1B0[] = INCBIN_U8("graphics/unknown/unknown_55C1B0.4bpp");
+const u8 gUnknown_0855C1D0[] = INCBIN_U8("graphics/unknown/unknown_55C1D0.4bpp");
+
+bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) = {
+ FieldEffectCmd_loadtiles,
+ FieldEffectCmd_loadfadedpal,
+ FieldEffectCmd_loadpal,
+ FieldEffectCmd_callnative,
+ FieldEffectCmd_end,
+ FieldEffectCmd_loadgfx_callnative,
+ FieldEffectCmd_loadtiles_callnative,
+ FieldEffectCmd_loadfadedpal_callnative,
+};
+
+const struct OamData gNewGameBirchOamAttributes = {.size = 3};
+const struct OamData gOamData_855C218 = {.size = 0};
+const struct OamData gOamData_855C220 = {.size = 1};
+
+const struct SpriteFrameImage gNewGameBirchPicTable[] = {
+ obj_frame_tiles(gNewGameBirchPic)
+};
+const struct SpritePalette gNewGameBirchObjectPaletteInfo = {.data = gNewGameBirchPalette, .tag = 0x1006};
+
+const union AnimCmd gNewGameBirchImageAnim[] = {
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gNewGameBirchImageAnimTable[] = {
+ gNewGameBirchImageAnim
+};
+
+const struct SpriteTemplate gNewGameBirchObjectTemplate = {
+ .tileTag = 0xffff,
+ .paletteTag = 4102,
+ .oam = &gNewGameBirchOamAttributes,
+ .anims = gNewGameBirchImageAnimTable,
+ .images = gNewGameBirchPicTable,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo4 = {.data = gFieldEffectObjectPalette4, .tag = 0x1007};
+const struct SpritePalette gFieldEffectObjectPaletteInfo5 = {.data = gFieldEffectObjectPalette5, .tag = 0x1010};
+const struct OamData gOamData_855C26C = {
+ .shape = 1,
+ .size = 2
+};
+
+const struct SpriteFrameImage gSpriteImageTable_855C274[] = {
+ obj_frame_tiles(gSpriteImage_855A970)
+};
+
+const struct SpriteFrameImage gSpriteImageTable_855C27C[] = {
+ obj_frame_tiles(gSpriteImage_855A9B0),
+ obj_frame_tiles(gSpriteImage_855AA70)
+};
+
+const struct SpriteFrameImage gSpriteImageTable_855C28C[] = {
+ obj_frame_tiles(gSpriteImage_855AB30)
+};
+
+const struct SpriteFrameImage gSpriteImageTable_855C294[] = {
+ {.data = gSpriteImage_855AD30, .size = 0x200} // the macro breaks down here
+};
+
+const struct Subsprite gSubspriteTable_855C29C[] = {
+ {.x = -12, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 0},
+ {.x = 4, .y = -8, .priority = 2, .tileOffset = 2, .shape = 0, .size = 0},
+ {.x = -12, .y = 0, .priority = 2, .tileOffset = 3, .shape = 1, .size = 0},
+ {.x = 4, .y = 0, .priority = 2, .tileOffset = 5, .shape = 0, .size = 0}
+};
+
+const struct SubspriteTable gUnknown_0855C2AC = subsprite_table(gSubspriteTable_855C29C);
+
+const struct Subsprite gSubspriteTable_855C2B4[] = {
+ {.x = -32, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 1},
+ {.x = 0, .y = -8, .priority = 2, .tileOffset = 4, .shape = 1, .size = 1},
+ {.x = -32, .y = 0, .priority = 2, .tileOffset = 8, .shape = 1, .size = 1},
+ {.x = 0, .y = 0, .priority = 2, .tileOffset = 12, .shape = 1, .size = 1}
+};
+
+const struct SubspriteTable gUnknown_0855C2C4 = subsprite_table(gSubspriteTable_855C2B4);
+
+const union AnimCmd gSpriteAnim_855C2CC[] = {
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 1),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd gSpriteAnim_855C2D4[] = {
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 16),
+ ANIMCMD_FRAME(.imageValue = 1, .duration = 16),
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 16),
+ ANIMCMD_FRAME(.imageValue = 1, .duration = 16),
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 16),
+ ANIMCMD_FRAME(.imageValue = 1, .duration = 16),
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 16),
+ ANIMCMD_FRAME(.imageValue = 1, .duration = 16),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_855C2F8[] = {
+ gSpriteAnim_855C2CC,
+ gSpriteAnim_855C2D4
+};
+
+const union AnimCmd *const gSpriteAnimTable_855C300[] = {
+ gSpriteAnim_855C2CC
+};
+
+const struct SpriteTemplate gSpriteTemplate_855C304 = {
+ .tileTag = 0xffff,
+ .paletteTag = 4103,
+ .oam = &gOamData_855C218,
+ .anims = gSpriteAnimTable_855C2F8,
+ .images = gSpriteImageTable_855C274,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_PokeballGlow
+};
+
+const struct SpriteTemplate gSpriteTemplate_855C31C = {
+ .tileTag = 0xffff,
+ .paletteTag = 4100,
+ .oam = &gOamData_855C220,
+ .anims = gSpriteAnimTable_855C2F8,
+ .images = gSpriteImageTable_855C27C,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_PokecenterMonitor
+};
+
+const struct SpriteTemplate gSpriteTemplate_855C334 = {
+ .tileTag = 0xffff,
+ .paletteTag = 4112,
+ .oam = &gOamData_855C220,
+ .anims = gSpriteAnimTable_855C300,
+ .images = gSpriteImageTable_855C28C,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_HallOfFameMonitor
+};
+
+const struct SpriteTemplate gSpriteTemplate_855C34C = {
+ .tileTag = 0xffff,
+ .paletteTag = 4112,
+ .oam = &gOamData_855C26C,
+ .anims = gSpriteAnimTable_855C300,
+ .images = gSpriteImageTable_855C294,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_HallOfFameMonitor
+};
+
+void (*const gUnknown_0855C364[])(struct Task *) = {
+ PokecenterHealEffect_0,
+ PokecenterHealEffect_1,
+ PokecenterHealEffect_2,
+ PokecenterHealEffect_3
+};
+
+void (*const gUnknown_0855C374[])(struct Task *) = {
+ HallOfFameRecordEffect_0,
+ HallOfFameRecordEffect_1,
+ HallOfFameRecordEffect_2,
+ HallOfFameRecordEffect_3
+};
+
+void (*const gUnknown_0855C384[])(struct Sprite *) = {
+ PokeballGlowEffect_0,
+ PokeballGlowEffect_1,
+ PokeballGlowEffect_2,
+ PokeballGlowEffect_3,
+ PokeballGlowEffect_4,
+ PokeballGlowEffect_5,
+ PokeballGlowEffect_6,
+ PokeballGlowEffect_7
+};
+
+const struct Coords16 gUnknown_0855C3A4[] = {
+ {.x = 0, .y = 0},
+ {.x = 6, .y = 0},
+ {.x = 0, .y = 4},
+ {.x = 6, .y = 4},
+ {.x = 0, .y = 8},
+ {.x = 6, .y = 8}
+};
+
+const u8 gUnknown_0855C3BC[] = {16, 12, 8, 0};
+const u8 gUnknown_0855C3C0[] = {16, 12, 8, 0};
+const u8 gUnknown_0855C3C4[] = { 0, 0, 0, 0};
+
+bool8 (*const gUnknown_0855C3C8[])(struct Task *) = {
+ sub_80B6BCC,
+ sub_80B6C74,
+ sub_80B6C90,
+ sub_80B6D04,
+ sub_80B6DBC,
+ sub_80B6DD8,
+ sub_80B6E18,
+};
+
+bool8 (*const gUnknown_0855C3E4[])(struct Task *) = {
+ sub_80B6EC0,
+ sub_80B6EE0,
+ sub_80B6F50,
+ sub_80B6F74,
+ sub_80B6F84,
+ sub_80B6FA8,
+};
+
+bool8 (*const gUnknown_0855C3FC[])(struct Task *) = {
+ sub_80B7114,
+ sub_80B7190,
+ sub_80B71D0,
+ sub_80B7230,
+ sub_80B7270,
+ sub_80B72D0,
+ sub_80B72F4,
+};
+
+bool8 (*const gUnknown_0855C418[])(struct Task *, struct EventObject *) = {
+ sub_80B73D0,
+ waterfall_1_do_anim_probably,
+ waterfall_2_wait_anim_finish_probably,
+ sub_80B7450,
+ sub_80B7478,
+};
+
+bool8 (*const gUnknown_0855C42C[])(struct Task *) = {
+ dive_1_lock,
+ dive_2_unknown,
+ dive_3_unknown,
+};
+
+bool8 (*const gUnknown_0855C438[])(struct Task *, struct EventObject *, struct Sprite *) = {
+ sub_80B764C,
+ sub_80B7684,
+ sub_80B76B8,
+ sub_80B7704,
+ sub_80B77F8,
+ sub_80B7814,
+};
+
+bool8 (*const gUnknown_0855C450[])(struct Task *, struct EventObject *, struct Sprite *) = {
+ sub_80B78EC,
+ sub_80B791C,
+ sub_80B7968,
+ sub_80B79BC,
+};
+
+bool8 (*const gUnknown_0855C460[])(struct Task *, struct EventObject *, struct Sprite *) = {
+ sub_80B7AE8,
+ sub_80B7B18,
+ sub_80B7B94,
+ sub_80B7BCC,
+ sub_80B7BF4,
+};
+
+void (*const gUnknown_0855C474[])(struct Task *) = {
+ sub_80B7D14,
+ sub_80B7D34,
+};
// .text
+
+u32 FieldEffectStart(u8 id)
+{
+ u8 *script;
+ u32 val;
+
+ FieldEffectActiveListAdd(id);
+
+ script = gFieldEffectScriptPointers[id];
+
+ while (gFieldEffectScriptFuncs[*script](&script, &val))
+ ;
+
+ return val;
+}
+
+bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val)
+{
+ (*script)++;
+ FieldEffectScript_LoadTiles(script);
+ return TRUE;
+}
+
+bool8 FieldEffectCmd_loadfadedpal(u8 **script, u32 *val)
+{
+ (*script)++;
+ FieldEffectScript_LoadFadedPalette(script);
+ return TRUE;
+}
+
+bool8 FieldEffectCmd_loadpal(u8 **script, u32 *val)
+{
+ (*script)++;
+ FieldEffectScript_LoadPalette(script);
+ return TRUE;
+}
+
+bool8 FieldEffectCmd_callnative(u8 **script, u32 *val)
+{
+ (*script)++;
+ FieldEffectScript_CallNative(script, val);
+ return TRUE;
+}
+
+bool8 FieldEffectCmd_end(u8 **script, u32 *val)
+{
+ return FALSE;
+}
+
+bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val)
+{
+ (*script)++;
+ FieldEffectScript_LoadTiles(script);
+ FieldEffectScript_LoadFadedPalette(script);
+ FieldEffectScript_CallNative(script, val);
+ return TRUE;
+}
+
+bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val)
+{
+ (*script)++;
+ FieldEffectScript_LoadTiles(script);
+ FieldEffectScript_CallNative(script, val);
+ return TRUE;
+}
+
+bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val)
+{
+ (*script)++;
+ FieldEffectScript_LoadFadedPalette(script);
+ FieldEffectScript_CallNative(script, val);
+ return TRUE;
+}
+
+u32 FieldEffectScript_ReadWord(u8 **script)
+{
+ return (*script)[0]
+ + ((*script)[1] << 8)
+ + ((*script)[2] << 16)
+ + ((*script)[3] << 24);
+}
+
+void FieldEffectScript_LoadTiles(u8 **script)
+{
+ struct SpriteSheet *sheet = (struct SpriteSheet *)FieldEffectScript_ReadWord(script);
+ if (GetSpriteTileStartByTag(sheet->tag) == 0xFFFF)
+ LoadSpriteSheet(sheet);
+ (*script) += 4;
+}
+
+void FieldEffectScript_LoadFadedPalette(u8 **script)
+{
+ struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script);
+ LoadSpritePalette(palette);
+ UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag));
+ (*script) += 4;
+}
+
+void FieldEffectScript_LoadPalette(u8 **script)
+{
+ struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script);
+ LoadSpritePalette(palette);
+ (*script) += 4;
+}
+
+void FieldEffectScript_CallNative(u8 **script, u32 *val)
+{
+ u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script);
+ *val = func();
+ (*script) += 4;
+}
+
+void FieldEffectFreeGraphicsResources(struct Sprite *sprite)
+{
+ u16 sheetTileStart = sprite->sheetTileStart;
+ u32 paletteNum = sprite->oam.paletteNum;
+ DestroySprite(sprite);
+ FieldEffectFreeTilesIfUnused(sheetTileStart);
+ FieldEffectFreePaletteIfUnused(paletteNum);
+}
+
+void FieldEffectStop(struct Sprite *sprite, u8 id)
+{
+ FieldEffectFreeGraphicsResources(sprite);
+ FieldEffectActiveListRemove(id);
+}
+
+void FieldEffectFreeTilesIfUnused(u16 tileStart)
+{
+ u8 i;
+ u16 tag = GetSpriteTileTagByTileStart(tileStart);
+
+ if (tag != 0xFFFF)
+ {
+ for (i = 0; i < MAX_SPRITES; i++)
+ if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart)
+ return;
+ FreeSpriteTilesByTag(tag);
+ }
+}
+
+void FieldEffectFreePaletteIfUnused(u8 paletteNum)
+{
+ u8 i;
+ u16 tag = GetSpritePaletteTagByPaletteNum(paletteNum);
+
+ if (tag != 0xFFFF)
+ {
+ for (i = 0; i < MAX_SPRITES; i++)
+ if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum)
+ return;
+ FreeSpritePaletteByTag(tag);
+ }
+}
+
+void FieldEffectActiveListClear(void)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
+ sActiveList[i] = 0xFF;
+}
+
+void FieldEffectActiveListAdd(u8 id)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
+ {
+ if (sActiveList[i] == 0xFF)
+ {
+ sActiveList[i] = id;
+ return;
+ }
+ }
+}
+
+void FieldEffectActiveListRemove(u8 id)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
+ {
+ if (sActiveList[i] == id)
+ {
+ sActiveList[i] = 0xFF;
+ return;
+ }
+ }
+}
+
+bool8 FieldEffectActiveListContains(u8 id)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
+ if (sActiveList[i] == id)
+ return TRUE;
+ return FALSE;
+}
+
+u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer)
+{
+ struct SpriteTemplate spriteTemplate;
+ LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer);
+ LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer);
+ spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag;
+ spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag;
+ spriteTemplate.oam = &gNewGameBirchOamAttributes;
+ spriteTemplate.anims = gDummySpriteAnimTable;
+ spriteTemplate.images = NULL;
+ spriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ spriteTemplate.callback = SpriteCallbackDummy;
+ return CreateSprite(&spriteTemplate, x, y, subpriority);
+}
+
+void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest)
+{
+ LZDecompressVram(gTrainerFrontPicTable[gender].data, dest);
+ LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20);
+}
+
+u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority)
+{
+ LoadSpritePalette(&gNewGameBirchObjectPaletteInfo);
+ return CreateSprite(&gNewGameBirchObjectTemplate, x, y, subpriority);
+}
+
+#ifdef NONMATCHING
+u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y)
+{
+ u16 spriteId = sub_818D7D8(species, 0, 0x8000, 1, x, y, 0, gMonPaletteTable[species].tag);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10);
+ if (spriteId == 0xFFFF)
+ return 0x40;
+
+ return spriteId;
+}
+#else
+NAKED
+u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y)
+{
+ asm_unified("push {r4,r5,lr}\n\
+ sub sp, 0x10\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r3, 0x80\n\
+ lsls r3, 8\n\
+ lsls r1, 16\n\
+ asrs r1, 16\n\
+ str r1, [sp]\n\
+ lsls r2, 16\n\
+ asrs r2, 16\n\
+ str r2, [sp, 0x4]\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x8]\n\
+ ldr r1, =gMonPaletteTable\n\
+ lsls r4, r0, 3\n\
+ adds r4, r1\n\
+ ldrh r1, [r4, 0x4]\n\
+ str r1, [sp, 0xC]\n\
+ movs r1, 0\n\
+ adds r2, r3, 0\n\
+ movs r3, 0x1\n\
+ bl sub_818D7D8\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ ldrh r0, [r4, 0x4]\n\
+ bl IndexOfSpritePaletteTag\n\
+ adds r0, 0x10\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ bl PreservePaletteInWeather\n\
+ ldr r0, =0x0000ffff\n\
+ cmp r5, r0\n\
+ beq _080B5FDC\n\
+ lsls r0, r5, 24\n\
+ lsrs r0, 24\n\
+ b _080B5FDE\n\
+ .pool\n\
+_080B5FDC:\n\
+ movs r0, 0x40\n\
+_080B5FDE:\n\
+ add sp, 0x10\n\
+ pop {r4,r5}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#endif //NONMATCHING
+
+u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority)
+{
+ const struct CompressedSpritePalette *spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g);
+ u16 spriteId = sub_818D7D8(species, d, g, 1, x, y, 0, spritePalette->tag);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);
+ if (spriteId == 0xFFFF)
+ return 0x40;
+
+ return spriteId;
+}
+
+void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId)
+{
+ ResetPreservedPalettesInWeather();
+ if (sprite->oam.affineMode != 0)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ }
+ sub_818D820(spriteId);
+}
+
+#ifdef NONMATCHING
+void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
+{
+ int curRed;
+ int curGreen;
+ int curBlue;
+
+ curRed = gPlttBufferUnfaded[i] & 0x1f;
+ curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5;
+ curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10;
+ curRed += (((0x1f - curRed) * r) >> 4);
+ curGreen += (((0x1f - curGreen) * g) >> 4);
+ curBlue += (((0x1f - curBlue) * b) >> 4);
+ gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue);
+}
+
+void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
+{
+ int curRed;
+ int curGreen;
+ int curBlue;
+
+ curRed = gPlttBufferUnfaded[i] & 0x1f;
+ curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5;
+ curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10;
+ curRed -= ((curRed * r) >> 4);
+ curGreen -= ((curGreen * g) >> 4);
+ curBlue -= ((curBlue * b) >> 4);
+ gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue);
+}
+#else
+NAKED
+void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
+{
+ asm(".syntax unified\n"
+ "\tpush {r4-r7,lr}\n"
+ "\tmov r7, r9\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6,r7}\n"
+ "\tlsls r0, 16\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r1, 24\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r3, 24\n"
+ "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n"
+ "\tlsrs r0, 15\n"
+ "\tadds r4, r0, r4\n"
+ "\tldrh r4, [r4]\n"
+ "\tmovs r5, 0x1F\n"
+ "\tmov r9, r5\n"
+ "\tmov r8, r4\n"
+ "\tmov r6, r8\n"
+ "\tands r6, r5\n"
+ "\tmov r8, r6\n"
+ "\tmovs r6, 0xF8\n"
+ "\tlsls r6, 2\n"
+ "\tands r6, r4\n"
+ "\tlsrs r6, 5\n"
+ "\tmovs r5, 0xF8\n"
+ "\tlsls r5, 7\n"
+ "\tands r4, r5\n"
+ "\tlsrs r4, 10\n"
+ "\tmov r7, r9\n"
+ "\tmov r5, r8\n"
+ "\tsubs r7, r5\n"
+ "\tmov r12, r7\n"
+ "\tmov r7, r12\n"
+ "\tmuls r7, r1\n"
+ "\tadds r1, r7, 0\n"
+ "\tasrs r1, 4\n"
+ "\tadd r8, r1\n"
+ "\tmov r5, r9\n"
+ "\tsubs r1, r5, r6\n"
+ "\tmuls r1, r2\n"
+ "\tasrs r1, 4\n"
+ "\tadds r6, r1\n"
+ "\tsubs r5, r4\n"
+ "\tmov r9, r5\n"
+ "\tmov r1, r9\n"
+ "\tmuls r1, r3\n"
+ "\tasrs r1, 4\n"
+ "\tadds r4, r1\n"
+ "\tmov r7, r8\n"
+ "\tlsls r7, 16\n"
+ "\tlsls r6, 21\n"
+ "\torrs r6, r7\n"
+ "\tlsls r4, 26\n"
+ "\torrs r4, r6\n"
+ "\tlsrs r4, 16\n"
+ "\tldr r1, _08085D04 @ =gPlttBufferFaded\n"
+ "\tadds r0, r1\n"
+ "\tstrh r4, [r0]\n"
+ "\tpop {r3,r4}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_08085D00: .4byte gPlttBufferUnfaded\n"
+ "_08085D04: .4byte gPlttBufferFaded\n"
+ ".syntax divided");
+}
+
+NAKED
+void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
+{
+ asm(".syntax unified\n"
+ "\tpush {r4-r6,lr}\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6}\n"
+ "\tlsls r0, 16\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r1, 24\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r3, 24\n"
+ "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n"
+ "\tlsrs r0, 15\n"
+ "\tadds r4, r0, r4\n"
+ "\tldrh r4, [r4]\n"
+ "\tmovs r5, 0x1F\n"
+ "\tmov r8, r5\n"
+ "\tmov r6, r8\n"
+ "\tands r6, r4\n"
+ "\tmov r8, r6\n"
+ "\tmovs r5, 0xF8\n"
+ "\tlsls r5, 2\n"
+ "\tands r5, r4\n"
+ "\tlsrs r5, 5\n"
+ "\tmovs r6, 0xF8\n"
+ "\tlsls r6, 7\n"
+ "\tands r4, r6\n"
+ "\tlsrs r4, 10\n"
+ "\tmov r6, r8\n"
+ "\tmuls r6, r1\n"
+ "\tadds r1, r6, 0\n"
+ "\tasrs r1, 4\n"
+ "\tmov r6, r8\n"
+ "\tsubs r6, r1\n"
+ "\tadds r1, r5, 0\n"
+ "\tmuls r1, r2\n"
+ "\tasrs r1, 4\n"
+ "\tsubs r5, r1\n"
+ "\tadds r1, r4, 0\n"
+ "\tmuls r1, r3\n"
+ "\tasrs r1, 4\n"
+ "\tsubs r4, r1\n"
+ "\tlsls r6, 16\n"
+ "\tlsls r5, 21\n"
+ "\torrs r5, r6\n"
+ "\tlsls r4, 26\n"
+ "\torrs r4, r5\n"
+ "\tlsrs r4, 16\n"
+ "\tldr r1, _08085D7C @ =gPlttBufferFaded\n"
+ "\tadds r0, r1\n"
+ "\tstrh r4, [r0]\n"
+ "\tpop {r3}\n"
+ "\tmov r8, r3\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_08085D78: .4byte gPlttBufferUnfaded\n"
+ "_08085D7C: .4byte gPlttBufferFaded\n"
+ ".syntax divided");
+}
+#endif
+
+void Task_PokecenterHeal(u8 taskId);
+u8 CreatePokeballGlowSprite(s16, s16, s16, u16);
+u8 PokecenterHealEffectHelper(s16, s16);
+
+bool8 FldEff_PokecenterHeal(void)
+{
+ u8 nPokemon;
+ struct Task *task;
+
+ nPokemon = CalculatePlayerPartyCount();
+ task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)];
+ task->data[1] = nPokemon;
+ task->data[2] = 0x5d;
+ task->data[3] = 0x24;
+ task->data[4] = 0x7c;
+ task->data[5] = 0x18;
+ return FALSE;
+}
+
+void Task_PokecenterHeal(u8 taskId)
+{
+ struct Task *task;
+ task = &gTasks[taskId];
+ gUnknown_0855C364[task->data[0]](task);
+}
+
+void PokecenterHealEffect_0(struct Task *task)
+{
+ task->data[0]++;
+ task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1);
+ task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]);
+}
+
+void PokecenterHealEffect_1(struct Task *task)
+{
+ if (gSprites[task->data[6]].data[0] > 1)
+ {
+ gSprites[task->data[7]].data[0]++;
+ task->data[0]++;
+ }
+}
+
+void PokecenterHealEffect_2(struct Task *task)
+{
+ if (gSprites[task->data[6]].data[0] > 4)
+ {
+ task->data[0]++;
+ }
+}
+
+void PokecenterHealEffect_3(struct Task *task)
+{
+ if (gSprites[task->data[6]].data[0] > 6)
+ {
+ DestroySprite(&gSprites[task->data[6]]);
+ FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL);
+ DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal));
+ }
+}
+
+void Task_HallOfFameRecord(u8 taskId);
+void HallOfFameRecordEffectHelper(s16, s16, s16, u8);
+
+bool8 FldEff_HallOfFameRecord(void)
+{
+ u8 nPokemon;
+ struct Task *task;
+
+ nPokemon = CalculatePlayerPartyCount();
+ task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)];
+ task->data[1] = nPokemon;
+ task->data[2] = 0x75;
+ task->data[3] = 0x34;
+ return FALSE;
+}
+
+void Task_HallOfFameRecord(u8 taskId)
+{
+ struct Task *task;
+ task = &gTasks[taskId];
+ gUnknown_0855C374[task->data[0]](task);
+}
+
+void HallOfFameRecordEffect_0(struct Task *task)
+{
+ u8 taskId;
+ task->data[0]++;
+ task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0);
+ taskId = FindTaskIdByFunc(Task_HallOfFameRecord);
+ HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0);
+ HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1);
+ HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1);
+ HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1);
+ HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1);
+}
+
+void HallOfFameRecordEffect_1(struct Task *task)
+{
+ if (gSprites[task->data[6]].data[0] > 1)
+ {
+ task->data[15]++; // was this ever initialized? is this ever used?
+ task->data[0]++;
+ }
+}
+
+void HallOfFameRecordEffect_2(struct Task *task)
+{
+ if (gSprites[task->data[6]].data[0] > 4)
+ {
+ task->data[0]++;
+ }
+}
+
+void HallOfFameRecordEffect_3(struct Task *task)
+{
+ if (gSprites[task->data[6]].data[0] > 6)
+ {
+ DestroySprite(&gSprites[task->data[6]]);
+ FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD);
+ DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord));
+ }
+}
+
+void SpriteCB_PokeballGlowEffect(struct Sprite *);
+
+u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5)
+{
+ u8 spriteId;
+ struct Sprite *sprite;
+ spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect);
+ sprite = &gSprites[spriteId];
+ sprite->pos2.x = x;
+ sprite->pos2.y = y;
+ sprite->data[5] = data5;
+ sprite->data[6] = data6;
+ sprite->data[7] = spriteId;
+ return spriteId;
+}
+
+void SpriteCB_PokeballGlowEffect(struct Sprite *sprite)
+{
+ gUnknown_0855C384[sprite->data[0]](sprite);
+}
+
+void PokeballGlowEffect_0(struct Sprite *sprite)
+{
+ u8 endSpriteId;
+ if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
+ {
+ sprite->data[1] = 25;
+ endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_855C304, gUnknown_0855C3A4[sprite->data[2]].x + sprite->pos2.x, gUnknown_0855C3A4[sprite->data[2]].y + sprite->pos2.y, 0);
+ gSprites[endSpriteId].oam.priority = 2;
+ gSprites[endSpriteId].data[0] = sprite->data[7];
+ sprite->data[2]++;
+ sprite->data[6]--;
+ PlaySE(SE_BOWA);
+ }
+ if (sprite->data[6] == 0)
+ {
+ sprite->data[1] = 32;
+ sprite->data[0]++;
+ }
+}
+
+void PokeballGlowEffect_1(struct Sprite *sprite)
+{
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ if (sprite->data[5])
+ {
+ PlayFanfare(MUS_ME_ASA);
+ }
+ }
+}
+
+void PokeballGlowEffect_2(struct Sprite *sprite)
+{
+ u8 phase;
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[1] = 8;
+ sprite->data[2]++;
+ sprite->data[2] &= 3;
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[3]++;
+ }
+ }
+ phase = (sprite->data[2] + 3) & 3;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ phase = (sprite->data[2] + 2) & 3;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ phase = (sprite->data[2] + 1) & 3;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ phase = sprite->data[2];
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ if (sprite->data[3] > 2)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ }
+}
+
+void PokeballGlowEffect_3(struct Sprite *sprite)
+{
+ u8 phase;
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[1] = 8;
+ sprite->data[2]++;
+ sprite->data[2] &= 3;
+ if (sprite->data[2] == 3)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 30;
+ }
+ }
+ phase = sprite->data[2];
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
+}
+
+void PokeballGlowEffect_4(struct Sprite *sprite)
+{
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->data[0]++;
+ }
+}
+
+void PokeballGlowEffect_5(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+}
+
+void PokeballGlowEffect_6(struct Sprite *sprite)
+{
+ if (sprite->data[5] == 0 || IsFanfareTaskInactive())
+ {
+ sprite->data[0]++;
+ }
+}
+
+void PokeballGlowEffect_7(struct Sprite *sprite)
+{
+}
+
+void SpriteCB_PokeballGlow(struct Sprite *sprite)
+{
+ if (gSprites[sprite->data[0]].data[0] > 4)
+ {
+ FieldEffectFreeGraphicsResources(sprite);
+ }
+}
+
+u8 PokecenterHealEffectHelper(s16 x, s16 y)
+{
+ u8 spriteIdAtEnd;
+ struct Sprite *sprite;
+ spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C31C, x, y, 0);
+ sprite = &gSprites[spriteIdAtEnd];
+ sprite->oam.priority = 2;
+ sprite->invisible = 1;
+ SetSubspriteTables(sprite, &gUnknown_0855C2AC);
+ return spriteIdAtEnd;
+}
+
+void SpriteCB_PokecenterMonitor(struct Sprite *sprite)
+{
+ if (sprite->data[0] != 0)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible = 0;
+ StartSpriteAnim(sprite, 1);
+ }
+ if (sprite->animEnded)
+ {
+ FieldEffectFreeGraphicsResources(sprite);
+ }
+}
+
+void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3)
+{
+ u8 spriteIdAtEnd;
+ if (!a3)
+ {
+ spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C334, a1, a2, 0);
+ SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0855C2C4);
+ } else
+ {
+ spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C34C, a1, a2, 0);
+ }
+ gSprites[spriteIdAtEnd].invisible = 1;
+ gSprites[spriteIdAtEnd].data[0] = a0;
+}
+
+void SpriteCB_HallOfFameMonitor(struct Sprite *sprite)
+{
+ if (gTasks[sprite->data[0]].data[15])
+ {
+ if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
+ {
+ sprite->data[1] = 16;
+ sprite->invisible ^= 1;
+ }
+ sprite->data[2]++;
+ }
+ if (sprite->data[2] > 127)
+ {
+ FieldEffectFreeGraphicsResources(sprite);
+ }
+}
+
+void mapldr_080842E8(void);
+void mapldr_08084390(void);
+void task00_8084310(u8);
+void c3_080843F8(u8);
+
+void sub_80B69DC(void)
+{
+ SetMainCallback2(CB2_ReturnToField);
+ gFieldCallback = mapldr_080842E8;
+}
+
+void mapldr_080842E8(void)
+{
+ pal_fill_black();
+ CreateTask(task00_8084310, 0);
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ gFieldCallback = NULL;
+}
+
+void task00_8084310(u8 taskId)
+{
+ struct Task *task;
+ task = &gTasks[taskId];
+ if (!task->data[0])
+ {
+ if (!IsWeatherNotFadingIn())
+ {
+ return;
+ }
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ if ((int)gFieldEffectArguments[0] > 5)
+ {
+ gFieldEffectArguments[0] = 0;
+ }
+ FieldEffectStart(FLDEFF_USE_FLY);
+ task->data[0]++;
+ }
+ if (!FieldEffectActiveListContains(FLDEFF_USE_FLY))
+ {
+ Overworld_ResetStateAfterFly();
+ warp_in();
+ SetMainCallback2(CB2_LoadMap);
+ gFieldCallback = mapldr_08084390;
+ DestroyTask(taskId);
+ }
+}
+
+void mapldr_08084390(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_black();
+ CreateTask(c3_080843F8, 0);
+ gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1;
+ if (gPlayerAvatar.flags & 0x08)
+ {
+ EventObjectTurn(&gEventObjects[gPlayerAvatar.eventObjectId], DIR_WEST);
+ }
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ gFieldCallback = NULL;
+}
+
+void c3_080843F8(u8 taskId)
+{
+ struct Task *task;
+ task = &gTasks[taskId];
+ if (task->data[0] == 0)
+ {
+ if (gPaletteFade.active)
+ {
+ return;
+ }
+ FieldEffectStart(FLDEFF_FLY_IN);
+ task->data[0]++;
+ }
+ if (!FieldEffectActiveListContains(FLDEFF_FLY_IN))
+ {
+ ScriptContext2_Disable();
+ UnfreezeEventObjects();
+ DestroyTask(taskId);
+ }
+}
+
+extern void pal_fill_for_maplights(void);
+void sub_80B6B94(u8);
+extern void CameraObjectReset2(void);
+extern void CameraObjectReset1(void);
+
+void sub_80B6B68(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ CreateTask(sub_80B6B94, 0);
+ gFieldCallback = NULL;
+}
+
+void sub_80B6B94(u8 taskId)
+{
+ struct Task *task;
+ task = &gTasks[taskId];
+ while (gUnknown_0855C3C8[task->data[0]](task)); // return code signifies whether to continue blocking here
+}
+
+bool8 sub_80B6BCC(struct Task *task) // gUnknown_0855C3C8[0]
+{
+ struct EventObject *playerObject;
+ struct Sprite *playerSprite;
+ playerObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ playerSprite = &gSprites[gPlayerAvatar.spriteId];
+ CameraObjectReset2();
+ gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1;
+ gPlayerAvatar.preventStep = TRUE;
+ EventObjectSetHeldMovement(playerObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection()));
+ task->data[4] = playerSprite->subspriteMode;
+ playerObject->fixedPriority = 1;
+ playerSprite->oam.priority = 1;
+ playerSprite->subspriteMode = 2;
+ task->data[0]++;
+ return TRUE;
+}
+
+bool8 sub_80B6C74(struct Task *task) // gUnknown_0855C3C8[1]
+{
+ if (IsWeatherNotFadingIn())
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B6C90(struct Task *task) // gUnknown_0855C3C8[2]
+{
+ struct Sprite *sprite;
+ s16 centerToCornerVecY;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
+ sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY);
+ task->data[1] = 1;
+ task->data[2] = 0;
+ gEventObjects[gPlayerAvatar.eventObjectId].invisible = 0;
+ PlaySE(SE_RU_HYUU);
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B6D04(struct Task *task)
+{
+ struct EventObject *eventObject;
+ struct Sprite *sprite;
+
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.y += task->data[1];
+ if (task->data[1] < 8)
+ {
+ task->data[2] += task->data[1];
+ if (task->data[2] & 0xf)
+ {
+ task->data[1] <<= 1;
+ }
+ }
+ if (task->data[3] == 0 && sprite->pos2.y >= -16)
+ {
+ task->data[3]++;
+ eventObject->fixedPriority = 0;
+ sprite->subspriteMode = task->data[4];
+ eventObject->triggerGroundEffectsOnMove = 1;
+ }
+ if (sprite->pos2.y >= 0)
+ {
+ PlaySE(SE_W070);
+ eventObject->triggerGroundEffectsOnStop = 1;
+ eventObject->landingJump = 1;
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B6DBC(struct Task *task)
+{
+ task->data[0]++;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ SetCameraPanningCallback(NULL);
+ return TRUE;
+}
+
+bool8 sub_80B6DD8(struct Task *task)
+{
+ SetCameraPanning(0, task->data[1]);
+ task->data[1] = -task->data[1];
+ task->data[2]++;
+ if ((task->data[2] & 3) == 0)
+ {
+ task->data[1] >>= 1;
+ }
+ if (task->data[1] == 0)
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B6E18(struct Task *task)
+{
+ gPlayerAvatar.preventStep = FALSE;
+ ScriptContext2_Disable();
+ CameraObjectReset1();
+ UnfreezeEventObjects();
+ InstallCameraPanAheadCallback();
+ DestroyTask(FindTaskIdByFunc(sub_80B6B94));
+ return FALSE;
+}
+
+void sub_80B6E88(u8);
+extern void sub_80E1558(u8);
+extern void sub_80AF0B4(void);
+
+void sub_80B6FB8(struct Task *);
+void sub_80B7004(struct Task *);
+void sub_80B7050(void);
+void sub_80B7060(void);
+bool8 sub_80859A0(void);
+void sub_80B70B4(void);
+void sub_80E1570(void);
+void sub_80B70DC(u8);
+
+void sub_80B6E4C(u8 a0, u8 priority)
+{
+ u8 taskId;
+ taskId = CreateTask(sub_80B6E88, priority);
+ gTasks[taskId].data[1] = 0;
+ if (a0 == 0x6a)
+ {
+ gTasks[taskId].data[1] = 1;
+ }
+}
+
+void sub_80B6E88(u8 taskId)
+{
+ struct Task *task;
+ task = &gTasks[taskId];
+ while (gUnknown_0855C3E4[task->data[0]](task));
+}
+
+bool8 sub_80B6EC0(struct Task *task)
+{
+ FreezeEventObjects();
+ CameraObjectReset2();
+ sub_80E1558(task->data[1]);
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B6EE0(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection()));
+ task->data[0]++;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ if ((u8)task->data[1] == 0)
+ {
+ task->data[0] = 4;
+ }
+ PlaySE(SE_ESUKA);
+ }
+ return FALSE;
+}
+
+bool8 sub_80B6F50(struct Task *task)
+{
+ sub_80B6FB8(task);
+ if (task->data[2] > 3)
+ {
+ sub_80B7050();
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B6F74(struct Task *task)
+{
+ sub_80B6FB8(task);
+ sub_80B7060();
+ return FALSE;
+}
+
+bool8 sub_80B6F84(struct Task *task)
+{
+ sub_80B7004(task);
+ if (task->data[2] > 3)
+ {
+ sub_80B7050();
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B6FA8(struct Task *task)
+{
+ sub_80B7004(task);
+ sub_80B7060();
+ return FALSE;
+}
+
+void sub_80B6FB8(struct Task *task)
+{
+ struct Sprite *sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x84, task->data[2]);
+ sprite->pos2.y = Sin(0x94, task->data[2]);
+ task->data[3]++;
+ if (task->data[3] & 1)
+ {
+ task->data[2]++;
+ }
+}
+
+void sub_80B7004(struct Task *task)
+{
+ struct Sprite *sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x7c, task->data[2]);
+ sprite->pos2.y = Sin(0x76, task->data[2]);
+ task->data[3]++;
+ if (task->data[3] & 1)
+ {
+ task->data[2]++;
+ }
+}
+
+void sub_80B7050(void)
+{
+ music_something();
+ sub_80AF0B4();
+}
+
+void sub_80B7060(void)
+{
+ if (!gPaletteFade.active && sub_80859A0() == TRUE)
+ {
+ sub_80E1570();
+ warp_in();
+ gFieldCallback = sub_80B70B4;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(sub_80B6E88));
+ }
+}
+
+void sub_80B70B4(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ ScriptContext2_Enable();
+ CreateTask(sub_80B70DC, 0);
+ gFieldCallback = NULL;
+}
+
+void sub_80B70DC(u8 taskId)
+{
+ struct Task *task;
+ task = &gTasks[taskId];
+ while (gUnknown_0855C3FC[task->data[0]](task));
+}
+
+bool8 sub_80B7114(struct Task *task)
+{
+ struct EventObject *eventObject;
+ s16 x;
+ s16 y;
+ u8 behavior;
+ CameraObjectReset2();
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(DIR_EAST));
+ PlayerGetDestCoords(&x, &y);
+ behavior = MapGridGetMetatileBehaviorAt(x, y);
+ task->data[0]++;
+ task->data[1] = 16;
+ if (behavior == 0x6b)
+ {
+ behavior = 1;
+ task->data[0] = 3;
+ } else
+ {
+ behavior = 0;
+ }
+ sub_80E1558(behavior);
+ return TRUE;
+}
+
+bool8 sub_80B7190(struct Task *task)
+{
+ struct Sprite *sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x84, task->data[1]);
+ sprite->pos2.y = Sin(0x94, task->data[1]);
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B71D0(struct Task *task)
+{
+ struct Sprite *sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x84, task->data[1]);
+ sprite->pos2.y = Sin(0x94, task->data[1]);
+ task->data[2]++;
+ if (task->data[2] & 1)
+ {
+ task->data[1]--;
+ }
+ if (task->data[1] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ task->data[0] = 5;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B7230(struct Task *task)
+{
+ struct Sprite *sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x7c, task->data[1]);
+ sprite->pos2.y = Sin(0x76, task->data[1]);
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B7270(struct Task *task)
+{
+ struct Sprite *sprite;
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.x = Cos(0x7c, task->data[1]);
+ sprite->pos2.y = Sin(0x76, task->data[1]);
+ task->data[2]++;
+ if (task->data[2] & 1)
+ {
+ task->data[1]--;
+ }
+ if (task->data[1] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+extern bool8 sub_80E1584(void);
+
+bool8 sub_80B72D0(struct Task *task)
+{
+ if (sub_80E1584())
+ {
+ return FALSE;
+ }
+ sub_80E1570();
+ task->data[0]++;
+ return TRUE;
+}
+
+bool8 sub_80B72F4(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ CameraObjectReset1();
+ ScriptContext2_Disable();
+ EventObjectSetHeldMovement(eventObject, GetWalkNormalMovementAction(DIR_EAST));
+ DestroyTask(FindTaskIdByFunc(sub_80B70DC));
+ }
+ return FALSE;
+}
+
+void sub_80B7384(u8);
+
+bool8 FldEff_UseWaterfall(void)
+{
+ u8 taskId;
+ taskId = CreateTask(sub_80B7384, 0xff);
+ gTasks[taskId].data[1] = gFieldEffectArguments[0];
+ sub_80B7384(taskId);
+ return FALSE;
+}
+
+void sub_80B7384(u8 taskId)
+{
+ while (gUnknown_0855C418[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId]));
+}
+
+bool8 sub_80B73D0(struct Task *task, struct EventObject *eventObject)
+{
+ ScriptContext2_Enable();
+ gPlayerAvatar.preventStep = TRUE;
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 waterfall_1_do_anim_probably(struct Task *task, struct EventObject *eventObject)
+{
+ ScriptContext2_Enable();
+ if (!EventObjectIsMovementOverridden(eventObject))
+ {
+ EventObjectClearHeldMovementIfFinished(eventObject);
+ gFieldEffectArguments[0] = task->data[1];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct EventObject *eventObject)
+{
+ if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ return FALSE;
+ }
+ task->data[0]++;
+ return TRUE;
+}
+
+bool8 sub_80B7450(struct Task *task, struct EventObject *eventObject)
+{
+ EventObjectSetHeldMovement(eventObject, GetWalkSlowMovementAction(DIR_NORTH));
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B7478(struct Task *task, struct EventObject *eventObject)
+{
+ if (!EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ return FALSE;
+ }
+ if (MetatileBehavior_IsWaterfall(eventObject->currentMetatileBehavior))
+ {
+ task->data[0] = 3;
+ return TRUE;
+ }
+ ScriptContext2_Disable();
+ gPlayerAvatar.preventStep = FALSE;
+ DestroyTask(FindTaskIdByFunc(sub_80B7384));
+ FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL);
+ return FALSE;
+}
+
+void Task_Dive(u8);
+extern int dive_warp(struct MapPosition *, u16);
+
+bool8 FldEff_UseDive(void)
+{
+ u8 taskId;
+ taskId = CreateTask(Task_Dive, 0xff);
+ gTasks[taskId].data[15] = gFieldEffectArguments[0];
+ gTasks[taskId].data[14] = gFieldEffectArguments[1];
+ Task_Dive(taskId);
+ return FALSE;
+}
+
+void Task_Dive(u8 taskId)
+{
+ while (gUnknown_0855C42C[gTasks[taskId].data[0]](&gTasks[taskId]));
+}
+
+bool8 dive_1_lock(struct Task *task)
+{
+ gPlayerAvatar.preventStep = TRUE;
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 dive_2_unknown(struct Task *task)
+{
+ ScriptContext2_Enable();
+ gFieldEffectArguments[0] = task->data[15];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 dive_3_unknown(struct Task *task)
+{
+ struct MapPosition mapPosition;
+ PlayerGetDestCoords(&mapPosition.x, &mapPosition.y);
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ dive_warp(&mapPosition, gEventObjects[gPlayerAvatar.eventObjectId].currentMetatileBehavior);
+ DestroyTask(FindTaskIdByFunc(Task_Dive));
+ FieldEffectActiveListRemove(FLDEFF_USE_DIVE);
+ }
+ return FALSE;
+}
+
+void sub_80B75F0(u8);
+void mapldr_080851BC(void);
+
+void sub_80B75D8(u8 priority)
+{
+ CreateTask(sub_80B75F0, priority);
+}
+
+void sub_80B75F0(u8 taskId)
+{
+ while (gUnknown_0855C438[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId], &gSprites[gPlayerAvatar.spriteId]));
+}
+
+bool8 sub_80B764C(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FreezeEventObjects();
+ CameraObjectReset2();
+ SetCameraPanningCallback(NULL);
+ gPlayerAvatar.preventStep = TRUE;
+ eventObject->fixedPriority = 1;
+ task->data[1] = 1;
+ task->data[0]++;
+ return TRUE;
+}
+
+bool8 sub_80B7684(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ SetCameraPanning(0, task->data[1]);
+ task->data[1] = -task->data[1];
+ task->data[2]++;
+ if (task->data[2] > 7)
+ {
+ task->data[2] = 0;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B76B8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite->pos2.y = 0;
+ task->data[3] = 1;
+ gFieldEffectArguments[0] = eventObject->currentCoords.x;
+ gFieldEffectArguments[1] = eventObject->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP);
+ PlaySE(SE_W153);
+ task->data[0]++;
+ return TRUE;
+}
+
+bool8 sub_80B7704(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ s16 centerToCornerVecY;
+ SetCameraPanning(0, task->data[1]);
+ if (task->data[1] = -task->data[1], ++task->data[2] <= 17)
+ {
+ if (!(task->data[2] & 1) && (task->data[1] <= 3))
+ {
+ task->data[1] <<= 1;
+ }
+ } else if (!(task->data[2] & 4) && (task->data[1] > 0))
+ {
+ task->data[1] >>= 1;
+ }
+ if (task->data[2] > 6)
+ {
+ centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
+ if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY))
+ {
+ sprite->pos2.y -= task->data[3];
+ if (task->data[3] <= 7)
+ {
+ task->data[3]++;
+ }
+ } else
+ {
+ task->data[4] = 1;
+ }
+ }
+ if (task->data[5] == 0 && sprite->pos2.y < -0x10)
+ {
+ task->data[5]++;
+ eventObject->fixedPriority = 1;
+ sprite->oam.priority = 1;
+ sprite->subspriteMode = 2;
+ }
+ if (task->data[1] == 0 && task->data[4] != 0)
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B77F8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ music_something();
+ sub_80AF0B4();
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B7814(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (!gPaletteFade.active && sub_80859A0() == TRUE)
+ {
+ warp_in();
+ gFieldCallback = mapldr_080851BC;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(sub_80B75F0));
+ }
+ return FALSE;
+}
+
+void sub_80B7890(u8);
+
+void mapldr_080851BC(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ ScriptContext2_Enable();
+ gFieldCallback = NULL;
+ CreateTask(sub_80B7890, 0);
+}
+
+void sub_80B7890(u8 taskId)
+{
+ while (gUnknown_0855C450[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId], &gSprites[gPlayerAvatar.spriteId]));
+}
+
+bool8 sub_80B78EC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ CameraObjectReset2();
+ FreezeEventObjects();
+ gPlayerAvatar.preventStep = TRUE;
+ eventObject->invisible = 1;
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B791C(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (IsWeatherNotFadingIn())
+ {
+ gFieldEffectArguments[0] = eventObject->currentCoords.x;
+ gFieldEffectArguments[1] = eventObject->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B7968(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ sprite = &gSprites[task->data[1]];
+ if (sprite->animCmdIndex > 1)
+ {
+ task->data[0]++;
+ eventObject->invisible = 0;
+ CameraObjectReset1();
+ PlaySE(SE_W091);
+ EventObjectSetHeldMovement(eventObject, GetJumpMovementAction(DIR_EAST));
+ }
+ return FALSE;
+}
+
+bool8 sub_80B79BC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ gPlayerAvatar.preventStep = FALSE;
+ ScriptContext2_Disable();
+ UnfreezeEventObjects();
+ DestroyTask(FindTaskIdByFunc(sub_80B7890));
+ }
+ return FALSE;
+}
+
+extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36];
+
+u8 FldEff_LavaridgeGymWarp(void)
+{
+ u8 spriteId;
+ sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
+ gSprites[spriteId].coordOffsetEnabled = 1;
+ return spriteId;
+}
+
+void sub_80B7A58(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP);
+ }
+}
+
+void sub_80B7A8C(u8);
+
+void sub_80B7A74(u8 priority)
+{
+ CreateTask(sub_80B7A8C, priority);
+}
+
+void sub_80B7A8C(u8 taskId)
+{
+ while(gUnknown_0855C460[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId], &gSprites[gPlayerAvatar.spriteId]));
+}
+
+bool8 sub_80B7AE8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ FreezeEventObjects();
+ CameraObjectReset2();
+ gPlayerAvatar.preventStep = TRUE;
+ eventObject->fixedPriority = 1;
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_80B7B18(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ if (task->data[1] > 3)
+ {
+ gFieldEffectArguments[0] = eventObject->currentCoords.x;
+ gFieldEffectArguments[1] = eventObject->currentCoords.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
+ task->data[0]++;
+ } else
+ {
+ task->data[1]++;
+ EventObjectSetHeldMovement(eventObject, GetWalkInPlaceFastestMovementAction(eventObject->facingDirection));
+ PlaySE(SE_FU_ZUZUZU);
+ }
+ }
+ return FALSE;
+}
+
+bool8 sub_80B7B94(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (gSprites[task->data[1]].animCmdIndex == 2)
+ {
+ eventObject->invisible = 1;
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+bool8 sub_80B7BCC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
+ {
+ music_something();
+ sub_80AF0B4();
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+void sub_80B7CE4(u8);
+void mapldr_080859D4(void);
+
+bool8 sub_80B7BF4(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+{
+ if (!gPaletteFade.active && sub_80859A0() == TRUE)
+ {
+ warp_in();
+ gFieldCallback = sub_80B6B68;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(sub_80B7A8C));
+ }
+ return FALSE;
+}
+
+u8 FldEff_PopOutOfAsh(void)
+{
+ u8 spriteId;
+ sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
+ gSprites[spriteId].coordOffsetEnabled = 1;
+ return spriteId;
+}
+
+void sub_80B7CAC(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH);
+ }
+}
+
+void sub_80B7CC8(void)
+{
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ CreateTask(sub_80B7CE4, 0x50);
+}
+
+void sub_80B7CE4(u8 taskId)
+{
+ gUnknown_0855C474[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B7D14(struct Task *task)
+{
+ task->data[0]++;
+ task->data[14] = 64;
+ task->data[15] = GetPlayerFacingDirection();
+}
+
+void sub_80B7D34(struct Task *task)
+{
+ struct EventObject *eventObject;
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ if (task->data[14] != 0 && (--task->data[14]) == 0)
+ {
+ music_something();
+ sub_80AF0B4();
+ }
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ if (task->data[14] == 0 && !gPaletteFade.active && sub_80859A0() == TRUE)
+ {
+ SetEventObjectDirection(eventObject, task->data[15]);
+ sub_8084E14();
+ warp_in();
+ gFieldCallback = mapldr_080859D4;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(sub_80B7CE4));
+ } else if (task->data[1] == 0 || (--task->data[1]) == 0)
+ {
+ EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(spinDirections[eventObject->facingDirection]));
+ if (task->data[2] < 12)
+ {
+ task->data[2]++;
+ }
+ task->data[1] = 8 >> (task->data[2] >> 2);
+ }
+ }
+}
+
+void (*const gUnknown_0855C484[])(struct Task *) = {
+ sub_80B7EC4,
+ sub_80B7EE8
+};
+
+void sub_80B7E94(u8);
+
+void mapldr_080859D4(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ gFieldCallback = NULL;
+ gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1;
+ CreateTask(sub_80B7E94, 0);
+}
+
+void sub_80B7E94(u8 taskId)
+{
+ gUnknown_0855C484[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B7EC4(struct Task *task)
+{
+ if (IsWeatherNotFadingIn())
+ {
+ task->data[0]++;
+ task->data[15] = GetPlayerFacingDirection();
+ }
+}
+
+void sub_80B7EE8(struct Task *task)
+{
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (task->data[1] == 0 || (--task->data[1]) == 0)
+ {
+ if (EventObjectIsMovementOverridden(eventObject) && !EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ return;
+ }
+ if (task->data[2] >= 32 && task->data[15] == GetPlayerFacingDirection())
+ {
+ eventObject->invisible = 0;
+ ScriptContext2_Disable();
+ UnfreezeEventObjects();
+ DestroyTask(FindTaskIdByFunc(sub_80B7E94));
+ return;
+ }
+ EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(spinDirections[eventObject->facingDirection]));
+ if (task->data[2] < 32)
+ {
+ task->data[2]++;
+ }
+ task->data[1] = task->data[2] >> 2;
+ }
+ eventObject->invisible ^= 1;
+}
+
+static void ExecuteTeleportFieldEffectTask(u8);
+static void TeleportFieldEffectTask1(struct Task*);
+static void TeleportFieldEffectTask2(struct Task*);
+static void TeleportFieldEffectTask3(struct Task*);
+static void TeleportFieldEffectTask4(struct Task*);
+static void mapldr_08085D88(void);
+
+void CreateTeleportFieldEffectTask(void)
+{
+ CreateTask(ExecuteTeleportFieldEffectTask, 0);
+}
+
+static void (*const sTeleportFieldEffectTasks[])(struct Task *) = {
+ TeleportFieldEffectTask1,
+ TeleportFieldEffectTask2,
+ TeleportFieldEffectTask3,
+ TeleportFieldEffectTask4
+};
+
+static void ExecuteTeleportFieldEffectTask(u8 taskId)
+{
+ sTeleportFieldEffectTasks[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+static void TeleportFieldEffectTask1(struct Task *task)
+{
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ CameraObjectReset2();
+ task->data[15] = GetPlayerFacingDirection();
+ task->data[0]++;
+}
+
+static void TeleportFieldEffectTask2(struct Task *task)
+{
+ u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+ struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (task->data[1] == 0 || (--task->data[1]) == 0)
+ {
+ EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]);
+ task->data[1] = 8;
+ task->data[2]++;
+ }
+ if (task->data[2] > 7 && task->data[15] == eventObject->facingDirection)
+ {
+ task->data[0]++;
+ task->data[1] = 4;
+ task->data[2] = 8;
+ task->data[3] = 1;
+ PlaySE(SE_TK_WARPIN);
+ }
+}
+
+static void TeleportFieldEffectTask3(struct Task *task)
+{
+ u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+ struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
+ if ((--task->data[1]) <= 0)
+ {
+ task->data[1] = 4;
+ EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]);
+ }
+ sprite->pos1.y -= task->data[3];
+ task->data[4] += task->data[3];
+ if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8))
+ {
+ task->data[3] <<= 1;
+ }
+ if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0))
+ {
+ sprite->subspriteMode = 2;
+ }
+ if (task->data[4] >= 0xa8)
+ {
+ task->data[0]++;
+ music_something();
+ sub_80AF0B4();
+ }
+}
+
+static void TeleportFieldEffectTask4(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ if (task->data[5] == FALSE)
+ {
+ sub_81BE72C();
+ task->data[5] = TRUE;
+ }
+
+ if (sub_80859A0() == TRUE)
+ {
+ Overworld_SetWarpDestToLastHealLoc();
+ warp_in();
+ SetMainCallback2(CB2_LoadMap);
+ gFieldCallback = mapldr_08085D88;
+ DestroyTask(FindTaskIdByFunc(ExecuteTeleportFieldEffectTask));
+ }
+ }
+}
+
+void sub_80B8250(u8);
+
+static void mapldr_08085D88(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ pal_fill_for_maplights();
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ gFieldCallback = NULL;
+ gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1;
+ CameraObjectReset2();
+ CreateTask(sub_80B8250, 0);
+}
+
+void (*const gUnknown_0855C49C[])(struct Task *) = {
+ sub_80B8280,
+ sub_80B830C,
+ sub_80B8410
+};
+
+void sub_80B8250(u8 taskId)
+{
+ gUnknown_0855C49C[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B8280(struct Task *task)
+{
+ struct Sprite *sprite;
+ s16 centerToCornerVecY;
+ if (IsWeatherNotFadingIn())
+ {
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
+ sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY);
+ gEventObjects[gPlayerAvatar.eventObjectId].invisible = 0;
+ task->data[0]++;
+ task->data[1] = 8;
+ task->data[2] = 1;
+ task->data[14] = sprite->subspriteMode;
+ task->data[15] = GetPlayerFacingDirection();
+ PlaySE(SE_TK_WARPIN);
+ }
+}
+
+void sub_80B830C(struct Task *task)
+{
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
+ if ((sprite->pos2.y += task->data[1]) >= -8)
+ {
+ if (task->data[13] == 0)
+ {
+ task->data[13]++;
+ eventObject->triggerGroundEffectsOnMove = 1;
+ sprite->subspriteMode = task->data[14];
+ }
+ } else
+ {
+ sprite->oam.priority = 1;
+ if (sprite->subspriteMode != 0)
+ {
+ sprite->subspriteMode = 2;
+ }
+ }
+ if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1))
+ {
+ task->data[1]--;
+ }
+ if ((--task->data[2]) == 0)
+ {
+ task->data[2] = 4;
+ EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]);
+ }
+ if (sprite->pos2.y >= 0)
+ {
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ task->data[1] = 1;
+ task->data[2] = 0;
+ }
+}
+
+void sub_80B8410(struct Task *task)
+{
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if ((--task->data[1]) == 0)
+ {
+ EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]);
+ task->data[1] = 8;
+ if ((++task->data[2]) > 4 && task->data[14] == eventObject->facingDirection)
+ {
+ ScriptContext2_Disable();
+ CameraObjectReset1();
+ UnfreezeEventObjects();
+ DestroyTask(FindTaskIdByFunc(sub_80B8250));
+ }
+ }
+}
+
+void sub_80B8554(u8);
+void sub_80B88B4(u8);
+u8 sub_80B8C60(u32, u32, u32);
+void sub_80B880C(void);
+void sub_80B8874(u16);
+void sub_80B8CC0(struct Sprite *);
+
+bool8 FldEff_FieldMoveShowMon(void)
+{
+ u8 taskId;
+ if (is_map_type_1_2_3_5_or_6(Overworld_GetMapTypeOfSaveblockLocation()) == TRUE)
+ {
+ taskId = CreateTask(sub_80B8554, 0xff);
+ } else
+ {
+ taskId = CreateTask(sub_80B88B4, 0xff);
+ }
+ gTasks[taskId].data[15] = sub_80B8C60(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ return FALSE;
+}
+
+bool8 FldEff_FieldMoveShowMonInit(void)
+{
+ struct Pokemon *pokemon;
+ u32 flag = gFieldEffectArguments[0] & 0x80000000;
+ pokemon = &gPlayerParty[(u8)gFieldEffectArguments[0]];
+ gFieldEffectArguments[0] = GetMonData(pokemon, MON_DATA_SPECIES);
+ gFieldEffectArguments[1] = GetMonData(pokemon, MON_DATA_OT_ID);
+ gFieldEffectArguments[2] = GetMonData(pokemon, MON_DATA_PERSONALITY);
+ gFieldEffectArguments[0] |= flag;
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON);
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ return FALSE;
+}
+
+void (*const gUnknown_0855C4A8[])(struct Task *) = {
+ sub_80B8584,
+ sub_80B85F8,
+ sub_80B8660,
+ sub_80B86EC,
+ sub_80B871C,
+ sub_80B8770,
+ overworld_bg_setup_2,
+};
+
+void sub_80B8554(u8 taskId)
+{
+ gUnknown_0855C4A8[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B8584(struct Task *task)
+{
+ task->data[11] = REG_WININ;
+ task->data[12] = REG_WINOUT;
+ StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback);
+ task->data[1] = 0xf0f1;
+ task->data[2] = 0x5051;
+ task->data[3] = 0x3f;
+ task->data[4] = 0x3e;
+ SetGpuReg(REG_OFFSET_WIN0H, task->data[1]);
+ SetGpuReg(REG_OFFSET_WIN0V, task->data[2]);
+ SetGpuReg(REG_OFFSET_WININ, task->data[3]);
+ SetGpuReg(REG_OFFSET_WINOUT, task->data[4]);
+ SetVBlankCallback(sub_80B880C);
+ task->data[0]++;
+}
+
+void sub_80B85F8(struct Task *task)
+{
+ u16 offset;
+ u16 delta;
+ offset = ((REG_BG0CNT >> 2) << 14);
+ delta = ((REG_BG0CNT >> 8) << 11);
+ CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200);
+ CpuFill32(0, (void *)(VRAM + delta), 0x800);
+ LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20);
+ sub_80B8874(delta);
+ task->data[0]++;
+}
+
+void sub_80B8660(struct Task *task)
+{
+ s16 v0;
+ s16 v2;
+ s16 v3;
+ task->data[5] -= 16;
+ v0 = ((u16)task->data[1] >> 8);
+ v2 = ((u16)task->data[2] >> 8);
+ v3 = ((u16)task->data[2] & 0xff);
+ v0 -= 16;
+ v2 -= 2;
+ v3 += 2;
+ if (v0 < 0)
+ {
+ v0 = 0;
+ }
+ if (v2 < 0x28)
+ {
+ v2 = 0x28;
+ }
+ if (v3 > 0x78)
+ {
+ v3 = 0x78;
+ }
+ task->data[1] = (v0 << 8) | (task->data[1] & 0xff);
+ task->data[2] = (v2 << 8) | v3;
+ if (v0 == 0 && v2 == 0x28 && v3 == 0x78)
+ {
+ gSprites[task->data[15]].callback = sub_80B8CC0;
+ task->data[0]++;
+ }
+}
+
+void sub_80B86EC(struct Task *task)
+{
+ task->data[5] -= 16;
+ if (gSprites[task->data[15]].data[7])
+ {
+ task->data[0]++;
+ }
+}
+
+void sub_80B871C(struct Task *task)
+{
+ s16 v2;
+ s16 v3;
+ task->data[5] -= 16;
+ v2 = (task->data[2] >> 8);
+ v3 = (task->data[2] & 0xff);
+ v2 += 6;
+ v3 -= 6;
+ if (v2 > 0x50)
+ {
+ v2 = 0x50;
+ }
+ if (v3 < 0x51)
+ {
+ v3 = 0x51;
+ }
+ task->data[2] = (v2 << 8) | v3;
+ if (v2 == 0x50 && v3 == 0x51)
+ {
+ task->data[0]++;
+ }
+}
+
+void sub_80B8770(struct Task *task)
+{
+ u16 bg0cnt;
+ bg0cnt = (REG_BG0CNT >> 8) << 11;
+ CpuFill32(0, (void *)VRAM + bg0cnt, 0x800);
+ task->data[1] = 0xf1;
+ task->data[2] = 0xa1;
+ task->data[3] = task->data[11];
+ task->data[4] = task->data[12];
+ task->data[0]++;
+}
+
+void overworld_bg_setup_2(struct Task *task)
+{
+ IntrCallback callback;
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback);
+ SetVBlankCallback(callback);
+ sub_8197200();
+ FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]);
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
+ DestroyTask(FindTaskIdByFunc(sub_80B8554));
+}
+
+void sub_80B880C(void)
+{
+ struct Task *task;
+ IntrCallback callback;
+ task = &gTasks[FindTaskIdByFunc(sub_80B8554)];
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback);
+ callback();
+ SetGpuReg(REG_OFFSET_WIN0H, task->data[1]);
+ SetGpuReg(REG_OFFSET_WIN0V, task->data[2]);
+ SetGpuReg(REG_OFFSET_WININ, task->data[3]);
+ SetGpuReg(REG_OFFSET_WINOUT, task->data[4]);
+ SetGpuReg(REG_OFFSET_BG0HOFS, task->data[5]);
+ SetGpuReg(REG_OFFSET_BG0VOFS, task->data[6]);
+}
+
+void sub_80B8874(u16 offs)
+{
+ u16 i;
+ u16 *dest;
+ dest = (u16 *)(VRAM + 0x140 + offs);
+ for (i = 0; i < 0x140; i++, dest++)
+ {
+ *dest = gFieldMoveStreaksTilemap[i] | 0xf000;
+ }
+}
+
+void sub_80B8AE0(void);
+bool8 sub_80B8B38(struct Task *);
+void sub_80B8B28(struct Task *);
+bool8 sub_80B8BF0(struct Task *);
+
+void (*const gUnknown_0855C4C4[])(struct Task *) = {
+ sub_80B88E4,
+ sub_80B8920,
+ sub_80B898C,
+ sub_80B89DC,
+ sub_80B8A0C,
+ sub_80B8A44,
+ sub_80B8A64,
+};
+
+void sub_80B88B4(u8 taskId)
+{
+ gUnknown_0855C4C4[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B88E4(struct Task *task)
+{
+ SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]);
+ SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
+ StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback);
+ SetVBlankCallback(sub_80B8AE0);
+ task->data[0]++;
+}
+
+void sub_80B8920(struct Task *task)
+{
+ u16 offset;
+ u16 delta;
+ offset = ((REG_BG0CNT >> 2) << 14);
+ delta = ((REG_BG0CNT >> 8) << 11);
+ task->data[12] = delta;
+ CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80);
+ CpuFill32(0, (void *)(VRAM + delta), 0x800);
+ LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20);
+ task->data[0]++;
+}
+
+void sub_80B898C(struct Task *task)
+{
+ if (sub_80B8B38(task))
+ {
+ SetGpuReg(REG_OFFSET_WIN1H, 0x00f0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0x2878);
+ gSprites[task->data[15]].callback = sub_80B8CC0;
+ task->data[0]++;
+ }
+ sub_80B8B28(task);
+}
+
+void sub_80B89DC(struct Task *task)
+{
+ sub_80B8B28(task);
+ if (gSprites[task->data[15]].data[7])
+ {
+ task->data[0]++;
+ }
+}
+
+void sub_80B8A0C(struct Task *task)
+{
+ sub_80B8B28(task);
+ task->data[3] = task->data[1] & 7;
+ task->data[4] = 0;
+ SetGpuReg(REG_OFFSET_WIN1H, 0xffff);
+ SetGpuReg(REG_OFFSET_WIN1V, 0xffff);
+ task->data[0]++;
+}
+
+void sub_80B8A44(struct Task *task)
+{
+ sub_80B8B28(task);
+ if (sub_80B8BF0(task))
+ {
+ task->data[0]++;
+ }
+}
+
+void sub_80B8A64(struct Task *task)
+{
+ IntrCallback intrCallback;
+ u16 bg0cnt;
+ bg0cnt = (REG_BG0CNT >> 8) << 11;
+ CpuFill32(0, (void *)VRAM + bg0cnt, 0x800);
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback);
+ SetVBlankCallback(intrCallback);
+ sub_8197200();
+ FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]);
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
+ DestroyTask(FindTaskIdByFunc(sub_80B88B4));
+}
+
+void sub_80B8AE0(void)
+{
+ IntrCallback intrCallback;
+ struct Task *task;
+ task = &gTasks[FindTaskIdByFunc(sub_80B88B4)];
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback);
+ intrCallback();
+ SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]);
+ SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
+}
+
+void sub_80B8B28(struct Task *task)
+{
+ task->data[1] -= 16;
+ task->data[3] += 16;
+}
+
+#ifdef NONMATCHING
+bool8 sub_80B8B38(struct Task *task)
+{
+ u16 i;
+ u16 srcOffs;
+ u16 dstOffs;
+ u16 *dest;
+ if (task->data[4] >= 32)
+ {
+ return TRUE;
+ }
+ dstOffs = (task->data[3] >> 3) & 0x1f;
+ if (dstOffs >= task->data[4])
+ {
+ dstOffs = (32 - dstOffs) & 0x1f;
+ srcOffs = (32 - task->data[4]) & 0x1f;
+ dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]);
+ for (i=0; i<10; i++)
+ {
+ dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000;
+ dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000;
+ }
+ task->data[4] += 2;
+ }
+ return FALSE;
+}
+#else
+NAKED
+bool8 sub_80B8B38(struct Task *task)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x4\n"
+ "\tadds r5, r0, 0\n"
+ "\tldrh r2, [r5, 0x10]\n"
+ "\tmovs r1, 0x10\n"
+ "\tldrsh r0, [r5, r1]\n"
+ "\tcmp r0, 0x1F\n"
+ "\tble _08088724\n"
+ "\tmovs r0, 0x1\n"
+ "\tb _080887A8\n"
+ "_08088724:\n"
+ "\tldrh r0, [r5, 0xE]\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r3, r0, 19\n"
+ "\tmovs r1, 0x1F\n"
+ "\tands r3, r1\n"
+ "\tmovs r4, 0x10\n"
+ "\tldrsh r0, [r5, r4]\n"
+ "\tcmp r3, r0\n"
+ "\tblt _080887A6\n"
+ "\tmovs r0, 0x20\n"
+ "\tsubs r3, r0, r3\n"
+ "\tands r3, r1\n"
+ "\tsubs r0, r2\n"
+ "\tmov r12, r0\n"
+ "\tmov r7, r12\n"
+ "\tands r7, r1\n"
+ "\tmov r12, r7\n"
+ "\tldrh r0, [r5, 0x20]\n"
+ "\tldr r1, _080887B8 @ =0x06000140\n"
+ "\tadds r1, r0\n"
+ "\tmov r8, r1\n"
+ "\tmovs r4, 0\n"
+ "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n"
+ "\tmov r10, r7\n"
+ "\tmovs r0, 0xF0\n"
+ "\tlsls r0, 8\n"
+ "\tmov r9, r0\n"
+ "\tadds r1, r3, 0x1\n"
+ "\tmovs r0, 0x1F\n"
+ "\tands r1, r0\n"
+ "\tstr r1, [sp]\n"
+ "\tmov r6, r12\n"
+ "\tadds r6, 0x1\n"
+ "\tands r6, r0\n"
+ "_08088768:\n"
+ "\tlsls r1, r4, 5\n"
+ "\tadds r2, r1, r3\n"
+ "\tlsls r2, 1\n"
+ "\tadd r2, r8\n"
+ "\tmov r7, r12\n"
+ "\tadds r0, r7, r1\n"
+ "\tlsls r0, 1\n"
+ "\tadd r0, r10\n"
+ "\tldrh r0, [r0]\n"
+ "\tmov r7, r9\n"
+ "\torrs r0, r7\n"
+ "\tstrh r0, [r2]\n"
+ "\tldr r0, [sp]\n"
+ "\tadds r2, r1, r0\n"
+ "\tlsls r2, 1\n"
+ "\tadd r2, r8\n"
+ "\tadds r1, r6, r1\n"
+ "\tlsls r1, 1\n"
+ "\tadd r1, r10\n"
+ "\tldrh r0, [r1]\n"
+ "\tmov r1, r9\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r2]\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tcmp r4, 0x9\n"
+ "\tbls _08088768\n"
+ "\tldrh r0, [r5, 0x10]\n"
+ "\tadds r0, 0x2\n"
+ "\tstrh r0, [r5, 0x10]\n"
+ "_080887A6:\n"
+ "\tmovs r0, 0\n"
+ "_080887A8:\n"
+ "\tadd sp, 0x4\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r1}\n"
+ "\tbx r1\n"
+ "\t.align 2, 0\n"
+ "_080887B8: .4byte 0x06000140\n"
+ "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap");
+}
+#endif
+
+bool8 sub_80B8BF0(struct Task *task)
+{
+ u16 i;
+ u16 dstOffs;
+ u16 *dest;
+ if (task->data[4] >= 32)
+ {
+ return TRUE;
+ }
+ dstOffs = task->data[3] >> 3;
+ if (dstOffs >= task->data[4])
+ {
+ dstOffs = (task->data[1] >> 3) & 0x1f;
+ dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]);
+ for (i=0; i<10; i++)
+ {
+ dest[dstOffs + i * 32] = 0xf000;
+ dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000;
+ }
+ task->data[4] += 2;
+ }
+ return FALSE;
+}
+
+u8 sub_80B8C60(u32 a0, u32 a1, u32 a2)
+{
+ u16 v0;
+ u8 monSprite;
+ struct Sprite *sprite;
+ v0 = (a0 & 0x80000000) >> 16;
+ a0 &= 0x7fffffff;
+ monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0);
+ sprite = &gSprites[monSprite];
+ sprite->callback = SpriteCallbackDummy;
+ sprite->oam.priority = 0;
+ sprite->data[0] = a0;
+ sprite->data[6] = v0;
+ return monSprite;
+}
+
+void sub_80B8D04(struct Sprite *);
+
+void sub_80B8CC0(struct Sprite *sprite)
+{
+ if ((sprite->pos1.x -= 20) <= 0x78)
+ {
+ sprite->pos1.x = 0x78;
+ sprite->data[1] = 30;
+ sprite->callback = sub_80B8D04;
+ if (sprite->data[6])
+ {
+ PlayCry2(sprite->data[0], 0, 0x7d, 0xa);
+ } else
+ {
+ PlayCry1(sprite->data[0], 0);
+ }
+ }
+}
+
+void sub_80B8D20(struct Sprite *);
+
+void sub_80B8D04(struct Sprite *sprite)
+{
+ if ((--sprite->data[1]) == 0)
+ {
+ sprite->callback = sub_80B8D20;
+ }
+}
+
+void sub_80B8D20(struct Sprite *sprite)
+{
+ if (sprite->pos1.x < -0x40)
+ {
+ sprite->data[7] = 1;
+ } else
+ {
+ sprite->pos1.x -= 20;
+ }
+}
+
+void sub_80B8D84(u8);
+
+u8 FldEff_UseSurf(void)
+{
+ u8 taskId;
+ taskId = CreateTask(sub_80B8D84, 0xff);
+ gTasks[taskId].data[15] = gFieldEffectArguments[0];
+ Overworld_ClearSavedMusic();
+ Overworld_ChangeMusicTo(MUS_NAMINORI);
+ return FALSE;
+}
+
+void (*const gUnknown_0855C4E0[])(struct Task *) = {
+ sub_80B8DB4,
+ sub_80B8E14,
+ sub_80B8E60,
+ sub_80B8EA8,
+ sub_80B8F24,
+};
+
+void sub_80B8D84(u8 taskId)
+{
+ gUnknown_0855C4E0[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B8DB4(struct Task *task)
+{
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(8);
+ PlayerGetDestCoords(&task->data[1], &task->data[2]);
+ MoveCoords(gEventObjects[gPlayerAvatar.eventObjectId].movementDirection, &task->data[1], &task->data[2]);
+ task->data[0]++;
+}
+
+void sub_80B8E14(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ sub_808C114();
+ EventObjectSetHeldMovement(eventObject, 0x39);
+ task->data[0]++;
+ }
+}
+
+void sub_80B8E60(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (EventObjectCheckHeldMovementStatus(eventObject))
+ {
+ gFieldEffectArguments[0] = task->data[15] | 0x80000000;
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ task->data[0]++;
+ }
+}
+
+void sub_80B8EA8(struct Task *task)
+{
+ struct EventObject *eventObject;
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(3));
+ EventObjectClearHeldMovementIfFinished(eventObject);
+ EventObjectSetHeldMovement(eventObject, GetJumpSpecialMovementAction(eventObject->movementDirection));
+ gFieldEffectArguments[0] = task->data[1];
+ gFieldEffectArguments[1] = task->data[2];
+ gFieldEffectArguments[2] = gPlayerAvatar.eventObjectId;
+ eventObject->fieldEffectSpriteId = FieldEffectStart(FLDEFF_SURF_BLOB);
+ task->data[0]++;
+ }
+}
+
+void sub_80B8F24(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ gPlayerAvatar.preventStep = FALSE;
+ gPlayerAvatar.flags &= 0xdf;
+ EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(eventObject->movementDirection));
+ sub_81555AC(eventObject->fieldEffectSpriteId, 1);
+ UnfreezeEventObjects();
+ ScriptContext2_Disable();
+ FieldEffectActiveListRemove(FLDEFF_USE_SURF);
+ DestroyTask(FindTaskIdByFunc(sub_80B8D84));
+ }
+}
+
+#ifdef NONMATCHING
+u8 sub_80B8F98(void)
+{
+ u8 spriteId, i, j, k, l;
+ struct Sprite *sprite;
+ spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[36], 0x78, -0x18, 1);
+ sprite = &gSprites[spriteId];
+ sprite->oam.priority = 1;
+ sprite->oam.paletteNum = 4;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = -1;
+ sprite->data[4] = sprite->pos1.y;
+ sprite->data[5] = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(14, 14));
+ SetGpuReg(REG_OFFSET_WININ, 0x3F3F);
+ LoadPalette(gUnknown_0855B610, 0xC0, sizeof(gUnknown_0855B610));
+ SetGpuReg(REG_OFFSET_BG0VOFS, 120);
+ for (i = 3; i < 15; i++)
+ {
+ for (j = 12; j < 18; j++)
+ {
+ ((u16*)(VRAM + 0xF800))[i * 32 + j] = 0xBFF4 + i * 6 + j + 1;
+ }
+ }
+ for (k = 0; k < 90; k++)
+ {
+ for (l = 0; l < 8; l++)
+ {
+ *(u16*)(VRAM + 0x8000 + (k + 1) * 32 + l * 4) = (gUnknown_0855B630[k * 32 + l * 4 + 1] << 8) + gUnknown_0855B630[k * 32 + l * 4];
+ *(u16*)(VRAM + 0x8000 + (k + 1) * 32 + l * 4 + 2) = (gUnknown_0855B630[k * 32 + l * 4 + 3] << 8) + gUnknown_0855B630[k * 32 + l * 4 + 2];
+ }
+ }
+ return spriteId;
+}
+#else
+NAKED
+u8 sub_80B8F98(void)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ ldr r0, =gFieldEffectObjectTemplatePointers\n\
+ adds r0, 0x90\n\
+ ldr r0, [r0]\n\
+ movs r2, 0x18\n\
+ negs r2, r2\n\
+ movs r1, 0x78\n\
+ movs r3, 0x1\n\
+ bl CreateSprite\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ lsls r1, r0, 4\n\
+ add r1, r8\n\
+ lsls r1, 2\n\
+ ldr r0, =gSprites\n\
+ adds r1, r0\n\
+ ldrb r2, [r1, 0x5]\n\
+ movs r0, 0xD\n\
+ negs r0, r0\n\
+ ands r0, r2\n\
+ movs r2, 0x4\n\
+ orrs r0, r2\n\
+ movs r2, 0xF\n\
+ ands r0, r2\n\
+ movs r2, 0x40\n\
+ orrs r0, r2\n\
+ strb r0, [r1, 0x5]\n\
+ movs r2, 0\n\
+ strh r2, [r1, 0x2E]\n\
+ strh r2, [r1, 0x30]\n\
+ strh r2, [r1, 0x32]\n\
+ ldr r0, =0x0000ffff\n\
+ strh r0, [r1, 0x34]\n\
+ ldrh r0, [r1, 0x22]\n\
+ strh r0, [r1, 0x36]\n\
+ strh r2, [r1, 0x38]\n\
+ ldr r1, =0x00003e41\n\
+ movs r0, 0x50\n\
+ bl SetGpuReg\n\
+ ldr r1, =0x00000e0e\n\
+ movs r0, 0x52\n\
+ bl SetGpuReg\n\
+ ldr r1, =0x00003f3f\n\
+ movs r0, 0x48\n\
+ bl SetGpuReg\n\
+ ldr r0, =gUnknown_0855B610\n\
+ movs r1, 0xC0\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ movs r0, 0x12\n\
+ movs r1, 0x78\n\
+ bl SetGpuReg\n\
+ movs r4, 0x3\n\
+ ldr r7, =0x0600f800\n\
+ ldr r0, =0x0000bff4\n\
+ adds r6, r0, 0\n\
+_080B901A:\n\
+ movs r2, 0xC\n\
+ lsls r0, r4, 1\n\
+ lsls r5, r4, 5\n\
+ adds r0, r4\n\
+ lsls r3, r0, 1\n\
+_080B9024:\n\
+ adds r0, r5, r2\n\
+ lsls r0, 1\n\
+ adds r0, r7\n\
+ adds r1, r2, r6\n\
+ adds r1, r3, r1\n\
+ adds r1, 0x1\n\
+ strh r1, [r0]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0x11\n\
+ bls _080B9024\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0xE\n\
+ bls _080B901A\n\
+ movs r0, 0\n\
+ ldr r5, =gUnknown_0855B630\n\
+_080B904A:\n\
+ movs r4, 0\n\
+ adds r7, r0, 0x1\n\
+ lsls r6, r0, 5\n\
+_080B9050:\n\
+ lsls r1, r4, 2\n\
+ adds r1, r6, r1\n\
+ ldr r0, =0x06008020\n\
+ adds r3, r1, r0\n\
+ adds r0, r1, 0x1\n\
+ adds r0, r5\n\
+ ldrb r2, [r0]\n\
+ lsls r2, 8\n\
+ adds r0, r1, r5\n\
+ ldrb r0, [r0]\n\
+ adds r0, r2\n\
+ strh r0, [r3]\n\
+ ldr r0, =0x06008022\n\
+ adds r3, r1, r0\n\
+ adds r0, r1, 0x3\n\
+ adds r0, r5\n\
+ ldrb r2, [r0]\n\
+ lsls r2, 8\n\
+ adds r1, 0x2\n\
+ adds r1, r5\n\
+ ldrb r0, [r1]\n\
+ adds r0, r2\n\
+ strh r0, [r3]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x7\n\
+ bls _080B9050\n\
+ lsls r0, r7, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x59\n\
+ bls _080B904A\n\
+ mov r0, r8\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .pool");
+}
+#endif // NONMATCHING
+
+void sub_80B9128(struct Sprite *);
+
+u8 FldEff_NPCFlyOut(void)
+{
+ u8 spriteId;
+ struct Sprite *sprite;
+ spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1);
+ sprite = &gSprites[spriteId];
+ sprite->oam.paletteNum = 0;
+ sprite->oam.priority = 1;
+ sprite->callback = sub_80B9128;
+ sprite->data[1] = gFieldEffectArguments[0];
+ PlaySE(SE_W019);
+ return spriteId;
+}
+
+void sub_80B9128(struct Sprite *sprite)
+{
+ struct Sprite *npcSprite;
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[0])
+ {
+ npcSprite = &gSprites[sprite->data[1]];
+ npcSprite->coordOffsetEnabled = 0;
+ npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ npcSprite->pos2.x = 0;
+ npcSprite->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT);
+ }
+}
+
+void sub_80B91D4(u8);
+extern void sub_81555D8(u8, u8);
+u8 sub_80B94C4(void);
+bool8 sub_80B9508(u8);
+void sub_80B9524(u8);
+void sub_80B9560(u8, u8);
+void sub_80B957C(struct Sprite *);
+void sub_80B963C(struct Sprite *);
+
+u8 FldEff_UseFly(void)
+{
+ u8 taskId;
+ taskId = CreateTask(sub_80B91D4, 0xfe);
+ gTasks[taskId].data[1] = gFieldEffectArguments[0];
+ return 0;
+}
+
+void (*const gUnknown_0855C4F4[])(struct Task *) = {
+ sub_80B9204,
+ sub_80B925C,
+ sub_80B92A0,
+ sub_80B92F8,
+ sub_80B933C,
+ sub_80B9390,
+ sub_80B9418,
+ sub_80B9474,
+ sub_80B9494,
+};
+
+void sub_80B91D4(u8 taskId)
+{
+ gUnknown_0855C4F4[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B9204(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ task->data[15] = gPlayerAvatar.flags;
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(1);
+ sub_808C114();
+ EventObjectSetHeldMovement(eventObject, 0x39);
+ task->data[0]++;
+ }
+}
+
+void sub_80B925C(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ task->data[0]++;
+ gFieldEffectArguments[0] = task->data[1];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ }
+}
+
+void sub_80B92A0(struct Task *task)
+{
+ struct EventObject *eventObject;
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (task->data[15] & 0x08)
+ {
+ sub_81555AC(eventObject->fieldEffectSpriteId, 2);
+ sub_81555D8(eventObject->fieldEffectSpriteId, 0);
+ }
+ task->data[1] = sub_80B94C4();
+ task->data[0]++;
+ }
+}
+
+void sub_80B92F8(struct Task *task)
+{
+ if (sub_80B9508(task->data[1]))
+ {
+ task->data[0]++;
+ task->data[2] = 16;
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
+ EventObjectSetHeldMovement(&gEventObjects[gPlayerAvatar.eventObjectId], 0x02);
+ }
+}
+
+void sub_80B933C(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if ((task->data[2] == 0 || (--task->data[2]) == 0) && EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ task->data[0]++;
+ PlaySE(SE_W019);
+ sub_80B9524(task->data[1]);
+ }
+}
+
+void sub_80B9390(struct Task *task)
+{
+ struct EventObject *eventObject;
+ if ((++task->data[2]) >= 8)
+ {
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(0x03));
+ StartSpriteAnim(&gSprites[eventObject->spriteId], 0x16);
+ eventObject->inanimate = 1;
+ EventObjectSetHeldMovement(eventObject, 0x48);
+ if (task->data[15] & 0x08)
+ {
+ DestroySprite(&gSprites[eventObject->fieldEffectSpriteId]);
+ }
+ task->data[0]++;
+ task->data[2] = 0;
+ }
+}
+
+void sub_80B9418(struct Task *task)
+{
+ struct EventObject *eventObject;
+ if ((++task->data[2]) >= 10)
+ {
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ EventObjectClearHeldMovementIfActive(eventObject);
+ eventObject->inanimate = 0;
+ eventObject->hasShadow = 0;
+ sub_80B9560(task->data[1], eventObject->spriteId);
+ CameraObjectReset2();
+ task->data[0]++;
+ }
+}
+
+void sub_80B9474(struct Task *task)
+{
+ if (sub_80B9508(task->data[1]))
+ {
+ sub_80AF0B4();
+ task->data[0]++;
+ }
+}
+
+void sub_80B9494(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ FieldEffectActiveListRemove(FLDEFF_USE_FLY);
+ DestroyTask(FindTaskIdByFunc(sub_80B91D4));
+ }
+}
+
+u8 sub_80B94C4(void)
+{
+ u8 spriteId;
+ struct Sprite *sprite;
+ spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1);
+ sprite = &gSprites[spriteId];
+ sprite->oam.paletteNum = 0;
+ sprite->oam.priority = 1;
+ sprite->callback = sub_80B957C;
+ return spriteId;
+}
+
+u8 sub_80B9508(u8 spriteId)
+{
+ return gSprites[spriteId].data[7];
+}
+
+void sub_80B9524(u8 spriteId)
+{
+ struct Sprite *sprite;
+ sprite = &gSprites[spriteId];
+ sprite->callback = sub_80B963C;
+ sprite->pos1.x = 0x78;
+ sprite->pos1.y = 0x00;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */);
+ sprite->data[6] = 0x40;
+}
+
+void sub_80B9560(u8 a0, u8 a1)
+{
+ gSprites[a0].data[6] = a1;
+}
+
+const union AffineAnimCmd SpriteAffineAnim_855C518[] = {
+ AFFINEANIMCMD_FRAME(8, 8, -30, 0),
+ AFFINEANIMCMD_FRAME(28, 28, 0, 30),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd SpriteAffineAnim_855C530[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 64, 0),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 22),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_0855C548[] = {
+ SpriteAffineAnim_855C518,
+ SpriteAffineAnim_855C530
+};
+
+void sub_80B957C(struct Sprite *sprite)
+{
+ if (sprite->data[7] == 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.affineMode = 3;
+ sprite->affineAnims = gSpriteAffineAnimTable_0855C548;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, 0);
+ sprite->pos1.x = 0x76;
+ sprite->pos1.y = -0x30;
+ sprite->data[0]++;
+ sprite->data[1] = 0x40;
+ sprite->data[2] = 0x100;
+ }
+ sprite->data[1] += (sprite->data[2] >> 8);
+ sprite->pos2.x = Cos(sprite->data[1], 0x78);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] < 0x800)
+ {
+ sprite->data[2] += 0x60;
+ }
+ if (sprite->data[1] > 0x81)
+ {
+ sprite->data[7]++;
+ sprite->oam.affineMode = 0;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0);
+ }
+ }
+}
+
+void sub_80B963C(struct Sprite *sprite)
+{
+ struct Sprite *sprite1;
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[6] != 0x40)
+ {
+ sprite1 = &gSprites[sprite->data[6]];
+ sprite1->coordOffsetEnabled = 0;
+ sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ sprite1->pos2.x = 0;
+ sprite1->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ sprite->data[7] = 1;
+ }
+}
+
+void sub_80B96B0(struct Sprite *sprite)
+{
+ if (sprite->data[7] == 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.affineMode = 3;
+ sprite->affineAnims = gSpriteAffineAnimTable_0855C548;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->pos1.x = 0x5e;
+ sprite->pos1.y = -0x20;
+ sprite->data[0]++;
+ sprite->data[1] = 0xf0;
+ sprite->data[2] = 0x800;
+ sprite->data[4] = 0x80;
+ }
+ sprite->data[1] += sprite->data[2] >> 8;
+ sprite->data[3] += sprite->data[2] >> 8;
+ sprite->data[1] &= 0xff;
+ sprite->pos2.x = Cos(sprite->data[1], 0x20);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] > 0x100)
+ {
+ sprite->data[2] -= sprite->data[4];
+ }
+ if (sprite->data[4] < 0x100)
+ {
+ sprite->data[4] += 24;
+ }
+ if (sprite->data[2] < 0x100)
+ {
+ sprite->data[2] = 0x100;
+ }
+ if (sprite->data[3] >= 60)
+ {
+ sprite->data[7]++;
+ sprite->oam.affineMode = 0;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->invisible = 1;
+ }
+ }
+}
+
+void sub_80B9794(u8 spriteId)
+{
+ sub_80B9524(spriteId);
+ gSprites[spriteId].callback = sub_80B96B0;
+}
+
+void sub_80B97D4(u8);
+
+u8 FldEff_FlyIn(void)
+{
+ CreateTask(sub_80B97D4, 0xfe);
+ return 0;
+}
+
+void (*const gUnknown_0855C550[])(struct Task *) = {
+ sub_80B9804,
+ sub_80B98B8,
+ sub_80B9924,
+ sub_80B9978,
+ sub_80B99F0,
+ sub_80B9A28,
+ sub_80B9A60,
+};
+
+void sub_80B97D4(u8 taskId)
+{
+ gUnknown_0855C550[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_80B9804(struct Task *task)
+{
+ struct EventObject *eventObject;
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject))
+ {
+ task->data[0]++;
+ task->data[2] = 17;
+ task->data[15] = gPlayerAvatar.flags;
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(0x01);
+ if (task->data[15] & 0x08)
+ {
+ sub_81555AC(eventObject->fieldEffectSpriteId, 0);
+ }
+ EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(0x3));
+ CameraObjectReset2();
+ EventObjectTurn(eventObject, DIR_WEST);
+ StartSpriteAnim(&gSprites[eventObject->spriteId], 0x16);
+ eventObject->invisible = 0;
+ task->data[1] = sub_80B94C4();
+ sub_80B9524(task->data[1]);
+ sub_80B9560(task->data[1], eventObject->spriteId);
+ }
+}
+
+void sub_80B98B8(struct Task *task)
+{
+ struct EventObject *eventObject;
+ struct Sprite *sprite;
+ if (task->data[2] == 0 || (--task->data[2]) == 0)
+ {
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ sprite = &gSprites[eventObject->spriteId];
+ sub_80B9560(task->data[1], 0x40);
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ task->data[2] = 0;
+ }
+}
+
+void sub_80B9924(struct Task *task)
+{
+ s16 unknown_0855C56C[18] = {
+ -2,
+ -4,
+ -5,
+ -6,
+ -7,
+ -8,
+ -8,
+ -8,
+ -7,
+ -7,
+ -6,
+ -5,
+ -3,
+ -2,
+ 0,
+ 2,
+ 4,
+ 8
+ };
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.y = unknown_0855C56C[task->data[2]];
+ if ((++task->data[2]) >= 18)
+ {
+ task->data[0]++;
+ }
+}
+
+void sub_80B9978(struct Task *task)
+{
+ struct EventObject *eventObject;
+ struct Sprite *sprite;
+ if (sub_80B9508(task->data[1]))
+ {
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ sprite = &gSprites[eventObject->spriteId];
+ eventObject->inanimate = 0;
+ sub_808EB08(eventObject, eventObject->currentCoords.x, eventObject->currentCoords.y);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->coordOffsetEnabled = 1;
+ sub_808C114();
+ EventObjectSetHeldMovement(eventObject, 0x39);
+ task->data[0]++;
+ }
+}
+
+void sub_80B99F0(struct Task *task)
+{
+ if (EventObjectClearHeldMovementIfFinished(&gEventObjects[gPlayerAvatar.eventObjectId]))
+ {
+ task->data[0]++;
+ sub_80B9794(task->data[1]);
+ }
+}
+
+void sub_80B9A28(struct Task *task)
+{
+ if (sub_80B9508(task->data[1]))
+ {
+ DestroySprite(&gSprites[task->data[1]]);
+ task->data[0]++;
+ task->data[1] = 0x10;
+ }
+}
+
+void sub_80B9A60(struct Task *task)
+{
+ u8 state;
+ struct EventObject *eventObject;
+ if ((--task->data[1]) == 0)
+ {
+ eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ state = 0;
+ if (task->data[15] & 0x08)
+ {
+ state = 3;
+ sub_81555AC(eventObject->fieldEffectSpriteId, 1);
+ }
+ EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(state));
+ EventObjectTurn(eventObject, DIR_SOUTH);
+ gPlayerAvatar.flags = task->data[15];
+ gPlayerAvatar.preventStep = FALSE;
+ FieldEffectActiveListRemove(FLDEFF_FLY_IN);
+ DestroyTask(FindTaskIdByFunc(sub_80B97D4));
+ }
+}
+
+void sub_80B9BE8(u8 taskId);
+
+bool8 sub_80B9ADC(void)
+{
+ u8 taskId;
+ u8 eventObjectIdBuffer;
+ if (!TryGetEventObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &eventObjectIdBuffer))
+ {
+ taskId = CreateTask(sub_80B9BE8, 0x50);
+ gTasks[taskId].data[2] = eventObjectIdBuffer;
+ gTasks[taskId].data[6] = gFieldEffectArguments[0];
+ gTasks[taskId].data[7] = gFieldEffectArguments[1];
+ gTasks[taskId].data[8] = gFieldEffectArguments[2];
+ }
+ else
+ {
+ FieldEffectActiveListRemove(0x41);
+ }
+ return FALSE;
+}
+
+void sub_80B9B3C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (data[7] != 0)
+ {
+ if (++data[6] > 20)
+ {
+ data[6] = 0;
+ if (data[5] != 0)
+ data[5]--;
+ }
+ }
+ else
+ {
+ data[5] = 4;
+ }
+
+ if (++data[0] > 1)
+ {
+ data[0] = 0;
+ if (++data[1] & 1)
+ {
+ SetCameraPanning(0, -data[5]);
+ }
+ else
+ {
+ SetCameraPanning(0, data[5]);
+ }
+ }
+ UpdateCameraPanning();
+ if (data[5] == 0)
+ DestroyTask(taskId);
+}
+
+void sub_80B9BD0(u8 taskId)
+{
+ gTasks[taskId].data[7] = 1;
+}
+
+void (*const gUnknown_0855C590[])(s16*, u8) = {
+ sub_80B9C28,
+ sub_80B9C54,
+ sub_80B9CDC,
+};
+
+void sub_80B9BE8(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ InstallCameraPanAheadCallback();
+ SetCameraPanningCallback(0);
+ gUnknown_0855C590[data[1]](data, taskId);
+}
+
+void sub_80B9C28(s16* data, u8 taskId)
+{
+ u8 newTaskId = CreateTask(sub_80B9B3C, 0x5A);
+ PlaySE(SE_T_KAMI2);
+ data[5] = newTaskId;
+ data[1]++;
+}
+
+void sub_80B9D24(struct Sprite*);
+
+void sub_80B9C54(s16* data, u8 taskId)
+{
+ if (++data[3] > 0x78)
+ {
+ struct Sprite *sprite = &gSprites[gEventObjects[data[2]].spriteId];
+ gEventObjects[data[2]].invisible = TRUE;
+ BlendPalettes(0x0000FFFF, 0x10, RGB_WHITE);
+ BeginNormalPaletteFade(0x0000FFFF, 0, 0x10, 0, RGB_WHITE);
+ sub_80B9D24(sprite);
+ PlaySE(SE_T_KAMI);
+ sub_80B9BD0(data[5]);
+ data[3] = 0;
+ data[1]++;
+ }
+}
+
+void sub_80B9CDC(s16* a0, u8 taskId)
+{
+ if (!gPaletteFade.active && !FuncIsActiveTask(sub_80B9B3C))
+ {
+ InstallCameraPanAheadCallback();
+ RemoveEventObjectByLocalIdAndMap(a0[6], a0[7], a0[8]);
+ FieldEffectActiveListRemove(0x41);
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80B9DB8(struct Sprite* sprite);
+
+const struct SpriteFrameImage gSpriteImageTable_855C59C[] = {
+ obj_frame_tiles(gUnknown_0855C170),
+ obj_frame_tiles(gUnknown_0855C190),
+ obj_frame_tiles(gUnknown_0855C1B0),
+ obj_frame_tiles(gUnknown_0855C1D0),
+};
+
+const union AnimCmd gSpriteAnim_855C5BC[] = {
+ ANIMCMD_FRAME(.imageValue = 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_855C5C4[] = {
+ ANIMCMD_FRAME(.imageValue = 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_855C5CC[] = {
+ ANIMCMD_FRAME(.imageValue = 2),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_855C5D4[] = {
+ ANIMCMD_FRAME(.imageValue = 3),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_855C5DC[] = {
+ gSpriteAnim_855C5BC,
+ gSpriteAnim_855C5C4,
+ gSpriteAnim_855C5CC,
+ gSpriteAnim_855C5D4,
+};
+
+const struct SpriteTemplate gUnknown_0855C5EC = {
+ .tileTag = 0xffff,
+ .paletteTag = 4378,
+ .oam = &gOamData_855C218,
+ .anims = gSpriteAnimTable_855C5DC,
+ .images = gSpriteImageTable_855C59C,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80B9DB8
+};
+
+void sub_80B9D24(struct Sprite* sprite)
+{
+ int i;
+ int xPos = (s16)gUnknown_03005DEC + sprite->pos1.x + sprite->pos2.x;
+ int yPos = (s16)gUnknown_03005DE8 + sprite->pos1.y + sprite->pos2.y - 4;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 spriteId = CreateSprite(&gUnknown_0855C5EC, xPos, yPos, 0);
+ if (spriteId != 0x40)
+ {
+ StartSpriteAnim(&gSprites[spriteId], i);
+ gSprites[spriteId].data[0] = i;
+ gSprites[spriteId].oam.paletteNum = sprite->oam.paletteNum;
+ }
+ }
+}
+
+void sub_80B9DB8(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x -= 16;
+ sprite->pos1.y -= 12;
+ break;
+ case 1:
+ sprite->pos1.x += 16;
+ sprite->pos1.y -= 12;
+ break;
+ case 2:
+ sprite->pos1.x -= 16;
+ sprite->pos1.y += 12;
+ break;
+ case 3:
+ sprite->pos1.x += 16;
+ sprite->pos1.y += 12;
+ break;
+ }
+ if ((u16)(sprite->pos1.x + 4) > 0xF8 || sprite->pos1.y < -4 || sprite->pos1.y > 0xA4)
+ DestroySprite(sprite);
+}
+
+void sub_80B9EDC(u8 taskId);
+
+bool8 sub_80B9E28(struct Sprite* sprite)
+{
+ u8 eventObjectIdBuffer;
+ if (!TryGetEventObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &eventObjectIdBuffer))
+ {
+ struct EventObject *object;
+ int xPos, yPos;
+ u8 taskId;
+ object = &gEventObjects[eventObjectIdBuffer];
+ xPos = object->currentCoords.x - 7;
+ yPos = object->currentCoords.y - 7;
+ xPos = (gFieldEffectArguments[3] - xPos) * 16;
+ yPos = (gFieldEffectArguments[4] - yPos) * 16;
+ ShiftEventObjectCoords(object, gFieldEffectArguments[3] + 7, gFieldEffectArguments[4] + 7);
+ taskId = CreateTask(sub_80B9EDC, 0x50);
+ gTasks[taskId].data[1] = object->spriteId;
+ gTasks[taskId].data[2] = gSprites[object->spriteId].pos1.x + xPos;
+ gTasks[taskId].data[3] = gSprites[object->spriteId].pos1.y + yPos;
+ gTasks[taskId].data[8] = gFieldEffectArguments[5];
+ gTasks[taskId].data[9] = eventObjectIdBuffer;
+ }
+ return FALSE;
+}
+
+void sub_80B9EDC(u8 taskId)
+{
+ // BUG: Possible divide by zero
+ s16 *data = gTasks[taskId].data;
+ struct Sprite *sprite = &gSprites[data[1]];
+ switch (data[0])
+ {
+ case 0:
+ data[4] = sprite->pos1.x << 4;
+ data[5] = sprite->pos1.y << 4;
+ data[6] = (data[2] * 16 - data[4]) / data[8];
+ data[7] = (data[3] * 16 - data[5]) / data[8];
+ data[0]++;
+ case 1:
+ if (data[8] != 0)
+ {
+ data[8]--;
+ data[4] += data[6];
+ data[5] += data[7];
+ sprite->pos1.x = data[4] >> 4;
+ sprite->pos1.y = data[5] >> 4;
+ }
+ else
+ {
+ struct EventObject *object = &gEventObjects[data[9]];
+ sprite->pos1.x = data[2];
+ sprite->pos1.y = data[3];
+ ShiftStillEventObjectCoords(object);
+ object->triggerGroundEffectsOnStop = TRUE;
+ FieldEffectActiveListRemove(0x42);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
deleted file mode 100755
index dfdeb63a3..000000000
--- a/src/field_map_obj.c
+++ /dev/null
@@ -1,5119 +0,0 @@
-// Includes
-
-#include "global.h"
-#include "malloc.h"
-#include "sprite.h"
-#include "overworld.h"
-#include "rng.h"
-#include "event_scripts.h"
-#include "berry.h"
-#include "palette.h"
-#include "field_player_avatar.h"
-#include "fieldmap.h"
-#include "event_data.h"
-#include "rom_818CFC8.h"
-#include "rom_81BE66C.h"
-#include "field_ground_effect.h"
-#include "map_obj_8097404.h"
-#include "mauville_old_man.h"
-#include "metatile_behavior.h"
-#include "field_effect.h"
-#include "field_effect_helpers.h"
-#include "field_camera.h"
-#include "trainer_see.h"
-#include "decoration.h"
-#include "field_map_obj.h"
-
-#define NUM_FIELD_MAP_OBJECT_TEMPLATES 0x51
-
-#define null_object_step(name, retval) \
-bool8 FieldObjectCB2_##name(struct MapObject *, struct Sprite *);\
-void FieldObjectCB_##name(struct Sprite *sprite)\
-{\
- FieldObjectStep(&gMapObjects[sprite->data0], sprite, FieldObjectCB2_##name);\
-}\
-bool8 FieldObjectCB2_##name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- return (retval);\
-}
-
-#define field_object_step(name, table) \
-extern bool8 (*const (table)[])(struct MapObject *, struct Sprite *);\
-bool8 FieldObjectCB2_##name(struct MapObject *, struct Sprite *);\
-void FieldObjectCB_##name(struct Sprite *sprite)\
-{\
- FieldObjectStep(&gMapObjects[sprite->data0], sprite, FieldObjectCB2_##name);\
-}\
-bool8 FieldObjectCB2_##name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- return (table)[sprite->data1](mapObject, sprite);\
-}
-
-#define field_object_path(idx, table, sub, path, catch, coord)\
-field_object_step(GoInDirectionSequence##idx, table)\
-extern const u8 path[4];\
-bool8 sub(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- u8 route[sizeof(path)];\
- memcpy(route, path, sizeof(path));\
- if (mapObject->mapobj_unk_21 == (catch) && mapObject->coords1.coord == mapObject->coords2.coord)\
- {\
- mapObject->mapobj_unk_21 = (catch) + 1;\
- }\
- return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, route);\
-}\
-
-// Static struct declarations
-
-// Static RAM declarations
-
-extern u8 gUnknown_020375B4;
-extern u16 gUnknown_020375B6;
-
-// Static ROM declarations
-
-static void sub_808D450(void);
-static u8 GetFieldObjectIdByLocalId(u8);
-static u8 GetFieldObjectIdByLocalIdAndMapInternal(u8, u8, u8);
-static bool8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *);
-static void FieldObjectHandleDynamicGraphicsId(struct MapObject *);
-static void RemoveFieldObjectInternal (struct MapObject *);
-/*static*/ u16 GetFieldObjectFlagIdByFieldObjectId(u8);
-void sub_8096518(struct MapObject *, struct Sprite *);
-static void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *, struct SpriteTemplate *, const struct SubspriteTable **);
-/*static*/ void GetFieldObjectMovingCameraOffset(s16 *, s16 *);
-/*static*/ struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8, u8, u8);
-static void sub_808E894(u16);
-static void RemoveFieldObjectIfOutsideView(struct MapObject *);
-static void sub_808E1B8(u8, s16, s16);
-static void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8);
-/*static*/ void sub_808E38C(struct MapObject *);
-static u8 sub_808E8F4(const struct SpritePalette *);
-static u8 FindFieldObjectPaletteIndexByTag(u16);
-static void sub_808EAB0(u16, u8);
-static bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8);
-//static void CameraObject_0(struct Sprite *);
-/*static*/ void CameraObject_1(struct Sprite *);
-//static void CameraObject_2(struct Sprite *);
-/*static*/ struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count);
-void npc_reset(struct MapObject *, struct Sprite *);
-void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8);
-
-u8 GetFaceDirectionAnimId(u32);
-u8 GetGoSpeed0AnimId(u32);
-u8 GetGoSpeed1AnimId(u32);
-u8 GetGoSpeed3AnimId(u32);
-u8 sub_8093438(u32);
-u8 sub_80934BC(u32);
-u8 sub_8093514(u32);
-u8 GetJumpLedgeAnimId(u32);
-void sub_8092F88(u32, s16 *, s16 *, s16, s16);
-
-bool8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *);
-void SetFieldObjectStepTimer(struct Sprite *, s16);
-bool8 RunFieldObjectStepTimer(struct Sprite *);
-bool8 npc_block_way__next_tile(struct MapObject *, u8);
-static u32 state_to_direction(u8, u32, u32);
-/*static*/ void sub_80964E8(struct MapObject *, struct Sprite *);
-static void FieldObjectExecSpecialAnim(struct MapObject *, struct Sprite *);
-/*static*/ void npc_obj_transfer_image_anim_pause_flag(struct MapObject *, struct Sprite *);
-
-static bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *, s16, s16);
-static bool8 IsMetatileDirectionallyImpassable(struct MapObject *, s16, s16, u8);
-static bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *, s16, s16);
-bool8 sub_809558C(struct MapObject *, struct Sprite *);
-bool8 sub_8095B64(struct MapObject *, struct Sprite *);
-static void sub_8096530(struct MapObject *, struct Sprite *);
-static void npc_update_obj_anim_flag(struct MapObject *, struct Sprite *);
-
-// ROM data
-
-extern void (*const gUnknown_08505438[NUM_FIELD_MAP_OBJECT_TEMPLATES])(struct Sprite *);
-extern const u8 gUnknown_0850557C[NUM_FIELD_MAP_OBJECT_TEMPLATES];
-extern const u8 gUnknown_085055CD[NUM_FIELD_MAP_OBJECT_TEMPLATES];
-extern const struct MapObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[7];
-extern const struct MapObjectGraphicsInfo *const gFieldObjectGraphicsInfoPointers[0xEF];
-extern u8 (*const gUnknown_0850D714[11])(s16, s16, s16, s16);
-
-struct PairedPalettes {
- u16 tag;
- const u16 *data;
-};
-
-extern const u8 gUnknown_084975C4[0x10];
-extern const struct SpriteTemplate gUnknown_084975D4;
-extern void (*const gUnknown_084975EC[3])(struct Sprite *);
-extern const struct SpritePalette gUnknown_0850BBC8[39];
-extern const struct PairedPalettes gUnknown_0850BD00[4];
-extern const struct PairedPalettes gUnknown_0850BD78[14];
-extern const u16 *const gUnknown_0850BE38[2];
-extern const s16 gUnknown_0850D6DC[4]; // {0x20, 0x40, 0x60, 0x80}
-extern const s16 gUnknown_0850D6EC[4];
-extern const u8 gUnknown_0850D710[4]; // {DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST}
-extern const u8 gUnknown_0850D770[2]; // {DIR_SOUTH, DIR_NORTH}
-extern const u8 gUnknown_0850D790[2]; // {DIR_WEST, DIR_EAST}
-extern const u8 gUnknown_0850D7F0[2]; // {DIR_NORTH, DIR_WEST}
-extern const u8 gUnknown_0850D808[2]; // {DIR_NORTH, DIR_EAST}
-extern const u8 gUnknown_0850D820[2]; // {DIR_SOUTH, DIR_WEST}
-extern const u8 gUnknown_0850D838[2]; // {DIR_SOUTH, DIR_EAST}
-extern const u8 gUnknown_0850D850[4];
-extern const u8 gUnknown_0850D868[4];
-extern const u8 gUnknown_0850D880[4];
-extern const u8 gUnknown_0850D898[4];
-extern const u8 gUnknown_0850D8AC[5];
-extern const u8 gUnknown_0850D8C4[5];
-extern const u8 gUnknown_0850D8E8[4];
-extern bool8 (*const gUnknown_0850DA64[11])(struct MapObject *, struct Sprite *, u8, bool8(u8));
-extern bool8 (*const gUnknown_0850DB5C[4])(u8);
-extern bool8 (*const gUnknown_0850DB6C[4])(u8);
-extern const struct Coords16 gUnknown_0850DB7C[4];
-extern const u8 gUnknown_0850DC2F[4][4];
-extern const u8 gUnknown_0850DC3F[4][4];
-extern const u8 gUnknown_0850DBA0[5];
-extern bool8 (*const *const gUnknown_0850DC50[166])(struct MapObject *, struct Sprite *);
-extern u8 (*const gUnknown_0850DEE8[5])(u8);
-extern const s16 gUnknown_0850DFBC[3];
-extern const s16 gUnknown_0850DFC2[3];
-
-// Code
-
-static void npc_clear_ids_and_state(struct MapObject *mapObject)
-{
- *mapObject = (struct MapObject){};
- mapObject->localId = 0xFF;
- mapObject->mapNum = -1;
- mapObject->mapGroup = -1;
- mapObject->mapobj_unk_1C = -1;
-}
-
-static void npcs_clear_ids_and_state(void)
-{
- u8 i;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- npc_clear_ids_and_state(&gMapObjects[i]);
- }
-}
-
-void sub_808D438(void)
-{
- strange_npc_table_clear();
- npcs_clear_ids_and_state();
- ClearPlayerAvatarInfo();
- sub_808D450();
-}
-
-static void sub_808D450(void)
-{
- u8 spriteIdx;
-
- spriteIdx = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31);
- gSprites[spriteIdx].oam.affineMode = 1;
- InitSpriteAffineAnim(&gSprites[spriteIdx]);
- StartSpriteAffineAnim(&gSprites[spriteIdx], 0);
- gSprites[spriteIdx].invisible = TRUE;
-
- spriteIdx = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31);
- gSprites[spriteIdx].oam.affineMode = 1;
- InitSpriteAffineAnim(&gSprites[spriteIdx]);
- StartSpriteAffineAnim(&gSprites[spriteIdx], 1);
- gSprites[spriteIdx].invisible = TRUE;
-}
-
-u8 sub_808D4F4(void)
-{
- u8 i;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (!gMapObjects[i].active)
- {
- break;
- }
- }
- return i;
-}
-
-u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapId, u8 mapGroupId)
-{
- if (localId < 0xff)
- {
- return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapId, mapGroupId);
- }
- return GetFieldObjectIdByLocalId(localId);
-}
-
-bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapId, u8 mapGroupId, u8 *fieldObjectId)
-{
- *fieldObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapId, mapGroupId);
- if (*fieldObjectId == NUM_FIELD_OBJECTS)
- {
- return TRUE;
- }
- return FALSE;
-}
-
-u8 GetFieldObjectIdByXY(s16 x, s16 y)
-{
- u8 i;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y)
- {
- break;
- }
- }
- return i;
-}
-
-static u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapId, u8 mapGroupId)
-{
- u8 i;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapId && gMapObjects[i].mapGroup == mapGroupId)
- {
- return i;
- }
- }
- return NUM_FIELD_OBJECTS;
-}
-
-static u8 GetFieldObjectIdByLocalId(u8 localId)
-{
- u8 i;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (gMapObjects[i].active && gMapObjects[i].localId == localId)
- {
- return i;
- }
- }
- return NUM_FIELD_OBJECTS;
-}
-
-// This function has the same nonmatching quirk as in Ruby/Sapphire.
-#ifdef NONMATCHING
-static u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 mapNum, u8 mapGroup)
-{
- struct MapObject *mapObject;
- s16 x;
- s16 y;
- u8 slot;
-
- // mapNum and mapGroup are in the wrong registers (r7/r6 instead of r6/r7)
- if (GetAvailableFieldObjectSlot(template->localId, mapNum, mapGroup, &slot))
- {
- return NUM_FIELD_OBJECTS;
- }
- mapObject = &gMapObjects[slot];
- npc_clear_ids_and_state(mapObject);
- x = template->x + 7;
- y = template->y + 7;
- mapObject->active = TRUE;
- mapObject->mapobj_bit_2 = TRUE;
- mapObject->graphicsId = template->graphicsId;
- mapObject->animPattern = template->movementType;
- mapObject->localId = template->localId;
- mapObject->mapNum = mapNum;
- mapObject->mapGroup = mapGroup;
- mapObject->coords1.x = x;
- mapObject->coords1.y = y;
- mapObject->coords2.x = x;
- mapObject->coords2.y = y;
- mapObject->coords3.x = x;
- mapObject->coords3.y = y;
- mapObject->mapobj_unk_0B_0 = template->elevation;
- mapObject->elevation = template->elevation;
- // For some reason, 0x0F is placed in r9, to be used later
- mapObject->range.as_nybbles.x = template->unkA_0;
- mapObject->range.as_nybbles.y = template->unkA_4;
- mapObject->trainerType = template->unkC;
- mapObject->trainerRange_berryTreeId = template->unkE;
- mapObject->mapobj_unk_20 = gUnknown_085055CD[template->movementType];
- FieldObjectSetDirection(mapObject, mapObject->mapobj_unk_20);
- FieldObjectHandleDynamicGraphicsId(mapObject);
-
- if (gUnknown_0850557C[mapObject->animPattern])
- {
- if ((mapObject->range.as_nybbles.x) == 0)
- {
- // r9 is invoked here
- mapObject->range.as_nybbles.x ++;
- }
- if ((mapObject->range.as_nybbles.y) == 0)
- {
- mapObject->range.as_nybbles.y ++;
- }
- }
- return slot;
-}
-#else
-static __attribute__((naked)) u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 mapId, u8 mapGroupId)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r9\n"
- "\tmov r6, r8\n"
- "\tpush {r6,r7}\n"
- "\tsub sp, 0x4\n"
- "\tadds r5, r0, 0\n"
- "\tlsls r1, 24\n"
- "\tlsrs r6, r1, 24\n"
- "\tlsls r2, 24\n"
- "\tlsrs r7, r2, 24\n"
- "\tldrb r0, [r5]\n"
- "\tadds r1, r6, 0\n"
- "\tadds r2, r7, 0\n"
- "\tmov r3, sp\n"
- "\tbl GetAvailableFieldObjectSlot\n"
- "\tlsls r0, 24\n"
- "\tcmp r0, 0\n"
- "\tbeq _0808D66E\n"
- "\tmovs r0, 0x10\n"
- "\tb _0808D762\n"
- "_0808D66E:\n"
- "\tmov r0, sp\n"
- "\tldrb r1, [r0]\n"
- "\tlsls r0, r1, 3\n"
- "\tadds r0, r1\n"
- "\tlsls r0, 2\n"
- "\tldr r1, =gMapObjects\n"
- "\tadds r4, r0, r1\n"
- "\tadds r0, r4, 0\n"
- "\tbl npc_clear_ids_and_state\n"
- "\tldrh r3, [r5, 0x4]\n"
- "\tadds r3, 0x7\n"
- "\tlsls r3, 16\n"
- "\tlsrs r3, 16\n"
- "\tldrh r2, [r5, 0x6]\n"
- "\tadds r2, 0x7\n"
- "\tlsls r2, 16\n"
- "\tlsrs r2, 16\n"
- "\tldrb r0, [r4]\n"
- "\tmovs r1, 0x1\n"
- "\torrs r0, r1\n"
- "\tmovs r1, 0x4\n"
- "\torrs r0, r1\n"
- "\tstrb r0, [r4]\n"
- "\tldrb r0, [r5, 0x1]\n"
- "\tstrb r0, [r4, 0x5]\n"
- "\tldrb r0, [r5, 0x9]\n"
- "\tstrb r0, [r4, 0x6]\n"
- "\tldrb r0, [r5]\n"
- "\tstrb r0, [r4, 0x8]\n"
- "\tstrb r6, [r4, 0x9]\n"
- "\tstrb r7, [r4, 0xA]\n"
- "\tstrh r3, [r4, 0xC]\n"
- "\tstrh r2, [r4, 0xE]\n"
- "\tstrh r3, [r4, 0x10]\n"
- "\tstrh r2, [r4, 0x12]\n"
- "\tstrh r3, [r4, 0x14]\n"
- "\tstrh r2, [r4, 0x16]\n"
- "\tldrb r0, [r5, 0x8]\n"
- "\tmovs r7, 0xF\n"
- "\tadds r1, r7, 0\n"
- "\tands r1, r0\n"
- "\tldrb r2, [r4, 0xB]\n"
- "\tmovs r0, 0x10\n"
- "\tnegs r0, r0\n"
- "\tmov r8, r0\n"
- "\tands r0, r2\n"
- "\torrs r0, r1\n"
- "\tstrb r0, [r4, 0xB]\n"
- "\tldrb r1, [r5, 0x8]\n"
- "\tlsls r1, 4\n"
- "\tands r0, r7\n"
- "\torrs r0, r1\n"
- "\tstrb r0, [r4, 0xB]\n"
- "\tldrb r1, [r5, 0xA]\n"
- "\tlsls r1, 28\n"
- "\tmovs r0, 0xF\n"
- "\tmov r9, r0\n"
- "\tlsrs r1, 28\n"
- "\tldrb r2, [r4, 0x19]\n"
- "\tmov r0, r8\n"
- "\tands r0, r2\n"
- "\torrs r0, r1\n"
- "\tstrb r0, [r4, 0x19]\n"
- "\tldrb r1, [r5, 0xA]\n"
- "\tlsrs r1, 4\n"
- "\tlsls r1, 4\n"
- "\tands r0, r7\n"
- "\torrs r0, r1\n"
- "\tstrb r0, [r4, 0x19]\n"
- "\tldrh r0, [r5, 0xC]\n"
- "\tstrb r0, [r4, 0x7]\n"
- "\tldrh r0, [r5, 0xE]\n"
- "\tstrb r0, [r4, 0x1D]\n"
- "\tldr r1, =gUnknown_085055CD\n"
- "\tldrb r0, [r5, 0x9]\n"
- "\tadds r0, r1\n"
- "\tldrb r1, [r0]\n"
- "\tadds r0, r4, 0\n"
- "\tadds r0, 0x20\n"
- "\tstrb r1, [r0]\n"
- "\tldrb r1, [r0]\n"
- "\tadds r0, r4, 0\n"
- "\tbl FieldObjectSetDirection\n"
- "\tadds r0, r4, 0\n"
- "\tbl FieldObjectHandleDynamicGraphicsId\n"
- "\tldr r1, =gUnknown_0850557C\n"
- "\tldrb r0, [r4, 0x6]\n"
- "\tadds r0, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0\n"
- "\tbeq _0808D75E\n"
- "\tldrb r2, [r4, 0x19]\n"
- "\tadds r0, r7, 0\n"
- "\tands r0, r2\n"
- "\tcmp r0, 0\n"
- "\tbne _0808D746\n"
- "\tlsls r0, r2, 28\n"
- "\tlsrs r0, 28\n"
- "\tadds r0, 0x1\n"
- "\tmov r1, r9\n"
- "\tands r0, r1\n"
- "\tmov r1, r8\n"
- "\tands r1, r2\n"
- "\torrs r1, r0\n"
- "\tstrb r1, [r4, 0x19]\n"
- "_0808D746:\n"
- "\tldrb r2, [r4, 0x19]\n"
- "\tmovs r0, 0xF0\n"
- "\tands r0, r2\n"
- "\tcmp r0, 0\n"
- "\tbne _0808D75E\n"
- "\tlsrs r1, r2, 4\n"
- "\tadds r1, 0x1\n"
- "\tlsls r1, 4\n"
- "\tadds r0, r7, 0\n"
- "\tands r0, r2\n"
- "\torrs r0, r1\n"
- "\tstrb r0, [r4, 0x19]\n"
- "_0808D75E:\n"
- "\tmov r0, sp\n"
- "\tldrb r0, [r0]\n"
- "_0808D762:\n"
- "\tadd sp, 0x4\n"
- "\tpop {r3,r4}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tpop {r4-r7}\n"
- "\tpop {r1}\n"
- "\tbx r1\n"
- ".pool");
-}
-#endif
-
-u8 unref_sub_808D77C(u8 localId)
-{
- u8 i;
- u8 nObjects;
- struct MapObjectTemplate *template;
-
- if (gMapHeader.events != NULL)
- {
- if (InBattlePyramid())
- {
- nObjects = sub_81AAA40();
- }
- else if (InTrainerHill())
- {
- nObjects = 2;
- }
- else
- {
- nObjects = gMapHeader.events->mapObjectCount;
- }
- for (i = 0; i < nObjects; i ++)
- {
- template = &gSaveBlock1Ptr->mapObjectTemplates[i];
- if (template->localId == localId && !FlagGet(template->flagId))
- {
- return InitFieldObjectStateFromTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
- }
- }
- }
- return NUM_FIELD_OBJECTS;
-}
-
-static bool8 GetAvailableFieldObjectSlot(u16 localId, u8 mapNum, u8 mapGroup, u8 *result)
-// Looks for an empty slot.
-// Returns FALSE and the location of the available slot
-// in *result.
-// If no slots are available, or if the object is already
-// loaded, returns TRUE.
-{
- u8 i = 0;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (!gMapObjects[i].active)
- break;
- if (gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup)
- return TRUE;
- }
- if (i >= NUM_FIELD_OBJECTS)
- return TRUE;
- *result = i;
- do
- {
- if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup)
- return TRUE;
- i ++;
- } while (i < NUM_FIELD_OBJECTS);
- return FALSE;
-}
-
-static void RemoveFieldObject(struct MapObject *mapObject)
-{
- mapObject->active = FALSE;
- RemoveFieldObjectInternal(mapObject);
-}
-
-void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
-{
- u8 index;
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &index))
- {
- FlagSet(GetFieldObjectFlagIdByFieldObjectId(index));
- RemoveFieldObject(&gMapObjects[index]);
- }
-}
-
-static void RemoveFieldObjectInternal(struct MapObject *mapObject)
-{
- struct SpriteFrameImage image;
- image.size = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->size;
- gSprites[mapObject->spriteId].images = &image;
- DestroySprite(&gSprites[mapObject->spriteId]);
-}
-
-void unref_sub_808D958(void)
-{
- u8 i;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (i != gPlayerAvatar.mapObjectId)
- {
- RemoveFieldObject(&gMapObjects[i]);
- }
- }
-}
-
-static u8 SpawnFieldObjectInternal(struct MapObjectTemplate *mapObjectTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
-{
- struct MapObject *mapObject;
- const struct MapObjectGraphicsInfo *graphicsInfo;
- struct Sprite *sprite;
- u8 mapObjectId;
- u8 paletteSlot;
- u8 spriteId;
-
- mapObjectId = InitFieldObjectStateFromTemplate(mapObjectTemplate, mapNum, mapGroup);
- if (mapObjectId == NUM_FIELD_OBJECTS)
- {
- return NUM_FIELD_OBJECTS;
- }
- mapObject = &gMapObjects[mapObjectId];
- graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
- paletteSlot = graphicsInfo->paletteSlot;
- if (paletteSlot == 0)
- {
- npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, 0);
- }
- else if (paletteSlot == 10)
- {
- npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, 10);
- }
- else if (paletteSlot >= 16)
- {
- paletteSlot -= 16;
- sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
- }
- if (mapObject->animPattern == 0x4c)
- {
- mapObject->mapobj_bit_13 = TRUE;
- }
- *(u16 *)&spriteTemplate->paletteTag = 0xFFFF;
- spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
- if (spriteId == MAX_SPRITES)
- {
- gMapObjects[mapObjectId].active = FALSE;
- return NUM_FIELD_OBJECTS;
- }
- sprite = &gSprites[spriteId];
- sub_8092FF0(mapObject->coords2.x + cameraX, mapObject->coords2.y + cameraY, &sprite->pos1.x, &sprite->pos1.y);
- sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
- sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
- sprite->pos1.x += 8;
- sprite->pos1.y += 16 + sprite->centerToCornerVecY;
- sprite->oam.paletteNum = paletteSlot;
- sprite->coordOffsetEnabled = TRUE;
- sprite->data0 = mapObjectId;
- mapObject->spriteId = spriteId;
- mapObject->mapobj_bit_12 = graphicsInfo->inanimate;
- if (!mapObject->mapobj_bit_12)
- {
- StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18));
- }
- SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1);
- sub_8096518(mapObject, sprite);
- return mapObjectId;
-}
-
-static u8 SpawnFieldObject(struct MapObjectTemplate *mapObjectTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
-{
- const struct MapObjectGraphicsInfo *graphicsInfo;
- struct SpriteTemplate spriteTemplate;
- const struct SubspriteTable *subspriteTables;
- struct SpriteFrameImage spriteFrameImage;
- u8 mapObjectId;
-
- subspriteTables = NULL;
- graphicsInfo = GetFieldObjectGraphicsInfo(mapObjectTemplate->graphicsId);
- MakeObjectTemplateFromFieldObjectTemplate(mapObjectTemplate, &spriteTemplate, &subspriteTables);
- spriteFrameImage.size = graphicsInfo->size;
- spriteTemplate.images = &spriteFrameImage;
- mapObjectId = SpawnFieldObjectInternal(mapObjectTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY);
- if (mapObjectId == NUM_FIELD_OBJECTS)
- {
- return NUM_FIELD_OBJECTS;
- }
- gSprites[gMapObjects[mapObjectId].spriteId].images = graphicsInfo->images;
- if (subspriteTables != NULL)
- {
- SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables);
- }
- return mapObjectId;
-}
-
-u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjectTemplate)
-{
- s16 cameraX;
- s16 cameraY;
-
- GetFieldObjectMovingCameraOffset(&cameraX, &cameraY);
- return SpawnFieldObject(mapObjectTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);
-}
-
-u8 SpawnSpecialFieldObjectParametrized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z)
-{
- struct MapObjectTemplate mapObjectTemplate;
-
- x -= 7;
- y -= 7;
- mapObjectTemplate.localId = localId;
- mapObjectTemplate.graphicsId = graphicsId;
- mapObjectTemplate.unk2 = 0;
- mapObjectTemplate.x = x;
- mapObjectTemplate.y = y;
- mapObjectTemplate.elevation = z;
- mapObjectTemplate.movementType = movementBehavior;
- mapObjectTemplate.unkA_0 = 0;
- mapObjectTemplate.unkA_4 = 0;
- mapObjectTemplate.unkC = 0;
- mapObjectTemplate.unkE = 0;
- return SpawnSpecialFieldObject(&mapObjectTemplate);
-}
-
-u8 show_sprite(u8 localId, u8 mapNum, u8 mapGroup)
-{
- struct MapObjectTemplate *mapObjectTemplate;
- s16 cameraX;
- s16 cameraY;
-
- mapObjectTemplate = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup);
- if (mapObjectTemplate == NULL)
- {
- return NUM_FIELD_OBJECTS;
- }
- GetFieldObjectMovingCameraOffset(&cameraX, &cameraY);
- return SpawnFieldObject(mapObjectTemplate, mapNum, mapGroup, cameraX, cameraY);
-}
-
-static void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const 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;
-}
-
-static void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables)
-{
- MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_08505438[callbackIndex], sprTemplate, subspriteTables);
-}
-
-static void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjectTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)
-{
- MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjectTemplate->graphicsId, mapObjectTemplate->movementType, spriteTemplate, subspriteTables);
-}
-
-u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority)
-{
- struct SpriteTemplate *spriteTemplate;
- const struct SubspriteTable *subspriteTables;
- struct Sprite *sprite;
- u8 spriteIdx;
-
- spriteTemplate = malloc(sizeof(struct SpriteTemplate));
- MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, spriteTemplate, &subspriteTables);
- if (spriteTemplate->paletteTag != 0xffff)
- {
- sub_808E894(spriteTemplate->paletteTag);
- }
- spriteIdx = CreateSprite(spriteTemplate, x, y, subpriority);
- free(spriteTemplate);
-
- if (spriteIdx != MAX_SPRITES && subspriteTables != NULL)
- {
- sprite = &gSprites[spriteIdx];
- SetSubspriteTables(sprite, subspriteTables);
- sprite->subspriteMode = 2;
- }
- return spriteIdx;
-}
-
-u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction)
-{
- const struct MapObjectGraphicsInfo *graphicsInfo;
- struct SpriteTemplate spriteTemplate;
- const struct SubspriteTable *subspriteTables;
- u8 spriteId;
- struct Sprite *sprite;
-
- graphicsInfo = GetFieldObjectGraphicsInfo(graphicsId);
- MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8097AC8, &spriteTemplate, &subspriteTables);
- *(u16 *)&spriteTemplate.paletteTag = 0xffff;
- x += 7;
- y += 7;
- sub_80930E0(&x, &y, 8, 16);
- spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0);
- if (spriteId != MAX_SPRITES)
- {
- sprite = &gSprites[spriteId];
- sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
- sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
- sprite->pos1.y += sprite->centerToCornerVecY;
- sprite->oam.paletteNum = graphicsInfo->paletteSlot;
- if (sprite->oam.paletteNum >= 16)
- {
- sprite->oam.paletteNum -= 16;
- }
- sprite->coordOffsetEnabled = TRUE;
- sprite->data0 = a1;
- sprite->data1 = z;
- if (graphicsInfo->paletteSlot == 10)
- {
- npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
- }
- else if (graphicsInfo->paletteSlot >= 16)
- {
- sub_808EAB0(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot | 0xf0);
- }
- if (subspriteTables != NULL)
- {
- SetSubspriteTables(sprite, subspriteTables);
- sprite->subspriteMode = 2;
- }
- InitObjectPriorityByZCoord(sprite, z);
- SetObjectSubpriorityByZCoord(z, sprite, 1);
- StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction));
- }
- return spriteId;
-}
-
-void SpawnFieldObjectsInView(s16 cameraX, s16 cameraY)
-{
- u8 i;
- s16 left;
- s16 right;
- s16 top;
- s16 bottom;
- u8 objectCount;
- s16 npcX;
- s16 npcY;
-
- if (gMapHeader.events != NULL)
- {
- left = gSaveBlock1Ptr->pos.x - 2;
- right = gSaveBlock1Ptr->pos.x + 17;
- top = gSaveBlock1Ptr->pos.y;
- bottom = gSaveBlock1Ptr->pos.y + 16;
-
- if (InBattlePyramid())
- {
- objectCount = sub_81AAA40();
- }
- else if (InTrainerHill())
- {
- objectCount = 2;
- }
- else
- {
- objectCount = gMapHeader.events->mapObjectCount;
- }
-
- for (i = 0; i < objectCount; i++)
- {
- struct MapObjectTemplate *template = &gSaveBlock1Ptr->mapObjectTemplates[i];
- npcX = template->x + 7;
- npcY = template->y + 7;
-
- if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX
- && !FlagGet(template->flagId))
- SpawnFieldObject(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);
- }
- }
-}
-
-/*static*/ void RemoveFieldObjectsOutsideView(void)
-{
- u8 i;
- u8 j;
- bool8 isActiveLinkPlayer;
- struct MapObject *mapObject;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- for (j = 0, isActiveLinkPlayer = FALSE; j < ARRAY_COUNT(gLinkPlayerMapObjects); j ++)
- {
- if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId)
- isActiveLinkPlayer = TRUE;
- }
- if (!isActiveLinkPlayer)
- {
- mapObject = &gMapObjects[i];
-
- if (mapObject->active && !mapObject->mapobj_bit_16)
- RemoveFieldObjectIfOutsideView(mapObject);
- }
- }
-}
-
-static void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject)
-{
- s16 left;
- s16 right;
- s16 top;
- s16 bottom;
-
- left = gSaveBlock1Ptr->pos.x - 2;
- right = gSaveBlock1Ptr->pos.x + 17;
- top = gSaveBlock1Ptr->pos.y;
- bottom = gSaveBlock1Ptr->pos.y + 16;
-
- if (mapObject->coords2.x >= left && mapObject->coords2.x <= right
- && mapObject->coords2.y >= top && mapObject->coords2.y <= bottom)
- return;
- if (mapObject->coords1.x >= left && mapObject->coords1.x <= right
- && mapObject->coords1.y >= top && mapObject->coords1.y <= bottom)
- return;
- RemoveFieldObject(mapObject);
-}
-
-void sub_808E16C(s16 x, s16 y)
-{
- u8 i;
-
- ClearPlayerAvatarInfo();
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (gMapObjects[i].active)
- {
- sub_808E1B8(i, x, y);
- }
- }
- sub_808D450();
-}
-
-static void sub_808E1B8(u8 mapObjectId, s16 x, s16 y)
-{
- u8 spriteId;
- u8 paletteSlot;
- struct MapObject *mapObject;
- const struct SubspriteTable *subspriteTables;
- const struct MapObjectGraphicsInfo *graphicsInfo;
- struct SpriteFrameImage spriteFrameImage;
- struct SpriteTemplate spriteTemplate;
- struct Sprite *sprite;
-
-#define i spriteId
- for (i = 0; i < ARRAY_COUNT(gLinkPlayerMapObjects); i ++)
- {
- if (gLinkPlayerMapObjects[i].active && mapObjectId == gLinkPlayerMapObjects[i].mapObjId)
- {
- return;
- }
- }
-#undef i
-
- mapObject = &gMapObjects[mapObjectId];
- subspriteTables = NULL;
- graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
- spriteFrameImage.size = graphicsInfo->size;
- MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &spriteTemplate, &subspriteTables);
- spriteTemplate.images = &spriteFrameImage;
- *(u16 *)&spriteTemplate.paletteTag = 0xffff;
- paletteSlot = graphicsInfo->paletteSlot;
- if (paletteSlot == 0)
- {
- npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
- }
- else if (paletteSlot == 10)
- {
- npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
- }
- else if (paletteSlot >= 16)
- {
- paletteSlot -= 16;
- sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
- }
- *(u16 *)&spriteTemplate.paletteTag = 0xffff;
- spriteId = CreateSprite(&spriteTemplate, 0, 0, 0);
- if (spriteId != MAX_SPRITES)
- {
- sprite = &gSprites[spriteId];
- sub_8092FF0(x + mapObject->coords2.x, y + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
- sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
- sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
- sprite->pos1.x += 8;
- sprite->pos1.y += 16 + sprite->centerToCornerVecY;
- sprite->images = graphicsInfo->images;
- if (mapObject->animPattern == 0x0b)
- {
- SetPlayerAvatarFieldObjectIdAndObjectId(mapObjectId, spriteId);
- mapObject->mapobj_unk_1B = sub_8154228();
- }
- if (subspriteTables != NULL)
- {
- SetSubspriteTables(sprite, subspriteTables);
- }
- sprite->oam.paletteNum = paletteSlot;
- sprite->coordOffsetEnabled = TRUE;
- sprite->data0 = mapObjectId;
- mapObject->spriteId = spriteId;
- if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 0x0b)
- {
- StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18));
- }
- sub_808E38C(mapObject);
- SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1);
- }
-}
-
-/*static*/ void sub_808E38C(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);
-}
-
-static void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId)
-{
- gPlayerAvatar.mapObjectId = mapObjectId;
- gPlayerAvatar.spriteId = spriteId;
- gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId);
- SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20);
-}
-
-void FieldObjectSetGraphicsId(struct MapObject *mapObject, u8 graphicsId)
-{
- const struct MapObjectGraphicsInfo *graphicsInfo;
- struct Sprite *sprite;
- u8 paletteSlot;
-
- graphicsInfo = GetFieldObjectGraphicsInfo(graphicsId);
- sprite = &gSprites[mapObject->spriteId];
- paletteSlot = graphicsInfo->paletteSlot;
- if (paletteSlot == 0)
- {
- pal_patch_for_npc(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
- }
- else if (paletteSlot == 10)
- {
- npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
- }
- else if (paletteSlot >= 16)
- {
- paletteSlot -= 16;
- sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
- }
- sprite->oam.shape = graphicsInfo->oam->shape;
- sprite->oam.size = graphicsInfo->oam->size;
- sprite->images = graphicsInfo->images;
- sprite->anims = graphicsInfo->anims;
- sprite->subspriteTables = graphicsInfo->subspriteTables;
- sprite->oam.paletteNum = paletteSlot;
- mapObject->mapobj_bit_12 = graphicsInfo->inanimate;
- mapObject->graphicsId = graphicsId;
- sub_8093038(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
- sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
- sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
- sprite->pos1.x += 8;
- sprite->pos1.y += 16 + sprite->centerToCornerVecY;
- if (mapObject->mapobj_bit_15)
- {
- CameraObjectReset1();
- }
-}
-
-void FieldObjectSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- FieldObjectSetGraphicsId(&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 PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction)
-{
- FieldObjectTurn(&gMapObjects[playerAvatar->mapObjectId], direction);
-}
-
-/*static*/ void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 berryStage;
- u8 berryId;
-
- mapObject->mapobj_bit_13 = TRUE;
- sprite->invisible = TRUE;
- berryStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId);
- if (berryStage != 0)
- {
- mapObject->mapobj_bit_13 = FALSE;
- sprite->invisible = FALSE;
- berryId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1;
- berryStage -= 1;
- if (berryId >= NUM_BERRIES)
- {
- berryId = 0;
- }
- FieldObjectSetGraphicsId(mapObject, gBerryTreeFieldObjectGraphicsIdTablePointers[berryId][berryStage]);
- sprite->images = gBerryTreePicTablePointers[berryId];
- sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[berryId][berryStage];
- StartSpriteAnim(sprite, berryStage);
- }
-}
-
-const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId)
-{
- u8 bard;
-
- if (graphicsId >= SPRITE_VAR)
- {
- graphicsId = VarGetFieldObjectGraphicsId(graphicsId - SPRITE_VAR);
- }
- if (graphicsId == 0x45)
- {
- bard = sub_81201C8();
- return gMauvilleOldManGraphicsInfoPointers[bard];
- }
- if (graphicsId >= NUM_OBJECT_GRAPHICS_INFO)
- {
- graphicsId = 0x05; // LittleBoy1
- }
- return gFieldObjectGraphicsInfoPointers[graphicsId];
-}
-
-static void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject)
-{
- if (mapObject->graphicsId >= SPRITE_VAR)
- {
- mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId - SPRITE_VAR);
- }
-}
-
-void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 state)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- gMapObjects[mapObjectId].mapobj_bit_13 = state;
- }
-}
-
-void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, u8 *localId, u8 *mapNum, u8 *mapGroup)
-{
- *localId = mapObject->localId;
- *mapNum = mapObject->mapNum;
- *mapGroup = mapObject->mapGroup;
-}
-
-void sub_808E75C(s16 x, s16 y)
-{
- u8 mapObjectId;
- struct MapObject *mapObject;
-
- mapObjectId = GetFieldObjectIdByXY(x, y);
- if (mapObjectId != NUM_FIELD_OBJECTS)
- {
- mapObject = &gMapObjects[mapObjectId];
- mapObject->mapobj_bit_2 = TRUE;
- }
-}
-
-void sub_808E78C(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_808E7E4(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_808E82C(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;
-}
-
-static void sub_808E894(u16 paletteTag)
-{
- u16 paletteSlot;
-
- paletteSlot = FindFieldObjectPaletteIndexByTag(paletteTag);
- if (paletteSlot != 0x11ff) // always true
- {
- sub_808E8F4(&gUnknown_0850BBC8[paletteSlot]);
- }
-}
-
-void sub_808E8C0(u16 *paletteTags)
-{
- u8 i;
-
- for (i = 0; paletteTags[i] != 0x11ff; i ++)
- {
- sub_808E894(paletteTags[i]);
- }
-}
-
-static u8 sub_808E8F4(const struct SpritePalette *spritePalette)
-{
- if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xff)
- {
- return 0xff;
- }
- return LoadSpritePalette(spritePalette);
-}
-
-void pal_patch_for_npc(u16 paletteTag, u8 paletteSlot)
-{
- u16 paletteIdx;
-
- paletteIdx = FindFieldObjectPaletteIndexByTag(paletteTag);
- LoadPalette(gUnknown_0850BBC8[paletteIdx].data, 16 * paletteSlot + 256, 0x20);
-}
-
-void pal_patch_for_npc_range(const u16 *paletteTags, u8 minSlot, u8 maxSlot)
-{
- while (minSlot < maxSlot)
- {
- pal_patch_for_npc(*paletteTags, minSlot);
- paletteTags ++;
- minSlot ++;
- }
-}
-
-static u8 FindFieldObjectPaletteIndexByTag(u16 tag)
-{
- u8 i;
-
- for (i = 0; gUnknown_0850BBC8[i].tag != 0x11ff; i ++)
- {
- if (gUnknown_0850BBC8[i].tag == tag)
- {
- return i;
- }
- }
- return 0xff;
-}
-
-void npc_load_two_palettes__no_record(u16 tag, u8 slot)
-{
- u8 i;
-
- pal_patch_for_npc(tag, slot);
- for (i = 0; gUnknown_0850BD00[i].tag != 0x11ff; i ++)
- {
- if (gUnknown_0850BD00[i].tag == tag)
- {
- pal_patch_for_npc(gUnknown_0850BD00[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]);
- return;
- }
- }
-}
-
-void npc_load_two_palettes__and_record(u16 tag, u8 slot)
-{
- u8 i;
-
- gUnknown_020375B6 = tag;
- pal_patch_for_npc(tag, slot);
- for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i ++)
- {
- if (gUnknown_0850BD78[i].tag == tag)
- {
- pal_patch_for_npc(gUnknown_0850BD78[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]);
- return;
- }
- }
-}
-
-static void sub_808EAB0(u16 tag, u8 slot)
-{
- pal_patch_for_npc(tag, slot);
-}
-
-void unref_sub_808EAC4(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;
-}
-
-/*static*/ 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_808EB08(struct MapObject *mapObject, s16 x, s16 y)
-{
- struct Sprite *sprite;
- const struct MapObjectGraphicsInfo *graphicsInfo;
-
- sprite = &gSprites[mapObject->spriteId];
- graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
- npc_coords_set(mapObject, x, y);
- sub_8093038(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
- sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
- sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
- sprite->pos1.x += 8;
- sprite->pos1.y += 16 + sprite->centerToCornerVecY;
- sub_808E38C(mapObject);
- if (mapObject->mapobj_bit_15)
- {
- CameraObjectReset1();
- }
-}
-
-void sub_808EBA8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- x += 7;
- y += 7;
- sub_808EB08(&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 dx;
- s16 dy;
-
- if (gCamera.active)
- {
- dx = gCamera.x;
- dy = gCamera.y;
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (gMapObjects[i].active)
- {
- gMapObjects[i].coords1.x -= dx;
- gMapObjects[i].coords1.y -= dy;
- gMapObjects[i].coords2.x -= dx;
- gMapObjects[i].coords2.y -= dy;
- gMapObjects[i].coords3.x -= dx;
- gMapObjects[i].coords3.y -= dy;
- }
- }
- }
-}
-
-u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z)
-{
- u8 i;
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- if (gMapObjects[i].active)
- {
- if (gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y && FieldObjectDoesZCoordMatch(&gMapObjects[i], z))
- {
- return i;
- }
- }
- }
- return NUM_FIELD_OBJECTS;
-}
-
-static bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z)
-{
- if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 && mapObject->mapobj_unk_0B_0 != z)
- {
- return FALSE;
- }
- return TRUE;
-}
-
-void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y)
-{
- UpdateFieldObjectCoordsForCameraUpdate();
- SpawnFieldObjectsInView(x, y);
- RemoveFieldObjectsOutsideView();
-}
-
-u8 AddCameraObject(u8 linkedSpriteId)
-{
- u8 spriteId;
-
- spriteId = CreateSprite(&gUnknown_084975D4, 0, 0, 4);
- gSprites[spriteId].invisible = TRUE;
- gSprites[spriteId].data0 = linkedSpriteId;
- return spriteId;
-}
-
-void ObjectCB_CameraObject(struct Sprite *sprite)
-{
- void (*callbacks[ARRAY_COUNT(gUnknown_084975EC)])(struct Sprite *);
-
- memcpy(callbacks, gUnknown_084975EC, sizeof gUnknown_084975EC);
- callbacks[sprite->data1](sprite);
-}
-
-/*static*/ 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);
-}
-
-/*static*/ void CameraObject_1(struct Sprite *sprite)
-{
- s16 x;
- s16 y;
-
- y = gSprites[sprite->data0].pos1.y;
- x = gSprites[sprite->data0].pos1.x;
- sprite->data2 = x - sprite->pos1.x;
- sprite->data3 = y - sprite->pos1.y;
- sprite->pos1.x = x;
- sprite->pos1.y = y;
-}
-
-/*static*/ 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;
-}
-
-static struct Sprite *FindCameraObject(void)
-{
- u8 spriteId;
-
- for (spriteId = 0; spriteId < MAX_SPRITES; spriteId ++)
- {
- if (gSprites[spriteId].inUse && gSprites[spriteId].callback == ObjectCB_CameraObject)
- {
- return &gSprites[spriteId];
- }
- }
- return NULL;
-}
-
-void CameraObjectReset1(void)
-{
- struct Sprite *cameraObject;
-
- cameraObject = FindCameraObject();
- if (cameraObject != NULL)
- {
- cameraObject->data1 = 0;
- cameraObject->callback(cameraObject);
- }
-}
-
-void CameraObjectSetFollowedObjectId(u8 objectId)
-{
- struct Sprite *cameraObject;
-
- cameraObject = FindCameraObject();
- if (cameraObject != NULL)
- {
- cameraObject->data0 = objectId;
- CameraObjectReset1();
- }
-}
-
-u8 CameraObjectGetFollowedObjectId(void)
-{
- struct Sprite *cameraObject;
-
- cameraObject = FindCameraObject();
- if (cameraObject == NULL)
- {
- return MAX_SPRITES;
- }
- return cameraObject->data0;
-}
-
-void CameraObjectReset2(void)
-{
- FindCameraObject()->data1 = 2;
-}
-
-u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)
-{
- u8 i;
-
- for (i = 0; i < MAX_SPRITES; i ++)
- {
- if (!gSprites[i].inUse)
- {
- gSprites[i] = *sprite;
- gSprites[i].pos1.x = x;
- gSprites[i].pos1.y = y;
- gSprites[i].subpriority = subpriority;
- break;
- }
- }
- return i;
-}
-
-u8 obj_unfreeze(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)
-{
- s16 i;
-
- for (i = MAX_SPRITES - 1; i > -1; i --)
- {
- if (!gSprites[i].inUse)
- {
- gSprites[i] = *sprite;
- gSprites[i].pos1.x = x;
- gSprites[i].pos1.y = y;
- gSprites[i].subpriority = subpriority;
- return i;
- }
- }
- return MAX_SPRITES;
-}
-
-void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction)
-{
- s8 d2;
- mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18;
- if (!mapObject->mapobj_bit_9)
- {
- d2 = direction;
- mapObject->mapobj_unk_18 = d2;
- }
- mapObject->placeholder18 = direction;
-}
-
-static const u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
-{
- return GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script;
-}
-
-const u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId)
-{
- return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup);
-}
-
-static u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
-{
- return GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->flagId;
-}
-
-u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId)
-{
- return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup);
-}
-
-u8 sub_808F080(u8 localId, u8 mapNum, u8 mapGroup)
-{
- u8 mapObjectId;
-
- if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- return 0xFF;
- }
- return gMapObjects[mapObjectId].trainerType;
-}
-
-u8 sub_808F0BC(u8 mapObjectId)
-{
- return gMapObjects[mapObjectId].trainerType;
-}
-
-u8 sub_808F0D4(u8 localId, u8 mapNum, u8 mapGroup)
-{
- u8 mapObjectId;
-
- if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- return 0xFF;
- }
- return gMapObjects[mapObjectId].trainerRange_berryTreeId;
-}
-
-u8 FieldObjectGetBerryTreeId(u8 mapObjectId)
-{
- return gMapObjects[mapObjectId].trainerRange_berryTreeId;
-}
-
-struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
-{
- struct MapObjectTemplate *templates;
- const struct MapHeader *mapHeader;
- u8 count;
-
- if (gSaveBlock1Ptr->location.mapNum == mapNum && gSaveBlock1Ptr->location.mapGroup == mapGroup)
- {
- templates = gSaveBlock1Ptr->mapObjectTemplates;
- count = gMapHeader.events->mapObjectCount;
- }
- else
- {
- mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum);
- templates = mapHeader->events->mapObjects;
- count = mapHeader->events->mapObjectCount;
- }
- return FindFieldObjectTemplateInArrayByLocalId(localId, templates, count);
-}
-
-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_808F1B4(const struct MapObject *mapObject)
-{
- int i;
-
- if (mapObject->mapNum != gSaveBlock1Ptr->location.mapNum || mapObject->mapGroup != gSaveBlock1Ptr->location.mapGroup)
- {
- return NULL;
- }
- for (i = 0; i < 64; i ++) // Using ARRAY_COUNT here results in the wrong conditional branch instruction (bls instead of ble)
- {
- if (mapObject->localId == gSaveBlock1Ptr->mapObjectTemplates[i].localId)
- {
- return &gSaveBlock1Ptr->mapObjectTemplates[i];
- }
- }
- return NULL;
-}
-
-void sub_808F208(const struct MapObject *mapObject)
-{
- struct MapObjectTemplate *mapObjectTemplate;
-
- mapObjectTemplate = sub_808F1B4(mapObject);
- if (mapObjectTemplate != NULL)
- {
- mapObjectTemplate->x = mapObject->coords2.x - 7;
- mapObjectTemplate->y = mapObject->coords2.y - 7;
- }
-}
-
-void sub_808F228(const struct MapObject *mapObject, const u8 *script)
-{
- struct MapObjectTemplate *mapObjectTemplate;
-
- mapObjectTemplate = sub_808F1B4(mapObject);
- if (mapObjectTemplate != NULL)
- {
- mapObjectTemplate->script = script;
- }
-}
-
-void sub_808F23C(const struct MapObject *mapObject, u8 movementType)
-{
- struct MapObjectTemplate *mapObjectTemplate;
-
- mapObjectTemplate = sub_808F1B4(mapObject);
- if (mapObjectTemplate != NULL)
- {
- mapObjectTemplate->movementType = movementType;
- }
-}
-
-void sub_808F254(u8 localId, u8 mapNum, u8 mapGroup)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- sub_808F208(&gMapObjects[mapObjectId]);
- }
-}
-
-void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- switch (decorCat)
- {
- case DECORCAT_DOLL:
- sub_808F228(&gMapObjects[mapObjectId], EventScript_2766A2);
- break;
- case DECORCAT_CUSHION:
- sub_808F228(&gMapObjects[mapObjectId], EventScript_2766A6);
- break;
- }
- }
-}
-
-void npc_paltag_set_load(u8 palSlot)
-{
- gpu_pal_allocator_reset__manage_upper_four();
- gUnknown_020375B6 = 0x11ff;
- gUnknown_020375B4 = palSlot;
- if (palSlot == 1)
- {
- pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 6);
- gReservedSpritePaletteCount = 8;
- }
- else
- {
- pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 10);
- }
-}
-
-u16 npc_paltag_by_palslot(u8 palSlot)
-{
- u8 i;
-
- if (palSlot < 10)
- {
- return gUnknown_0850BE38[gUnknown_020375B4][palSlot];
- }
- for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i ++)
- {
- if (gUnknown_0850BD78[i].tag == gUnknown_020375B6)
- {
- return gUnknown_0850BD78[i].data[gUnknown_020375B4];
- }
- }
- return 0x11ff;
-}
-
-// Map Object Step Callbacks
-// file boundary?
-
-null_object_step(NoMovement1, FALSE)
-
-field_object_step(GoRandomDirections, gUnknown_0850D6F4)
-
-bool8 sub_808F44C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_808F460(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_808F48C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (!FieldObjectExecRegularAnim(mapObject, sprite))
- {
- return FALSE;
- }
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]);
- sprite->data1 = 3;
- return TRUE;
-}
-
-bool8 sub_808F4C8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_808F4E8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[4];
- u8 chosenDirection;
-
- memcpy(directions, gUnknown_0850D710, sizeof directions);
- chosenDirection = directions[Random() & 0x03];
- FieldObjectSetDirection(mapObject, chosenDirection);
- sprite->data1 = 5;
- if (npc_block_way__next_tile(mapObject, chosenDirection))
- {
- sprite->data1 = 1;
- }
- return TRUE;
-}
-
-bool8 sub_808F534(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 6;
- return TRUE;
-}
-
-bool8 sub_808F564(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 1;
- }
- return FALSE;
-}
-
-bool8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject)
-{
- s16 playerX;
- s16 playerY;
- s16 objX;
- s16 objY;
- s16 minX;
- s16 maxX;
- s16 minY;
- s16 maxY;
-
- if (!TestPlayerAvatarFlags(0x80))
- {
- return FALSE;
- }
- if (mapObject->trainerType != 1 && mapObject->trainerType != 3)
- {
- return FALSE;
- }
- PlayerGetDestCoords(&playerX, &playerY);
- objX = mapObject->coords2.x;
- objY = mapObject->coords2.y;
- minX = objX - mapObject->trainerRange_berryTreeId;
- minY = objY - mapObject->trainerRange_berryTreeId;
- maxX = objX + mapObject->trainerRange_berryTreeId;
- maxY = objY + mapObject->trainerRange_berryTreeId;
- if (minX > playerX || maxX < playerX || minY > playerY || maxY < playerY)
- {
- return FALSE;
- }
- return TRUE;
-}
-
-u8 GetRegularRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- if (absdx > absdy)
- {
- direction = DIR_EAST;
- if (dx < 0)
- {
- direction = DIR_WEST;
- }
- }
- else
- {
- direction = DIR_SOUTH;
- if (dy < 0)
- {
- direction = DIR_NORTH;
- }
- }
- return direction;
-}
-
-u8 GetNorthSouthRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = DIR_SOUTH;
- if (dy < 0)
- {
- direction = DIR_NORTH;
- }
- return direction;
-}
-
-u8 GetEastWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = DIR_EAST;
- if (dx < 0)
- {
- direction = DIR_WEST;
- }
- return direction;
-}
-
-u8 GetNorthEastRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_SOUTH)
- {
- direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_EAST)
- {
- direction = DIR_NORTH;
- }
- }
- else if (direction == DIR_EAST)
- {
- direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_SOUTH)
- {
- direction = DIR_NORTH;
- }
- }
- return direction;
-}
-
-u8 GetNorthWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_SOUTH)
- {
- direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_WEST)
- {
- direction = DIR_NORTH;
- }
- }
- else if (direction == DIR_WEST)
- {
- direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_SOUTH)
- {
- direction = DIR_NORTH;
- }
- }
- return direction;
-}
-
-u8 GetSouthEastRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_NORTH)
- {
- direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_EAST)
- {
- direction = DIR_SOUTH;
- }
- }
- else if (direction == DIR_EAST)
- {
- direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_NORTH)
- {
- direction = DIR_SOUTH;
- }
- }
- return direction;
-}
-
-u8 GetSouthWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_NORTH)
- {
- direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_WEST)
- {
- direction = DIR_SOUTH;
- }
- }
- else if (direction == DIR_WEST)
- {
- direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_NORTH)
- {
- direction = DIR_SOUTH;
- }
- }
- return direction;
-}
-
-u8 GetNonEastRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_EAST)
- {
- direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy);
- }
- return direction;
-}
-
-u8 GetNonWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_WEST)
- {
- direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy);
- }
- return direction;
-}
-
-u8 GetNonSouthRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_SOUTH)
- {
- direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy);
- }
- return direction;
-}
-
-u8 GetNonNorthRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy)
-{
- u8 direction;
-
- direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy);
- if (direction == DIR_NORTH)
- {
- direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy);
- }
- return direction;
-}
-
-u8 GetRunningPastFacingDirection(struct MapObject *mapObject, u8 movementType)
-{
- s16 dx;
- s16 dy;
- s16 absdx;
- s16 absdy;
-
- if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- return 0;
- }
- PlayerGetDestCoords(&dx, &dy);
- dx -= mapObject->coords2.x;
- dy -= mapObject->coords2.y;
- absdx = dx;
- absdy = dy;
- if (absdx < 0)
- {
- absdx = -absdx;
- }
- if (absdy < 0)
- {
- absdy = -absdy;
- }
- return gUnknown_0850D714[movementType](dx, dy, absdx, absdy);
-}
-
-field_object_step(LookRandomDirections, gUnknown_0850D740)
-
-bool8 sub_808F988(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_808F99C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_808F9C8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_808FA0C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_808FA3C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[4];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D710, sizeof directions);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_ANY);
- if (direction == 0)
- {
- direction = directions[Random() & 0x03];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyGoNorthOrSouth, gUnknown_0850D754)
-
-bool8 sub_808FAC8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_808FADC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_808FB08(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (!FieldObjectExecRegularAnim(mapObject, sprite))
- {
- return FALSE;
- }
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]);
- sprite->data1 = 3;
- return TRUE;
-}
-
-bool8 sub_808FB44(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_808FB64(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D770, sizeof directions);
- direction = directions[Random() & 0x01];
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 5;
- if (npc_block_way__next_tile(mapObject, direction))
- {
- sprite->data1 = 1;
- }
- return TRUE;
-}
-
-bool8 sub_808FBB0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 6;
- return TRUE;
-}
-
-bool8 sub_808FBE0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 1;
- }
- return FALSE;
-}
-
-field_object_step(RandomlyGoEastOrWest, gUnknown_0850D774)
-
-bool8 sub_808FC4C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_808FC60(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_808FC8C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (!FieldObjectExecRegularAnim(mapObject, sprite))
- {
- return FALSE;
- }
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]);
- sprite->data1 = 3;
- return TRUE;
-}
-
-bool8 sub_808FCC8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_808FCE8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D790, sizeof directions);
- direction = directions[Random() & 0x01];
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 5;
- if (npc_block_way__next_tile(mapObject, direction))
- {
- sprite->data1 = 1;
- }
- return TRUE;
-}
-
-bool8 sub_808FD34(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 6;
- return TRUE;
-}
-
-bool8 sub_808FD64(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 1;
- }
- return FALSE;
-}
-
-field_object_step(FaceFixedDirection, gUnknown_0850D794)
-
-bool8 sub_808FDD0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_808FDFC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- sprite->data1 = 2;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_808FE1C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_1 = FALSE;
- return FALSE;
-}
-
-static bool8 FieldObjectCB2_BerryTree(struct MapObject *mapObject, struct Sprite *sprite);
-extern bool8 (*const gUnknown_0850D7A0[])(struct MapObject *mapObject, struct Sprite *sprite);
-void FieldObjectCB_BerryTree(struct Sprite *sprite)
-{
- struct MapObject *mapObject;
-
- mapObject = &gMapObjects[sprite->data0];
- if (!(sprite->data7 & 0x0001))
- {
- get_berry_tree_graphics(mapObject, sprite);
- sprite->data7 |= 0x0001;
- }
- FieldObjectStep(mapObject, sprite, FieldObjectCB2_BerryTree);
-}
-static bool8 FieldObjectCB2_BerryTree(struct MapObject *mapObject, struct Sprite *sprite)
-{
- return gUnknown_0850D7A0[sprite->data1](mapObject, sprite);
-}
-
-bool8 do_berry_tree_growth_sparkle_1 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 berryStage;
-
- npc_reset(mapObject, sprite);
- mapObject->mapobj_bit_13 = TRUE;
- sprite->invisible = TRUE;
- berryStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId);
- if (berryStage == 0)
- {
- if (!(sprite->data7 & 0x0004) && sprite->animNum == 4)
- {
- gFieldEffectArguments[0] = mapObject->coords2.x;
- gFieldEffectArguments[1] = mapObject->coords2.y;
- gFieldEffectArguments[2] = sprite->subpriority - 1;
- gFieldEffectArguments[3] = sprite->oam.priority;
- FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
- sprite->animNum = berryStage;
- }
- return FALSE;
- }
- mapObject->mapobj_bit_13 = FALSE;
- sprite->invisible = FALSE;
- berryStage --;
- if (sprite->animNum != berryStage)
- {
- sprite->data1 = 2;
- return TRUE;
- }
- get_berry_tree_graphics(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, 0x39);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_808FF48 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- sprite->data1 = 0;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 do_berry_tree_growth_sparkle_2 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 3;
- sprite->data2 = 0;
- sprite->data7 |= 0x0002;
- gFieldEffectArguments[0] = mapObject->coords2.x;
- gFieldEffectArguments[1] = mapObject->coords2.y;
- gFieldEffectArguments[2] = sprite->subpriority - 1;
- gFieldEffectArguments[3] = sprite->oam.priority;
- FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
- return TRUE;
-}
-
-bool8 sub_808FFB4 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->data2 ++;
- mapObject->mapobj_bit_13 = (sprite->data2 & 0x02) >> 1;
- sprite->animPaused = TRUE;
- if (sprite->data2 > 64)
- {
- get_berry_tree_graphics(mapObject, sprite);
- sprite->data1 = 4;
- sprite->data2 = 0;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090004 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->data2 ++;
- mapObject->mapobj_bit_13 = (sprite->data2 & 0x02) >> 1;
- sprite->animPaused = TRUE;
- if (sprite->data2 > 64)
- {
- sprite->data1 = 0;
- sprite->data7 &= ~0x0002;
- return TRUE;
- }
- return FALSE;
-}
-
-field_object_step(RandomlyLookNorthOrSouth, gUnknown_0850D7B4)
-
-bool8 sub_8090094 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_80900A8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_80900D4 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090118 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090148 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D770, sizeof gUnknown_0850D770);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_SOUTH);
- if (direction == 0)
- {
- direction = directions[Random() & 0x01];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookEastOrWest, gUnknown_0850D7C8)
-
-bool8 sub_80901D4 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_80901E8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090214 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090258 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090288 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D790, sizeof gUnknown_0850D790);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_EAST_WEST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x01];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookNorthOrWest, gUnknown_0850D7DC)
-
-bool8 sub_8090314 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090328 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090354 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090398 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_80903C8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D7F0, sizeof gUnknown_0850D7F0);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_WEST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x01];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookNorthOrEast, gUnknown_0850D7F4)
-
-bool8 sub_8090454 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090468 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090494 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_80904D8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090508 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D808, sizeof gUnknown_0850D808);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_EAST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x01];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookSouthOrWest, gUnknown_0850D80C)
-
-bool8 sub_8090594 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_80905A8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_80905D4 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090618 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090648 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D820, sizeof gUnknown_0850D820);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_SOUTH_WEST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x01];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookSouthOrEast, gUnknown_0850D824)
-
-bool8 sub_80906D4 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_80906E8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090714 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090758 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090788 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[2];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D838, sizeof gUnknown_0850D838);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_SOUTH_EAST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x01];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookNorthOrSouthOrWest, gUnknown_0850D83C)
-
-bool8 sub_8090814 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090828 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090854 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090898 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_80908C8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[4];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D850, sizeof gUnknown_0850D850);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_SOUTH_WEST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x03];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookNorthOrSouthOrEast, gUnknown_0850D854)
-
-bool8 sub_8090954 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090968 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090994 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_80909D8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090A08 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[4];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D868, sizeof gUnknown_0850D868);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_SOUTH_EAST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x03];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookNorthOrEastOrWest, gUnknown_0850D86C)
-
-bool8 sub_8090A94 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090AA8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090AD4 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090B18 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090B48 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[4];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D880, sizeof gUnknown_0850D880);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_EAST_WEST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x03];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(RandomlyLookSouthOrEastOrWest, gUnknown_0850D884)
-
-bool8 sub_8090BD4 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090BE8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090C14 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]);
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090C58 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 4;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8090C88 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[4];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D898, sizeof gUnknown_0850D898);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_SOUTH_EAST_WEST);
- if (direction == 0)
- {
- direction = directions[Random() & 0x03];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(LookAroundCounterclockwise, gUnknown_0850D89C)
-
-bool8 sub_8090D14 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090D40 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, 48);
- sprite->data1 = 2;
- }
- return FALSE;
-}
-
-bool8 sub_8090D64 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090D90 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[5];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D8AC, sizeof gUnknown_0850D8AC);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_ANY);
- if (direction == 0)
- {
- direction = directions[mapObject->mapobj_unk_18];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 0;
- return TRUE;
-}
-
-field_object_step(LookAroundClockwise, gUnknown_0850D8B4)
-
-bool8 sub_8090E18 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090E44 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- SetFieldObjectStepTimer(sprite, 48);
- sprite->data1 = 2;
- }
- return FALSE;
-}
-
-bool8 sub_8090E68 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
- {
- sprite->data1 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8090E94 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 directions[5];
- u8 direction;
-
- memcpy(directions, gUnknown_0850D8C4, sizeof gUnknown_0850D8C4);
- direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_ANY);
- if (direction == 0)
- {
- direction = directions[mapObject->mapobj_unk_18];
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 0;
- return TRUE;
-}
-
-field_object_step(AlternatelyGoInOppositeDirections, gUnknown_0850D8CC)
-
-bool8 sub_8090F1C (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8090F30 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 direction;
-
- direction = gUnknown_085055CD[mapObject->animPattern];
- if (mapObject->mapobj_unk_21)
- {
- direction = GetOppositeDirection(direction);
- }
- FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8090F68 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- bool8 blockingWay;
- u8 animId;
-
- if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y)
- {
- mapObject->mapobj_unk_21 = 0;
- FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18));
- }
- blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18);
- animId = GetGoSpeed0AnimId(mapObject->placeholder18);
- if (blockingWay == TRUE)
- {
- mapObject->mapobj_unk_21 ++;
- FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18));
- animId = GetGoSpeed0AnimId(mapObject->placeholder18);
- blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18);
- }
- if (blockingWay)
- {
- animId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18);
- }
- FieldObjectSetRegularAnim(mapObject, sprite, animId);
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 3;
- return TRUE;
-}
-
-bool8 sub_8091020 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 1;
- }
- return FALSE;
-}
-
-bool8 sub_8091048(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *route)
-{
- u8 blockingWay;
- u8 animId;
-
- if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y)
- {
- mapObject->mapobj_unk_21 = 0;
- }
- FieldObjectSetDirection(mapObject, route[mapObject->mapobj_unk_21]);
- animId = GetGoSpeed0AnimId(mapObject->placeholder18);
- blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18);
- if (blockingWay == TRUE)
- {
- mapObject->mapobj_unk_21 ++;
- FieldObjectSetDirection(mapObject, route[mapObject->mapobj_unk_21]);
- animId = GetGoSpeed0AnimId(mapObject->placeholder18);
- blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18);
- }
- if (blockingWay)
- {
- animId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18);
- }
- FieldObjectSetRegularAnim(mapObject, sprite, animId);
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8091110(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 1;
- }
- return FALSE;
-}
-
-field_object_path( 1, gUnknown_0850D8DC, sub_809117C, gUnknown_0850D8E8, 2, x)
-field_object_path( 2, gUnknown_0850D8EC, sub_8091208, gUnknown_0850D8F8, 1, x)
-field_object_path( 3, gUnknown_0850D8FC, sub_8091294, gUnknown_0850D908, 1, y)
-field_object_path( 4, gUnknown_0850D90C, sub_8091320, gUnknown_0850D918, 2, y)
-field_object_path( 5, gUnknown_0850D91C, sub_80913AC, gUnknown_0850D928, 2, x)
-field_object_path( 6, gUnknown_0850D92C, sub_8091438, gUnknown_0850D938, 1, x)
-field_object_path( 7, gUnknown_0850D93C, sub_80914C4, gUnknown_0850D710, 1, y)
-field_object_path( 8, gUnknown_0850D948, sub_8091550, gUnknown_0850D954, 2, y)
-field_object_path( 9, gUnknown_0850D958, sub_80915DC, gUnknown_0850D964, 2, y)
-field_object_path(10, gUnknown_0850D968, sub_8091668, gUnknown_0850D974, 1, y)
-field_object_path(11, gUnknown_0850D978, sub_80916F4, gUnknown_0850D984, 1, x)
-field_object_path(12, gUnknown_0850D988, sub_8091780, gUnknown_0850D994, 2, x)
-field_object_path(13, gUnknown_0850D998, sub_809180C, gUnknown_0850D9A4, 2, y)
-field_object_path(14, gUnknown_0850D9A8, sub_8091898, gUnknown_0850D9B4, 1, y)
-field_object_path(15, gUnknown_0850D9B8, sub_8091924, gUnknown_0850D9C4, 1, x)
-field_object_path(16, gUnknown_0850D9C8, sub_80919B0, gUnknown_0850D9D4, 2, x)
-field_object_path(17, gUnknown_0850D9D8, sub_8091A3C, gUnknown_0850D9E4, 2, y)
-field_object_path(18, gUnknown_0850D9E8, sub_8091AC8, gUnknown_0850D9F4, 2, y)
-field_object_path(19, gUnknown_0850D9F8, sub_8091B54, gUnknown_0850DA04, 2, x)
-field_object_path(20, gUnknown_0850DA08, sub_8091BE0, gUnknown_0850DA14, 2, x)
-field_object_path(21, gUnknown_0850DA18, sub_8091C6C, gUnknown_0850DA24, 2, y)
-field_object_path(22, gUnknown_0850DA28, sub_8091CF8, gUnknown_0850DA34, 2, y)
-field_object_path(23, gUnknown_0850DA38, sub_8091D84, gUnknown_0850DA44, 2, x)
-field_object_path(24, gUnknown_0850DA48, sub_8091E10, gUnknown_0850DA54, 2, x)
-
-field_object_step(CopyPlayer1, gUnknown_0850DA58)
-
-bool8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- if (mapObject->mapobj_unk_21 == 0)
- {
- mapObject->mapobj_unk_21 = player_get_direction_lower_nybble();
- }
- sprite->data1 = 1;
- return TRUE;
-}
-
-bool8 sub_8091EC0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2)
- {
- return FALSE;
- }
- return gUnknown_0850DA64[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL);
-}
-
-bool8 sub_8091F20(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- mapObject->mapobj_bit_1 = FALSE;
- sprite->data1 = 1;
- }
- return FALSE;
-}
-
-bool8 sub_8091F48(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- return FALSE;
-}
-
-bool8 sub_8091F4C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, playerDirection)));
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8091F94(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- u32 direction;
- s16 x;
- s16 y;
-
- direction = playerDirection;
- if (FieldObjectIsFarawayIslandMew(mapObject))
- {
- direction = sub_81D427C();
- if (direction == 0)
- {
- direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
- }
- }
- else
- {
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- }
- FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
- FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction));
- if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
- {
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
- }
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_80920A4(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- u32 direction;
- s16 x;
- s16 y;
-
- direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
- FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed1AnimId(direction));
- if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
- {
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
- }
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_809215C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- u32 direction;
- s16 x;
- s16 y;
-
- direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
- FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed3AnimId(direction));
- if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
- {
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
- }
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8092214(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- u32 direction;
- s16 x;
- s16 y;
-
- direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
- FieldObjectSetRegularAnim(mapObject, sprite, sub_8093438(direction));
- if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
- {
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
- }
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- u32 direction;
-
- direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- FieldObjectSetRegularAnim(mapObject, sprite, sub_80934BC(direction));
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 sub_8092314(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- u32 direction;
- s16 x;
- s16 y;
-
- direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
- FieldObjectSetRegularAnim(mapObject, sprite, sub_8093514(direction));
- if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
- {
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
- }
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
-{
- u32 direction;
- s16 x;
- s16 y;
-
- direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction);
- x = mapObject->coords2.x;
- y = mapObject->coords2.y;
- sub_8092F88(direction, &x, &y, 2, 2);
- FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction));
- if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
- {
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
- }
- mapObject->mapobj_bit_1 = TRUE;
- sprite->data1 = 2;
- return TRUE;
-}
-
-field_object_step(CopyPlayer2, gUnknown_0850DA90)
-
-bool8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2)
- {
- return FALSE;
- }
- return gUnknown_0850DA64[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass);
-}
-
-bool8 sub_80925AC(struct MapObject *, struct Sprite *);
-
-void FieldObjectCB_TreeDisguise(struct Sprite *sprite)
-{
- struct MapObject *mapObject;
-
- mapObject = &gMapObjects[sprite->data0];
- if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data7))
- {
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
- mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE);
- mapObject->mapobj_unk_21 = 1;
- sprite->data7 ++;
- }
- FieldObjectStep(&gMapObjects[sprite->data0], sprite, sub_80925AC);
-}
-
-bool8 sub_80925AC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- return FALSE;
-}
-
-void FieldObjectCB_MountainDisguise(struct Sprite *sprite)
-{
- struct MapObject *mapObject;
-
- mapObject = &gMapObjects[sprite->data0];
- if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data7))
- {
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
- mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE);
- mapObject->mapobj_unk_21 = 1;
- sprite->data7 ++;
- }
- FieldObjectStep(&gMapObjects[sprite->data0], sprite, sub_80925AC);
-}
-
-extern bool8 (*const gUnknown_0850DA9C[])(struct MapObject *, struct Sprite *);
-bool8 sub_809268C(struct MapObject *, struct Sprite *);
-
-void FieldObjectCB_Hidden1(struct Sprite *sprite)
-{
- if (!sprite->data7)
- {
- gMapObjects[sprite->data0].mapobj_bit_26 = TRUE;
- sprite->subspriteMode = 2;
- sprite->oam.priority = 3;
- sprite->data7 ++;
- }
- FieldObjectStep(&gMapObjects[sprite->data0], sprite, sub_809268C);
-}
-
-bool8 sub_809268C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- return gUnknown_0850DA9C[sprite->data1](mapObject, sprite);
-}
-
-bool8 sub_80926AC (struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- return FALSE;
-}
-bool8 sub_80926B8 (struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- sprite->data1 = 0;
- }
- return FALSE;
-}
-
-field_object_step(WalkInPlace1, gUnknown_0850DAA0)
-
-bool8 sub_8092718(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(WalkInPlace4, gUnknown_0850DAA8)
-
-bool8 sub_8092788(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay32AnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(WalkInPlace2, gUnknown_0850DAB0)
-
-bool8 sub_80927F8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(WalkInPlace3, gUnknown_0850DAB8)
-
-bool8 sub_8092868(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
- return TRUE;
-}
-
-field_object_step(Hidden2, gUnknown_0850DAC0)
-
-bool8 sub_80928D8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_reset(mapObject, sprite);
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- mapObject->mapobj_bit_13 = TRUE;
- sprite->data1 = 1;
- return TRUE;
-}
-bool8 sub_809290C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (FieldObjectExecRegularAnim(mapObject, sprite))
- {
- sprite->data1 = 2;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_809292C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_1 = FALSE;
- return FALSE;
-}
-
-void npc_reset(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_1 = FALSE;
- mapObject->mapobj_bit_6 = FALSE;
- mapObject->mapobj_bit_7 = FALSE;
- mapObject->mapobj_unk_1C = 0xFF;
- sprite->data1 = 0;
-}
-
-#define dirn2anim(name, table)\
-extern const u8 table[4];\
-u8 name(u8 direction)\
-{\
- return table[direction];\
-}
-
-dirn2anim(FieldObjectDirectionToImageAnimId, gUnknown_0850DACC)
-dirn2anim(get_go_image_anim_num, gUnknown_0850DAD5)
-dirn2anim(get_go_fast_image_anim_num, gUnknown_0850DADE)
-dirn2anim(get_go_faster_image_anim_num, gUnknown_0850DAE7)
-dirn2anim(get_go_fastest_image_anim_num, gUnknown_0850DAF0)
-dirn2anim(sub_80929AC, gUnknown_0850DAF9)
-dirn2anim(sub_80929BC, gUnknown_0850DB02)
-dirn2anim(sub_80929CC, gUnknown_0850DB0B)
-dirn2anim(sub_80929DC, gUnknown_0850DB14)
-dirn2anim(sub_80929EC, gUnknown_0850DB1D)
-dirn2anim(sub_80929FC, gUnknown_0850DB26)
-dirn2anim(sub_8092A0C, gUnknown_0850DB2F)
-dirn2anim(sub_8092A1C, gUnknown_0850DB38)
-dirn2anim(sub_8092A2C, gUnknown_0850DB41)
-dirn2anim(get_run_image_anim_num, gUnknown_0850DB4A)
-
-// file boundary?
-
-struct UnkStruct_085094AC {
- const union AnimCmd *const *anims;
- u8 animPos[4];
-};
-
-extern const struct UnkStruct_085094AC gUnknown_085094AC[];
-
-static const struct UnkStruct_085094AC *sub_8092A4C(const union AnimCmd *const *anims)
-{
- const struct UnkStruct_085094AC *retval;
-
- for (retval = gUnknown_085094AC; retval->anims != NULL; retval ++)
- {
- if (retval->anims == anims)
- {
- return retval;
- }
- }
- return NULL;
-}
-
-void npc_apply_anim_looping(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum)
-{
- const struct UnkStruct_085094AC *unk85094AC;
-
- if (!mapObject->mapobj_bit_12)
- {
- sprite->animNum = animNum;
- unk85094AC = sub_8092A4C(sprite->anims);
- if (unk85094AC != NULL)
- {
- if (sprite->animCmdIndex == unk85094AC->animPos[0])
- {
- sprite->animCmdIndex = unk85094AC->animPos[3];
- }
- else if (sprite->animCmdIndex == unk85094AC->animPos[1])
- {
- sprite->animCmdIndex = unk85094AC->animPos[2];
- }
- }
- SeekSpriteAnim(sprite, sprite->animCmdIndex);
- }
-}
-
-void obj_npc_animation_step(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum)
-{
- const struct UnkStruct_085094AC *unk85094AC;
-
- if (!mapObject->mapobj_bit_12)
- {
- u8 animPos;
-
- sprite->animNum = animNum;
- unk85094AC = sub_8092A4C(sprite->anims);
- if (unk85094AC != NULL)
- {
- animPos = unk85094AC->animPos[1];
- if (sprite->animCmdIndex <= unk85094AC->animPos[0])
- {
- animPos = unk85094AC->animPos[0];
- }
- SeekSpriteAnim(sprite, animPos);
- }
- }
-}
-
-// file boundary?
-
-u8 sub_8092AF8(s16 x1, s16 y1, s16 x2, s16 y2)
-{
- if (x1 > x2)
- {
- return DIR_WEST;
- }
- if (x1 < x2)
- {
- return DIR_EAST;
- }
- if (y1 > y2)
- {
- return DIR_NORTH;
- }
- return DIR_SOUTH;
-}
-
-void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern)
-{
- mapObject->animPattern = animPattern;
- mapObject->mapobj_unk_21 = 0;
- mapObject->animId = 0;
- gSprites[mapObject->spriteId].callback = gUnknown_08505438[animPattern];
- gSprites[mapObject->spriteId].data1 = 0;
-}
-
-dirn2anim(npc_running_behaviour_by_direction, gUnknown_0850DB53)
-
-u8 npc_block_way__next_tile(struct MapObject *mapObject, u8 direction)
-{
- s16 x;
- s16 y;
-
- x = mapObject->coords2.x;
- y = mapObject->coords2.y;
- MoveCoords(direction, &x, &y);
- return npc_block_way(mapObject, x, y, direction);
-}
-
-u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn)
-{
- u8 direction;
-
- direction = dirn;
- if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y))
- {
- return 1;
- }
- if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction))
- {
- return 2;
- }
- if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))
- {
- return 2;
- }
- if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
- {
- return 3;
- }
- if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
- {
- return 4;
- }
- return 0;
-}
-
-u8 sub_8092C8C(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
-{
- u8 retval;
-
- retval = 0x00;
- if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y))
- {
- retval |= 1;
- }
- if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)))
- {
- retval |= 2;
- }
- if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
- {
- retval |= 4;
- }
- if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
- {
- retval |= 8;
- }
- return retval;
-}
-
-static bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y)
-{
- s16 left;
- s16 right;
- s16 top;
- s16 bottom;
-
- if (mapObject->range.as_nybbles.x != 0)
- {
- left = mapObject->coords1.x - mapObject->range.as_nybbles.x;
- right = mapObject->coords1.x + mapObject->range.as_nybbles.x;
- if (left > x || right < x)
- {
- return TRUE;
- }
- }
- if (mapObject->range.as_nybbles.y != 0)
- {
- top = mapObject->coords1.y - mapObject->range.as_nybbles.y;
- bottom = mapObject->coords1.y + mapObject->range.as_nybbles.y;
- if (top > y || bottom < y)
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
-{
- if (gUnknown_0850DB5C[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_0850DB6C[direction - 1](MapGridGetMetatileBehaviorAt(x, y)))
- {
- return TRUE;
- }
- return FALSE;
-}
-
-static bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y)
-{
- u8 i;
- struct MapObject *curObject;
-
- for (i = 0; i < NUM_FIELD_OBJECTS; i ++)
- {
- curObject = &gMapObjects[i];
- if (curObject->active && curObject != mapObject)
- {
- if ((curObject->coords2.x == x && curObject->coords2.y == y) || (curObject->coords3.x == x && curObject->coords3.y == y))
- {
- if (AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, curObject->mapobj_unk_0B_0))
- {
- return TRUE;
- }
- }
- }
- }
- return FALSE;
-}
-
-bool8 sub_8092E9C(u8 localId, u8 mapNum, u8 mapGroup)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) && gSprites[gMapObjects[mapObjectId].spriteId].data7 & 0x02)
- {
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_8092EF0(u8 localId, u8 mapNum, u8 mapGroup)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
- {
- gSprites[gMapObjects[mapObjectId].spriteId].data7 |= 0x04;
- }
-}
-
-void MoveCoords(u8 direction, s16 *x, s16 *y)
-{
- *x += gUnknown_0850DB7C[direction].x;
- *y += gUnknown_0850DB7C[direction].y;
-}
-
-void sub_8092F60(u8 direction, s16 *x, s16 *y)
-{
- *x += gUnknown_0850DB7C[direction].x << 4;
- *y += gUnknown_0850DB7C[direction].y << 4;
-}
-
-void sub_8092F88(u32 dirn, s16 *x, s16 *y, s16 dx, s16 dy)
-{
- u8 direction;
- s16 dx_2;
- s16 dy_2;
- s16 cur_x;
- s16 cur_y;
-
- direction = dirn;
- dx_2 = dx;
- dy_2 = dy;
- cur_x = gUnknown_0850DB7C[direction].x;
- if (cur_x > 0)
- {
- *x += dx_2;
- }
- if (cur_x < 0)
- {
- *x -= dx_2;
- }
- cur_y = gUnknown_0850DB7C[direction].y;
- if (cur_y > 0)
- {
- *y += dy_2;
- }
- if (cur_y < 0)
- {
- *y -= dy_2;
- }
-}
-
-void sub_8092FF0(s16 x, s16 y, s16 *dest_x, s16 *dest_y)
-{
- *dest_x = (x - gSaveBlock1Ptr->pos.x) << 4;
- *dest_y = (y - gSaveBlock1Ptr->pos.y) << 4;
- *dest_x -= gUnknown_03005DEC;
- *dest_y -= gUnknown_03005DE8;
-}
-
-void sub_8093038(s16 x, s16 y, s16 *dest_x, s16 *dest_y)
-{
- s16 dx;
- s16 dy;
-
- dx = -gUnknown_03005DEC - gUnknown_03005DD0.x;
- dy = -gUnknown_03005DE8 - gUnknown_03005DD0.y;
- if (gUnknown_03005DD0.x > 0)
- {
- dx += 0x10;
- }
- if (gUnknown_03005DD0.x < 0)
- {
- dx -= 0x10;
- }
- if (gUnknown_03005DD0.y > 0)
- {
- dy += 0x10;
- }
- if (gUnknown_03005DD0.y < 0)
- {
- dy -= 0x10;
- }
- *dest_x = ((x - gSaveBlock1Ptr->pos.x) << 4) + dx;
- *dest_y = ((y - gSaveBlock1Ptr->pos.y) << 4) + dy;
-}
-
-void sub_80930E0(s16 *x, s16 *y, s16 dx, s16 dy)
-{
- sub_8093038(*x, *y, x, y);
- *x += dx;
- *y += dy;
-}
-
-void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y)
-{
- *x = 0;
- *y = 0;
- if (gUnknown_03005DD0.x > 0)
- {
- (*x) ++;
- }
- if (gUnknown_03005DD0.x < 0)
- {
- (*x) --;
- }
- if (gUnknown_03005DD0.y > 0)
- {
- (*y) ++;
- }
- if (gUnknown_03005DD0.y < 0)
- {
- (*y) --;
- }
-}
-
-void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 dirn, s16 *x, s16 *y)
-{
- u8 direction;
-
- direction = dirn;
- *x = mapObject->coords2.x;
- *y = mapObject->coords2.y;
- MoveCoords(direction, x, y);
-}
-
-// file boundary?
-
-bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject)
-{
- if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6)
- {
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject)
-{
- if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xFF)
- {
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId)
-{
- if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject))
- {
- return TRUE;
- }
- npc_sync_anim_pause_bits(mapObject);
- mapObject->mapobj_unk_1C = specialAnimId;
- mapObject->mapobj_bit_6 = TRUE;
- mapObject->mapobj_bit_7 = FALSE;
- gSprites[mapObject->spriteId].data2 = 0;
- return FALSE;
-}
-
-void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId)
-{
- FieldObjectClearAnimIfSpecialAnimActive(mapObject);
- FieldObjectSetSpecialAnim(mapObject, specialAnimId);
-}
-
-void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject)
-{
- if (mapObject->mapobj_bit_6)
- {
- FieldObjectClearAnim(mapObject);
- }
-}
-
-void FieldObjectClearAnim(struct MapObject *mapObject)
-{
- mapObject->mapobj_unk_1C = 0xFF;
- mapObject->mapobj_bit_6 = FALSE;
- mapObject->mapobj_bit_7 = FALSE;
- gSprites[mapObject->spriteId].data1 = 0;
- gSprites[mapObject->spriteId].data2 = 0;
-}
-
-u8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject)
-{
- if (mapObject->mapobj_bit_6)
- {
- return mapObject->mapobj_bit_7;
- }
- return 0x10;
-}
-
-u8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject)
-{
- u8 specialAnimState;
-
- specialAnimState = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject);
- if (specialAnimState != 0 && specialAnimState != 16)
- {
- FieldObjectClearAnimIfSpecialAnimActive(mapObject);
- }
- return specialAnimState;
-}
-
-u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject)
-{
- if (mapObject->mapobj_bit_6)
- {
- return mapObject->mapobj_unk_1C;
- }
- return 0xFF;
-}
-
-void FieldObjectStep(struct MapObject *mapObject, struct Sprite *sprite, bool8 (*callback)(struct MapObject *, struct Sprite *))
-{
- DoGroundEffects_OnSpawn(mapObject, sprite);
- sub_80964E8(mapObject, sprite);
- if (FieldObjectIsSpecialAnimActive(mapObject))
- {
- FieldObjectExecSpecialAnim(mapObject, sprite);
- }
- else if (!mapObject->mapobj_bit_8)
- {
- while (callback(mapObject, sprite));
- }
- DoGroundEffects_OnBeginStep(mapObject, sprite);
- DoGroundEffects_OnFinishStep(mapObject, sprite);
- npc_obj_transfer_image_anim_pause_flag(mapObject, sprite);
- sub_8096518(mapObject, sprite);
- FieldObjectUpdateSubpriority(mapObject, sprite);
-}
-
-#define dirn2anim_2(name, table) \
-extern const u8 table[5]; \
-u8 name(u32 direction) \
-{ \
- u8 dirn2; \
- u8 animIds[5]; \
- dirn2 = direction; \
- memcpy(animIds, table, 5); \
- if (dirn2 > DIR_EAST) \
- { \
- dirn2 = 0; \
- } \
- return animIds[dirn2]; \
-}
-
-dirn2anim_2(GetFaceDirectionAnimId, gUnknown_0850DBA0);
-dirn2anim_2(GetSimpleGoAnimId, gUnknown_0850DBA5);
-dirn2anim_2(GetGoSpeed0AnimId, gUnknown_0850DBAA);
-dirn2anim_2(GetGoSpeed1AnimId, gUnknown_0850DBAF);
-dirn2anim_2(GetGoSpeed2AnimId, gUnknown_0850DBB4);
-dirn2anim_2(GetGoSpeed3AnimId, gUnknown_0850DBB9);
-dirn2anim_2(sub_8093438, gUnknown_0850DBBE);
-dirn2anim_2(GetRunAnimId, gUnknown_0850DBC3);
-dirn2anim_2(GetJumpLedgeAnimId, gUnknown_0850DBC8);
-dirn2anim_2(sub_80934BC, gUnknown_0850DBCD);
-dirn2anim_2(sub_80934E8, gUnknown_0850DBD2);
-dirn2anim_2(sub_8093514, gUnknown_0850DBD7);
-dirn2anim_2(sub_8093540, gUnknown_0850DBDC);
-dirn2anim_2(GetStepInPlaceDelay32AnimId, gUnknown_0850DBE1);
-dirn2anim_2(GetStepInPlaceDelay16AnimId, gUnknown_0850DBE6);
-dirn2anim_2(GetStepInPlaceDelay8AnimId, gUnknown_0850DBEB);
-dirn2anim_2(GetStepInPlaceDelay4AnimId, gUnknown_0850DBF0);
-
-bool8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction)
-{
- return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction)));
-}
-
-dirn2anim_2(sub_8093648, gUnknown_0850DBF5);
-dirn2anim_2(sub_8093674, gUnknown_0850DBFA);
-dirn2anim_2(sub_80936A0, gUnknown_0850DBFF);
-dirn2anim_2(sub_80936CC, gUnknown_0850DC04);
-dirn2anim_2(sub_80936F8, gUnknown_0850DC09);
-dirn2anim_2(sub_8093724, gUnknown_0850DC0E);
-dirn2anim_2(sub_8093750, gUnknown_0850DC13);
-dirn2anim_2(sub_809377C, gUnknown_0850DC18);
-dirn2anim_2(sub_80937A8, gUnknown_0850DC1D);
-dirn2anim_2(d2s_08064034, gUnknown_0850DC22);
-
-extern const u8 gUnknown_0850DC27[8];
-
-u8 GetOppositeDirection(u8 direction)
-{
- u8 directions[sizeof gUnknown_0850DC27];
-
- memcpy(directions, gUnknown_0850DC27, sizeof gUnknown_0850DC27);
- if (direction < 1 || direction > (sizeof gUnknown_0850DC27))
- {
- return direction;
- }
- return directions[direction - 1];
-}
-
-static u32 zffu_offset_calc(u8 a0, u8 a1)
-{
- return gUnknown_0850DC2F[a0 - 1][a1 - 1];
-}
-
-static u32 state_to_direction(u8 a0, u32 a1, u32 a2)
-{
- u32 zffuOffset;
- u8 a1_2;
- u8 a2_2;
-
- a1_2 = a1;
- a2_2 = a2;
- if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST)
- {
- return 0;
- }
- zffuOffset = zffu_offset_calc(a1_2, a2);
- return gUnknown_0850DC3F[a0 - 1][zffuOffset - 1];
-}
-
-static void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
- {
- mapObject->mapobj_bit_7 = TRUE;
- }
-}
-
-bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
- {
- mapObject->mapobj_unk_1C = 0xFF;
- sprite->data2 = 0;
- return TRUE;
- }
- return FALSE;
-}
-
-void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId)
-{
- mapObject->mapobj_unk_1C = animId;
- sprite->data2 = 0;
-}
-
-// file boundary?
-
-void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
-{
- FieldObjectSetDirection(mapObject, direction);
- npc_coords_shift_still(mapObject);
- obj_npc_animation_step(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
- sprite->animPaused = TRUE;
- sprite->data2 = 1;
-}
-
-bool8 sub_8093950(struct MapObject *mapObject, struct Sprite *sprite)
-{
- an_look_any(mapObject, sprite, DIR_SOUTH);
- return TRUE;
-}
-
-bool8 sub_8093960(struct MapObject *mapObject, struct Sprite *sprite)
-{
- an_look_any(mapObject, sprite, DIR_NORTH);
- return TRUE;
-}
-
-bool8 sub_8093970(struct MapObject *mapObject, struct Sprite *sprite)
-{
- an_look_any(mapObject, sprite, DIR_WEST);
- return TRUE;
-}
-
-bool8 sub_8093980(struct MapObject *mapObject, struct Sprite *sprite)
-{
- an_look_any(mapObject, sprite, DIR_EAST);
- return TRUE;
-}
-
-void npc_apply_direction(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed)
-{
- s16 x;
- s16 y;
-
- x = mapObject->coords2.x;
- y = mapObject->coords2.y;
- FieldObjectSetDirection(mapObject, direction);
- MoveCoords(direction, &x, &y);
- npc_coords_shift(mapObject, x, y);
- oamt_npc_ministep_reset(sprite, direction, speed);
- sprite->animPaused = FALSE;
- if (gUnknown_020375B8 != NULL && sub_8097F78(mapObject) != 0x10)
- {
- sprite->animPaused = TRUE;
- }
- mapObject->mapobj_bit_2 = TRUE;
- sprite->data2 = 1;
-}
-
-void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed)
-{
- u8 (*functions[ARRAY_COUNT(gUnknown_0850DEE8)])(u8);
-
- memcpy(functions, gUnknown_0850DEE8, sizeof gUnknown_0850DEE8);
- npc_apply_direction(mapObject, sprite, direction, speed);
- npc_apply_anim_looping(mapObject, sprite, functions[speed](mapObject->mapobj_unk_18));
-}
-
-void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
-{
- npc_apply_direction(mapObject, sprite, direction, 1);
- npc_apply_anim_looping(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18));
-}
-
-bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (obj_npc_ministep(sprite))
- {
- npc_coords_shift_still(mapObject);
- mapObject->mapobj_bit_3 = TRUE;
- sprite->animPaused = TRUE;
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_8093AF0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
-{
- s16 x;
- s16 y;
-
- x = mapObject->coords2.x;
- y = mapObject->coords2.y;
- FieldObjectSetDirection(mapObject, direction);
- MoveCoords(direction, &x, &y);
- npc_coords_shift(mapObject, x, y);
- sub_80976DC(sprite, direction);
- sprite->animPaused = FALSE;
- mapObject->mapobj_bit_2 = TRUE;
- sprite->data2 = 1;
-}
-
-void sub_8093B60(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
-{
- sub_8093AF0(mapObject, sprite, direction);
- npc_apply_anim_looping(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
-}
-
-bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_80976EC(sprite))
- {
- npc_coords_shift_still(mapObject);
- mapObject->mapobj_bit_3 = TRUE;
- sprite->animPaused = TRUE;
- return TRUE;
- }
- return FALSE;
-}
-
-#define an_walk_any_2_macro(name, fn1, fn2, ...) \
-bool8 name##_2(struct MapObject *, struct Sprite *);\
-bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- fn1(mapObject, sprite, __VA_ARGS__);\
- return name##_2(mapObject, sprite);\
-}\
-bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- if (fn2(mapObject, sprite))\
- {\
- sprite->data2 = 2;\
- return TRUE;\
- }\
- return FALSE;\
-}
-
-an_walk_any_2_macro(sub_8093BC4, sub_8093B60, an_walk_any_2, 7)
-an_walk_any_2_macro(sub_8093C04, sub_8093B60, an_walk_any_2, 8)
-an_walk_any_2_macro(sub_8093C44, sub_8093B60, an_walk_any_2, 5)
-an_walk_any_2_macro(sub_8093C84, sub_8093B60, an_walk_any_2, 6)
-an_walk_any_2_macro(sub_8093CC4, sub_8093B60, an_walk_any_2, 1)
-an_walk_any_2_macro(sub_8093D04, sub_8093B60, an_walk_any_2, 2)
-an_walk_any_2_macro(sub_8093D44, sub_8093B60, an_walk_any_2, 3)
-an_walk_any_2_macro(sub_8093D84, sub_8093B60, an_walk_any_2, 4)
-an_walk_any_2_macro(sub_8093DC4, do_go_anim, npc_obj_ministep_stop_on_arrival, 7, 0)
-an_walk_any_2_macro(sub_8093E04, do_go_anim, npc_obj_ministep_stop_on_arrival, 8, 0)
-an_walk_any_2_macro(sub_8093E44, do_go_anim, npc_obj_ministep_stop_on_arrival, 5, 0)
-an_walk_any_2_macro(sub_8093E84, do_go_anim, npc_obj_ministep_stop_on_arrival, 6, 0)
-an_walk_any_2_macro(sub_8093EC4, do_go_anim, npc_obj_ministep_stop_on_arrival, 1, 0)
-an_walk_any_2_macro(sub_8093F04, do_go_anim, npc_obj_ministep_stop_on_arrival, 2, 0)
-an_walk_any_2_macro(sub_8093F44, do_go_anim, npc_obj_ministep_stop_on_arrival, 3, 0)
-an_walk_any_2_macro(sub_8093F84, do_go_anim, npc_obj_ministep_stop_on_arrival, 4, 0)
-
-void sub_8093FC4(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a5)
-{
- s16 displacements[ARRAY_COUNT(gUnknown_0850DFBC)];
- s16 x;
- s16 y;
-
- memcpy(displacements, gUnknown_0850DFBC, sizeof gUnknown_0850DFBC);
- x = 0;
- y = 0;
- FieldObjectSetDirection(mapObject, direction);
- sub_8092F88(direction, &x, &y, displacements[speed], displacements[speed]);
- npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
- sub_809783C(sprite, direction, speed, a5);
- sprite->data2 = 1;
- sprite->animPaused = 0;
- mapObject->mapobj_bit_2 = 1;
- mapObject->mapobj_bit_4 = 1;
-}
-
-void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4)
-{
- sub_8093FC4(mapObject, sprite, direction, speed, a4);
- npc_apply_anim_looping(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
- DoShadowFieldEffect(mapObject);
-}
-
-u8 sub_80940C4(struct MapObject *mapObject, struct Sprite *sprite, u8 callback(struct Sprite *))
-{
- s16 displacements[ARRAY_COUNT(gUnknown_0850DFC2)];
- s16 x;
- s16 y;
- u8 result;
-
- memcpy(displacements, gUnknown_0850DFC2, sizeof gUnknown_0850DFC2);
- result = callback(sprite);
- if (result == 1 && displacements[sprite->data4] != 0)
- {
- x = 0;
- y = 0;
- sub_8092F88(mapObject->placeholder18, &x, &y, displacements[sprite->data4], displacements[sprite->data4]);
- npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
- mapObject->mapobj_bit_2 = TRUE;
- mapObject->mapobj_bit_4 = TRUE;
- }
- else if (result == 0xFF)
- {
- npc_coords_shift_still(mapObject);
- mapObject->mapobj_bit_3 = TRUE;
- mapObject->mapobj_bit_5 = TRUE;
- sprite->animPaused = TRUE;
- }
- return result;
-}
-
-u8 sub_8094188(struct MapObject *mapObject, struct Sprite *sprite)
-{
- return sub_80940C4(mapObject, sprite, sub_809785C);
-}
-
-u8 sub_809419C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- return sub_80940C4(mapObject, sprite, sub_80978E4);
-}
-
-bool8 sub_80941B0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_8094188(mapObject, sprite) == 0xFF)
- {
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_80941C8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_809419C(mapObject, sprite) == 0xFF)
- {
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_80941E0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- switch (sub_8094188(mapObject, sprite))
- {
- case 255:
- return TRUE;
- case 1:
- FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18));
- obj_npc_animation_step(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
- default:
- return FALSE;
- }
-}
-
-#define maybe_shadow_1_macro(name, fn1, fn2, ...) \
-bool8 name##_2(struct MapObject *, struct Sprite *);\
-bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- fn1(mapObject, sprite, __VA_ARGS__);\
- return name##_2(mapObject, sprite);\
-}\
-bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- if (fn2(mapObject, sprite))\
- {\
- mapObject->mapobj_bit_22 = FALSE;\
- sprite->data2 = 2;\
- return TRUE;\
- }\
- return FALSE;\
-}
-
-maybe_shadow_1_macro(sub_8094230, maybe_shadow_1, sub_80941B0, DIR_SOUTH, 2, 0)
-maybe_shadow_1_macro(sub_8094288, maybe_shadow_1, sub_80941B0, DIR_NORTH, 2, 0)
-maybe_shadow_1_macro(sub_80942E0, maybe_shadow_1, sub_80941B0, DIR_WEST, 2, 0)
-maybe_shadow_1_macro(sub_8094338, maybe_shadow_1, sub_80941B0, DIR_EAST, 2, 0)
-
-void sub_8094390(struct Sprite *sprite, u16 duration)
-{
- sprite->data2 = 1;
- sprite->data3 = duration;
-}
-
-bool8 sub_8094398(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (-- sprite->data3 == 0)
- {
- sprite->data2 = 2;
- return TRUE;
- }
- return FALSE;
-}
-
-#define special_anim_with_timer(name, duration)\
-bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- sub_8094390(sprite, duration);\
- return sub_8094398(mapObject, sprite);\
-}
-
-special_anim_with_timer(sub_80943B4, 1)
-special_anim_with_timer(sub_80943D4, 2)
-special_anim_with_timer(sub_80943F4, 4)
-special_anim_with_timer(sub_8094414, 8)
-special_anim_with_timer(sub_8094434, 16)
-
-an_walk_any_2_macro(sub_8094454, do_go_anim, npc_obj_ministep_stop_on_arrival, 1, 1)
-an_walk_any_2_macro(sub_8094494, do_go_anim, npc_obj_ministep_stop_on_arrival, 2, 1)
-an_walk_any_2_macro(sub_80944D4, do_go_anim, npc_obj_ministep_stop_on_arrival, 3, 1)
-an_walk_any_2_macro(sub_8094514, do_go_anim, npc_obj_ministep_stop_on_arrival, 4, 1)
-
-void sub_8094554(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration)
-{
- FieldObjectSetDirection(mapObject, direction);
- npc_apply_anim_looping(mapObject, sprite, animNum);
- sprite->animPaused = FALSE;
- sprite->data2 = 1;
- sprite->data3 = duration;
-}
-
-bool8 sub_809459C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (-- sprite->data3 == 0)
- {
- sprite->data2 = 2;
- sprite->animPaused = TRUE;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_80945C4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sprite->data3 & 1)
- {
- sprite->animDelayCounter ++;
- }
- return sub_809459C(mapObject, sprite);
-}
-
-#define special_anim_with_timer_2(name, direction, images, duration, timer) \
-bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- u8 animId;\
- animId = images(DIR_##direction);\
- sub_8094554(mapObject, sprite, DIR_##direction, animId, duration);\
- return timer(mapObject, sprite);\
-}
-
-special_anim_with_timer_2(sub_8094600, SOUTH, get_go_image_anim_num, 32, sub_80945C4)
-special_anim_with_timer_2(sub_8094638, NORTH, get_go_image_anim_num, 32, sub_80945C4)
-special_anim_with_timer_2(sub_8094670, WEST, get_go_image_anim_num, 32, sub_80945C4)
-special_anim_with_timer_2(sub_80946A8, EAST, get_go_image_anim_num, 32, sub_80945C4)
-special_anim_with_timer_2(sub_80946E0, SOUTH, get_go_image_anim_num, 16, sub_809459C)
-special_anim_with_timer_2(sub_8094718, NORTH, get_go_image_anim_num, 16, sub_809459C)
-special_anim_with_timer_2(sub_8094750, WEST, get_go_image_anim_num, 16, sub_809459C)
-special_anim_with_timer_2(sub_8094788, EAST, get_go_image_anim_num, 16, sub_809459C)
-special_anim_with_timer_2(sub_80947C0, SOUTH, get_go_fast_image_anim_num, 8, sub_809459C)
-special_anim_with_timer_2(sub_80947F8, NORTH, get_go_fast_image_anim_num, 8, sub_809459C)
-special_anim_with_timer_2(sub_8094830, WEST, get_go_fast_image_anim_num, 8, sub_809459C)
-special_anim_with_timer_2(sub_8094868, EAST, get_go_fast_image_anim_num, 8, sub_809459C)
-special_anim_with_timer_2(sub_80948A0, SOUTH, get_go_faster_image_anim_num, 4, sub_809459C)
-special_anim_with_timer_2(sub_80948D8, NORTH, get_go_faster_image_anim_num, 4, sub_809459C)
-special_anim_with_timer_2(sub_8094910, WEST, get_go_faster_image_anim_num, 4, sub_809459C)
-special_anim_with_timer_2(sub_8094948, EAST, get_go_faster_image_anim_num, 4, sub_809459C)
-
-an_walk_any_2_macro(sub_8094980, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 2)
-an_walk_any_2_macro(sub_80949C0, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 2)
-an_walk_any_2_macro(sub_8094A00, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST, 2)
-an_walk_any_2_macro(sub_8094A40, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST, 2)
-an_walk_any_2_macro(sub_8094A80, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 3)
-an_walk_any_2_macro(sub_8094AC0, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 3)
-an_walk_any_2_macro(sub_8094B00, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST, 3)
-an_walk_any_2_macro(sub_8094B40, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST, 3)
-an_walk_any_2_macro(sub_8094B80, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 4)
-an_walk_any_2_macro(sub_8094BC0, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 4)
-an_walk_any_2_macro(sub_8094C00, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST, 4)
-an_walk_any_2_macro(sub_8094C40, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST, 4)
-an_walk_any_2_macro(sub_8094C80, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH)
-an_walk_any_2_macro(sub_8094CC0, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH)
-an_walk_any_2_macro(sub_8094D00, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST)
-an_walk_any_2_macro(sub_8094D40, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST)
-
-void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum)
-{
- obj_anim_image_set_and_seek(sprite, animNum, 0);
- FieldObjectSetDirection(mapObject, direction);
- sprite->data2 = 1;
-}
-
-bool8 sub_8094DAC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum);
- return FALSE;
-}
-
-bool8 sub_8094DC4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_80979BC(sprite))
- {
- sprite->data2 = 2;
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_8094DE4(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
-{
- sub_8093FC4(mapObject, sprite, direction, 1, 0);
- StartSpriteAnim(sprite, sub_80929AC(direction));
-}
-
-#define unk_macro_8094E18(name, direction)\
-bool8 name##_2(struct MapObject *, struct Sprite *);\
-bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- sub_8094DE4(mapObject, sprite, direction);\
- return name##_2(mapObject, sprite);\
-}\
-bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- if (sub_80941C8(mapObject, sprite))\
- {\
- sprite->data2 = 2;\
- mapObject->mapobj_bit_5 = FALSE;\
- return TRUE;\
- }\
- return FALSE;\
-}
-
-unk_macro_8094E18(sub_8094E18, DIR_SOUTH)
-unk_macro_8094E18(sub_8094E60, DIR_NORTH)
-unk_macro_8094E18(sub_8094EB8, DIR_WEST)
-unk_macro_8094E18(sub_8094710, DIR_EAST)
-
-bool8 sub_8094F38(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0, &mapObjectId))
- {
- an_look_any(mapObject, sprite, sub_8092AF8(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[mapObjectId].coords2.x, gMapObjects[mapObjectId].coords2.y));
- }
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8094F94(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u8 mapObjectId;
-
- if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0, &mapObjectId))
- {
- an_look_any(mapObject, sprite, GetOppositeDirection(sub_8092AF8(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[mapObjectId].coords2.x, gMapObjects[mapObjectId].coords2.y)));
- }
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8094FF8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_9 = TRUE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8095008(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_9 = FALSE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-maybe_shadow_1_macro(sub_8095018, maybe_shadow_1, sub_80941B0, DIR_SOUTH, 1, 2)
-maybe_shadow_1_macro(sub_8095070, maybe_shadow_1, sub_80941B0, DIR_NORTH, 1, 2)
-maybe_shadow_1_macro(sub_80950C8, maybe_shadow_1, sub_80941B0, DIR_WEST, 1, 2)
-maybe_shadow_1_macro(sub_8095120, maybe_shadow_1, sub_80941B0, DIR_EAST, 1, 2)
-maybe_shadow_1_macro(sub_8095178, maybe_shadow_1, sub_80941B0, DIR_SOUTH, 0, 0)
-maybe_shadow_1_macro(sub_80951D0, maybe_shadow_1, sub_80941B0, DIR_NORTH, 0, 0)
-maybe_shadow_1_macro(sub_8095228, maybe_shadow_1, sub_80941B0, DIR_WEST, 0, 0)
-maybe_shadow_1_macro(sub_8095280, maybe_shadow_1, sub_80941B0, DIR_EAST, 0, 0)
-maybe_shadow_1_macro(sub_80952D8, maybe_shadow_1, sub_80941E0, DIR_SOUTH, 0, 2)
-maybe_shadow_1_macro(sub_8095330, maybe_shadow_1, sub_80941E0, DIR_NORTH, 0, 2)
-maybe_shadow_1_macro(sub_8095388, maybe_shadow_1, sub_80941E0, DIR_WEST, 0, 2)
-maybe_shadow_1_macro(sub_80953E0, maybe_shadow_1, sub_80941E0, DIR_EAST, 0, 2)
-
-bool8 sub_8095438(struct MapObject *mapObject, struct Sprite *sprite)
-{
- an_look_any(mapObject, sprite, gUnknown_085055CD[mapObject->animPattern]);
- return TRUE;
-}
-
-bool8 sub_8095450(struct MapObject *mapObject, struct Sprite *sprite)
-{
- npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14);
- return FALSE;
-}
-
-bool8 sub_8095460(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_25 = FALSE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8095470(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_25 = TRUE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8095480(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_12 = TRUE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8095490(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_80954BC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_13 = TRUE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_80954CC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_13 = FALSE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
- FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1);
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
- FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2);
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
- FieldEffectStart(FLDEFF_HEART_ICON);
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8095548(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (mapObject->animPattern == 0x3F)
- {
- sub_80B4578(mapObject);
- return FALSE;
- }
- if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A)
- {
- sprite->data2 = 2;
- return TRUE;
- }
- sub_8155D78(mapObject);
- sprite->data2 = 1;
- return sub_809558C(mapObject, sprite);
-}
-
-bool8 sub_809558C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_8155DA0(mapObject))
- {
- sprite->data2 = 2;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_80955AC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- obj_anim_image_set_and_seek(sprite, 1, 0);
- sprite->data2 = 1;
- return FALSE;
-}
-
-bool8 sub_80955C8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_80979BC(sprite))
- {
- SetFieldObjectStepTimer(sprite, 32);
- sprite->data2 = 2;
- }
- return FALSE;
-}
-
-bool8 sub_80955EC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_13 ^= TRUE;
- if (RunFieldObjectStepTimer(sprite))
- {
- mapObject->mapobj_bit_13 = TRUE;
- sprite->data2 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_8095628(struct MapObject *mapObject, struct Sprite *sprite)
-{
- obj_anim_image_set_and_seek(sprite, 1, 0);
- sprite->data2 = 1;
- return FALSE;
-}
-
-bool8 sub_8095644(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_80979BC(sprite))
- {
- SetFieldObjectStepTimer(sprite, 32);
- sprite->data2 = 2;
- }
- return FALSE;
-}
-
-bool8 sub_8095668(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_13 ^= TRUE;
- if (RunFieldObjectStepTimer(sprite))
- {
- mapObject->mapobj_bit_13 = TRUE;
- sprite->data2 = 3;
- }
- return FALSE;
-}
-
-bool8 sub_80956A4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_26 = TRUE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_80956B4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_26 = FALSE;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_80956C4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->oam.affineMode = 3;
- InitSpriteAffineAnim(sprite);
- sprite->affineAnimPaused = TRUE;
- sprite->subspriteMode = 0;
- return TRUE;
-}
-
-bool8 sub_80956F4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- FreeOamMatrix(sprite->oam.matrixNum);
- sprite->oam.affineMode = 0;
- CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
- return TRUE;
-}
-
-bool8 sub_8095724(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_27 = TRUE;
- return TRUE;
-}
-
-bool8 sub_8095730(struct MapObject *mapObject, struct Sprite *sprite)
-{
- mapObject->mapobj_bit_27 = FALSE;
- return TRUE;
-}
-
-#define affine_an_walk_any_2_macro(name, fn, fn2, action, anim, ...)\
-bool8 name##_2(struct MapObject *, struct Sprite *);\
-bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- fn(mapObject, sprite, __VA_ARGS__);\
- sprite->affineAnimPaused = FALSE;\
- action(sprite, anim);\
- return name##_2(mapObject, sprite);\
-}\
-bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- if (fn2(mapObject, sprite))\
- {\
- sprite->affineAnimPaused = TRUE;\
- sprite->data2 = 2;\
- return TRUE;\
- }\
- return FALSE;\
-}\
-
-affine_an_walk_any_2_macro(sub_8095740, sub_8093B60, an_walk_any_2, StartSpriteAffineAnimIfDifferent, 0, DIR_SOUTH)
-affine_an_walk_any_2_macro(sub_80957A0, sub_8093B60, an_walk_any_2, ChangeSpriteAffineAnimIfDifferent, 1, DIR_SOUTH)
-affine_an_walk_any_2_macro(sub_8095800, do_go_anim, npc_obj_ministep_stop_on_arrival, ChangeSpriteAffineAnimIfDifferent, 2, DIR_WEST, 1)
-affine_an_walk_any_2_macro(sub_8095860, do_go_anim, npc_obj_ministep_stop_on_arrival, ChangeSpriteAffineAnimIfDifferent, 3, DIR_EAST, 1)
-
-static void sub_80958C0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
-{
- FieldObjectSetDirection(mapObject, direction);
- npc_coords_shift_still(mapObject);
- obj_npc_animation_step(mapObject, sprite, sub_80929FC(direction));
- sprite->animPaused = TRUE;
- sprite->data2 = 1;
-}
-
-bool8 sub_8095900(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_80958C0(mapObject, sprite, DIR_SOUTH);
- return TRUE;
-}
-
-bool8 sub_8095910(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_80958C0(mapObject, sprite, DIR_NORTH);
- return TRUE;
-}
-
-bool8 sub_8095920(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_80958C0(mapObject, sprite, DIR_WEST);
- return TRUE;
-}
-
-bool8 sub_8095930(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_80958C0(mapObject, sprite, DIR_EAST);
- return TRUE;
-}
-
-#define set_dirn_and_anim__an_proceed(name, direction, anims)\
-bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\
-{\
- npc_set_direction_and_anim__an_proceed(mapObject, sprite, direction, anims(direction));\
- return FALSE;\
-}
-
-set_dirn_and_anim__an_proceed(sub_8095940, DIR_SOUTH, sub_80929BC)
-set_dirn_and_anim__an_proceed(sub_8095964, DIR_NORTH, sub_80929BC)
-set_dirn_and_anim__an_proceed(sub_8095988, DIR_WEST, sub_80929BC)
-set_dirn_and_anim__an_proceed(sub_80959AC, DIR_EAST, sub_80929BC)
-set_dirn_and_anim__an_proceed(sub_80959D0, DIR_SOUTH, sub_80929DC)
-set_dirn_and_anim__an_proceed(sub_80959F4, DIR_NORTH, sub_80929DC)
-set_dirn_and_anim__an_proceed(sub_8095A18, DIR_WEST, sub_80929DC)
-set_dirn_and_anim__an_proceed(sub_8095A3C, DIR_EAST, sub_80929DC)
-set_dirn_and_anim__an_proceed(sub_8095A60, DIR_SOUTH, sub_80929EC)
-set_dirn_and_anim__an_proceed(sub_8095A84, DIR_NORTH, sub_80929EC)
-set_dirn_and_anim__an_proceed(sub_8095AA8, DIR_WEST, sub_80929EC)
-set_dirn_and_anim__an_proceed(sub_8095ACC, DIR_EAST, sub_80929EC)
-
-void sub_8095AF0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_8097750(sprite);
- sprite->animPaused = FALSE;
-}
-
-bool8 sub_8095B0C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_8097758(sprite))
- {
- npc_coords_shift_still(mapObject);
- mapObject->mapobj_bit_3 = TRUE;
- sprite->animPaused = TRUE;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_8095B44(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_8095AF0(mapObject, sprite);
- sprite->data2 = 1;
- return sub_8095B64(mapObject, sprite);
-}
-
-bool8 sub_8095B64(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sub_8095B0C(mapObject, sprite))
- {
- sprite->data2 = 2;
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_8095B84(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4)
-{
- sub_8093FC4(mapObject, sprite, direction, speed, a4);
- StartSpriteAnimIfDifferent(sprite, sub_80929BC(direction));
- DoShadowFieldEffect(mapObject);
-}
-
-maybe_shadow_1_macro(sub_8095BC8, sub_8095B84, sub_80941B0, DIR_SOUTH, 0, 1)
-maybe_shadow_1_macro(sub_8095C20, sub_8095B84, sub_80941B0, DIR_NORTH, 0, 1)
-maybe_shadow_1_macro(sub_8095C78, sub_8095B84, sub_80941B0, DIR_WEST, 0, 1)
-maybe_shadow_1_macro(sub_8095CD0, sub_8095B84, sub_80941B0, DIR_EAST, 0, 1)
-maybe_shadow_1_macro(sub_8095D28, sub_8095B84, sub_80941B0, DIR_SOUTH, 1, 1)
-maybe_shadow_1_macro(sub_8095D80, sub_8095B84, sub_80941B0, DIR_NORTH, 1, 1)
-maybe_shadow_1_macro(sub_8095DD8, sub_8095B84, sub_80941B0, DIR_WEST, 1, 1)
-maybe_shadow_1_macro(sub_8095E30, sub_8095B84, sub_80941B0, DIR_EAST, 1, 1)
-maybe_shadow_1_macro(sub_8095E88, sub_8095B84, sub_80941B0, DIR_SOUTH, 2, 0)
-maybe_shadow_1_macro(sub_8095EE0, sub_8095B84, sub_80941B0, DIR_NORTH, 2, 0)
-maybe_shadow_1_macro(sub_8095F38, sub_8095B84, sub_80941B0, DIR_WEST, 2, 0)
-maybe_shadow_1_macro(sub_8095F90, sub_8095B84, sub_80941B0, DIR_EAST, 2, 0)
-
-special_anim_with_timer_2(sub_8095FE8, SOUTH, sub_80929FC, 8, sub_809459C)
-special_anim_with_timer_2(sub_8096020, NORTH, sub_80929FC, 8, sub_809459C)
-special_anim_with_timer_2(sub_8096058, WEST, sub_80929FC, 8, sub_809459C)
-special_anim_with_timer_2(sub_8096090, EAST, sub_80929FC, 8, sub_809459C)
-
-void sub_80960C8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed)
-{
- npc_apply_direction(mapObject, sprite, direction, speed);
- StartSpriteAnim(sprite, sub_80929BC(mapObject->mapobj_unk_18));
- SeekSpriteAnim(sprite, 0);
-}
-
-an_walk_any_2_macro(sub_8096100, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 1)
-an_walk_any_2_macro(sub_8096140, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 1)
-an_walk_any_2_macro(sub_8096180, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_WEST, 1)
-an_walk_any_2_macro(sub_80961C0, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_EAST, 1)
-
-void sub_8096200(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed)
-{
- npc_apply_direction(mapObject, sprite, direction, speed);
- npc_apply_anim_looping(mapObject, sprite, sub_80929FC(mapObject->mapobj_unk_18));
-}
-
-an_walk_any_2_macro(sub_8096230, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 1)
-an_walk_any_2_macro(sub_8096270, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 1)
-an_walk_any_2_macro(sub_80962B0, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_WEST, 1)
-an_walk_any_2_macro(sub_80962F0, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_EAST, 1)
-
-void sub_8096330(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed)
-{
- npc_apply_direction(mapObject, sprite, direction, speed);
- StartSpriteAnim(sprite, sub_80929DC(mapObject->mapobj_unk_18));
- SeekSpriteAnim(sprite, 0);
-}
-an_walk_any_2_macro(sub_8096368, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 1)
-an_walk_any_2_macro(sub_80963A8, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 1)
-an_walk_any_2_macro(sub_80963E8, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_WEST, 1)
-an_walk_any_2_macro(sub_8096428, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_EAST, 1)
-
-bool8 sub_8096468(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_8097FA4(mapObject);
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_809647C(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_8098044(mapObject->mapobj_unk_1B);
- sprite->pos2.y = 0;
- sprite->data2 = 1;
- return TRUE;
-}
-
-bool8 sub_8096494(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (sprite->pos2.y == 0)
- {
- sub_8098044(mapObject->mapobj_unk_1B);
- sprite->data2 = 1;
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 sub_80964B8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- return TRUE;
-}
-
-bool8 sub_80964BC(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->animPaused = TRUE;
- return TRUE;
-}
-
-void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (mapObject->mapobj_bit_10)
- {
- sprite->animPaused = TRUE;
- }
-}
-
-void sub_80964E8(struct MapObject *mapObject, struct Sprite *sprite)
-{
- if (mapObject->mapobj_bit_11)
- {
- sprite->animPaused = FALSE;
- mapObject->mapobj_bit_10 = FALSE;
- mapObject->mapobj_bit_11 = FALSE;
- }
-}
-
-void sub_8096518(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sub_8096530(mapObject, sprite);
- npc_update_obj_anim_flag(mapObject, sprite);
-}
-
-static void sub_8096530(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u16 x;
- u16 y;
- u16 x2;
- u16 y2;
- const struct MapObjectGraphicsInfo *graphicsInfo;
-
- mapObject->mapobj_bit_14 = FALSE;
- graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
- if (sprite->coordOffsetEnabled)
- {
- x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
- y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
- }
- else
- {
- x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
- y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
- }
- x2 = graphicsInfo->width;
- x2 += x;
- y2 = y;
- y2 += graphicsInfo->height;
- if ((s16)x >= 0x100 || (s16)x2 < -0x10)
- {
- mapObject->mapobj_bit_14 = TRUE;
- }
- if ((s16)y >= 0xB0 || (s16)y2 < -0x10)
- {
- mapObject->mapobj_bit_14 = TRUE;
- }
-}
-
-static void npc_update_obj_anim_flag(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->invisible = FALSE;
- if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14)
- {
- sprite->invisible = TRUE;
- }
-}
diff --git a/src/field_message_box.c b/src/field_message_box.c
new file mode 100755
index 000000000..8ca291e33
--- /dev/null
+++ b/src/field_message_box.c
@@ -0,0 +1,155 @@
+#include "global.h"
+#include "menu.h"
+#include "string.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "battle_frontier_1.h"
+
+EWRAM_DATA u8 gUnknown_020375BC = 0;
+
+void textbox_fdecode_auto_and_task_add(u8*, int);
+void textbox_auto_and_task_add(void);
+
+void sub_8098128(void)
+{
+ gUnknown_020375BC = 0;
+ gTextFlags.flag_0 = 0;
+ gTextFlags.flag_1 = 0;
+ gTextFlags.flag_2 = 0;
+ gTextFlags.flag_3 = 0;
+}
+
+void sub_8098154(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_81973A4();
+ task->data[0]++;
+ break;
+ case 1:
+ NewMenuHelpers_DrawDialogueFrame(0, 1);
+ task->data[0]++;
+ break;
+ case 2:
+ if (sub_8197224() != 1)
+ {
+ gUnknown_020375BC = 0;
+ DestroyTask(taskId);
+ }
+ }
+}
+
+void task_add_textbox(void)
+{
+ CreateTask(sub_8098154, 0x50);
+}
+
+void task_del_textbox(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_8098154);
+ if (taskId != 0xFF)
+ DestroyTask(taskId);
+}
+
+bool8 ShowFieldMessage(u8 *str)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ textbox_fdecode_auto_and_task_add(str, 1);
+ gUnknown_020375BC = 2;
+ return TRUE;
+}
+
+void sub_8098214(u8 taskId)
+{
+ if (sub_8196094() == 0)
+ {
+ gUnknown_020375BC = 0;
+ DestroyTask(taskId);
+ }
+}
+
+bool8 sub_8098238(u8 *str)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ StringExpandPlaceholders(gStringVar4, str);
+ CreateTask(sub_8098214, 0);
+ sub_8196080(str);
+ gUnknown_020375BC = 2;
+ return TRUE;
+}
+
+bool8 ShowFieldAutoScrollMessage(u8 *str)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ gUnknown_020375BC = 3;
+ textbox_fdecode_auto_and_task_add(str, 0);
+ return TRUE;
+}
+
+bool8 sub_80982A0(u8 *str)
+{
+ gUnknown_020375BC = 3;
+ textbox_fdecode_auto_and_task_add(str, 1);
+ return TRUE;
+}
+
+bool8 sub_80982B8(void)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ gUnknown_020375BC = 2;
+ textbox_auto_and_task_add();
+ return TRUE;
+}
+
+void textbox_fdecode_auto_and_task_add(u8* str, int a)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ AddTextPrinterForMessage(a);
+ task_add_textbox();
+}
+
+void textbox_auto_and_task_add(void)
+{
+ AddTextPrinterForMessage(1);
+ task_add_textbox();
+}
+
+void HideFieldMessageBox(void)
+{
+ task_del_textbox();
+ sub_8197434(0, 1);
+ gUnknown_020375BC = 0;
+}
+
+u8 textbox_any_visible(void)
+{
+ return gUnknown_020375BC;
+}
+
+bool8 IsFieldMessageBoxHidden(void)
+{
+ if (gUnknown_020375BC == 0)
+ return TRUE;
+ return FALSE;
+}
+
+void sub_8098358(void)
+{
+ task_del_textbox();
+ NewMenuHelpers_DrawStdWindowFrame(0, 1);
+ gUnknown_020375BC = 0;
+}
+
+void sub_8098374(void)
+{
+ task_del_textbox();
+ gUnknown_020375BC = 0;
+}
diff --git a/src/field_poison.c b/src/field_poison.c
new file mode 100644
index 000000000..98819c450
--- /dev/null
+++ b/src/field_poison.c
@@ -0,0 +1,148 @@
+#include "global.h"
+#include "string_util.h"
+#include "party_menu.h"
+#include "constants/species.h"
+#include "task.h"
+#include "field_message_box.h"
+#include "strings.h"
+#include "rom_818CFC8.h"
+#include "battle_frontier_2.h"
+#include "pokenav.h"
+#include "event_data.h"
+#include "script.h"
+#include "battle.h"
+#include "fldeff_80F9BCC.h"
+#include "field_poison.h"
+
+static bool32 sub_80F9568(struct Pokemon *pokemon)
+{
+ u16 species = GetMonData(pokemon, MON_DATA_SPECIES2);
+ if (species == SPECIES_NONE || species == SPECIES_EGG)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool32 sub_80F958C(void)
+{
+ int i;
+ struct Pokemon *pokemon;
+
+ for (pokemon = gPlayerParty, i = 0; i < PARTY_SIZE; i++, pokemon++)
+ {
+ if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) != 0)
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void sub_80F95C0(u8 partyIdx)
+{
+ struct Pokemon *pokemon = gPlayerParty + partyIdx;
+ unsigned int status = STATUS1_NONE;
+ AdjustFriendship(pokemon, 0x07);
+ SetMonData(pokemon, MON_DATA_STATUS, &status);
+ GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
+ StringGetEnd10(gStringVar1);
+}
+
+static bool32 sub_80F960C(u8 partyIdx)
+{
+ struct Pokemon *pokemon = gPlayerParty + partyIdx;
+ if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) == 0 && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80F9654(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ for (; data[1] < PARTY_SIZE; data[1]++)
+ {
+ if (sub_80F960C(data[1]))
+ {
+ sub_80F95C0(data[1]);
+ ShowFieldMessage(gText_PkmnFainted3);
+ data[0]++;
+ return;
+ }
+ }
+ data[0] = 2;
+ break;
+ case 1:
+ if (IsFieldMessageBoxHidden())
+ {
+ data[0]--;
+ }
+ break;
+ case 2:
+ if (sub_80F958C())
+ {
+ if (InBattlePyramid() | InBattlePike() || sub_81D5C18())
+ {
+ gSpecialVar_Result = 2;
+ }
+ else
+ {
+ gSpecialVar_Result = 1;
+ }
+ }
+ else
+ {
+ gSpecialVar_Result = 0;
+ }
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80F972C(void)
+{
+ CreateTask(sub_80F9654, 80);
+ ScriptContext1_Stop();
+}
+
+unsigned int overworld_poison(void)
+{
+ int i;
+ unsigned int hp;
+ struct Pokemon *pokemon = gPlayerParty;
+ unsigned int numPoisoned = 0;
+ unsigned int numFainted = 0;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
+ {
+ hp = GetMonData(pokemon, MON_DATA_HP);
+ if (hp == 0 || --hp == 0)
+ {
+ numFainted++;
+ }
+ SetMonData(pokemon, MON_DATA_HP, &hp);
+ numPoisoned++;
+ }
+ pokemon++;
+ }
+ if (numFainted != 0 || numPoisoned != 0)
+ {
+ overworld_poison_effect();
+ }
+ if (numFainted != 0)
+ {
+ return FLDPSN_FNT;
+ }
+ if (numPoisoned != 0)
+ {
+ return FLDPSN_PSN;
+ }
+ return FLDPSN_NONE;
+}
diff --git a/src/field_region_map.c b/src/field_region_map.c
index b7d677c90..34b6089df 100644
--- a/src/field_region_map.c
+++ b/src/field_region_map.c
@@ -89,7 +89,7 @@ static void MCB2_InitRegionMapRegisters(void)
InitBgsFromTemplates(1, gUnknown_085E5068, 2);
InitWindows(gUnknown_085E5070);
DeactivateAllTextPrinters();
- sub_809882C(0, 0x27, 0xd0);
+ LoadUserWindowBorderGfx(0, 0x27, 0xd0);
clear_scheduled_bg_copies_to_vram();
SetMainCallback2(MCB2_FieldUpdateRegionMap);
SetVBlankCallback(VBCB_FieldUpdateRegionMap);
@@ -130,7 +130,7 @@ static void FieldUpdateRegionMap(void)
schedule_bg_copy_tilemap_to_vram(0);
SetWindowBorderStyle(0, 0, 0x27, 0xd);
PrintRegionMapSecName();
- BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
sFieldRegionMapHandler->state++;
break;
case 2:
@@ -158,7 +158,7 @@ static void FieldUpdateRegionMap(void)
}
break;
case 5:
- BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
sFieldRegionMapHandler->state++;
break;
case 6:
diff --git a/src/field_special_scene.c b/src/field_special_scene.c
index f92f342eb..39977808f 100755..100644
--- a/src/field_special_scene.c
+++ b/src/field_special_scene.c
@@ -1,12 +1,12 @@
#include "global.h"
#include "task.h"
#include "sprite.h"
-#include "field_map_obj.h"
-#include "songs.h"
+#include "event_object_movement.h"
+#include "constants/songs.h"
#include "sound.h"
#include "palette.h"
#include "script.h"
-#include "vars.h"
+#include "constants/vars.h"
#include "event_data.h"
#include "main.h"
@@ -211,7 +211,7 @@ void Task_HandleTruckSequence(u8 taskId)
data[1]++;
if (data[1] == 90)
{
- PlaySE(SE_TRACK_HAIK);
+ PlaySE(SE_TRACK_HAIKI);
data[1] = 0;
data[0] = 5;
}
@@ -329,24 +329,24 @@ void Task_HandlePorthole(u8 taskId)
void sub_80FB6EC(void)
{
- u8 spriteId = AddPseudoFieldObject(0x8C, SpriteCallbackDummy, 112, 80, 0);
+ u8 spriteId = AddPseudoEventObject(0x8C, SpriteCallbackDummy, 112, 80, 0);
gSprites[spriteId].coordOffsetEnabled = FALSE;
if (VarGet(0x40B4) == 2)
{
- StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(4));
+ StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(4));
}
else
{
- StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(3));
+ StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(3));
}
}
void sub_80FB768(void)
{
sub_80FB6EC();
- gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = TRUE;
+ gEventObjects[gPlayerAvatar.eventObjectId].invisible = TRUE;
pal_fill_black();
CreateTask(Task_HandlePorthole, 80);
ScriptContext2_Enable();
diff --git a/src/field_tasks.c b/src/field_tasks.c
new file mode 100644
index 000000000..fc57585e5
--- /dev/null
+++ b/src/field_tasks.c
@@ -0,0 +1,776 @@
+#include "global.h"
+#include "task.h"
+#include "main.h"
+#include "constants/vars.h"
+#include "bike.h"
+#include "item.h"
+#include "constants/items.h"
+#include "event_data.h"
+#include "overworld.h"
+#include "clock.h"
+#include "script.h"
+#include "field_special_scene.h"
+#include "field_effect_helpers.h"
+#include "secret_base.h"
+#include "metatile_behavior.h"
+#include "fieldmap.h"
+#include "field_player_avatar.h"
+#include "field_camera.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "field_tasks.h"
+
+struct MetatileOffset
+{
+ s8 x;
+ s8 y;
+ u16 tileId;
+};
+
+// this file's functions
+static void DummyPerStepCallback(u8 taskId);
+static void PerStepCallback_8069F64(u8 taskId);
+static void PerStepCallback_8069AA0(u8 taskId);
+static void PerStepCallback_8069864(u8 taskId);
+static void PerStepCallback_8069DD4(u8 taskId);
+static void PerStepCallback_806A07C(u8 taskId);
+static void Task_MuddySlope(u8 taskId);
+
+// const rom data
+static void (*const gUnknown_08510348[])(u8) =
+{
+ DummyPerStepCallback,
+ PerStepCallback_8069F64,
+ PerStepCallback_8069AA0,
+ PerStepCallback_8069864,
+ PerStepCallback_8069DD4,
+ EndTruckSequence,
+ sub_80EA3E4,
+ PerStepCallback_806A07C
+};
+
+// they are in pairs but declared as 1D array
+static const struct MetatileOffset gUnknown_08510368[] =
+{
+ { 0, 0,0x259}, { 0, 1,0x261},
+ { 0, -1,0x259}, { 0, 0,0x261},
+ { 0, 0,0x252}, { 1, 0,0x253},
+ { -1, 0,0x252}, { 0, 0,0x253}
+};
+
+static const struct MetatileOffset gUnknown_08510388[] =
+{
+ { 0, 0,0x25A}, { 0, 1,0x262},
+ { 0, -1,0x25A}, { 0, 0,0x262},
+ { 0, 0,0x254}, { 1, 0,0x255},
+ { -1, 0,0x254}, { 0, 0,0x255}
+};
+
+static const struct MetatileOffset gUnknown_085103A8[] =
+{
+ { 0, 0,0x258}, { 0, 1,0x260},
+ { 0, -1,0x258}, { 0, 0,0x260},
+ { 0, 0,0x250}, { 1, 0,0x251},
+ { -1, 0,0x250}, { 0, 0,0x251}
+};
+
+static const u16 gUnknown_085103C8[] =
+{
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ VAR_TEMP_1,
+ VAR_TEMP_2,
+ VAR_TEMP_3,
+ VAR_TEMP_4,
+ 0,
+ 0,
+ VAR_TEMP_5,
+ VAR_TEMP_6,
+ VAR_TEMP_7,
+ 0,
+ 0,
+ VAR_TEMP_8,
+ VAR_TEMP_9,
+ VAR_TEMP_A,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+};
+
+static const u16 gUnknown_085103FC[] = {0xe8, 0xeb, 0xea, 0xe9};
+
+// code
+static void Task_RunPerStepCallback(u8 taskId)
+{
+ int idx = gTasks[taskId].data[0];
+ gUnknown_08510348[idx](taskId);
+}
+
+#define tState data[0]
+#define tAmbientCryState data[1]
+#define tAmbientCryDelay data[2]
+
+static void RunTimeBasedEvents(s16 *data)
+{
+ switch (tState)
+ {
+ case 0:
+ if (gMain.vblankCounter1 & 0x1000)
+ {
+ DoTimeBasedEvents();
+ tState++;
+ }
+ break;
+ case 1:
+ if (!(gMain.vblankCounter1 & 0x1000))
+ {
+ tState--;
+ }
+ break;
+ }
+}
+
+static void Task_RunTimeBasedEvents(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (!ScriptContext2_IsEnabled())
+ {
+ RunTimeBasedEvents(data);
+ UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay);
+ }
+}
+
+#undef tState
+#undef tAmbientCryState
+#undef tAmbientCryDelay
+
+void SetUpFieldTasks(void)
+{
+ if (!FuncIsActiveTask(Task_RunPerStepCallback))
+ {
+ u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50);
+ gTasks[taskId].data[0] = 0;
+ }
+ if (!FuncIsActiveTask(Task_MuddySlope))
+ {
+ CreateTask(Task_MuddySlope, 0x50);
+ }
+ if (!FuncIsActiveTask(Task_RunTimeBasedEvents))
+ {
+ CreateTask(Task_RunTimeBasedEvents, 0x50);
+ }
+}
+
+void ActivatePerStepCallback(u8 callbackId)
+{
+ u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback);
+ if (taskId != 0xff)
+ {
+ s32 i;
+ s16 *data = gTasks[taskId].data;
+
+ for (i = 0; i < 16; i++)
+ data[i] = 0;
+
+ if (callbackId >= ARRAY_COUNT(gUnknown_08510348))
+ {
+ data[0] = 0;
+ }
+ else
+ {
+ data[0] = callbackId;
+ }
+ }
+}
+
+void ResetFieldTasksArgs(void)
+{
+ u8 taskId;
+ s16 *data;
+
+ taskId = FindTaskIdByFunc(Task_RunPerStepCallback);
+ if (taskId != 0xff)
+ {
+ data = gTasks[taskId].data;
+ }
+ taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents);
+ if (taskId != 0xff)
+ {
+ data = gTasks[taskId].data;
+ data[1] = 0;
+ data[2] = 0;
+ }
+}
+
+static void DummyPerStepCallback(u8 taskId)
+{
+
+}
+
+static const struct MetatileOffset *sub_809DA30(const struct MetatileOffset *offsets, u16 metatileBehavior)
+{
+ if (MetatileBehavior_IsPacifilogVerticalLog1(metatileBehavior))
+ return &offsets[0 * 2];
+ else if (MetatileBehavior_IsPacifilogVerticalLog2(metatileBehavior))
+ return &offsets[1 * 2];
+ else if (MetatileBehavior_IsPacifilogHorizontalLog1(metatileBehavior))
+ return &offsets[2 * 2];
+ else if (MetatileBehavior_IsPacifilogHorizontalLog2(metatileBehavior))
+ return &offsets[3 * 2];
+ else
+ return NULL;
+}
+
+static void sub_809DA88(const struct MetatileOffset *offsets, s16 x, s16 y, bool32 flag)
+{
+ offsets = sub_809DA30(offsets, MapGridGetMetatileBehaviorAt(x, y));
+
+ if (offsets != NULL)
+ {
+ MapGridSetMetatileIdAt(x + offsets[0].x, y + offsets[0].y, offsets[0].tileId);
+ if (flag)
+ CurrentMapDrawMetatileAt(x + offsets[0].x, y + offsets[0].y);
+
+ MapGridSetMetatileIdAt(x + offsets[1].x, y + offsets[1].y, offsets[1].tileId);
+ if (flag)
+ CurrentMapDrawMetatileAt(x + offsets[1].x, y + offsets[1].y);
+ }
+}
+
+static void sub_809DB10(s16 x, s16 y, bool32 flag)
+{
+ sub_809DA88(gUnknown_08510368, x, y, flag);
+}
+
+static void sub_809DB34(s16 x, s16 y, bool32 flag)
+{
+ sub_809DA88(gUnknown_08510388, x, y, flag);
+}
+
+static void sub_809DB58(s16 x, s16 y, bool32 flag)
+{
+ sub_809DA88(gUnknown_085103A8, x, y, flag);
+}
+
+static bool32 sub_809DB7C(s16 x1, s16 y1, s16 x2, s16 y2)
+{
+ u16 metatileBehavior = MapGridGetMetatileBehaviorAt(x2, y2);
+
+ if (MetatileBehavior_IsPacifilogVerticalLog1(metatileBehavior))
+ {
+ if (y1 > y2)
+ return FALSE;
+ }
+ else if (MetatileBehavior_IsPacifilogVerticalLog2(metatileBehavior))
+ {
+ if (y1 < y2)
+ return FALSE;
+ }
+ else if (MetatileBehavior_IsPacifilogHorizontalLog1(metatileBehavior))
+ {
+ if (x1 > x2)
+ return FALSE;
+ }
+ else if (MetatileBehavior_IsPacifilogHorizontalLog2(metatileBehavior))
+ {
+ if (x1 < x2)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool32 sub_809DC18(s16 x1, s16 y1, s16 x2, s16 y2)
+{
+ u16 metatileBehavior = MapGridGetMetatileBehaviorAt(x1, y1);
+
+ if (MetatileBehavior_IsPacifilogVerticalLog1(metatileBehavior))
+ {
+ if (y1 < y2)
+ return FALSE;
+ }
+ else if (MetatileBehavior_IsPacifilogVerticalLog2(metatileBehavior))
+ {
+ if (y1 > y2)
+ return FALSE;
+ }
+ else if (MetatileBehavior_IsPacifilogHorizontalLog1(metatileBehavior))
+ {
+ if (x1 < x2)
+ return FALSE;
+ }
+ else if (MetatileBehavior_IsPacifilogHorizontalLog2(metatileBehavior))
+ {
+ if (x1 > x2)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void PerStepCallback_8069864(u8 taskId)
+{
+ s16 *data;
+ s16 x, y;
+ data = gTasks[taskId].data;
+ PlayerGetDestCoords(&x, &y);
+ switch (data[1])
+ {
+ case 0:
+ data[2] = x;
+ data[3] = y;
+ sub_809DB34(x, y, TRUE);
+ data[1] = 1;
+ break;
+ case 1:
+ if (x != data[2] || y != data[3])
+ {
+ if (sub_809DB7C(x, y, data[2], data[3]))
+ {
+ sub_809DB10(data[2], data[3], TRUE);
+ sub_809DB58(data[2], data[3], FALSE);
+ data[4] = data[2];
+ data[5] = data[3];
+ data[1] = 2;
+ data[6] = 8;
+ }
+ else
+ {
+ data[4] = -1;
+ data[5] = -1;
+ }
+ if (sub_809DC18(x, y, data[2], data[3]))
+ {
+ sub_809DB10(x, y, TRUE);
+ data[1] = 2;
+ data[6] = 8;
+ }
+ data[2] = x;
+ data[3] = y;
+ if (MetatileBehavior_IsPacifidlogLog(MapGridGetMetatileBehaviorAt(x, y)))
+ {
+ PlaySE(SE_MIZU);
+ }
+ }
+ break;
+ case 2:
+ if ((--data[6]) == 0)
+ {
+ sub_809DB34(x, y, TRUE);
+ if (data[4] != -1 && data[5] != -1)
+ {
+ sub_809DB58(data[4], data[5], TRUE);
+ }
+ data[1] = 1;
+ }
+ break;
+ }
+}
+
+static void sub_809DE28(s16 x, s16 y)
+{
+ u8 z = PlayerGetZCoord();
+ if (!(z & 0x01))
+ {
+ switch (MapGridGetMetatileIdAt(x, y))
+ {
+ case 0x24e:
+ MapGridSetMetatileIdAt(x, y, 0x24f);
+ break;
+ case 0x256:
+ MapGridSetMetatileIdAt(x, y, 0x257);
+ break;
+ }
+ }
+}
+
+static void sub_809DE8C(s16 x, s16 y)
+{
+ u8 z = PlayerGetZCoord();
+ if (!(z & 0x01))
+ {
+ switch (MapGridGetMetatileIdAt(x, y))
+ {
+ case 0x24f:
+ MapGridSetMetatileIdAt(x, y, 0x24e);
+ break;
+ case 0x257:
+ MapGridSetMetatileIdAt(x, y, 0x256);
+ break;
+ }
+ }
+}
+
+static void PerStepCallback_8069AA0(u8 taskId)
+{
+ bool8 isFortreeBridgeCur;
+ bool8 isFortreeBridgePrev;
+ u8 z, flag;
+ s16 x, y, x2, y2;
+ s16 *data = gTasks[taskId].data;
+ PlayerGetDestCoords(&x, &y);
+ switch (data[1])
+ {
+ default:
+ break;
+ case 0:
+ data[2] = x;
+ data[3] = y;
+ if (MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y)))
+ {
+ sub_809DE28(x, y);
+ CurrentMapDrawMetatileAt(x, y);
+ }
+ data[1] = 1;
+ break;
+ case 1:
+ x2 = data[2];
+ y2 = data[3];
+ if (x == x2 && y == y2)
+ {
+ break;
+ }
+ isFortreeBridgeCur = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y));
+ isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x2, y2));
+ z = PlayerGetZCoord();
+ flag = 0;
+ if ((u8)(z & 1) == 0)
+ {
+ flag = 1;
+ }
+ if (flag && (isFortreeBridgeCur == 1 || isFortreeBridgePrev == 1))
+ {
+ PlaySE(SE_HASHI);
+ }
+ if (isFortreeBridgePrev)
+ {
+ sub_809DE8C(x2, y2);
+ CurrentMapDrawMetatileAt(x2, y2);
+ sub_809DE28(x, y);
+ CurrentMapDrawMetatileAt(x, y);
+ }
+ data[4] = x2;
+ data[5] = y2;
+ data[2] = x;
+ data[3] = y;
+ if (!isFortreeBridgePrev)
+ {
+ break;
+ }
+ data[6] = 16;
+ data[1] = 2;
+ // fallthrough
+ case 2:
+ data[6]--;
+ x2 = data[4];
+ y2 = data[5];
+ switch (data[6] % 7)
+ {
+ case 0:
+ CurrentMapDrawMetatileAt(x2, y2);
+ case 1:
+ case 2:
+ case 3:
+ break;
+ case 4:
+ sub_809DE28(x2, y2);
+ CurrentMapDrawMetatileAt(x2, y2);
+ sub_809DE8C(x2, y2);
+ case 5:
+ case 6:
+ case 7:
+ break;
+ }
+ if (data[6] == 0)
+ {
+ data[1] = 1;
+ }
+ break;
+ }
+}
+
+static bool32 sub_809E108(s16 x, s16 y)
+{
+ if ((u16)(x - 3) < 11 && (u16)(y - 6) < 14 && gUnknown_085103C8[y])
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void sub_809E14C(s16 x, s16 y)
+{
+ if (sub_809E108(x, y))
+ *GetVarPointer(gUnknown_085103C8[y]) |= (1 << (x - 3));
+}
+
+static bool32 sub_809E184(s16 x, s16 y)
+{
+ u32 var;
+ if (!sub_809E108(x, y))
+ return FALSE;
+
+ var = VarGet(gUnknown_085103C8[y]) << 16;
+ if (((1 << 16) << (x - 3)) & var) // TODO: fix that if
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void SetSootopolisGymCrackedIceMetatiles(void)
+{
+ s32 x, y;
+ s32 width = gMapHeader.mapLayout->width;
+ s32 height = gMapHeader.mapLayout->height;
+ for (x = 0; x < width; x++)
+ {
+ for (y = 0; y < height; y++)
+ {
+ if (sub_809E184(x, y) == TRUE)
+ {
+ MapGridSetMetatileIdAt(x + 7, y + 7, 0x20e);
+ }
+ }
+ }
+}
+
+static void PerStepCallback_8069DD4(u8 taskId)
+{
+ s16 x, y;
+ u16 tileBehavior;
+ u16 *var;
+ s16 *data = gTasks[taskId].data;
+ switch (data[1])
+ {
+ case 0:
+ PlayerGetDestCoords(&x, &y);
+ data[2] = x;
+ data[3] = y;
+ data[1] = 1;
+ break;
+ case 1:
+ PlayerGetDestCoords(&x, &y);
+ if (x != data[2] || y != data[3])
+ {
+ data[2] = x;
+ data[3] = y;
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ var = GetVarPointer(VAR_ICE_STEP_COUNT);
+ if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE)
+ {
+ (*var)++;
+ data[6] = 4;
+ data[1] = 2;
+ data[4] = x;
+ data[5] = y;
+ }
+ else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE)
+ {
+ *var = 0;
+ data[6] = 4;
+ data[1] = 3;
+ data[4] = x;
+ data[5] = y;
+ }
+ }
+ break;
+ case 2:
+ if (data[6] != 0)
+ {
+ data[6]--;
+ }
+ else
+ {
+ x = data[4];
+ y = data[5];
+ PlaySE(SE_RU_BARI);
+ MapGridSetMetatileIdAt(x, y, 0x20e);
+ CurrentMapDrawMetatileAt(x, y);
+ sub_809E14C(x - 7, y - 7);
+ data[1] = 1;
+ }
+ break;
+ case 3:
+ if (data[6] != 0)
+ {
+ data[6]--;
+ }
+ else
+ {
+ x = data[4];
+ y = data[5];
+ PlaySE(SE_RU_GASYAN);
+ MapGridSetMetatileIdAt(x, y, 0x206);
+ CurrentMapDrawMetatileAt(x, y);
+ data[1] = 1;
+ }
+ break;
+ }
+}
+
+static void PerStepCallback_8069F64(u8 taskId)
+{
+ s16 x, y;
+ u16 *var;
+ s16 *data = gTasks[taskId].data;
+ PlayerGetDestCoords(&x, &y);
+ if (x != data[1] || y != data[2])
+ {
+ data[1] = x;
+ data[2] = y;
+ if (MetatileBehavior_IsAshGrass(MapGridGetMetatileBehaviorAt(x, y)))
+ {
+ if (MapGridGetMetatileIdAt(x, y) == 0x20a)
+ {
+ ash(x, y, 0x212, 4);
+ }
+ else
+ {
+ ash(x, y, 0x206, 4);
+ }
+ if (CheckBagHasItem(ITEM_SOOT_SACK, 1))
+ {
+ var = GetVarPointer(VAR_ASH_GATHER_COUNT);
+ if (*var < 9999)
+ {
+ (*var)++;
+ }
+ }
+ }
+ }
+}
+
+static void sub_809E490(s16 x, s16 y)
+{
+ MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == 0x22f ? 0x206 : 0x237);
+ CurrentMapDrawMetatileAt(x, y);
+}
+
+static void PerStepCallback_806A07C(u8 taskId)
+{
+ s16 x, y;
+ u16 behavior;
+ s16 *data = gTasks[taskId].data;
+ PlayerGetDestCoords(&x, &y);
+ behavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (data[4] != 0 && (--data[4]) == 0)
+ {
+ sub_809E490(data[5], data[6]);
+ }
+ if (data[7] != 0 && (--data[7]) == 0)
+ {
+ sub_809E490(data[8], data[9]);
+ }
+ if (MetatileBehavior_IsCrackedFloorHole(behavior))
+ {
+ VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty
+ }
+ if ((x != data[2] || y != data[3]))
+ {
+ data[2] = x;
+ data[3] = y;
+ if (MetatileBehavior_IsCrackedFloor(behavior))
+ {
+ if (GetPlayerSpeed() != 4)
+ {
+ VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty
+ }
+ if (data[4] == 0)
+ {
+ data[4] = 3;
+ data[5] = x;
+ data[6] = y;
+ }
+ else if (data[7] == 0)
+ {
+ data[7] = 3;
+ data[8] = x;
+ data[9] = y;
+ }
+ }
+ }
+}
+
+static void sub_809E5DC(s16 *data, s16 x, s16 y)
+{
+ u16 tile;
+ if ((--data[0]) == 0)
+ {
+ tile = 0xe8;
+ }
+ else
+ {
+ tile = gUnknown_085103FC[data[0] / 8];
+ }
+ MapGridSetMetatileIdAt(x, y, tile);
+ CurrentMapDrawMetatileAt(x, y);
+ MapGridSetMetatileIdAt(x, y, 0xe8);
+}
+
+static void Task_MuddySlope(u8 taskId)
+{
+ s16 x, y, x2, y2;
+ int i;
+ u16 mapIndices;
+ s16 *data = gTasks[taskId].data;
+ PlayerGetDestCoords(&x, &y);
+ mapIndices = (gSaveBlock1Ptr->location.mapGroup << 8) | gSaveBlock1Ptr->location.mapNum;
+ switch (data[1])
+ {
+ case 0:
+ data[0] = mapIndices;
+ data[2] = x;
+ data[3] = y;
+ data[1] = 1;
+ data[4] = 0;
+ data[7] = 0;
+ data[10] = 0;
+ data[13] = 0;
+ break;
+ case 1:
+ if (data[2] != x || data[3] != y)
+ {
+ data[2] = x;
+ data[3] = y;
+ if (MetatileBehavior_IsMuddySlope(MapGridGetMetatileBehaviorAt(x, y)))
+ {
+ for (i=4; i<14; i+=3)
+ {
+ if (data[i] == 0)
+ {
+ data[i] = 32;
+ data[i + 1] = x;
+ data[i + 2] = y;
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ if (gCamera.active && mapIndices != data[0])
+ {
+ data[0] = mapIndices;
+ x2 = gCamera.x;
+ y2 = gCamera.y;
+ }
+ else
+ {
+ x2 = 0;
+ y2 = 0;
+ }
+ for (i = 4; i < 14; i += 3)
+ {
+ if (data[i])
+ {
+ data[i + 1] -= x2;
+ data[i + 2] -= y2;
+ sub_809E5DC(&data[i], data[i + 1], data[i + 2]);
+ }
+ }
+}
diff --git a/src/fieldmap.c b/src/fieldmap.c
new file mode 100644
index 000000000..f57c4b48f
--- /dev/null
+++ b/src/fieldmap.c
@@ -0,0 +1,1034 @@
+#include "global.h"
+#include "overworld.h"
+#include "bg.h"
+#include "battle_frontier_2.h"
+#include "constants/rgb.h"
+#include "fieldmap.h"
+#include "fldeff_80F9BCC.h"
+#include "fldeff_cut.h"
+#include "fldeff_groundshake.h"
+#include "menu.h"
+#include "palette.h"
+#include "pokenav.h"
+#include "script.h"
+#include "secret_base.h"
+#include "tv.h"
+
+struct ConnectionFlags
+{
+ u8 south:1;
+ u8 north:1;
+ u8 west:1;
+ u8 east:1;
+};
+
+EWRAM_DATA static u16 gUnknown_02032318[0x2800] = {0};
+EWRAM_DATA struct MapHeader gMapHeader = {0};
+EWRAM_DATA struct Camera gCamera = {0};
+EWRAM_DATA static struct ConnectionFlags gUnknown_02037340 = {0};
+EWRAM_DATA static u32 sFiller_02037344 = 0; // without this, the next file won't align properly
+
+struct BackupMapLayout gUnknown_03005DC0;
+
+static const struct ConnectionFlags sDummyConnectionFlags = {0};
+
+struct MapHeader const *const mapconnection_get_mapheader(struct MapConnection *connection)
+{
+ return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum);
+}
+
+void not_trainer_hill_battle_pyramid(void)
+{
+ mapheader_copy_mapdata_with_padding(&gMapHeader);
+ sub_80E8EE0(gMapHeader.events);
+ mapheader_run_script_with_tag_x1();
+}
+
+void sub_8087D74(void)
+{
+ mapheader_copy_mapdata_with_padding(&gMapHeader);
+ sub_80E9238(0);
+ sub_80E8EE0(gMapHeader.events);
+ mapdata_from_sav2();
+ mapheader_run_script_with_tag_x1();
+ UpdateTVScreensOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height);
+}
+
+void battle_pyramid_map_load_related(u8 a0)
+{
+ CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318));
+ sub_81AA078(gUnknown_02032318, a0);
+}
+
+void trainer_hill_map_load_related(void)
+{
+ CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318));
+ sub_81D5FB4(gUnknown_02032318);
+}
+
+void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader)
+{
+ struct MapLayout const *mapLayout;
+ int width;
+ int height;
+ mapLayout = mapHeader->mapLayout;
+ CpuFastFill16(0x03ff, gUnknown_02032318, sizeof(gUnknown_02032318));
+ gUnknown_03005DC0.map = gUnknown_02032318;
+ width = mapLayout->width + 15;
+ gUnknown_03005DC0.width = width;
+ height = mapLayout->height + 14;
+ gUnknown_03005DC0.height = height;
+ if (width * height <= 0x2800)
+ {
+ map_copy_with_padding(mapLayout->map, mapLayout->width, mapLayout->height);
+ mapheader_copy_mapdata_of_adjacent_maps(mapHeader);
+ }
+}
+
+void map_copy_with_padding(u16 *map, u16 width, u16 height)
+{
+ u16 *dest;
+ int y;
+ dest = gUnknown_03005DC0.map;
+ dest += gUnknown_03005DC0.width * 7 + 7;
+ for (y = 0; y < height; y++)
+ {
+ CpuCopy16(map, dest, width * 2);
+ dest += width + 0xf;
+ map += width;
+ }
+}
+
+void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader)
+{
+ int count;
+ struct MapConnection *connection;
+ int i;
+
+ if (mapHeader->connections)
+ {
+ count = mapHeader->connections->count;
+ connection = mapHeader->connections->connections;
+
+ gUnknown_02037340 = sDummyConnectionFlags;
+ for (i = 0; i < count; i++, connection++)
+ {
+ struct MapHeader const *cMap = mapconnection_get_mapheader(connection);
+ u32 offset = connection->offset;
+
+ switch (connection->direction)
+ {
+ case CONNECTION_SOUTH:
+ fillSouthConnection(mapHeader, cMap, offset);
+ gUnknown_02037340.south = 1;
+ break;
+ case CONNECTION_NORTH:
+ fillNorthConnection(mapHeader, cMap, offset);
+ gUnknown_02037340.north = 1;
+ break;
+ case CONNECTION_WEST:
+ fillWestConnection(mapHeader, cMap, offset);
+ gUnknown_02037340.west = 1;
+ break;
+ case CONNECTION_EAST:
+ fillEastConnection(mapHeader, cMap, offset);
+ gUnknown_02037340.east = 1;
+ break;
+ }
+ }
+ }
+}
+
+void sub_8087F54(int x, int y, struct MapHeader const *mapHeader, int x2, int y2, int width, int height)
+{
+ int i;
+ u16 *src;
+ u16 *dest;
+ int mapWidth;
+
+ mapWidth = mapHeader->mapLayout->width;
+ src = &mapHeader->mapLayout->map[mapWidth * y2 + x2];
+ dest = &gUnknown_03005DC0.map[gUnknown_03005DC0.width * y + x];
+
+ for (i = 0; i < height; i++)
+ {
+ CpuCopy16(src, dest, width * 2);
+ dest += gUnknown_03005DC0.width;
+ src += mapWidth;
+ }
+}
+
+void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+{
+ int x, y;
+ int x2;
+ int width;
+ int cWidth;
+
+ if (connectedMapHeader)
+ {
+ cWidth = connectedMapHeader->mapLayout->width;
+ x = offset + 7;
+ y = mapHeader->mapLayout->height + 7;
+ if (x < 0)
+ {
+ x2 = -x;
+ x += cWidth;
+ if (x < gUnknown_03005DC0.width)
+ {
+ width = x;
+ }
+ else
+ {
+ width = gUnknown_03005DC0.width;
+ }
+ x = 0;
+ }
+ else
+ {
+ x2 = 0;
+ if (x + cWidth < gUnknown_03005DC0.width)
+ {
+ width = cWidth;
+ }
+ else
+ {
+ width = gUnknown_03005DC0.width - x;
+ }
+ }
+
+ sub_8087F54(
+ x, y,
+ connectedMapHeader,
+ x2, /*y2*/ 0,
+ width, /*height*/ 7);
+ }
+}
+
+void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+{
+ int x;
+ int x2, y2;
+ int width;
+ int cWidth, cHeight;
+
+ if (connectedMapHeader)
+ {
+ cWidth = connectedMapHeader->mapLayout->width;
+ cHeight = connectedMapHeader->mapLayout->height;
+ x = offset + 7;
+ y2 = cHeight - 7;
+ if (x < 0)
+ {
+ x2 = -x;
+ x += cWidth;
+ if (x < gUnknown_03005DC0.width)
+ {
+ width = x;
+ }
+ else
+ {
+ width = gUnknown_03005DC0.width;
+ }
+ x = 0;
+ }
+ else
+ {
+ x2 = 0;
+ if (x + cWidth < gUnknown_03005DC0.width)
+ {
+ width = cWidth;
+ }
+ else
+ {
+ width = gUnknown_03005DC0.width - x;
+ }
+ }
+
+ sub_8087F54(
+ x, /*y*/ 0,
+ connectedMapHeader,
+ x2, y2,
+ width, /*height*/ 7);
+
+ }
+}
+
+void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+{
+ int y;
+ int x2, y2;
+ int height;
+ int cWidth, cHeight;
+ if (connectedMapHeader)
+ {
+ cWidth = connectedMapHeader->mapLayout->width;
+ cHeight = connectedMapHeader->mapLayout->height;
+ y = offset + 7;
+ x2 = cWidth - 7;
+ if (y < 0)
+ {
+ y2 = -y;
+ if (y + cHeight < gUnknown_03005DC0.height)
+ {
+ height = y + cHeight;
+ }
+ else
+ {
+ height = gUnknown_03005DC0.height;
+ }
+ y = 0;
+ }
+ else
+ {
+ y2 = 0;
+ if (y + cHeight < gUnknown_03005DC0.height)
+ {
+ height = cHeight;
+ }
+ else
+ {
+ height = gUnknown_03005DC0.height - y;
+ }
+ }
+
+ sub_8087F54(
+ /*x*/ 0, y,
+ connectedMapHeader,
+ x2, y2,
+ /*width*/ 7, height);
+ }
+}
+
+void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+{
+ int x, y;
+ int y2;
+ int height;
+ int cHeight;
+ if (connectedMapHeader)
+ {
+ cHeight = connectedMapHeader->mapLayout->height;
+ x = mapHeader->mapLayout->width + 7;
+ y = offset + 7;
+ if (y < 0)
+ {
+ y2 = -y;
+ if (y + cHeight < gUnknown_03005DC0.height)
+ {
+ height = y + cHeight;
+ }
+ else
+ {
+ height = gUnknown_03005DC0.height;
+ }
+ y = 0;
+ }
+ else
+ {
+ y2 = 0;
+ if (y + cHeight < gUnknown_03005DC0.height)
+ {
+ height = cHeight;
+ }
+ else
+ {
+ height = gUnknown_03005DC0.height - y;
+ }
+ }
+
+ sub_8087F54(
+ x, y,
+ connectedMapHeader,
+ /*x2*/ 0, y2,
+ /*width*/ 8, height);
+ }
+}
+
+union Block
+{
+ struct
+ {
+ u16 block:10;
+ u16 collision:2;
+ u16 elevation:4;
+ } block;
+ u16 value;
+};
+
+u8 MapGridGetZCoordAt(int x, int y)
+{
+ u16 block;
+ int i;
+ u16 *border;
+
+ if (x >= 0 && x < gUnknown_03005DC0.width
+ && y >= 0 && y < gUnknown_03005DC0.height)
+ {
+ block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y];
+ }
+ else
+ {
+ border = gMapHeader.mapLayout->border;
+ i = (x + 1) & 1;
+ i += ((y + 1) & 1) * 2;
+ block = gMapHeader.mapLayout->border[i];
+ block |= 0xc00;
+ }
+
+ if (block == 0x3ff)
+ {
+ return 0;
+ }
+
+ return block >> 12;
+}
+
+u8 MapGridIsImpassableAt(int x, int y)
+{
+ u16 block;
+ int i;
+ u16 *border;
+
+ if (x >= 0 && x < gUnknown_03005DC0.width
+ && y >= 0 && y < gUnknown_03005DC0.height)
+ {
+ block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y];
+ }
+ else
+ {
+ border = gMapHeader.mapLayout->border;
+ i = (x + 1) & 1;
+ i += ((y + 1) & 1) * 2;
+ block = gMapHeader.mapLayout->border[i];
+ block |= 0xc00;
+ }
+ if (block == 0x3ff)
+ {
+ return 1;
+ }
+ return (block & 0xc00) >> 10;
+}
+
+u32 MapGridGetMetatileIdAt(int x, int y)
+{
+ u16 block;
+ int i;
+ int j;
+ struct MapLayout const *mapLayout;
+ u16 *border;
+ u16 block2;
+
+ if (x >= 0 && x < gUnknown_03005DC0.width
+ && y >= 0 && y < gUnknown_03005DC0.height)
+ {
+ block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y];
+ }
+ else
+ {
+ mapLayout = gMapHeader.mapLayout;
+ i = (x + 1) & 1;
+ i += ((y + 1) & 1) * 2;
+ block = mapLayout->border[i] | 0xc00;
+ }
+ if (block == 0x3ff)
+ {
+ border = gMapHeader.mapLayout->border;
+ j = (x + 1) & 1;
+ j += ((y + 1) & 1) * 2;
+ block2 = gMapHeader.mapLayout->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;
+}
+
+u8 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_03005DC0.width
+ && y >= 0 && y < gUnknown_03005DC0.height)
+ {
+ i = x + y * gUnknown_03005DC0.width;
+ gUnknown_03005DC0.map[i] = (gUnknown_03005DC0.map[i] & 0xf000) | (metatile & 0xfff);
+ }
+}
+
+void MapGridSetMetatileEntryAt(int x, int y, u16 metatile)
+{
+ int i;
+ if (x >= 0 && x < gUnknown_03005DC0.width
+ && y >= 0 && y < gUnknown_03005DC0.height)
+ {
+ i = x + gUnknown_03005DC0.width * y;
+ gUnknown_03005DC0.map[i] = metatile;
+ }
+}
+
+u16 GetBehaviorByMetatileId(u16 metatile)
+{
+ u16 *attributes;
+ if (metatile <= 0x1ff)
+ {
+ attributes = gMapHeader.mapLayout->primaryTileset->metatileAttributes;
+ return attributes[metatile];
+ }
+ else if (metatile <= 0x3ff)
+ {
+ attributes = gMapHeader.mapLayout->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 = gSaveBlock1Ptr->mapView;
+ width = gUnknown_03005DC0.width;
+ x = gSaveBlock1Ptr->pos.x;
+ y = gSaveBlock1Ptr->pos.y;
+ for (i = y; i < y + 14; i++)
+ {
+ for (j = x; j < x + 15; j++)
+ {
+ *mapView++ = gUnknown_02032318[width * i + j];
+ }
+ }
+}
+
+int sub_8088438(void)
+{
+ u16 i;
+ u32 r2;
+ r2 = 0;
+ for (i = 0; i < 0x200; i++)
+ {
+ r2 |= gSaveBlock1Ptr->mapView[i];
+ }
+ if (r2 == 0)
+ {
+ return 1;
+ }
+ return 0;
+}
+
+void sav2_mapdata_clear(void)
+{
+ CpuFill16(0, gSaveBlock1Ptr->mapView, sizeof(gSaveBlock1Ptr->mapView));
+}
+
+void mapdata_from_sav2(void)
+{
+ u8 a0;
+ int i, j;
+ int x, y;
+ u16 *mapView;
+ int width;
+ mapView = gSaveBlock1Ptr->mapView;
+ if (!sub_8088438())
+ {
+ width = gUnknown_03005DC0.width;
+ x = gSaveBlock1Ptr->pos.x;
+ y = gSaveBlock1Ptr->pos.y;
+ for (i = y; i < y + 14; i++)
+ {
+ if (i == y && i != 0)
+ a0 = 0;
+ else if (i == y + 13 && i != gMapHeader.mapLayout->height - 1)
+ a0 = 1;
+ else
+ a0 = -1;
+
+ for (j = x; j < x + 15; j++)
+ {
+ if (!sub_8088BF0(&gUnknown_02032318[j + width * i], width, a0))
+ gUnknown_02032318[j + width * i] = *mapView;
+ mapView++;
+ }
+ }
+ for (j = x; j < x + 15; j++)
+ {
+ if (y != 0)
+ sub_80D423C(j, y - 1);
+ if (i < gMapHeader.mapLayout->height - 1)
+ sub_80D42B8(j, y + 13);
+ }
+ sav2_mapdata_clear();
+ }
+}
+
+void sub_80885C4(u8 a1)
+{
+ int width;
+ u16 *mapView;
+ int x0, y0;
+ int x2, y2;
+ u16 *src, *dest;
+ int srci, desti;
+ int r9, r8;
+ int x, y;
+ int i, j;
+ mapView = gSaveBlock1Ptr->mapView;
+ width = gUnknown_03005DC0.width;
+ r9 = 0;
+ r8 = 0;
+ x0 = gSaveBlock1Ptr->pos.x;
+ y0 = gSaveBlock1Ptr->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_02032318[x0 + desti + j];
+ *dest = *src;
+ i++;
+ j++;
+ }
+ }
+ sav2_mapdata_clear();
+}
+
+int GetMapBorderIdAt(int x, int y)
+{
+ struct MapLayout const *mapLayout;
+ u16 block, block2;
+ int i, j;
+ if (x >= 0 && x < gUnknown_03005DC0.width
+ && y >= 0 && y < gUnknown_03005DC0.height)
+ {
+ i = gUnknown_03005DC0.width;
+ i *= y;
+ block = gUnknown_03005DC0.map[x + i];
+ if (block == 0x3ff)
+ {
+ goto fail;
+ }
+ }
+ else
+ {
+ mapLayout = gMapHeader.mapLayout;
+ j = (x + 1) & 1;
+ j += ((y + 1) & 1) * 2;
+ block2 = 0xc00 | mapLayout->border[j];
+ if (block2 == 0x3ff)
+ {
+ goto fail;
+ }
+ }
+ goto success;
+fail:
+ return -1;
+success:
+
+ if (x >= (gUnknown_03005DC0.width - 8))
+ {
+ if (!gUnknown_02037340.east)
+ {
+ return -1;
+ }
+ return CONNECTION_EAST;
+ }
+ else if (x < 7)
+ {
+ if (!gUnknown_02037340.west)
+ {
+ return -1;
+ }
+ return CONNECTION_WEST;
+ }
+ else if (y >= (gUnknown_03005DC0.height - 7))
+ {
+ if (!gUnknown_02037340.south)
+ {
+ return -1;
+ }
+ return CONNECTION_SOUTH;
+ }
+ else if (y < 7)
+ {
+ if (!gUnknown_02037340.north)
+ {
+ return -1;
+ }
+ return CONNECTION_NORTH;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+int GetPostCameraMoveMapBorderId(int x, int y)
+{
+ return GetMapBorderIdAt(gSaveBlock1Ptr->pos.x + 7 + x, gSaveBlock1Ptr->pos.y + 7 + y);
+}
+
+int CanCameraMoveInDirection(int direction)
+{
+ int x, y;
+ x = gSaveBlock1Ptr->pos.x + 7 + gUnknown_08339D64[direction].x;
+ y = gSaveBlock1Ptr->pos.y + 7 + gUnknown_08339D64[direction].y;
+ if (GetMapBorderIdAt(x, y) == -1)
+ {
+ return 0;
+ }
+ return 1;
+}
+
+void sub_80887F8(struct MapConnection *connection, int direction, int x, int y)
+{
+ struct MapHeader const *mapHeader;
+ mapHeader = mapconnection_get_mapheader(connection);
+ switch (direction)
+ {
+ case CONNECTION_EAST:
+ gSaveBlock1Ptr->pos.x = -x;
+ gSaveBlock1Ptr->pos.y -= connection->offset;
+ break;
+ case CONNECTION_WEST:
+ gSaveBlock1Ptr->pos.x = mapHeader->mapLayout->width;
+ gSaveBlock1Ptr->pos.y -= connection->offset;
+ break;
+ case CONNECTION_SOUTH:
+ gSaveBlock1Ptr->pos.x -= connection->offset;
+ gSaveBlock1Ptr->pos.y = -y;
+ break;
+ case CONNECTION_NORTH:
+ gSaveBlock1Ptr->pos.x -= connection->offset;
+ gSaveBlock1Ptr->pos.y = mapHeader->mapLayout->height;
+ break;
+ }
+}
+
+bool8 CameraMove(int x, int y)
+{
+ unsigned int direction;
+ struct MapConnection *connection;
+ int old_x, old_y;
+ gCamera.active = FALSE;
+ direction = GetPostCameraMoveMapBorderId(x, y);
+ if (direction + 1 <= 1)
+ {
+ gSaveBlock1Ptr->pos.x += x;
+ gSaveBlock1Ptr->pos.y += y;
+ }
+ else
+ {
+ save_serialize_map();
+ sub_81BE72C();
+ old_x = gSaveBlock1Ptr->pos.x;
+ old_y = gSaveBlock1Ptr->pos.y;
+ connection = sub_8088950(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y);
+ sub_80887F8(connection, direction, x, y);
+ mliX_load_map(connection->mapGroup, connection->mapNum);
+ gCamera.active = TRUE;
+ gCamera.x = old_x - gSaveBlock1Ptr->pos.x;
+ gCamera.y = old_y - gSaveBlock1Ptr->pos.y;
+ gSaveBlock1Ptr->pos.x += x;
+ gSaveBlock1Ptr->pos.y += y;
+ sub_80885C4(direction);
+ }
+ return gCamera.active;
+}
+
+struct MapConnection *sub_8088950(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 && sub_80889A8(direction, x, y, connection) == TRUE)
+ return connection;
+ }
+ return NULL;
+}
+
+bool8 sub_80889A8(u8 direction, int x, int y, struct MapConnection *connection)
+{
+ struct MapHeader const *mapHeader;
+ mapHeader = mapconnection_get_mapheader(connection);
+ switch (direction)
+ {
+ case CONNECTION_SOUTH:
+ case CONNECTION_NORTH:
+ return sub_8088A0C(x, gMapHeader.mapLayout->width, mapHeader->mapLayout->width, connection->offset);
+ case CONNECTION_WEST:
+ case CONNECTION_EAST:
+ return sub_8088A0C(y, gMapHeader.mapLayout->height, mapHeader->mapLayout->height, connection->offset);
+ }
+ return FALSE;
+}
+
+bool8 sub_8088A0C(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_8088A38(int x, int width)
+{
+ if (x >= 0 && x < width)
+ return TRUE;
+
+ return FALSE;
+}
+
+int sub_8088A4C(struct MapConnection *connection, int x, int y)
+{
+ struct MapHeader const *mapHeader;
+ mapHeader = mapconnection_get_mapheader(connection);
+ switch (connection->direction)
+ {
+ case CONNECTION_SOUTH:
+ case CONNECTION_NORTH:
+ return sub_8088A38(x - connection->offset, mapHeader->mapLayout->width);
+ case CONNECTION_WEST:
+ case CONNECTION_EAST:
+ return sub_8088A38(y - connection->offset, mapHeader->mapLayout->height);
+ }
+ return FALSE;
+}
+
+struct MapConnection *sub_8088A8C(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.mapLayout->height + 7)
+ || (direction == CONNECTION_WEST && x > 6)
+ || (direction == CONNECTION_EAST && x < gMapHeader.mapLayout->width + 7))
+ {
+ continue;
+ }
+ if (sub_8088A4C(connection, x - 7, y - 7) == TRUE)
+ {
+ return connection;
+ }
+ }
+ }
+ return NULL;
+}
+
+void sub_8088B3C(u16 x, u16 y)
+{
+ gSaveBlock1Ptr->pos.x = x - 7;
+ gSaveBlock1Ptr->pos.y = y - 7;
+}
+
+void sav1_camera_get_focus_coords(u16 *x, u16 *y)
+{
+ *x = gSaveBlock1Ptr->pos.x + 7;
+ *y = gSaveBlock1Ptr->pos.y + 7;
+}
+
+void SetCameraCoords(u16 x, u16 y)
+{
+ gSaveBlock1Ptr->pos.x = x;
+ gSaveBlock1Ptr->pos.y = y;
+}
+
+void GetCameraCoords(u16 *x, u16 *y)
+{
+ *x = gSaveBlock1Ptr->pos.x;
+ *y = gSaveBlock1Ptr->pos.y;
+}
+
+void sub_8088B94(int x, int y, int a2)
+{
+ if (x >= 0 && x < gUnknown_03005DC0.width && y >= 0 && y < gUnknown_03005DC0.height)
+ {
+ if (a2 != 0)
+ gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] |= 0xC00;
+ else
+ gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] &= 0xF3FF;
+ }
+}
+
+bool8 sub_8088BF0(u16* a0, u16 a1, u8 a2)
+{
+ if (a2 == 0xFF)
+ return FALSE;
+
+ if (a2 == 0)
+ a0 -= a1;
+ else
+ a0 += a1;
+
+ if (sub_80FADE4(*a0 & 0x3FF, a2) == 1)
+ return TRUE;
+ return FALSE;
+}
+
+void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset)
+{
+ if (tileset)
+ {
+ if (!tileset->isCompressed)
+ LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);
+ else
+ decompress_and_copy_tile_data_to_vram(2, tileset->tiles, numTiles * 32, offset, 0);
+ }
+}
+
+void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset)
+{
+ if (tileset)
+ {
+ if (!tileset->isCompressed)
+ LoadBgTiles(2, tileset->tiles, numTiles * 32, offset);
+ else
+ copy_decompressed_tile_data_to_vram_autofree(2, tileset->tiles, numTiles * 32, offset, 0);
+ }
+}
+
+void nullsub_3(u16 a0, u16 a1)
+{
+
+}
+
+void nullsub_90(void)
+{
+
+}
+
+void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size)
+{
+ u16 black = RGB_BLACK;
+
+ if (tileset)
+ {
+ if (tileset->isSecondary == FALSE)
+ {
+ LoadPalette(&black, destOffset, 2);
+ LoadPalette(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2);
+ nullsub_3(destOffset + 1, (size - 2) >> 1);
+ }
+ else if (tileset->isSecondary == TRUE)
+ {
+ LoadPalette(((u16*)tileset->palettes) + 0x60, destOffset, size);
+ nullsub_3(destOffset, size >> 1);
+ }
+ else
+ {
+ LoadCompressedPalette((u16*)tileset->palettes, destOffset, size);
+ nullsub_3(destOffset, size >> 1);
+ }
+ }
+}
+
+void copy_map_tileset1_to_vram(struct MapLayout const *mapLayout)
+{
+ copy_tileset_patterns_to_vram(mapLayout->primaryTileset, 0x200, 0);
+}
+
+void copy_map_tileset2_to_vram(struct MapLayout const *mapLayout)
+{
+ copy_tileset_patterns_to_vram(mapLayout->secondaryTileset, 0x200, 0x200);
+}
+
+void copy_map_tileset2_to_vram_2(struct MapLayout const *mapLayout)
+{
+ copy_tileset_patterns_to_vram2(mapLayout->secondaryTileset, 0x200, 0x200);
+}
+
+void apply_map_tileset1_palette(struct MapLayout const *mapLayout)
+{
+ apply_map_tileset_palette(mapLayout->primaryTileset, 0, 0xC0);
+}
+
+void apply_map_tileset2_palette(struct MapLayout const *mapLayout)
+{
+ apply_map_tileset_palette(mapLayout->secondaryTileset, 0x60, 0xE0);
+}
+
+void copy_map_tileset1_tileset2_to_vram(struct MapLayout const *mapLayout)
+{
+ if (mapLayout)
+ {
+ copy_tileset_patterns_to_vram2(mapLayout->primaryTileset, 0x200, 0);
+ copy_tileset_patterns_to_vram2(mapLayout->secondaryTileset, 0x200, 0x200);
+ }
+}
+
+void apply_map_tileset1_tileset2_palette(struct MapLayout const *mapLayout)
+{
+ if (mapLayout)
+ {
+ apply_map_tileset1_palette(mapLayout);
+ apply_map_tileset2_palette(mapLayout);
+ }
+}
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
index 9929dd6f9..9de954e80 100644
--- a/src/fldeff_cut.c
+++ b/src/fldeff_cut.c
@@ -1,19 +1,683 @@
-
-// Includes
#include "global.h"
+#include "fldeff_cut.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "event_obj_lock.h"
+#include "metatile_behavior.h"
+#include "party_menu.h"
+#include "overworld.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "malloc.h"
+#include "constants/event_objects.h"
+#include "constants/songs.h"
+#include "constants/abilities.h"
+
+extern bool8 CheckObjectGraphicsInFrontOfPlayer(u8);
+extern u8 oei_task_add(void);
+extern void ScriptUnfreezeEventObjects(void);
+extern bool8 IsMewPlayingHideAndSeek(void);
+
+extern struct MapPosition gPlayerFacingPosition;
+
+extern const u8 Route103_EventScript_290705[];
+extern const u8 FarawayIsland_Interior_EventScript_267EDB[];
+
+extern const u8 gFieldEffectPic_CutGrass[];
+extern const u16 gFieldEffectObjectPalette6[];
+
+// tileset 0 as first
+#define METATILE_ID_GRASS 0x1
+#define METATILE_ID_POKE_GRASS 0xD
+
+#define METATILE_ID_POKE_GRASS_TREE_UP 0x25
+#define METATILE_ID_GRASS_TREE_UP 0xE
+
+#define METATILE_ID_POKE_GRASS_TREE_LEFT 0x1C6
+#define METATILE_ID_POKE_GRASS_TREE_RIGHT 0x1C7
+
+#define METATILE_ID_GRASS_TREE_LEFT 0x1CE
+#define METATILE_ID_GRASS_TREE_RIGHT 0x1CF
+
+#define METATILE_ID_POKE_LONG_GRASS 0x15
+
+// tileset 6 as second
+#define METATILE_ID_POKE_STEP_LAVA_GRASS 0x206
+#define METATILE_ID_POKE_LAVA_GRASS 0x207
+#define METATILE_ID_LAVA_FIELD 0x271
+
+// tileset 7 as second
+#define METATILE_ID_POKE_ASH_GRASS 0x20A
+#define METATILE_ID_POKE_STEP_ASH_GRASS 0x212
+#define METATILE_ID_ASH 0x218
+
+// tileset 8 as second
+#define METATILE_ID_POKE_LONG_GRASS_START 0x208
+
+#define METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS 0x279
+#define METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS 0x27A
+#define METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS 0x27B
+
+#define METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS 0x281
+#define METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS 0x282
+#define METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS 0x283
+
+// cut 'square' defines
+#define CUT_NORMAL_SIDE 3
+#define CUT_NORMAL_AREA CUT_NORMAL_SIDE * CUT_NORMAL_SIDE
+
+#define CUT_HYPER_SIDE 5
+#define CUT_HYPER_AREA CUT_HYPER_SIDE * CUT_HYPER_SIDE
+
+#define CUT_SPRITE_ARRAY_COUNT 8
+
+struct HyperCutterUnk
+{
+ s8 x;
+ s8 y;
+ u8 unk2[2];
+};
+
+// this file's functions
+static void FieldCallback_CutTree(void);
+static void FieldCallback_CutGrass(void);
+static void StartCutTreeFieldEffect(void);
+static void StartCutGrassFieldEffect(void);
+static void SetCutGrassMetatile(s16, s16);
+static void SetCutGrassMetatiles(s16, s16);
+static void CutGrassSpriteCallback1(struct Sprite *);
+static void CutGrassSpriteCallback2(struct Sprite *);
+static void CutGrassSpriteCallbackEnd(struct Sprite *);
+static void HandleLongGrassOnHyper(u8, s16, s16);
+
+// IWRAM variables
+static IWRAM_DATA u8 sCutSquareSide;
+static IWRAM_DATA u8 sTileCountFromPlayer_X;
+static IWRAM_DATA u8 sTileCountFromPlayer_Y;
+static IWRAM_DATA u32 sUnused;
+static IWRAM_DATA bool8 sHyperCutTiles[CUT_HYPER_AREA];
+
+// EWRAM variables
+static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL;
+
+// const rom data
+static const struct HyperCutterUnk sHyperCutStruct[] =
+{
+ {-2, -2, {1}},
+ {-1, -2, {1}},
+ {0, -2, {2}},
+ {1, -2, {3}},
+ {2, -2, {3}},
+ {-2, -1, {1}},
+ {2, -1, {3}},
+ {-2, 0, {4}},
+ {2, 0, {6}},
+ {-2, 1, {7}},
+ {2, 1, {9}},
+ {-2, 2, {7}},
+ {-1, 2, {7}},
+ {0, 2, {8}},
+ {1, 2, {9}},
+ {2, 2, {9}},
+};
+
+static const struct OamData sOamData_CutGrass =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 1,
+ .priority = 1,
+ .paletteNum = 1,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_CutGrass[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_CutGrass[] =
+{
+ sSpriteAnim_CutGrass,
+};
+
+static const struct SpriteFrameImage sSpriteImageTable_CutGrass[] =
+{
+ {gFieldEffectPic_CutGrass, 0x20},
+};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo6 = {gFieldEffectObjectPalette6, 0x1000};
+
+static const struct SpriteTemplate sSpriteTemplate_CutGrass =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x1000,
+ .oam = &sOamData_CutGrass,
+ .anims = sSpriteAnimTable_CutGrass,
+ .images = sSpriteImageTable_CutGrass,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = CutGrassSpriteCallback1,
+};
+
+// code
+bool8 SetUpFieldMove_Cut(void)
+{
+ s16 x, y;
+ u8 i, j;
+ u8 tileBehavior;
+ u8 userAbility;
+ bool8 cutTiles[CUT_NORMAL_AREA];
+ bool8 ret;
+
+ if (CheckObjectGraphicsInFrontOfPlayer(EVENT_OBJ_GFX_CUTTABLE_TREE) == TRUE)
+ {
+ // Standing in front of cuttable tree.
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_CutTree;
+ return TRUE;
+ }
+ else
+ {
+ PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+ userAbility = GetMonAbility(&gPlayerParty[GetCursorSelectionMonId()]);
+ if (userAbility == ABILITY_HYPER_CUTTER)
+ {
+ sCutSquareSide = CUT_HYPER_SIDE;
+ sTileCountFromPlayer_X = 2;
+ sTileCountFromPlayer_Y = 2;
+ }
+ else
+ {
+ sCutSquareSide = CUT_NORMAL_SIDE;
+ sTileCountFromPlayer_X = 1;
+ sTileCountFromPlayer_Y = 1;
+ }
+
+ for (i = 0; i < CUT_NORMAL_AREA; i++)
+ cutTiles[i] = FALSE;
+ for (i = 0; i < CUT_HYPER_AREA; i++)
+ sHyperCutTiles[i] = FALSE;
+
+ ret = FALSE;
+
+ for (i = 0; i < CUT_NORMAL_SIDE; i++)
+ {
+ y = i - 1 + gPlayerFacingPosition.y;
+ for (j = 0; j < CUT_NORMAL_SIDE; j++)
+ {
+ x = j - 1 + gPlayerFacingPosition.x;
+ if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height)
+ {
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE
+ || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE)
+ {
+ // Standing in front of grass.
+ sHyperCutTiles[6 + (i * 5) + j] = TRUE;
+ ret = TRUE;
+ }
+ if (MapGridIsImpassableAt(x, y) == TRUE)
+ {
+ cutTiles[i * 3 + j] = FALSE;
+ }
+ else
+ {
+ cutTiles[i * 3 + j] = TRUE;
+ if (MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE)
+ sHyperCutTiles[6 + (i * 5) + j] = TRUE;
+ }
+ }
+ else
+ {
+ cutTiles[i * 3 + j] = FALSE;
+ }
+ }
+ }
+
+ if (userAbility != ABILITY_HYPER_CUTTER)
+ {
+ if (ret == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_CutGrass;
+ }
+ }
+ else
+ {
+ bool8 tileCuttable;
+ for (i = 0; i < 16; i++)
+ {
+ x = gPlayerFacingPosition.x + sHyperCutStruct[i].x;
+ y = gPlayerFacingPosition.y + sHyperCutStruct[i].y;
+ tileCuttable = TRUE;
+
+ j = 0;
+ do
+ {
+ if (sHyperCutStruct[i].unk2[j] == 0)
+ break;
+ if (cutTiles[(u8)(sHyperCutStruct[i].unk2[j] - 1)] == FALSE)
+ {
+ tileCuttable = FALSE;
+ break;
+ }
+ } while (++j <= 1);
+
+ if (tileCuttable == TRUE)
+ {
+ if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height)
+ {
+ u8 tileArrayId = ((sHyperCutStruct[i].y * 5) + 12) + (sHyperCutStruct[i].x);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE
+ || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_CutGrass;
+ sHyperCutTiles[tileArrayId] = TRUE;
+ ret = TRUE;
+ }
+ else
+ {
+ if (MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE)
+ sHyperCutTiles[tileArrayId] = TRUE;
+ }
+ }
+ }
+ }
+
+ if (ret == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FieldCallback_CutGrass;
+ }
+ }
+
+ return ret;
+ }
+}
+
+static void FieldCallback_CutGrass(void)
+{
+ FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS);
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+}
+
+bool8 FldEff_UseCutOnGrass(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)StartCutGrassFieldEffect >> 16;
+ gTasks[taskId].data[9] = (u32)StartCutGrassFieldEffect;
+ IncrementGameStat(GAME_STAT_USED_CUT);
+ return FALSE;
+}
+
+static void FieldCallback_CutTree(void)
+{
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ ScriptContext1_SetupScript(Route103_EventScript_290705);
+}
+
+bool8 FldEff_UseCutOnTree(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)StartCutTreeFieldEffect >> 16;
+ gTasks[taskId].data[9] = (u32)StartCutTreeFieldEffect;
+ IncrementGameStat(GAME_STAT_USED_CUT);
+ return FALSE;
+}
+
+static void StartCutGrassFieldEffect(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS);
+ FieldEffectStart(FLDEFF_CUT_GRASS);
+}
+
+bool8 FldEff_CutGrass(void)
+{
+ s16 x, y;
+ u8 i = 0;
+
+ PlaySE(SE_W015);
+ PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+ for (i = 0; i < CUT_HYPER_AREA; i++)
+ {
+ if (sHyperCutTiles[i] == TRUE)
+ {
+ s8 xAdd = (i % 5) - 2;
+ s8 yAdd = (i / 5) - 2;
+
+ x = xAdd + gPlayerFacingPosition.x;
+ y = yAdd + gPlayerFacingPosition.y;
+
+ SetCutGrassMetatile(x, y);
+ sub_808E75C(x, y);
+ }
+ }
+
+ SetCutGrassMetatiles(gPlayerFacingPosition.x - sTileCountFromPlayer_X, gPlayerFacingPosition.y - (1 + sTileCountFromPlayer_Y));
+ DrawWholeMapView();
+ sCutGrassSpriteArrayPtr = AllocZeroed(CUT_SPRITE_ARRAY_COUNT);
+
+ // populate sprite ID array
+ for (i = 0; i < CUT_SPRITE_ARRAY_COUNT; i++)
+ {
+ sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_CutGrass,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0);
+ gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = 32 * i;
+ }
+
+ return FALSE;
+}
+
+// set map grid metatile depending on x, y
+static void SetCutGrassMetatile(s16 x, s16 y)
+{
+ s32 metatileId = MapGridGetMetatileIdAt(x, y);
+
+ switch (metatileId)
+ {
+ case METATILE_ID_POKE_LONG_GRASS_START:
+ case METATILE_ID_POKE_LONG_GRASS:
+ case METATILE_ID_POKE_GRASS:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS);
+ break;
+ case METATILE_ID_POKE_GRASS_TREE_LEFT:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS_TREE_LEFT);
+ break;
+ case METATILE_ID_POKE_GRASS_TREE_RIGHT:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS_TREE_RIGHT);
+ break;
+ case METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS);
+ break;
+ case METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS);
+ break;
+ case METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS);
+ break;
+ case METATILE_ID_POKE_STEP_LAVA_GRASS:
+ case METATILE_ID_POKE_LAVA_GRASS:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_LAVA_FIELD);
+ break;
+ case METATILE_ID_POKE_STEP_ASH_GRASS:
+ case METATILE_ID_POKE_ASH_GRASS:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_ASH);
+ break;
+ case METATILE_ID_POKE_GRASS_TREE_UP:
+ MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS_TREE_UP);
+ break;
+ }
+}
+
+enum
+{
+ LONG_GRASS_NONE,
+ LONG_GRASS_FIELD,
+ LONG_GRASS_BASE_LEFT,
+ LONG_GRASS_BASE_CENTER,
+ LONG_GRASS_BASE_RIGHT
+};
+
+static u8 GetLongGrassCaseAt(s16 x, s16 y)
+{
+ u16 metatileId = MapGridGetMetatileIdAt(x, y);
+
+ if (metatileId == METATILE_ID_GRASS)
+ return LONG_GRASS_FIELD;
+ else if (metatileId == METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS)
+ return LONG_GRASS_BASE_LEFT;
+ else if (metatileId == METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS)
+ return LONG_GRASS_BASE_CENTER;
+ else if (metatileId == METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS)
+ return LONG_GRASS_BASE_RIGHT;
+ else
+ return LONG_GRASS_NONE;
+}
+
+static void SetCutGrassMetatiles(s16 x, s16 y)
+{
+ s16 i;
+ s16 lowerY = y + sCutSquareSide;
+
+ for (i = 0; i < sCutSquareSide; i++)
+ {
+ s16 currentX = x + i;
+ if (MapGridGetMetatileIdAt(currentX, y) == METATILE_ID_POKE_LONG_GRASS)
+ {
+ switch (GetLongGrassCaseAt(currentX, y + 1))
+ {
+ case LONG_GRASS_FIELD:
+ MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_POKE_LONG_GRASS_START);
+ break;
+ case LONG_GRASS_BASE_LEFT:
+ MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_CENTER:
+ MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_RIGHT:
+ MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS);
+ break;
+ }
+ }
+ if (MapGridGetMetatileIdAt(currentX, lowerY) == METATILE_ID_GRASS)
+ {
+ if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_POKE_LONG_GRASS_START)
+ MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_GRASS);
+ if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS);
+ if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS);
+ if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS);
+ }
+ }
+
+ if (sCutSquareSide == CUT_HYPER_SIDE)
+ {
+ HandleLongGrassOnHyper(0, x, y);
+ HandleLongGrassOnHyper(1, x, y);
+ }
+}
+
+static void HandleLongGrassOnHyper(u8 caseId, s16 x, s16 y)
+{
+ s16 newX;
+ bool8 arr[3];
+
+ if (caseId == 0)
+ {
+ arr[0] = sHyperCutTiles[5];
+ arr[1] = sHyperCutTiles[10];
+ arr[2] = sHyperCutTiles[15];
+ newX = x;
+ }
+ else if (caseId == 1)
+ {
+ arr[0] = sHyperCutTiles[9];
+ arr[1] = sHyperCutTiles[14];
+ arr[2] = sHyperCutTiles[19];
+ newX = x + 4;
+ }
+ else // invalid case
+ {
+ return;
+ }
+
+ if (arr[0] == TRUE)
+ {
+ if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_POKE_LONG_GRASS_START)
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_GRASS);
+ if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS);
+ if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS);
+ if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS);
+ }
+ if (arr[1] == TRUE)
+ {
+ if (MapGridGetMetatileIdAt(newX, y + 2) == METATILE_ID_POKE_LONG_GRASS)
+ {
+ switch (GetLongGrassCaseAt(newX, y + 3))
+ {
+ case LONG_GRASS_FIELD:
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_POKE_LONG_GRASS_START);
+ break;
+ case LONG_GRASS_BASE_LEFT:
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_CENTER:
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_RIGHT:
+ MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS);
+ break;
+ }
+ }
+
+ if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_POKE_LONG_GRASS_START)
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_GRASS);
+ if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS);
+ if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS);
+ if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS)
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS);
+ }
+ if (arr[2] == TRUE)
+ {
+ if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_POKE_LONG_GRASS)
+ {
+ switch (GetLongGrassCaseAt(newX, y + 4))
+ {
+ case LONG_GRASS_FIELD:
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_POKE_LONG_GRASS_START);
+ break;
+ case LONG_GRASS_BASE_LEFT:
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_CENTER:
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_RIGHT:
+ MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS);
+ break;
+ }
+ }
+ }
+}
+
+static void CutGrassSpriteCallback1(struct Sprite *sprite)
+{
+ sprite->data[0] = 8;
+ sprite->data[1] = 0;
+ sprite->data[3] = 0;
+ sprite->callback = CutGrassSpriteCallback2;
+}
+
+static void CutGrassSpriteCallback2(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]);
+ sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]);
+
+ sprite->data[2] = (sprite->data[2] + 8) & 0xFF;
+ sprite->data[0] += 1 + (sprite->data[3] >> 2); // right shift by 2 is dividing by 4
+ sprite->data[3]++;
+
+ if (sprite->data[1] != 28)
+ sprite->data[1]++;
+ else
+ sprite->callback = CutGrassSpriteCallbackEnd; // done rotating the grass, execute clean up function
+}
+
+static void CutGrassSpriteCallbackEnd(struct Sprite *sprite)
+{
+ u8 i;
-// Static type declarations
+ for (i = 1; i < CUT_SPRITE_ARRAY_COUNT; i++)
+ DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]);
-// Static RAM declarations
+ FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS);
+ FREE_AND_SET_NULL(sCutGrassSpriteArrayPtr);
+ ScriptUnfreezeEventObjects();
+ ScriptContext2_Disable();
-IWRAM_DATA u8 gUnknown_03001100;
-IWRAM_DATA u8 gUnknown_03001101;
-IWRAM_DATA u8 gUnknown_03001102;
-IWRAM_DATA u32 fldeff_cut_unused_03001104;
-IWRAM_DATA u8 gUnknown_03001108[25];
+ if (IsMewPlayingHideAndSeek() == TRUE)
+ ScriptContext1_SetupScript(FarawayIsland_Interior_EventScript_267EDB);
+}
-// Static ROM declarations
+void sub_80D423C(s16 x, s16 y)
+{
+ u8 metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (MetatileBehavior_IsLongGrass_Duplicate(metatileBehavior))
+ {
+ switch (GetLongGrassCaseAt(x, y + 1))
+ {
+ case LONG_GRASS_FIELD:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_POKE_LONG_GRASS_START);
+ break;
+ case LONG_GRASS_BASE_LEFT:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_CENTER:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS);
+ break;
+ case LONG_GRASS_BASE_RIGHT:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS);
+ break;
+ }
+ }
+}
-// .rodata
+void sub_80D42B8(s16 x, s16 y)
+{
+ if (MapGridGetMetatileIdAt(x, y) == METATILE_ID_GRASS)
+ {
+ u8 metatileBehavior = MapGridGetMetatileBehaviorAt(x, y + 1);
+ if (MetatileBehavior_IsLongGrassSouthEdge(metatileBehavior))
+ {
+ s32 metatileId = MapGridGetMetatileIdAt(x, y + 1);
+ switch (metatileId)
+ {
+ case METATILE_ID_POKE_LONG_GRASS_START:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_GRASS);
+ break;
+ case METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS);
+ break;
+ case METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS);
+ break;
+ case METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS:
+ MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS);
+ break;
+ }
+ }
+ }
+}
-// .text
+static void StartCutTreeFieldEffect(void)
+{
+ PlaySE(SE_W015);
+ FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE);
+ EnableBothScriptContexts();
+}
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
new file mode 100644
index 000000000..654f02c23
--- /dev/null
+++ b/src/fldeff_flash.c
@@ -0,0 +1,367 @@
+#include "global.h"
+#include "constants/songs.h"
+#include "braille_puzzles.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_effect.h"
+#include "gpu_regs.h"
+#include "gba/io_reg.h"
+#include "main.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "overworld.h"
+#include "rom6.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+
+// structures
+struct FlashStruct
+{
+ u8 unk0;
+ u8 unk1;
+ bool8 unk2;
+ bool8 unk3;
+ void (*func)(void);
+};
+
+// static functions
+static void hm2_flash(void);
+static void sub_81371B4(void);
+static bool8 sub_8137304(void);
+static void sub_81373F0(void);
+static void sub_8137404(u8 taskId);
+static void sub_8137420(u8 taskId);
+static void sub_81374C4(u8 taskId);
+static void sub_813750C(u8 taskId);
+static void sub_8137574(u8 taskId);
+static void sub_81375A8(void);
+static void sub_81375BC(u8 taskId);
+static void sub_81375D8(u8 taskId);
+static void sub_8137678(u8 taskId);
+static void sub_81376DC(u8 taskId);
+
+// rodata
+static const struct FlashStruct gUnknown_085B27C8[] =
+{
+ {1, 4, 1, 0, sub_81375A8},
+ {2, 4, 1, 0, sub_81375A8},
+ {3, 4, 1, 0, sub_81375A8},
+ {5, 4, 1, 0, sub_81375A8},
+ {6, 4, 1, 0, sub_81375A8},
+ {7, 4, 1, 0, sub_81375A8},
+ {8, 4, 1, 0, sub_81375A8},
+ {9, 4, 1, 0, sub_81375A8},
+ {4, 1, 0, 1, sub_81373F0},
+ {4, 2, 0, 1, sub_81373F0},
+ {4, 3, 0, 1, sub_81373F0},
+ {4, 5, 0, 1, sub_81373F0},
+ {4, 6, 0, 1, sub_81373F0},
+ {4, 7, 0, 1, sub_81373F0},
+ {4, 8, 0, 1, sub_81373F0},
+ {4, 9, 0, 1, sub_81373F0},
+ {0, 0, 0, 0, NULL},
+};
+
+static const u16 gCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal");
+static const u16 gCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal");
+
+static const u16 gUnknown_085B2890[] = INCBIN_U16("graphics/misc/85B2890.gbapal");
+static const u16 gUnknown_085B28A0[] = INCBIN_U16("graphics/misc/85B28A0.gbapal");
+static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz");
+static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz");
+
+// text
+bool8 SetUpFieldMove_Flash(void)
+{
+ if (ShouldDoBrailleFlyEffect())
+ {
+ gSpecialVar_Result = GetCursorSelectionMonId();
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = sub_8179918;
+ return TRUE;
+ }
+ else if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = hm2_flash;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void hm2_flash(void)
+{
+ u8 taskId = oei_task_add();
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ gTasks[taskId].data[8] = (uintptr_t)sub_81371B4 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_81371B4;
+}
+
+static void sub_81371B4(void)
+{
+ PlaySE(SE_W115);
+ FlagSet(FLAG_SYS_USE_FLASH);
+ ScriptContext1_SetupScript(EventScript_2926F8);
+}
+
+static void sub_81371D4(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_81371EC(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void c2_change_map(void)
+{
+ u16 ime;
+
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+ ResetPaletteFade();
+ ResetTasks();
+ ResetSpriteData();
+ ime = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = ime;
+ SetVBlankCallback(sub_81371EC);
+ SetMainCallback2(sub_81371D4);
+ if (!sub_8137304())
+ SetMainCallback2(gMain.savedCallback);
+}
+
+static bool8 sub_8137304(void)
+{
+ u8 i;
+ u8 v0 = get_map_light_from_warp0();
+ u8 v1 = Overworld_GetMapTypeOfSaveblockLocation();
+
+ for (i = 0; gUnknown_085B27C8[i].unk0; i++)
+ {
+ if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
+ {
+ gUnknown_085B27C8[i].func();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 sub_8137360(u8 a1, u8 a2)
+{
+ u8 i;
+ u8 v0 = a1;
+ u8 v1 = a2;
+
+ for (i = 0; gUnknown_085B27C8[i].unk0; i++)
+ {
+ if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
+ {
+ return gUnknown_085B27C8[i].unk2;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 fade_type_for_given_maplight_pair(u8 a1, u8 a2)
+{
+ u8 i;
+ u8 v0 = a1;
+ u8 v1 = a2;
+
+ for (i = 0; gUnknown_085B27C8[i].unk0; i++)
+ {
+ if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
+ {
+ return gUnknown_085B27C8[i].unk3;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_81373F0(void)
+{
+ CreateTask(sub_8137404, 0);
+}
+
+static void sub_8137404(u8 taskId)
+{
+ gTasks[taskId].func = sub_8137420;
+}
+
+static void sub_8137420(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
+ LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
+ LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
+ LoadPalette(gUnknown_085B28A0, 0xE0, 0x10);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
+ | BLDCNT_EFFECT_BLEND
+ | BLDCNT_TGT2_BG1
+ | BLDCNT_TGT2_BG2
+ | BLDCNT_TGT2_BG3
+ | BLDCNT_TGT2_OBJ
+ | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(3)
+ | BGCNT_SCREENBASE(31)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_OBJ_ON);
+ gTasks[taskId].func = sub_81374C4;
+ gTasks[taskId].data[0] = 16;
+ gTasks[taskId].data[1] = 0;
+}
+
+static void sub_81374C4(u8 taskId)
+{
+ u16 count = gTasks[taskId].data[1];
+ u16 blend = count + 0x1000;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, blend);
+ if (count <= 0x10)
+ {
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_813750C;
+ }
+}
+
+static void sub_813750C(u8 taskId)
+{
+ u16 count;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 16));
+ count = gTasks[taskId].data[2];
+
+ if (count < 8)
+ {
+ gTasks[taskId].data[2]++;
+ LoadPalette(&gUnknown_085B28A0[count], 0xE0, 16 - 2 * count);
+ }
+ else
+ {
+ LoadPalette(gCaveTransitionPalette_White, 0, 0x20);
+ gTasks[taskId].func = sub_8137574;
+ gTasks[taskId].data[2] = 8;
+ }
+}
+
+static void sub_8137574(u8 taskId)
+{
+ if (gTasks[taskId].data[2])
+ gTasks[taskId].data[2]--;
+ else
+ SetMainCallback2(gMain.savedCallback);
+}
+
+static void sub_81375A8(void)
+{
+ CreateTask(sub_81375BC, 0);
+}
+
+static void sub_81375BC(u8 taskId)
+{
+ gTasks[taskId].func = sub_81375D8;
+}
+
+static void sub_81375D8(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
+ LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(3)
+ | BGCNT_SCREENBASE(31)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_OBJ_ON);
+ LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
+ LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
+ gTasks[taskId].func = sub_8137678;
+ gTasks[taskId].data[0] = 16;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+}
+
+static void sub_8137678(u8 taskId)
+{
+ u16 count = gTasks[taskId].data[2];
+
+ if (count < 16)
+ {
+ gTasks[taskId].data[2]++;
+ gTasks[taskId].data[2]++;
+ LoadPalette(&gUnknown_085B2890[15 - count], 0xE0, 2 * (count + 1));
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 16));
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
+ | BLDCNT_EFFECT_BLEND
+ | BLDCNT_TGT2_BG1
+ | BLDCNT_TGT2_BG2
+ | BLDCNT_TGT2_BG3
+ | BLDCNT_TGT2_OBJ
+ | BLDCNT_TGT2_BD);
+ gTasks[taskId].func = sub_81376DC;
+ }
+}
+
+static void sub_81376DC(u8 taskId)
+{
+ u16 count = 16 - gTasks[taskId].data[1];
+ u16 blend = count + 0x1000;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, blend);
+ if (count)
+ {
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
+ SetMainCallback2(gMain.savedCallback);
+ }
+}
diff --git a/src/fldeff_groundshake.c b/src/fldeff_groundshake.c
new file mode 100644
index 000000000..60b078982
--- /dev/null
+++ b/src/fldeff_groundshake.c
@@ -0,0 +1,299 @@
+#include "global.h"
+#include "global.fieldmap.h"
+#include "constants/flags.h"
+#include "constants/songs.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "event_object_movement.h"
+#include "malloc.h"
+#include "random.h"
+#include "roulette_util.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+
+// structures
+struct Struct203CF18 {
+ u8 taskId;
+ struct InnerStruct203CF18 unk4;
+}; //size = 0xC8
+
+// extern data
+extern const struct SpriteSheet gUnknown_08617D94[];
+extern const s16 gUnknown_08617D64[][3];
+
+// static functions
+static void sub_81BE808(u8 taskId);
+static void sub_81BE900(u8 taskId);
+static void sub_81BE968(void);
+static void sub_81BE9C0(u8 taskId);
+static void sub_81BEA00(u8 taskId);
+static void sub_81BEA20(void);
+static void sub_81BEAD8(struct Sprite* sprite);
+
+// rodata
+static const u8 gUnknown_08617E18[] = {0x3b, 0x43, 0x61, 0x00, 0x0f, 0x05, 0xff, 0x9b};
+
+static const union AnimCmd gSpriteAnim_8617E20[] =
+{
+ ANIMCMD_FRAME(0, 12),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8617E28[] =
+{
+ gSpriteAnim_8617E20,
+};
+
+static const struct OamData gUnknown_08617E2C =
+{
+ .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,
+};
+
+static const struct SpriteTemplate gUnknown_08617E34 = {
+ 0x0FA0, 0xFFFF, &gUnknown_08617E2C, gSpriteAnimTable_8617E28, NULL, gDummySpriteAffineAnimTable, sub_81BEAD8
+};
+
+static const union AnimCmd gSpriteAnim_8617E4C[] =
+{
+ ANIMCMD_FRAME(0, 12),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const gSpriteAnim_8617E54[] =
+{
+ gSpriteAnim_8617E4C,
+};
+
+static const struct OamData gSpriteAnim_8617E58 =
+{
+ .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,
+};
+
+static const struct SpriteTemplate gUnknown_08617E60 = {
+ 0x0FA0, 0xFFFF, &gSpriteAnim_8617E58, gSpriteAnim_8617E54, NULL, gDummySpriteAffineAnimTable, sub_81BEAD8
+};
+
+// ewram
+EWRAM_DATA struct Struct203CF18 *gUnknown_0203CF18 = NULL;
+
+// text
+bool8 sub_81BE66C(void)
+{
+ if (!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A))
+ return 0;
+ return FlagGet(FLAG_0x14E);
+}
+
+void sub_81BE698(u8 taskId)
+{
+ sub_8151E50(&(gUnknown_0203CF18->unk4));
+}
+
+void sub_81BE6AC(void)
+{
+ gUnknown_0203CF18 = NULL;
+}
+
+void sub_81BE6B8(void)
+{
+ if(gUnknown_0203CF18 != NULL)
+ {
+ gUnknown_0203CF18 = NULL;
+ return;
+ }
+ if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E))
+ return;
+
+ gUnknown_0203CF18 = (struct Struct203CF18 *)AllocZeroed(sizeof(struct Struct203CF18));
+ sub_8151B3C(&(gUnknown_0203CF18->unk4));
+ sub_8151B68(&(gUnknown_0203CF18->unk4), gUnknown_08617E18);
+ sub_8151CA8(&(gUnknown_0203CF18->unk4), 1, 1);
+ gUnknown_0203CF18->taskId = CreateTask(sub_81BE698, 0xFF);
+}
+
+void sub_81BE72C(void)
+{
+ if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E) || gUnknown_0203CF18 == NULL)
+ return;
+ if(FuncIsActiveTask(sub_81BE698))
+ DestroyTask(gUnknown_0203CF18->taskId);
+ sub_8151D28(&(gUnknown_0203CF18->unk4), 1, 1);
+ sub_8151C50(&(gUnknown_0203CF18->unk4), 1, 1);
+ Free(gUnknown_0203CF18);
+ gUnknown_0203CF18 = NULL;
+}
+
+void sub_81BE79C(void)
+{
+ u16 rand;
+ bool8 chance;
+
+ if(VarGet(VAR_0x40CB) != 0)
+ {
+ FlagClear(FLAG_0x14E);
+ return;
+ }
+ rand = Random();
+ chance = rand & 1;
+ if(FlagGet(FLAG_0x09D) == TRUE)
+ chance = TRUE;
+ if(chance)
+ {
+ FlagSet(FLAG_0x14E);
+ sub_81BE6B8();
+ return;
+ }
+ FlagClear(FLAG_0x14E);
+}
+
+void sub_81BE7F4(void)
+{
+ CreateTask(sub_81BE808, 0x8);
+}
+
+static void sub_81BE808(u8 taskId)
+{
+ u8 eventObjectIdBuffer;
+ struct EventObject *fieldEventObject;
+ struct EventObject *playerAvatarEventObject;
+
+ TryGetEventObjectIdByLocalIdAndMap(0x2D, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectIdBuffer);
+ fieldEventObject = &(gEventObjects[eventObjectIdBuffer]);
+ gSprites[fieldEventObject->spriteId].pos2.y += 4;
+ playerAvatarEventObject = &(gEventObjects[gPlayerAvatar.eventObjectId]);
+
+ if((gSprites[fieldEventObject->spriteId].pos1.y + gSprites[fieldEventObject->spriteId].pos2.y) >=
+ (gSprites[playerAvatarEventObject->spriteId].pos1.y + gSprites[playerAvatarEventObject->spriteId].pos2.y))
+ {
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}
+
+static void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d)
+{
+ u8 taskId;
+
+ taskId = CreateTask(sub_81BE900, 0x9);
+ gTasks[taskId].data[0] = b;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = c;
+ gTasks[taskId].data[3] = d;
+ gTasks[taskId].data[4] = a;
+ SetCameraPanningCallback(NULL);
+ PlaySE(SE_W070);
+}
+
+static void sub_81BE900(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ data[1]++;
+ if((data[1] % data[3]) == 0)
+ {
+ data[1] = 0;
+ data[2]--;
+ data[0] = -data[0];
+ data[4] = -data[4];
+ SetCameraPanning(data[0], data[4]);
+ if(!data[2])
+ {
+ sub_81BE968();
+ DestroyTask(taskId);
+ InstallCameraPanAheadCallback();
+ }
+ }
+}
+
+static void sub_81BE968(void)
+{
+ u8 taskId;
+
+ taskId = FindTaskIdByFunc(sub_81BE9C0);
+ if(taskId != 0xFF)
+ gTasks[taskId].data[0]++;
+}
+
+void sub_81BE994(void)
+{
+ LoadSpriteSheets(gUnknown_08617D94);
+ sub_81BEA20();
+ CreateTask(sub_81BE9C0, 0x8);
+ sp136_strengh_sound(2, 1, 16, 3);
+}
+
+static void sub_81BE9C0(u8 taskId)
+{
+ u16 *data;
+
+ data = gTasks[taskId].data;
+ data[1]++;
+ if(data[1] == 1000 || data[0] == 17)
+ gTasks[taskId].func = sub_81BEA00;
+}
+
+static void sub_81BEA00(u8 taskId)
+{
+ FreeSpriteTilesByTag(4000);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+static void sub_81BEA20(void)
+{
+ u8 i;
+ u8 spriteId;
+
+ for(i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_08617E60, gUnknown_08617D64[i][0] + 120, gUnknown_08617D64[i][1], 8);
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].oam.paletteNum = 0;
+ gSprites[spriteId].data[0] = i;
+ }
+ for(i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_08617E34, gUnknown_08617D64[i][0] + 115, gUnknown_08617D64[i][1] - 3, 8);
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].oam.paletteNum = 0;
+ gSprites[spriteId].data[0] = i;
+ }
+}
+
+static void sub_81BEAD8(struct Sprite* sprite)
+{
+ sprite->data[1] += 2;
+ sprite->pos2.y = (sprite->data[1] / 2);
+ if(((sprite->pos1.y) + (sprite->pos2.y)) > gUnknown_08617D64[sprite->data[0]][2])
+ {
+ DestroySprite(sprite);
+ sub_81BE968();
+ }
+}
diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c
new file mode 100644
index 000000000..d0a40a9a9
--- /dev/null
+++ b/src/fldeff_softboiled.c
@@ -0,0 +1,109 @@
+#include "global.h"
+#include "menu.h"
+#include "party_menu.h"
+#include "pokemon.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+
+static void sub_816166C(u8 taskId);
+static void sub_81616C0(u8 taskId);
+static void sub_8161724(u8 taskId);
+static void sub_81617B8(u8 taskId);
+
+bool8 SetUpFieldMove_SoftBoiled(void)
+{
+ u16 maxHp;
+ u16 hp;
+ u16 minHp;
+
+ maxHp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_MAX_HP);
+ hp = GetMonData(&gPlayerParty[GetCursorSelectionMonId()], MON_DATA_HP);
+
+ minHp = (maxHp / 5);
+ if (hp > minHp)
+ return TRUE;
+ return FALSE;
+}
+
+void sub_8161560(u8 taskId)
+{
+ gUnknown_0203CEC8.unkB = 0xA;
+ gUnknown_0203CEC8.unkA = gUnknown_0203CEC8.unk9;
+ sub_81B0FCC(GetCursorSelectionMonId(), 0x1);
+ display_pokemon_menu_message(0x5);
+ gTasks[taskId].func = sub_81B1370;
+}
+
+void sub_81615A8(u8 taskId)
+{
+ u16 hp;
+
+ u8 unk9 = gUnknown_0203CEC8.unk9;
+ u8 pokemonIndex = gUnknown_0203CEC8.unkA;
+ if(pokemonIndex > 6)
+ {
+ gUnknown_0203CEC8.unkB = 0;
+ display_pokemon_menu_message(0x0);
+ gTasks[taskId].func = sub_81B1370;
+ return;
+ }
+
+ hp = GetMonData(&gPlayerParty[pokemonIndex], MON_DATA_HP);
+ if(hp == 0 || unk9 == pokemonIndex || GetMonData(&gPlayerParty[pokemonIndex], MON_DATA_MAX_HP) == hp)
+ {
+ sub_81617B8(taskId);
+ return;
+ }
+
+ PlaySE(SE_KAIFUKU);
+ sub_81B1F18(taskId, unk9, -1, GetMonData(&gPlayerParty[unk9], MON_DATA_MAX_HP)/5, sub_816166C);
+}
+
+static void sub_816166C(u8 taskId)
+{
+ PlaySE(SE_KAIFUKU);
+ sub_81B1F18(taskId, gUnknown_0203CEC8.unkA, 1, GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAX_HP)/5, sub_81616C0);
+}
+
+static void sub_81616C0(u8 taskId)
+{
+ GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unkA], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);
+ sub_81B1B5C(gStringVar4, 0);
+ schedule_bg_copy_tilemap_to_vram(2);
+ gTasks[taskId].func = sub_8161724;
+}
+
+static void sub_8161724(u8 taskId)
+{
+ if(sub_81B1BD4() == 1)
+ return;
+ gUnknown_0203CEC8.unkB = 0x0;
+ sub_81B0FCC(gUnknown_0203CEC8.unk9, 0);
+ gUnknown_0203CEC8.unk9 = gUnknown_0203CEC8.unkA;
+ sub_81B0FCC(gUnknown_0203CEC8.unkA, 1);
+ sub_8198070(0x6, FALSE);
+ ClearWindowTilemap(0x6);
+ display_pokemon_menu_message(0);
+ gTasks[taskId].func = sub_81B1370;
+}
+
+static void sub_8161784(u8 taskId)
+{
+ if(sub_81B1BD4() == 1)
+ return;
+ display_pokemon_menu_message(0x5);
+ gTasks[taskId].func = sub_81B1370;
+}
+
+static void sub_81617B8(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+ sub_81B1B5C(&gText_CantBeUsedOnPkmn, 0);
+ schedule_bg_copy_tilemap_to_vram(2);
+ gTasks[taskId].func = sub_8161784;
+}
diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c
new file mode 100644
index 000000000..74eb100bc
--- /dev/null
+++ b/src/fldeff_strength.c
@@ -0,0 +1,47 @@
+#include "global.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_effect.h"
+#include "party_menu.h"
+#include "rom6.h"
+#include "script.h"
+#include "task.h"
+#include "constants/event_objects.h"
+
+// static functions
+static void FldEff_UseStrength(void);
+static void sub_8145E74(void);
+
+// text
+bool8 SetUpFieldMove_Strength(void)
+{
+ if (CheckObjectGraphicsInFrontOfPlayer(EVENT_OBJ_GFX_PUSHABLE_BOULDER) == TRUE)
+ {
+ gSpecialVar_Result = GetCursorSelectionMonId();
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = FldEff_UseStrength;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void FldEff_UseStrength(void)
+{
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ ScriptContext1_SetupScript(FieryPath_EventScript_2908FD);
+}
+
+bool8 sub_8145E2C(void)
+{
+ u8 taskId = oei_task_add();
+ gTasks[taskId].data[8] = (u32)sub_8145E74 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_8145E74;
+ GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1);
+ return FALSE;
+}
+
+static void sub_8145E74(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH);
+ EnableBothScriptContexts();
+}
diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c
new file mode 100644
index 000000000..14da87eb3
--- /dev/null
+++ b/src/fldeff_sweetscent.c
@@ -0,0 +1,98 @@
+#include "global.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "field_screen.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "rom6.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "wild_encounter.h"
+
+void hm2_sweet_scent(void);
+void sub_8159F5C(void);
+void sub_8159FEC(u8 taskId);
+void sub_815A090(u8 taskId);
+void sub_81BE6B8(void);
+void sub_81BE72C(void);
+
+bool8 SetUpFieldMove_SweetScent(void)
+{
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = hm2_sweet_scent;
+ return TRUE;
+}
+
+void hm2_sweet_scent(void)
+{
+ FieldEffectStart(FLDEFF_SWEET_SCENT);
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+}
+
+bool8 FldEff_SweetScent()
+{
+ u8 taskId;
+
+ sub_80AC3D0();
+ taskId = oei_task_add();
+ gTasks[taskId].data[8] = (u32)sub_8159F5C >> 16;
+ gTasks[taskId].data[9] = (u32)sub_8159F5C;
+ return FALSE;
+}
+
+void sub_8159F5C(void)
+{
+ u8 taskId;
+
+ PlaySE(SE_W230);
+ CpuFastSet(gPlttBufferUnfaded, gPaletteDecompressionBuffer, 0x100);
+ CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100);
+ BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB_RED);
+ taskId = CreateTask(sub_8159FEC, 0);
+ gTasks[taskId].data[0] = 0;
+ FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT);
+}
+
+void sub_8159FEC(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81BE72C();
+ BlendPalettes(0x00000040, 8, RGB_RED);
+ if (gTasks[taskId].data[0] == 64)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (SweetScentWildEncounter() == TRUE)
+ {
+ DestroyTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].func = sub_815A090;
+ BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB_RED);
+ sub_81BE6B8();
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+}
+
+void sub_815A090(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ CpuFastSet(gPaletteDecompressionBuffer, gPlttBufferUnfaded, 0x100);
+ sub_80AC3E4();
+ ScriptContext1_SetupScript(EventScript_290CAE);
+ DestroyTask(taskId);
+ }
+}
diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c
new file mode 100644
index 000000000..e82a26cd1
--- /dev/null
+++ b/src/fldeff_teleport.c
@@ -0,0 +1,43 @@
+#include "global.h"
+#include "fldeff_teleport.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "party_menu.h"
+#include "overworld.h"
+#include "rom6.h"
+#include "task.h"
+
+bool8 SetUpFieldMove_Teleport(void)
+{
+ if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = hm_teleport_run_dp02scr;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void hm_teleport_run_dp02scr(void)
+{
+ Overworld_ResetStateAfterTeleport();
+ FieldEffectStart(FLDEFF_USE_TELEPORT);
+ gFieldEffectArguments[0] = (u32)GetCursorSelectionMonId();
+}
+
+bool8 FldEff_UseTeleport(void)
+{
+ u8 taskId = oei_task_add();
+ gTasks[taskId].data[8] = (u32)sub_817C94C >> 16;
+ gTasks[taskId].data[9] = (u32)sub_817C94C;
+ SetPlayerAvatarTransitionFlags(1);
+ return FALSE;
+}
+
+void sub_817C94C(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT);
+ CreateTeleportFieldEffectTask();
+}
+
+
diff --git a/src/fossil_specials.c b/src/fossil_specials.c
new file mode 100644
index 000000000..49db0f5b6
--- /dev/null
+++ b/src/fossil_specials.c
@@ -0,0 +1,770 @@
+#include "global.h"
+#include "constants/flags.h"
+#include "constants/songs.h"
+#include "bg.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "event_object_movement.h"
+#include "fieldmap.h"
+#include "global.fieldmap.h"
+#include "gpu_regs.h"
+#include "malloc.h"
+#include "menu.h"
+#include "random.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "window.h"
+
+#define MIRAGE_TOWER_GFX_LENGTH (sizeof(gUnknown_08617274) + sizeof(gMirageTower_Gfx))
+#define MIRAGE_TOWER_PALETTE_LENGTH 0x800
+#define ROOT_FOSSIL_GFX_LENGTH sizeof(gRootFossil_Gfx)
+#define ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH 0x100
+
+//struct
+struct Struct8617DA4 {
+ u8 x;
+ u8 y;
+ u16 tileId;
+};
+
+struct Struct203CF10 {
+ u8 *buffer;
+ u8 curr_buffer_index;
+};
+
+struct DynamicSpriteFrameImage{
+ u8 *data;
+ u16 size;
+};
+
+struct Struct203CF0C {
+ u8 *frameImageTiles;
+ struct DynamicSpriteFrameImage *frameImage;
+ u8 spriteId;
+ u16 *unkC;
+ u16 unk10;
+};
+
+// static functions
+static void sub_81BED50(u8 taskId);
+static void sub_81BEBF4(u8 taskId);
+static void sub_81BF028(u8 taskId);
+static void sub_81BF248(struct Sprite *);
+/*static*/ void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e);
+
+// .rodata
+static const u8 gUnknown_08617274[] = {00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00};
+static const u8 gMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp");
+static const u16 gUnknown_08617B94[] = INCBIN_U16("graphics/misc/mirage_tower.bin");
+static const u16 gRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal");
+static const u8 gRootFossil_Gfx[] = INCBIN_U8("graphics/misc/fossil.4bpp");
+static const u8 gMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower_crumbles.4bpp");
+static const u16 gMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal");
+
+const s16 gUnknown_08617D64[][3] =
+ {
+ { 0, 10, 65},
+ { 17, 3, 50},
+ {-12, 0, 75},
+ { 10, 15, 90},
+ { 7, 8, 65},
+ {-18, 5, 75},
+ { 22, -10, 55},
+ {-24, -4, 65},
+ };
+
+const struct SpriteSheet gUnknown_08617D94[] =
+{
+ {gMirageTowerCrumbles_Gfx, 0x0080, 0x0fa0},
+ {NULL}
+};
+
+static const struct Struct8617DA4 gUnknown_08617DA4[] =
+ {
+ {0x12, 0x35, 0x251},
+ {0x13, 0x35, 0x251},
+ {0x14, 0x35, 0x251},
+ {0x12, 0x36, 0x251},
+ {0x13, 0x36, 0x251},
+ {0x14, 0x36, 0x251},
+ {0x12, 0x37, 0x251},
+ {0x13, 0x37, 0x251},
+ {0x14, 0x37, 0x251},
+ {0x12, 0x38, 0x251},
+ {0x13, 0x38, 0x251},
+ {0x14, 0x38, 0x251},
+ {0x12, 0x39, 0x259},
+ {0x13, 0x39, 0x259},
+ {0x14, 0x39, 0x259},
+ {0x12, 0x3A, 0x121},
+ {0x13, 0x3A, 0x121},
+ {0x14, 0x3A, 0x121},
+ };
+
+static const union AnimCmd gSpriteAnim_8617DEC[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const struct OamData gOamData_8617DF4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 3,
+ .affineParam = 0,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8617DFC[] =
+{
+ gSpriteAnim_8617DEC,
+};
+
+static const struct SpriteTemplate gUnknown_08617E00 = {
+ 0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+// ewram
+EWRAM_DATA u8* gUnknown_0203CF04 = NULL;
+EWRAM_DATA u8* gUnknown_0203CF08 = NULL;
+EWRAM_DATA struct Struct203CF0C *gUnknown_0203CF0C = NULL;
+EWRAM_DATA struct Struct203CF10 *gUnknown_0203CF10 = NULL;
+EWRAM_DATA u16 *gUnknown_0203CF14 = NULL;
+
+// iwram
+IWRAM_DATA u16 gUnknown_030012A8[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+// text
+void sub_81BEB24(void)
+{
+ u8 i;
+ for(i = 0; i < (sizeof(gUnknown_08617DA4)/sizeof(gUnknown_08617DA4[0])); i++)
+ MapGridSetMetatileIdAt(gUnknown_08617DA4[i].x + 7, gUnknown_08617DA4[i].y + 7, gUnknown_08617DA4[i].tileId);
+ DrawWholeMapView();
+}
+
+void sub_81BEB54(void)
+{
+ CreateTask(sub_81BED50, 0x9);
+}
+
+void sub_81BEB68(void)
+{
+ CreateTask(sub_81BEBF4, 0x9);
+}
+
+void sub_81BEB7C(void)
+{
+ CreateTask(sub_81BF028, 0x9);
+}
+
+void sub_81BEB90(void)
+{
+ SetGpuReg(REG_OFFSET_BG0HOFS, gUnknown_0203CF14[0]);
+ SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_0203CF14[1]);
+}
+
+void sub_81BEBB4(u8 taskId)
+{
+ if(!(gTasks[taskId].data[0]))
+ {
+ gUnknown_0203CF14[0] = -gUnknown_0203CF14[0];
+ gTasks[taskId].data[0] = 2;
+ sub_81BEB90();
+ }
+ else
+ gTasks[taskId].data[0]--;
+}
+
+static void sub_81BEBF4(u8 taskId)
+{
+ u8 zero;
+
+ switch(gTasks[taskId].data[0])
+ {
+ case 0:
+ FreeAllWindowBuffers();
+ SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ gUnknown_0203CF04 = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH);
+ gUnknown_0203CF08 = (u8 *)AllocZeroed(MIRAGE_TOWER_PALETTE_LENGTH);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ CpuSet(gUnknown_08617274, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH / 2);
+ LoadBgTiles(0, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ SetBgTilemapBuffer(0, gUnknown_0203CF08);
+ CopyToBgTilemapBufferRect_ChangePalette(0, &gUnknown_08617B94, 12, 29, 6, 12, 17);
+ CopyBgTilemapBufferToVram(0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ ShowBg(0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 5:
+ sub_81BEB24();
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ gUnknown_0203CF14 = (u16 *)Alloc(4);
+ zero = 0;
+ gUnknown_0203CF14[0] = 2;
+ gUnknown_0203CF14[1] = zero;
+ CreateTask(sub_81BEBB4, 0xA);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+#define OUTER_BUFFER_LENGTH 0x60
+#define INNER_BUFFER_LENGTH 0x30
+static void sub_81BED50(u8 taskId)
+{
+ u8 anotherTaskId, j;
+
+
+ switch(gTasks[taskId].data[0])
+ {
+ case 1:
+ gUnknown_0203CF10 = (struct Struct203CF10 *)AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10));
+ break;
+ case 3:
+ {
+ u16 i;
+ u16 left;
+ u32 index, next;
+
+ index = (u16)gTasks[taskId].data[3];
+ if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
+ {
+ if(gTasks[taskId].data[1] > 1)
+ {
+ index = (u8)index;
+ gUnknown_0203CF10[index].buffer = (u8 *)Alloc(INNER_BUFFER_LENGTH);
+ for(i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
+ gUnknown_0203CF10[index].buffer[i] = i;
+ for(i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
+ {
+ u16 rand1, rand2, temp;
+
+ rand1 = Random() % 0x30;
+ rand2 = Random() % 0x30;
+ temp = gUnknown_0203CF10[index].buffer[rand2];
+ gUnknown_0203CF10[index].buffer[rand2] = gUnknown_0203CF10[index].buffer[rand1];
+ gUnknown_0203CF10[index].buffer[rand1] = temp;
+ }
+ if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
+ gTasks[taskId].data[3]++;
+ gTasks[taskId].data[1] = 0;
+ }
+ gTasks[taskId].data[1]++;
+ }
+ index = (u8)gTasks[taskId].data[3];
+ for(left = (u8)gTasks[taskId].data[2]; left < (u16)index; left = next)
+ {
+ j = 0;
+ next = left + 1;
+ while(!j)
+ {
+ sub_81BF2B8(gUnknown_0203CF04, ((((OUTER_BUFFER_LENGTH - 1) - left) * INNER_BUFFER_LENGTH) + gUnknown_0203CF10[left].buffer[(gUnknown_0203CF10[left].curr_buffer_index)++]), 0, INNER_BUFFER_LENGTH, 1);
+ j++;
+ }
+ if(gUnknown_0203CF10[left].curr_buffer_index > (INNER_BUFFER_LENGTH - 1))
+ {
+ FREE_AND_SET_NULL(gUnknown_0203CF10[left].buffer);
+ gTasks[taskId].data[2]++;
+ if((left % 2) == 1)
+ gUnknown_0203CF14[1]--;
+ }
+ }
+ LoadBgTiles(0, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0);
+ if(gUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].curr_buffer_index > (INNER_BUFFER_LENGTH - 1))
+ break;
+ return;
+ }
+ case 4:
+ UnsetBgTilemapBuffer(0);
+ anotherTaskId = FindTaskIdByFunc(sub_81BEBB4);
+ if(anotherTaskId != 0xFF)
+ DestroyTask(anotherTaskId);
+ gUnknown_0203CF14[1] = gUnknown_0203CF14[0] = 0;
+ sub_81BEB90();
+ break;
+ case 5:
+ FREE_AND_SET_NULL(gUnknown_0203CF14);
+ FREE_AND_SET_NULL(gUnknown_0203CF10);
+ FREE_AND_SET_NULL(gUnknown_0203CF04);
+ FREE_AND_SET_NULL(gUnknown_0203CF08);
+ break;
+ case 6:
+ SetGpuRegBits(REG_OFFSET_BG2CNT, 0x2);
+ SetGpuRegBits(REG_OFFSET_BG0CNT, 0x0);
+ SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 0);
+ sub_81971D0();
+ break;
+ case 7:
+ ShowBg(0);
+ break;
+ case 8:
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+ gTasks[taskId].data[0]++;
+}
+
+#else
+NAKED
+static void sub_81BED50(u8 taskId)
+{
+ asm("\n\
+ .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, 0x10\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ ldr r1, =gTasks\n\
+ lsls r0, 2\n\
+ add r0, r10\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x8]\n\
+ subs r0, 0x1\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ adds r6, r1, 0\n\
+ cmp r0, 0x7\n\
+ bls _081BED7C\n\
+ b _081BF002\n\
+ _081BED7C:\n\
+ lsls r0, 2\n\
+ ldr r1, =_081BED90\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
+ _081BED90:\n\
+ .4byte _081BEDB0\n\
+ .4byte _081BF002\n\
+ .4byte _081BEDC4\n\
+ .4byte _081BEF64\n\
+ .4byte _081BEF94\n\
+ .4byte _081BEFD0\n\
+ .4byte _081BEFF0\n\
+ .4byte _081BEFF8\n\
+ _081BEDB0:\n\
+ ldr r4, =gUnknown_0203CF10\n\
+ movs r0, 0xC0\n\
+ lsls r0, 2\n\
+ bl AllocZeroed\n\
+ str r0, [r4]\n\
+ b _081BF002\n\
+ .pool\n\
+ _081BEDC4:\n\
+ mov r1, r10\n\
+ lsls r0, r1, 2\n\
+ adds r1, r0, r1\n\
+ lsls r1, 3\n\
+ adds r2, r1, r6\n\
+ ldrh r3, [r2, 0xE]\n\
+ movs r4, 0xE\n\
+ ldrsh r1, [r2, r4]\n\
+ str r0, [sp, 0x8]\n\
+ cmp r1, 0x5F\n\
+ bgt _081BEE8A\n\
+ movs r1, 0xA\n\
+ ldrsh r0, [r2, r1]\n\
+ cmp r0, 0x1\n\
+ ble _081BEE7C\n\
+ lsls r0, r3, 24\n\
+ lsrs r4, r0, 24\n\
+ movs r0, 0x30\n\
+ bl Alloc\n\
+ ldr r3, =gUnknown_0203CF10\n\
+ ldr r1, [r3]\n\
+ lsls r2, r4, 3\n\
+ adds r1, r2, r1\n\
+ str r0, [r1]\n\
+ movs r5, 0\n\
+ adds r4, r2, 0\n\
+ _081BEDFA:\n\
+ ldr r0, [r3]\n\
+ adds r0, r4, r0\n\
+ ldr r0, [r0]\n\
+ adds r0, r5\n\
+ strb r5, [r0]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ cmp r5, 0x2F\n\
+ bls _081BEDFA\n\
+ movs r5, 0\n\
+ ldr r7, =gUnknown_0203CF10\n\
+ adds r6, r2, 0\n\
+ _081BEE14:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x30\n\
+ bl __umodsi3\n\
+ adds r4, r0, 0\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x30\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ ldr r1, [r7]\n\
+ adds r1, r6, r1\n\
+ ldr r1, [r1]\n\
+ adds r0, r1, r0\n\
+ ldrb r2, [r0]\n\
+ adds r1, r4 \n\
+ ldrb r1, [r1]\n\
+ strb r1, [r0]\n\
+ ldr r0, [r7]\n\
+ adds r0, r6, r0\n\
+ ldr r0, [r0]\n\
+ adds r0, r4\n\
+ strb r2, [r0]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ cmp r5, 0x2F\n\
+ bls _081BEE14\n\
+ ldr r0, =gTasks\n\
+ ldr r1, [sp, 0x8]\n\
+ add r1, r10\n\
+ lsls r1, 3\n\
+ adds r2, r1, r0\n\
+ ldrh r3, [r2, 0xE]\n\
+ movs r4, 0xE\n\
+ ldrsh r1, [r2, r4]\n\
+ adds r6, r0, 0\n\
+ cmp r1, 0x5F\n\
+ bgt _081BEE78\n\
+ adds r0, r3, 0x1\n\
+ strh r0, [r2, 0xE]\n\
+ _081BEE78:\n\
+ movs r0, 0\n\
+ strh r0, [r2, 0xA]\n\
+ _081BEE7C:\n\
+ ldr r1, [sp, 0x8]\n\
+ add r1, r10\n\
+ lsls r1, 3\n\
+ adds r1, r6\n\
+ ldrh r0, [r1, 0xA]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1, 0xA]\n\
+ _081BEE8A:\n\
+ ldr r0, [sp, 0x8]\n\
+ add r0, r10\n\
+ lsls r0, 3\n\
+ adds r0, r6\n\
+ ldrb r4, [r0, 0xE]\n\
+ ldrb r5, [r0, 0xC]\n\
+ lsls r0, r4, 16\n\
+ cmp r5, r4\n\
+ bcs _081BEF32\n\
+ str r0, [sp, 0xC]\n\
+ _081BEE9E:\n\
+ movs r6, 0\n\
+ adds r0, r5, 0x1\n\
+ str r0, [sp, 0x4]\n\
+ lsls r4, r5, 3\n\
+ movs r2, 0x5F\n\
+ subs r1, r2, r5\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 4\n\
+ mov r9, r0\n\
+ _081BEEB2:\n\
+ ldr r0, =gUnknown_0203CF04\n\
+ ldr r0, [r0]\n\
+ ldr r7, =gUnknown_0203CF10\n\
+ ldr r3, [r7]\n\
+ adds r3, r4, r3\n\
+ ldrb r2, [r3, 0x4]\n\
+ adds r1, r2, 0x1\n\
+ strb r1, [r3, 0x4]\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ ldr r1, [r3]\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ add r1, r9\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ movs r2, 0x1\n\
+ mov r8, r2\n\
+ str r2, [sp]\n\
+ movs r2, 0\n\
+ movs r3, 0x30\n\
+ bl sub_81BF2B8\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r6, 0\n\
+ beq _081BEEB2\n\
+ ldr r0, [r7]\n\
+ adds r1, r4, r0\n\
+ ldrb r0, [r1, 0x4]\n\
+ cmp r0, 0x2F\n\
+ bls _081BEF24\n\
+ ldr r0, [r1]\n\
+ bl Free\n\
+ ldr r0, [r7]\n\
+ adds r0, r4, r0\n\
+ movs r1, 0\n\
+ str r1, [r0]\n\
+ ldr r1, [sp, 0x8]\n\
+ add r1, r10\n\
+ lsls r1, 3\n\
+ ldr r4, =gTasks\n\
+ adds r1, r4\n\
+ ldrh r0, [r1, 0xC]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1, 0xC]\n\
+ mov r0, r8\n\
+ ands r5, r0\n\
+ cmp r5, 0x1\n\
+ bne _081BEF24\n\
+ ldr r0, =gUnknown_0203CF14\n\
+ ldr r1, [r0]\n\
+ ldrh r0, [r1, 0x2]\n\
+ subs r0, 0x1\n\
+ strh r0, [r1, 0x2]\n\
+ _081BEF24:\n\
+ ldr r1, [sp, 0x4]\n\
+ lsls r0, r1, 16\n\
+ lsrs r5, r0, 16\n\
+ ldr r2, [sp, 0xC]\n\
+ lsrs r0, r2, 16\n\
+ cmp r5, r0\n\
+ bcc _081BEE9E\n\
+ _081BEF32:\n\
+ ldr r0, =gUnknown_0203CF04\n\
+ ldr r1, [r0]\n\
+ movs r2, 0x92\n\
+ lsls r2, 4\n\
+ movs r0, 0\n\
+ movs r3, 0\n\
+ bl LoadBgTiles\n\
+ ldr r0, =gUnknown_0203CF10\n\
+ ldr r0, [r0]\n\
+ movs r4, 0xBE\n\
+ lsls r4, 2\n\
+ adds r0, r4\n\
+ ldrb r0, [r0, 0x4]\n\
+ cmp r0, 0x2F\n\
+ bhi _081BF002\n\
+ b _081BF014\n\
+ .pool\n\
+ _081BEF64:\n\
+ movs r0, 0\n\
+ bl UnsetBgTilemapBuffer\n\
+ ldr r0, =sub_81BEBB4\n\
+ bl FindTaskIdByFunc\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xFF\n\
+ beq _081BEF7C\n\
+ bl DestroyTask\n\
+ _081BEF7C:\n\
+ ldr r0, =gUnknown_0203CF14\n\
+ ldr r1, [r0]\n\
+ movs r0, 0\n\
+ strh r0, [r1]\n\
+ strh r0, [r1, 0x2]\n\
+ bl sub_81BEB90\n\
+ b _081BF002\n\
+ .pool\n\
+ _081BEF94:\n\
+ ldr r4, =gUnknown_0203CF14\n\
+ ldr r0, [r4]\n\
+ bl Free\n\
+ movs r5, 0\n\
+ str r5, [r4]\n\
+ ldr r4, =gUnknown_0203CF10\n\
+ ldr r0, [r4]\n\
+ bl Free\n\
+ str r5, [r4]\n\
+ ldr r4, =gUnknown_0203CF04\n\
+ ldr r0, [r4]\n\
+ bl Free\n\
+ str r5, [r4]\n\
+ ldr r4, =gUnknown_0203CF08\n\
+ ldr r0, [r4]\n\
+ bl Free\n\
+ str r5, [r4]\n\
+ b _081BF002\n\
+ .pool\n\
+ _081BEFD0:\n\
+ movs r0, 0xC\n\
+ movs r1, 0x2\n\
+ bl SetGpuRegBits\n\
+ movs r0, 0x8\n\
+ movs r1, 0\n\
+ bl SetGpuRegBits\n\
+ movs r0, 0\n\
+ movs r1, 0x7\n\
+ movs r2, 0\n\
+ bl SetBgAttribute\n\
+ bl sub_81971D0\n\
+ b _081BF002\n\
+ _081BEFF0:\n\
+ movs r0, 0\n\
+ bl ShowBg\n\
+ b _081BF002\n\
+ _081BEFF8:\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+ bl EnableBothScriptContexts\n\
+ _081BF002:\n\
+ ldr r0, =gTasks\n\
+ mov r2, r10\n\
+ lsls r1, r2, 2\n\
+ add r1, r10\n\
+ lsls r1, 3\n\
+ adds r1, r0\n\
+ ldrh r0, [r1, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1, 0x8]\n\
+ _081BF014:\n\
+ add sp, 0x10\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\
+ .pool\n\
+ .syntax divided");
+}
+#endif // NONMATCHING
+
+static void sub_81BF028(u8 taskId)
+{
+ u16 i;
+
+ switch(gTasks[taskId].data[0])
+ {
+ case 1:
+ gUnknown_0203CF0C = (struct Struct203CF0C *)AllocZeroed(sizeof(struct Struct203CF0C));
+ gUnknown_0203CF0C->frameImageTiles = (u8 *)AllocZeroed(ROOT_FOSSIL_GFX_LENGTH);
+ gUnknown_0203CF0C->frameImage = (struct DynamicSpriteFrameImage *) AllocZeroed(sizeof(struct DynamicSpriteFrameImage));
+ gUnknown_0203CF0C->unkC = (u16 *)AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16));
+ gUnknown_0203CF0C->unk10 = 0;
+ break;
+ case 2:
+ {
+ u8 *buffer;
+ buffer = gUnknown_0203CF0C->frameImageTiles;
+ for(i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++)
+ *buffer = gRootFossil_Gfx[i];
+ }
+ break;
+ case 3:
+ gUnknown_0203CF0C->frameImage->data = gUnknown_0203CF0C->frameImageTiles;
+ gUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH;
+ break;
+ case 4:
+ {
+ u8 spriteId, zero;
+ struct SpriteTemplate fossilTemplate;
+
+ fossilTemplate = gUnknown_08617E00;
+ fossilTemplate.images = (struct SpriteFrameImage *)(gUnknown_0203CF0C->frameImage);
+ spriteId = CreateSprite(&fossilTemplate, 128, -16, 1);
+ gUnknown_0203CF0C->spriteId = spriteId;
+ zero = 0;
+ gSprites[gUnknown_0203CF0C->spriteId].centerToCornerVecX = zero;
+ gSprites[gUnknown_0203CF0C->spriteId].data[0] = gSprites[gUnknown_0203CF0C->spriteId].pos1.x;
+ gSprites[gUnknown_0203CF0C->spriteId].data[1] = 1;
+ }
+ case 5:
+ for(i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++)
+ gUnknown_0203CF0C->unkC[i] = i;
+ break;
+ case 6:
+ {
+ u16 rand1, rand2, temp, j;
+ j = (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)) - 1;
+ for(i = 0; i <= j; i++)
+ {
+ rand1 = Random() % 0x100;
+ rand2 = Random() % 0x100;
+ j = (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)) - 1;
+ temp = gUnknown_0203CF0C->unkC[rand2];
+ gUnknown_0203CF0C->unkC[rand2] = gUnknown_0203CF0C->unkC[rand1];
+ gUnknown_0203CF0C->unkC[rand1] = temp;
+ }
+ gSprites[gUnknown_0203CF0C->spriteId].callback = sub_81BF248;
+ break;
+ }
+ case 7:
+ if(gSprites[gUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy)
+ return;
+ DestroySprite(&gSprites[gUnknown_0203CF0C->spriteId]);
+ FREE_AND_SET_NULL(gUnknown_0203CF0C->unkC);;
+ FREE_AND_SET_NULL(gUnknown_0203CF0C->frameImage);
+ FREE_AND_SET_NULL(gUnknown_0203CF0C->frameImageTiles);
+ FREE_AND_SET_NULL(gUnknown_0203CF0C);
+ break;
+ case 8:
+ EnableBothScriptContexts();
+ }
+ ++gTasks[taskId].data[0];
+}
+
+static void sub_81BF248(struct Sprite *sprite)
+{
+ if (gUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH))
+ {
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else if (sprite->pos1.y >= 0x60)
+ {
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ sub_81BF2B8(gUnknown_0203CF0C->frameImageTiles, gUnknown_0203CF0C->unkC[gUnknown_0203CF0C->unk10++], 0, 16, 0);
+ }
+ StartSpriteAnim(sprite, 0);
+ }
+ else
+ {
+ sprite->pos1.y++;
+ }
+}
diff --git a/src/gym_leader_rematch.c b/src/gym_leader_rematch.c
new file mode 100644
index 000000000..355ae5534
--- /dev/null
+++ b/src/gym_leader_rematch.c
@@ -0,0 +1,106 @@
+#include "global.h"
+#include "constants/flags.h"
+#include "random.h"
+#include "event_data.h"
+#include "battle_setup.h"
+#include "gym_leader_rematch.h"
+
+static void UpdateGymLeaderRematchFromArray(const u16 *data, size_t size, u32 maxRematch);
+static s32 GetRematchIndex(u32 trainerIdx);
+
+static const u16 GymLeaderRematches_AfterNewMauville[] = {
+ REMATCH_ROXANNE,
+ REMATCH_BRAWLY,
+ REMATCH_WATTSON,
+ REMATCH_FLANNERY,
+ REMATCH_NORMAN,
+ REMATCH_WINONA,
+ REMATCH_TATE_AND_LIZA,
+ REMATCH_JUAN
+};
+
+static const u16 GymLeaderRematches_BeforeNewMauville[] = {
+ REMATCH_ROXANNE,
+ REMATCH_BRAWLY,
+ // Wattson isn't available at this time
+ REMATCH_FLANNERY,
+ REMATCH_NORMAN,
+ REMATCH_WINONA,
+ REMATCH_TATE_AND_LIZA,
+ REMATCH_JUAN
+};
+
+void UpdateGymLeaderRematch(void)
+{
+ if (FlagGet(FLAG_SYS_GAME_CLEAR) && (Random() % 100) <= 30)
+ {
+ if (FlagGet(FLAG_WATTSON_REMATCH_AVAILABLE))
+ UpdateGymLeaderRematchFromArray(GymLeaderRematches_AfterNewMauville, ARRAY_COUNT(GymLeaderRematches_AfterNewMauville), 5);
+ else
+ UpdateGymLeaderRematchFromArray(GymLeaderRematches_BeforeNewMauville, ARRAY_COUNT(GymLeaderRematches_BeforeNewMauville), 1);
+ }
+}
+
+static void UpdateGymLeaderRematchFromArray(const u16 *data, size_t size, u32 maxRematch)
+{
+ s32 whichLeader = 0;
+ s32 lowestRematchIndex = 5;
+ u32 i;
+ s32 rematchIndex;
+ for (i = 0; i < size; i++)
+ {
+ if (!gSaveBlock1Ptr->trainerRematches[data[i]])
+ {
+ rematchIndex = GetRematchIndex(data[i]);
+ if (lowestRematchIndex > rematchIndex)
+ lowestRematchIndex = rematchIndex;
+ whichLeader++;
+ }
+ }
+ if (whichLeader != 0 && lowestRematchIndex <= maxRematch)
+ {
+ whichLeader = 0;
+ for (i = 0; i < size; i++)
+ {
+ if (!gSaveBlock1Ptr->trainerRematches[data[i]])
+ {
+ rematchIndex = GetRematchIndex(data[i]);
+ if (rematchIndex == lowestRematchIndex)
+ whichLeader++;
+ }
+ }
+ if (whichLeader != 0)
+ {
+ whichLeader = Random() % whichLeader;
+ for (i = 0; i < size; i++)
+ {
+ if (!gSaveBlock1Ptr->trainerRematches[data[i]])
+ {
+ rematchIndex = GetRematchIndex(data[i]);
+ if (rematchIndex == lowestRematchIndex)
+ {
+ if (whichLeader == 0)
+ {
+ gSaveBlock1Ptr->trainerRematches[data[i]] = lowestRematchIndex;
+ break;
+ }
+ whichLeader--;
+ }
+ }
+ }
+ }
+ }
+}
+
+static s32 GetRematchIndex(u32 trainerIdx)
+{
+ s32 i;
+ for (i = 0; i < 5; i++)
+ {
+ if (!HasTrainerBeenFought(gRematchTable[trainerIdx].trainerIds[i]))
+ {
+ return i;
+ }
+ }
+ return 5;
+}
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index bc7177bd7..f5c4ba491 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -9,21 +9,23 @@
#include "gpu_regs.h"
#include "main.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "decompress.h"
#include "save.h"
#include "window.h"
#include "bg.h"
-#include "species.h"
-#include "game_stat.h"
+#include "constants/species.h"
+#include "constants/game_stat.h"
#include "blend_palette.h"
#include "string_util.h"
#include "m4a.h"
#include "international_string_util.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "trig.h"
-#include "rng.h"
+#include "random.h"
#include "event_data.h"
+#include "overworld.h"
+#include "menu.h"
struct HallofFameMon
{
@@ -31,12 +33,12 @@ struct HallofFameMon
u32 personality;
u16 species:9;
u16 lvl:7;
- u8 nick[10];
+ u8 nick[POKEMON_NAME_LENGTH];
};
struct HallofFameTeam
{
- struct HallofFameMon mon[6];
+ struct HallofFameMon mon[PARTY_SIZE];
};
struct HofGfx
@@ -47,16 +49,16 @@ struct HofGfx
u8 tilemap2[0x1000];
};
+static EWRAM_DATA u32 sUnknown_0203BCD4 = 0;
static EWRAM_DATA struct HallofFameTeam *sHofMonPtr = NULL;
static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL;
extern bool8 gHasHallOfFameRecords;
-extern u32 gUnknown_0203BCD4;
-extern u8 gDecompressionBuffer[];
-extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern MainCallback gGameContinueCallback;
extern u32 gDamagedSaveSectors;
extern u8 gReservedSpritePaletteCount;
+extern const u8 gSpeciesNames[][11];
#define HALL_OF_FAME_MAX_TEAMS 50
@@ -79,8 +81,7 @@ extern const u8 gText_MainMenuTime[];
extern const u8 gContestConfetti_Gfx[];
extern const u8 gContestConfetti_Pal[];
-extern void sub_81973C4(u8, u8);
-extern u16 AddTextPrinterParametrized(u8 windowId, u8 fontId, const u8 *str, u8 speed, void ( *callback)(u16, struct TextPrinter *), u8 fgColor, u8 bgColor, u8 shadowColor);
+extern void NewMenuHelpers_DrawDialogueFrame(u8, u8);
extern void sub_8175620(void);
extern u8 TrySavingData(u8);
extern u8 sub_818D3E4(u16 species, u32 trainerId, u32 personality, u8 flags, s16 x, s16 y, u8, u16);
@@ -88,14 +89,14 @@ extern void sub_8197434(u8, u8);
extern u16 sub_818D97C(u8 playerGender, u8);
extern u16 sub_818D8AC(u16, u8, s16, s16, u8, u16);
extern const void* stdpal_get(u8);
-extern void sub_80987D4(u8, u8, u16, u8);
+extern void LoadWindowGfx(u8, u8, u16, u8);
extern u16 sub_818D820(u16);
extern u16 sub_818D8F0(u16);
extern u16 sub_818D7D8(u16 species, u32 trainerId, u32 personality, u8 arg3, s16 sp0, s16 sp1, u8 sp2, u16 sp3);
extern void sub_8198204(u8 *dst, const u8 *src, u8, u8, u8);
extern bool8 sub_80F9C30(void);
extern void sub_8198314(void);
-extern void sub_8137C3C(void);
+extern void ReturnFromHallOfFamePC(void);
extern void sub_8198180(const u8 *src, u8, u8);
extern void sub_80F9BF4(u16, u16, u8);
extern void sub_81980F0(u8, u8, u8, u8, u16);
@@ -185,9 +186,9 @@ static const struct BgTemplate sHof_BgTemplates[] =
static const struct WindowTemplate sHof_WindowTemplate = {0, 2, 2, 0xE, 6, 0xE, 1};
-static const u8 gUnknown_085E5388[] = {0, 1, 2, 0};
+static const u8 sUnknown_085E5388[] = {0, 1, 2, 0};
-static const u8 gUnknown_085E538C[] = {0, 2, 3, 0, 4, 5, 0, 0};
+static const u8 sUnknown_085E538C[] = {0, 2, 3, 0, 4, 5, 0, 0};
static const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet =
{
@@ -368,7 +369,7 @@ static const struct HallofFameMon sDummyFameMon =
0x3EA03EA, 0, 0, 0, {0}
};
-static const u8 sUnused2[6] = {2, 1, 3, 6, 4, 5};
+static const u8 sUnused2[] = {2, 1, 3, 6, 4, 5, 0, 0};
// code
static void VBlankCB_HallOfFame(void)
@@ -413,7 +414,7 @@ static bool8 InitHallOfFameScreen(void)
if (!sub_8175024())
{
SetVBlankCallback(VBlankCB_HallOfFame);
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
gMain.state++;
}
break;
@@ -422,7 +423,7 @@ static bool8 InitHallOfFameScreen(void)
if (!gPaletteFade.active)
{
SetMainCallback2(CB2_HallOfFame);
- PlayBGM(BGM_DENDOU);
+ PlayBGM(MUS_DENDOU);
return FALSE;
}
break;
@@ -489,7 +490,7 @@ static void Task_Hof_InitMonData(u8 taskId)
}
}
- gUnknown_0203BCD4 = 0;
+ sUnknown_0203BCD4 = 0;
gTasks[taskId].tDisplayedMonId = 0;
gTasks[taskId].tPlayerSpriteID = 0xFF;
@@ -515,7 +516,7 @@ static void Task_Hof_InitTeamSaveData(u8 taskId)
}
else
{
- if (sub_81534D0(3) != TRUE)
+ if (Save_LoadGameData(3) != TRUE)
memset(gDecompressionBuffer, 0, 0x2000);
}
@@ -537,8 +538,8 @@ static void Task_Hof_InitTeamSaveData(u8 taskId)
}
*lastSavedTeam = *sHofMonPtr;
- sub_81973C4(0, 0);
- AddTextPrinterParametrized(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3);
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ AddTextPrinterParameterized(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_Hof_TrySaveData;
}
@@ -580,9 +581,9 @@ static void Task_Hof_SetMonDisplayTask(u8 taskId)
gTasks[taskId].func = Task_Hof_DisplayMon;
}
-#define tDestinationX data1
-#define tDestinationY data2
-#define tSpecies data7
+#define tDestinationX data[1]
+#define tDestinationY data[2]
+#define tSpecies data[7]
static void Task_Hof_DisplayMon(u8 taskId)
{
@@ -613,7 +614,7 @@ static void Task_Hof_DisplayMon(u8 taskId)
spriteId = sub_818D3E4(currMon->species, currMon->tid, currMon->personality, 1, xPos, yPos, currMonId, 0xFFFF);
gSprites[spriteId].tDestinationX = field4;
gSprites[spriteId].tDestinationY = field6;
- gSprites[spriteId].data0 = 0;
+ gSprites[spriteId].data[0] = 0;
gSprites[spriteId].tSpecies = currMon->species;
gSprites[spriteId].callback = SpriteCB_GetOnScreenAndAnimate;
gTasks[taskId].tMonSpriteId(currMonId) = spriteId;
@@ -647,11 +648,11 @@ static void Task_Hof_TryDisplayAnotherMon(u8 taskId)
}
else
{
- gUnknown_0203BCD4 |= (0x10000 << gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.paletteNum);
+ sUnknown_0203BCD4 |= (0x10000 << gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.paletteNum);
if (gTasks[taskId].tDisplayedMonId <= 4 && currMon[1].species != SPECIES_NONE) // there is another pokemon to display
{
gTasks[taskId].tDisplayedMonId++;
- BeginNormalPaletteFade(gUnknown_0203BCD4, 0, 12, 12, 0x63B0);
+ BeginNormalPaletteFade(sUnknown_0203BCD4, 0, 12, 12, 0x63B0);
gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.priority = 1;
gTasks[taskId].func = Task_Hof_DisplayMon;
}
@@ -695,7 +696,7 @@ static void sub_8173DC0(u8 taskId)
if (gTasks[taskId].tMonSpriteId(i) != 0xFF)
gSprites[gTasks[taskId].tMonSpriteId(i)].oam.priority = 1;
}
- BeginNormalPaletteFade(gUnknown_0203BCD4, 0, 12, 12, 0x63B0);
+ BeginNormalPaletteFade(sUnknown_0203BCD4, 0, 12, 12, 0x63B0);
FillWindowPixelBuffer(0, 0);
CopyWindowToVram(0, 3);
gTasks[taskId].tFrameCount = 7;
@@ -724,7 +725,7 @@ static void sub_8173EE4(u8 taskId)
ShowBg(3);
gTasks[taskId].tPlayerSpriteID = sub_818D8AC(sub_818D97C(gSaveBlock2Ptr->playerGender, 1), 1, 120, 72, 6, 0xFFFF);
AddWindow(&sHof_WindowTemplate);
- sub_80987D4(1, gSaveBlock2Ptr->optionsWindowFrameType, 0x21D, 0xD0);
+ LoadWindowGfx(1, gSaveBlock2Ptr->optionsWindowFrameType, 0x21D, 0xD0);
LoadPalette(stdpal_get(1), 0xE0, 0x20);
gTasks[taskId].tFrameCount = 120;
gTasks[taskId].func = Task_Hof_WaitAndPrintPlayerInfo;
@@ -744,8 +745,8 @@ static void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId)
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
HallOfFame_PrintPlayerInfo(1, 2);
- sub_81973C4(0, 0);
- AddTextPrinterParametrized(0, 1, gText_LeagueChamp, 0, NULL, 2, 1, 3);
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ AddTextPrinterParameterized(0, 1, gText_LeagueChamp, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_Hof_ExitOnKeyPressed;
}
@@ -763,7 +764,7 @@ static void Task_Hof_ExitOnKeyPressed(u8 taskId)
static void Task_Hof_HandlePaletteOnExit(u8 taskId)
{
CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
- BeginNormalPaletteFade(-1, 8, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 0x10, 0);
gTasks[taskId].func = Task_Hof_HandleExit;
}
@@ -884,7 +885,7 @@ void CB2_DoHallOfFamePC(void)
static void Task_HofPC_CopySaveData(u8 taskId)
{
sub_81980F0(0, 0x1E, 0, 0xC, 0x226);
- if (sub_81534D0(3) != 1)
+ if (Save_LoadGameData(3) != 1)
{
gTasks[taskId].func = Task_HofPC_PrintDataIsCorrupted;
}
@@ -922,7 +923,7 @@ static void Task_HofPC_DrawSpritesPrintText(u8 taskId)
savedTeams++;
currMon = &savedTeams->mon[0];
- gUnknown_0203BCD4 = 0;
+ sUnknown_0203BCD4 = 0;
gTasks[taskId].tCurrMonId = 0;
gTasks[taskId].tMonNo = 0;
@@ -997,8 +998,8 @@ static void Task_HofPC_PrintMonInfo(u8 taskId)
currMonID = gTasks[taskId].tMonSpriteId(gTasks[taskId].tCurrMonId);
gSprites[currMonID].oam.priority = 0;
- gUnknown_0203BCD4 = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000;
- BlendPalettesUnfaded(gUnknown_0203BCD4, 0xC, 0x63B0);
+ sUnknown_0203BCD4 = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000;
+ BlendPalettesUnfaded(sUnknown_0203BCD4, 0xC, 0x63B0);
currMon = &savedTeams->mon[gTasks[taskId].tCurrMonId];
if (currMon->species != SPECIES_EGG)
@@ -1038,7 +1039,7 @@ static void Task_HofPC_HandleInput(u8 taskId)
if (IsCryPlayingOrClearCrySongs())
{
StopCryAndClearCrySongs();
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
}
gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit;
}
@@ -1048,7 +1049,7 @@ static void Task_HofPC_HandleInput(u8 taskId)
if (IsCryPlayingOrClearCrySongs())
{
StopCryAndClearCrySongs();
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
}
gTasks[taskId].func = Task_HofPC_HandlePaletteOnExit;
}
@@ -1106,15 +1107,15 @@ static void Task_HofPC_HandleExit(u8 taskId)
if (sHofMonPtr != NULL)
FREE_AND_SET_NULL(sHofMonPtr);
- sub_8137C3C();
+ ReturnFromHallOfFamePC();
}
}
static void Task_HofPC_PrintDataIsCorrupted(u8 taskId)
{
sub_8198180(gText_UnkCtrlF800Exit, 8, 1);
- sub_81973C4(0, 0);
- AddTextPrinterParametrized(0, 1, gText_HOFCorrupted, 0, NULL, 2, 1, 3);
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ AddTextPrinterParameterized(0, 1, gText_HOFCorrupted, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_HofPC_ExitOnButtonPress;
}
@@ -1135,7 +1136,7 @@ static void HallOfFame_PrintWelcomeText(u8 unusedPossiblyWindowId, u8 unused2)
{
FillWindowPixelBuffer(0, 0);
PutWindowTilemap(0);
- box_print(0, 1, GetStringCenterAlignXOffset(1, gText_WelcomeToHOF, 0xD0), 1, gUnknown_085E5388, 0, gText_WelcomeToHOF);
+ box_print(0, 1, GetStringCenterAlignXOffset(1, gText_WelcomeToHOF, 0xD0), 1, sUnknown_085E5388, 0, gText_WelcomeToHOF);
CopyWindowToVram(0, 3);
}
@@ -1171,7 +1172,7 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u
*(stringPtr)++ = CHAR_QUESTION_MARK;
}
stringPtr[0] = EOS;
- box_print(0, 1, 0x10, 1, gUnknown_085E5388, -1, text);
+ box_print(0, 1, 0x10, 1, sUnknown_085E5388, -1, text);
}
// nick, species names, gender and level
@@ -1180,13 +1181,13 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u
if (currMon->species == SPECIES_EGG)
{
width = GetStringCenterAlignXOffset(1, text, 0xD0);
- box_print(0, 1, width, 1, gUnknown_085E5388, -1, text);
+ box_print(0, 1, width, 1, sUnknown_085E5388, -1, text);
CopyWindowToVram(0, 3);
}
else
{
width = GetStringRightAlignXOffset(1, text, 0x80);
- box_print(0, 1, width, 1, gUnknown_085E5388, -1, text);
+ box_print(0, 1, width, 1, sUnknown_085E5388, -1, text);
text[0] = CHAR_SLASH;
stringPtr = StringCopy(text + 1, gSpeciesNames[currMon->species]);
@@ -1207,15 +1208,15 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u
}
stringPtr[0] = EOS;
- box_print(0, 1, 0x80, 1, gUnknown_085E5388, -1, text);
+ box_print(0, 1, 0x80, 1, sUnknown_085E5388, -1, text);
stringPtr = StringCopy(text, gText_Level);
ConvertIntToDecimalStringN(stringPtr, currMon->lvl, STR_CONV_MODE_LEFT_ALIGN, 3);
- box_print(0, 1, 0x24, 0x11, gUnknown_085E5388, -1, text);
+ box_print(0, 1, 0x24, 0x11, sUnknown_085E5388, -1, text);
stringPtr = StringCopy(text, gText_IDNumber);
ConvertIntToDecimalStringN(stringPtr, (u16)(currMon->tid), STR_CONV_MODE_LEADING_ZEROS, 5);
- box_print(0, 1, 0x68, 0x11, gUnknown_085E5388, -1, text);
+ box_print(0, 1, 0x68, 0x11, sUnknown_085E5388, -1, text);
CopyWindowToVram(0, 3);
}
@@ -1230,13 +1231,13 @@ static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2)
FillWindowPixelBuffer(1, 0x11);
PutWindowTilemap(1);
SetWindowBorderStyle(1, FALSE, 0x21D, 0xD);
- box_print(1, 1, 0, 1, gUnknown_085E538C, -1, gText_Name);
+ box_print(1, 1, 0, 1, sUnknown_085E538C, -1, gText_Name);
width = GetStringRightAlignXOffset(1, gSaveBlock2Ptr->playerName, 0x70);
- box_print(1, 1, width, 1, gUnknown_085E538C, -1, gSaveBlock2Ptr->playerName);
+ box_print(1, 1, width, 1, sUnknown_085E538C, -1, gSaveBlock2Ptr->playerName);
trainerId = (gSaveBlock2Ptr->playerTrainerId[0]) | (gSaveBlock2Ptr->playerTrainerId[1] << 8);
- box_print(1, 1, 0, 0x11, gUnknown_085E538C, 0, gText_IDNumber);
+ box_print(1, 1, 0, 0x11, sUnknown_085E538C, 0, gText_IDNumber);
text[0] = (trainerId % 100000) / 10000 + CHAR_0;
text[1] = (trainerId % 10000) / 1000 + CHAR_0;
text[2] = (trainerId % 1000) / 100 + CHAR_0;
@@ -1244,9 +1245,9 @@ static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2)
text[4] = (trainerId % 10) / 1 + CHAR_0;
text[5] = EOS;
width = GetStringRightAlignXOffset(1, text, 0x70);
- box_print(1, 1, width, 0x11, gUnknown_085E538C, -1, text);
+ box_print(1, 1, width, 0x11, sUnknown_085E538C, -1, text);
- box_print(1, 1, 0, 0x21, gUnknown_085E538C, -1, gText_MainMenuTime);
+ box_print(1, 1, 0, 0x21, sUnknown_085E538C, -1, gText_MainMenuTime);
text[0] = (gSaveBlock2Ptr->playTimeHours / 100) + CHAR_0;
text[1] = (gSaveBlock2Ptr->playTimeHours % 100) / 10 + CHAR_0;
text[2] = (gSaveBlock2Ptr->playTimeHours % 10) + CHAR_0;
@@ -1262,7 +1263,7 @@ static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2)
text[6] = EOS;
width = GetStringRightAlignXOffset(1, text, 0x70);
- box_print(1, 1, width, 0x21, gUnknown_085E538C, -1, text);
+ box_print(1, 1, width, 0x21, sUnknown_085E538C, -1, text);
CopyWindowToVram(1, 3);
}
@@ -1300,7 +1301,7 @@ static void ClearVramOamPltt_LoadHofPal(void)
static void sub_8174F70(void)
{
- remove_some_task();
+ ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
reset_temp_tile_data_buffers();
@@ -1404,13 +1405,13 @@ static void sub_81751A4(struct Sprite* sprite)
u8 tableID;
sprite->pos2.y++;
- sprite->pos2.y += sprite->data1;
+ sprite->pos2.y += sprite->data[1];
- tableID = sprite->data0;
+ tableID = sprite->data[0];
rand = (Random() % 4) + 8;
sprite->pos2.x = rand * gSineTable[tableID] / 256;
- sprite->data0 += 4;
+ sprite->data[0] += 4;
}
}
@@ -1428,9 +1429,9 @@ static bool8 sub_81751FC(void)
StartSpriteAnim(sprite, Random() % 17);
if (Random() & 3)
- sprite->data1 = 0;
+ sprite->data[1] = 0;
else
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return FALSE;
}
diff --git a/src/heal_location.c b/src/heal_location.c
index efc534170..aa90fe1ae 100644
--- a/src/heal_location.c
+++ b/src/heal_location.c
@@ -1,10 +1,10 @@
// Includes
#include "global.h"
-#include "map_constants.h"
+#include "constants/maps.h"
#include "heal_location.h"
-#define HEAL_LOCATION(map, x, y) {MAP_GROUP_##map, MAP_ID_##map, x, y}
+#define HEAL_LOCATION(map, x, y) {MAP_GROUP(map), MAP_NUM(map), x, y}
// Static type declarations
diff --git a/src/hof_pc.c b/src/hof_pc.c
new file mode 100644
index 000000000..44b929337
--- /dev/null
+++ b/src/hof_pc.c
@@ -0,0 +1,45 @@
+#include "global.h"
+#include "hall_of_fame.h"
+#include "main.h"
+#include "palette.h"
+#include "overworld.h"
+#include "script.h"
+#include "script_menu.h"
+#include "task.h"
+
+extern void (*gUnknown_0300485C)(void);
+
+extern void Overworld_PlaySpecialMapMusic(void);
+extern bool16 ScrSpecial_CreatePCMenu(void);
+extern void ScriptMenu_DisplayPCStartupPrompt(void);
+
+static void ReshowPCMenuAfterHallOfFamePC(void);
+static void Task_WaitForPaletteFade(u8);
+
+void AccessHallOfFamePC(void)
+{
+ SetMainCallback2(CB2_DoHallOfFamePC);
+ ScriptContext2_Enable();
+}
+
+void ReturnFromHallOfFamePC(void)
+{
+ SetMainCallback2(CB2_ReturnToField);
+ gFieldCallback = ReshowPCMenuAfterHallOfFamePC;
+}
+
+static void ReshowPCMenuAfterHallOfFamePC(void)
+{
+ ScriptContext2_Enable();
+ Overworld_PlaySpecialMapMusic();
+ ScrSpecial_CreatePCMenu();
+ ScriptMenu_DisplayPCStartupPrompt();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ CreateTask(Task_WaitForPaletteFade, 10);
+}
+
+static void Task_WaitForPaletteFade(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ DestroyTask(taskId);
+}
diff --git a/src/international_string_util.c b/src/international_string_util.c
index 81985d614..9de338c59 100644
--- a/src/international_string_util.c
+++ b/src/international_string_util.c
@@ -1,6 +1,6 @@
#include "global.h"
-#include "international_string_util.h"
#include "text.h"
+#include "international_string_util.h"
extern s32 convert_pixel_width_to_tile_width(s32 a0); // script menu
@@ -42,7 +42,7 @@ s32 GetMaxWidthInMenuTable(const struct MenuAction *str, s32 arg1)
return convert_pixel_width_to_tile_width(var);
}
-s32 sub_81DB3D8(const struct MenuAction *str, u8* arg1, s32 arg2)
+s32 sub_81DB3D8(const struct MenuAction *str, const u8* arg1, s32 arg2)
{
s32 i, var;
diff --git a/src/intro.c b/src/intro.c
new file mode 100644
index 000000000..f21ad348d
--- /dev/null
+++ b/src/intro.c
@@ -0,0 +1,3020 @@
+#include "global.h"
+#include "main.h"
+#include "palette.h"
+#include "scanline_effect.h"
+#include "task.h"
+#include "title_screen.h"
+#include "libgcnmultiboot.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "link.h"
+#include "multiboot_pokemon_colosseum.h"
+#include "load_save.h"
+#include "save.h"
+#include "new_game.h"
+#include "m4a.h"
+#include "random.h"
+#include "decompress.h"
+#include "constants/songs.h"
+#include "intro_credits_graphics.h"
+#include "trig.h"
+#include "intro.h"
+#include "graphics.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "blend_palette.h"
+#include "title_screen.h"
+#include "constants/rgb.h"
+
+extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
+extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
+extern const struct SpriteTemplate gUnknown_08596C10[];
+
+//ewram
+EWRAM_DATA u16 gUnknown_0203BCC8 = 0;
+EWRAM_DATA u16 gUnknown_0203BCCA = 0;
+EWRAM_DATA u16 gUnknown_0203BCCC = 0;
+
+//iwram
+u32 gIntroFrameCounter;
+struct GcmbStruct gMultibootProgramStruct;
+
+//.rodata
+static const u16 gIntro1DropsPal[] = INCBIN_U16("graphics/intro/intro1_drops.gbapal");
+static const u16 gIntro1GFLogoPal[] = INCBIN_U16("graphics/intro/intro1_gflogo.gbapal");
+static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz");
+static const u16 gIntro1BGPals[16][16] = INCBIN_U16("graphics/intro/intro1_bgpal.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_Unused[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal");
+static const u8 gIntro3Streaks_Gfx_Unused[] = INCBIN_U8("graphics/intro/intro3_streaks.4bpp.lz");
+static const u8 gIntro3Streaks_Tilemap_Unused[] = INCBIN_U8("graphics/intro/intro3_streaks_map.bin.lz");
+static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal");
+static const u16 gIntro3Misc2Palette_Unused[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal");
+static const u8 gIntro3MiscTiles[] = INCBIN_U8("graphics/intro/intro3_misc.4bpp.lz");
+static const u16 gIntro1FlygonPalette[] = INCBIN_U16("graphics/intro/intro1_flygon.gbapal");
+static const u8 gIntro1EonTiles_Unused[] = INCBIN_U8("graphics/intro/intro1_eon.4bpp.lz");
+static const u8 sUnknownBytes[] = {
+ 0x02, 0x03, 0x04, 0x05, 0x01, 0x01, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x02, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x02, 0x0D, 0x0E, 0x0F, 0x10,
+ 0x11, 0x12, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x00
+};
+static const struct CompressedSpriteSheet gUnknown_085E4A74[] =
+{
+ {gIntro1SparkleGfx, 0x400, 1505},
+ {NULL},
+};
+static const struct SpritePalette gUnknown_085E4A84[] =
+{
+ {gIntro3LightningPal, 1505},
+ {NULL},
+};
+static const struct OamData gUnknown_085E4A94 =
+{
+ .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 gUnknown_085E4A9C[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(4, 2),
+ ANIMCMD_FRAME(8, 2),
+ ANIMCMD_FRAME(12, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd *const gUnknown_085E4AB4[] =
+{
+ gUnknown_085E4A9C,
+};
+static void sub_816D338(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4AB8 =
+{
+ .tileTag = 1505,
+ .paletteTag = 1505,
+ .oam = &gUnknown_085E4A94,
+ .anims = gUnknown_085E4AB4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816D338,
+};
+static const u8 gUnknown_085E4AD0[][2] =
+{
+ {0x7C, 0x28},
+ {0x66, 0x1E},
+ {0x4D, 0x1E},
+ {0x36, 0x0F},
+ {0x94, 0x09},
+ {0x3F, 0x1C},
+ {0x5D, 0x28},
+ {0x94, 0x20},
+ {0xAD, 0x29},
+ {0x5E, 0x14},
+ {0xD0, 0x26},
+ {0x00, 0x00},
+};
+static const struct CompressedSpriteSheet gUnknown_085E4AE8[] =
+{
+ {gIntro2VolbeatGfx, 0x400, 1500},
+ {gIntro2TorchicGfx, 0xC00, 1501},
+ {gIntro2ManectricGfx, 0x2000, 1502},
+ {NULL},
+};
+static const struct SpritePalette gUnknown_085E4B08[] =
+{
+ {gIntro2VolbeatPal, 1500},
+ {gIntro2TorchicPal, 1501},
+ {gIntro2ManectricPal, 1502},
+ {NULL},
+};
+static const struct OamData gUnknown_085E4B28 =
+{
+ .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 union AnimCmd gUnknown_085E4B30[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd *const gUnknown_085E4B3C[] =
+{
+ gUnknown_085E4B30,
+};
+static void sub_816D81C(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4B40 =
+{
+ .tileTag = 1500,
+ .paletteTag = 1500,
+ .oam = &gUnknown_085E4B28,
+ .anims = gUnknown_085E4B3C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816D81C,
+};
+static const struct OamData gUnknown_085E4B58 =
+{
+ .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 union AnimCmd gUnknown_085E4B60[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd gUnknown_085E4B74[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd gUnknown_085E4B88[] =
+{
+ ANIMCMD_FRAME(48, 4),
+ ANIMCMD_FRAME(64, 6),
+ ANIMCMD_FRAME(80, 0),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_085E4B98[] =
+{
+ gUnknown_085E4B60,
+ gUnknown_085E4B74,
+ gUnknown_085E4B88,
+};
+static void sub_816D9C0(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4BA4 =
+{
+ .tileTag = 1501,
+ .paletteTag = 1501,
+ .oam = &gUnknown_085E4B58,
+ .anims = gUnknown_085E4B98,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816D9C0,
+};
+static const struct OamData gUnknown_085E4BBC =
+{
+ .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 gUnknown_085E4BC4[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd *const gUnknown_085E4BD8[] =
+{
+ gUnknown_085E4BC4,
+};
+static void sub_816DAE8(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4BDC =
+{
+ .tileTag = 1502,
+ .paletteTag = 1502,
+ .oam = &gUnknown_085E4BBC,
+ .anims = gUnknown_085E4BD8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816DAE8,
+};
+static const struct CompressedSpriteSheet gUnknown_085E4BF4[] =
+{
+ {gIntro3LightningGfx, 0xC00, 1503},
+ {NULL},
+};
+static const struct SpritePalette gUnknown_085E4C04[] =
+{
+ {gIntro3LightningPal, 1503},
+ {NULL},
+};
+static const struct OamData gUnknown_085E4C14 =
+{
+ .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 gUnknown_085E4C1C[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(48, 2),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4C28[] =
+{
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_FRAME(64, 2),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4C34[] =
+{
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(80, 2),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_085E4C40[] =
+{
+ gUnknown_085E4C1C,
+ gUnknown_085E4C28,
+ gUnknown_085E4C34,
+};
+static void sub_816EC6C(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4C4C =
+{
+ .tileTag = 1503,
+ .paletteTag = 1503,
+ .oam = &gUnknown_085E4C14,
+ .anims = gUnknown_085E4C40,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816EC6C,
+};
+static const s16 gUnknown_085E4C64[][3] =
+{
+ {0x68, 0x00, 0x0C0},
+ {0x8E, 0x03, 0x280},
+ {0x53, 0x01, 0x180},
+ {0x9B, 0x00, 0x080},
+ {0x38, 0x02, 0x200},
+ {0xAE, 0x01, 0x100},
+};
+static const struct CompressedSpriteSheet gUnknown_085E4C88[] =
+{
+ {gIntro2BubblesGfx, 0x600, 1504},
+ {NULL},
+};
+static const struct SpritePalette gUnknown_085E4C98[] =
+{
+ {gIntro2BubblesPal, 1504},
+ {NULL},
+};
+static const s16 gUnknown_085E4CA8[][3] =
+{
+ {0x42, 0x40, 0x1},
+ {0x60, 0x60, 0x8},
+ {0x80, 0x40, 0x1},
+ {0x90, 0x30, 0x8},
+ {0xA0, 0x48, 0x1},
+ {0xB0, 0x60, 0x8},
+ {0x60, 0x60, 0x4},
+ {0x70, 0x68, 0x8},
+ {0x80, 0x60, 0x4},
+ {0x58, 0x20, 0x4},
+ {0x68, 0x18, 0x8},
+ {0x78, 0x20, 0x4},
+};
+static const struct OamData gUnknown_085E4CF0 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gUnknown_085E4CF8[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_085E4D10[] =
+{
+ gUnknown_085E4CF8,
+};
+static void sub_816E7B4(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4D14 =
+{
+ .tileTag = 1504,
+ .paletteTag = 1504,
+ .oam = &gUnknown_085E4CF0,
+ .anims = gUnknown_085E4D10,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816E7B4,
+};
+static const struct OamData gUnknown_085E4D2C =
+{
+ .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 gUnknown_085E4D34[] =
+{
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4D3C[] =
+{
+ ANIMCMD_FRAME(24, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4D44[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4D4C[] =
+{
+ ANIMCMD_FRAME(48, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_085E4D54[] =
+{
+ gUnknown_085E4D34,
+ gUnknown_085E4D3C,
+ gUnknown_085E4D44,
+ gUnknown_085E4D4C,
+};
+static void sub_816F454(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4D64 =
+{
+ .tileTag = 2000,
+ .paletteTag = 2000,
+ .oam = &gUnknown_085E4D2C,
+ .anims = gUnknown_085E4D54,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816F454,
+};
+static const union AnimCmd gUnknown_085E4D7C[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd gUnknown_085E4D90[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd gUnknown_085E4DA4[] =
+{
+ ANIMCMD_FRAME(256, 4),
+ ANIMCMD_FRAME(0x140, 4),
+ ANIMCMD_FRAME(0x180, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4DB4[] =
+{
+ ANIMCMD_FRAME(0x180, 16),
+ ANIMCMD_FRAME(0x140, 16),
+ ANIMCMD_FRAME(256, 16),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_085E4DC4[] =
+{
+ gUnknown_085E4D7C,
+ gUnknown_085E4D90,
+ gUnknown_085E4DA4,
+ gUnknown_085E4DB4,
+};
+static const struct OamData gUnknown_085E4DD4 =
+{
+ .y = 160,
+ .affineMode = 3,
+ .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 gUnknown_085E4DDC =
+{
+ .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 gUnknown_085E4DE4 =
+{
+ .y = 160,
+ .affineMode = 3,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gUnknown_085E4DEC[] =
+{
+ ANIMCMD_FRAME(80, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4DF4[] =
+{
+ ANIMCMD_FRAME(84, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4DFC[] =
+{
+ ANIMCMD_FRAME(88, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E04[] =
+{
+ ANIMCMD_FRAME(92, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E0C[] =
+{
+ ANIMCMD_FRAME(96, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E14[] =
+{
+ ANIMCMD_FRAME(100, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E1C[] =
+{
+ ANIMCMD_FRAME(104, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E24[] =
+{
+ ANIMCMD_FRAME(112, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E2C[] =
+{
+ ANIMCMD_FRAME(113, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E34[] =
+{
+ ANIMCMD_FRAME(114, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E3C[] =
+{
+ ANIMCMD_FRAME(115, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E44[] =
+{
+ ANIMCMD_FRAME(116, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E4C[] =
+{
+ ANIMCMD_FRAME(117, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_085E4E54[] =
+{
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_085E4E5C[] =
+{
+ gUnknown_085E4DEC,
+ gUnknown_085E4DF4,
+ gUnknown_085E4DFC,
+ gUnknown_085E4E04,
+ gUnknown_085E4E0C,
+ gUnknown_085E4E14,
+ gUnknown_085E4E1C,
+};
+static const union AnimCmd *const gUnknown_085E4E78[] =
+{
+ gUnknown_085E4E24,
+ gUnknown_085E4E2C,
+ gUnknown_085E4E34,
+ gUnknown_085E4E3C,
+ gUnknown_085E4E44,
+ gUnknown_085E4E4C,
+};
+static const union AnimCmd *const gUnknown_085E4E90[] =
+{
+ gUnknown_085E4E54,
+};
+static const s16 gUnknown_085E4E94[][2] =
+{
+ {0, -72},
+ {1, -56},
+ {2, -40},
+ {3, -24},
+ {4, 8},
+ {5, 24},
+ {3, 40},
+ {1, 56},
+ {6, 72},
+ {0, -28},
+ {1, -20},
+ {2, -12},
+ {3, -4},
+ {2, 4},
+ {4, 12},
+ {5, 20},
+ {3, 28},
+};
+static const union AffineAnimCmd gUnknown_085E4ED8[] =
+{
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_END,
+};
+static const union AffineAnimCmd gUnknown_085E4EE8[] =
+{
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_FRAME(16, 16, 0, 16),
+ AFFINEANIMCMD_FRAME(-16, -16, 0, 8),
+ AFFINEANIMCMD_END,
+};
+static const union AffineAnimCmd gUnknown_085E4F08[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(8, 8, 0, 48),
+ AFFINEANIMCMD_END,
+};
+static const union AffineAnimCmd gUnknown_085E4F20[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(2, 2, 0, 48),
+ AFFINEANIMCMD_END,
+};
+static const union AffineAnimCmd *const gUnknown_085E4F38[] =
+{
+ gUnknown_085E4ED8,
+ gUnknown_085E4EE8,
+ gUnknown_085E4F08,
+ gUnknown_085E4F20,
+};
+static const u16 gUnknown_085E4F48[] =
+{
+ 0x100, 0xC0, 0x80, 0x40, 0x00, 0x40, 0x80, 0xC0, 0x100
+};
+static void sub_816FB38(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4F5C =
+{
+ .tileTag = 2000,
+ .paletteTag = 2001,
+ .oam = &gUnknown_085E4DD4,
+ .anims = gUnknown_085E4E5C,
+ .images = NULL,
+ .affineAnims = gUnknown_085E4F38,
+ .callback = sub_816FB38,
+};
+static const struct SpriteTemplate gUnknown_085E4F74 =
+{
+ .tileTag = 2000,
+ .paletteTag = 2001,
+ .oam = &gUnknown_085E4DDC,
+ .anims = gUnknown_085E4E78,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816FB38,
+};
+static void sub_816FD44(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4F8C =
+{
+ .tileTag = 2000,
+ .paletteTag = 2001,
+ .oam = &gUnknown_085E4DE4,
+ .anims = gUnknown_085E4E90,
+ .images = NULL,
+ .affineAnims = gUnknown_085E4F38,
+ .callback = sub_816FD44,
+};
+static const u8 gUnknown_085E4FA4[] =
+{
+ 0x00, 0x17, 0x17, 0x31, 0x3E, 0x24, 0x24, 0x0A, 0x0A
+};
+static const struct OamData gUnknown_085E4FB0 =
+{
+ .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 gUnknown_085E4FB8[] =
+{
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd *const gUnknown_085E4FC0[] =
+{
+ gUnknown_085E4FB8,
+};
+static void sub_816FEDC(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E4FC4 =
+{
+ .tileTag = 2002,
+ .paletteTag = 2002,
+ .oam = &gUnknown_085E4FB0,
+ .anims = gUnknown_085E4FC0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_816FEDC,
+};
+static const struct CompressedSpriteSheet gUnknown_085E4FDC[] =
+{
+ {gIntroTiles, 0x1400, 2000},
+ {NULL},
+};
+static const struct CompressedSpriteSheet gUnknown_085E4FEC[] =
+{
+ {gIntro1FlygonGfx, 0x400, 2002},
+ {NULL},
+};
+static const struct SpritePalette gUnknown_085E4FFC[] =
+{
+ {gIntro1DropsPal, 2000},
+ {gIntro1GFLogoPal, 2001},
+ {gIntro1FlygonPalette, 2002},
+ {NULL},
+};
+static const struct OamData gUnknown_085E501C =
+{
+ .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 gUnknown_085E5024[] =
+{
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_085E502C[] =
+{
+ gUnknown_085E5024,
+};
+static void sub_8170040(struct Sprite *sprite);
+static const struct SpriteTemplate gUnknown_085E5030 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2003,
+ .oam = &gUnknown_085E501C,
+ .anims = gUnknown_085E502C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8170040,
+};
+static const struct CompressedSpriteSheet gUnknown_085E5048[] =
+{
+ {gIntro3MiscTiles, 0xA00, 2003},
+ {NULL},
+};
+static const struct SpritePalette gUnknown_085E5058[] =
+{
+ {gIntro3Misc1Palette, 2003},
+ {NULL},
+};
+
+// this file's functions
+static void MainCB2_EndIntro(void);
+static void Task_IntroLoadPart1Graphics(u8);
+static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8);
+static void Task_IntroFadeIn(u8);
+static void intro_reset_and_hide_bgs(void);
+static void Task_IntroWaterDrops(u8);
+static void Task_IntroWaterDrops_1(u8);
+static void Task_IntroWaterDrops_2(u8);
+static void Task_IntroWaterDrops_3(u8);
+static void Task_IntroScrollDownAndShowFlygon(u8);
+static void Task_IntroWaitToSetupPart2(u8);
+static void Task_IntroLoadPart2Graphics(u8);
+static void Task_IntroStartBikeRide(u8);
+static void Task_IntroHandleBikeAndFlygonMovement(u8);
+static void Task_IntroWaitToSetupPart3(u8);
+static void Task_IntroLoadPart3Graphics(u8);
+static void Task_IntroSpinAndZoomPokeball(u8);
+static void Task_IntroWaitToSetupPart3LegendsFight(u8);
+static void Task_IntroLoadPart1Graphics3(u8);
+static void Task_IntroLoadPart1Graphics4(u8);
+static void Task_IntroLoadPart1Graphics5(u8);
+static void Task_IntroLoadPart1Graphics6(u8);
+static void Task_IntroLoadPart1Graphics7(u8);
+static void Task_IntroLoadPart1Graphics8(u8);
+static void Task_IntroLoadPart1Graphics9(u8);
+static void Task_IntroFadeIn0(u8);
+static void Task_IntroFadeIn1(u8);
+static void Task_IntroFadeIn2(u8);
+static void Task_IntroFadeIn3(u8);
+static void Task_IntroFadeIn4(u8);
+static void Task_IntroFadeIn5(u8);
+static void Task_IntroFadeIn6(u8);
+static void Task_IntroFadeIn7(u8);
+static void Task_IntroFadeIn8(u8);
+static void Task_IntroFadeIn9(u8);
+static void sub_816E190(u8);
+static void sub_816E1F8(struct Sprite *);
+static void sub_816E6D4(u8);
+static void sub_816E74C(void);
+static void sub_816EEA8(u8);
+static void sub_816F46C(struct Sprite *);
+static void sub_816F5B4(struct Sprite *);
+static void sub_816F660(struct Sprite *);
+static void SpriteCB_WaterDropFall(struct Sprite *);
+static void sub_816F318(struct Sprite *);
+static void sub_816F9D4(struct Sprite *);
+static void sub_816FAB0(struct Sprite *);
+static u8 sub_816FDB8(s16, s16, s16);
+
+static void VBlankCB_Intro(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+static void MainCB2_Intro(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ if (gMain.newKeys && !gPaletteFade.active)
+ SetMainCallback2(MainCB2_EndIntro);
+ else if (gIntroFrameCounter != -1)
+ gIntroFrameCounter++;
+}
+
+static void MainCB2_EndIntro(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitTitleScreen);
+}
+
+static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteAddress)
+{
+ LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress));
+ LZ77UnCompVram(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress));
+ LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20);
+}
+
+static void SerialCB_CopyrightScreen(void)
+{
+ GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct);
+}
+
+static u8 SetUpCopyrightScreen(void)
+{
+ u16 ime;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ *(u16 *)PLTT = 0x7FFF;
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+ CpuFill32(0, (void *)OAM, OAM_SIZE);
+ CpuFill16(0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+ ResetPaletteFade();
+ LoadCopyrightGraphics(0, 0x3800, 0);
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetVBlankCallback(VBlankCB_Intro);
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON;
+ SetSerialCallback(SerialCB_CopyrightScreen);
+ GameCubeMultiBoot_Init(&gMultibootProgramStruct);
+ default:
+ UpdatePaletteFade();
+ gMain.state++;
+ GameCubeMultiBoot_Main(&gMultibootProgramStruct);
+ break;
+ case 140:
+ GameCubeMultiBoot_Main(&gMultibootProgramStruct);
+ if (gMultibootProgramStruct.gcmb_field_2 != 1)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gMain.state++;
+ }
+ break;
+ case 141:
+ if (UpdatePaletteFade())
+ break;
+ CreateTask(Task_IntroLoadPart1Graphics, 0);
+ SetMainCallback2(MainCB2_Intro);
+ if (gMultibootProgramStruct.gcmb_field_2 != 0)
+ {
+ if (gMultibootProgramStruct.gcmb_field_2 == 2)
+ {
+ // check the multiboot ROM header game code to see if we already did this
+ if (*(u32 *)(EWRAM_START + 0xAC) == 0x65366347) // "Gc6e" in ASCII
+ {
+ CpuCopy16(&gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, sizeof(gMultiBootProgram_PokemonColosseum_Start));
+ *(u32 *)(EWRAM_START + 0xAC) = 0x65366347;
+ }
+ GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct);
+ }
+ }
+ else
+ {
+ GameCubeMultiBoot_Quit();
+ SetSerialCallback(SerialCB);
+ }
+ return 0;
+ }
+
+ return 1;
+}
+
+void CB2_InitCopyrightScreenAfterBootup(void)
+{
+ if (!SetUpCopyrightScreen())
+ {
+ SetSaveBlocksPointers(sub_815355C());
+ sub_808447C();
+ Save_ResetSaveCounters();
+ Save_LoadGameData(SAVE_NORMAL);
+ if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
+ Sav2_ClearSetDefault();
+ SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
+ InitHeap(gHeap, HEAP_SIZE);
+ }
+}
+
+void CB2_InitCopyrightScreenAfterTitleScreen(void)
+{
+ SetUpCopyrightScreen();
+}
+
+static void Task_IntroLoadPart1Graphics(u8 taskId)
+{
+ SetVBlankCallback(NULL);
+ gUnknown_0203BCC8 = Random() & 1;
+ intro_reset_and_hide_bgs();
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0x50);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0x18);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0x28);
+ LZ77UnCompVram(gIntro1BGLeavesGfx, (void *)VRAM);
+ LZ77UnCompVram(gIntro1BG0_Tilemap, (void *)(VRAM + 0x8000));
+ DmaClear16(3, VRAM + 0x8800, 0x800);
+ LZ77UnCompVram(gIntro1BG1_Tilemap, (void *)(VRAM + 0x9000));
+ DmaClear16(3, VRAM + 0x9800, 0x800);
+ LZ77UnCompVram(gIntro1BG2_Tilemap, (void *)(VRAM + 0xA000));
+ DmaClear16(3, VRAM + 0xA800, 0x800);
+ LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(VRAM + 0xB000));
+ DmaClear16(3, VRAM + 0xB800, 0x800);
+ LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals));
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512);
+ LoadCompressedObjectPic(gUnknown_085E4FDC);
+ LoadCompressedObjectPic(gUnknown_085E4FEC);
+ LoadSpritePalettes(gUnknown_085E4FFC);
+ LoadCompressedObjectPic(gUnknown_085E4A74);
+ LoadSpritePalettes(gUnknown_085E4A84);
+ CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20);
+ CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E);
+ CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C);
+ CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A);
+ CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18);
+ CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16);
+ CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14);
+ sub_816FDB8(0x78, 0x50, 0);
+ gTasks[taskId].data[0] = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE);
+ gTasks[taskId].func = Task_IntroFadeIn;
+}
+
+static void Task_IntroFadeIn(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ SetVBlankCallback(VBlankCB_Intro);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON);
+ gTasks[taskId].func = Task_IntroWaterDrops;
+ gIntroFrameCounter = 0;
+ m4aSongNumStart(MUS_DEMO1);
+ ResetSerial();
+}
+
+static void Task_IntroWaterDrops(u8 taskId)
+{
+ //start moving rock
+ if (gIntroFrameCounter == 76)
+ gSprites[gTasks[taskId].data[0]].data[0] = 1;
+
+ if (gIntroFrameCounter == 128)
+ CreateTask(Task_IntroWaterDrops_1, 0);
+
+ //drop rock
+ if (gIntroFrameCounter == 251)
+ gSprites[gTasks[taskId].data[0]].data[0] = 2;
+
+ if (gIntroFrameCounter == 256)
+ CreateTask(Task_IntroWaterDrops_2, 0);
+
+ if (gIntroFrameCounter == 368)
+ CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE);
+
+ if (gIntroFrameCounter == 384)
+ CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE);
+
+ if (gIntroFrameCounter == 560)
+ CreateTask(Task_IntroWaterDrops_3, 0);
+
+ if (gIntroFrameCounter > 560)
+ {
+ gTasks[taskId].data[1] = 0x50;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0x18;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].data[5] = 0x28;
+ gTasks[taskId].data[6] = 0;
+ gTasks[taskId].func = Task_IntroScrollDownAndShowFlygon;
+ }
+}
+
+static void Task_IntroWaterDrops_3(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (++data[2] & 1)
+ data[3]++;
+
+ switch (data[0])
+ {
+ case 0:
+ CreateSprite(&gUnknown_085E4AB8, gUnknown_085E4AD0[data[4]][0], gUnknown_085E4AD0[data[4]][1] + data[3], 0);
+ data[0]++;
+ data[1] = 0xC;
+ data[4]++;
+ break;
+ case 1:
+ if (!--data[1])
+ data[0] = 0;
+ break;
+ }
+
+ if (data[3] > 0x3C)
+ DestroyTask(taskId);
+}
+
+static void sub_816D338(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 0xC)
+ DestroySprite(sprite);
+}
+
+static void Task_IntroScrollDownAndShowFlygon(u8 taskId)
+{
+ if (gIntroFrameCounter < 904)
+ {
+ s32 r2;
+
+ //slide backgrounds downward
+ r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2];
+ r2 -= 0x6000;
+ gTasks[taskId].data[1] = r2 >> 16;
+ gTasks[taskId].data[2] = r2;
+ SetGpuReg(REG_OFFSET_BG2VOFS, gTasks[taskId].data[1]);
+ r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4];
+ r2 -= 0x8000;
+ gTasks[taskId].data[3] = r2 >> 16;
+ gTasks[taskId].data[4] = r2;
+ SetGpuReg(REG_OFFSET_BG1VOFS, gTasks[taskId].data[3]);
+ r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6];
+ r2 -= 0xC000;
+ gTasks[taskId].data[5] = r2 >> 16;
+ gTasks[taskId].data[6] = r2;
+ SetGpuReg(REG_OFFSET_BG0VOFS, gTasks[taskId].data[5]);
+
+ //show Flygon sprite
+ if (gIntroFrameCounter == 832)
+ {
+ u8 spriteId = CreateSprite(&gUnknown_085E4FC4, 120, 160, 10);
+ gSprites[spriteId].invisible = TRUE;
+ }
+ }
+ else
+ {
+ //fade to white
+ if (gIntroFrameCounter > 1007)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITEALPHA);
+ gTasks[taskId].func = Task_IntroWaitToSetupPart2;
+ }
+ }
+}
+
+static void Task_IntroWaitToSetupPart2(u8 taskId)
+{
+ if (gIntroFrameCounter > 1026)
+ gTasks[taskId].func = Task_IntroLoadPart2Graphics;
+}
+
+static void Task_IntroLoadPart2Graphics(u8 taskId)
+{
+ intro_reset_and_hide_bgs();
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gUnknown_0203BD24 = 0;
+ gUnknown_0203BD26 = 0;
+ gUnknown_0203BCCC = 0;
+ load_intro_part2_graphics(1);
+ gTasks[taskId].func = Task_IntroStartBikeRide;
+}
+
+static void Task_IntroStartBikeRide(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gUnknown_0203BCC8 == 0)
+ LoadCompressedObjectPic(gIntro2BrendanSpriteSheet);
+ else
+ LoadCompressedObjectPic(gIntro2MaySpriteSheet);
+
+ LoadCompressedObjectPic(gIntro2BicycleSpriteSheet);
+ LoadCompressedObjectPic(gIntro2FlygonSpriteSheet);
+
+ for (spriteId = 0; spriteId < 3; spriteId++)
+ {
+ LoadCompressedObjectPic(&gUnknown_085E4AE8[spriteId]);
+ }
+
+ LoadSpritePalettes(gUnknown_085F530C);
+ LoadSpritePalettes(gUnknown_085E4B08);
+ CreateSprite(&gUnknown_085E4BDC, 0x110, 0x80, 0);
+ CreateSprite(&gUnknown_085E4BA4, 0x120, 0x6E, 1);
+
+ if (gUnknown_0203BCC8 == 0)
+ spriteId = intro_create_brendan_sprite(0x110, 100);
+ else
+ spriteId = intro_create_may_sprite(0x110, 100);
+
+ gSprites[spriteId].callback = sub_816F9D4;
+ gSprites[spriteId].anims = gUnknown_085E4DC4;
+ gTasks[taskId].data[1] = spriteId;
+ CreateSprite(&gUnknown_085E4B40, 0x110, 0x50, 0x4);
+ spriteId = intro_create_flygon_sprite(-0x40, 0x3C);
+ gSprites[spriteId].callback = sub_816FAB0;
+ gTasks[taskId].data[2] = spriteId;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_WHITEALPHA);
+ SetVBlankCallback(VBlankCB_Intro);
+ gTasks[taskId].data[0] = sub_817B3DC(1, 0x4000, 0x400, 0x10);
+ sub_817B150(1);
+ gTasks[taskId].func = Task_IntroHandleBikeAndFlygonMovement;
+}
+
+static void Task_IntroHandleBikeAndFlygonMovement(u8 taskId)
+{
+ s16 a;
+ u16 sine;
+
+ if (gIntroFrameCounter == 1856)
+ {
+ gUnknown_0203BD28 = 2;
+ DestroyTask(gTasks[taskId].data[0]);
+ }
+ if (gIntroFrameCounter > 1946)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA);
+ gTasks[taskId].func = Task_IntroWaitToSetupPart3;
+ }
+ if (gIntroFrameCounter == 1109)
+ gSprites[gTasks[taskId].data[1]].data[0] = 1;
+ if (gIntroFrameCounter == 1214)
+ gSprites[gTasks[taskId].data[1]].data[0] = 0;
+ if (gIntroFrameCounter == 1394)
+ gSprites[gTasks[taskId].data[2]].data[0] = 1;
+ if (gIntroFrameCounter == 1398)
+ gSprites[gTasks[taskId].data[1]].data[0] = 2;
+ if (gIntroFrameCounter == 1576)
+ gSprites[gTasks[taskId].data[1]].data[0] = 3;
+ if (gIntroFrameCounter == 1727)
+ gSprites[gTasks[taskId].data[1]].data[0] = 4;
+
+ sine = Sin(gTasks[taskId].data[3] >> 2 & 0x7F, 48);
+ gUnknown_0203BCCC = sine;
+ if (gTasks[taskId].data[3] < 512)
+ gTasks[taskId].data[3]++;
+ sub_817B540(0);
+}
+
+static void Task_IntroWaitToSetupPart3(u8 taskId)
+{
+ if (gIntroFrameCounter > 2068)
+ gTasks[taskId].func = Task_IntroLoadPart3Graphics;
+}
+
+static void sub_816D81C(struct Sprite *sprite)
+{
+ sprite->data[3] += 4;
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[1] < 180)
+ break;
+ ++sprite->data[0];
+ case 1:
+ sprite->pos1.x -= 4;
+ if (sprite->pos1.x == 0x3C)
+ {
+ sprite->data[0] = 8;
+ sprite->data[1] = 20;
+ sprite->data[2] = 2;
+ }
+ break;
+ case 2:
+ sprite->pos1.x += 8;
+ sprite->pos1.y -= 2;
+ if (sprite->pos1.x == 0x7C)
+ {
+ sprite->data[0] = 8;
+ sprite->data[1] = 20;
+ sprite->data[2] = 3;
+ }
+ break;
+ case 3:
+ sprite->pos1.y += 4;
+ if (sprite->pos1.y == 0x50)
+ {
+ sprite->data[0] = 8;
+ sprite->data[1] = 10;
+ sprite->data[2] = 4;
+ }
+ break;
+ case 4:
+ sprite->pos1.x -= 8;
+ sprite->pos1.y -= 2;
+ if (sprite->pos1.x == 0x3C)
+ {
+ sprite->data[0] = 8;
+ sprite->data[1] = 10;
+ sprite->data[2] = 5;
+ }
+ break;
+ case 5:
+ sprite->pos1.x += 0x3C;
+ sprite->data[4] = 0xC0;
+ sprite->data[5] = 0x80;
+ sprite->data[6] = 0x3;
+ sprite->data[0]++;
+ case 6:
+ sprite->pos2.x = Sin((u8)sprite->data[4], 0x3C);
+ sprite->pos2.y = Sin((u8)sprite->data[5], 0x14);
+ sprite->data[4] += 2;
+ sprite->data[5] += 4;
+ if ((sprite->data[4] & 0xFF) == 0x40)
+ {
+ sprite->hFlip = FALSE;
+ if (!--sprite->data[6])
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos2.x = 0;
+ sprite->data[0]++;
+ }
+ }
+ break;
+ case 7:
+ sprite->pos1.x -= 2;
+ sprite->pos2.y = Sin((u8)sprite->data[5], 0x14);
+ sprite->data[5] += 4;
+ if (sprite->pos1.x < -16)
+ DestroySprite(sprite);
+ break;
+ case 8:
+ sprite->pos2.y = Cos((u8)sprite->data[3], 2);
+ if (!--sprite->data[1])
+ sprite->data[0] = sprite->data[2];
+ break;
+ }
+}
+
+static void sub_816D9C0(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (gIntroFrameCounter == 1224)
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (gIntroFrameCounter == 1576)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[1] += 0x40;
+ if (sprite->data[1] & 0xFF00)
+ {
+ sprite->pos1.x--;
+ sprite->data[1] &= 0xFF;
+ }
+ }
+ break;
+ case 2:
+ if (gIntroFrameCounter != 1735)
+ {
+ sprite->data[1] += 0x20;
+ if (sprite->data[1] & 0xFF00)
+ {
+ sprite->pos1.x++;
+ sprite->data[1] &= 0xFF;
+ }
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0]++;
+ sprite->data[2] = 0x50;
+ }
+ break;
+ case 3:
+ if (--sprite->data[2])
+ {
+ sprite->data[1] += 0x40;
+ if (sprite->data[1] & 0xFF00)
+ {
+ sprite->pos1.x--;
+ sprite->data[1] &= 0xFF;
+ }
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 2);
+ sprite->data[0]++;
+ }
+ break;
+ case 4:
+ if (sprite->animEnded)
+ sprite->pos1.x += 4;
+
+ if (sprite->pos1.x > 336)
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 5:
+ if (gIntroFrameCounter > 1855)
+ sprite->pos1.x -= 2;
+ break;
+ }
+}
+
+static void sub_816DAE8(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (gIntroFrameCounter == 1088)
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->pos1.x -= 2;
+ if (gIntroFrameCounter != 1168)
+ break;
+ sprite->pos1.y -= 12;
+ sprite->data[1] = 0x80;
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ case 2:
+ if (sprite->pos1.x + sprite->pos2.x <= -0x20)
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ if ((sprite->data[1] & 0xFF) < 0x40)
+ {
+ sprite->pos2.x = Sin((u8)sprite->data[1], 0x10);
+ }
+ else
+ {
+ if ((sprite->data[1] & 0xFF) == 0x40)
+ sprite->pos1.x -= 0x30;
+ sprite->pos2.x = Sin((u8)sprite->data[1], 0x40);
+ }
+ sprite->data[1]++;
+ sprite->pos2.y = Cos((u8)sprite->data[2], 0xC);
+ sprite->data[2]++;
+ }
+ break;
+ }
+}
+
+static void Task_IntroLoadPart3Graphics(u8 taskId)
+{
+ intro_reset_and_hide_bgs();
+ LZ77UnCompVram(gIntro3Pokeball_Gfx, (void *)VRAM);
+ LZ77UnCompVram(gIntro3Pokeball_Tilemap, (void *)(VRAM + 0x4000));
+ LoadPalette(gIntro3PokeballPal, 0, 0x200);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0;
+ sub_816F2A8(0x78, 0x50, 0, 0);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);
+ gTasks[taskId].func = Task_IntroSpinAndZoomPokeball;
+ gIntroFrameCounter = 0;
+ m4aSongNumStart(MUS_T_BATTLE);
+}
+
+static void Task_IntroSpinAndZoomPokeball(u8 taskId)
+{
+ gTasks[taskId].data[0] += 0x400;
+
+ if (gTasks[taskId].data[1] <= 0x6BF)
+ {
+ gTasks[taskId].data[1] += gTasks[taskId].data[2];
+ gTasks[taskId].data[2] += 2;
+ }
+ else
+ {
+ gTasks[taskId].func = Task_IntroWaitToSetupPart3LegendsFight;
+ }
+
+ sub_816F2A8(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]);
+
+ if (gIntroFrameCounter == 28)
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA);
+}
+
+static void Task_IntroWaitToSetupPart3LegendsFight(u8 taskId)
+{
+ if (gIntroFrameCounter > 43)
+ gTasks[taskId].func = Task_IntroLoadPart1Graphics3;
+}
+
+static void Task_IntroLoadPart1Graphics3(u8 taskId)
+{
+ u16 i;
+
+ if (!gPaletteFade.active)
+ {
+ intro_reset_and_hide_bgs();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ LZDecompressVram(gIntro3GroudonGfx, (void *)VRAM);
+ LZDecompressVram(gIntro3GroudonTilemap, (void *)(VRAM + 0xC000));
+ LZDecompressVram(gIntro3LegendBgGfx, (void *)(VRAM + 0x4000));
+ LZDecompressVram(gIntro3GroudonBgTilemap, (void *)(VRAM + 0xE000));
+ LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[0x3A]);
+ LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[0x3A]);
+ CpuCopy16(gIntro3BgPal, gPlttBufferUnfaded, sizeof(gIntro3BgPal));
+ gTasks[taskId].func = Task_IntroLoadPart1Graphics4;
+ }
+}
+
+static void Task_IntroLoadPart1Graphics4(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0xA0);
+ SetGpuReg(REG_OFFSET_WININ, 0x3F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(24)
+ | BGCNT_256COLOR
+ | BGCNT_WRAP
+ | BGCNT_AFF512x512);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1)
+ | BGCNT_CHARBASE(1)
+ | BGCNT_SCREENBASE(28)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG1_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON
+ | DISPCNT_WIN0_ON);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0xFFA0;
+ gTasks[taskId].data[2] = 0xFF51;
+ gTasks[taskId].data[3] = 0x100;
+ sub_816F2A8(0xFFA0, 0xFF51, 0x100, 0);
+ gTasks[taskId].func = Task_IntroLoadPart1Graphics5;
+}
+
+static void Task_IntroLoadPart1Graphics5(u8 taskId)
+{
+ u16 foo = gTasks[taskId].data[0];
+
+ if (gTasks[taskId].data[0] != 32)
+ {
+ gTasks[taskId].data[0] += 4;
+ SetGpuReg(REG_OFFSET_WIN0V, (gTasks[taskId].data[0] * 256) - (foo -= 0x9C));
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_WIN0V, 0x2080);
+ gTasks[taskId].func = Task_IntroLoadPart1Graphics6;
+ }
+}
+
+static void Task_IntroLoadPart1Graphics6(u8 taskId)
+{
+ gTasks[taskId].func = Task_IntroLoadPart1Graphics7;
+}
+
+static void Task_IntroLoadPart1Graphics7(u8 taskId)
+{
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_IntroLoadPart1Graphics8;
+ ScanlineEffect_InitWave(0, 0xA0, 0x4, 4, 1, 4, 0);
+}
+
+static void Task_IntroLoadPart1Graphics8(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ data[5]++;
+ if ((u16)(data[0] - 1) < 7 && data[5] % 2 == 0)
+ data[4] ^= 3;
+ sub_816F2A8(data[1], data[2] + data[4], data[3], 0);
+ switch (data[0])
+ {
+ case 0:
+ data[1] += 0x10;
+ if (data[1] == 0xA0)
+ {
+ data[0]++;
+ data[6] = 2;
+ data[7] = 0x1E2;
+ sub_816E190(taskId);
+ }
+ break;
+ case 1:
+ if (--data[6] == 0)
+ {
+ data[6] = 2;
+ CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[31], sizeof(u16));
+ data[7] += 2;
+ if (data[7] == 0x1EC)
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (--data[6] == 0)
+ {
+ data[6] = 2;
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (--data[6] == 0)
+ {
+ data[6] = 2;
+ CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[31], sizeof(u16));
+ data[7] -= 2;
+ if (data[7] == 0x1E0)
+ {
+ data[6] = 8;
+ data[0]++;
+ }
+ }
+ break;
+ case 4:
+ if (--data[6] == 0)
+ {
+ data[1] = -0x60;
+ data[2] = 0xA9;
+ data[6] = 3;
+ data[0]++;
+ }
+ break;
+ case 5:
+ if (--data[6] == 0)
+ {
+ data[1] = 0x50;
+ data[2] = 0x29;
+ data[6] = 0x10;
+ PlayCryInternal(SPECIES_GROUDON, 0, 100, 10, 0);
+ data[0]++;
+ }
+ break;
+ case 6:
+ if (--data[6] == 0)
+ {
+ data[1] = 0x50;
+ data[2] = 0x28;
+ data[0]++;
+ }
+ break;
+ case 7:
+ data[1] += 4;
+ data[2] += 4;
+ data[6] += 0x666;
+ data[3] = Sin((data[6] & 0xFF00) >> 8, 0x40) + 0x100;
+ if (data[1] == 0x78)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFE, 3, 0, 16, RGB_WHITE);
+ data[3] = 0x100;
+ data[4] = 0;
+ data[0]++;
+ }
+ break;
+ case 8:
+ if (data[3])
+ data[3] -= 8;
+ else
+ data[0]++;
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].func = Task_IntroLoadPart1Graphics9;
+ gScanlineEffect.state = 3;
+ }
+ break;
+ }
+}
+
+static void sub_816E190(u8 a0)
+{
+ int i;
+ u8 spriteId;
+
+ for (i = 0; i < 6; i++)
+ {
+ spriteId = CreateSprite(gUnknown_08596C10, gUnknown_085E4C64[i][0], 0xA0, i);
+ gSprites[spriteId].callback = sub_816E1F8;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].data[1] = i;
+ gSprites[spriteId].data[4] = a0;
+ StartSpriteAnim(&gSprites[spriteId], gUnknown_085E4C64[i][1]);
+ }
+}
+
+static void sub_816E1F8(struct Sprite *sprite)
+{
+ sprite->data[3]++;
+ if (sprite->data[3] % 2 == 0)
+ sprite->pos2.y ^= 3;
+
+ switch(sprite->data[0])
+ {
+ case 0:
+ sprite->data[2] += gUnknown_085E4C64[sprite->data[1]][2];
+ sprite->pos1.y -= (sprite->data[2] & 0xFF00) >> 8;
+ sprite->data[2] &= 0xFF;
+ if (gTasks[sprite->data[4]].data[0] > 7)
+ sprite->data[0]++;
+ break;
+ case 1:
+ if (sprite->pos1.x < 0x78)
+ sprite->pos1.x -= 2;
+ else
+ sprite->pos1.x += 2;
+
+ if (sprite->pos1.y < 0x50)
+ sprite->pos1.y -= 2;
+ else
+ sprite->pos1.y += 2;
+ break;
+ }
+}
+
+static void Task_IntroLoadPart1Graphics9(u8 taskId)
+{
+ ResetSpriteData();
+ LZDecompressVram(gIntro3KyogreGfx, (void *)VRAM);
+ LZDecompressVram(gIntro3KyogreTilemap, (void *)(VRAM + 0xC000));
+ LZDecompressVram(gIntro3KyogreBgTilemap, (void *)(VRAM + 0xE000));
+ LoadCompressedObjectPic(gUnknown_085E4C88);
+ LoadSpritePalette(gUnknown_085E4C98);
+ BeginNormalPaletteFade(0xFFFFFFFE, 0, 0x10, 0, RGB_WHITEALPHA);
+ gTasks[taskId].func = Task_IntroFadeIn0;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0x150;
+ gTasks[taskId].data[2] = 0x50;
+ gTasks[taskId].data[6] = 0x10;
+ gTasks[taskId].data[3] = 0x100;
+ sub_816F2A8(0x150, 0x50, 0x100, 0);
+ ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, 6, 0);
+}
+
+static void Task_IntroFadeIn0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ sub_816F2A8(data[1], data[2], data[3], 0);
+
+ switch (data[0])
+ {
+ case 0:
+ if (--data[6] != 0)
+ break;
+ data[0]++;
+ case 1:
+ data[6] += 4;
+ gTasks[taskId].data[1] = 0x158 - Sin(data[6], 0x100);
+ gTasks[taskId].data[2] = 0x54 - Cos(data[6], 0x40);
+ if (data[6] == 0x40)
+ {
+ data[6] = 0x19;
+ data[7] = 1;
+ data[0]++;
+ sub_816E6D4(0);
+ }
+ break;
+ case 2:
+ if (--data[6] == 0)
+ {
+ gTasks[taskId].data[1] += 0x100;
+ gTasks[taskId].data[2] -= 0x102;
+ data[6] = 8;
+ data[0]++;
+ sub_816E6D4(0);
+ sub_816E74C();
+ }
+ break;
+ case 3:
+ if (--data[6] == 0)
+ {
+ gTasks[taskId].data[1] -= 0x100;
+ gTasks[taskId].data[2] += 0x102;
+ data[6] = 8;
+ data[0]++;
+ }
+ break;
+ case 4:
+ if (--data[6] == 0)
+ {
+ gTasks[taskId].data[2] -= 0xFC;
+ data[6] = 8;
+ data[0]++;
+ }
+ break;
+ case 5:
+ if (--data[6] == 0)
+ {
+ gTasks[taskId].data[2] += 0xFC;
+ if (data[7] != 0)
+ {
+ data[6] = 12;
+ data[7]--;
+ data[0] = 2;
+ }
+ else
+ {
+ data[6] = 1;
+ data[0]++;
+ PlayCryInternal(SPECIES_KYOGRE, 0, 120, 10, 0);
+ }
+ }
+ break;
+ case 6:
+ if (--data[6] == 0)
+ {
+ data[6] = 4;
+ data[7] = 0x1EA;
+ data[0]++;
+ }
+ break;
+ case 7:
+ if (--data[6] == 0)
+ {
+ data[6] = 4;
+ CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[47], sizeof(u16));
+ data[7] -= 2;
+ if (data[7] == 0x1E0)
+ data[0]++;
+ }
+ break;
+ case 8:
+ if (--data[6] == 0)
+ {
+ data[6] = 4;
+ data[7] = 0x1E2;
+ data[0]++;
+ }
+ break;
+ case 9:
+ if (--data[6] == 0)
+ {
+ data[6] = 4;
+ CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[47], sizeof(u16));
+ data[7] += 2;
+ if (data[7] == 0x1EE)
+ {
+ data[6] = 0x10;
+ data[0]++;
+ }
+ }
+ break;
+ case 10:
+ if (--data[6] == 0)
+ {
+ data[6] = 0;
+ data[0]++;
+ sub_816E6D4(taskId);
+ }
+ break;
+ case 11:
+ data[6] += 4;
+ data[3] -= 8;
+ gTasks[taskId].data[1] = Sin(data[6], 0x3C) + 0x58;
+ if (data[6] == 0x40)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFE, 3, 0, 16, RGB_WHITE);
+ data[0]++;
+ }
+ break;
+ case 12:
+ data[6] += 4;
+ data[3] -= 8;
+ gTasks[taskId].data[1] = Sin(data[6], 0x14) + 0x80;
+ if (data[6] == 0x80)
+ data[0]++;
+ break;
+ case 13:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].func = Task_IntroFadeIn1;
+ gScanlineEffect.state = 3;
+ }
+ break;
+ }
+}
+
+static void sub_816E6D4(u8 a0)
+{
+ int i;
+ u8 spriteId;
+
+ for (i = 0; i < 6; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_085E4D14, gUnknown_085E4CA8[i][0], gUnknown_085E4CA8[i][1], i);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data[5] = a0;
+ gSprites[spriteId].data[6] = gUnknown_085E4CA8[i][2];
+ gSprites[spriteId].data[7] = 0x40;
+ }
+}
+
+static void sub_816E74C(void)
+{
+ int i;
+ u8 spriteId;
+
+ for (i = 0; i < 6; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_085E4D14, gUnknown_085E4CA8[i + 6][0], gUnknown_085E4CA8[i + 6][1], i);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data[6] = gUnknown_085E4CA8[i][2];
+ gSprites[spriteId].data[7] = 0x40;
+ }
+}
+
+static void sub_816E7B4(struct Sprite *sprite)
+{
+ switch(sprite->data[0])
+ {
+ case 0:
+ if (sprite->data[6] == 0)
+ {
+ sprite->data[1] = (sprite->data[1] + 11) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 4);
+ sprite->data[2] += 0x30;
+ sprite->pos2.y = -(sprite->data[2] >> 8);
+ if (sprite->animEnded)
+ DestroySprite(sprite);
+ }
+ else if (--sprite->data[6] == 0)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->invisible = FALSE;
+ }
+ if (gTasks[sprite->data[5]].data[0] > 11)
+ sprite->data[0]++;
+ break;
+ case 1:
+ if (sprite->pos1.x < 120)
+ sprite->pos1.x -= 3;
+ else
+ sprite->pos1.x += 3;
+
+ if (sprite->pos1.y < 80)
+ sprite->pos1.y -= 3;
+ else
+ sprite->pos1.y += 3;
+ if ((u16)(sprite->pos1.y - 20) > 140)
+ DestroySprite(sprite);
+ break;
+ }
+}
+
+static void Task_IntroFadeIn1(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
+ | BLDCNT_TGT1_BG1
+ | BLDCNT_TGT1_BG2
+ | BLDCNT_EFFECT_LIGHTEN);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(31, 31));
+ SetGpuReg(REG_OFFSET_BLDY, 31);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(24)
+ | BGCNT_16COLOR
+ | BGCNT_TXT512x256);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(1)
+ | BGCNT_SCREENBASE(26)
+ | BGCNT_16COLOR
+ | BGCNT_TXT512x256);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)
+ | BGCNT_CHARBASE(1)
+ | BGCNT_SCREENBASE(28)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_BG1_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON
+ | DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 80);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, -80);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ LZDecompressVram(gIntro3CloudsGfx, (void *)VRAM);
+ LZDecompressVram(gIntro3CloudsGfx, (void *)(VRAM + 0x4000));
+ LZDecompressVram(gIntro3Clouds3Tilemap, (void *)(VRAM + 0xE000));
+ gTasks[taskId].func = Task_IntroFadeIn2;
+}
+
+static void Task_IntroFadeIn2(u8 taskId)
+{
+ LZDecompressVram(gIntro3Clouds1Tilemap, (void *)(VRAM + 0xC000));
+ LZDecompressVram(gIntro3Clouds2Tilemap, (void *)(VRAM + 0xD000));
+ gTasks[taskId].func = Task_IntroFadeIn3;
+}
+
+static void Task_IntroFadeIn3(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gTasks[taskId].func = Task_IntroFadeIn4;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = 16;
+}
+
+static void Task_IntroFadeIn4(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ SetGpuReg(REG_OFFSET_BG0HOFS, (data[6] >> 8));
+ SetGpuReg(REG_OFFSET_BG1HOFS, -(data[6] >> 8));
+
+ switch (data[0])
+ {
+ case 0:
+ if (--data[6] == 0)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFE, 0, 16, 0, RGB_WHITEALPHA);
+ data[6] = 0x5000;
+ data[0]++;
+ }
+ break;
+ case 1:
+ if (data[6] == 0x2800)
+ BeginNormalPaletteFade(0x0000FFFE, 3, 0, 16, RGB(9, 10, 10));
+
+ if (data[6] != 0)
+ data[6] -= 0x80;
+ else if (!gPaletteFade.active)
+ gTasks[taskId].func = Task_IntroFadeIn5;
+ break;
+ }
+}
+
+static void Task_IntroFadeIn5(u8 taskId)
+{
+ LZDecompressVram(gIntro3RayquazaTilemap, (void *)(VRAM + 0xE000));
+ LZDecompressVram(gIntro3Clouds4Tilemap, (void *)(VRAM + 0xC000));
+ LZDecompressVram(gIntro3RayquazaGfx, (void *)(VRAM + 0x4000));
+ LZDecompressVram(gIntro3Clouds2Gfx, (void *)VRAM);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON
+ | DISPCNT_WIN0_ON);
+ gTasks[taskId].func = Task_IntroFadeIn6;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = 1;
+ gTasks[taskId].data[7] = 0;
+ LoadCompressedObjectPicUsingHeap(gUnknown_085E4BF4);
+ LoadSpritePalettes(gUnknown_085E4C04);
+}
+
+static void Task_IntroFadeIn6(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u8 spriteId;
+
+ switch (data[0])
+ {
+ case 0:
+ if (--data[6] == 0)
+ {
+ CreateSprite(&gUnknown_085E4C4C, 200, 48, 0);
+ spriteId = CreateSprite(&gUnknown_085E4C4C, 200, 80, 1);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ spriteId = CreateSprite(&gUnknown_085E4C4C, 200, 112, 2);
+ StartSpriteAnim(&gSprites[spriteId], 2);
+ data[0]++;
+ data[6] = 72;
+ }
+ break;
+ case 1:
+ if (--data[6] == 0)
+ {
+ CreateSprite(&gUnknown_085E4C4C, 40, 48, 0);
+ spriteId = CreateSprite(&gUnknown_085E4C4C, 40, 80, 1);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ spriteId = CreateSprite(&gUnknown_085E4C4C, 40, 112, 2);
+ StartSpriteAnim(&gSprites[spriteId], 2);
+ data[0]++;
+ data[6] = 48;
+ }
+ break;
+ case 2:
+ if (--data[6] == 0)
+ gTasks[taskId].func = Task_IntroFadeIn7;
+ break;
+ }
+}
+
+static void sub_816EC6C(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ sprite->invisible = TRUE;
+
+ switch(sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = 0x1C2;
+ sprite->data[0]++;
+ case 1:
+ CpuCopy16(&gIntro3BgPal[sprite->data[1]], &gPlttBufferFaded[93], 2);
+ sprite->data[1] += 2;
+ if (sprite->data[1] != 0x1CE)
+ break;
+ sprite->data[1] = 0x1CC;
+ sprite->data[2] = 4;
+ sprite->data[0]++;
+ case 2:
+ if (--sprite->data[2] == 0)
+ {
+ sprite->data[2] = 4;
+ CpuCopy16(&gIntro3BgPal[sprite->data[1]], &gPlttBufferFaded[93], 2);
+ sprite->data[1] -= 2;
+ if (sprite->data[1] == 0x1C0)
+ DestroySprite(sprite);
+ }
+ break;
+ }
+}
+
+static void Task_IntroFadeIn7(u8 taskId)
+{
+ u8 newTaskId;
+
+ LoadCompressedObjectPic(gUnknown_085E5048);
+ LoadSpritePalettes(gUnknown_085E5058);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON
+ | DISPCNT_WIN0_ON);
+ gTasks[taskId].func = Task_IntroFadeIn8;
+ BeginNormalPaletteFade(0x0000FFDE, 0, 16, 0, RGB(9, 10, 10));
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0xA8;
+ gTasks[taskId].data[2] = -0x10;
+ gTasks[taskId].data[3] = -0x88;
+ gTasks[taskId].data[4] = -0x10;
+ newTaskId = CreateTask(sub_816EEA8, 0);
+ gTasks[newTaskId].data[4] = taskId;
+}
+
+static void Task_IntroFadeIn8(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[7] % 2 == 0)
+ data[6] ^= 2;
+
+ data[7]++;
+
+ switch(data[0])
+ {
+ case 0:
+ if ((data[7] & 1) != 0)
+ {
+ data[1] -= 2;
+ data[2]++;
+ data[3] += 2;
+ data[4]++;
+ }
+ if (data[1] == 0x68)
+ {
+ data[0]++;
+ data[5] = 1;
+ }
+ break;
+ case 1:
+ data[0]++;
+ data[5] = 4;
+ break;
+ case 2:
+ data[1] += 4;
+ data[2] -= 2;
+ data[3] -= 4;
+ data[4] -= 2;
+ if (!gPaletteFade.active)
+ {
+ data[5] = 0x8C;
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (--data[5] == 0)
+ gTasks[taskId].func = Task_IntroFadeIn9;
+ break;
+ }
+}
+
+static void Task_IntroFadeIn9(u8 taskId)
+{
+ DestroyTask(taskId);
+ SetMainCallback2(MainCB2_EndIntro);
+}
+
+static void sub_816EEA8(u8 taskId)
+{
+ u8 spriteId;
+ s16 *data = gTasks[taskId].data;
+
+ data[2]++;
+
+ switch(data[0])
+ {
+ case 0:
+ if ((data[2] & 1) != 0)
+ {
+ CpuCopy16(&gIntro3BgPal[0x1A2 + data[1] * 2], &gPlttBufferFaded[94], 2);
+ data[1]++;
+ }
+ if (data[1] == 6)
+ {
+ data[0]++;
+ data[1] = 0;
+ data[3] = 10;
+ }
+ break;
+ case 1:
+ if (data[3] == 0)
+ {
+ if ((data[2] & 1) != 0)
+ {
+ CpuCopy16(&gIntro3BgPal[0x1A2 + data[1] * 2], &gPlttBufferFaded[88], 2);
+ data[1]++;
+ }
+ if (data[1] == 6)
+ {
+ data[0]++;
+ data[3] = 10;
+ }
+ }
+ else
+ {
+ data[3]--;
+ }
+ break;
+ case 2:
+ if (data[3] == 0)
+ {
+ if ((data[2] & 1) != 0)
+ {
+ CpuCopy16(&gIntro3BgPal[0x182 + data[1] * 2], &gPlttBufferFaded[92], 2);
+ data[1]++;
+ }
+ if (data[1] == 6)
+ {
+ spriteId = CreateSprite(&gUnknown_085E5030, 120, 88, 15);
+ PlaySE(SE_OP_BASYU);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data[3] = data[4];
+ data[0]++;
+ data[3] = 16;
+ }
+ }
+ else
+ {
+ data[3]--;
+ }
+ break;
+ case 3:
+ if ((data[2] & 1) != 0)
+ {
+ if (--data[3] != 0)
+ {
+ BlendPalette(0x50, 16, data[3], RGB(9, 10, 10));
+ CpuCopy16(&gIntro3BgPal[0x1AC], &gPlttBufferFaded[94], 2);
+ CpuCopy16(&gIntro3BgPal[0x1AC], &gPlttBufferFaded[88], 2);
+ CpuCopy16(&gIntro3BgPal[0x18C], &gPlttBufferFaded[92], 2);
+ }
+ else
+ {
+ data[0]++;
+ data[3] = 53;
+ }
+ }
+ break;
+ case 4:
+ if (--data[3] == 0)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITE);
+ data[0]++;
+ }
+ break;
+ case 5:
+ if (!gPaletteFade.active)
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void intro_reset_and_hide_bgs(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+}
+
+static void Task_IntroWaterDrops_1(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ default:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND
+ | BLDCNT_TGT2_BG0
+ | BLDCNT_TGT2_BG1
+ | BLDCNT_TGT2_BG2
+ | BLDCNT_TGT2_BG3
+ | BLDCNT_TGT2_OBJ
+ | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[31]);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gTasks[taskId].data[1] = 0x40;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (gTasks[taskId].data[1] != 0)
+ {
+ u8 tmp;
+
+ gTasks[taskId].data[1]--;
+ tmp = gTasks[taskId].data[1] / 2;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[tmp]);
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[0]);
+ gTasks[taskId].data[1] = 0x10;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void Task_IntroWaterDrops_2(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ default:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND
+ | BLDCNT_TGT2_BG0
+ | BLDCNT_TGT2_BG1
+ | BLDCNT_TGT2_BG2
+ | BLDCNT_TGT2_BG3
+ | BLDCNT_TGT2_OBJ
+ | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[0]);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (gTasks[taskId].data[1] < 62)
+ {
+ u8 tmp;
+
+ gTasks[taskId].data[1]++;
+ tmp = gTasks[taskId].data[1] / 2;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[tmp]);
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[31]);
+ gTasks[taskId].data[1] = 0x10;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ if (gTasks[taskId].data[1] != 0)
+ {
+ gTasks[taskId].data[1]--;
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_816F2A8(u16 scrX, u16 scrY, u16 zoom, u16 alpha)
+{
+ struct BgAffineSrcData src;
+ struct BgAffineDstData dest;
+
+ src.texX = 0x8000;
+ src.texY = 0x8000;
+ src.scrX = scrX;
+ src.scrY = scrY;
+ src.sx = zoom;
+ src.sy = zoom;
+ src.alpha = alpha;
+ BgAffineSet(&src, &dest, 1);
+ SetGpuReg(REG_OFFSET_BG2PA, dest.pa);
+ SetGpuReg(REG_OFFSET_BG2PB, dest.pb);
+ SetGpuReg(REG_OFFSET_BG2PC, dest.pc);
+ SetGpuReg(REG_OFFSET_BG2PD, dest.pd);
+ SetGpuReg(REG_OFFSET_BG2X_L, dest.dx);
+ SetGpuReg(REG_OFFSET_BG2X_H, dest.dx >> 16);
+ SetGpuReg(REG_OFFSET_BG2Y_L, dest.dy);
+ SetGpuReg(REG_OFFSET_BG2Y_H, dest.dy >> 16);
+}
+
+static void sub_816F318(struct Sprite *sprite)
+{
+ u8 r0;
+
+ if (sprite->data[2] >= 192)
+ {
+ if (sprite->data[3] != 0)
+ {
+ sprite->data[3]--;
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ SetOamMatrix(sprite->data[1], sprite->data[2], 0, 0, sprite->data[2]);
+ sprite->data[2] = (sprite->data[2] * 95) / 100;
+ r0 = (sprite->data[2] - 192) / 128 + 9;
+ if (r0 > 15)
+ r0 = 15;
+ sprite->oam.paletteNum = r0;
+ }
+ }
+ else
+ {
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_816F3A4(struct Sprite *sprite)
+{
+ if (gSprites[sprite->data[7]].data[7] != 0)
+ {
+ sprite->invisible = TRUE;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ StartSpriteAnim(sprite, 3);
+ sprite->data[2] = 1024;
+ sprite->data[3] = 8 * (sprite->data[1] & 3);
+ sprite->callback = sub_816F318;
+ sprite->oam.shape = 1;
+ sprite->oam.size = 3;
+ CalcCenterToCornerVec(sprite, 1, 3, 2);
+ }
+ else
+ {
+ sprite->pos2.x = gSprites[sprite->data[7]].pos2.x;
+ sprite->pos2.y = gSprites[sprite->data[7]].pos2.y;
+ sprite->pos1.x = gSprites[sprite->data[7]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[7]].pos1.y;
+ }
+}
+
+static void sub_816F454(struct Sprite *sprite)
+{
+ if (sprite->data[0] != 0)
+ sprite->callback = sub_816F46C;
+}
+
+static void sub_816F46C(struct Sprite *sprite)
+{
+ if (sprite->pos1.x <= 116)
+ {
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos1.x += 4;
+ sprite->pos2.x = -4;
+ sprite->data[4] = 128;
+ sprite->callback = sub_816F5B4;
+ }
+ else
+ {
+ u16 data2;
+ u16 data3;
+ u16 data4;
+ s16 sin1;
+ s16 sin2;
+ s16 sin3;
+ s16 sin4;
+ s16 var1;
+ s16 var2;
+ s16 var3;
+ s16 var4;
+ s16 temp;
+
+ data4 = sprite->data[4];
+ sin1 = gSineTable[(u8)data4];
+ sin2 = gSineTable[(u8)(data4 + 64)];
+ sprite->data[4] += 2;
+ sprite->pos2.y = sin1 / 32;
+ sprite->pos1.x--;
+ if (sprite->pos1.x & 1)
+ sprite->pos1.y++;
+ temp = -sin2 / 16;
+ data2 = sprite->data[2];
+ data3 = sprite->data[3];
+ sin3 = gSineTable[(u8)(temp - 16)];
+ sin4 = gSineTable[(u8)(temp + 48)];
+ var1 = sin4 * data2 / 256;
+ var2 = -sin3 * data3 / 256;
+ var3 = sin3 * data2 / 256;
+ var4 = sin4 * data3 / 256;
+ SetOamMatrix(sprite->data[1], data2, 0, 0, data3);
+ SetOamMatrix(sprite->data[1] + 1, var1, var3, var2, var4);
+ SetOamMatrix(sprite->data[1] + 2, var1, var3, var2 * 2, var4 * 2);
+ }
+}
+
+static void sub_816F5B4(struct Sprite *sprite)
+{
+ SetOamMatrix(sprite->data[1], sprite->data[6] + 64, 0, 0, sprite->data[6] + 64);
+ SetOamMatrix(sprite->data[1] + 1, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64);
+ SetOamMatrix(sprite->data[1] + 2, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64);
+ if (sprite->data[4] != 64)
+ {
+ u16 data4;
+
+ sprite->data[4] -= 8;
+ data4 = sprite->data[4];
+ sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64;
+ sprite->pos2.y = gSineTable[(u8)data4] / 64;
+ }
+ else
+ {
+ sprite->data[4] = 0;
+ sprite->callback = sub_816F660;
+ }
+}
+
+static void sub_816F660(struct Sprite *sprite)
+{
+ if (sprite->data[0] != 2)
+ {
+ s16 r2;
+
+ sprite->data[4] += 8;
+ r2 = gSineTable[(u8)sprite->data[4]] / 16 + 64;
+ sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64;
+ sprite->pos2.y = gSineTable[(u8)r2] / 64;
+ }
+ else
+ {
+ sprite->callback = SpriteCB_WaterDropFall;
+ }
+}
+
+static void SpriteCB_WaterDropFall(struct Sprite *sprite)
+{
+ if (sprite->pos1.y < sprite->data[5])
+ {
+ sprite->pos1.y += 4;
+ }
+ else
+ {
+ sprite->data[7] = 1;
+ sprite->invisible = TRUE;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ StartSpriteAnim(sprite, 3);
+ sprite->data[2] = 1024;
+ sprite->data[3] = 8 * (sprite->data[1] & 3);
+ sprite->callback = sub_816F318;
+ sprite->oam.shape = 1;
+ sprite->oam.size = 3;
+ CalcCenterToCornerVec(sprite, 1, 3, 2);
+ }
+}
+
+//Duplicate function
+static void SpriteCB_WaterDropFall_2(struct Sprite *sprite)
+{
+ if (sprite->pos1.y < sprite->data[5])
+ {
+ sprite->pos1.y += 4;
+ }
+ else
+ {
+ sprite->data[7] = 1;
+ sprite->invisible = TRUE;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ StartSpriteAnim(sprite, 3);
+ sprite->data[2] = 1024;
+ sprite->data[3] = 8 * (sprite->data[1] & 3);
+ sprite->callback = sub_816F318;
+ sprite->oam.shape = 1;
+ sprite->oam.size = 3;
+ CalcCenterToCornerVec(sprite, 1, 3, 2);
+ }
+}
+
+static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
+{
+ u8 spriteId;
+ u8 oldSpriteId;
+
+ spriteId = CreateSprite(&gUnknown_085E4D64, x, y, 1);
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[7] = 0;
+ gSprites[spriteId].data[1] = d;
+ gSprites[spriteId].data[2] = c;
+ gSprites[spriteId].data[3] = c;
+ gSprites[spriteId].data[5] = e;
+ gSprites[spriteId].data[6] = c;
+ gSprites[spriteId].oam.affineMode = 3;
+ gSprites[spriteId].oam.matrixNum = d;
+ CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2);
+ StartSpriteAnim(&gSprites[spriteId], 2);
+ if (!fallImmediately)
+ gSprites[spriteId].callback = sub_816F454;
+ else
+ gSprites[spriteId].callback = SpriteCB_WaterDropFall_2;
+ oldSpriteId = spriteId;
+
+ spriteId = CreateSprite(&gUnknown_085E4D64, x, y, 1);
+ gSprites[spriteId].data[7] = oldSpriteId;
+ gSprites[spriteId].data[1] = d + 1;
+ gSprites[spriteId].oam.affineMode = 3;
+ gSprites[spriteId].oam.matrixNum = d + 1;
+ CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2);
+ gSprites[spriteId].callback = sub_816F3A4;
+
+ spriteId = CreateSprite(&gUnknown_085E4D64, x, y, 1);
+ gSprites[spriteId].data[7] = oldSpriteId;
+ gSprites[spriteId].data[1] = d + 2;
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ gSprites[spriteId].oam.affineMode = 3;
+ gSprites[spriteId].oam.matrixNum = d + 2;
+ CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2);
+ gSprites[spriteId].callback = sub_816F3A4;
+
+ 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;
+}
+
+static void sub_816F9D4(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ sprite->pos1.x--;
+ break;
+ case 1:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (gIntroFrameCounter & 7)
+ return;
+ sprite->pos1.x++;
+ break;
+ case 2:
+ if (sprite->pos1.x <= 120 || gIntroFrameCounter & 7)
+ sprite->pos1.x++;
+ break;
+ case 3:
+ break;
+ case 4:
+ if (sprite->pos1.x > -32)
+ sprite->pos1.x -= 2;
+ break;
+ }
+ if (gIntroFrameCounter & 7)
+ return;
+ if (sprite->pos2.y != 0)
+ {
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ switch (Random() & 3)
+ {
+ case 0:
+ sprite->pos2.y = -1;
+ break;
+ case 1:
+ sprite->pos2.y = 1;
+ break;
+ case 2:
+ case 3:
+ sprite->pos2.y = 0;
+ break;
+ }
+ }
+}
+
+static void sub_816FAB0(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ break;
+ case 1:
+ if (sprite->pos2.x + sprite->pos1.x < 304)
+ sprite->pos2.x += 8;
+ else
+ sprite->data[0] = 2;
+ break;
+ case 2:
+ if (sprite->pos2.x + sprite->pos1.x > 120)
+ sprite->pos2.x -= 1;
+ else
+ sprite->data[0] = 3;
+ break;
+ case 3:
+ if (sprite->pos2.x > 0)
+ sprite->pos2.x -= 2;
+ break;
+ }
+ sprite->pos2.y = Sin((u8)sprite->data[1], 8) - gUnknown_0203BCCC;
+ sprite->data[1] += 4;
+}
+
+static void sub_816FB38(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (sprite->data[1] != 0)
+ {
+ sprite->data[1]--;
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (gIntroFrameCounter == 0x90)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 9;
+ sprite->data[3] = 2;
+ }
+ break;
+ case 2:
+ if (sprite->data[3] == 0)
+ {
+ sprite->data[3] = 2;
+ if (sprite->data[1] != 0)
+ {
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2);
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2);
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2);
+ sprite->data[1]--;
+ }
+ else
+ {
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2);
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2);
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2);
+ sprite->data[0]++;
+ }
+ }
+ else
+ {
+ sprite->data[3]--;
+ }
+ break;
+ case 3:
+ if (sprite->data[3] != 0)
+ {
+ sprite->data[3]--;
+ }
+ else
+ {
+ sprite->data[3] = 2;
+ if (sprite->data[1] < 10)
+ {
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2);
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2);
+ CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2);
+ sprite->data[1]++;
+ }
+ else
+ {
+ sprite->data[0]++;
+ }
+ }
+ break;
+ case 4:
+ if (gIntroFrameCounter == 0x110)
+ {
+ StartSpriteAffineAnim(sprite, 2);
+ sprite->oam.objMode = 1;
+ sprite->data[0]++;
+ }
+ break;
+ case 5:
+ sprite->data[3] += gUnknown_085E4F48[sprite->data[2]];
+ sprite->pos2.x = (sprite->data[3] & 0xFF00) >> 8;
+ if (sprite->data[2] < 4)
+ {
+ s16 temp = sprite->pos2.x;
+ sprite->pos2.x = -temp;
+ }
+ if (sprite->affineAnimEnded)
+ DestroySprite(sprite);
+ break;
+ }
+}
+
+static void sub_816FD44(struct Sprite *sprite)
+{
+ switch(sprite->data[0])
+ {
+ case 0:
+ if (gIntroFrameCounter == 0x80)
+ {
+ sprite->invisible = FALSE;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (gIntroFrameCounter == 0x110)
+ {
+ StartSpriteAffineAnim(sprite, 3);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->affineAnimEnded)
+ DestroySprite(sprite);
+ break;
+ }
+}
+
+static u8 sub_816FDB8(s16 a0, s16 a1, s16 a2)
+{
+ u16 i;
+ u8 spriteId;
+
+ for (i = 0; i < 9; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_085E4F5C, gUnknown_085E4E94[i][1] + a0, a1 - 4, 0);
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = gUnknown_085E4FA4[i];
+ gSprites[spriteId].data[2] = i;
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].oam.matrixNum = i + 12;
+ StartSpriteAnim(&gSprites[spriteId], gUnknown_085E4E94[i][0]);
+ StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ }
+ spriteId = CreateSprite(&gUnknown_085E4F8C, 120, a1 - 6, 0);
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].oam.matrixNum = i + 12;
+ StartSpriteAffineAnim(&gSprites[spriteId], 1);
+ return spriteId;
+}
+
+static void sub_816FEDC(struct Sprite *sprite)
+{
+ sprite->data[7]++;
+
+ if (sprite->data[0] != 0)
+ {
+ s16 sin1;
+ s16 sin2;
+
+ s16 a, b, c, d;
+
+ sin1 = gSineTable[(u8)sprite->data[2]];
+ sin2 = gSineTable[(u8)(sprite->data[2] + 64)];
+
+ d = Q_8_8_TO_INT(sin2 * sprite->data[1]);
+ c = Q_8_8_TO_INT(-sin1 * sprite->data[1]);
+ b = Q_8_8_TO_INT(sin1 * sprite->data[1]);
+ a = Q_8_8_TO_INT(sin2 * sprite->data[1]);
+
+ SetOamMatrix(1, a, b, c, d);
+ }
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ default:
+ sprite->oam.affineMode = 3;
+ sprite->oam.matrixNum = 1;
+ CalcCenterToCornerVec(sprite, 1, 3, 3);
+ sprite->invisible = FALSE;
+ sprite->data[0] = 1;
+ sprite->data[1] = 0x80;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ break;
+ case 1:
+ sprite->pos2.x = -Sin((u8)sprite->data[3], 140);
+ sprite->pos2.y = -Sin((u8)sprite->data[3], 120);
+ sprite->data[1] += 7;
+ sprite->data[3] += 3;
+ if (sprite->pos1.x + sprite->pos2.x <= -16)
+ {
+ sprite->oam.priority = 3;
+ sprite->data[0]++;
+ sprite->pos1.x = 20;
+ sprite->pos1.y = 40;
+ sprite->data[1] = 0x200;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0x10;
+ }
+ break;
+ case 2:
+ sprite->pos2.x = Sin((u8)sprite->data[3], 34);
+ sprite->pos2.y = -Cos((u8)sprite->data[3], 60);
+ sprite->data[1] += 2;
+ if (sprite->data[7] % 5 == 0)
+ sprite->data[3]++;
+ break;
+ }
+}
+
+static void sub_8170040(struct Sprite *sprite)
+{
+ u16 foo;
+
+ //I'm not sure why a switch statement was used here.
+ //if (sprite->data[0] != 1) would have been more appropriate.
+ switch (sprite->data[0])
+ {
+ case 0:
+ default:
+ sprite->invisible = FALSE;
+ sprite->oam.affineMode = 3;
+ sprite->oam.matrixNum = 18;
+ CalcCenterToCornerVec(sprite, 0, 3, 3);
+ sprite->data[1] = 0;
+ sprite->data[0] = 1;
+ //fall through
+ case 1:
+ sprite->data[7]++;
+ if (sprite->data[7] & 1)
+ {
+ sprite->invisible = TRUE;
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ if (sprite->data[1] < 64)
+ sprite->data[1]++;
+ }
+ foo = 256 - gSineTable[(u8)sprite->data[1]] / 2;
+ SetOamMatrix(18, foo, 0, 0, foo);
+ break;
+ }
+}
diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c
new file mode 100644
index 000000000..d570b2992
--- /dev/null
+++ b/src/intro_credits_graphics.c
@@ -0,0 +1,740 @@
+#include "global.h"
+#include "intro_credits_graphics.h"
+#include "palette.h"
+#include "decompress.h"
+#include "gpu_regs.h"
+#include "task.h"
+#include "main.h"
+#include "graphics.h"
+
+struct IntroCreditsSpriteMetadata
+{
+ u8 animNum:4;
+ u8 shape:2;
+ u8 size:2;
+ u8 x;
+ u8 y;
+ u8 subpriority;
+ u16 xOff;
+};
+
+static const u16 gUnknown_085F06E0[] = INCBIN_U16("graphics/intro/intro2_grass.gbapal");
+static const u16 gUnknown_085F0700[] = INCBIN_U16("graphics/intro/intro2_grass_afternoon.gbapal");
+static const u16 gUnknown_085F0720[] = INCBIN_U16("graphics/intro/intro2_grass_night.gbapal");
+static const u8 gUnknown_085F0740[] = INCBIN_U8("graphics/intro/intro2_grass.4bpp.lz");
+static const u8 gUnknown_085F0BC0[] = INCBIN_U8("graphics/intro/intro2_grass_map.bin.lz");
+static const u16 gUnknown_085F0CFC[] = INCBIN_U16("graphics/intro/85F0CFC.gbapal");
+static const u16 gUnknown_085F0D5C[] = INCBIN_U16("graphics/intro/85F0D5C.gbapal");
+static const u8 gUnknown_085F0DBC[] = INCBIN_U8("graphics/intro/intro2_bgclouds.4bpp.lz");
+static const u8 gUnknown_085F1398[] = INCBIN_U8("graphics/intro/intro2_bgclouds_map.bin.lz");
+static const u16 gUnknown_085F1668[] = INCBIN_U16("graphics/intro/intro2_bgclouds.gbapal");
+static const u16 gUnknown_085F1688[] = INCBIN_U16("graphics/intro/intro2_bgclouds_afternoon.gbapal");
+static const u8 gUnknown_085F16A8[] = INCBIN_U8("graphics/intro/intro2_bgclouds2.4bpp.lz");
+static const u16 gUnknown_085F17E4[] = INCBIN_U16("graphics/intro/intro2_bgtrees2.gbapal");
+static const u16 gUnknown_085F1804[] = INCBIN_U16("graphics/intro/intro2_bgtrees2_afternoon.gbapal");
+static const u8 gUnknown_085F1824[] = INCBIN_U8("graphics/intro/intro2_bgtrees.4bpp.lz");
+static const u8 gUnknown_085F1EAC[] = INCBIN_U8("graphics/intro/intro2_bgtrees_map.bin.lz");
+static const u16 gUnknown_085F21B0[] = INCBIN_U16("graphics/intro/intro2_bgtrees.gbapal");
+static const u8 gIntro2TreeTiles[] = INCBIN_U8("graphics/intro/intro2_bgtreessmall.4bpp.lz");
+static const u16 gUnknown_085F231C[] = INCBIN_U16("graphics/intro/85F231C.gbapal");
+static const u8 gUnknown_085F235C[] = INCBIN_U8("graphics/intro/intro2_bgnight.4bpp.lz");
+static const u16 gUnknown_085F2548[] = INCBIN_U16("graphics/intro/intro2_bgnight.gbapal");
+static const u8 gUnknown_085F2568[] = INCBIN_U8("graphics/intro/intro2_bgnight_map.bin.lz");
+static const u8 gIntro2NightTiles[] = INCBIN_U8("graphics/intro/intro2_night.4bpp.lz");
+static const u16 gIntro2BrendanPalette[] = INCBIN_U16("graphics/intro/intro2_brendan.gbapal");
+static const u8 gIntro2BrendanTiles[] = INCBIN_U8("graphics/intro/intro2_brendan.4bpp.lz");
+static const u16 gIntro2MayPalette[] = INCBIN_U16("graphics/intro/intro2_may.gbapal");
+static const u16 gUnknown_085F3490[0xF0] = {0};
+static const u8 gIntro2MayTiles[] = INCBIN_U8("graphics/intro/intro2_may.4bpp.lz");
+static const u8 gIntro2BicycleTiles[] = INCBIN_U8("graphics/intro/intro2_bicycle.4bpp.lz");
+static const u16 gIntro2LatiosPalette[] = INCBIN_U16("graphics/intro/intro2_latios.gbapal");
+static const u8 gIntro2LatiosTiles[] = INCBIN_U8("graphics/intro/intro2_latios.4bpp.lz");
+static const u16 gIntro2LatiasPalette[] = INCBIN_U16("graphics/intro/intro2_latias.gbapal");
+static const u8 gIntro2LatiasTiles[] = INCBIN_U8("graphics/intro/intro2_latias.4bpp.lz");
+
+static void sub_817B62C(struct Sprite *sprite);
+static void nullsub_65(struct Sprite *sprite);
+static void sub_817B7C4(struct Sprite *sprite);
+static void nullsub_66(struct Sprite *sprite);
+
+static const struct SpriteTemplate gUnknown_085F504C = {
+ 2000, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_817B62C
+};
+
+static const struct CompressedSpriteSheet gUnknown_085F5064[] = {
+ { gUnknown_085F16A8, 0x400, 2000 },
+ { NULL }
+};
+
+static const union AnimCmd gUnknown_085F5074[] = {
+ ANIMCMD_FRAME( 0, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_085F507C[] = {
+ ANIMCMD_FRAME(16, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_085F5084[] = {
+ ANIMCMD_FRAME(20, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_085F508C[] = {
+ ANIMCMD_FRAME(22, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_085F5094[] = {
+ gUnknown_085F5074,
+ gUnknown_085F507C,
+ gUnknown_085F5084,
+ gUnknown_085F508C
+};
+
+static const struct IntroCreditsSpriteMetadata gUnknown_085F50A4[] = {
+ { 0, ST_OAM_SQUARE, 2, 72, 32, 100, 0xc00 },
+ { 0, ST_OAM_SQUARE, 2, 158, 32, 100, 0xc00 },
+ { 1, ST_OAM_SQUARE, 1, 192, 40, 101, 0x800 },
+ { 1, ST_OAM_SQUARE, 1, 56, 40, 101, 0x800 },
+ { 2, ST_OAM_H_RECTANGLE, 0, 100, 44, 102, 0x400 },
+ { 2, ST_OAM_H_RECTANGLE, 0, 152, 44, 102, 0x400 },
+ { 3, ST_OAM_H_RECTANGLE, 0, 8, 46, 103, 0x100 },
+ { 3, ST_OAM_H_RECTANGLE, 0, 56, 46, 103, 0x100 },
+ { 3, ST_OAM_H_RECTANGLE, 0, 240, 46, 103, 0x100 },
+};
+
+static const struct CompressedSpriteSheet gUnknown_085F50EC[] = {
+ { gIntro2TreeTiles, 0x400, 2000 },
+ { NULL }
+};
+
+static const union AnimCmd gUnknown_085F50FC[] = {
+ ANIMCMD_FRAME( 0, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_085F5104[] = {
+ ANIMCMD_FRAME(16, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_085F510C[] = {
+ ANIMCMD_FRAME(24, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_085F5114[] = {
+ gUnknown_085F50FC,
+ gUnknown_085F5104,
+ gUnknown_085F510C
+};
+
+static const struct IntroCreditsSpriteMetadata gUnknown_085F5120[] = {
+ { 0, ST_OAM_SQUARE, 2, 16, 88, 100, 0x2000 },
+ { 0, ST_OAM_SQUARE, 2, 80, 88, 100, 0x2000 },
+ { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x2000 },
+ { 0, ST_OAM_SQUARE, 2, 208, 88, 100, 0x2000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 40, 88, 101, 0x1000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 104, 88, 101, 0x1000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 168, 88, 101, 0x1000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 232, 88, 101, 0x1000 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 56, 88, 102, 0x800 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 120, 88, 102, 0x800 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 184, 88, 102, 0x800 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 248, 88, 102, 0x800 },
+};
+
+static const struct CompressedSpriteSheet gUnknown_085F5180[] = {
+ { gIntro2NightTiles, 0x400, 2000 },
+ { NULL }
+};
+
+static const union AnimCmd gUnknown_085F5190[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_085F5198[] = {
+ gUnknown_085F5190
+};
+
+static const struct IntroCreditsSpriteMetadata gUnknown_085F519C[] = {
+ { 0, ST_OAM_SQUARE, 2, 24, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 64, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 104, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 184, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 224, 88, 100, 0x1000 },
+};
+
+static const struct OamData gOamData_85F51CC = {
+ .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1
+};
+
+static const union AnimCmd gUnknown_085F51D4[] = {
+ ANIMCMD_FRAME( 0, 8),
+ ANIMCMD_FRAME( 64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const gUnknown_085F51E8[] = {
+ gUnknown_085F51D4
+};
+
+static const struct SpriteTemplate gUnknown_085F51EC = {
+ 1002, 1002, &gOamData_85F51CC, gUnknown_085F51E8, NULL, gDummySpriteAffineAnimTable, nullsub_65
+};
+
+static const struct SpriteTemplate gUnknown_085F5204 = {
+ 1003, 1003, &gOamData_85F51CC, gUnknown_085F51E8, NULL, gDummySpriteAffineAnimTable, nullsub_65
+};
+
+static const struct OamData gUnknown_085F521C = {
+ .y = 160, .shape = ST_OAM_H_RECTANGLE, .size = 3, .priority = 1
+};
+
+static const union AnimCmd gUnknown_085F5224[] = {
+ ANIMCMD_FRAME( 0, 8),
+ ANIMCMD_FRAME( 32, 8),
+ ANIMCMD_FRAME( 64, 8),
+ ANIMCMD_FRAME( 96, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const gUnknown_085F5238[] = {
+ gUnknown_085F5224
+};
+
+static const struct SpriteTemplate gUnknown_085F523C = {
+ 1001, 1002, &gUnknown_085F521C, gUnknown_085F5238, NULL, gDummySpriteAffineAnimTable, sub_817B7C4
+};
+
+static const struct SpriteTemplate gUnknown_085F5254 = {
+ 1001, 1003, &gUnknown_085F521C, gUnknown_085F5238, NULL, gDummySpriteAffineAnimTable, sub_817B7C4
+};
+
+static const struct OamData gUnknown_085F526C = {
+ .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1
+};
+
+static const union AnimCmd gUnknown_085F5274[] = {
+ ANIMCMD_FRAME( 0, 16),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_085F527C[] = {
+ ANIMCMD_FRAME( 64, 16),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gUnknown_085F5284[] = {
+ gUnknown_085F5274,
+ gUnknown_085F527C
+};
+
+static const struct SpriteTemplate gUnknown_085F528C = {
+ 1004, 1004, &gUnknown_085F526C, gUnknown_085F5284, NULL, gDummySpriteAffineAnimTable, nullsub_66
+};
+
+static const struct SpriteTemplate gUnknown_085F52A4 = {
+ 1005, 1005, &gUnknown_085F526C, gUnknown_085F5284, NULL, gDummySpriteAffineAnimTable, nullsub_66
+};
+
+const struct CompressedSpriteSheet gIntro2BrendanSpriteSheet[] = {
+ { gIntro2BrendanNoTurnGfx, 0x2000, 1002 },
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gIntro2MaySpriteSheet[] = {
+ { gIntro2MayNoTurnGfx, 0x2000, 1003 },
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gIntro2BicycleSpriteSheet[] = {
+ { gIntro2BicycleTiles, 0x1000, 1001 },
+ { NULL }
+};
+
+static const struct CompressedSpriteSheet gUnknown_085F52EC[] = {
+ { gIntro2FlygonGfx, 0x1000, 1004 },
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gIntro2FlygonSpriteSheet[] = {
+ { gIntro2FlygonGfx, 0x1000, 1005 },
+ { NULL }
+};
+
+const struct SpritePalette gUnknown_085F530C[] = {
+ { gIntro2BrendanNoTurnPal, 1002 },
+ { gIntro2BrendanNoTurnPal, 1003 },
+ { gIntro2FlygonPal, 1004 },
+ { gIntro2FlygonPal, 1005 },
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gUnknown_085F5334[] = {
+ { gIntro2BrendanTiles, 0x3800, 1002 },
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gUnknown_085F5344[] = {
+ { gIntro2MayTiles, 0x3800, 1003 },
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gUnknown_085F5354[] = {
+ { gIntro2BicycleTiles, 0x1000, 1001 },
+ { NULL }
+};
+
+static const struct CompressedSpriteSheet gUnknown_085F5364[] = {
+ { gIntro2LatiosTiles, 0x1000, 1004 },
+ { NULL }
+};
+
+static const struct CompressedSpriteSheet gUnknown_085F5374[] = {
+ { gIntro2LatiasTiles, 0x1000, 1005 },
+ { NULL }
+};
+
+const struct SpritePalette gUnknown_085F5384[] = {
+ { gIntro2BrendanPalette, 1002 },
+ { gIntro2MayPalette, 1003 },
+ { gIntro2LatiosPalette, 1004 },
+ { gIntro2LatiasPalette, 1005 },
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gUnknown_085F53AC[] = {
+ { gIntro2BrendanTiles, 0x2000, 1002},
+ { NULL }
+};
+
+const struct CompressedSpriteSheet gUnknown_085F53BC[] = {
+ { gIntro2MayTiles, 0x2000, 1003},
+ { NULL }
+};
+
+EWRAM_DATA u16 gUnknown_0203BD24 = 0;
+EWRAM_DATA s16 gUnknown_0203BD26 = 0;
+EWRAM_DATA s16 gUnknown_0203BD28 = 0;
+
+static void sub_817B76C(void);
+static void sub_817B788(void);
+static void sub_817B7A4(void);
+static void sub_817B458(u8);
+
+void load_intro_part2_graphics(u8 a)
+{
+ LZ77UnCompVram(&gUnknown_085F0740, (void *)(VRAM + 0x4000));
+ LZ77UnCompVram(&gUnknown_085F0BC0, (void *)(VRAM + 0x7800));
+ LoadPalette(&gUnknown_085F06E0, 240, 32);
+ switch (a)
+ {
+ case 0:
+ default:
+ LZ77UnCompVram(&gUnknown_085F0DBC, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_085F1398, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_085F0CFC, 0, 96);
+ LoadCompressedObjectPic(gUnknown_085F5064);
+ LoadPalette(&gUnknown_085F1668, 256, 32);
+ sub_817B76C();
+ break;
+ case 1:
+ LZ77UnCompVram(&gUnknown_085F1824, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_085F1EAC, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_085F17E4, 0, 32);
+ LoadCompressedObjectPic(gUnknown_085F50EC);
+ LoadPalette(&gUnknown_085F21B0, 256, 32);
+ sub_817B788();
+ break;
+ }
+ gUnknown_0203BD28 = 0;
+ gReservedSpritePaletteCount = 8;
+}
+
+void sub_817B150(u8 a)
+{
+ switch (a)
+ {
+ default:
+ case 0:
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(6)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1)
+ | BGCNT_CHARBASE(1)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(15)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG1_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_BG3_ON
+ | DISPCNT_OBJ_ON);
+ break;
+ case 1:
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(6)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1)
+ | BGCNT_CHARBASE(1)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(15)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG1_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_BG3_ON
+ | DISPCNT_OBJ_ON);
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(6)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1)
+ | BGCNT_CHARBASE(1)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(15)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG1_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_BG3_ON
+ | DISPCNT_OBJ_ON);
+ break;
+ }
+}
+
+void sub_817B1C8(u8 a)
+{
+ LZ77UnCompVram(&gUnknown_085F0740, (void *)(VRAM + 0x4000));
+ LZ77UnCompVram(&gUnknown_085F0BC0, (void *)(VRAM + 0x7800));
+ switch (a)
+ {
+ case 0:
+ default:
+ LoadPalette(&gUnknown_085F06E0, 240, 32);
+ LZ77UnCompVram(&gUnknown_085F0DBC, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_085F1398, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_085F0CFC, 0, 96);
+ LoadCompressedObjectPic(gUnknown_085F5064);
+ LZ77UnCompVram(&gUnknown_085F16A8, (void *)(VRAM + 0x10000));
+ LoadPalette(&gUnknown_085F1668, 256, 32);
+ sub_817B76C();
+ break;
+ case 1:
+ LoadPalette(&gUnknown_085F0700, 240, 32);
+ LZ77UnCompVram(&gUnknown_085F0DBC, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_085F1398, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_085F0D5C, 0, 96);
+ LoadCompressedObjectPic(gUnknown_085F5064);
+ LZ77UnCompVram(&gUnknown_085F16A8, (void *)(VRAM + 0x10000));
+ LoadPalette(&gUnknown_085F1688, 256, 32);
+ sub_817B76C();
+ break;
+ case 2:
+ case 3:
+ LoadPalette(&gUnknown_085F0700, 240, 32);
+ LZ77UnCompVram(&gUnknown_085F1824, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_085F1EAC, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_085F1804, 0, 32);
+ LoadCompressedObjectPic(gUnknown_085F50EC);
+ LoadPalette(&gUnknown_085F1804, 256, 32);
+ sub_817B788();
+ break;
+ case 4:
+ LoadPalette(&gUnknown_085F0720, 240, 32);
+ LZ77UnCompVram(&gUnknown_085F235C, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_085F2568, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_085F231C, 0, 64);
+ LoadCompressedObjectPic(gUnknown_085F5180);
+ LoadPalette(&gUnknown_085F2548, 256, 32);
+ sub_817B7A4();
+ break;
+ }
+ gReservedSpritePaletteCount = 8;
+ gUnknown_0203BD28 = 0;
+}
+
+void sub_817B3A8(u8 a)
+{
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(6)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1)
+ | BGCNT_CHARBASE(1)
+ | BGCNT_16COLOR
+ | BGCNT_SCREENBASE(15)
+ | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG_ALL_ON
+ | DISPCNT_OBJ_ON);
+}
+
+u8 sub_817B3DC(u8 a, u16 b, u16 c, u16 d)
+{
+ u8 taskId = CreateTask(&sub_817B458, 0);
+
+ gTasks[taskId].data[0] = a;
+ gTasks[taskId].data[1] = b;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = c;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[6] = 0;
+ gTasks[taskId].data[7] = d;
+ gTasks[taskId].data[8] = 8;
+ gTasks[taskId].data[9] = 0;
+ sub_817B458(taskId);
+ return taskId;
+}
+
+static void sub_817B458(u8 taskId)
+{
+ s16 data1;
+ s16 data4;
+ s16 data7;
+ s32 r2;
+
+ data1 = gTasks[taskId].data[1];
+ if (data1 != 0)
+ {
+ r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3];
+ r2 -= (u16)data1 << 4;
+ gTasks[taskId].data[2] = r2 >> 16;
+ gTasks[taskId].data[3] = r2;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gTasks[taskId].data[2]);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_0203BD24 + gUnknown_0203BD26);
+ }
+
+ data4 = gTasks[taskId].data[4];
+ if (data4 != 0)
+ {
+ r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6];
+ r2 -= (u16)data4 << 4;
+ gTasks[taskId].data[5] = r2 >> 16;
+ gTasks[taskId].data[6] = r2;
+ SetGpuReg(REG_OFFSET_BG2HOFS, gTasks[taskId].data[5]);
+ if (gTasks[taskId].data[0] != 0)
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_0203BD24 + gUnknown_0203BD26);
+ else
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_0203BD24);
+ }
+
+ data7 = gTasks[taskId].data[7];
+ if (data7 != 0)
+ {
+ r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9];
+ r2 -= (u16)data7 << 4;
+ gTasks[taskId].data[8] = r2 >> 16;
+ gTasks[taskId].data[9] = r2;
+ SetGpuReg(REG_OFFSET_BG3HOFS, gTasks[taskId].data[8]);
+ SetGpuReg(REG_OFFSET_BG3VOFS, gUnknown_0203BD24);
+ }
+}
+
+void sub_817B540(u8 mode)
+{
+ u16 x;
+ u16 y;
+ switch (mode)
+ {
+ case 0:
+ default:
+ /* stuff */
+ if (gMain.vblankCounter1 & 3 || gPaletteFade.active)
+ break;
+ if (gMain.vblankCounter1 & 4)
+ {
+ x = gPlttBufferUnfaded[9];
+ y = gPlttBufferUnfaded[10];
+ }
+ else
+ {
+ x = gPlttBufferUnfaded[10];
+ y = gPlttBufferUnfaded[9];
+ }
+ LoadPalette(&x, 9, 2);
+ LoadPalette(&y, 10, 2);
+ break;
+ case 2:
+ if (gMain.vblankCounter1 & 3 || gPaletteFade.active)
+ break;
+ if (gMain.vblankCounter1 & 4)
+ {
+ x = 0x3D27;
+ y = 0x295;
+ }
+ else
+ {
+ x = 0x31C;
+ y = 0x3D27;
+ }
+ LoadPalette(&x, 12, 2);
+ LoadPalette(&y, 13, 2);
+ break;
+ case 1:
+ break;
+ }
+}
+
+static void sub_817B62C(struct Sprite *sprite)
+{
+ s32 var;
+ s16 var2 = gUnknown_0203BD28;
+
+ if (var2 != 2)
+ {
+ switch (var2)
+ {
+ default:
+ DestroySprite(sprite);
+ break;
+ case 0:
+ var = ((sprite->pos1.x << 16) | (u16)sprite->data[2]) + (u16)sprite->data[1];
+ sprite->pos1.x = var >> 16;
+ sprite->data[2] = var;
+ if (sprite->pos1.x > 0xFF)
+ sprite->pos1.x = -0x20;
+ if (sprite->data[0])
+ sprite->pos2.y = -(gUnknown_0203BD24 + gUnknown_0203BD26);
+ else
+ sprite->pos2.y = -gUnknown_0203BD24;
+ break;
+ }
+ }
+}
+
+static void sub_817B698(u8 a, const struct IntroCreditsSpriteMetadata *b, const union AnimCmd *const *c, u8 d)
+{
+ u8 i;
+
+ for(i = 0; i < d; i++)
+ {
+ u8 sprite = CreateSprite(&gUnknown_085F504C, b[i].x, b[i].y, b[i].subpriority);
+ CalcCenterToCornerVec(&gSprites[sprite], b[i].shape, b[i].size, 0);
+ gSprites[sprite].oam.priority = 3;
+ gSprites[sprite].oam.shape = b[i].shape;
+ gSprites[sprite].oam.size = b[i].size;
+ gSprites[sprite].oam.paletteNum = 0;
+ gSprites[sprite].anims = c;
+ StartSpriteAnim(&gSprites[sprite], b[i].animNum);
+ gSprites[sprite].data[0] = a;
+ gSprites[sprite].data[1] = b[i].xOff;
+ gSprites[sprite].data[2] = 0;
+ }
+}
+
+static void sub_817B76C(void)
+{
+ sub_817B698(0, gUnknown_085F50A4, gUnknown_085F5094, 9);
+}
+
+static void sub_817B788(void)
+{
+ sub_817B698(1, gUnknown_085F5120, gUnknown_085F5114, 12);
+}
+
+static void sub_817B7A4(void)
+{
+ sub_817B698(1, gUnknown_085F519C, gUnknown_085F5198, 6);
+}
+
+static void nullsub_65(struct Sprite *sprite)
+{
+}
+
+static void sub_817B7C4(struct Sprite* sprite)
+{
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + 8;
+ sprite->pos2.x = gSprites[sprite->data[0]].pos2.x;
+ sprite->pos2.y = gSprites[sprite->data[0]].pos2.y;
+}
+
+u8 intro_create_brendan_sprite(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gUnknown_085F51EC, a, b, 2);
+ u8 brendan = CreateSprite(&gUnknown_085F523C, a, b + 8, 3);
+ gSprites[brendan].data[0] = sprite;
+ return sprite;
+}
+
+u8 intro_create_may_sprite(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gUnknown_085F5204, a, b, 2);
+ u8 may = CreateSprite(&gUnknown_085F5254, a, b + 8, 3);
+ gSprites[may].data[0] = sprite;
+ return sprite;
+}
+
+static void nullsub_66(struct Sprite *sprite)
+{
+}
+
+static void sub_817B8E8(struct Sprite* sprite)
+{
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
+ sprite->pos2.x = gSprites[sprite->data[0]].pos2.x;
+ sprite->pos2.y = gSprites[sprite->data[0]].pos2.y;
+}
+
+static u8 sub_817B948(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gUnknown_085F528C, a - 32, b, 5);
+ u8 latios = CreateSprite(&gUnknown_085F528C, a + 32, b, 6);
+ gSprites[latios].data[0] = sprite;
+ StartSpriteAnim(&gSprites[latios], 1);
+ gSprites[latios].callback = &sub_817B8E8;
+ return sprite;
+}
+
+u8 intro_create_flygon_sprite(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gUnknown_085F52A4, a - 32, b, 5);
+ u8 flygon = CreateSprite(&gUnknown_085F52A4, a + 32, b, 6);
+ gSprites[flygon].data[0] = sprite;
+ StartSpriteAnim(&gSprites[flygon], 1);
+ gSprites[flygon].callback = &sub_817B8E8;
+ return sprite;
+}
diff --git a/src/item.c b/src/item.c
index 32347623e..c94f29910 100644
--- a/src/item.c
+++ b/src/item.c
@@ -1,117 +1,114 @@
#include "global.h"
#include "item.h"
-#include "items.h"
+#include "berry.h"
+#include "constants/items.h"
#include "string_util.h"
#include "text.h"
#include "event_data.h"
+#include "malloc.h"
+#include "secret_base.h"
+#include "item_menu.h"
+#include "strings.h"
+#include "load_save.h"
-extern void ApplyNewEncyprtionKeyToHword(u16* hword, u32 newKey);
extern bool8 InBattlePyramid(void);
+extern u16 gUnknown_0203CF30[];
+extern const struct Item gItems[];
-extern const u8 gText_PokeBalls[];
-extern const u8 gText_Berries[];
-extern const u8 gText_Berry[];
-extern const u8 gUnknown_085897E4[][28]; // not sure what this one is
+// this file's functions
+static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count);
+static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count);
-bool8 CheckPyramidBagHasItem(u16 itemId, u16 count);
-bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count);
+// EWRAM variables
+EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0};
-enum
-{
- ITEMS_POCKET,
- BALLS_POCKET,
- TMHM_POCKET,
- BERRIES_POCKET,
- KEYITEMS_POCKET
-};
-
-u16 GetBagItemQuantity(u16* quantity)
+// code
+static u16 GetBagItemQuantity(u16 *quantity)
{
return gSaveBlock2Ptr->encryptionKey ^ *quantity;
}
-void SetBagItemQuantity(u16* quantity, u16 newValue)
+static void SetBagItemQuantity(u16 *quantity, u16 newValue)
{
*quantity = newValue ^ gSaveBlock2Ptr->encryptionKey;
}
-u16 GetBagItemId(u16* slot)
+static u16 GetPCItemQuantity(u16 *quantity)
{
- return *slot;
+ return *quantity;
}
-void SetBagItemId(u16* slot, u16 newItemId)
+static void SetPCItemQuantity(u16 *quantity, u16 newValue)
{
- *slot = newItemId;
+ *quantity = newValue;
}
-void ApplyNewEncyprtionKeyToBagItems(u32 newKey)
+void ApplyNewEncryptionKeyToBagItems(u32 newKey)
{
u32 pocket, item;
- for (pocket = 0; pocket < 5; pocket++)
+ for (pocket = 0; pocket < POCKETS_COUNT; pocket++)
{
for (item = 0; item < gBagPockets[pocket].capacity; item++)
- ApplyNewEncyprtionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey);
+ ApplyNewEncryptionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey);
}
}
-void ApplyNewEncyprtionKeyToBagItems_(u32 newKey) // really GF?
+void ApplyNewEncryptionKeyToBagItems_(u32 newKey) // really GF?
{
- ApplyNewEncyprtionKeyToBagItems(newKey);
+ ApplyNewEncryptionKeyToBagItems(newKey);
}
-// TODO: move those max values to defines
-
void SetBagItemsPointers(void)
{
gBagPockets[ITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Items;
- gBagPockets[ITEMS_POCKET].capacity = 30;
+ gBagPockets[ITEMS_POCKET].capacity = BAG_ITEMS_COUNT;
gBagPockets[KEYITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems;
- gBagPockets[KEYITEMS_POCKET].capacity = 30;
+ gBagPockets[KEYITEMS_POCKET].capacity = BAG_KEYITEMS_COUNT;
gBagPockets[BALLS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls;
- gBagPockets[BALLS_POCKET].capacity = 16;
+ gBagPockets[BALLS_POCKET].capacity = BAG_POKEBALLS_COUNT;
gBagPockets[TMHM_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM;
- gBagPockets[TMHM_POCKET].capacity = 64;
+ gBagPockets[TMHM_POCKET].capacity = BAG_TMHM_COUNT;
gBagPockets[BERRIES_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Berries;
- gBagPockets[BERRIES_POCKET].capacity = 46;
+ gBagPockets[BERRIES_POCKET].capacity = BAG_BERRIES_COUNT;
}
-void CopyItemName(u16 itemId, u8 *string)
+void CopyItemName(u16 itemId, u8 *dst)
{
- StringCopy(string, ItemId_GetItem(itemId)->name);
+ StringCopy(dst, ItemId_GetName(itemId));
}
-void CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity)
+void CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity)
{
if (itemId == ITEM_POKE_BALL)
{
if (quantity < 2)
- StringCopy(string, ItemId_GetItem(ITEM_POKE_BALL)->name);
+ StringCopy(dst, ItemId_GetName(ITEM_POKE_BALL));
else
- StringCopy(string, gText_PokeBalls);
+ StringCopy(dst, gText_PokeBalls);
}
else
{
- if (itemId >= 0x85 && itemId <= 0xAF)
- GetBerryCountString(string, gUnknown_085897E4[itemId], quantity);
+ if (itemId >= ITEM_CHERI_BERRY && itemId <= ITEM_ENIGMA_BERRY)
+ GetBerryCountString(dst, gBerries[itemId - ITEM_CHERI_BERRY].name, quantity);
else
- StringCopy(string, ItemId_GetItem(itemId)->name);
+ StringCopy(dst, ItemId_GetName(itemId));
}
}
-void GetBerryCountString(u8* dst, const u8* berryName, u32 quantity)
+void GetBerryCountString(u8 *dst, const u8 *berryName, u32 quantity)
{
- const u8* berryString;
- u8* txtPtr;
+ const u8 *berryString;
+ u8 *txtPtr;
if (quantity < 2)
berryString = gText_Berry;
else
berryString = gText_Berries;
+
txtPtr = StringCopy(dst, berryName);
*txtPtr = CHAR_SPACE;
StringCopy(txtPtr + 1, berryString);
@@ -136,21 +133,21 @@ bool8 CheckBagHasItem(u16 itemId, u16 count)
if (ItemId_GetPocket(itemId) == 0)
return FALSE;
- if (InBattlePyramid() || FlagGet(0x4004) == TRUE)
+ if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE)
return CheckPyramidBagHasItem(itemId, count);
pocket = ItemId_GetPocket(itemId) - 1;
- //Check for item slots that contain the item
+ // Check for item slots that contain the item
for (i = 0; i < gBagPockets[pocket].capacity; i++)
{
if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
{
u16 quantity;
- //Does this item slot contain enough of the item?
+ // Does this item slot contain enough of the item?
quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
if (quantity >= count)
return TRUE;
count -= quantity;
- //Does this item slot and all previous slots contain enough of the item?
+ // Does this item slot and all previous slots contain enough of the item?
if (count == 0)
return TRUE;
}
@@ -161,69 +158,945 @@ bool8 CheckBagHasItem(u16 itemId, u16 count)
bool8 HasAtLeastOneBerry(void)
{
u16 i;
- for (i = 0x85; i < 0xB3; i++)
+
+ for (i = FIRST_BERRY_INDEX; i < ITEM_BRIGHT_POWDER; i++)
{
if (CheckBagHasItem(i, 1) == TRUE)
{
- gSpecialVar_Result = 1;
+ gSpecialVar_Result = TRUE;
return TRUE;
}
}
- gSpecialVar_Result = 0;
+ gSpecialVar_Result = FALSE;
return FALSE;
}
-/* Refuses to match.
+#ifdef NONMATCHING
+// Refuses to match.
bool8 CheckBagHasSpace(u16 itemId, u16 count)
{
u8 i;
- u8 pocket;
- u16 slotCapacity;
- u16 quantity;
- if (ItemId_GetPocket(itemId) == 0)
+ if (ItemId_GetPocket(itemId) == POCKET_NONE)
return FALSE;
- if (InBattlePyramid() || FlagGet(0x4004) == TRUE)
+
+ if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE)
+ {
return CheckPyramidBagHasSpace(itemId, count);
- pocket = ItemId_GetPocket(itemId) - 1;
- if (pocket != BERRIES_POCKET)
- slotCapacity = 99;
+ }
else
- slotCapacity = 999;
+ {
+ u8 pocket;
+ u16 slotCapacity;
+ u16 ownedCount;
- //Check space in any existing item slots that already contain this item
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
+ pocket = ItemId_GetPocket(itemId) - 1;
+ if (pocket != BERRIES_POCKET)
+ 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++)
+ {
+ if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
+ {
+ ownedCount = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
+ if (ownedCount + count <= slotCapacity)
+ return TRUE;
+ if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
+ return FALSE;
+ count -= slotCapacity - ownedCount;
+ if (count == 0)
+ return TRUE;
+ }
+ }
+
+ // Check space in empty item slots
+ if (count > 0)
+ {
+ for (i = 0; i < gBagPockets[pocket].capacity; i++)
+ {
+ if (gBagPockets[pocket].itemSlots[i].itemId == 0)
+ {
+ if (count <= slotCapacity)
+ return TRUE;
+ if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
+ return FALSE;
+ count -= slotCapacity;
+ }
+ }
+ if (count > 0)
+ return FALSE; // No more item slots. The bag is full
+ }
+
+ return TRUE;
+ }
+}
+#else
+NAKED
+bool8 CheckBagHasSpace(u16 itemId, u16 count)
+{
+ asm_unified("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, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
+ lsls r1, 16\n\
+ lsrs r5, r1, 16\n\
+ bl ItemId_GetPocket\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080D6906\n\
+ bl InBattlePyramid\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080D6838\n\
+ ldr r0, =0x00004004\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _080D684C\n\
+_080D6838:\n\
+ mov r0, r8\n\
+ adds r1, r5, 0\n\
+ bl CheckPyramidBagHasSpace\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ b _080D6916\n\
+ .pool\n\
+_080D684C:\n\
+ mov r0, r8\n\
+ bl ItemId_GetPocket\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ ldr r7, =0x000003e7\n\
+ cmp r2, 0x3\n\
+ beq _080D6860\n\
+ movs r7, 0x63\n\
+_080D6860:\n\
+ movs r6, 0\n\
+ ldr r1, =gBagPockets\n\
+ lsls r4, r2, 3\n\
+ adds r0, r4, r1\n\
+ mov r9, r4\n\
+ ldrb r0, [r0, 0x4]\n\
+ cmp r6, r0\n\
+ bcs _080D68BC\n\
+ subs r0, r2, 0x2\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+_080D6878:\n\
+ adds r0, r4, r1\n\
+ ldr r1, [r0]\n\
+ lsls r0, r6, 2\n\
+ adds r1, r0, r1\n\
+ ldrh r0, [r1]\n\
+ cmp r0, r8\n\
+ bne _080D68AC\n\
+ adds r0, r1, 0x2\n\
+ str r2, [sp]\n\
+ bl GetBagItemQuantity\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ adds r0, r1, r5\n\
+ ldr r2, [sp]\n\
+ cmp r0, r7\n\
+ ble _080D6914\n\
+ mov r0, r10\n\
+ cmp r0, 0x1\n\
+ bls _080D6906\n\
+ subs r0, r7, r1\n\
+ subs r0, r5, r0\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ cmp r5, 0\n\
+ beq _080D6914\n\
+_080D68AC:\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ ldr r1, =gBagPockets\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0, 0x4]\n\
+ cmp r6, r0\n\
+ bcc _080D6878\n\
+_080D68BC:\n\
+ cmp r5, 0\n\
+ beq _080D6914\n\
+ movs r6, 0\n\
+ ldr r3, =gBagPockets\n\
+ mov r1, r9\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0, 0x4]\n\
+ cmp r6, r0\n\
+ bcs _080D6902\n\
+ adds r4, r3, 0\n\
+ subs r0, r2, 0x2\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+_080D68D6:\n\
+ adds r0, r1, r4\n\
+ ldr r1, [r0]\n\
+ lsls r0, r6, 2\n\
+ adds r0, r1\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080D68F2\n\
+ cmp r5, r7\n\
+ bls _080D6914\n\
+ cmp r2, 0x1\n\
+ bls _080D6906\n\
+ subs r0, r5, r7\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+_080D68F2:\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ mov r1, r9\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0, 0x4]\n\
+ cmp r6, r0\n\
+ bcc _080D68D6\n\
+_080D6902:\n\
+ cmp r5, 0\n\
+ beq _080D6914\n\
+_080D6906:\n\
+ movs r0, 0\n\
+ b _080D6916\n\
+ .pool\n\
+_080D6914:\n\
+ movs r0, 0x1\n\
+_080D6916:\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");
+}
+#endif // NONMATCHING
+
+bool8 AddBagItem(u16 itemId, u16 count)
+{
+ u8 i;
+
+ if (ItemId_GetPocket(itemId) == POCKET_NONE)
+ return FALSE;
+
+ // check Battle Pyramid Bag
+ if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE)
{
- if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
+ return AddPyramidBagItem(itemId, count);
+ }
+ else
+ {
+ struct BagPocket *itemPocket;
+ struct ItemSlot *newItems;
+ u16 slotCapacity;
+ u16 ownedCount;
+ u8 pocket = ItemId_GetPocket(itemId) - 1;
+
+ itemPocket = &gBagPockets[pocket];
+ newItems = AllocZeroed(itemPocket->capacity * sizeof(struct ItemSlot));
+ memcpy(newItems, itemPocket->itemSlots, itemPocket->capacity * sizeof(struct ItemSlot));
+
+ if (pocket != BERRIES_POCKET)
+ slotCapacity = 99;
+ else
+ slotCapacity = 999;
+
+ for (i = 0; i < itemPocket->capacity; i++)
{
- quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
- if (quantity + count <= slotCapacity)
- return TRUE;
- if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
+ if (newItems[i].itemId == itemId)
+ {
+ ownedCount = GetBagItemQuantity(&newItems[i].quantity);
+ // check if won't exceed max slot capacity
+ if (ownedCount + count <= slotCapacity)
+ {
+ // successfully added to already existing item's count
+ SetBagItemQuantity(&newItems[i].quantity, ownedCount + count);
+
+ // goto SUCCESS_ADD_ITEM;
+ // is equivalent but won't match
+
+ memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot));
+ Free(newItems);
+ return TRUE;
+ }
+ else
+ {
+ // try creating another instance of the item if possible
+ if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
+ {
+ Free(newItems);
+ return FALSE;
+ }
+ else
+ {
+ count -= slotCapacity - ownedCount;
+ SetBagItemQuantity(&newItems[i].quantity, slotCapacity);
+ // don't create another instance of the item if it's at max slot capacity and count is equal to 0
+ if (count == 0)
+ {
+ goto SUCCESS_ADD_ITEM;
+ }
+ }
+ }
+ }
+ }
+
+ // we're done if quantity is equal to 0
+ if (count > 0)
+ {
+ // either no existing item was found or we have to create another instance, because the capacity was exceeded
+ for (i = 0; i < itemPocket->capacity; i++)
+ {
+ if (newItems[i].itemId == ITEM_NONE)
+ {
+ newItems[i].itemId = itemId;
+ if (count > slotCapacity)
+ {
+ // try creating a new slot with max capacity if duplicates are possible
+ if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
+ {
+ Free(newItems);
+ return FALSE;
+ }
+ count -= slotCapacity;
+ SetBagItemQuantity(&newItems[i].quantity, slotCapacity);
+ }
+ else
+ {
+ // created a new slot and added quantity
+ SetBagItemQuantity(&newItems[i].quantity, count);
+ goto SUCCESS_ADD_ITEM;
+ }
+ }
+ }
+
+ if (count > 0)
+ {
+ Free(newItems);
return FALSE;
- count -= slotCapacity - quantity;
+ }
+ }
+
+ SUCCESS_ADD_ITEM:
+ memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot));
+ Free(newItems);
+ return TRUE;
+ }
+}
+
+bool8 RemoveBagItem(u16 itemId, u16 count)
+{
+ u8 i;
+ u16 totalQuantity = 0;
+
+ if (ItemId_GetPocket(itemId) == POCKET_NONE || itemId == ITEM_NONE)
+ return FALSE;
+
+ // check Battle Pyramid Bag
+ if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE)
+ {
+ return RemovePyramidBagItem(itemId, count);
+ }
+ else
+ {
+ u8 pocket;
+ u8 var;
+ u16 ownedCount;
+ struct BagPocket *itemPocket;
+
+ pocket = ItemId_GetPocket(itemId) - 1;
+ itemPocket = &gBagPockets[pocket];
+
+ for (i = 0; i < itemPocket->capacity; i++)
+ {
+ if (itemPocket->itemSlots[i].itemId == itemId)
+ totalQuantity += GetBagItemQuantity(&itemPocket->itemSlots[i].quantity);
+ }
+
+ if (totalQuantity < count)
+ return FALSE; // We don't have enough of the item
+
+ if (CurrentMapIsSecretBase() == TRUE)
+ {
+ VarSet(VAR_0x40EE, VarGet(VAR_0x40EE) | 0x200);
+ VarSet(VAR_0x40ED, itemId);
+ }
+
+ var = sub_81ABB2C(pocket);
+ if (itemPocket->capacity > var
+ && itemPocket->itemSlots[var].itemId == itemId)
+ {
+ ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[var].quantity);
+ if (ownedCount >= count)
+ {
+ SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, ownedCount - count);
+ count = 0;
+ }
+ else
+ {
+ count -= ownedCount;
+ SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, 0);
+ }
+
+ if (GetBagItemQuantity(&itemPocket->itemSlots[var].quantity) == 0)
+ itemPocket->itemSlots[var].itemId = ITEM_NONE;
+
if (count == 0)
return TRUE;
}
+
+ for (i = 0; i < itemPocket->capacity; i++)
+ {
+ if (itemPocket->itemSlots[i].itemId == itemId)
+ {
+ ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[i].quantity);
+ if (ownedCount >= count)
+ {
+ SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, ownedCount - count);
+ count = 0;
+ }
+ else
+ {
+ count -= ownedCount;
+ SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, 0);
+ }
+
+ if (GetBagItemQuantity(&itemPocket->itemSlots[i].quantity) == 0)
+ itemPocket->itemSlots[i].itemId = ITEM_NONE;
+
+ if (count == 0)
+ return TRUE;
+ }
+ }
+ return TRUE;
}
+}
- //Check space in empty item slots
- if (count > 0)
+u8 GetPocketByItemId(u16 itemId)
+{
+ return ItemId_GetPocket(itemId);
+}
+
+void ClearItemSlots(struct ItemSlot *itemSlots, u8 itemCount)
+{
+ u16 i;
+
+ for (i = 0; i < itemCount; i++)
{
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
+ itemSlots[i].itemId = ITEM_NONE;
+ SetBagItemQuantity(&itemSlots[i].quantity, 0);
+ }
+}
+
+static s32 FindFreePCItemSlot(void)
+{
+ s8 i;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE)
+ return i;
+ }
+ return -1;
+}
+
+u8 CountUsedPCItemSlots(void)
+{
+ u8 usedSlots = 0;
+ u8 i;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE)
+ usedSlots++;
+ }
+ return usedSlots;
+}
+
+bool8 CheckPCHasItem(u16 itemId, u16 count)
+{
+ u8 i;
+
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == itemId && GetPCItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) >= count)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 AddPCItem(u16 itemId, u16 count)
+{
+ u8 i;
+ s8 freeSlot;
+ u16 ownedCount;
+ struct ItemSlot *newItems;
+
+ // Copy PC items
+ newItems = AllocZeroed(sizeof(gSaveBlock1Ptr->pcItems));
+ memcpy(newItems, gSaveBlock1Ptr->pcItems, sizeof(gSaveBlock1Ptr->pcItems));
+
+ // Use any item slots that already contain this item
+ for (i = 0; i < PC_ITEMS_COUNT; i++)
+ {
+ if (newItems[i].itemId == itemId)
{
- if (gBagPockets[pocket].itemSlots[i].itemId == 0)
+ ownedCount = GetPCItemQuantity(&newItems[i].quantity);
+ if (ownedCount + count <= 999)
{
- if (count <= slotCapacity)
- return TRUE;
- if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
- return FALSE;
- count -= slotCapacity;
+ SetPCItemQuantity(&newItems[i].quantity, ownedCount + count);
+ memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems));
+ Free(newItems);
+ return TRUE;
+ }
+ count += ownedCount - 999;
+ SetPCItemQuantity(&newItems[i].quantity, 999);
+ if (count == 0)
+ {
+ memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems));
+ Free(newItems);
+ return TRUE;
}
}
- if (count > 0)
- return FALSE; //No more item slots. The bag is full
}
+ // Put any remaining items into a new item slot.
+ if (count > 0)
+ {
+ freeSlot = FindFreePCItemSlot();
+ if (freeSlot == -1)
+ {
+ Free(newItems);
+ return FALSE;
+ }
+ else
+ {
+ newItems[freeSlot].itemId = itemId;
+ SetPCItemQuantity(&newItems[freeSlot].quantity, count);
+ }
+ }
+
+ // Copy items back to the PC
+ memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems));
+ Free(newItems);
return TRUE;
-}*/
+}
+
+void RemovePCItem(u8 index, u16 count)
+{
+ // UB: should use GetPCItemQuantity and SetPCItemQuantity functions
+ gSaveBlock1Ptr->pcItems[index].quantity -= count;
+ if (gSaveBlock1Ptr->pcItems[index].quantity == 0)
+ {
+ gSaveBlock1Ptr->pcItems[index].itemId = ITEM_NONE;
+ CompactPCItems();
+ }
+}
+
+void CompactPCItems(void)
+{
+ u16 i;
+ u16 j;
+
+ for (i = 0; i < PC_ITEMS_COUNT - 1; i++)
+ {
+ for (j = i + 1; j < PC_ITEMS_COUNT; j++)
+ {
+ if (gSaveBlock1Ptr->pcItems[i].itemId == 0)
+ {
+ struct ItemSlot temp = gSaveBlock1Ptr->pcItems[i];
+ gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j];
+ gSaveBlock1Ptr->pcItems[j] = temp;
+ }
+ }
+ }
+}
+
+void SwapRegisteredBike(void)
+{
+ switch (gSaveBlock1Ptr->registeredItem)
+ {
+ case ITEM_MACH_BIKE:
+ gSaveBlock1Ptr->registeredItem = ITEM_ACRO_BIKE;
+ break;
+ case ITEM_ACRO_BIKE:
+ gSaveBlock1Ptr->registeredItem = ITEM_MACH_BIKE;
+ break;
+ }
+}
+
+u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos)
+{
+ return gBagPockets[pocketId - 1].itemSlots[pocketPos].itemId;
+}
+
+u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 pocketPos)
+{
+ return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[pocketPos].quantity);
+}
+
+static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b)
+{
+ struct ItemSlot temp = *a;
+ *a = *b;
+ *b = temp;
+}
+
+void CompactItemsInBagPocket(struct BagPocket *bagPocket)
+{
+ u16 i, j;
+
+ for (i = 0; i < bagPocket->capacity - 1; i++)
+ {
+ for (j = i + 1; j < bagPocket->capacity; j++)
+ {
+ if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) == 0)
+ SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]);
+ }
+ }
+}
+
+void SortBerriesOrTMHMs(struct BagPocket *bagPocket)
+{
+ u16 i, j;
+
+ for (i = 0; i < bagPocket->capacity - 1; i++)
+ {
+ for (j = i + 1; j < bagPocket->capacity; j++)
+ {
+ if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) != 0)
+ {
+ if (GetBagItemQuantity(&bagPocket->itemSlots[j].quantity) == 0)
+ continue;
+ if (bagPocket->itemSlots[i].itemId <= bagPocket->itemSlots[j].itemId)
+ continue;
+ }
+ SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]);
+ }
+ }
+}
+
+void MoveItemSlotInList(struct ItemSlot* itemSlots_, u32 from, u32 to_)
+{
+ // dumb assignments needed to match
+ struct ItemSlot *itemSlots = itemSlots_;
+ u32 to = to_;
+
+ if (from != to)
+ {
+ s16 i, count;
+ struct ItemSlot firstSlot = itemSlots[from];
+
+ if (to > from)
+ {
+ to--;
+ for (i = from, count = to; i < count; i++)
+ itemSlots[i] = itemSlots[i + 1];
+ }
+ else
+ {
+ for (i = from, count = to; i > count; i--)
+ itemSlots[i] = itemSlots[i - 1];
+ }
+ itemSlots[to] = firstSlot;
+ }
+}
+
+void ClearBag(void)
+{
+ u16 i;
+
+ for (i = 0; i < POCKETS_COUNT; i++)
+ {
+ ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity);
+ }
+}
+
+u16 CountTotalItemQuantityInBag(u16 itemId)
+{
+ u16 i;
+ u16 ownedCount = 0;
+ struct BagPocket *bagPocket = &gBagPockets[ItemId_GetPocket(itemId) - 1];
+
+ for (i = 0; i < bagPocket->capacity; i++)
+ {
+ if (bagPocket->itemSlots[i].itemId == itemId)
+ ownedCount += GetBagItemQuantity(&bagPocket->itemSlots[i].quantity);
+ }
+
+ return ownedCount;
+}
+
+static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count)
+{
+ u8 i;
+ u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl];
+ u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl];
+
+ for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
+ {
+ if (items[i] == itemId)
+ {
+ if (quantities[i] >= count)
+ return TRUE;
+
+ count -= quantities[i];
+ if (count == 0)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count)
+{
+ u8 i;
+ u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl];
+ u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl];
+
+ for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
+ {
+ if (items[i] == itemId || items[i] == ITEM_NONE)
+ {
+ if (quantities[i] + count <= 99)
+ return TRUE;
+
+ count = (quantities[i] + count) - 99;
+ if (count == 0)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 AddPyramidBagItem(u16 itemId, u16 count)
+{
+ u16 i;
+
+ u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl];
+ u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl];
+
+ u16 *newItems = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u16));
+ u8 *newQuantities = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u8));
+
+ memcpy(newItems, items, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16));
+ memcpy(newQuantities, quantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8));
+
+ for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
+ {
+ if (newItems[i] == itemId && newQuantities[i] < 99)
+ {
+ newQuantities[i] += count;
+ if (newQuantities[i] > 99)
+ {
+ count = newQuantities[i] - 99;
+ newQuantities[i] = 99;
+ }
+ else
+ {
+ count = 0;
+ }
+
+ if (count == 0)
+ break;
+ }
+ }
+
+ if (count > 0)
+ {
+ for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
+ {
+ if (newItems[i] == ITEM_NONE)
+ {
+ newItems[i] = itemId;
+ newQuantities[i] = count;
+ if (newQuantities[i] > 99)
+ {
+ count = newQuantities[i] - 99;
+ newQuantities[i] = 99;
+ }
+ else
+ {
+ count = 0;
+ }
+
+ if (count == 0)
+ break;
+ }
+ }
+ }
+
+ if (count == 0)
+ {
+ memcpy(items, newItems, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16));
+ memcpy(quantities, newQuantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8));
+ Free(newItems);
+ Free(newQuantities);
+ return TRUE;
+ }
+ else
+ {
+ Free(newItems);
+ Free(newQuantities);
+ return FALSE;
+ }
+}
+
+bool8 RemovePyramidBagItem(u16 itemId, u16 count)
+{
+ u16 i;
+
+ u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl];
+ u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl];
+
+ i = gUnknown_0203CF30[3] + gUnknown_0203CF30[4];
+ if (items[i] == itemId && quantities[i] >= count)
+ {
+ quantities[i] -= count;
+ if (quantities[i] == 0)
+ items[i] = ITEM_NONE;
+ return TRUE;
+ }
+ else
+ {
+ u16 *newItems = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u16));
+ u8 *newQuantities = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u8));
+
+ memcpy(newItems, items, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16));
+ memcpy(newQuantities, quantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8));
+
+ for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
+ {
+ if (newItems[i] == itemId)
+ {
+ if (newQuantities[i] >= count)
+ {
+ newQuantities[i] -= count;
+ count = 0;
+ if (newQuantities[i] == 0)
+ newItems[i] = ITEM_NONE;
+ }
+ else
+ {
+ count -= newQuantities[i];
+ newQuantities[i] = 0;
+ newItems[i] = ITEM_NONE;
+ }
+
+ if (count == 0)
+ break;
+ }
+ }
+
+ if (count == 0)
+ {
+ memcpy(items, newItems, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16));
+ memcpy(quantities, newQuantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8));
+ Free(newItems);
+ Free(newQuantities);
+ return TRUE;
+ }
+ else
+ {
+ Free(newItems);
+ Free(newQuantities);
+ return FALSE;
+ }
+ }
+}
+
+static u16 SanitizeItemId(u16 itemId)
+{
+ if (itemId >= ITEMS_COUNT)
+ return ITEM_NONE;
+ else
+ return itemId;
+}
+
+const u8 *ItemId_GetName(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].name;
+}
+
+u16 ItemId_GetId(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].itemId;
+}
+
+u16 ItemId_GetPrice(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].price;
+}
+
+u8 ItemId_GetHoldEffect(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].holdEffect;
+}
+
+u8 ItemId_GetHoldEffectParam(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].holdEffectParam;
+}
+
+const u8 *ItemId_GetDescription(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].description;
+}
+
+u8 ItemId_GetImportance(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].importance;
+}
+
+// unused
+u8 ItemId_GetUnknownValue(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].unk19;
+}
+
+u8 ItemId_GetPocket(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].pocket;
+}
+
+u8 ItemId_GetType(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].type;
+}
+
+ItemUseFunc ItemId_GetFieldFunc(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].fieldUseFunc;
+}
+
+u8 ItemId_GetBattleUsage(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].battleUsage;
+}
+
+ItemUseFunc ItemId_GetBattleFunc(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].battleUseFunc;
+}
+
+u8 ItemId_GetSecondaryId(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].secondaryId;
+}
diff --git a/src/item_icon.c b/src/item_icon.c
new file mode 100644
index 000000000..68ec1daf0
--- /dev/null
+++ b/src/item_icon.c
@@ -0,0 +1,169 @@
+#include "global.h"
+#include "item_icon.h"
+#include "malloc.h"
+#include "sprite.h"
+#include "decompress.h"
+#include "constants/items.h"
+#include "data/item_icon_table.h"
+
+// EWRAM vars
+EWRAM_DATA void *gItemIconDecompressionBuffer = NULL;
+EWRAM_DATA void *gItemIcon4x4Buffer = NULL;
+
+// const rom data
+
+static const struct OamData sOamData_ItemIcon =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 2,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_ItemIcon[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_ItemIcon[] =
+{
+ sSpriteAnim_ItemIcon
+};
+
+const struct SpriteTemplate gItemIconSpriteTemplate =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_ItemIcon,
+ .anims = sSpriteAnimTable_ItemIcon,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+// code
+bool8 AllocItemIconTemporaryBuffers(void)
+{
+ gItemIconDecompressionBuffer = gItemIconDecompressionBuffer; // needed to match
+ gItemIconDecompressionBuffer = Alloc(0x120);
+ if (gItemIconDecompressionBuffer == NULL)
+ return FALSE;
+
+ gItemIcon4x4Buffer = gItemIcon4x4Buffer; // needed to match
+ gItemIcon4x4Buffer = AllocZeroed(0x200);
+ if (gItemIcon4x4Buffer == NULL)
+ {
+ Free(gItemIconDecompressionBuffer);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void FreeItemIconTemporaryBuffers(void)
+{
+ Free(gItemIconDecompressionBuffer);
+ Free(gItemIcon4x4Buffer);
+}
+
+void CopyItemIconPicTo4x4Buffer(const void *src, void *dest)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ CpuCopy16(src + i * 96, dest + i * 128, 0x60);
+}
+
+u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId)
+{
+ if (!AllocItemIconTemporaryBuffers())
+ {
+ return MAX_SPRITES;
+ }
+ else
+ {
+ u8 spriteId;
+ struct SpriteSheet spriteSheet;
+ struct CompressedSpritePalette spritePalette;
+ struct SpriteTemplate *spriteTemplate;
+
+ LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
+ CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
+ spriteSheet.data = gItemIcon4x4Buffer;
+ spriteSheet.size = 0x200;
+ spriteSheet.tag = tilesTag;
+ LoadSpriteSheet(&spriteSheet);
+
+ spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
+ spritePalette.tag = paletteTag;
+ LoadCompressedObjectPalette(&spritePalette);
+
+ spriteTemplate = Alloc(sizeof(*spriteTemplate));
+ CpuCopy16(&gItemIconSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
+ spriteTemplate->tileTag = tilesTag;
+ spriteTemplate->paletteTag = paletteTag;
+ spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
+
+ FreeItemIconTemporaryBuffers();
+ Free(spriteTemplate);
+
+ return spriteId;
+ }
+}
+
+u8 AddCustomItemIconSprite(struct SpriteTemplate *customSpriteTemplate, u16 tilesTag, u16 paletteTag, u16 itemId)
+{
+ if (!AllocItemIconTemporaryBuffers())
+ {
+ return MAX_SPRITES;
+ }
+ else
+ {
+ u8 spriteId;
+ struct SpriteSheet spriteSheet;
+ struct CompressedSpritePalette spritePalette;
+ struct SpriteTemplate *spriteTemplate;
+
+ LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
+ CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
+ spriteSheet.data = gItemIcon4x4Buffer;
+ spriteSheet.size = 0x200;
+ spriteSheet.tag = tilesTag;
+ LoadSpriteSheet(&spriteSheet);
+
+ spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
+ spritePalette.tag = paletteTag;
+ LoadCompressedObjectPalette(&spritePalette);
+
+ spriteTemplate = Alloc(sizeof(*spriteTemplate));
+ CpuCopy16(customSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
+ spriteTemplate->tileTag = tilesTag;
+ spriteTemplate->paletteTag = paletteTag;
+ spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
+
+ FreeItemIconTemporaryBuffers();
+ Free(spriteTemplate);
+
+ return spriteId;
+ }
+}
+
+const void *GetItemIconPicOrPalette(u16 itemId, u8 which)
+{
+ if (itemId == 0xFFFF)
+ itemId = ITEM_FIELD_ARROW;
+ else if (itemId >= ITEMS_COUNT)
+ itemId = 0;
+
+ return gItemIconTable[itemId][which];
+}
diff --git a/src/item_menu.c b/src/item_menu.c
new file mode 100755
index 000000000..d134e6375
--- /dev/null
+++ b/src/item_menu.c
@@ -0,0 +1,2244 @@
+#include "global.h"
+#include "item_menu.h"
+#include "battle.h"
+#include "battle_controllers.h"
+#include "battle_frontier_2.h"
+#include "berry_tag_screen.h"
+#include "bg.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "field_specials.h"
+#include "graphics.h"
+#include "gpu_regs.h"
+#include "international_string_util.h"
+#include "item.h"
+#include "item_menu_icons.h"
+#include "item_use.h"
+#include "lilycove_lady.h"
+#include "list_menu.h"
+#include "link.h"
+#include "mail.h"
+#include "main.h"
+#include "malloc.h"
+#include "map_name_popup.h"
+#include "menu.h"
+#include "money.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "player_pc.h"
+#include "pokemon.h"
+#include "pokemon_summary_screen.h"
+#include "rom_818CFC8.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "shop.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string.h"
+#include "strings.h"
+#include "string_util.h"
+#include "task.h"
+#include "text_window.h"
+#include "menu_helpers.h"
+#include "window.h"
+
+void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *postExitMenuMainCallback2)());
+void CB2_Bag(void);
+bool8 setup_bag_menu(void);
+void bag_menu_init_bgs(void);
+bool8 load_bag_menu_graphics(void);
+void setup_bag_menu_textboxes(void);
+void allocate_bag_item_list_buffers(void);
+void load_bag_item_list_buffers(u8);
+void bag_menu_print_pocket_names(u8*, u8*);
+void bag_menu_copy_pocket_name_to_window(u32);
+void bag_menu_draw_pocket_indicator_square(u8, u8);
+void bag_menu_add_pocket_scroll_arrow_indicators_maybe(void);
+void bag_menu_add_list_scroll_arrow_indicators_maybe(void);
+void bag_menu_prepare_tmhm_move_window(void);
+bool8 IsWallysBag(void);
+void Task_WallyTutorialBagMenu(u8);
+void Task_BagMenu(u8);
+void get_name(s8*, u16);
+u16 ItemIdToBattleMoveId(u16);
+u16 BagGetItemIdByPocketPosition(u8, u16);
+void AddBagItemIconSprite(u16, u8);
+void bag_menu_print_description_box_text(int);
+void bag_menu_print_cursor(u8, u8);
+void bag_menu_print(u8, u8, const u8*, u8, u8, u8, u8, u8, u8);
+bool8 ItemId_GetImportance(u16);
+u16 BagGetQuantityByPocketPosition(u8, u16);
+void sub_81AB89C(void);
+void task_close_bag_menu_2(u8);
+u8 AddItemMessageWindow(u8);
+void bag_menu_RemoveBagItem_message_window(u8);
+void set_callback3_to_bag(u8);
+void sub_81ABC54(u8, s16);
+u8 bag_menu_add_window(u8);
+u8 GetSwitchBagPocketDirection(void);
+void SwitchBagPocket(u8, s16, u16);
+bool8 sub_81AC2C0(void);
+void bag_menu_swap_items(u8);
+void sub_81AC10C(u8);
+void sub_81AC3C0(u8);
+void sub_81AC498(u8);
+void sub_81AC590(u8);
+void PrintTMHMMoveData(u16);
+void sub_81ACAF8(u8);
+void sub_81ACB54(u8, u8, u8);
+void Task_HandleInBattleItemMenuInput(u8);
+void Task_HandleOutOfBattleItemMenuInput(u8);
+bool8 sub_81ACDFC(s8);
+void bag_menu_remove_window(u8);
+void bag_menu_print_there_is_no_pokemon(u8);
+void Task_ChooseHowManyToToss(u8);
+void BagMenuConfirmToss(u8);
+void bag_menu_yes_no(u8, u8, const struct YesNoFuncTable*);
+void Task_ActuallyToss(u8);
+void ItemMenu_Cancel(u8);
+void sub_81AD350(u8);
+void bag_menu_print_cant_be_held_msg(u8);
+void bag_menu_AddMoney_window(void);
+void sub_81AD680(u8);
+void sub_81AD730(u8);
+void sub_81AD6E4(u8);
+void bag_menu_remove_money_window(void);
+void bag_menu_RemoveBagItem_message_window(u8);
+void sub_81AD794(u8);
+void sub_81AD8C8(u8);
+void sub_81AD9C0(u8);
+void sub_81ADB14(u8);
+void sub_81ADA7C(u8);
+void sub_81ADC0C(u8);
+void bag_menu_leave_maybe_3(void);
+void bag_menu_leave_maybe_2(void);
+void bag_menu_leave_maybe(void);
+void sub_81ABA6C(void);
+void sub_81ABAC4(void);
+void sub_81ABAE0(void);
+u8 sub_81AB1F0(u8);
+void sub_81AC23C(u8);
+void bag_menu_change_item_callback(s32 a, bool8 b, struct ListMenu*);
+void sub_81AB520(u8 rboxId, int item_index_in_pocket, u8 a);
+void ItemMenu_UseOutOfBattle(u8 taskId);
+void ItemMenu_Toss(u8 taskId);
+void ItemMenu_Register(u8 taskId);
+void ItemMenu_Give(u8 taskId);
+void ItemMenu_Cancel(u8 taskId);
+void ItemMenu_UseInBattle(u8 taskId);
+void ItemMenu_CheckTag(u8 taskId);
+void unknown_ItemMenu_Confirm(u8 taskId);
+void unknown_ItemMenu_Show(u8 taskId);
+void unknown_ItemMenu_Give2(u8 taskId);
+void unknown_ItemMenu_Confirm2(u8 taskId);
+void unknown_item_menu_type(u8 taskId);
+void item_menu_type_2(u8 taskId);
+void display_sell_item_ask_str(u8 taskId);
+void unknown_ItemMenu_Confirm(u8 taskId);
+void display_deposit_item_ask_str(u8 taskId);
+void item_menu_type_b(u8 taskId);
+void BagMenuActuallyToss(u8 taskId);
+void BagMenuCancelToss(u8 taskId);
+void sub_81AD84C(u8 taskId);
+void sub_81AD6FC(u8 taskId);
+
+// .rodata
+
+const struct BgTemplate gUnknown_08613F90[3] = {
+ {0, 0, 31, 0, 0, 1, 0},
+ {1, 0, 30, 0, 0, 0, 0},
+ {2, 3, 29, 0, 0, 2, 0}
+};
+
+const struct ListMenuTemplate gUnknown_08613F9C = {
+ NULL, bag_menu_change_item_callback, sub_81AB520, 0, 0, 0, 0, 8, 0, 1, 1, 0, 3, 0, 0, 0, 7, 0
+};
+
+const struct MenuAction gUnknown_08613FB4[] = {
+ {gMenuText_Use, ItemMenu_UseOutOfBattle},
+ {gMenuText_Toss, ItemMenu_Toss},
+ {gMenuText_Register, ItemMenu_Register},
+ {gMenuText_Give, ItemMenu_Give},
+ {gText_Cancel2, ItemMenu_Cancel},
+ {gMenuText_Use, ItemMenu_UseInBattle},
+ {gMenuText_Check, ItemMenu_UseOutOfBattle},
+ {gMenuText_Walk, ItemMenu_UseOutOfBattle},
+ {gMenuText_Deselect, ItemMenu_Register},
+ {gMenuText_CheckTag, ItemMenu_CheckTag},
+ {gMenuText_Confirm, unknown_ItemMenu_Confirm},
+ {gMenuText_Show, unknown_ItemMenu_Show},
+ {gMenuText_Give2, unknown_ItemMenu_Give2},
+ {gMenuText_Confirm, unknown_ItemMenu_Confirm2},
+ {gText_EmptyString2, NULL}
+};
+
+const u8 gUnknown_0861402C[] = {0, 3, 1, 4};
+const u8 gUnknown_08614030[] = {0, 2, 14, 4};
+const u8 gUnknown_08614034[] = {3, 14, 1, 4};
+const u8 gUnknown_08614038[] = {0, 3, 14, 4};
+const u8 gUnknown_0861403C[] = {9, 14, 0, 3, 1, 4};
+const u8 gUnknown_08614042[] = {5, 4};
+const u8 gUnknown_08614044[] = {3, 4};
+const u8 gUnknown_08614046 = 4;
+const u8 gUnknown_08614047[] = {10, 9, 14, 4};
+const u8 gUnknown_0861404B[] = {11, 4};
+const u8 gUnknown_0861404D[] = {12, 4};
+const u8 gUnknown_0861404F[] = {13, 4};
+
+const TaskFunc gUnknown_08614054[] = {
+ unknown_item_menu_type,
+ unknown_item_menu_type,
+ item_menu_type_2,
+ display_sell_item_ask_str,
+ unknown_ItemMenu_Confirm,
+ unknown_item_menu_type,
+ display_deposit_item_ask_str,
+ unknown_item_menu_type,
+ unknown_item_menu_type,
+ unknown_item_menu_type,
+ NULL,
+ item_menu_type_b
+};
+
+const struct YesNoFuncTable gUnknown_08614084 = {BagMenuActuallyToss, BagMenuCancelToss};
+
+const struct YesNoFuncTable gUnknown_0861408C = {sub_81AD84C, sub_81AD6FC};
+
+const struct ScrollArrowsTemplate gUnknown_08614094 = {SCROLL_ARROW_LEFT, 0x1C, 16, SCROLL_ARROW_RIGHT, 100, 16, -1, -1, 0x6F, 0x6F, 0};
+
+const u8 gUnknown_086140A4[] = INCBIN_U8("graphics/interface/select_button.4bpp");
+
+const u8 gUnknown_08614164[][3] = {
+ {0, 1, 3},
+ {0, 1, 4},
+ {0, 3, 6},
+ {2, 1, 3},
+ {0, 14, 10}
+};
+
+const struct WindowTemplate gUnknown_08614174[] = {
+ {0, 14, 2, 15, 16, 1, 0x27},
+ {0, 0, 13, 14, 6, 1, 0x117},
+ {0, 4, 1, 8, 2, 1, 0x1A1},
+ {0, 1, 13, 5, 6, 12, 0x16B},
+ {0, 7, 13, 4, 6, 12, 0x189},
+ {1, 2, 15, 27, 4, 15, 0x1B1},
+ {0xFF, 0, 0, 0, 0, 0, 0}
+};
+
+const struct WindowTemplate gUnknown_086141AC[] = {
+ {1, 22, 17, 7, 2, 15, 0x21D},
+ {1, 22, 15, 7, 4, 15, 0x21D},
+ {1, 15, 15, 14, 4, 15, 0x21D},
+ {1, 15, 13, 14, 6, 15, 0x21D},
+ {1, 2, 15, 27, 4, 15, 0x1B1},
+ {1, 24, 15, 5, 4, 15, 0x21D},
+ {1, 21, 9, 5, 4, 15, 0x21D},
+ {1, 24, 17, 5, 2, 15, 0x21D},
+ {1, 18, 11, 10, 2, 15, 0x245},
+ {1, 1, 1, 10, 2, 15, 0x231}
+};
+
+// .text
+
+struct ListBuffer1 {
+ struct ListMenuItem subBuffers[65];
+};
+
+struct ListBuffer2 {
+ s8 name[65][24];
+};
+
+struct TempWallyStruct {
+ struct ItemSlot bagPocket_Items[30];
+ struct ItemSlot bagPocket_PokeBalls[16];
+ u16 cursorPosition[5];
+ u16 scrollPosition[5];
+ u8 filler[0x2];
+ u16 pocket;
+};
+
+EWRAM_DATA struct UnkBagStruct *gUnknown_0203CE54 = 0;
+EWRAM_DATA struct BagStruct gUnknown_0203CE58 = {0};
+EWRAM_DATA struct ListBuffer1 *gUnknown_0203CE74 = 0;
+EWRAM_DATA struct ListBuffer2 *gUnknown_0203CE78 = 0;
+EWRAM_DATA u16 gSpecialVar_ItemId = 0;
+EWRAM_DATA struct TempWallyStruct *gUnknown_0203CE80 = 0;
+
+extern u8 *gPocketNamesStringsTable[];
+extern u8 gUnknown_08D9A88C[];
+extern struct ListMenuTemplate gUnknown_08613F9C;
+extern const u8 gMoveNames[][0xD];
+extern u8* gReturnToXStringsTable[];
+extern u32 gUnknown_0203CE5E[];
+extern const u8 EventScript_2736B3[];
+extern const u16 gUnknown_0860F074[];
+
+void ResetBagScrollPositions(void)
+{
+ gUnknown_0203CE58.pocket = 0;
+ memset(gUnknown_0203CE58.cursorPosition, 0, 10);
+ memset(gUnknown_0203CE58.scrollPosition, 0, 10);
+}
+
+void CB2_BagMenuFromStartMenu(void)
+{
+ GoToBagMenu(0, 5, CB2_ReturnToFieldWithOpenMenu);
+}
+
+void sub_81AABB0(void)
+{
+ if (!InBattlePyramid())
+ GoToBagMenu(1, 5, SetCB2ToReshowScreenAfterMenu2);
+ else
+ sub_81C4F98(1, SetCB2ToReshowScreenAfterMenu2);
+}
+
+void CB2_ChooseBerry(void)
+{
+ GoToBagMenu(4, 3, CB2_ReturnToFieldContinueScript);
+}
+
+void sub_81AABF0(void(*callback)(void))
+{
+ GoToBagMenu(5, 3, callback);
+}
+
+void CB2_GoToSellMenu(void)
+{
+ GoToBagMenu(3, 5, CB2_ExitSellMenu);
+}
+
+void sub_81AAC14(void)
+{
+ GoToBagMenu(6, 5, sub_816B31C);
+}
+
+void sub_81AAC28(void)
+{
+ GoToBagMenu(9, 5, bag_menu_leave_maybe_3);
+ gSpecialVar_0x8005 = 0;
+ gSpecialVar_Result = 0;
+}
+
+void sub_81AAC50(void)
+{
+ GoToBagMenu(7, 5, bag_menu_leave_maybe_2);
+ gSpecialVar_Result = 0;
+}
+
+void sub_81AAC70(void)
+{
+ GoToBagMenu(8, 5, bag_menu_leave_maybe);
+ gSpecialVar_Result = 0;
+}
+
+void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *postExitMenuMainCallback2)())
+{
+ u8 temp;
+ gUnknown_0203CE54 = AllocZeroed(sizeof(struct UnkBagStruct));
+ if (gUnknown_0203CE54 == 0)
+ {
+ SetMainCallback2(postExitMenuMainCallback2);
+ }
+ else
+ {
+ if (bagMenuType != 12)
+ gUnknown_0203CE58.location = bagMenuType;
+ if (postExitMenuMainCallback2)
+ gUnknown_0203CE58.bagCallback = postExitMenuMainCallback2;
+ if (pocketId <= 4)
+ gUnknown_0203CE58.pocket = pocketId;
+ temp = gUnknown_0203CE58.location - 4;
+ if (temp <= 1)
+ gUnknown_0203CE54->unk81B = 1;
+ gUnknown_0203CE54->unk0 = 0;
+ gUnknown_0203CE54->unk81A = 0xFF;
+ gUnknown_0203CE54->unk81E = -1;
+ gUnknown_0203CE54->unk81F = -1;
+ memset(gUnknown_0203CE54->unk804, 0xFF, sizeof(gUnknown_0203CE54->unk804));
+ memset(gUnknown_0203CE54->unk810, 0xFF, 10);
+ SetMainCallback2(CB2_Bag);
+ }
+}
+
+void c2_bag_3(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+void vblank_cb_bag_menu(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_Bag(void)
+{
+ while(sub_81221EC() != TRUE && setup_bag_menu() != TRUE && sub_81221AC() != TRUE) {};
+}
+
+bool8 setup_bag_menu(void)
+{
+ u32 index;
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankHBlankCallbacksToNull();
+ clear_scheduled_bg_copies_to_vram();
+ gMain.state++;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ gMain.state++;
+ break;
+ case 2:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 3:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ gMain.state++;
+ break;
+ case 4:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 5:
+ gMain.state++;
+ break;
+ case 6:
+ if (sub_81221AC() == FALSE)
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 7:
+ bag_menu_init_bgs();
+ gUnknown_0203CE54->unk834 = 0;
+ gMain.state++;
+ break;
+ case 8:
+ if (!load_bag_menu_graphics())
+ break;
+ gMain.state++;
+ break;
+ case 9:
+ setup_bag_menu_textboxes();
+ gMain.state++;
+ break;
+ case 10:
+ sub_81ABA6C();
+ sub_81ABAC4();
+ sub_81ABAE0();
+ gMain.state++;
+ break;
+ case 11:
+ allocate_bag_item_list_buffers();
+ gMain.state++;
+ break;
+ case 12:
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ gMain.state++;
+ break;
+ case 13:
+ bag_menu_print_pocket_names(gPocketNamesStringsTable[gUnknown_0203CE58.pocket], 0);
+ bag_menu_copy_pocket_name_to_window(0);
+ bag_menu_draw_pocket_indicator_square(gUnknown_0203CE58.pocket, 1);
+ gMain.state++;
+ break;
+ case 14:
+ taskId = sub_81AB1F0(gUnknown_0203CE58.location);
+ gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket], gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]);
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[8] = 0;
+ gMain.state++;
+ break;
+ case 15:
+ AddBagVisualSprite(gUnknown_0203CE58.pocket);
+ gMain.state++;
+ break;
+ case 16:
+ sub_80D4FAC();
+ gMain.state++;
+ break;
+ case 17:
+ bag_menu_add_pocket_scroll_arrow_indicators_maybe();
+ bag_menu_add_list_scroll_arrow_indicators_maybe();
+ gMain.state++;
+ break;
+ case 18:
+ bag_menu_prepare_tmhm_move_window();
+ gMain.state++;
+ break;
+ case 19:
+ BlendPalettes(-1, 16, 0);
+ gMain.state++;
+ break;
+ case 20:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ gMain.state++;
+ break;
+ default:
+ SetVBlankCallback(vblank_cb_bag_menu);
+ SetMainCallback2(c2_bag_3);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void bag_menu_init_bgs(void)
+{
+ ResetVramOamAndBgCntRegs();
+ memset(gUnknown_0203CE54->unk4, 0, 0x800);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_08613F90, 3);
+ SetBgTilemapBuffer(2, gUnknown_0203CE54->unk4);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(2);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+bool8 load_bag_menu_graphics(void)
+{
+ switch (gUnknown_0203CE54->unk834)
+ {
+ case 0:
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(2, gBagScreen_Gfx, 0, 0, 0);
+ gUnknown_0203CE54->unk834++;
+ break;
+ case 1:
+ if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ {
+ LZDecompressWram(gUnknown_08D9A88C, gUnknown_0203CE54->unk4);
+ gUnknown_0203CE54->unk834++;
+ }
+ break;
+ case 2:
+ if (!IsWallysBag() && gSaveBlock2Ptr->playerGender != MALE)
+ LoadCompressedPalette(gBagScreenFemale_Pal, 0, 0x40);
+ else
+ LoadCompressedPalette(gBagScreenMale_Pal, 0, 0x40);
+ gUnknown_0203CE54->unk834++;
+ break;
+ case 3:
+ if (IsWallysBag() == TRUE || gSaveBlock2Ptr->playerGender == MALE)
+ LoadCompressedObjectPic(&gUnknown_0857FB34);
+ else
+ LoadCompressedObjectPic(&gUnknown_0857FB3C);
+ gUnknown_0203CE54->unk834++;
+ break;
+ case 4:
+ LoadCompressedObjectPalette(&gUnknown_0857FB44);
+ gUnknown_0203CE54->unk834++;
+ break;
+ default:
+ LoadListMenuArrowsGfx();
+ gUnknown_0203CE54->unk834 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u8 sub_81AB1F0(u8 a)
+{
+ u8 taskId;
+ if (a == 10)
+ taskId = CreateTask(Task_WallyTutorialBagMenu, 0);
+ else
+ taskId = CreateTask(Task_BagMenu, 0);
+ return taskId;
+}
+
+void allocate_bag_item_list_buffers(void)
+{
+ gUnknown_0203CE74 = Alloc(sizeof(struct ListBuffer1));
+ gUnknown_0203CE78 = Alloc(sizeof(struct ListBuffer2));
+}
+
+void load_bag_item_list_buffers(u8 pocketId)
+{
+ u16 i;
+ struct BagPocket *pocket = &gBagPockets[pocketId];
+ struct ListMenuItem *subBuffer;
+
+ if (!gUnknown_0203CE54->unk81B_2)
+ {
+ for (i = 0; i < gUnknown_0203CE54->unk829[pocketId] - 1; i++)
+ {
+ get_name(gUnknown_0203CE78->name[i], pocket->itemSlots[i].itemId);
+ subBuffer = gUnknown_0203CE74->subBuffers;
+ subBuffer[i].name = gUnknown_0203CE78->name[i];
+ subBuffer[i].id = i;
+ }
+ StringCopy(gUnknown_0203CE78->name[i], gText_CloseBag);
+ subBuffer = gUnknown_0203CE74->subBuffers;
+ subBuffer[i].name = gUnknown_0203CE78->name[i];
+ subBuffer[i].id = -2;
+ }
+ else
+ {
+ for (i = 0; i < gUnknown_0203CE54->unk829[pocketId]; i++)
+ {
+ get_name(gUnknown_0203CE78->name[i], pocket->itemSlots[i].itemId);
+ subBuffer = gUnknown_0203CE74->subBuffers;
+ subBuffer[i].name = gUnknown_0203CE78->name[i];
+ subBuffer[i].id = i;
+ }
+ }
+ gMultiuseListMenuTemplate = gUnknown_08613F9C;
+ gMultiuseListMenuTemplate.totalItems = gUnknown_0203CE54->unk829[pocketId];
+ gMultiuseListMenuTemplate.items = gUnknown_0203CE74->subBuffers;
+ gMultiuseListMenuTemplate.maxShowed = gUnknown_0203CE54->unk82E[pocketId];
+}
+
+void get_name(s8 *dest, u16 itemId)
+{
+ switch (gUnknown_0203CE58.pocket)
+ {
+ case 2:
+ StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(itemId)]);
+ if (itemId >= ITEM_HM01)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_HM01 + 1, 2, 1);
+ StringExpandPlaceholders(dest, gText_ClearTo11Var1Clear5Var2);
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_TM01 + 1, 2, 2);
+ StringExpandPlaceholders(dest, gText_UnkF908Var1Clear7Var2);
+ }
+ break;
+ case 3:
+ ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_CHERI_BERRY + 1, 2, 2);
+ CopyItemName(itemId, gStringVar2);
+ StringExpandPlaceholders(dest, gText_UnkF908Var1Clear7Var2);
+ break;
+ default:
+ CopyItemName(itemId, dest);
+ break;
+ }
+}
+
+void bag_menu_change_item_callback(s32 a, bool8 b, struct ListMenu *unused)
+{
+ if (b != 1)
+ {
+ PlaySE(SE_SELECT);
+ ShakeBagVisual();
+ }
+ if (gUnknown_0203CE54->unk81A == 0xFF)
+ {
+ RemoveBagItemIconSprite(1 ^ gUnknown_0203CE54->unk81B_1);
+ if (a != -2)
+ AddBagItemIconSprite(BagGetItemIdByPocketPosition(gUnknown_0203CE58.pocket + 1, a), gUnknown_0203CE54->unk81B_1);
+ else
+ AddBagItemIconSprite(-1, gUnknown_0203CE54->unk81B_1);
+ gUnknown_0203CE54->unk81B_1 ^= 1;
+ if (!gUnknown_0203CE54->unk81B_3)
+ bag_menu_print_description_box_text(a);
+ }
+}
+
+void sub_81AB520(u8 rboxId, int item_index_in_pocket, u8 a)
+{
+ u16 itemId;
+ u16 itemQuantity;
+ bool8 unique;
+ int offset;
+ if (item_index_in_pocket != -2)
+ {
+ if (gUnknown_0203CE54->unk81A != 0xFF)
+ {
+ if (gUnknown_0203CE54->unk81A == (u8)item_index_in_pocket)
+ bag_menu_print_cursor(a, 2);
+ else
+ bag_menu_print_cursor(a, -1);
+ }
+ itemId = BagGetItemIdByPocketPosition(gUnknown_0203CE58.pocket + 1, item_index_in_pocket);
+ itemQuantity = BagGetQuantityByPocketPosition(gUnknown_0203CE58.pocket + 1, item_index_in_pocket);
+ if ((u16)(itemId - ITEM_HM01) <= 7)
+ BlitBitmapToWindow(rboxId, gBagMenuHMIcon_Gfx, 8, a - 1, 16, 16);
+ if (gUnknown_0203CE58.pocket == 3)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, itemQuantity, 1, 3);
+ StringExpandPlaceholders(gStringVar4, gText_xVar1);
+ offset = GetStringRightAlignXOffset(7, gStringVar4, 0x77);
+ bag_menu_print(rboxId, 7, gStringVar4, offset, a, 0, 0, -1, 0);
+ }
+ else if (gUnknown_0203CE58.pocket != 4 && (unique = ItemId_GetImportance(itemId)) == FALSE)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, itemQuantity, 1, 2);
+ StringExpandPlaceholders(gStringVar4, gText_xVar1);
+ offset = GetStringRightAlignXOffset(7, gStringVar4, 0x77);
+ bag_menu_print(rboxId, 7, gStringVar4, offset, a, unique, unique, -1, unique);
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->registeredItem && gSaveBlock1Ptr->registeredItem == itemId)
+ BlitBitmapToWindow(rboxId, gUnknown_086140A4, 0x60, a - 1, 0x18, 16);
+ }
+ }
+}
+
+void bag_menu_print_description_box_text(int a)
+{
+ u8* str;
+ if (a != -2)
+ {
+ str = (u8*)ItemId_GetDescription(BagGetItemIdByPocketPosition(gUnknown_0203CE58.pocket + 1, a));
+ }
+ else
+ {
+ StringCopy(gStringVar1, gReturnToXStringsTable[gUnknown_0203CE58.location]);
+ StringExpandPlaceholders(gStringVar4, gText_ReturnToVar1);
+ str = gStringVar4;
+ }
+ FillWindowPixelBuffer(1, 0);
+ bag_menu_print(1, 1, str, 3, 1, 0, 0, 0, 0);
+}
+
+void bag_menu_print_cursor_(u8 a, u8 b)
+{
+ bag_menu_print_cursor(ListMenuGetYCoordForPrintingArrowCursor(a), b);
+}
+
+void bag_menu_print_cursor(u8 a, u8 b)
+{
+ if (b == 0xFF)
+ FillWindowPixelRect(0, 0, 0, a, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1));
+ else
+ bag_menu_print(0, 1, gText_SelectorArrow2, 0, a, 0, 0, 0, b);
+
+}
+
+void bag_menu_add_pocket_scroll_arrow_indicators_maybe(void)
+{
+ if (gUnknown_0203CE54->unk81E == 0xFF)
+ gUnknown_0203CE54->unk81E = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xAC, 12, 0x94, gUnknown_0203CE54->unk829[gUnknown_0203CE58.pocket] - gUnknown_0203CE54->unk82E[gUnknown_0203CE58.pocket], 0x6E, 0x6E, &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket]);
+}
+
+void sub_81AB824(void)
+{
+ if (gUnknown_0203CE54->unk81E != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(gUnknown_0203CE54->unk81E);
+ gUnknown_0203CE54->unk81E = 0xFF;
+ }
+ sub_81AB89C();
+}
+
+void bag_menu_add_list_scroll_arrow_indicators_maybe(void)
+{
+ if (gUnknown_0203CE54->unk81B != 1 && gUnknown_0203CE54->unk81F == 0xFF)
+ gUnknown_0203CE54->unk81F = AddScrollIndicatorArrowPair(&gUnknown_08614094, &gUnknown_0203CE58.unk6);
+}
+
+void sub_81AB89C(void)
+{
+ if (gUnknown_0203CE54->unk81F != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(gUnknown_0203CE54->unk81F);
+ gUnknown_0203CE54->unk81F = 0xFF;
+ }
+}
+
+void free_bag_item_list_buffers(void)
+{
+ Free(gUnknown_0203CE78);
+ Free(gUnknown_0203CE74);
+ FreeAllWindowBuffers();
+ Free(gUnknown_0203CE54);
+}
+
+void unknown_ItemMenu_Confirm(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = task_close_bag_menu_2;
+}
+
+void task_close_bag_menu_2(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ if (!gPaletteFade.active)
+ {
+ DestroyListMenuTask(data[0], &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket], &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]);
+ if (gUnknown_0203CE54->unk0 != 0)
+ SetMainCallback2(gUnknown_0203CE54->unk0);
+ else
+ SetMainCallback2(gUnknown_0203CE58.bagCallback);
+ sub_81AB824();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ free_bag_item_list_buffers();
+ DestroyTask(taskId);
+ }
+}
+
+void sub_81AB9A8(u8 pocketId)
+{
+ u16 i;
+ struct BagPocket *pocket = &gBagPockets[pocketId];
+ switch (pocketId)
+ {
+ case 2:
+ case 3:
+ SortBerriesOrTMHMs(pocket);
+ break;
+ default:
+ CompactItemsInBagPocket(pocket);
+ break;
+ }
+ gUnknown_0203CE54->unk829[pocketId] = 0;
+ for (i = 0; i < pocket->capacity && pocket->itemSlots[i].itemId; i++)
+ gUnknown_0203CE54->unk829[pocketId]++;
+ if (!gUnknown_0203CE54->unk81B_2)
+ gUnknown_0203CE54->unk829[pocketId]++;
+ if (gUnknown_0203CE54->unk829[pocketId] > 8)
+ gUnknown_0203CE54->unk82E[pocketId] = 8;
+ else
+ gUnknown_0203CE54->unk82E[pocketId] = gUnknown_0203CE54->unk829[pocketId];
+}
+
+void sub_81ABA6C(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ sub_81AB9A8(i);
+}
+
+void sub_81ABA88(u8 a)
+{
+ sub_812225C(&gUnknown_0203CE58.scrollPosition[a], &gUnknown_0203CE58.cursorPosition[a], gUnknown_0203CE54->unk82E[a], gUnknown_0203CE54->unk829[a]);
+}
+
+void sub_81ABAC4(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ sub_81ABA88(i);
+}
+
+void sub_81ABAE0(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ sub_8122298(&gUnknown_0203CE58.scrollPosition[i], &gUnknown_0203CE58.cursorPosition[i], gUnknown_0203CE54->unk82E[i], gUnknown_0203CE54->unk829[i], 8);
+}
+
+u8 sub_81ABB2C(u8 pocketId)
+{
+ return gUnknown_0203CE58.scrollPosition[pocketId] + gUnknown_0203CE58.cursorPosition[pocketId];
+}
+
+void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void ( *callback)(u8 taskId))
+{
+ s16* data = gTasks[taskId].data;
+
+ data[10] = AddItemMessageWindow(4);
+ FillWindowPixelBuffer(data[10], 17);
+ DisplayMessageAndContinueTask(taskId, data[10], 10, 13, fontId, GetPlayerTextSpeed(), str, callback);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+void bag_menu_inits_lists_menu(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16* scrollPos = &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket];
+ u16* cursorPos = &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+ bag_menu_RemoveBagItem_message_window(4);
+ DestroyListMenuTask(data[0], scrollPos, cursorPos);
+ sub_81AB9A8(gUnknown_0203CE58.pocket);
+ sub_81ABA88(gUnknown_0203CE58.pocket);
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos);
+ schedule_bg_copy_tilemap_to_vram(0);
+ set_callback3_to_bag(taskId);
+}
+
+void sub_81ABC3C(u8 a)
+{
+ sub_81ABC54(bag_menu_add_window(a), 1);
+}
+
+void sub_81ABC54(u8 a, s16 b)
+{
+ u8 r3 = (gUnknown_0203CE58.pocket == 3) ? 3 : 2;
+ ConvertIntToDecimalStringN(gStringVar1, b, 2, r3);
+ StringExpandPlaceholders(gStringVar4, gText_xVar1);
+ PrintTextOnWindow(a, 1, gStringVar4, GetStringCenterAlignXOffset(1, gStringVar4, 0x28), 2, 0, 0);
+}
+
+void sub_81ABCC0(int a, int b, int c)
+{
+ u8 r3 = (gUnknown_0203CE58.pocket == 3) ? 3 : 2;
+ ConvertIntToDecimalStringN(gStringVar1, b, 2, r3);
+ StringExpandPlaceholders(gStringVar4, gText_xVar1);
+ PrintTextOnWindow(a, 1, gStringVar4, 0, 1, -1, 0);
+ PrintMoneyAmount(a, 0x26, 1, c, 0);
+}
+
+void Task_BagMenu(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16* scrollPos = &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket];
+ u16* cursorPos = &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+ u16 select;
+ if (sub_81221EC() != TRUE && !gPaletteFade.active)
+ {
+ switch (GetSwitchBagPocketDirection())
+ {
+ case 1:
+ SwitchBagPocket(taskId, -1, 0);
+ return;
+ case 2:
+ SwitchBagPocket(taskId, 1, 0);
+ return;
+ }
+ if ((select = (gMain.newKeys & SELECT_BUTTON)))
+ {
+ if (sub_81AC2C0() == 1)
+ {
+ ListMenuGetScrollAndRow(data[0], scrollPos, cursorPos);
+ if ((*scrollPos + *cursorPos) != gUnknown_0203CE54->unk829[gUnknown_0203CE58.pocket] - 1)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_swap_items(taskId);
+ }
+ }
+ return;
+ }
+ else
+ {
+ int r4 = ListMenuHandleInputGetItemId(data[0]);
+ ListMenuGetScrollAndRow(data[0], scrollPos, cursorPos);
+ switch (r4)
+ {
+ case -1:
+ break;
+ case -2:
+ if (gUnknown_0203CE58.location == 5)
+ {
+ PlaySE(SE_HAZURE);
+ break;
+ }
+ PlaySE(SE_SELECT);
+ gSpecialVar_ItemId = select;
+ gTasks[taskId].func = unknown_ItemMenu_Confirm;
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sub_81AB824();
+ bag_menu_print_cursor_(data[0], 2);
+ data[1] = r4;
+ data[2] = BagGetQuantityByPocketPosition(gUnknown_0203CE58.pocket + 1, r4);
+ gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gUnknown_0203CE58.pocket + 1, r4);
+ gUnknown_08614054[gUnknown_0203CE58.location](taskId);
+ break;
+ }
+ }
+ }
+}
+
+void set_callback3_to_bag(u8 taskId)
+{
+ bag_menu_add_pocket_scroll_arrow_indicators_maybe();
+ bag_menu_add_list_scroll_arrow_indicators_maybe();
+ ClearWindowTilemap(3);
+ ClearWindowTilemap(4);
+ PutWindowTilemap(1);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = Task_BagMenu;
+}
+
+u8 GetSwitchBagPocketDirection(void)
+{
+ u8 LRKeys;
+ if (gUnknown_0203CE54->unk81B != 0)
+ return 0;
+ LRKeys = GetLRKeysState();
+ if ((gMain.newKeys & DPAD_LEFT) || LRKeys == 1)
+ {
+ PlaySE(SE_SELECT);
+ return 1;
+ }
+ if ((gMain.newKeys & DPAD_RIGHT) || LRKeys == 2)
+ {
+ PlaySE(SE_SELECT);
+ return 2;
+ }
+ return 0;
+}
+
+void ChangeBagPocketId(u8 *bagPocketId, s8 deltaBagPocketId)
+{
+ if (deltaBagPocketId == 1 && *bagPocketId == 4)
+ *bagPocketId = 0;
+ else if (deltaBagPocketId == -1 && *bagPocketId == 0)
+ *bagPocketId = 4;
+ else
+ *bagPocketId += deltaBagPocketId;
+}
+
+void SwitchBagPocket(u8 taskId, s16 deltaBagPocketId, u16 a3)
+{
+ s16* data = gTasks[taskId].data;
+ u8 pocketId;
+
+ data[13] = 0;
+ data[12] = 0;
+ data[11] = deltaBagPocketId;
+ if (a3 == 0)
+ {
+ ClearWindowTilemap(0);
+ ClearWindowTilemap(1);
+ DestroyListMenuTask(data[0], &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket], &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gSprites[gUnknown_0203CE54->unk804[2 + (gUnknown_0203CE54->unk81B_1 ^ 1)]].invisible = 1;
+ sub_81AB824();
+ }
+ pocketId = gUnknown_0203CE58.pocket;
+ ChangeBagPocketId(&pocketId, deltaBagPocketId);
+ if (deltaBagPocketId == 1)
+ {
+ bag_menu_print_pocket_names(gPocketNamesStringsTable[gUnknown_0203CE58.pocket], gPocketNamesStringsTable[pocketId]);
+ bag_menu_copy_pocket_name_to_window(0);
+ }
+ else
+ {
+ bag_menu_print_pocket_names(gPocketNamesStringsTable[pocketId], gPocketNamesStringsTable[gUnknown_0203CE58.pocket]);
+ bag_menu_copy_pocket_name_to_window(8);
+ }
+ bag_menu_draw_pocket_indicator_square(gUnknown_0203CE58.pocket, 0);
+ bag_menu_draw_pocket_indicator_square(pocketId, 1);
+ FillBgTilemapBufferRect_Palette0(2, 11, 14, 2, 15, 16);
+ schedule_bg_copy_tilemap_to_vram(2);
+ SetBagVisualPocketId(pocketId, 1);
+ RemoveBagSprite(1);
+ AddSwitchPocketRotatingBallSprite(deltaBagPocketId);
+ SetTaskFuncWithFollowupFunc(taskId, sub_81AC10C, gTasks[taskId].func);
+}
+
+void sub_81AC10C(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (!sub_81221AC() && !IsWallysBag())
+ {
+ switch (GetSwitchBagPocketDirection())
+ {
+ case 1:
+ ChangeBagPocketId(&gUnknown_0203CE58.pocket, data[11]);
+ SwitchTaskToFollowupFunc(taskId);
+ SwitchBagPocket(taskId, -1, 1);
+ return;
+ case 2:
+ ChangeBagPocketId(&gUnknown_0203CE58.pocket, data[11]);
+ SwitchTaskToFollowupFunc(taskId);
+ SwitchBagPocket(taskId, 1, 1);
+ return;
+ }
+ }
+ switch (data[13])
+ {
+ case 0:
+ sub_81AC23C(data[12]);
+ if (!(++data[12] & 1))
+ {
+ if (data[11] == 1)
+ bag_menu_copy_pocket_name_to_window((u8)(data[12] >> 1));
+ else
+ bag_menu_copy_pocket_name_to_window((u8)(8 - (data[12] >> 1)));
+ }
+ if (data[12] == 16)
+ data[13]++;
+ break;
+ case 1:
+ ChangeBagPocketId(&gUnknown_0203CE58.pocket, data[11]);
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket], gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]);
+ PutWindowTilemap(1);
+ PutWindowTilemap(2);
+ schedule_bg_copy_tilemap_to_vram(0);
+ bag_menu_add_pocket_scroll_arrow_indicators_maybe();
+ bag_menu_add_list_scroll_arrow_indicators_maybe();
+ SwitchTaskToFollowupFunc(taskId);
+ }
+}
+
+void sub_81AC23C(u8 a)
+{
+ FillBgTilemapBufferRect_Palette0(2, 17, 14, a + 2, 15, 1);
+ schedule_bg_copy_tilemap_to_vram(2);
+}
+
+void bag_menu_draw_pocket_indicator_square(u8 x, u8 is_current_bag)
+{
+ if (is_current_bag == 0)
+ FillBgTilemapBufferRect_Palette0(2, 0x1017, x + 5, 3, 1, 1);
+ else
+ FillBgTilemapBufferRect_Palette0(2, 0x102B, x + 5, 3, 1, 1);
+ schedule_bg_copy_tilemap_to_vram(2);
+}
+
+bool8 sub_81AC2C0(void)
+{
+ if (gUnknown_0203CE58.location <= 1)
+ {
+ u8 temp = gUnknown_0203CE58.pocket - 2;
+ if (temp > 1)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void bag_menu_swap_items(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ ListMenuSetUnkIndicatorsStructField(data[0], 16, 1);
+ data[1] = gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket] + gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+ gUnknown_0203CE54->unk81A = data[1];
+ CopyItemName(BagGetItemIdByPocketPosition(gUnknown_0203CE58.pocket + 1, data[1]), gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_MoveVar1Where);
+ FillWindowPixelBuffer(1, 0);
+ bag_menu_print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0);
+ sub_80D4FEC(data[1]);
+ sub_81AB89C();
+ bag_menu_print_cursor_(data[0], 2);
+ gTasks[taskId].func = sub_81AC3C0;
+}
+
+void sub_81AC3C0(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ int r7;
+
+ if (sub_81221EC() != TRUE)
+ {
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ ListMenuGetScrollAndRow(data[0], &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket], &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]);
+ sub_81AC498(taskId);
+ }
+ else
+ {
+ r7 = ListMenuHandleInputGetItemId(data[0]);
+ ListMenuGetScrollAndRow(data[0], &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket], &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]);
+ sub_80D4FC8(0);
+ sub_80D4FEC(gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]);
+ switch (r7)
+ {
+ case -1:
+ break;
+ case -2:
+ PlaySE(SE_SELECT);
+ if (gMain.newKeys & A_BUTTON)
+ sub_81AC498(taskId);
+ else
+ sub_81AC590(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sub_81AC498(taskId);
+ }
+ }
+ }
+}
+
+void sub_81AC498(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16* scrollPos = &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket];
+ u16* cursorPos = &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+ u16 realPos = (*scrollPos + *cursorPos);
+
+ if (data[1] == realPos || data[1] == (realPos - 1))
+ sub_81AC590(taskId);
+ else
+ {
+ MoveItemSlotInList(gBagPockets[gUnknown_0203CE58.pocket].itemSlots, data[1], realPos);
+ gUnknown_0203CE54->unk81A = -1;
+ DestroyListMenuTask(data[0], scrollPos, cursorPos);
+ if (data[1] < realPos)
+ gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]--;
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos);
+ sub_80D4FC8(1);
+ bag_menu_add_list_scroll_arrow_indicators_maybe();
+ gTasks[taskId].func = Task_BagMenu;
+ }
+}
+
+void sub_81AC590(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16* scrollPos = &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket];
+ u16* cursorPos = &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+
+ gUnknown_0203CE54->unk81A = -1;
+ DestroyListMenuTask(data[0], scrollPos, cursorPos);
+ if (data[1] < (*scrollPos + *cursorPos))
+ gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]--;
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos);
+ sub_80D4FC8(1);
+ bag_menu_add_list_scroll_arrow_indicators_maybe();
+ gTasks[taskId].func = Task_BagMenu;
+}
+
+void sub_81AC644(u8 unused)
+{
+ switch (gUnknown_0203CE58.location - 1)
+ {
+ case 0:
+ case 9:
+ if (ItemId_GetBattleUsage(gSpecialVar_ItemId))
+ {
+ gUnknown_0203CE54->unk820 = gUnknown_08614042;
+ gUnknown_0203CE54->unk828 = 2;
+ }
+ else
+ {
+ gUnknown_0203CE54->unk820 = &gUnknown_08614046;
+ gUnknown_0203CE54->unk828 = 1;
+ }
+ break;
+ case 4:
+ gUnknown_0203CE54->unk820 = gUnknown_08614047;
+ gUnknown_0203CE54->unk828 = 4;
+ break;
+ case 8:
+ if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY)
+ {
+ gUnknown_0203CE54->unk820 = gUnknown_0861404B;
+ gUnknown_0203CE54->unk828 = 2;
+ }
+ else
+ {
+ gUnknown_0203CE54->unk820 = &gUnknown_08614046;
+ gUnknown_0203CE54->unk828 = 1;
+ }
+ break;
+ case 6:
+ if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY)
+ {
+ gUnknown_0203CE54->unk820 = gUnknown_0861404D;
+ gUnknown_0203CE54->unk828 = 2;
+ }
+ else
+ {
+ gUnknown_0203CE54->unk820 = &gUnknown_08614046;
+ gUnknown_0203CE54->unk828 = 1;
+ }
+ break;
+ case 7:
+ if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY)
+ {
+ gUnknown_0203CE54->unk820 = gUnknown_0861404F;
+ gUnknown_0203CE54->unk828 = 2;
+ }
+ else
+ {
+ gUnknown_0203CE54->unk820 = &gUnknown_08614046;
+ gUnknown_0203CE54->unk828 = 1;
+ }
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 5:
+ default:
+ if (sub_81221AC() == TRUE || InUnionRoom() == TRUE)
+ {
+ if (gUnknown_0203CE58.pocket == 4 || !sub_8122148(gSpecialVar_ItemId))
+ {
+ gUnknown_0203CE54->unk820 = &gUnknown_08614046;
+ gUnknown_0203CE54->unk828 = 1;
+ }
+ else
+ {
+ gUnknown_0203CE54->unk820 = gUnknown_08614044;
+ gUnknown_0203CE54->unk828 = 2;
+ }
+ }
+ else
+ {
+ switch (gUnknown_0203CE58.pocket)
+ {
+ case 0:
+ gUnknown_0203CE54->unk820 = &gUnknown_0203CE54->unk824;
+ gUnknown_0203CE54->unk828 = 4;
+ memcpy(&gUnknown_0203CE54->unk824, &gUnknown_0861402C, 4);
+ if (ItemIsMail(gSpecialVar_ItemId) == TRUE)
+ gUnknown_0203CE54->unk824 = 6;
+ break;
+ case 4:
+ gUnknown_0203CE54->unk820 = &gUnknown_0203CE54->unk824;
+ gUnknown_0203CE54->unk828 = 4;
+ memcpy(&gUnknown_0203CE54->unk824, &gUnknown_08614030, 4);
+ if (gSaveBlock1Ptr->registeredItem == gSpecialVar_ItemId)
+ gUnknown_0203CE54->unk825 = 8;
+ if (gSpecialVar_ItemId == ITEM_MACH_BIKE || gSpecialVar_ItemId == ITEM_ACRO_BIKE)
+ {
+ if (TestPlayerAvatarFlags(6))
+ gUnknown_0203CE54->unk824 = 7;
+ }
+ break;
+ case 1:
+ gUnknown_0203CE54->unk820 = gUnknown_08614034;
+ gUnknown_0203CE54->unk828 = 4;
+ break;
+ case 2:
+ gUnknown_0203CE54->unk820 = gUnknown_08614038;
+ gUnknown_0203CE54->unk828 = 4;
+ break;
+ case 3:
+ gUnknown_0203CE54->unk820 = gUnknown_0861403C;
+ gUnknown_0203CE54->unk828 = 6;
+ break;
+ }
+ }
+ }
+ if (gUnknown_0203CE58.pocket == 2)
+ {
+ ClearWindowTilemap(1);
+ PrintTMHMMoveData(gSpecialVar_ItemId);
+ PutWindowTilemap(3);
+ PutWindowTilemap(4);
+ schedule_bg_copy_tilemap_to_vram(0);
+ }
+ else
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);
+ FillWindowPixelBuffer(1, 0);
+ bag_menu_print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0);
+ }
+ if (gUnknown_0203CE54->unk828 == 1)
+ sub_81ACAF8(bag_menu_add_window(0));
+ else if (gUnknown_0203CE54->unk828 == 2)
+ sub_81ACAF8(bag_menu_add_window(1));
+ else if (gUnknown_0203CE54->unk828 == 4)
+ sub_81ACB54(bag_menu_add_window(2), 2, 2);
+ else
+ sub_81ACB54(bag_menu_add_window(3), 2, 3);
+}
+
+void sub_81ACAF8(u8 a)
+{
+ AddItemMenuActionTextPrinters(a, 7, 8, 1, 0, 16, gUnknown_0203CE54->unk828, gUnknown_08613FB4, gUnknown_0203CE54->unk820);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(a, gUnknown_0203CE54->unk828, 0);
+}
+
+void sub_81ACB54(u8 a, u8 b, u8 c)
+{
+ sub_8198DBC(a, 7, 8, 1, 0x38, b, c, gUnknown_08613FB4, gUnknown_0203CE54->unk820);
+ sub_8199944(a, 0x38, b, c, 0);
+}
+
+void unknown_item_menu_type(u8 taskId)
+{
+ sub_81AC644(taskId);
+ if (gUnknown_0203CE54->unk828 <= 2)
+ gTasks[taskId].func = Task_HandleInBattleItemMenuInput;
+ else
+ gTasks[taskId].func = Task_HandleOutOfBattleItemMenuInput;
+}
+
+void Task_HandleInBattleItemMenuInput(u8 taskId)
+{
+ if (sub_81221EC() != TRUE)
+ {
+ s8 r4 = ProcessMenuInputNoWrapAround();
+ switch (r4)
+ {
+ case -2:
+ break;
+ case -1:
+ PlaySE(SE_SELECT);
+ gUnknown_08613FB4[4].func.void_u8(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ gUnknown_08613FB4[gUnknown_0203CE54->unk820[r4]].func.void_u8(taskId);
+ break;
+ }
+ }
+}
+
+void Task_HandleOutOfBattleItemMenuInput(u8 taskId)
+{
+ if (sub_81221EC() != TRUE)
+ {
+ s8 cursorPos = GetMenuCursorPos();
+ if (gMain.newKeys & DPAD_UP)
+ {
+ if (cursorPos > 0 && sub_81ACDFC(cursorPos - 2))
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(0, -1);
+ }
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ if (cursorPos < (gUnknown_0203CE54->unk828 - 2) && sub_81ACDFC(cursorPos + 2))
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(0, 1);
+ }
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) || GetLRKeysState() == 1)
+ {
+ if ((cursorPos & 1) && sub_81ACDFC(cursorPos - 1))
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(-1, 0);
+ }
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) || GetLRKeysState() == 2)
+ {
+ if (!(cursorPos & 1) && sub_81ACDFC(cursorPos + 1))
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(1, 0);
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_08613FB4[gUnknown_0203CE54->unk820[cursorPos]].func.void_u8(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_08613FB4[4].func.void_u8(taskId);
+ }
+ }
+}
+
+bool8 sub_81ACDFC(s8 a)
+{
+ if (a < 0)
+ return FALSE;
+ if (a > gUnknown_0203CE54->unk828)
+ return FALSE;
+ if (gUnknown_0203CE54->unk820[a] == 14)
+ return FALSE;
+ return TRUE;
+}
+
+void bag_menu_remove_some_window(void)
+{
+ if (gUnknown_0203CE54->unk828 == 1)
+ bag_menu_remove_window(0);
+ else if (gUnknown_0203CE54->unk828 == 2)
+ {
+ bag_menu_remove_window(1);
+ }
+ else if (gUnknown_0203CE54->unk828 == 4)
+ {
+ bag_menu_remove_window(2);
+ }
+ else
+ bag_menu_remove_window(3);
+}
+
+void ItemMenu_UseOutOfBattle(u8 taskId)
+{
+ if (ItemId_GetFieldFunc(gSpecialVar_ItemId))
+ {
+ bag_menu_remove_some_window();
+ if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1)
+ bag_menu_print_there_is_no_pokemon(taskId);
+ else
+ {
+ FillWindowPixelBuffer(1, 0);
+ schedule_bg_copy_tilemap_to_vram(0);
+ if (gUnknown_0203CE58.pocket != 3)
+ ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
+ else
+ sub_80FDD10(taskId);
+ }
+ }
+}
+
+void ItemMenu_Toss(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ bag_menu_remove_some_window();
+ data[8] = 1;
+ if (data[2] == 1)
+ {
+ BagMenuConfirmToss(taskId);
+ }
+ else
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_TossHowManyVar1s);
+ FillWindowPixelBuffer(1, 0);
+ bag_menu_print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0);
+ sub_81ABC3C(7);
+ gTasks[taskId].func = Task_ChooseHowManyToToss;
+ }
+}
+
+void BagMenuConfirmToss(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[8], 0, 3);
+ StringExpandPlaceholders(gStringVar4, gText_ConfirmTossItems);
+ FillWindowPixelBuffer(1, 0);
+ bag_menu_print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0);
+ bag_menu_yes_no(taskId, 5, &gUnknown_08614084);
+}
+
+void BagMenuCancelToss(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ bag_menu_print_description_box_text(data[1]);
+ bag_menu_print_cursor_(data[0], 0);
+ set_callback3_to_bag(taskId);
+}
+
+void Task_ChooseHowManyToToss(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ {
+ sub_81ABC54(gUnknown_0203CE54->unk817, data[8]);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_remove_window(7);
+ BagMenuConfirmToss(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_remove_window(7);
+ BagMenuCancelToss(taskId);
+ }
+}
+
+void BagMenuActuallyToss(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[8], 0, 3);
+ StringExpandPlaceholders(gStringVar4, gText_ThrewAwayVar2Var1s);
+ FillWindowPixelBuffer(1, 0);
+ bag_menu_print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0);
+ gTasks[taskId].func = Task_ActuallyToss;
+}
+
+void Task_ActuallyToss(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16* scrollPos = &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket];
+ u16* cursorPos = &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ RemoveBagItem(gSpecialVar_ItemId, data[8]);
+ DestroyListMenuTask(data[0], scrollPos, cursorPos);
+ sub_81AB9A8(gUnknown_0203CE58.pocket);
+ sub_81ABA88(gUnknown_0203CE58.pocket);
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos);
+ schedule_bg_copy_tilemap_to_vram(0);
+ set_callback3_to_bag(taskId);
+ }
+}
+
+void ItemMenu_Register(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16* scrollPos = &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket];
+ u16* cursorPos = &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+
+ if (gSaveBlock1Ptr->registeredItem == gSpecialVar_ItemId)
+ gSaveBlock1Ptr->registeredItem = 0;
+ else
+ gSaveBlock1Ptr->registeredItem = gSpecialVar_ItemId;
+ DestroyListMenuTask(data[0], scrollPos, cursorPos);
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos);
+ schedule_bg_copy_tilemap_to_vram(0);
+ ItemMenu_Cancel(taskId);
+}
+
+void ItemMenu_Give(u8 taskId)
+{
+ bag_menu_remove_some_window();
+ if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
+ {
+ DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350);
+ }
+ else if (!ItemId_GetImportance(gSpecialVar_ItemId))
+ {
+ if (CalculatePlayerPartyCount() == 0)
+ bag_menu_print_there_is_no_pokemon(taskId);
+ else
+ {
+ gUnknown_0203CE54->unk0 = sub_81B7F60;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ }
+ else
+ {
+ bag_menu_print_cant_be_held_msg(taskId);
+ }
+}
+
+void bag_menu_print_there_is_no_pokemon(u8 taskId)
+{
+ DisplayItemMessage(taskId, 1, gText_NoPokemon, sub_81AD350);
+}
+
+void bag_menu_print_cant_be_held_msg(u8 taskId)
+{
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeld);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD350);
+}
+
+void sub_81AD350(u8 taskId)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_inits_lists_menu(taskId);
+ }
+}
+
+void ItemMenu_CheckTag(u8 taskId)
+{
+ gUnknown_0203CE54->unk0 = DoBerryTagScreen;
+ unknown_ItemMenu_Confirm(taskId);
+}
+
+void ItemMenu_Cancel(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ bag_menu_remove_some_window();
+ bag_menu_print_description_box_text(data[1]);
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ bag_menu_print_cursor_(data[0], 0);
+ set_callback3_to_bag(taskId);
+}
+
+void ItemMenu_UseInBattle(u8 taskId)
+{
+ if (ItemId_GetBattleFunc(gSpecialVar_ItemId))
+ {
+ bag_menu_remove_some_window();
+ ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);
+ }
+}
+
+void bag_menu_mail_related(void)
+{
+ GoToBagMenu(12, 5, NULL);
+}
+
+void item_menu_type_2(u8 taskId)
+{
+ if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
+ {
+ DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350);
+ }
+ else if (!sub_8122148(gSpecialVar_ItemId))
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeldHere);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD350);
+ }
+ else if (gUnknown_0203CE58.pocket != 4 && !ItemId_GetImportance(gSpecialVar_ItemId))
+ {
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ bag_menu_print_cant_be_held_msg(taskId);
+ }
+}
+
+void item_menu_type_b(u8 taskId)
+{
+ if (ItemIsMail(gSpecialVar_ItemId) == TRUE)
+ DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350);
+ else if (gUnknown_0203CE58.pocket != 4 && !ItemId_GetImportance(gSpecialVar_ItemId))
+ gTasks[taskId].func = unknown_ItemMenu_Confirm;
+ else
+ bag_menu_print_cant_be_held_msg(taskId);
+}
+
+bool8 UseRegisteredKeyItemOnField(void)
+{
+ u8 taskId;
+
+ if (InUnionRoom() == TRUE || InBattlePyramid() || InBattlePike() || InMultiBattleRoom() == TRUE)
+ return FALSE;
+ HideMapNamePopUpWindow();
+ ChangeBgY_ScreenOff(0, 0, 0);
+ if (gSaveBlock1Ptr->registeredItem != ITEM_NONE)
+ {
+ if (CheckBagHasItem(gSaveBlock1Ptr->registeredItem, 1) == TRUE)
+ {
+ ScriptContext2_Enable();
+ FreezeEventObjects();
+ sub_808B864();
+ sub_808BCF4();
+ gSpecialVar_ItemId = gSaveBlock1Ptr->registeredItem;
+ taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1Ptr->registeredItem), 8);
+ gTasks[taskId].data[3] = 1;
+ return TRUE;
+ }
+ else
+ gSaveBlock1Ptr->registeredItem = ITEM_NONE;
+ }
+ ScriptContext1_SetupScript(EventScript_2736B3);
+ return TRUE;
+}
+
+void display_sell_item_ask_str(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (ItemId_GetPrice(gSpecialVar_ItemId) == 0)
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gText_CantBuyKeyItem);
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ }
+ else
+ {
+ data[8] = 1;
+ if (data[2] == 1)
+ {
+ bag_menu_AddMoney_window();
+ sub_81AD680(taskId);
+ }
+ else
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gText_HowManyToSell);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD730);
+ }
+ }
+}
+
+void sub_81AD680(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ ConvertIntToDecimalStringN(gStringVar1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8], 0, 6);
+ StringExpandPlaceholders(gStringVar4, gText_ICanPayVar1);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD6E4);
+}
+
+void sub_81AD6E4(u8 taskId)
+{
+ bag_menu_yes_no(taskId, 6, &gUnknown_0861408C);
+}
+
+void sub_81AD6FC(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ bag_menu_remove_money_window();
+ bag_menu_RemoveBagItem_message_window(4);
+ bag_menu_print_cursor_(data[0], 0);
+ set_callback3_to_bag(taskId);
+}
+
+void sub_81AD730(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u8 windowId = bag_menu_add_window(8);
+
+ sub_81ABCC0(windowId, 1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8]);
+ bag_menu_AddMoney_window();
+ gTasks[taskId].func = sub_81AD794;
+}
+
+void sub_81AD794(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ {
+ sub_81ABCC0(gUnknown_0203CE54->unk818, data[8], (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8]);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_remove_window(8);
+ sub_81AD680(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_print_cursor_(data[0], 0);
+ bag_menu_remove_money_window();
+ bag_menu_remove_window(8);
+ bag_menu_RemoveBagItem_message_window(4);
+ set_callback3_to_bag(taskId);
+ }
+}
+
+void sub_81AD84C(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ ConvertIntToDecimalStringN(gStringVar1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8], 0, 6);
+ StringExpandPlaceholders(gStringVar4, gText_TurnedOverVar1ForVar2);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD8C8);
+}
+
+void sub_81AD8C8(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16* scrollPos = &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket];
+ u16* cursorPos = &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket];
+
+ PlaySE(SE_REGI);
+ RemoveBagItem(gSpecialVar_ItemId, data[8]);
+ AddMoney(&gSaveBlock1Ptr->money, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8]);
+ DestroyListMenuTask(data[0], scrollPos, cursorPos);
+ sub_81AB9A8(gUnknown_0203CE58.pocket);
+ sub_81ABA88(gUnknown_0203CE58.pocket);
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos);
+ bag_menu_print_cursor_(data[0], 2);
+ PrintMoneyAmountInMoneyBox(gUnknown_0203CE54->unk819, GetMoney(&gSaveBlock1Ptr->money), 0);
+ gTasks[taskId].func = sub_81AD9C0;
+}
+
+void sub_81AD9C0(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_remove_money_window();
+ bag_menu_inits_lists_menu(taskId);
+ }
+}
+
+void display_deposit_item_ask_str(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ data[8] = 1;
+ if (data[2] == 1)
+ {
+ sub_81ADB14(taskId);
+ }
+ else
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_DepositHowManyVar1);
+ FillWindowPixelBuffer(1, 0);
+ bag_menu_print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0);
+ sub_81ABC3C(7);
+ gTasks[taskId].func = sub_81ADA7C;
+ }
+}
+
+void sub_81ADA7C(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ {
+ sub_81ABC54(gUnknown_0203CE54->unk817, data[8]);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_remove_window(7);
+ sub_81ADB14(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_print_description_box_text(data[1]);
+ bag_menu_print_cursor_(data[0], 0);
+ bag_menu_remove_window(7);
+ set_callback3_to_bag(taskId);
+ }
+}
+
+void sub_81ADB14(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ FillWindowPixelBuffer(1, 0);
+ if (ItemId_GetImportance(gSpecialVar_ItemId))
+ {
+ bag_menu_print(1, 1, gText_CantStoreImportantItems, 3, 1, 0, 0, 0, 0);
+ gTasks[taskId].func = sub_81ADC0C;
+ }
+ else if (AddPCItem(gSpecialVar_ItemId, data[8]) == TRUE)
+ {
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[8], 0, 3);
+ StringExpandPlaceholders(gStringVar4, gText_DepositedVar2Var1s);
+ bag_menu_print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0);
+ gTasks[taskId].func = Task_ActuallyToss;
+ }
+ else
+ {
+ bag_menu_print(1, 1, gText_NoRoomForItems, 3, 1, 0, 0, 0, 0);
+ gTasks[taskId].func = sub_81ADC0C;
+ }
+}
+
+void sub_81ADC0C(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ bag_menu_print_description_box_text(data[1]);
+ bag_menu_print_cursor_(data[0], 0);
+ set_callback3_to_bag(taskId);
+ }
+}
+
+bool8 IsWallysBag(void)
+{
+ if (gUnknown_0203CE58.location == 10)
+ return TRUE;
+ return FALSE;
+}
+
+void PrepareBagForWallyTutorial(void)
+{
+ u32 i;
+
+ gUnknown_0203CE80 = AllocZeroed(sizeof(struct TempWallyStruct));
+ memcpy(gUnknown_0203CE80->bagPocket_Items, gSaveBlock1Ptr->bagPocket_Items, sizeof(gSaveBlock1Ptr->bagPocket_Items));
+ memcpy(gUnknown_0203CE80->bagPocket_PokeBalls, gSaveBlock1Ptr->bagPocket_PokeBalls, sizeof(gSaveBlock1Ptr->bagPocket_PokeBalls));
+ gUnknown_0203CE80->pocket = gUnknown_0203CE58.pocket;
+ for (i = 0; i <= 4; i++)
+ {
+ gUnknown_0203CE80->cursorPosition[i] = gUnknown_0203CE58.cursorPosition[i];
+ gUnknown_0203CE80->scrollPosition[i] = gUnknown_0203CE58.scrollPosition[i];
+ }
+ ClearItemSlots(gSaveBlock1Ptr->bagPocket_Items, 30);
+ ClearItemSlots(gSaveBlock1Ptr->bagPocket_PokeBalls, 16);
+ ResetBagScrollPositions();
+}
+
+void RestoreBagAfterWallyTutorial(void)
+{
+ u32 i;
+
+ memcpy(gSaveBlock1Ptr->bagPocket_Items, gUnknown_0203CE80->bagPocket_Items, sizeof(gUnknown_0203CE80->bagPocket_Items));
+ memcpy(gSaveBlock1Ptr->bagPocket_PokeBalls, gUnknown_0203CE80->bagPocket_PokeBalls, sizeof(gUnknown_0203CE80->bagPocket_PokeBalls));
+ gUnknown_0203CE58.pocket = gUnknown_0203CE80->pocket;
+ for (i = 0; i <= 4; i++)
+ {
+ gUnknown_0203CE58.cursorPosition[i] = gUnknown_0203CE80->cursorPosition[i];
+ gUnknown_0203CE58.scrollPosition[i] = gUnknown_0203CE80->scrollPosition[i];
+ }
+ Free(gUnknown_0203CE80);
+}
+
+void DoWallyTutorialBagMenu(void)
+{
+ PrepareBagForWallyTutorial();
+ AddBagItem(ITEM_POTION, 1);
+ AddBagItem(ITEM_POKE_BALL, 1);
+ GoToBagMenu(10, 0, SetCB2ToReshowScreenAfterMenu2);
+}
+
+void Task_WallyTutorialBagMenu(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (!gPaletteFade.active)
+ {
+ switch (data[8])
+ {
+ case 0x66:
+ PlaySE(SE_SELECT);
+ SwitchBagPocket(taskId, 1, 0);
+ data[8]++;
+ break;
+ case 0xCC:
+ PlaySE(SE_SELECT);
+ bag_menu_print_cursor_(data[0], 2);
+ gSpecialVar_ItemId = ITEM_POKE_BALL;
+ sub_81AC644(taskId);
+ data[8]++;
+ break;
+ case 0x132:
+ PlaySE(SE_SELECT);
+ bag_menu_remove_some_window();
+ DestroyListMenuTask(data[0], 0, 0);
+ RestoreBagAfterWallyTutorial();
+ unknown_ItemMenu_Confirm(taskId);
+ break;
+ default:
+ data[8]++;
+ break;
+ }
+ }
+}
+
+void unknown_ItemMenu_Show(u8 taskId)
+{
+ gSpecialVar_0x8005 = gSpecialVar_ItemId;
+ gSpecialVar_Result = 1;
+ bag_menu_remove_some_window();
+ unknown_ItemMenu_Confirm(taskId);
+}
+
+void bag_menu_leave_maybe_3(void)
+{
+ gFieldCallback = sub_819FA50;
+ SetMainCallback2(CB2_ReturnToField);
+}
+
+void unknown_ItemMenu_Give2(u8 taskId)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ gSpecialVar_Result = 1;
+ bag_menu_remove_some_window();
+ unknown_ItemMenu_Confirm(taskId);
+}
+
+void bag_menu_leave_maybe_2(void)
+{
+ gFieldCallback = sub_818DEF4;
+ SetMainCallback2(CB2_ReturnToField);
+}
+
+void unknown_ItemMenu_Confirm2(u8 taskId)
+{
+ gSpecialVar_Result = 1;
+ bag_menu_remove_some_window();
+ unknown_ItemMenu_Confirm(taskId);
+}
+
+void bag_menu_leave_maybe(void)
+{
+ gFieldCallback = sub_818E564;
+ SetMainCallback2(CB2_ReturnToField);
+}
+
+void bag_menu_print_pocket_names(u8 *pocketName1, u8 *pocketName2)
+{
+ struct WindowTemplate window = {0, 0, 0, 0, 0, 0, 0};
+ u16 windowId;
+ int offset;
+
+ window.width = 16;
+ window.height = 2;
+ windowId = AddWindow(&window);
+ FillWindowPixelBuffer(windowId, 0);
+ offset = GetStringCenterAlignXOffset(1, pocketName1, 0x40);
+ bag_menu_print(windowId, 1, pocketName1, offset, 1, 0, 0, -1, 1);
+ if (pocketName2)
+ {
+ offset = GetStringCenterAlignXOffset(1, pocketName2, 0x40);
+ bag_menu_print(windowId, 1, pocketName2, offset + 0x40, 1, 0, 0, -1, 1);
+ }
+ CpuCopy32((u8*)GetWindowAttribute(windowId, WINDOW_TILE_DATA), gUnknown_0203CE54->unk844, 0x400);
+ RemoveWindow(windowId);
+}
+
+void bag_menu_copy_pocket_name_to_window(u32 a)
+{
+ u8 (* r4)[32][32];
+ u8* windowAttribute;
+ int b;
+ if (a > 8)
+ a = 8;
+ r4 = &gUnknown_0203CE54->unk844;
+ windowAttribute = (u8*)GetWindowAttribute(2, WINDOW_TILE_DATA);
+ CpuCopy32(r4[0][a], windowAttribute, 0x100);
+ b = a + 16;
+ CpuCopy32(r4[0][b], windowAttribute + 0x100, 0x100);
+ CopyWindowToVram(2, 2);
+}
+
+void setup_bag_menu_textboxes(void)
+{
+ u8 i;
+
+ InitWindows(gUnknown_08614174);
+ DeactivateAllTextPrinters();
+ LoadUserWindowBorderGfx(0, 1, -32);
+ LoadMessageBoxGfx(0, 10, -48);
+ sub_819A2BC(-64, 1);
+ LoadPalette(&gUnknown_0860F074, 0xF0, 0x20);
+ for (i = 0; i < 3; i++)
+ {
+ FillWindowPixelBuffer(i, 0);
+ PutWindowTilemap(i);
+ }
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+void bag_menu_print(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 h)
+{
+ AddTextPrinterParameterized2(windowId, fontId, left, top, letterSpacing, lineSpacing, gUnknown_08614164[h], speed, str);
+}
+
+u8 sub_81AE124(u8 a)
+{
+ return gUnknown_0203CE54->unk810[a];
+}
+
+u8 bag_menu_add_window(u8 a)
+{
+ u8 *ptr = &gUnknown_0203CE54->unk810[a];
+ if (*ptr == 0xFF)
+ {
+ *ptr = AddWindow(&gUnknown_086141AC[a]);
+ SetWindowBorderStyle(*ptr, 0, 1, 14);
+ schedule_bg_copy_tilemap_to_vram(1);
+ }
+ return *ptr;
+}
+
+void bag_menu_remove_window(u8 a)
+{
+ u8 *ptr = &gUnknown_0203CE54->unk810[a];
+ if (*ptr != 0xFF)
+ {
+ sub_8198070(*ptr, 0);
+ ClearWindowTilemap(*ptr);
+ RemoveWindow(*ptr);
+ schedule_bg_copy_tilemap_to_vram(1);
+ *ptr = 0xFF;
+ }
+}
+
+u8 AddItemMessageWindow(u8 a)
+{
+ u8 *ptr = &gUnknown_0203CE54->unk810[a];
+ if (*ptr == 0xFF)
+ *ptr = AddWindow(&gUnknown_086141AC[a]);
+ return *ptr;
+}
+
+void bag_menu_RemoveBagItem_message_window(u8 a)
+{
+ u8 *ptr = &gUnknown_0203CE54->unk810[a];
+ if (*ptr != 0xFF)
+ {
+ sub_8197DF8(*ptr, 0);
+ ClearWindowTilemap(*ptr);
+ RemoveWindow(*ptr);
+ schedule_bg_copy_tilemap_to_vram(1);
+ *ptr = 0xFF;
+ }
+}
+
+void bag_menu_yes_no(u8 a, u8 b, const struct YesNoFuncTable *funcTable)
+{
+ CreateYesNoMenuWithCallbacks(a, &gUnknown_086141AC[b], 1, 0, 2, 1, 14, funcTable);
+}
+
+void bag_menu_AddMoney_window(void)
+{
+ u8 windowId = bag_menu_add_window(9);
+ PrintMoneyAmountInMoneyBoxWithBorder(windowId, 1, 14, GetMoney(&gSaveBlock1Ptr->money));
+ AddMoneyLabelObject(19, 11);
+}
+
+void bag_menu_remove_money_window(void)
+{
+ bag_menu_remove_window(9);
+ RemoveMoneyLabelObject();
+}
+
+void bag_menu_prepare_tmhm_move_window(void)
+{
+ FillWindowPixelBuffer(3, 0);
+ blit_move_info_icon(3, 19, 0, 0);
+ blit_move_info_icon(3, 20, 0, 12);
+ blit_move_info_icon(3, 21, 0, 24);
+ blit_move_info_icon(3, 22, 0, 36);
+ CopyWindowToVram(3, 2);
+}
+
+void PrintTMHMMoveData(u16 itemId)
+{
+ u8 i;
+ u16 moveId;
+ const u8* text;
+
+ FillWindowPixelBuffer(4, 0);
+ if (itemId == ITEM_NONE)
+ {
+ for (i = 0; i < 4; i++)
+ bag_menu_print(4, 1, gText_ThreeDashes, 7, i * 12, 0, 0, -1, 4);
+ CopyWindowToVram(4, 2);
+ }
+ else
+ {
+ moveId = ItemIdToBattleMoveId(itemId);
+ blit_move_info_icon(4, gBattleMoves[moveId].type + 1, 0, 0);
+ if (gBattleMoves[moveId].power <= 1)
+ {
+ text = gText_ThreeDashes;
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[moveId].power, 1, 3);
+ text = gStringVar1;
+ }
+ bag_menu_print(4, 1, text, 7, 12, 0, 0, -1, 4);
+ if (gBattleMoves[moveId].accuracy == 0)
+ {
+ text = gText_ThreeDashes;
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[moveId].accuracy, 1, 3);
+ text = gStringVar1;
+ }
+ bag_menu_print(4, 1, text, 7, 24, 0, 0, -1, 4);
+ ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[moveId].pp, 1, 3);
+ bag_menu_print(4, 1, gStringVar1, 7, 36, 0, 0, -1, 4);
+ CopyWindowToVram(4, 2);
+ }
+}
diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c
new file mode 100644
index 000000000..f12bb454e
--- /dev/null
+++ b/src/item_menu_icons.c
@@ -0,0 +1,684 @@
+#include "global.h"
+#include "sprite.h"
+#include "decompress.h"
+#include "item_menu.h"
+#include "item_icon.h"
+#include "item_menu_icons.h"
+#include "window.h"
+#include "menu_helpers.h"
+#include "berry.h"
+#include "graphics.h"
+#include "constants/items.h"
+#include "item.h"
+#include "item_use.h"
+#include "constants/hold_effects.h"
+
+struct CompressedTilesPal
+{
+ const u8 *tiles;
+ const u8 *pal;
+};
+
+extern void sub_80D5860(struct Sprite *sprite);
+extern void sub_80D58F8(struct Sprite *sprite);
+extern void sub_80D5968(struct Sprite *sprite);
+extern void sub_80D5A94(struct Sprite *sprite);
+extern void sub_80D5B48(struct Sprite *sprite);
+
+// this file's functions
+static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite);
+static void SpriteCB_ShakeBagVisual(struct Sprite *sprite);
+static void SpriteCB_SwitchPocketRotatingBallInit(struct Sprite *sprite);
+static void SpriteCB_SwitchPocketRotatingBallContinue(struct Sprite *sprite);
+
+// static const rom data
+static const u16 gUnknown_0857F564[] = INCBIN_U16("graphics/interface/bag_spinner.gbapal");
+static const u8 gUnknown_0857F584[] = INCBIN_U8("graphics/interface/bag_spinner.4bpp");
+static const u8 gUnknown_0857F604[] = INCBIN_U8("graphics/unused/cherry.4bpp");
+static const u16 gUnknown_0857FA84[] = INCBIN_U16("graphics/unused/cherry.gbapal");
+
+static const struct OamData sOamData_857FAA4 =
+{
+ .y = 0,
+ .affineMode = 1,
+ .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 sSpriteAnim_857FAAC[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_857FAB4[] =
+{
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_857FABC[] =
+{
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_857FAC4[] =
+{
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_857FACC[] =
+{
+ ANIMCMD_FRAME(256, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_857FAD4[] =
+{
+ ANIMCMD_FRAME(320, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_857FADC[] =
+{
+ sSpriteAnim_857FAAC,
+ sSpriteAnim_857FAB4,
+ sSpriteAnim_857FAC4,
+ sSpriteAnim_857FACC,
+ sSpriteAnim_857FAD4,
+ sSpriteAnim_857FABC
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857FAF4[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857FB04[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 254, 2),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 254, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 2),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_857FB2C[] =
+{
+ sSpriteAffineAnim_857FAF4,
+ sSpriteAffineAnim_857FB04
+};
+
+const struct CompressedSpriteSheet gUnknown_0857FB34 =
+{
+ gBagMaleTiles, 0x3000, 100
+};
+
+const struct CompressedSpriteSheet gUnknown_0857FB3C =
+{
+ gBagFemaleTiles, 0x3000, 100
+};
+
+const struct CompressedSpritePalette gUnknown_0857FB44 =
+{
+ gBagPalette, 100
+};
+
+static const struct SpriteTemplate gUnknown_0857FB4C =
+{
+ .tileTag = 100,
+ .paletteTag = 100,
+ .oam = &sOamData_857FAA4,
+ .anims = sSpriteAnimTable_857FADC,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_857FB2C,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_857FB64 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 4,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_857FB6C[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_857FB74[] =
+{
+ sSpriteAnim_857FB6C
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857FB78[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 8, 16),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857FB88[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 248, 16),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_857FB98[] =
+{
+ sSpriteAffineAnim_857FB78,
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_857FB9C[] =
+{
+ sSpriteAffineAnim_857FB88,
+};
+
+static const struct SpriteSheet gUnknown_0857FBA0 =
+{
+ gUnknown_0857F584, 0x80, 101
+};
+
+static const struct SpritePalette gUnknown_0857FBA8 =
+{
+ gUnknown_0857F564, 101
+};
+
+static const struct SpriteTemplate gUnknown_0857FBB0 =
+{
+ .tileTag = 101,
+ .paletteTag = 101,
+ .oam = &sOamData_857FB64,
+ .anims = sSpriteAnimTable_857FB74,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_857FB98,
+ .callback = SpriteCB_SwitchPocketRotatingBallInit,
+};
+
+static const struct OamData sOamData_857FBC8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 7,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_857FBD0 =
+{
+ .y = 0,
+ .affineMode = 3,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 7,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_857FBD8[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_857FBE0[] =
+{
+ sSpriteAnim_857FBD8
+};
+
+static const struct SpriteFrameImage sSpriteImageTable_857FBE4[] =
+{
+ {&gDecompressionBuffer[0], 0x800},
+};
+
+static const struct SpriteTemplate gUnknown_0857FBEC =
+{
+ .tileTag = 65535,
+ .paletteTag = 30020,
+ .oam = &sOamData_857FBC8,
+ .anims = sSpriteAnimTable_857FBE0,
+ .images = sSpriteImageTable_857FBE4,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857FC04[] =
+{
+ AFFINEANIMCMD_FRAME(-1, -1, 253, 96),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 16),
+ AFFINEANIMCMD_FRAME(-2, -2, 255, 64),
+ AFFINEANIMCMD_FRAME(-8, 0, 0, 16),
+ AFFINEANIMCMD_FRAME(0, -8, 0, 16),
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857FC3C[] =
+{
+ AFFINEANIMCMD_FRAME(-1, -1, 3, 96),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 16),
+ AFFINEANIMCMD_FRAME(-2, -2, 1, 64),
+ AFFINEANIMCMD_FRAME(-8, 0, 0, 16),
+ AFFINEANIMCMD_FRAME(0, -8, 0, 16),
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_857FC74[] =
+{
+ sSpriteAffineAnim_857FC04,
+ sSpriteAffineAnim_857FC3C
+};
+
+static const struct SpriteTemplate gUnknown_0857FC7C =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x7544,
+ .oam = &sOamData_857FBD0,
+ .anims = sSpriteAnimTable_857FBE0,
+ .images = sSpriteImageTable_857FBE4,
+ .affineAnims = sSpriteAffineAnimTable_857FC74,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct CompressedTilesPal gBerryPicTable[] =
+{
+ {gBerryPic_Cheri, gBerryPalette_Cheri},
+ {gBerryPic_Chesto, gBerryPalette_Chesto},
+ {gBerryPic_Pecha, gBerryPalette_Pecha},
+ {gBerryPic_Rawst, gBerryPalette_Rawst},
+ {gBerryPic_Aspear, gBerryPalette_Aspear},
+ {gBerryPic_Leppa, gBerryPalette_Leppa},
+ {gBerryPic_Oran, gBerryPalette_Oran},
+ {gBerryPic_Persim, gBerryPalette_Persim},
+ {gBerryPic_Lum, gBerryPalette_Lum},
+ {gBerryPic_Sitrus, gBerryPalette_Sitrus},
+ {gBerryPic_Figy, gBerryPalette_Figy},
+ {gBerryPic_Wiki, gBerryPalette_Wiki},
+ {gBerryPic_Mago, gBerryPalette_Mago},
+ {gBerryPic_Aguav, gBerryPalette_Aguav},
+ {gBerryPic_Iapapa, gBerryPalette_Iapapa},
+ {gBerryPic_Razz, gBerryPalette_Razz},
+ {gBerryPic_Bluk, gBerryPalette_Bluk},
+ {gBerryPic_Nanab, gBerryPalette_Nanab},
+ {gBerryPic_Wepear, gBerryPalette_Wepear},
+ {gBerryPic_Pinap, gBerryPalette_Pinap},
+ {gBerryPic_Pomeg, gBerryPalette_Pomeg},
+ {gBerryPic_Kelpsy, gBerryPalette_Kelpsy},
+ {gBerryPic_Qualot, gBerryPalette_Qualot},
+ {gBerryPic_Hondew, gBerryPalette_Hondew},
+ {gBerryPic_Grepa, gBerryPalette_Grepa},
+ {gBerryPic_Tamato, gBerryPalette_Tamato},
+ {gBerryPic_Cornn, gBerryPalette_Cornn},
+ {gBerryPic_Magost, gBerryPalette_Magost},
+ {gBerryPic_Rabuta, gBerryPalette_Rabuta},
+ {gBerryPic_Nomel, gBerryPalette_Nomel},
+ {gBerryPic_Spelon, gBerryPalette_Spelon},
+ {gBerryPic_Pamtre, gBerryPalette_Pamtre},
+ {gBerryPic_Watmel, gBerryPalette_Watmel},
+ {gBerryPic_Durin, gBerryPalette_Durin},
+ {gBerryPic_Belue, gBerryPalette_Belue},
+ {gBerryPic_Liechi, gBerryPalette_Liechi},
+ {gBerryPic_Ganlon, gBerryPalette_Ganlon},
+ {gBerryPic_Salac, gBerryPalette_Salac},
+ {gBerryPic_Petaya, gBerryPalette_Petaya},
+ {gBerryPic_Apicot, gBerryPalette_Apicot},
+ {gBerryPic_Lansat, gBerryPalette_Lansat},
+ {gBerryPic_Starf, gBerryPalette_Starf},
+ {gBerryPic_Enigma, gBerryPalette_Enigma},
+};
+
+const struct CompressedSpriteSheet gUnknown_0857FDEC =
+{
+ gBerryCheckCircle_Gfx, 0x800, 10000
+};
+
+const struct CompressedSpritePalette gUnknown_0857FDF4 =
+{
+ gUnknown_08D9BEF0, 10000
+};
+
+static const struct OamData sOamData_857FDFC =
+{
+ .y = 0,
+ .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 sSpriteAnim_857FE04[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_857FE0C[] =
+{
+ sSpriteAnim_857FE04
+};
+
+static const struct SpriteTemplate gUnknown_0857FE10 =
+{
+ .tileTag = 10000,
+ .paletteTag = 10000,
+ .oam = &sOamData_857FDFC,
+ .anims = sSpriteAnimTable_857FE0C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct SpriteTemplate gUnknown_0857FE28 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80D5860,
+};
+
+const struct SpriteTemplate gUnknown_0857FE40 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80D58F8,
+};
+
+const struct SpriteTemplate gUnknown_0857FE58 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80D5968,
+};
+
+const struct SpriteTemplate gUnknown_0857FE70 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80D5A94,
+};
+
+const struct SpriteTemplate gUnknown_0857FE88 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80D5B48,
+};
+
+#include "data/text/item_descriptions.h"
+#include "data/items.h"
+
+// code
+void RemoveBagSprite(u8 id)
+{
+ u8 *spriteId = &gUnknown_0203CE54->unk804[id];
+ if (*spriteId != 0xFF)
+ {
+ FreeSpriteTilesByTag(id + 100);
+ FreeSpritePaletteByTag(id + 100);
+ FreeSpriteOamMatrix(&gSprites[*spriteId]);
+ DestroySprite(&gSprites[*spriteId]);
+ *spriteId = 0xFF;
+ }
+}
+
+void AddBagVisualSprite(u8 bagPocketId)
+{
+ u8 *spriteId = &gUnknown_0203CE54->unk804[0];
+ *spriteId = CreateSprite(&gUnknown_0857FB4C, 68, 66, 0);
+ SetBagVisualPocketId(bagPocketId, FALSE);
+}
+
+void SetBagVisualPocketId(u8 bagPocketId, bool8 isSwitchingPockets)
+{
+ struct Sprite *sprite = &gSprites[gUnknown_0203CE54->unk804[0]];
+ if (isSwitchingPockets)
+ {
+ sprite->pos2.y = -5;
+ sprite->callback = SpriteCB_BagVisualSwitchingPockets;
+ sprite->data[0] = bagPocketId + 1;
+ StartSpriteAnim(sprite, 0);
+ }
+ else
+ {
+ StartSpriteAnim(sprite, bagPocketId + 1);
+ }
+}
+
+static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite)
+{
+ if (sprite->pos2.y != 0)
+ {
+ sprite->pos2.y++;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, sprite->data[0]);
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+void ShakeBagVisual(void)
+{
+ struct Sprite *sprite = &gSprites[gUnknown_0203CE54->unk804[0]];
+ if (sprite->affineAnimEnded)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = SpriteCB_ShakeBagVisual;
+ }
+}
+
+static void SpriteCB_ShakeBagVisual(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ StartSpriteAffineAnim(sprite, 0);
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+void AddSwitchPocketRotatingBallSprite(s16 rotationDirection)
+{
+ u8 *spriteId = &gUnknown_0203CE54->unk804[1];
+ LoadSpriteSheet(&gUnknown_0857FBA0);
+ LoadSpritePalette(&gUnknown_0857FBA8);
+ *spriteId = CreateSprite(&gUnknown_0857FBB0, 16, 16, 0);
+ gSprites[*spriteId].data[0] = rotationDirection;
+}
+
+static void update_switch_pocket_rotating_ball_coords(struct Sprite *sprite)
+{
+ sprite->centerToCornerVecX = sprite->data[1] - ((sprite->data[3] + 1) & 1);
+ sprite->centerToCornerVecY = sprite->data[1] - ((sprite->data[3] + 1) & 1);
+}
+
+static void SpriteCB_SwitchPocketRotatingBallInit(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 1;
+ if (sprite->data[0] == -1)
+ sprite->affineAnims = sSpriteAffineAnimTable_857FB98;
+ else
+ sprite->affineAnims = sSpriteAffineAnimTable_857FB9C;
+
+ InitSpriteAffineAnim(sprite);
+ sprite->data[1] = sprite->centerToCornerVecX;
+ sprite->data[1] = sprite->centerToCornerVecY;
+ update_switch_pocket_rotating_ball_coords(sprite);
+ sprite->callback = SpriteCB_SwitchPocketRotatingBallContinue;
+}
+
+static void SpriteCB_SwitchPocketRotatingBallContinue(struct Sprite *sprite)
+{
+ sprite->data[3]++;
+ update_switch_pocket_rotating_ball_coords(sprite);
+ if (sprite->data[3] == 16)
+ RemoveBagSprite(1);
+}
+
+void AddBagItemIconSprite(u16 itemId, u8 id)
+{
+ u8 *spriteId = &gUnknown_0203CE54->unk804[id + 2];
+ if (*spriteId == 0xFF)
+ {
+ u8 iconSpriteId;
+
+ FreeSpriteTilesByTag(id + 102);
+ FreeSpritePaletteByTag(id + 102);
+ iconSpriteId = AddItemIconSprite(id + 102, id + 102, itemId);
+ if (iconSpriteId != MAX_SPRITES)
+ {
+ *spriteId = iconSpriteId;
+ gSprites[iconSpriteId].pos2.x = 24;
+ gSprites[iconSpriteId].pos2.y = 88;
+ }
+ }
+}
+
+void RemoveBagItemIconSprite(u8 id)
+{
+ RemoveBagSprite(id + 2);
+}
+
+void sub_80D4FAC(void)
+{
+ sub_8122344(&gUnknown_0203CE54->unk804[4], 8);
+}
+
+void sub_80D4FC8(u8 arg0)
+{
+ sub_81223FC(&gUnknown_0203CE54->unk804[4], 8, arg0);
+}
+
+void sub_80D4FEC(u8 arg0)
+{
+ sub_8122448(&gUnknown_0203CE54->unk804[4], 136, 120, (arg0 + 1) * 16);
+}
+
+static void sub_80D5018(void *mem0, void *mem1)
+{
+ u8 i, j;
+
+ memset(mem1, 0, 0x800);
+ mem1 += 0x100;
+ for (i = 0; i < 6; i++)
+ {
+ mem1 += 0x20;
+ for (j = 0; j < 6; j++)
+ {
+ memcpy(mem1, mem0, 0x20);
+ mem1 += 0x20;
+ mem0 += 0x20;
+ }
+ if (i != 5)
+ mem1 += 0x20;
+ }
+}
+
+static void sub_80D5070(u8 berryId)
+{
+ struct CompressedSpritePalette pal;
+
+ if (berryId == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) - 1 && IsEnigmaBerryValid())
+ {
+ // unknown empty if statement
+ }
+
+ pal.data = gBerryPicTable[berryId].pal;
+ pal.tag = 0x7544;
+ LoadCompressedObjectPalette(&pal);
+ LZDecompressWram(gBerryPicTable[berryId].tiles, &gDecompressionBuffer[0x1000]);
+ sub_80D5018(&gDecompressionBuffer[0x1000], &gDecompressionBuffer[0]);
+}
+
+u8 CreateBerryTagSprite(u8 id, s16 x, s16 y)
+{
+ sub_80D5070(id);
+ return CreateSprite(&gUnknown_0857FBEC, x, y, 0);
+}
+
+void FreeBerryTagSpritePalette(void)
+{
+ FreeSpritePaletteByTag(0x7544);
+}
+
+u8 sub_80D511C(u8 berryId, u8 x, u8 y, bool8 startAffine)
+{
+ u8 spriteId;
+
+ FreeSpritePaletteByTag(0x7544);
+ sub_80D5070(berryId);
+ spriteId = CreateSprite(&gUnknown_0857FC7C, x, y, 0);
+ if (startAffine == TRUE)
+ StartSpriteAffineAnim(&gSprites[spriteId], 1);
+
+ return spriteId;
+}
+
+u8 CreateBerryFlavorCircleSprite(s16 x)
+{
+ return CreateSprite(&gUnknown_0857FE10, x, 116, 0);
+}
diff --git a/src/item_use.c b/src/item_use.c
new file mode 100755
index 000000000..9031338dd
--- /dev/null
+++ b/src/item_use.c
@@ -0,0 +1,1122 @@
+#include "global.h"
+#include "item_use.h"
+#include "battle.h"
+#include "main.h"
+#include "berry.h"
+#include "bike.h"
+#include "coins.h"
+#include "constants/bg_event_constants.h"
+#include "constants/flags.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "constants/vars.h"
+#include "data2.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "field_screen.h"
+#include "field_weather.h"
+#include "item.h"
+#include "mail.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "rom_818CFC8.h"
+#include "script.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+
+extern void(**gUnknown_0203CE54)(void);
+extern void(**gUnknown_0203CF2C)(void);
+extern void(*gUnknown_0203A0F4)(u8 taskId);
+extern void(*gUnknown_085920D8[])(void);
+extern void (*gUnknown_03006328)(u8, u16, TaskFunc);
+extern void unknown_ItemMenu_Confirm(u8 taskId);
+extern void sub_81C5B14(u8 taskId);
+extern u8 gText_DadsAdvice[];
+extern u8 gText_CantDismountBike[];
+extern void sub_8197434(u8 a, u8 b);
+extern void ScriptUnfreezeEventObjects(void);
+extern void ItemUseOutOfBattle_TMHM(u8 a);
+extern void ItemUseOutOfBattle_EvolutionStone(u8 b);
+extern void bag_menu_mail_related(void);
+extern void OpenPokeblockCase(u8 a, void(*b)(void));
+extern void overworld_free_bg_tilemaps(void);
+extern bool32 Overworld_IsBikingAllowed(void);
+extern bool8 IsPlayerFacingSurfableFishableWater(void);
+extern bool8 sub_81221AC(void);
+extern u8 gText_ItemFinderNothing[];
+extern u8 gText_ItemFinderNearby[];
+extern u8 gText_ItemFinderOnTop[];
+extern u8 gText_CoinCase[];
+extern u8 gText_PowderQty[];
+extern u8 gUnknown_085920E4[];
+extern u8 Route102_EventScript_274482[];
+extern u8 Route102_EventScript_2744C0[];
+extern u8 BattleFrontier_OutsideEast_EventScript_242CFC[];
+extern u8 gText_BootedUpHM[];
+extern u8 gText_BootedUpTM[];
+extern u8 gText_TMHMContainedVar1[];
+extern u8 gText_PlayerUsedVar2[];
+extern u8 gText_RepelEffectsLingered[];
+extern u8 gText_UsedVar2WildLured[];
+extern u8 gText_UsedVar2WildRepelled[];
+extern u8 gText_BoxFull[];
+extern u8 gText_WontHaveEffect[];
+extern int sub_80247BC(void);
+extern struct MapHeader* mapconnection_get_mapheader(struct MapConnection *connection);
+extern void SetUpItemUseCallback(u8 taskId);
+extern void ItemUseCB_Medicine(u8, u16, TaskFunc);
+extern void sub_81B67C8(u8, u16, TaskFunc);
+extern void sub_81B79E8(u8, u16, TaskFunc);
+extern void dp05_ether(u8, u16, TaskFunc);
+extern void dp05_pp_up(u8, u16, TaskFunc);
+extern void dp05_rare_candy(u8, u16, TaskFunc);
+extern void sub_81B6DC4(u8, u16, TaskFunc);
+extern void sub_81B7C74(u8, u16, TaskFunc);
+extern u16 ItemIdToBattleMoveId(u16);
+extern void bag_menu_yes_no(u8, u8, void(**)(u8 taskId));
+extern void (*gUnknown_085920E8[])(u8 taskId);
+extern void sub_81C5924(void);
+extern void sub_81C59BC(void);
+extern void sub_81AB9A8(u8);
+extern void sub_81ABA88(u8);
+extern void sub_80B7CC8(void);
+extern void Overworld_ResetStateAfterDigEscRope(void);
+extern u8* sub_806CF78(u16);
+extern void sub_81B89F0(void);
+extern u8 GetItemEffectType(u16);
+extern struct MapConnection *sub_8088A8C(s16, s16);
+
+void MapPostLoadHook_UseItem(void);
+void sub_80AF6D4(void);
+void Task_CallItemUseOnFieldCallback(u8 taskId);
+void bag_menu_inits_lists_menu(u8 taskId);
+void ItemUseOnFieldCB_Bike(u8 taskId);
+void ItemUseOnFieldCB_Rod(u8 taskId);
+void ItemUseOnFieldCB_Itemfinder(u8 taskId);
+void sub_80FD504(u8 taskId);
+void sub_80FD5CC(u8 taskId);
+void sub_80FDA94(u8 taskId);
+void sub_80FDADC(u8 taskId);
+void sub_80FD7C8(u8 taskId);
+void sub_80FDC00(u8 taskId);
+void sub_80FDD74(u8 taskId);
+void sub_80FDE08(u8 taskId);
+void sub_80FDE7C(u8 taskId);
+void sub_80FDF90(u8 taskId);
+void task08_0809AD8C(u8 taskId);
+void sub_80FE024(u8 taskId);
+void sub_80FE124(u8 taskId);
+void sub_80FE164(u8 taskId);
+
+void DisplayItemMessage(u8 taskId, u8 a, const u8* str, void(*callback)(u8 taskId));
+void DisplayItemMessageInBattlePyramid(u8 taskId, u8* str, void(*callback)(u8 taskId));
+void DisplayItemMessageOnField(u8 taskId, u8* str, void(*callback)(u8 taskId));
+void sub_81C6714(u8 taskId);
+void CleanUpAfterFailingToUseRegisteredKeyItemOnField(u8 taskId);
+void StartFishing(u8 a);
+bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *, u8);
+u8 sub_80FD9B0(s16 a, s16 b);
+void sub_80FDA24(u8 a);
+void sub_80FD8E0(u8 taskId, s16 x, s16 y);
+void sub_80FDBEC(void);
+bool8 sub_80FDE2C(void);
+void ItemUseOutOfBattle_CannotUse(u8 taskId);
+
+void SetUpItemUseCallback(u8 taskId)
+{
+ u8 type;
+ if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY)
+ type = gTasks[taskId].data[4] - 1;
+ else
+ type = ItemId_GetType(gSpecialVar_ItemId) - 1;
+ if (!InBattlePyramid())
+ {
+ *gUnknown_0203CE54 = gUnknown_085920D8[type];
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ *gUnknown_0203CF2C = gUnknown_085920D8[type];
+ sub_81C5B14(taskId);
+ }
+}
+
+void SetUpItemUseOnFieldCallback(u8 taskId)
+{
+ if (gTasks[taskId].data[3] != 1)
+ {
+ gFieldCallback = MapPostLoadHook_UseItem;
+ SetUpItemUseCallback(taskId);
+ }
+ else
+ gUnknown_0203A0F4(taskId);
+}
+
+void MapPostLoadHook_UseItem(void)
+{
+ pal_fill_black();
+ CreateTask(Task_CallItemUseOnFieldCallback, 8);
+}
+
+void Task_CallItemUseOnFieldCallback(u8 taskId)
+{
+ if (IsWeatherNotFadingIn() == 1)
+ gUnknown_0203A0F4(taskId);
+}
+
+void DisplayCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField, const u8 *str)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ if (!isUsingRegisteredKeyItemOnField)
+ {
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, sub_81C6714);
+ }
+ else
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+}
+
+void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField)
+{
+ DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, gText_DadsAdvice);
+}
+
+void DisplayCannotDismountBikeMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField)
+{
+ DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, gText_CantDismountBike);
+}
+
+void CleanUpAfterFailingToUseRegisteredKeyItemOnField(u8 taskId)
+{
+ sub_8197434(0, 1);
+ DestroyTask(taskId);
+ ScriptUnfreezeEventObjects();
+ ScriptContext2_Disable();
+}
+
+u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId)
+{
+ if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM)
+ return 1;
+ else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone)
+ return 2;
+ else
+ return 0;
+}
+
+void sub_80FD254()
+{
+ struct MailStruct mail;
+ mail.itemId = gSpecialVar_ItemId;
+ ReadMail(&mail, bag_menu_mail_related, 0);
+}
+
+void ItemUseOutOfBattle_Mail(u8 taskId)
+{
+ *gUnknown_0203CE54 = sub_80FD254;
+ unknown_ItemMenu_Confirm(taskId);
+}
+
+void ItemUseOutOfBattle_Bike(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ s16 coordsY;
+ s16 coordsX;
+ u8 behavior;
+ PlayerGetDestCoords(&coordsX, &coordsY);
+ behavior = MapGridGetMetatileBehaviorAt(coordsX, coordsY);
+ if (FlagGet(FLAG_SYS_CYCLING_ROAD) == TRUE || MetatileBehavior_IsVerticalRail(behavior) == TRUE || MetatileBehavior_IsHorizontalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedVerticalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedHorizontalRail(behavior) == TRUE)
+ DisplayCannotDismountBikeMessage(taskId, data[3]);
+ else
+ {
+ if (Overworld_IsBikingAllowed() == TRUE && IsBikingDisallowedByPlayer() == 0)
+ {
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Bike;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, data[3]);
+ }
+}
+
+void ItemUseOnFieldCB_Bike(u8 taskId)
+{
+ if (!ItemId_GetSecondaryId(gSpecialVar_ItemId))
+ GetOnOffBike(2);
+ else
+ GetOnOffBike(4);
+ ScriptUnfreezeEventObjects();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+bool32 CanFish()
+{
+ s16 x, y;
+ u16 tileBehavior;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (MetatileBehavior_IsWaterfall(tileBehavior))
+ return FALSE;
+
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4))
+ return FALSE;
+
+ if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ {
+ if (IsPlayerFacingSurfableFishableWater())
+ return TRUE;
+ }
+ else
+ {
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y))
+ return TRUE;
+ if (MetatileBehavior_8089510(tileBehavior) == TRUE)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void ItemUseOutOfBattle_Rod(u8 taskId)
+{
+ if (CanFish() == TRUE)
+ {
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Rod;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+}
+
+void ItemUseOnFieldCB_Rod(u8 taskId)
+{
+ StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId));
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_Itemfinder(u8 var)
+{
+ IncrementGameStat(0x27);
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Itemfinder;
+ SetUpItemUseOnFieldCallback(var);
+}
+
+void ItemUseOnFieldCB_Itemfinder(u8 taskId)
+{
+ if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE)
+ gTasks[taskId].func = sub_80FD504;
+ else
+ DisplayItemMessageOnField(taskId, gText_ItemFinderNothing, sub_80FD5CC);
+}
+
+void sub_80FD504(u8 taskId)
+{
+ u8 playerDir;
+ u8 playerDirToItem;
+ u8 i;
+ s16* data = gTasks[taskId].data;
+ if (!data[3])
+ {
+ if (data[4] == 4)
+ {
+ playerDirToItem = sub_80FD9B0(data[0], data[1]);
+ if (playerDirToItem)
+ {
+ sub_80FDA24(gUnknown_085920E4[playerDirToItem - 1]);
+ gTasks[taskId].func = sub_80FDA94;
+ }
+ else
+ {
+ playerDir = GetPlayerFacingDirection();
+ for (i = 0; i < 4; i++)
+ {
+ if (playerDir == gUnknown_085920E4[i])
+ data[5] = (i + 1) & 3;
+ }
+ gTasks[taskId].func = sub_80FDADC;
+ data[3] = 0;
+ data[2] = 0;
+ }
+ return;
+ }
+ PlaySE(SE_DAUGI);
+ data[4]++;
+ }
+ data[3] = (data[3] + 1) & 0x1F;
+}
+
+void sub_80FD5CC(u8 taskId)
+{
+ sub_8197434(0, 1);
+ ScriptUnfreezeEventObjects();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 taskId)
+{
+ int distanceX, distanceY;
+ s16 x, y, i, newDistanceX, newDistanceY;
+ PlayerGetDestCoords(&x, &y);
+ gTasks[taskId].data[2] = FALSE;
+ for (i = 0; i < events->bgEventCount; i++)
+ {
+ if (events->bgEvents[i].kind == BG_EVENT_HIDDEN_ITEM && !FlagGet(events->bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4))
+ {
+ distanceX = (u16)events->bgEvents[i].x + 7;
+ newDistanceX = distanceX - x;
+ distanceY = (u16)events->bgEvents[i].y + 7;
+ newDistanceY = distanceY - y;
+
+ if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6))
+ sub_80FD8E0(taskId, newDistanceX, newDistanceY);
+ }
+ }
+
+ sub_80FD7C8(taskId);
+ if (gTasks[taskId].data[2] == TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 sub_80FD6D4(const 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 == BG_EVENT_HIDDEN_ITEM && 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 + 0x1F4))
+ return TRUE;
+ else
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 sub_80FD730(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 sub_80FD6D4
+ case 2:
+ localOffset = connection->offset + 7;
+ localX = x - localOffset;
+ localLength = mapHeader->mapLayout->height - 7;
+ localY = localLength + y; // additions are reversed for some reason
+ break;
+ case 1:
+ localOffset = connection->offset + 7;
+ localX = x - localOffset;
+ localLength = gMapHeader.mapLayout->height + 7;
+ localY = y - localLength;
+ break;
+ case 3:
+ localLength = mapHeader->mapLayout->width - 7;
+ localX = localLength + x; // additions are reversed for some reason
+ localOffset = connection->offset + 7;
+ localY = y - localOffset;
+ break;
+ case 4:
+ localLength = gMapHeader.mapLayout->width + 7;
+ localX = x - localLength;
+ localOffset = connection->offset + 7;
+ localY = y - localOffset;
+ break;
+ default:
+ return FALSE;
+ }
+ return sub_80FD6D4(mapHeader->events, localX, localY);
+}
+
+void sub_80FD7C8(u8 taskId)
+{
+ s16 x, y;
+ s16 curX, curY;
+ s16 width = gMapHeader.mapLayout->width + 7;
+ s16 height = gMapHeader.mapLayout->height + 7;
+
+ s16 var1 = 7;
+ s16 var2 = 7;
+
+ PlayerGetDestCoords(&x, &y);
+
+ for (curX = x - 7; curX <= x + 7; curX++)
+ {
+ for (curY = y - 5; curY <= y + 5; curY++)
+ {
+ if (var1 > curX
+ || curX >= width
+ || var2 > curY
+ || curY >= height)
+ {
+ struct MapConnection *conn = sub_8088A8C(curX, curY);
+ if (conn && sub_80FD730(conn, curX, curY) == TRUE)
+ sub_80FD8E0(taskId, curX - x, curY - y);
+ }
+ }
+ }
+}
+
+void sub_80FD8E0(u8 taskId, s16 x, s16 y)
+{
+ s16 *data = gTasks[taskId].data;
+ s16 var1, var2, var3, var4;
+
+ if (data[2] == FALSE)
+ {
+ data[0] = x;
+ data[1] = y;
+ data[2] = TRUE;
+ }
+ else
+ {
+ // data[0] and data[1] contain the player's coordinates.
+ // x and y contain the item's coordinates.
+ if (data[0] < 0)
+ var1 = data[0] * -1; // item is to the left
+ else
+ var1 = data[0]; // item is to the right
+
+ if (data[1] < 0)
+ var2 = data[1] * -1; // item is to the north
+ else
+ var2 = data[1]; // item is to the south
+
+ if (x < 0)
+ var3 = x * -1;
+ else
+ var3 = x;
+
+ if (y < 0)
+ var4 = y * -1;
+ else
+ var4 = y;
+
+ if (var1 + var2 > var3 + var4)
+ {
+ data[0] = x;
+ data[1] = y;
+ }
+ else
+ {
+ if (var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y)))
+ {
+ data[0] = x;
+ data[1] = y;
+ }
+ }
+ }
+}
+
+u8 sub_80FD9B0(s16 itemX, s16 itemY)
+{
+ s16 abX, abY;
+
+ if (itemX == 0 && itemY == 0)
+ return DIR_NONE; // player is standing on the item.
+
+ // get absolute X distance.
+ if (itemX < 0)
+ abX = itemX * -1;
+ else
+ abX = itemX;
+
+ // get absolute Y distance.
+ if (itemY < 0)
+ abY = itemY * -1;
+ else
+ abY = itemY;
+
+ if (abX > abY)
+ {
+ if (itemX < 0)
+ return DIR_EAST;
+ else
+ return DIR_NORTH;
+ }
+ else
+ {
+ if (abX < abY)
+ {
+ if (itemY < 0)
+ return DIR_SOUTH;
+ else
+ return DIR_WEST;
+ }
+ if (abX == abY)
+ {
+ if (itemY < 0)
+ return DIR_SOUTH;
+ else
+ return DIR_WEST;
+ }
+ return DIR_NONE; // should never get here. return something so it doesnt crash.
+ }
+}
+
+void sub_80FDA24(u8 direction)
+{
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ EventObjectClearHeldMovement(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ UnfreezeEventObject(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ PlayerTurnInPlace(direction);
+}
+
+void sub_80FDA94(u8 taskId)
+{
+ if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE)
+ DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, sub_80FD5CC);
+}
+
+void sub_80FDADC(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE
+ || data[2] == FALSE)
+ {
+ sub_80FDA24(gUnknown_085920E4[data[5]]);
+ data[2] = 1;
+ data[5] = (data[5] + 1) & 3;
+ data[3]++;
+
+ if (data[3] == 4)
+ DisplayItemMessageOnField(taskId, gText_ItemFinderOnTop, sub_80FD5CC);
+ }
+}
+
+void ItemUseOutOfBattle_PokeblockCase(u8 taskId)
+{
+ if (sub_81221AC() == TRUE)
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+ else if (gTasks[taskId].data[3] != TRUE)
+ {
+ *gUnknown_0203CE54 = sub_80FDBEC;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ gFieldCallback = sub_80AF6D4;
+ FadeScreen(1, 0);
+ gTasks[taskId].func = sub_80FDC00;
+ }
+}
+
+void sub_80FDBEC(void)
+{
+ OpenPokeblockCase(0, bag_menu_mail_related);
+}
+
+void sub_80FDC00(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ overworld_free_bg_tilemaps();
+ OpenPokeblockCase(0, CB2_ReturnToField);
+ DestroyTask(taskId);
+ }
+}
+
+void ItemUseOutOfBattle_CoinCase(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4);
+ StringExpandPlaceholders(gStringVar4, gText_CoinCase);
+
+ if (!gTasks[taskId].data[3])
+ {
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+ }
+}
+
+void ItemUseOutOfBattle_PowderJar(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, sub_80247BC(), 0, 5);
+ StringExpandPlaceholders(gStringVar4, gText_PowderQty);
+
+ if (!gTasks[taskId].data[3])
+ {
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+ }
+}
+
+void sub_80FDD10(u8 taskId)
+{
+ if (IsPlayerFacingPlantedBerryTree() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDD74;
+ gFieldCallback = MapPostLoadHook_UseItem;
+ *gUnknown_0203CE54 = CB2_ReturnToField;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
+ }
+}
+
+void sub_80FDD74(u8 taskId)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(Route102_EventScript_274482);
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_WailmerPail(u8 taskId)
+{
+ if (sub_80FDE2C() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDE7C;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else if (TryToWaterBerryTree() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDE08;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void sub_80FDE08(u8 taskId)
+{
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(Route102_EventScript_2744C0);
+ DestroyTask(taskId);
+}
+
+bool8 sub_80FDE2C(void)
+{
+ u16 x, y;
+ u8 z;
+ u8 objId;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ z = PlayerGetZCoord();
+ objId = GetEventObjectIdByXYZ(x, y, z);
+ if (objId == 16 || gEventObjects[objId].graphicsId != 0xE4)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_80FDE7C(u8 taskId)
+{
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(BattleFrontier_OutsideEast_EventScript_242CFC);
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_Medicine(u8 taskId)
+{
+ gUnknown_03006328 = ItemUseCB_Medicine;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_ReduceEV(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B67C8;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_SacredAsh(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B79E8;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_PPRecovery(u8 taskId)
+{
+ gUnknown_03006328 = dp05_ether;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_PPUp(u8 taskId)
+{
+ gUnknown_03006328 = dp05_pp_up;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_RareCandy(u8 taskId)
+{
+ gUnknown_03006328 = dp05_rare_candy;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_TMHM(u8 taskId)
+{
+ if (gSpecialVar_ItemId >= ITEM_HM01_CUT)
+ DisplayItemMessage(taskId, 1, gText_BootedUpHM, sub_80FDF90); // HM
+ else
+ DisplayItemMessage(taskId, 1, gText_BootedUpTM, sub_80FDF90); // TM
+}
+
+void sub_80FDF90(u8 taskId)
+{
+ PlaySE(SE_PC_LOGIN);
+ gTasks[taskId].func = task08_0809AD8C;
+}
+
+void task08_0809AD8C(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_ItemId)]);
+ StringExpandPlaceholders(gStringVar4, gText_TMHMContainedVar1);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_80FE024);
+ }
+}
+
+void sub_80FE024(u8 taskId)
+{
+ bag_menu_yes_no(taskId, 6, gUnknown_085920E8);
+}
+
+void sub_80FE03C(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B6DC4;
+ SetUpItemUseCallback(taskId);
+}
+
+void sub_80FE058(void)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2);
+ if (!InBattlePyramid())
+ {
+ sub_81AB9A8(ItemId_GetPocket(gSpecialVar_ItemId));
+ sub_81ABA88(ItemId_GetPocket(gSpecialVar_ItemId));
+ }
+ else
+ {
+ sub_81C5924();
+ sub_81C59BC();
+ }
+}
+
+void ItemUseOutOfBattle_Repel(u8 taskId)
+{
+ if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
+ gTasks[taskId].func = sub_80FE124;
+ else if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gText_RepelEffectsLingered, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_RepelEffectsLingered, sub_81C6714);
+}
+
+void sub_80FE124(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (++data[8] > 7)
+ {
+ data[8] = 0;
+ PlaySE(SE_TU_SAA);
+ gTasks[taskId].func = sub_80FE164;
+ }
+}
+
+void sub_80FE164(u8 taskId)
+{
+ if (!IsSEPlaying())
+ {
+ VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
+ sub_80FE058();
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C6714);
+ }
+}
+
+void sub_80FE1D0(u8 taskId)
+{
+ if(++gTasks[taskId].data[8] > 7)
+ {
+ PlaySE(SE_BIDORO);
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C6714);
+ }
+}
+
+void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId)
+{
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)
+ {
+ FlagSet(FLAG_SYS_ENC_UP_ITEM);
+ FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
+ StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured);
+ }
+ else
+ {
+ FlagSet(FLAG_SYS_ENC_DOWN_ITEM);
+ FlagClear(FLAG_SYS_ENC_UP_ITEM);
+ StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled);
+ }
+ gTasks[taskId].data[8] = 0;
+ gTasks[taskId].func = sub_80FE1D0;
+}
+
+void task08_080A1C44(u8 taskId)
+{
+ player_avatar_init_params_reset();
+ sub_80B7CC8();
+ DestroyTask(taskId);
+}
+
+void re_escape_rope(u8 taskId)
+{
+ Overworld_ResetStateAfterDigEscRope();
+ sub_80FE058();
+ gTasks[taskId].data[0] = 0;
+ DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44);
+}
+
+bool8 CanUseEscapeRopeOnCurrMap(void)
+{
+ if (gMapHeader.flags & 2)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void ItemUseOutOfBattle_EscapeRope(u8 taskId)
+{
+ if (CanUseEscapeRopeOnCurrMap() == TRUE)
+ {
+ gUnknown_0203A0F4 = re_escape_rope;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void ItemUseOutOfBattle_EvolutionStone(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B7C74;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseInBattle_PokeBall(u8 taskId)
+{
+ if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon?
+ {
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ if (!InBattlePyramid())
+ unknown_ItemMenu_Confirm(taskId);
+ else
+ sub_81C5B14(taskId);
+ }
+ else if (!InBattlePyramid())
+ {
+ DisplayItemMessage(taskId, 1, gText_BoxFull, bag_menu_inits_lists_menu);
+ }
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, sub_81C6714);
+}
+
+void sub_80FE408(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ if (!InBattlePyramid())
+ unknown_ItemMenu_Confirm(taskId);
+ else
+ sub_81C5B14(taskId);
+ }
+}
+
+void sub_80FE440(u8 taskId)
+{
+ if(++gTasks[taskId].data[8] > 7)
+ {
+ PlaySE(SE_KAIFUKU);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, sub_806CF78(gSpecialVar_ItemId), sub_80FE408);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, sub_806CF78(gSpecialVar_ItemId), sub_80FE408);
+ }
+}
+
+void ItemUseInBattle_StatIncrease(u8 taskId)
+{
+ u16 partyId = gBattlerPartyIndexes[gBattlerInMenuId];
+
+ if (ExecuteTableBasedItemEffect(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE)
+ {
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gText_WontHaveEffect, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_WontHaveEffect, sub_81C6714);
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80FE440;
+ gTasks[taskId].data[8] = 0;
+ }
+}
+
+void sub_80FE54C(u8 taskId)
+{
+ if (!InBattlePyramid())
+ {
+ *gUnknown_0203CE54 = sub_81B89F0;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ *gUnknown_0203CF2C = sub_81B89F0;
+ sub_81C5B14(taskId);
+ }
+}
+
+void ItemUseInBattle_Medicine(u8 taskId)
+{
+ gUnknown_03006328 = ItemUseCB_Medicine;
+ sub_80FE54C(taskId);
+}
+
+void sub_80FE5AC(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B79E8;
+ sub_80FE54C(taskId);
+}
+
+void ItemUseInBattle_PPRecovery(u8 taskId)
+{
+ gUnknown_03006328 = dp05_ether;
+ sub_80FE54C(taskId);
+}
+
+void ItemUseInBattle_Escape(u8 taskId)
+{
+
+ if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE)
+ {
+ sub_80FE058();
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, unknown_ItemMenu_Confirm);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C5B14);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId) - 1)
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_Medicine(taskId);
+ break;
+ case 9:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_SacredAsh(taskId);
+ break;
+ case 0:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_RareCandy(taskId);
+ break;
+ case 18:
+ case 19:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_PPUp(taskId);
+ break;
+ case 20:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_PPRecovery(taskId);
+ break;
+ default:
+ gTasks[taskId].data[4] = 4;
+ ItemUseOutOfBattle_CannotUse(taskId);
+ }
+}
+
+void ItemUseInBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId))
+ {
+ case 0:
+ ItemUseInBattle_StatIncrease(taskId);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 11:
+ ItemUseInBattle_Medicine(taskId);
+ break;
+ case 21:
+ ItemUseInBattle_PPRecovery(taskId);
+ break;
+ default:
+ ItemUseOutOfBattle_CannotUse(taskId);
+ }
+}
+
+void ItemUseOutOfBattle_CannotUse(u8 taskId)
+{
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+}
diff --git a/src/landmark.c b/src/landmark.c
new file mode 100644
index 000000000..4eade159a
--- /dev/null
+++ b/src/landmark.c
@@ -0,0 +1,441 @@
+#include "global.h"
+#include "event_data.h"
+#include "constants/region_map_sections.h"
+
+struct Landmark
+{
+ const u8 *name;
+ u16 flag;
+};
+
+struct LandmarkList
+{
+ u8 mapSection;
+ u8 id;
+ const struct Landmark *const *landmarks;
+};
+
+static const u8 LandmarkName_FlowerShop[] = _("FLOWER SHOP");
+static const u8 LandmarkName_PetalburgWoods[] = _("PETALBURG WOODS");
+static const u8 LandmarkName_MrBrineysCottage[] = _("MR. BRINEY’S COTTAGE");
+static const u8 LandmarkName_AbandonedShip[] = _("ABANDONED SHIP");
+static const u8 LandmarkName_SeashoreHouse[] = _("SEASHORE HOUSE");
+static const u8 LandmarkName_SlateportBeach[] = _("SLATEPORT BEACH");
+static const u8 LandmarkName_CyclingRoad[] = _("CYCLING ROAD");
+static const u8 LandmarkName_NewMauville[] = _("NEW MAUVILLE");
+static const u8 LandmarkName_TrickHouse[] = _("TRICK HOUSE");
+static const u8 LandmarkName_OldLadysRestShop[] = _("OLD LADY’S REST STOP");
+static const u8 LandmarkName_Desert[] = _("DESERT");
+static const u8 LandmarkName_WinstrateFamily[] = _("THE WINSTRATE FAMILY");
+static const u8 LandmarkName_CableCar[] = _("CABLE CAR");
+static const u8 LandmarkName_GlassWorkshop[] = _("GLASS WORKSHOP");
+static const u8 LandmarkName_WeatherInstitute[] = _("WEATHER INSTITUTE");
+static const u8 LandmarkName_MeteorFalls[] = _("METEOR FALLS");
+static const u8 LandmarkName_TunnelersRestHouse[] = _("TUNNELER’S RESTHOUSE");
+static const u8 LandmarkName_RusturfTunnel[] = _("RUSTURF TUNNEL");
+static const u8 LandmarkName_PokemonDayCare[] = _("POKéMON DAY CARE");
+static const u8 LandmarkName_SafariZoneEntrance[] = _("SAFARI ZONE ENTRANCE");
+static const u8 LandmarkName_MtPyre[] = _("MT. PYRE");
+static const u8 LandmarkName_ShoalCave[] = _("SHOAL CAVE");
+static const u8 LandmarkName_SeafloorCavern[] = _("SEAFLOOR CAVERN");
+static const u8 LandmarkName_GraniteCave[] = _("GRANITE CAVE");
+static const u8 LandmarkName_OceanCurrent[] = _("OCEAN CURRENT");
+static const u8 LandmarkName_LanettesHouse[] = _("LANETTE’S HOUSE");
+static const u8 LandmarkName_FieryPath[] = _("FIERY PATH");
+static const u8 LandmarkName_JaggedPass[] = _("JAGGED PASS");
+static const u8 LandmarkName_SkyPillar[] = _("SKY PILLAR");
+static const u8 LandmarkName_BerryMastersHouse[] = _("BERRY MASTER’S HOUSE");
+static const u8 LandmarkName_IslandCave[] = _("ISLAND CAVE");
+static const u8 LandmarkName_DesertRuins[] = _("DESERT RUINS");
+static const u8 LandmarkName_ScorchedSlab[] = _("SCORCHED SLAB");
+static const u8 LandmarkName_AncientTomb[] = _("ANCIENT TOMB");
+static const u8 LandmarkName_SealedChamber[] = _("SEALED CHAMBER");
+static const u8 LandmarkName_FossilManiacsHouse[] = _("FOSSIL MANIAC’S HOUSE");
+static const u8 LandmarkName_HuntersHouse[] = _("HUNTER’S HOUSE");
+static const u8 LandmarkName_MagmaHideout[] = _("MAGMA HIDEOUT");
+static const u8 LandmarkName_MirageTower[] = _("MIRAGE TOWER");
+static const u8 LandmarkName_AlteringCave[] = _("ALTERING CAVE");
+static const u8 LandmarkName_DesertUnderpass[] = _("DESERT UNDERPASS");
+static const u8 LandmarkName_TrainerHill[] = _("TRAINER HILL");
+
+static const struct Landmark Landmark_FlowerShop = {LandmarkName_FlowerShop, FLAG_LANDMARK_FLOWER_SHOP};
+static const struct Landmark Landmark_PetalburgWoods = {LandmarkName_PetalburgWoods, -1};
+static const struct Landmark Landmark_MrBrineysCottage = {LandmarkName_MrBrineysCottage, FLAG_LANDMARK_MR_BRINEY_HOUSE};
+static const struct Landmark Landmark_AbandonedShip = {LandmarkName_AbandonedShip, FLAG_LANDMARK_ABANDONED_SHIP};
+static const struct Landmark Landmark_SeashoreHouse = {LandmarkName_SeashoreHouse, FLAG_LANDMARK_SEASHORE_HOUSE};
+static const struct Landmark Landmark_SlateportBeach = {LandmarkName_SlateportBeach, -1};
+static const struct Landmark Landmark_CyclingRoad = {LandmarkName_CyclingRoad, -1};
+static const struct Landmark Landmark_NewMauville = {LandmarkName_NewMauville, FLAG_LANDMARK_NEW_MAUVILLE};
+static const struct Landmark Landmark_TrickHouse = {LandmarkName_TrickHouse, FLAG_LANDMARK_TRICK_HOUSE};
+static const struct Landmark Landmark_OldLadysRestShop = {LandmarkName_OldLadysRestShop, FLAG_LANDMARK_OLD_LADY_REST_SHOP};
+static const struct Landmark Landmark_Desert = {LandmarkName_Desert, -1};
+static const struct Landmark Landmark_WinstrateFamily = {LandmarkName_WinstrateFamily, FLAG_LANDMARK_WINSTRATE_FAMILY};
+static const struct Landmark Landmark_CableCar = {LandmarkName_CableCar, -1};
+static const struct Landmark Landmark_GlassWorkshop = {LandmarkName_GlassWorkshop, FLAG_LANDMARK_GLASS_WORKSHOP};
+static const struct Landmark Landmark_WeatherInstitute = {LandmarkName_WeatherInstitute, -1};
+static const struct Landmark Landmark_MeteorFalls = {LandmarkName_MeteorFalls, -1};
+static const struct Landmark Landmark_TunnelersRestHouse = {LandmarkName_TunnelersRestHouse, FLAG_LANDMARK_TUNNELERS_REST_HOUSE};
+static const struct Landmark Landmark_RusturfTunnel = {LandmarkName_RusturfTunnel, -1};
+static const struct Landmark Landmark_PokemonDayCare = {LandmarkName_PokemonDayCare, FLAG_LANDMARK_POKEMON_DAYCARE};
+static const struct Landmark Landmark_SafariZoneEntrance = {LandmarkName_SafariZoneEntrance, -1};
+static const struct Landmark Landmark_MtPyre = {LandmarkName_MtPyre, -1};
+static const struct Landmark Landmark_ShoalCave = {LandmarkName_ShoalCave, -1};
+static const struct Landmark Landmark_SeafloorCavern = {LandmarkName_SeafloorCavern, FLAG_LANDMARK_SEAFLOOR_CAVERN};
+static const struct Landmark Landmark_GraniteCave = {LandmarkName_GraniteCave, -1};
+static const struct Landmark Landmark_OceanCurrent = {LandmarkName_OceanCurrent, -1};
+static const struct Landmark Landmark_LanettesHouse = {LandmarkName_LanettesHouse, FLAG_LANDMARK_LANETTES_HOUSE};
+static const struct Landmark Landmark_FieryPath = {LandmarkName_FieryPath, FLAG_LANDMARK_FIERY_PATH};
+static const struct Landmark Landmark_JaggedPass = {LandmarkName_JaggedPass, -1};
+static const struct Landmark Landmark_BerryMastersHouse = {LandmarkName_BerryMastersHouse, FLAG_LANDMARK_BERRY_MASTERS_HOUSE};
+static const struct Landmark Landmark_IslandCave = {LandmarkName_IslandCave, FLAG_LANDMARK_ISLAND_CAVE};
+static const struct Landmark Landmark_DesertRuins = {LandmarkName_DesertRuins, FLAG_LANDMARK_DESERT_RUINS};
+static const struct Landmark Landmark_ScorchedSlab = {LandmarkName_ScorchedSlab, FLAG_LANDMARK_SCORCHED_SLAB};
+static const struct Landmark Landmark_AncientTomb = {LandmarkName_AncientTomb, FLAG_LANDMARK_ANCIENT_TOMB};
+static const struct Landmark Landmark_SealedChamber = {LandmarkName_SealedChamber, FLAG_LANDMARK_SEALED_CHAMBER};
+static const struct Landmark Landmark_FossilManiacsHouse = {LandmarkName_FossilManiacsHouse, FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE};
+static const struct Landmark Landmark_HuntersHouse = {LandmarkName_HuntersHouse, FLAG_LANDMARK_HUNTERS_HOUSE};
+static const struct Landmark Landmark_SkyPillar = {LandmarkName_SkyPillar, FLAG_LANDMARK_SKY_PILLAR};
+static const struct Landmark Landmark_MirageTower = {LandmarkName_MirageTower, FLAG_LANDMARK_MIRAGE_TOWER};
+static const struct Landmark Landmark_AlteringCave = {LandmarkName_AlteringCave, FLAG_LANDMARK_ALTERING_CAVE};
+static const struct Landmark Landmark_DesertUnderpass = {LandmarkName_DesertUnderpass, FLAG_LANDMARK_DESERT_UNDERPASS};
+static const struct Landmark Landmark_TrainerHill = {LandmarkName_TrainerHill, FLAG_LANDMARK_TRAINER_HILL};
+
+static const struct Landmark *const Landmarks_Route103_2[] =
+{
+ &Landmark_AlteringCave,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route104_0[] =
+{
+ &Landmark_FlowerShop,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route104_1[] =
+{
+ &Landmark_PetalburgWoods,
+ &Landmark_MrBrineysCottage,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route105_0[] =
+{
+ &Landmark_IslandCave,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route106_1[] =
+{
+ &Landmark_GraniteCave,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route108_0[] =
+{
+ &Landmark_AbandonedShip,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route109_0[] =
+{
+ &Landmark_SeashoreHouse,
+ &Landmark_SlateportBeach,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route110_0[] =
+{
+ &Landmark_CyclingRoad,
+ &Landmark_NewMauville,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route110_1[] =
+{
+ &Landmark_CyclingRoad,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route110_2[] =
+{
+ &Landmark_CyclingRoad,
+ &Landmark_TrickHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_0[] =
+{
+ &Landmark_OldLadysRestShop,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_1[] =
+{
+ &Landmark_Desert,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_2[] =
+{
+ &Landmark_MirageTower,
+ &Landmark_Desert,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_3[] =
+{
+ &Landmark_DesertRuins,
+ &Landmark_Desert,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_4[] =
+{
+ &Landmark_TrainerHill,
+ &Landmark_WinstrateFamily,
+ &Landmark_Desert,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route112_0[] =
+{
+ &Landmark_FieryPath,
+ &Landmark_JaggedPass,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route112_1[] =
+{
+ &Landmark_CableCar,
+ &Landmark_FieryPath,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route113_1[] =
+{
+ &Landmark_GlassWorkshop,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route114_1[] =
+{
+ &Landmark_DesertUnderpass,
+ &Landmark_FossilManiacsHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route114_2[] =
+{
+ &Landmark_LanettesHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_MeteorFalls[] =
+{
+ &Landmark_MeteorFalls,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route116_1[] =
+{
+ &Landmark_TunnelersRestHouse,
+ &Landmark_RusturfTunnel,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route116_2[] =
+{
+ &Landmark_RusturfTunnel,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route117_2[] =
+{
+ &Landmark_PokemonDayCare,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route119_1[] =
+{
+ &Landmark_WeatherInstitute,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route120_0[] =
+{
+ &Landmark_ScorchedSlab,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route120_2[] =
+{
+ &Landmark_AncientTomb,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route121_2[] =
+{
+ &Landmark_SafariZoneEntrance,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route122_0[] =
+{
+ &Landmark_MtPyre,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route123_0[] =
+{
+ &Landmark_BerryMastersHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route124_7[] =
+{
+ &Landmark_HuntersHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route125_2[] =
+{
+ &Landmark_ShoalCave,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route128_1[] =
+{
+ &Landmark_SeafloorCavern,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route131_1[] =
+{
+ &Landmark_SkyPillar,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_OceanCurrent[] =
+{
+ &Landmark_OceanCurrent,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route134_2[] =
+{
+ &Landmark_SealedChamber,
+ &Landmark_OceanCurrent,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_MtChimney_2[] =
+{
+ &Landmark_CableCar,
+ &Landmark_JaggedPass,
+ NULL,
+};
+
+static const struct LandmarkList gLandmarkLists[] =
+{
+ {MAPSEC_ROUTE_103, 2, Landmarks_Route103_2},
+ {MAPSEC_ROUTE_104, 0, Landmarks_Route104_0},
+ {MAPSEC_ROUTE_104, 1, Landmarks_Route104_1},
+ {MAPSEC_ROUTE_105, 0, Landmarks_Route105_0},
+ {MAPSEC_ROUTE_106, 1, Landmarks_Route106_1},
+ {MAPSEC_ROUTE_108, 0, Landmarks_Route108_0},
+ {MAPSEC_ROUTE_109, 0, Landmarks_Route109_0},
+ {MAPSEC_ROUTE_110, 0, Landmarks_Route110_0},
+ {MAPSEC_ROUTE_110, 1, Landmarks_Route110_1},
+ {MAPSEC_ROUTE_110, 2, Landmarks_Route110_2},
+ {MAPSEC_ROUTE_111, 0, Landmarks_Route111_0},
+ {MAPSEC_ROUTE_111, 1, Landmarks_Route111_1},
+ {MAPSEC_ROUTE_111, 2, Landmarks_Route111_2},
+ {MAPSEC_ROUTE_111, 3, Landmarks_Route111_3},
+ {MAPSEC_ROUTE_111, 4, Landmarks_Route111_4},
+ {MAPSEC_ROUTE_112, 0, Landmarks_Route112_0},
+ {MAPSEC_ROUTE_112, 1, Landmarks_Route112_1},
+ {MAPSEC_ROUTE_113, 1, Landmarks_Route113_1},
+ {MAPSEC_ROUTE_114, 1, Landmarks_Route114_1},
+ {MAPSEC_ROUTE_114, 2, Landmarks_Route114_2},
+ {MAPSEC_ROUTE_114, 3, Landmarks_MeteorFalls},
+ {MAPSEC_ROUTE_115, 0, Landmarks_MeteorFalls},
+ {MAPSEC_ROUTE_115, 1, Landmarks_MeteorFalls},
+ {MAPSEC_ROUTE_116, 1, Landmarks_Route116_1},
+ {MAPSEC_ROUTE_116, 2, Landmarks_Route116_2},
+ {MAPSEC_ROUTE_117, 2, Landmarks_Route117_2},
+ {MAPSEC_ROUTE_119, 1, Landmarks_Route119_1},
+ {MAPSEC_ROUTE_120, 0, Landmarks_Route120_0},
+ {MAPSEC_ROUTE_120, 2, Landmarks_Route120_2},
+ {MAPSEC_ROUTE_121, 2, Landmarks_Route121_2},
+ {MAPSEC_ROUTE_122, 0, Landmarks_Route122_0},
+ {MAPSEC_ROUTE_123, 0, Landmarks_Route123_0},
+ {MAPSEC_ROUTE_122, 1, Landmarks_Route122_0},
+ {MAPSEC_ROUTE_124, 7, Landmarks_Route124_7},
+ {MAPSEC_ROUTE_125, 2, Landmarks_Route125_2},
+ {MAPSEC_ROUTE_128, 1, Landmarks_Route128_1},
+ {MAPSEC_ROUTE_131, 1, Landmarks_Route131_1},
+ {MAPSEC_ROUTE_132, 0, Landmarks_OceanCurrent},
+ {MAPSEC_ROUTE_132, 1, Landmarks_OceanCurrent},
+ {MAPSEC_ROUTE_133, 0, Landmarks_OceanCurrent},
+ {MAPSEC_ROUTE_133, 1, Landmarks_OceanCurrent},
+ {MAPSEC_ROUTE_133, 2, Landmarks_OceanCurrent},
+ {MAPSEC_ROUTE_134, 0, Landmarks_OceanCurrent},
+ {MAPSEC_ROUTE_134, 1, Landmarks_OceanCurrent},
+ {MAPSEC_ROUTE_134, 2, Landmarks_Route134_2},
+ {MAPSEC_MT_CHIMNEY, 2, Landmarks_MtChimney_2},
+ {MAPSEC_NONE, 0, NULL},
+};
+
+static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id);
+
+const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count)
+{
+ const struct Landmark *const *landmarks = GetLandmarks(mapSection, id);
+
+ if (!landmarks)
+ return NULL;
+
+ while (1)
+ {
+ const struct Landmark *landmark = *landmarks;
+
+ if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE)
+ {
+ if (count == 0)
+ break;
+ else
+ count--;
+ }
+
+ landmarks++;
+ if (!*landmarks)
+ return NULL;
+ }
+
+ return (*landmarks)->name;
+}
+
+static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id)
+{
+ u16 i = 0;
+
+ for (; gLandmarkLists[i].mapSection != MAPSEC_NONE; i++)
+ {
+ if (gLandmarkLists[i].mapSection > mapSection)
+ return NULL;
+ if (gLandmarkLists[i].mapSection == mapSection)
+ break;
+ }
+
+ if (gLandmarkLists[i].mapSection == MAPSEC_NONE)
+ return NULL;
+
+ for (; gLandmarkLists[i].mapSection == mapSection; i++)
+ {
+ if (gLandmarkLists[i].id == id)
+ return gLandmarkLists[i].landmarks;
+ }
+
+ return NULL;
+}
diff --git a/src/libc.c b/src/libc.c
deleted file mode 100644
index 1f457957b..000000000
--- a/src/libc.c
+++ /dev/null
@@ -1,173 +0,0 @@
-#include "global.h"
-#include <stddef.h>
-
-#define LBLOCKSIZE (sizeof(long))
-
-// Nonzero if (long)X contains a NULL byte.
-#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
-
-// Nonzero if X is not aligned on a "long" boundary.
-#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1))
-
-void *memcpy(void *dst0, const void *src0, size_t len0)
-{
- char *dst = dst0;
- const char *src = src0;
- long *aligned_dst;
- const long *aligned_src;
- unsigned int len = 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)))
- {
- aligned_dst = (long *)dst;
- aligned_src = (long *)src;
-
- // Copy 4X long words at a time if possible.
- while(len >= 16)
- {
- *aligned_dst++ = *aligned_src++;
- *aligned_dst++ = *aligned_src++;
- *aligned_dst++ = *aligned_src++;
- *aligned_dst++ = *aligned_src++;
- len -= 16;
- }
-
- // Copy one long word at a time if possible
- while(len >= 4)
- {
- *aligned_dst++ = *aligned_src++;
- len -= 4;
- }
-
- dst = (char *)aligned_dst;
- src = (char *)aligned_src;
- }
-
- // Pick up any remaining bytes with a byte copier.
- while(len--)
- *dst++ = *src++;
-
- return dst0;
-}
-
-void *memset(void *m, int c, size_t n)
-{
- char *s = (char *)m;
- int count, i;
- unsigned long buffer;
- unsigned long *aligned_addr;
- unsigned char *unaligned_addr;
-
- // 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))
- {
- // We know that n is large and m is word-aligned.
- aligned_addr = (unsigned long *)m;
-
- // Store C into each char sized location in buffer so that
- // we can set large blocks quickly.
- c &= 0xFF;
- if(LBLOCKSIZE == 4)
- {
- buffer = (c << 8) | c;
- buffer |= (buffer << 16);
- }
- else
- {
- buffer = 0;
- for(i = 0; i < LBLOCKSIZE; i++)
- buffer = (buffer << 8) | c;
- }
-
- while(n >= LBLOCKSIZE * 4)
- {
- *aligned_addr++ = buffer;
- *aligned_addr++ = buffer;
- *aligned_addr++ = buffer;
- *aligned_addr++ = buffer;
- n -= LBLOCKSIZE * 4;
- }
- while(n >= LBLOCKSIZE)
- {
- *aligned_addr++ = buffer;
- n -= LBLOCKSIZE;
- }
-
- s = (char *)aligned_addr;
- }
-
- // Pick up the remainder with a bytewise loop.
- while(n--)
- *s++ = (char)c;
-
- return m;
-}
-
-int strcmp(const char *s1, const char *s2)
-{
- unsigned long *a1;
- unsigned long *a2;
-
- // If s1 or s2 are unaligned, then skip this and compare bytes.
- if(!(UNALIGNED(s1) | UNALIGNED(s2)))
- {
- // Compare them a word at a time.
- a1 = (unsigned long *)s1;
- a2 = (unsigned long *)s2;
- 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))
- return 0;
-
- a1++;
- a2++;
- }
-
- s1 = (char *)a1;
- s2 = (char *)a2;
- }
-
- // Check the remaining few bytes.
- while(*s1 != '\0' && *s1 == *s2)
- {
- s1++;
- s2++;
- }
-
- return (*(unsigned char *) s1) - (*(unsigned char *) s2);
-}
-
-char* strcpy(char *dst0, const char *src0)
-{
- char *dst = dst0;
- const char *src = src0;
- unsigned long *a1;
- const unsigned long *a2;
-
- // If SRC or DEST is unaligned, then copy bytes.
- if(!(UNALIGNED(src) | UNALIGNED(dst)))
- {
- // SRC and DEST are both "long int" aligned, try to do "long int"
- // sized copies.
- a1 = (unsigned long *)dst;
- a2 = (unsigned long *)src;
- while(!CONTAINSNULL(*a2))
- {
- *a1++ = *a2++;
- }
-
- dst = (char *)a1;
- src = (char *)a2;
- }
-
- // Copy the remaining few bytes.
- while(*dst++ = *src++);
-
- return dst0;
-}
-
diff --git a/src/libisagbprn.c b/src/libisagbprn.c
new file mode 100644
index 000000000..e0e979e95
--- /dev/null
+++ b/src/libisagbprn.c
@@ -0,0 +1,177 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include "gba/gba.h"
+#include "config.h"
+
+#define AGB_PRINT_FLUSH_ADDR 0x9FE209D
+#define AGB_PRINT_STRUCT_ADDR 0x9FE20F8
+#define AGB_PRINT_PROTECT_ADDR 0x9FE2FFE
+#define WSCNT_DATA (WAITCNT_PHI_OUT_16MHZ | WAITCNT_WS0_S_2 | WAITCNT_WS0_N_4)
+
+// originally for auto no$gba support, the string "no$gba" should be at this address,
+// the user needs to read this string out as the memory viewer won't show it.
+#define NOCASHGBAIDADDR 0x4FFFA00
+#define NOCASHGBAPRINTADDR1 0x4FFFA10 // automatically adds a newline after the string has finished
+#define NOCASHGBAPRINTADDR2 0x4FFFA14 // does not automatically add the newline. by default, NOCASHGBAPRINTADDR2 is used. this is used to keep strings consistent between no$gba and VBA-RR, but a user can choose to forgo this.
+
+struct AGBPrintStruct
+{
+ u16 m_nRequest;
+ u16 m_nBank;
+ u16 m_nGet;
+ u16 m_nPut;
+};
+
+typedef void (*LPFN_PRINT_FLUSH)(void);
+
+#ifndef NDEBUG
+
+void AGBPrintFlush1Block(void);
+
+void AGBPrintInit(void)
+{
+ volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
+ u16 nOldWSCNT = *pWSCNT;
+ *pWSCNT = WSCNT_DATA;
+ *pProtect = 0x20;
+ pPrint->m_nRequest = pPrint->m_nGet = pPrint->m_nPut = 0;
+ pPrint->m_nBank = 0xFD;
+ *pProtect = 0;
+ *pWSCNT = nOldWSCNT;
+}
+
+static void AGBPutcInternal(const char cChr)
+{
+ volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ u16 *pPrintBuf = (u16 *)(0x8000000 + (pPrint->m_nBank << 16));
+ u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
+ u16 nData = pPrintBuf[pPrint->m_nPut / 2];
+ *pProtect = 0x20;
+ nData = (pPrint->m_nPut & 1) ? (nData & 0xFF) | (cChr << 8) : (nData & 0xFF00) | cChr;
+ pPrintBuf[pPrint->m_nPut / 2] = nData;
+ pPrint->m_nPut++;
+ *pProtect = 0;
+}
+
+void AGBPutc(const char cChr)
+{
+ u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ u16 nOldWSCNT = *pWSCNT;
+ volatile struct AGBPrintStruct *pPrint;
+ *pWSCNT = WSCNT_DATA;
+ AGBPutcInternal(cChr);
+ *pWSCNT = nOldWSCNT;
+ pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ if (pPrint->m_nPut == ((pPrint->m_nGet - 1) & 0xFFFF))
+ AGBPrintFlush1Block();
+}
+
+void AGBPrint(const char *pBuf)
+{
+ volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ u16 nOldWSCNT = *pWSCNT;
+ *pWSCNT = WSCNT_DATA;
+ while (*pBuf)
+ {
+ AGBPutc(*pBuf);
+ pBuf++;
+ }
+ *pWSCNT = nOldWSCNT;
+}
+
+void AGBPrintf(const char *pBuf, ...)
+{
+ char bufPrint[0x100];
+ va_list vArgv;
+ va_start(vArgv, pBuf);
+ vsprintf(bufPrint, pBuf, vArgv);
+ va_end(vArgv);
+ AGBPrint(bufPrint);
+}
+
+static void AGBPrintTransferDataInternal(u32 bAllData)
+{
+ LPFN_PRINT_FLUSH lpfnFuncFlush;
+ u16 *pIME;
+ u16 nIME;
+ u16 *pWSCNT;
+ u16 nOldWSCNT;
+ u16 *pProtect;
+ volatile struct AGBPrintStruct *pPrint;
+
+ pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
+ pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR;
+ pIME = (u16 *)REG_ADDR_IME;
+ nIME = *pIME;
+ pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ nOldWSCNT = *pWSCNT;
+ *pIME = nIME & ~1;
+ *pWSCNT = WSCNT_DATA;
+
+ if (bAllData)
+ {
+ while (pPrint->m_nPut != pPrint->m_nGet)
+ {
+ *pProtect = 0x20;
+ lpfnFuncFlush();
+ *pProtect = 0;
+ }
+ }
+ else if (pPrint->m_nPut != pPrint->m_nGet)
+ {
+ *pProtect = 0x20;
+ lpfnFuncFlush();
+ *pProtect = 0;
+ }
+
+ *pWSCNT = nOldWSCNT;
+ *pIME = nIME;
+}
+
+void AGBPrintFlush1Block(void)
+{
+ AGBPrintTransferDataInternal(FALSE);
+}
+
+void AGBPrintFlush(void)
+{
+ AGBPrintTransferDataInternal(TRUE);
+}
+
+void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram)
+{
+ if (nStopProgram)
+ {
+ AGBPrintf("ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression);
+ AGBPrintFlush();
+ asm(".hword 0xEFFF");
+ }
+ else
+ {
+ AGBPrintf("WARING FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression);
+ }
+}
+
+// no$gba print functions, uncomment to use
+/*
+void NoCashGBAPrint(const char *pBuf)
+{
+ *(volatile u32*)NOCASHGBAPRINTADDR2 = (u32)pBuf;
+}
+
+void NoCashGBAPrintf(const char *pBuf, ...)
+{
+ char bufPrint[0x100];
+ va_list vArgv;
+ va_start(vArgv, pBuf);
+ vsprintf(bufPrint, pBuf, vArgv);
+ va_end(vArgv);
+ NoCashGBAPrint(bufPrint);
+}
+*/
+
+#endif
diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c
index cf3fe12ad..c5aa25c10 100644
--- a/src/librfu_rfu.c
+++ b/src/librfu_rfu.c
@@ -3,38 +3,6 @@
#include "librfu.h"
-struct RfuUnk1
-{
- u8 unk_0[0x14];
- u32 unk_14;
- u32 unk_18;
- struct RfuIntrStruct unk_1c;
-};
-
-struct RfuUnk2
-{
- u8 unk_0[0x68];
- u32 unk_68;
- u32 unk_6c;
- u8 unk_70[0x70];
-};
-
-struct RfuUnk3
-{
- u32 unk_0;
- u32 unk_4;
- u8 unk_8[0xD4];
- u32 unk_dc;
-};
-
-extern u32 *gUnknown_03007890;
-extern u32 *gUnknown_03007894;
-extern struct RfuUnk3* gUnknown_03007898;
-extern struct RfuUnk2* gUnknown_03007880[4];
-extern struct RfuUnk1* gUnknown_03007870[4];
-extern void* sub_82E53F4;
-extern void rfu_STC_clearAPIVariables(void);
-
// Nonmatching, only register differences
/*u16 rfu_initializeAPI(u32 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam)
{
diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c
index 254aa8a5d..159ede91e 100644
--- a/src/lilycove_lady.c
+++ b/src/lilycove_lady.c
@@ -8,10 +8,10 @@
#include "rom6.h"
#include "event_data.h"
#include "script.h"
-#include "rng.h"
+#include "random.h"
#include "string_util.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "item_menu.h"
#include "text.h"
#include "easy_chat.h"
@@ -29,10 +29,10 @@ static u8 sub_818E258(const u8 *);
extern const u8 gText_Lady2[];
-static const u16 gUnknown_0860B074[] = {
+static const u16 sUnknown_0860B074[] = {
0x62, 0xcb, 0xdc, 0xcc, 0xd1
};
-static const u16 gUnknown_0860B07E[] = {
+static const u16 sUnknown_0860B07E[] = {
0x1a, 0x14, 0x0a
};
@@ -119,11 +119,11 @@ static const u16 *const gUnknown_0860B1A4[] = {
Unknown_0860B192
};
-static const u16 gUnknown_0860B1E4[] = {
+static const u16 sUnknown_0860B1E4[] = {
0x0210, 0x0400, 0x0212, 0x1a26, 0x0208, 0x045d, 0x040a, 0x0411, 0x0464, 0x020e, 0x1a25, 0x181b, 0x1a24, 0x0420, 0x0410, 0x0400
};
-static const u16 gUnknown_0860B204[] = {
+static const u16 sUnknown_0860B204[] = {
0x007b, 0x007f, 0x0081, 0x0023, 0x0023, 0x0023, 0x00a5, 0x00a7, 0x00a6, 0x000b, 0x012f, 0x006b, 0x006d, 0x0044, 0x0044, 0x000c
};
@@ -176,7 +176,7 @@ static const u16 *const gUnknown_0860B2EC[] = {
Unknown_0860B2D6
};
-static const u16 gUnknown_0860B304[] = {
+static const u16 sUnknown_0860B304[] = {
0x0b, 0x6e, 0x40, 0x6f, 0x44, 0x47
};
@@ -218,7 +218,7 @@ static const u8 *const gUnknown_0860B338[] = {
gUnknown_085EADE7
};
-static const u16 gUnknown_0860B34C[] = {
+static const u16 sUnknown_0860B34C[] = {
0x0120, 0x013b, 0x011e, 0x013d, 0x0019
};
@@ -237,11 +237,11 @@ void sub_818D9C0(void)
{
LilycoveLady *lilycoveLady;
- VarSet(VAR_0x4010, gUnknown_0860B07E[GetLilycoveLadyId()]);
+ VarSet(VAR_OBJ_GFX_ID_0, sUnknown_0860B07E[GetLilycoveLadyId()]);
if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST)
{
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
- VarSet(VAR_0x4011, gUnknown_0860B074[lilycoveLady->contest.category]);
+ VarSet(VAR_OBJ_GFX_ID_1, sUnknown_0860B074[lilycoveLady->contest.category]);
gSpecialVar_Result = TRUE;
}
else
@@ -392,7 +392,7 @@ bool8 sub_818DC60(void)
static void sub_818DCAC(u8 *dest, u16 itemId)
{
- StringCopy(dest, ItemId_GetItem(itemId)->name);
+ StringCopy(dest, ItemId_GetName(itemId));
}
void sub_818DCC8(void)
@@ -481,7 +481,7 @@ u16 sub_818DEA0(void)
u16 itemId;
gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- itemId = gUnknown_0860B304[gUnknown_0203CD64->unk_00c];
+ itemId = sUnknown_0860B304[gUnknown_0203CD64->unk_00c];
sub_818DE88(itemId);
gUnknown_0203CD64->phase = 2;
return itemId;
@@ -508,8 +508,8 @@ static void sub_818DF00(void)
{
gUnknown_0203CD68->unk_002[i] = gUnknown_0860B1A4[v0][i];
}
- gUnknown_0203CD68->unk_014[0] = gUnknown_0860B1E4[v0];
- gUnknown_0203CD68->itemId = gUnknown_0860B204[v0];
+ gUnknown_0203CD68->unk_014[0] = sUnknown_0860B1E4[v0];
+ gUnknown_0203CD68->itemId = sUnknown_0860B204[v0];
gUnknown_0203CD68->unk_02b = v0;
gUnknown_0203CD68->playerName[0] = EOS;
}
@@ -581,13 +581,13 @@ u8 sub_818E06C(void)
{
i = 0;
}
- } while (sub_811F8D8(gUnknown_0860B1E4[i]) == 0);
+ } while (sub_811F8D8(sUnknown_0860B1E4[i]) == 0);
for (j = 0; j < 9; j ++)
{
quiz->unk_002[j] = gUnknown_0860B1A4[i][j];
}
- quiz->unk_014[0] = gUnknown_0860B1E4[i];
- quiz->itemId = gUnknown_0860B204[i];
+ quiz->unk_014[0] = sUnknown_0860B1E4[i];
+ quiz->itemId = sUnknown_0860B204[i];
quiz->unk_02b = i;
quiz->playerName[0] = EOS;
}
@@ -606,7 +606,6 @@ u8 sub_818E06C(void)
}
}
-#ifdef NONMATCHING
static u8 sub_818E13C(void)
{
u8 retval;
@@ -627,9 +626,11 @@ static u8 sub_818E13C(void)
len = sub_818E258(gUnknown_0203CD68->playerName);
if (len == sub_818E258(gSaveBlock2Ptr->playerName))
{
+ u8 *name = gUnknown_0203CD68->playerName;
for (i = 0; i < len; i ++)
{
- if (gUnknown_0203CD68->playerName[i] != gSaveBlock2Ptr->playerName[i])
+ name = gUnknown_0203CD68->playerName;
+ if (name[i] != gSaveBlock2Ptr->playerName[i])
{
retval = 2;
break;
@@ -640,85 +641,6 @@ static u8 sub_818E13C(void)
}
return retval;
}
-#else
-__attribute__((naked)) static u8 sub_818E13C(void)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmovs r7, 0x1\n"
- "\tldr r5, =gUnknown_0203CD68\n"
- "\tldr r0, =gSaveBlock1Ptr\n"
- "\tldr r1, [r0]\n"
- "\tldr r2, =0x00003b58\n"
- "\tadds r0, r1, r2\n"
- "\tstr r0, [r5]\n"
- "\tldrb r0, [r0, 0x18]\n"
- "\tcmp r0, 0xFF\n"
- "\tbne _0818E174\n"
- "\tldr r0, =gStringVar1\n"
- "\tldr r1, =gText_Lady2\n"
- "\tbl StringCopy7\n"
- "\tmovs r7, 0\n"
- "\tb _0818E1DC\n"
- "\t.pool\n"
- "_0818E174:\n"
- "\tldr r4, =gStringVar1\n"
- "\tldr r0, =0x00003b70\n"
- "\tadds r1, r0\n"
- "\tadds r0, r4, 0\n"
- "\tbl StringCopy7\n"
- "\tldr r0, [r5]\n"
- "\tadds r0, 0x2D\n"
- "\tldrb r1, [r0]\n"
- "\tadds r0, r4, 0\n"
- "\tbl ConvertInternationalString\n"
- "\tldr r0, [r5]\n"
- "\tadds r0, 0x18\n"
- "\tbl sub_818E258\n"
- "\tlsls r0, 24\n"
- "\tlsrs r4, r0, 24\n"
- "\tldr r6, =gSaveBlock2Ptr\n"
- "\tldr r0, [r6]\n"
- "\tbl sub_818E258\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r4, r0\n"
- "\tbne _0818E1DC\n"
- "\tldr r0, [r5]\n"
- "\tmovs r2, 0\n"
- "\tcmp r2, r4\n"
- "\tbcs _0818E1DC\n"
- "\tldr r1, [r6]\n"
- "\tldrb r0, [r0, 0x18]\n"
- "\tldrb r1, [r1]\n"
- "\tcmp r0, r1\n"
- "\tbne _0818E1DA\n"
- "_0818E1BA:\n"
- "\tadds r0, r2, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r2, r0, 24\n"
- "\tcmp r2, r4\n"
- "\tbcs _0818E1DC\n"
- "\tldr r0, =gUnknown_0203CD68\n"
- "\tldr r1, [r0]\n"
- "\tadds r1, 0x18\n"
- "\tadds r1, r2\n"
- "\tldr r0, =gSaveBlock2Ptr\n"
- "\tldr r0, [r0]\n"
- "\tadds r0, r2\n"
- "\tldrb r1, [r1]\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r1, r0\n"
- "\tbeq _0818E1BA\n"
- "_0818E1DA:\n"
- "\tmovs r7, 0x2\n"
- "_0818E1DC:\n"
- "\tadds r0, r7, 0\n"
- "\tpop {r4-r7}\n"
- "\tpop {r1}\n"
- "\tbx r1\n"
- "\t.pool");
-}
-#endif
static u8 sub_818E1F4(void)
{
@@ -749,7 +671,7 @@ static u8 sub_818E258(const u8 *str)
void sub_818E274(void)
{
- StringCopy(gStringVar1, ItemId_GetItem(gUnknown_0203CD68->itemId)->name);
+ StringCopy(gStringVar1, ItemId_GetName(gUnknown_0203CD68->itemId));
}
bool8 sub_818E298(void)
@@ -879,26 +801,26 @@ void sub_818E564(void)
EnableBothScriptContexts();
}
-void sub_818E570(const struct LilycoveLadyQuiz *quiz)
+void sub_818E570(const LilycoveLady *lilycoveLady)
{
u8 i;
gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (quiz->unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ)
+ if (lilycoveLady->quiz.unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ)
{
for (i = 0; i < 4; i ++)
{
- if (quiz->unk_02c != gUnknown_0203CD68->unk_02b)
+ if (lilycoveLady->quiz.unk_02c != gUnknown_0203CD68->unk_02b)
{
break;
}
gUnknown_0203CD68->unk_02b = Random() % 16;
}
- if (quiz->unk_02c == gUnknown_0203CD68->unk_02b)
+ if (lilycoveLady->quiz.unk_02c == gUnknown_0203CD68->unk_02b)
{
gUnknown_0203CD68->unk_02b = (gUnknown_0203CD68->unk_02b + 1) % 16;
}
- gUnknown_0203CD68->unk_02c = quiz->unk_02c;
+ gUnknown_0203CD68->unk_02c = lilycoveLady->quiz.unk_02c;
}
}
@@ -943,7 +865,7 @@ static void sub_818E6B0(u8 sheen)
}
}
-bool8 sub_818E704(struct Pokeblock *pokeblock)
+bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock)
{
u8 sheen;
bool8 response;
@@ -1079,7 +1001,7 @@ void sub_818E914(void)
void sub_818E92C(void)
{
- sub_81357FC(3, c2_exit_to_overworld_2_switch);
+ OpenPokeblockCase(3, CB2_ReturnToField);
}
void sub_818E940(void)
@@ -1091,7 +1013,7 @@ void sub_818E940(void)
void sub_818E960(void)
{
gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gSpecialVar_0x8005 = gUnknown_0860B34C[gUnknown_0203CD6C->category];
+ gSpecialVar_0x8005 = sUnknown_0860B34C[gUnknown_0203CD6C->category];
}
u8 sub_818E990(void)
diff --git a/src/link.c b/src/link.c
index ae2cd1992..b729f86eb 100644
--- a/src/link.c
+++ b/src/link.c
@@ -1,6 +1,34 @@
// Includes
#include "global.h"
+#include "m4a.h"
+#include "malloc.h"
+#include "reset_save_heap.h"
+#include "save.h"
+#include "bg.h"
+#include "window.h"
+#include "librfu.h"
+#include "random.h"
+#include "decompress.h"
+#include "string_util.h"
+#include "event_data.h"
+#include "item_menu.h"
+#include "overworld.h"
+#include "gpu_regs.h"
+#include "palette.h"
+#include "task.h"
+#include "scanline_effect.h"
+#include "menu.h"
+#include "text.h"
+#include "strings.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "trade.h"
+#include "battle.h"
+#include "link.h"
+#include "link_rfu.h"
+
+extern u16 gUnknown_03005DA8;
// Static type declarations
@@ -8,7 +36,7 @@ struct BlockTransfer
{
u16 pos;
u16 size;
- void *src;
+ const u8 *src;
bool8 active;
u8 multiplayerId;
};
@@ -23,34 +51,2392 @@ struct LinkTestBGInfo
// Static RAM declarations
-IWRAM_DATA struct BlockTransfer gUnknown_03000D10;
+IWRAM_DATA struct BlockTransfer sBlockSend;
IWRAM_DATA u32 link_c_unused_03000d1c;
-IWRAM_DATA struct BlockTransfer gUnknown_03000D20[4];
-IWRAM_DATA u32 gUnknown_03000D50;
+IWRAM_DATA struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS];
+IWRAM_DATA u32 sBlockSendDelayCounter;
IWRAM_DATA u32 gUnknown_03000D54;
IWRAM_DATA u8 gUnknown_03000D58;
-IWRAM_DATA u32 gUnknown_03000D5C;
+IWRAM_DATA u32 sPlayerDataExchangeStatus;
IWRAM_DATA u32 gUnknown_03000D60;
-IWRAM_DATA u8 gUnknown_03000D64[4]; // not really, but won't match otherwise
-IWRAM_DATA u8 gUnknown_03000D68[4];
-IWRAM_DATA u8 gUnknown_03000D6C;
-IWRAM_DATA bool8 gUnknown_03000D6D;
-IWRAM_DATA u16 gUnknown_03000D6E;
-IWRAM_DATA u16 gUnknown_03000D70;
-IWRAM_DATA u8 gUnknown_03000D72;
-IWRAM_DATA u8 gUnknown_03000D73;
-IWRAM_DATA u8 gUnknown_03000D74[4]; // not really, but won't match otherwise
-IWRAM_DATA u8 gUnknown_03000D78[8]; // not really, but won't match otherwise
-IWRAM_DATA u8 gUnknown_03000D80[16];
-IWRAM_DATA u16 gUnknown_03000D90[8];
-IWRAM_DATA u32 gUnknown_03000DA0;
-IWRAM_DATA u32 gUnknown_03000DA4;
-IWRAM_DATA void *gUnknown_03000DA8;
-IWRAM_DATA void *gUnknown_03000DAC;
-IWRAM_DATA bool32 gUnknown_03000DB0;
+IWRAM_DATA u8 sLinkTestLastBlockSendPos;
+ALIGNED() IWRAM_DATA u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS];
+IWRAM_DATA u8 sNumVBlanksWithoutSerialIntr;
+IWRAM_DATA bool8 sSendBufferEmpty;
+IWRAM_DATA u16 sSendNonzeroCheck;
+IWRAM_DATA u16 sRecvNonzeroCheck;
+IWRAM_DATA u8 sChecksumAvailable;
+IWRAM_DATA u8 sHandshakePlayerCount;
+
+u16 gLinkPartnersHeldKeys[6];
+u32 gLinkDebugSeed;
+struct LinkPlayerBlock gLocalLinkPlayerBlock;
+bool8 gLinkErrorOccurred;
+u32 gLinkDebugFlags;
+u32 gFiller_03003074;
+bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS];
+u8 gBlockReceivedStatus[MAX_LINK_PLAYERS];
+u32 gFiller_03003080;
+u16 gLinkHeldKeys;
+u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
+u32 gLinkStatus;
+bool8 gUnknown_030030E4;
+bool8 gUnknown_030030E8;
+bool8 gUnknown_030030EC[MAX_LINK_PLAYERS];
+bool8 gUnknown_030030F0[MAX_LINK_PLAYERS];
+u16 gUnknown_030030F4;
+u8 gSuppressLinkErrorMessage;
+bool8 gWirelessCommType;
+bool8 gSavedLinkPlayerCount;
+u16 gSendCmd[CMD_LENGTH];
+u8 gSavedMultiplayerId;
+bool8 gReceivedRemoteLinkPlayers;
+struct LinkTestBGInfo gLinkTestBGInfo;
+void (*gLinkCallback)(void);
+u8 gShouldAdvanceLinkState;
+u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
+u8 gBlockRequestType;
+u32 gFiller_03003154;
+u32 gFiller_03003158;
+u32 gFiller_0300315c;
+u8 gLastSendQueueCount;
+struct Link gLink;
+u8 gLastRecvQueueCount;
+u16 gLinkSavedIme;
+u32 gFiller_03004138;
+u32 gFiller_0300413C;
+
+EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0;
+EWRAM_DATA u8 gUnknown_020223BD = 0;
+EWRAM_DATA u32 gUnknown_020223C0 = 0;
+EWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {};
+EWRAM_DATA u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE] = {};
+EWRAM_DATA bool8 gLinkOpen = FALSE;
+EWRAM_DATA u16 gLinkType = 0;
+EWRAM_DATA u16 gLinkTimeOutCounter = 0;
+EWRAM_DATA struct LinkPlayer gLocalLinkPlayer = {};
+EWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {};
+EWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {};
+EWRAM_DATA struct {
+ u32 status;
+ u8 lastRecvQueueCount;
+ u8 lastSendQueueCount;
+ u8 unk_06;
+} sLinkErrorBuffer = {};
+EWRAM_DATA u16 gUnknown_02022B08 = 0;
+EWRAM_DATA void *gUnknown_02022B0C = NULL;
// Static ROM declarations
+static void InitLocalLinkPlayer(void);
+static void sub_80096BC(void);
+static void CB2_LinkTest(void);
+static void ProcessRecvCmds(u8 unused);
+static void sub_8009F70(void);
+static void ResetBlockSend(void);
+static bool32 InitBlockSend(const void *src, size_t size);
+static void LinkCB_BlockSendBegin(void);
+static void LinkCB_BlockSend(void);
+static void LinkCB_BlockSendEnd(void);
+static void SetBlockReceivedFlag(u8 who);
+static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);
+static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
+static void LinkCB_RequestPlayerDataExchange(void);
+static void Task_PrintTestData(u8 taskId);
+
+static void sub_800AC80(void);
+static void sub_800ACAC(void);
+static void sub_800AD5C(void);
+static void sub_800AD88(void);
+static void sub_800AE30(void);
+static void sub_800AE5C(void);
+
+static void CheckErrorStatus(void);
+static void CB2_PrintErrorMessage(void);
+static bool8 IsSioMultiMaster(void);
+static void sub_800B4A4(void);
+static void DisableSerial(void);
+static void EnableSerial(void);
+static void CheckMasterOrSlave(void);
+static void InitTimer(void);
+static void EnqueueSendCmd(u16 *sendCmd);
+static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH]);
+
+static void StartTransfer(void);
+static bool8 DoHandshake(void);
+static void DoRecv(void);
+static void DoSend(void);
+static void StopTimer(void);
+static void SendRecvDone(void);
+
// .rodata
+ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal");
+const u8 gWirelessLinkDisplayGfx[] = INCBIN_U8("graphics/interface/wireless_link_display.4bpp.lz");
+const u8 gWirelessLinkDisplayTilemap[] = INCBIN_U8("graphics/interface/wireless_link_display.bin.lz");
+const u16 gLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal");
+const u16 gLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp");
+const u8 unkstring_82ed160[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}");
+const u16 g2BlankTilesGfx[] = INCBIN_U16("graphics/interface/blank_1x2.4bpp");
+const struct BlockRequest gUnknown_082ED1A8[] = {
+ {gBlockSendBuffer, 200},
+ {gBlockSendBuffer, 200},
+ {gBlockSendBuffer, 100},
+ {gBlockSendBuffer, 220},
+ {gBlockSendBuffer, 40}
+};
+const u8 gBGControlRegs[] = {
+ REG_OFFSET_BG0CNT,
+ REG_OFFSET_BG1CNT,
+ REG_OFFSET_BG2CNT,
+ REG_OFFSET_BG3CNT
+};
+const char gASCIIGameFreakInc[] = "GameFreak inc.";
+const char gASCIITestPrint[] = "TEST PRINT\nP0\nP1\nP2\nP3";
+const struct BgTemplate gUnknown_082ED1FC[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .priority = 0
+ }, {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 8,
+ .priority = 1
+ }
+};
+const struct WindowTemplate gUnknown_082ED204[] = {
+ {0x00, 0x00, 0x00, 0x1E, 0x05, 0x0F, 0x0002},
+ {0x00, 0x00, 0x06, 0x1E, 0x07, 0x0F, 0x0098},
+ {0x00, 0x00, 0x0D, 0x1E, 0x07, 0x0F, 0x016A},
+ DUMMY_WIN_TEMPLATE
+};
+const u8 gUnknown_082ED224[] = {
+ 0x00, 0x01, 0x02, 0x00,
+ 0xff, 0xfe, 0xff, 0x00
+};
+
// .text
+
+bool8 IsWirelessAdapterConnected(void)
+{
+ sub_800B488();
+ sub_800E700();
+ if (sub_800BEC0() == 0x8001)
+ {
+ rfu_REQ_stopMode();
+ rfu_waitREQComplete();
+ return TRUE;
+ }
+ sub_800B4A4();
+ CloseLink();
+ RestoreSerialTimer3IntrHandlers();
+ return FALSE;
+}
+
+void Task_DestroySelf(u8 taskId)
+{
+ DestroyTask(taskId);
+}
+
+static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 a4)
+{
+ LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20);
+ DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * a4), sizeof gLinkTestDigitsGfx);
+ gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
+ gLinkTestBGInfo.paletteNum = paletteNum;
+ gLinkTestBGInfo.dummy_8 = a4;
+ switch (bgNum)
+ {
+ case 1:
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));
+ break;
+ case 3:
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));
+ break;
+ }
+ SetGpuReg(REG_OFFSET_BG0HOFS + bgNum * 4, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0);
+}
+
+void sub_80094EC(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)
+{
+ LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20);
+ DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof gLinkTestDigitsGfx);
+ gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
+ gLinkTestBGInfo.paletteNum = paletteNum;
+ gLinkTestBGInfo.dummy_8 = 0;
+ SetGpuReg(gBGControlRegs[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock));
+}
+
+void LinkTestScreen(void)
+{
+ int i;
+
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(sub_80096BC);
+ ResetBlockSend();
+ gLinkType = 0x1111;
+ OpenLink();
+ SeedRng(gMain.vblankCounter2);
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256;
+ }
+ InitLinkTestBG(0, 2, 4, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);
+ CreateTask(Task_DestroySelf, 0);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ gUnknown_03000D60 = 0;
+ InitLocalLinkPlayer();
+ CreateTask(Task_PrintTestData, 0);
+ SetMainCallback2(CB2_LinkTest);
+}
+
+void sub_8009628(u8 a0)
+{
+ gLocalLinkPlayer.id = a0;
+}
+
+static void InitLocalLinkPlayer(void)
+{
+ gLocalLinkPlayer.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24);
+ StringCopy(gLocalLinkPlayer.name, gSaveBlock2Ptr->playerName);
+ gLocalLinkPlayer.gender = gSaveBlock2Ptr->playerGender;
+ gLocalLinkPlayer.linkType = gLinkType;
+ gLocalLinkPlayer.language = gGameLanguage;
+ gLocalLinkPlayer.version = gGameVersion + 0x4000;
+ gLocalLinkPlayer.lp_field_2 = 0x8000;
+ gLocalLinkPlayer.name[8] = IsNationalPokedexEnabled();
+ if (FlagGet(FLAG_0x87F))
+ {
+ gLocalLinkPlayer.name[8] |= 0x10;
+ }
+}
+
+static void sub_80096BC(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void InitLink(void)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ {
+ gSendCmd[i] = 0xefff;
+ }
+ gLinkOpen = TRUE;
+ EnableSerial();
+}
+
+static void Task_TriggerHandshake(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 5)
+ {
+ gShouldAdvanceLinkState = 1;
+ DestroyTask(taskId);
+ }
+}
+
+void OpenLink(void)
+{
+ int i;
+
+ if (!gWirelessCommType)
+ {
+ ResetSerial();
+ InitLink();
+ gLinkCallback = LinkCB_RequestPlayerDataExchange;
+ gLinkVSyncDisabled = FALSE;
+ gLinkErrorOccurred = FALSE;
+ gSuppressLinkErrorMessage = FALSE;
+ ResetBlockReceivedFlags();
+ ResetBlockSend();
+ gUnknown_03000D54 = 0;
+ gUnknown_030030E8 = FALSE;
+ gUnknown_030030E4 = FALSE;
+ gUnknown_030030F4 = 0;
+ CreateTask(Task_TriggerHandshake, 2);
+ }
+ else
+ {
+ sub_800E700();
+ }
+ gReceivedRemoteLinkPlayers = 0;
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gRemoteLinkPlayersNotReceived[i] = TRUE;
+ gUnknown_030030F0[i] = FALSE;
+ gUnknown_030030EC[i] = FALSE;
+ }
+}
+
+void CloseLink(void)
+{
+ gReceivedRemoteLinkPlayers = FALSE;
+ if (gWirelessCommType)
+ {
+ sub_800EDD4();
+ }
+ gLinkOpen = FALSE;
+ DisableSerial();
+}
+
+static void TestBlockTransfer(u8 nothing, u8 is, u8 used)
+{
+ u8 i;
+ u8 status;
+
+ if (sLinkTestLastBlockSendPos != sBlockSend.pos)
+ {
+ LinkTest_prnthex(sBlockSend.pos, 2, 3, 2);
+ sLinkTestLastBlockSendPos = sBlockSend.pos;
+ }
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos)
+ {
+ LinkTest_prnthex(sBlockRecv[i].pos, 2, i + 4, 2);
+ sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos;
+ }
+ }
+ status = GetBlockReceivedStatus();
+ if (status == 0xF) // 0b1111
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if ((status >> i) & 1)
+ {
+ gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(gBlockRecvBuffer[i], sBlockRecv[i].size);
+ ResetBlockReceivedFlag(i);
+ if (gLinkTestBlockChecksums[i] != 0x0342)
+ {
+ gLinkTestDebugValuesEnabled = FALSE;
+ gUnknown_020223BD = FALSE;
+ }
+ }
+ }
+ }
+}
+
+static void LinkTestProcessKeyInput(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ gShouldAdvanceLinkState = 1;
+ }
+ if (gMain.heldKeys & B_BUTTON)
+ {
+ InitBlockSend(gHeap + 0x4000, 0x00002004);
+ }
+ if (gMain.newKeys & L_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 2);
+ }
+ if (gMain.newKeys & START_BUTTON)
+ {
+ SetSuppressLinkErrorMessage(TRUE);
+ }
+ if (gMain.newKeys & R_BUTTON)
+ {
+ TrySavingData(1);
+ }
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_800AC34();
+ }
+ if (gLinkTestDebugValuesEnabled)
+ {
+ SetLinkDebugValues(gMain.vblankCounter2, gLinkCallback ? gLinkVSyncDisabled : gLinkVSyncDisabled | 0x10);
+ }
+}
+
+static void CB2_LinkTest(void)
+{
+ LinkTestProcessKeyInput();
+ TestBlockTransfer(1, 1, 0);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+u16 LinkMain2(const u16 *heldKeys)
+{
+ u8 i;
+
+ if (!gLinkOpen)
+ {
+ return 0;
+ }
+ for (i = 0; i < 8; i++)
+ {
+ gSendCmd[i] = 0;
+ }
+ gLinkHeldKeys = *heldKeys;
+ if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED)
+ {
+ ProcessRecvCmds(SIO_MULTI_CNT->id);
+ if (gLinkCallback != NULL)
+ {
+ gLinkCallback();
+ }
+ CheckErrorStatus();
+ }
+ return gLinkStatus;
+}
+
+static void HandleReceiveRemoteLinkPlayer(u8 who)
+{
+ int i;
+ int count;
+
+ count = 0;
+ gRemoteLinkPlayersNotReceived[who] = FALSE;
+ for (i = 0; i < GetLinkPlayerCount_2(); i++)
+ {
+ count += gRemoteLinkPlayersNotReceived[i];
+ }
+ if (count == 0 && gReceivedRemoteLinkPlayers == 0)
+ {
+ gReceivedRemoteLinkPlayers = 1;
+ }
+}
+
+static void ProcessRecvCmds(u8 unused)
+{
+ u16 i;
+
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gLinkPartnersHeldKeys[i] = 0;
+ if (gRecvCmds[i][0] == 0)
+ {
+ continue;
+ }
+ switch (gRecvCmds[i][0])
+ {
+ case LINKCMD_SEND_LINK_TYPE:
+ {
+ struct LinkPlayerBlock *block;
+
+ InitLocalLinkPlayer();
+ block = &gLocalLinkPlayerBlock;
+ block->linkPlayer = gLocalLinkPlayer;
+ memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1);
+ memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1);
+ InitBlockSend(block, sizeof(*block));
+ break;
+ }
+ case LINKCMD_SEND_HELD_KEYS:
+ gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
+ break;
+ case LINKCMD_0x5555:
+ gUnknown_030030E8 = TRUE;
+ break;
+ case LINKCMD_0x5566:
+ gUnknown_030030E8 = TRUE;
+ break;
+ case LINKCMD_INIT_BLOCK:
+ {
+ struct BlockTransfer *blockRecv;
+
+ blockRecv = &sBlockRecv[i];
+ blockRecv->pos = 0;
+ blockRecv->size = gRecvCmds[i][1];
+ blockRecv->multiplayerId = gRecvCmds[i][2];
+ break;
+ }
+ case LINKCMD_CONT_BLOCK:
+ {
+ if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE)
+ {
+ u16 *buffer;
+ u16 j;
+
+ buffer = (u16 *)gDecompressionBuffer;
+ for (j = 0; j < CMD_LENGTH - 1; j++)
+ {
+ buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1];
+ }
+ }
+ else
+ {
+ u16 j;
+
+ for (j = 0; j < CMD_LENGTH - 1; j++)
+ {
+ gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[i][j + 1];
+ }
+ }
+
+ sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2;
+
+ if (sBlockRecv[i].pos >= sBlockRecv[i].size)
+ {
+ if (gRemoteLinkPlayersNotReceived[i] == TRUE)
+ {
+ struct LinkPlayerBlock *block;
+ struct LinkPlayer *linkPlayer;
+
+ block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i];
+ linkPlayer = &gLinkPlayers[i];
+ *linkPlayer = block->linkPlayer;
+ if ((linkPlayer->version & 0xFF) == VERSION_RUBY || (linkPlayer->version & 0xFF) == VERSION_SAPPHIRE)
+ {
+ linkPlayer->name[10] = 0;
+ linkPlayer->name[9] = 0;
+ linkPlayer->name[8] = 0;
+ }
+ sub_800B524(linkPlayer);
+ if (strcmp(block->magic1, gASCIIGameFreakInc) != 0
+ || strcmp(block->magic2, gASCIIGameFreakInc) != 0)
+ {
+ SetMainCallback2(CB2_LinkError);
+ }
+ else
+ {
+ HandleReceiveRemoteLinkPlayer(i);
+ }
+ }
+ else
+ {
+ SetBlockReceivedFlag(i);
+ }
+ }
+ }
+ break;
+ case LINKCMD_0x5FFF:
+ gUnknown_030030F0[i] = TRUE;
+ break;
+ case LINKCMD_0x2FFE:
+ gUnknown_030030EC[i] = TRUE;
+ break;
+ case LINKCMD_0xAAAA:
+ sub_800A418();
+ break;
+ case LINKCMD_0xCCCC:
+ SendBlock(0, gUnknown_082ED1A8[gRecvCmds[i][1]].address, gUnknown_082ED1A8[gRecvCmds[i][1]].size);
+ break;
+ case LINKCMD_SEND_HELD_KEYS_2:
+ gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
+ break;
+ }
+ }
+}
+
+static void BuildSendCmd(u16 command)
+{
+ switch (command)
+ {
+ case LINKCMD_SEND_LINK_TYPE:
+ gSendCmd[0] = LINKCMD_SEND_LINK_TYPE;
+ gSendCmd[1] = gLinkType;
+ break;
+ case LINKCMD_0x2FFE:
+ gSendCmd[0] = LINKCMD_0x2FFE;
+ break;
+ case LINKCMD_SEND_HELD_KEYS:
+ gSendCmd[0] = LINKCMD_SEND_HELD_KEYS;
+ gSendCmd[1] = gMain.heldKeys;
+ break;
+ case LINKCMD_0x5555:
+ gSendCmd[0] = LINKCMD_0x5555;
+ break;
+ case LINKCMD_0x6666:
+ gSendCmd[0] = LINKCMD_0x6666;
+ gSendCmd[1] = 0;
+ break;
+ case LINKCMD_0x7777:
+ {
+ u8 i;
+
+ gSendCmd[0] = LINKCMD_0x7777;
+ for (i = 0; i < 5; i++)
+ {
+ gSendCmd[i + 1] = 0xEE;
+ }
+ break;
+ }
+ case LINKCMD_INIT_BLOCK:
+ gSendCmd[0] = LINKCMD_INIT_BLOCK;
+ gSendCmd[1] = sBlockSend.size;
+ gSendCmd[2] = sBlockSend.multiplayerId + 0x80;
+ break;
+ case LINKCMD_0xAAAA:
+ gSendCmd[0] = LINKCMD_0xAAAA;
+ break;
+ case LINKCMD_0xAAAB:
+ gSendCmd[0] = LINKCMD_0xAAAB;
+ gSendCmd[1] = gSpecialVar_ItemId;
+ break;
+ case LINKCMD_0xCCCC:
+ gSendCmd[0] = LINKCMD_0xCCCC;
+ gSendCmd[1] = gBlockRequestType;
+ break;
+ case LINKCMD_0x5FFF:
+ gSendCmd[0] = LINKCMD_0x5FFF;
+ gSendCmd[1] = gUnknown_030030F4;
+ break;
+ case LINKCMD_0x5566:
+ gSendCmd[0] = LINKCMD_0x5566;
+ break;
+ case LINKCMD_SEND_HELD_KEYS_2:
+ if (gUnknown_03005DA8 == 0 || gLinkTransferringData)
+ {
+ break;
+ }
+ gSendCmd[0] = LINKCMD_SEND_HELD_KEYS_2;
+ gSendCmd[1] = gUnknown_03005DA8;
+ break;
+ }
+}
+
+void sub_8009F18(void)
+{
+ if (gWirelessCommType)
+ {
+ sub_800F804();
+ }
+ gLinkCallback = sub_8009F70;
+}
+
+bool32 sub_8009F3C(void)
+{
+ if (gWirelessCommType)
+ {
+ return sub_800F7E4();
+ }
+ if (gLinkCallback == sub_8009F70)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_8009F70(void)
+{
+ if (gReceivedRemoteLinkPlayers == TRUE)
+ {
+ BuildSendCmd(LINKCMD_SEND_HELD_KEYS_2);
+ }
+}
+
+void ClearLinkCallback(void)
+{
+ if (gWirelessCommType)
+ {
+ Rfu_set_zero();
+ }
+ else
+ {
+ gLinkCallback = NULL;
+ }
+}
+
+void ClearLinkCallback_2(void)
+{
+ if (gWirelessCommType)
+ {
+ Rfu_set_zero();
+ }
+ else
+ {
+ gLinkCallback = NULL;
+ }
+}
+
+u8 GetLinkPlayerCount(void)
+{
+ if (gWirelessCommType)
+ {
+ return sub_80104F4();
+ }
+ return EXTRACT_PLAYER_COUNT(gLinkStatus);
+}
+
+static int sub_8009FF8(u32 version1, u32 version2)
+{
+ int i;
+ u8 nPlayers;
+
+ nPlayers = GetLinkPlayerCount();
+ for (i = 0; i < nPlayers; i++)
+ {
+ if ((gLinkPlayers[i].version & 0xFF) == version1 || (gLinkPlayers[i].version & 0xFF) == version2)
+ {
+ return 1;
+ }
+ }
+ return -1;
+}
+
+u32 sub_800A03C(void)
+{
+ return 2;
+}
+
+bool32 sub_800A040(void)
+{
+ if (GetLinkPlayerCount() != 4 || sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) < 0)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool32 Link_AnyPartnersPlayingRubyOrSapphire(void)
+{
+ if (sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) >= 0)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_800A07C(void)
+{
+ int i;
+
+ i = sub_8009FF8(VERSION_FIRE_RED, VERSION_LEAF_GREEN);
+ if (i >= 0 && gLinkPlayers[i].language == LANGUAGE_JAPANESE)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void OpenLinkTimed(void)
+{
+ sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED;
+ gLinkTimeOutCounter = 0;
+ OpenLink();
+}
+
+u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper)
+{
+ int i;
+ int count;
+ u32 index;
+ u8 cmpVal;
+ u32 linkType1;
+ u32 linkType2;
+
+ count = 0;
+ if (gReceivedRemoteLinkPlayers == TRUE)
+ {
+ cmpVal = GetLinkPlayerCount_2();
+ if (lower > cmpVal || cmpVal > upper)
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_STAT_6;
+ return 6;
+ }
+ else
+ {
+ if (GetLinkPlayerCount() == 0)
+ {
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ }
+ for (i = 0, index = 0; i < GetLinkPlayerCount(); index++, i++)
+ {
+ if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType)
+ {
+ count++;
+ }
+ }
+ if (count == GetLinkPlayerCount())
+ {
+ if (gLinkPlayers[0].linkType == 0x1133)
+ {
+ switch (sub_807A728())
+ {
+ case 1:
+ sPlayerDataExchangeStatus = EXCHANGE_STAT_4;
+ break;
+ case 2:
+ sPlayerDataExchangeStatus = EXCHANGE_STAT_5;
+ break;
+ case 0:
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ break;
+ }
+ }
+ else
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ }
+ }
+ else
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ linkType1 = gLinkPlayers[GetMultiplayerId()].linkType;
+ linkType2 = gLinkPlayers[GetMultiplayerId() ^ 1].linkType;
+ if ((linkType1 == 0x2266 && linkType2 == 0x2277) || (linkType1 == 0x2277 && linkType2 == 0x2266))
+ {
+ gSpecialVar_0x8005 = 3;
+ }
+ }
+ }
+ }
+ else if (++gLinkTimeOutCounter > 600)
+ {
+ sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT;
+ }
+ return sPlayerDataExchangeStatus;
+}
+
+bool8 IsLinkPlayerDataExchangeComplete(void)
+{
+ u8 i;
+ u8 count;
+ bool8 retval;
+
+ count = 0;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType)
+ {
+ count++;
+ }
+ }
+ if (count == GetLinkPlayerCount())
+ {
+ retval = TRUE;
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ }
+ else
+ {
+ retval = FALSE;
+ sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ }
+ return retval;
+}
+
+u32 GetLinkPlayerTrainerId(u8 who)
+{
+ return gLinkPlayers[who].trainerId;
+}
+
+void ResetLinkPlayers(void)
+{
+ int i;
+
+ for (i = 0; i <= MAX_LINK_PLAYERS; i++)
+ {
+ gLinkPlayers[i] = (struct LinkPlayer){};
+ }
+}
+
+static void ResetBlockSend(void)
+{
+ sBlockSend.active = FALSE;
+ sBlockSend.pos = 0;
+ sBlockSend.size = 0;
+ sBlockSend.src = NULL;
+}
+
+static bool32 InitBlockSend(const void *src, size_t size)
+{
+ if (sBlockSend.active)
+ {
+ return FALSE;
+ }
+ sBlockSend.multiplayerId = GetMultiplayerId();
+ sBlockSend.active = TRUE;
+ sBlockSend.size = size;
+ sBlockSend.pos = 0;
+ if (size > 0x100)
+ {
+ sBlockSend.src = src;
+ }
+ else
+ {
+ if (src != gBlockSendBuffer)
+ {
+ memcpy(gBlockSendBuffer, src, size);
+ }
+ sBlockSend.src = gBlockSendBuffer;
+ }
+ BuildSendCmd(LINKCMD_INIT_BLOCK);
+ gLinkCallback = LinkCB_BlockSendBegin;
+ sBlockSendDelayCounter = 0;
+ return TRUE;
+}
+
+static void LinkCB_BlockSendBegin(void)
+{
+ if (++sBlockSendDelayCounter > 2)
+ {
+ gLinkCallback = LinkCB_BlockSend;
+ }
+}
+
+static void LinkCB_BlockSend(void)
+{
+ int i;
+ const u8 *src;
+
+ src = sBlockSend.src;
+ gSendCmd[0] = LINKCMD_CONT_BLOCK;
+ for (i = 0; i < 7; i++)
+ {
+ gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2];
+ }
+ sBlockSend.pos += 14;
+ if (sBlockSend.size <= sBlockSend.pos)
+ {
+ sBlockSend.active = FALSE;
+ gLinkCallback = LinkCB_BlockSendEnd;
+ }
+}
+
+static void LinkCB_BlockSendEnd(void)
+{
+ gLinkCallback = NULL;
+}
+
+static void sub_800A3F8(void)
+{
+ GetMultiplayerId();
+ BuildSendCmd(LINKCMD_SEND_HELD_KEYS);
+ gUnknown_020223C0++;
+}
+
+void sub_800A418(void)
+{
+ gUnknown_020223C0 = 0;
+ if (gWirelessCommType)
+ {
+ sub_800F850();
+ }
+ else
+ {
+ gLinkCallback = sub_800A3F8;
+ }
+}
+
+u32 sub_800A44C(void)
+{
+ return gUnknown_020223C0;
+}
+
+void sub_800A458(void)
+{
+ BuildSendCmd(LINKCMD_0xAAAA);
+}
+
+u8 GetMultiplayerId(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return rfu_get_multiplayer_id();
+ }
+ return SIO_MULTI_CNT->id;
+}
+
+u8 bitmask_all_link_players_but_self(void)
+{
+ u8 mpId;
+
+ mpId = GetMultiplayerId();
+ return ((1 << MAX_LINK_PLAYERS) - 1) ^ (1 << mpId);
+}
+
+bool8 SendBlock(u8 unused, const void *src, u16 size)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return sub_800FE84(src, size);
+ }
+ return InitBlockSend(src, size);
+}
+
+bool8 sub_800A4D8(u8 a0)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return sub_8010100(a0);
+ }
+ if (gLinkCallback == NULL)
+ {
+ gBlockRequestType = a0;
+ BuildSendCmd(LINKCMD_0xCCCC);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_800A520(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return sub_8010500();
+ }
+ return gLinkCallback == NULL;
+}
+
+u8 GetBlockReceivedStatus(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ return sub_800FCD8();
+ }
+ return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0);
+}
+
+static void SetBlockReceivedFlag(u8 who)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ sub_800F6FC(who);
+ }
+ else
+ {
+ gBlockReceivedStatus[who] = TRUE;
+ }
+}
+
+void ResetBlockReceivedFlags(void)
+{
+ int i;
+
+ if (gWirelessCommType == TRUE)
+ {
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ sub_800F728(i);
+ }
+ }
+ else
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gBlockReceivedStatus[i] = FALSE;
+ }
+ }
+}
+
+void ResetBlockReceivedFlag(u8 who)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ sub_800F728(who);
+ }
+ else if (gBlockReceivedStatus[who])
+ {
+ gBlockReceivedStatus[who] = FALSE;
+ }
+}
+
+void sub_800A620(void)
+{
+ if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1)
+ {
+ gShouldAdvanceLinkState = 1;
+ }
+}
+
+static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size)
+{
+ u16 chksum;
+ u16 i;
+
+ chksum = 0;
+ for (i = 0; i < size / 2; i++)
+ {
+ chksum += src[i];
+ }
+ return chksum;
+}
+
+static void LinkTest_prnthexchar(char a0, u8 a1, u8 a2)
+{
+ u16 *vAddr;
+
+ vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);
+ vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + 1 + gLinkTestBGInfo.dummy_8);
+}
+
+static void LinkTest_prntchar(char a0, u8 a1, u8 a2)
+{
+ u16 *vAddr;
+
+ vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock);
+ vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + gLinkTestBGInfo.dummy_8);
+}
+
+static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2)
+{
+ char sp[32 / 2];
+ int i;
+
+ for (i = 0; i < a2; i++)
+ {
+ sp[i] = pos & 0xf;
+ pos >>= 4;
+ }
+ for (i = a2 - 1; i >= 0; i--)
+ {
+ LinkTest_prnthexchar(sp[i], a0, a1);
+ a0++;
+ }
+}
+
+static void LinkTest_prntint(int a0, u8 a1, u8 a2, u8 a3)
+{
+ char sp[32 / 2];
+ int sp10;
+ int i;
+
+ sp10 = -1;
+ if (a0 < 0)
+ {
+ sp10 = a1;
+ a0 = -a0;
+ }
+ for (i = 0; i < a3; i++)
+ {
+ sp[i] = a0 % 10;
+ a0 /= 10;
+ }
+ for (i = a3 - 1; i >= 0; i--)
+ {
+ LinkTest_prnthexchar(sp[i], a1, a2);
+ a1++;
+ }
+ if (sp10 != -1)
+ {
+ LinkTest_prnthexchar(*"\n", sp10, a2);
+ }
+}
+
+static void LinkTest_prntstr(const char *a0, u8 a1, u8 a2)
+{
+ int r6;
+ int i;
+ int r5;
+
+ r5 = 0;
+ r6 = 0;
+ for (i = 0; a0[i] != 0; a0++)
+ {
+ if (a0[i] == *"\n")
+ {
+ r5++;
+ r6 = 0;
+ }
+ else
+ {
+ LinkTest_prntchar(a0[i], a1 + r6, a2 + r5);
+ r6++;
+ }
+ }
+}
+
+static void LinkCB_RequestPlayerDataExchange(void)
+{
+ if (gLinkStatus & LINK_STAT_MASTER)
+ {
+ BuildSendCmd(LINKCMD_SEND_LINK_TYPE);
+ }
+ gLinkCallback = NULL;
+}
+
+static void Task_PrintTestData(u8 taskId)
+{
+ char sp[32];
+ int i;
+
+ strcpy(sp, gASCIITestPrint);
+ LinkTest_prntstr(sp, 5, 2);
+ LinkTest_prnthex(gShouldAdvanceLinkState, 2, 1, 2);
+ LinkTest_prnthex(gLinkStatus, 15, 1, 8);
+ LinkTest_prnthex(gLink.state, 2, 10, 2);
+ LinkTest_prnthex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2);
+ LinkTest_prnthex(GetMultiplayerId(), 15, 12, 2);
+ LinkTest_prnthex(gLastSendQueueCount, 25, 1, 2);
+ LinkTest_prnthex(gLastRecvQueueCount, 25, 2, 2);
+ LinkTest_prnthex(GetBlockReceivedStatus(), 15, 5, 2);
+ LinkTest_prnthex(gLinkDebugSeed, 2, 12, 8);
+ LinkTest_prnthex(gLinkDebugFlags, 2, 13, 8);
+ LinkTest_prnthex(GetSioMultiSI(), 25, 5, 1);
+ LinkTest_prnthex(IsSioMultiMaster(), 25, 6, 1);
+ LinkTest_prnthex(IsLinkConnectionEstablished(), 25, 7, 1);
+ LinkTest_prnthex(HasLinkErrorOccurred(), 25, 8, 1);
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ LinkTest_prnthex(gLinkTestBlockChecksums[i], 10, 4 + i, 4);
+ }
+}
+
+void SetLinkDebugValues(u32 seed, u32 flags)
+{
+ gLinkDebugSeed = seed;
+ gLinkDebugFlags = flags;
+}
+
+u8 sub_800A9A8(void)
+{
+ int i;
+ u8 flags;
+
+ flags = 0;
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ {
+ flags |= (1 << i);
+ }
+ return flags;
+}
+
+u8 sub_800A9D8(void)
+{
+ int i;
+ u8 flags;
+
+ flags = 0;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ flags |= (1 << i);
+ }
+ return flags;
+}
+
+void sub_800AA04(u8 a0)
+{
+ int i;
+
+ gSavedLinkPlayerCount = a0;
+ gSavedMultiplayerId = GetMultiplayerId();
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ gSavedLinkPlayers[i] = gLinkPlayers[i];
+ }
+}
+
+u8 sub_800AA48(void)
+{
+ return gSavedLinkPlayerCount;
+}
+
+u8 sub_800AA54(void)
+{
+ return gSavedMultiplayerId;
+}
+
+bool8 sub_800AA60(void)
+{
+ int i;
+ unsigned count;
+
+ count = 0;
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ {
+ if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId)
+ {
+ if (gLinkType == 0x2288)
+ {
+ if (gLinkType == gLinkPlayers[i].linkType)
+ {
+ count++;
+ }
+ }
+ else
+ {
+ count++;
+ }
+ }
+ }
+ if (count == gSavedLinkPlayerCount)
+ {
+ if (GetLinkPlayerCount_2() == gSavedLinkPlayerCount)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_800AAF4(void)
+{
+ int i;
+
+ // Clearly not what was meant to be written, but here it is anyway.
+ for (i = 0; i < 4; i++)
+ {
+ CpuSet(&gSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer));
+ }
+}
+
+void sub_800AB18(void)
+{
+ u8 i;
+
+ for (i = 0; i < gSavedLinkPlayerCount; i++)
+ {
+ if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0)
+ {
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ }
+ }
+}
+
+void sub_800AB98(void)
+{
+ gSavedLinkPlayerCount = 0;
+ gSavedMultiplayerId = 0;
+}
+
+u8 GetLinkPlayerCount_2(void)
+{
+ return EXTRACT_PLAYER_COUNT(gLinkStatus);
+}
+
+bool8 IsLinkMaster(void)
+{
+ if (gWirelessCommType)
+ {
+ return Rfu_IsMaster();
+ }
+ return EXTRACT_MASTER(gLinkStatus);
+}
+
+u8 sub_800ABE8(void)
+{
+ return gUnknown_03000D58;
+}
+
+void sub_800ABF4(u16 a0)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ task_add_05_task_del_08FA224_when_no_RfuFunc();
+ }
+ else
+ {
+ if (gLinkCallback == NULL)
+ {
+ gLinkCallback = sub_800AC80;
+ gUnknown_030030E4 = FALSE;
+ gUnknown_030030F4 = a0;
+ }
+ }
+}
+
+void sub_800AC34(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ task_add_05_task_del_08FA224_when_no_RfuFunc();
+ }
+ else
+ {
+ if (gLinkCallback != NULL)
+ {
+ gUnknown_02022B08++;
+ }
+ else
+ {
+ gLinkCallback = sub_800AC80;
+ gUnknown_030030E4 = FALSE;
+ gUnknown_030030F4 = 0;
+ }
+ }
+}
+
+static void sub_800AC80(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(LINKCMD_0x5FFF);
+ gLinkCallback = sub_800ACAC;
+ }
+}
+
+static void sub_800ACAC(void)
+{
+ int i;
+ unsigned count;
+ u8 linkPlayerCount;
+
+ linkPlayerCount = GetLinkPlayerCount();
+ count = 0;
+ for (i = 0; i < linkPlayerCount; i++)
+ {
+ if (gUnknown_030030F0[i])
+ {
+ count++;
+ }
+ }
+ if (count == linkPlayerCount)
+ {
+ gBattleTypeFlags &= ~BATTLE_TYPE_20;
+ gLinkVSyncDisabled = TRUE;
+ CloseLink();
+ gLinkCallback = NULL;
+ gUnknown_030030E4 = TRUE;
+ }
+}
+
+void sub_800AD10(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ task_add_05_task_del_08FA224_when_no_RfuFunc();
+ }
+ else
+ {
+ if (gLinkCallback != NULL)
+ {
+ gUnknown_02022B08++;
+ }
+ else
+ {
+ gLinkCallback = sub_800AD5C;
+ gUnknown_030030E4 = FALSE;
+ gUnknown_030030F4 = 0;
+ }
+ }
+}
+
+static void sub_800AD5C(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(LINKCMD_0x5FFF);
+ gLinkCallback = sub_800AD88;
+ }
+}
+
+static void sub_800AD88(void)
+{
+ int i;
+ unsigned count;
+ u8 linkPlayerCount;
+
+ linkPlayerCount = GetLinkPlayerCount();
+ count = 0;
+ for (i = 0; i < linkPlayerCount; i++)
+ {
+ if (gLinkPlayers[i].language == LANGUAGE_JAPANESE)
+ {
+ count++;
+ }
+ else if (gUnknown_030030F0[i])
+ {
+ count++;
+ }
+ }
+ if (count == linkPlayerCount)
+ {
+ gBattleTypeFlags &= ~BATTLE_TYPE_20;
+ gLinkVSyncDisabled = TRUE;
+ CloseLink();
+ gLinkCallback = NULL;
+ gUnknown_030030E4 = TRUE;
+ }
+}
+
+void sub_800ADF8(void)
+{
+ if (gWirelessCommType == TRUE)
+ {
+ sub_8010434();
+ }
+ else
+ {
+ if (gLinkCallback == NULL)
+ {
+ gLinkCallback = sub_800AE30;
+ }
+ gUnknown_030030E4 = FALSE;
+ }
+}
+
+static void sub_800AE30(void)
+{
+ if (gLastRecvQueueCount == 0)
+ {
+ BuildSendCmd(LINKCMD_0x2FFE);
+ gLinkCallback = sub_800AE5C;
+ }
+}
+
+static void sub_800AE5C(void)
+{
+ u8 i;
+ u8 linkPlayerCount;
+
+ linkPlayerCount = GetLinkPlayerCount();
+ for (i = 0; i < linkPlayerCount; i++)
+ {
+ if (!gUnknown_030030EC[i])
+ {
+ break;
+ }
+ }
+ if (i == linkPlayerCount)
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gUnknown_030030EC[i] = FALSE;
+ }
+ gLinkCallback = NULL;
+ }
+}
+
+static void CheckErrorStatus(void)
+{
+ if (gLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus))
+ {
+ if (!gSuppressLinkErrorMessage)
+ {
+ sLinkErrorBuffer.status = gLinkStatus;
+ sLinkErrorBuffer.lastRecvQueueCount = gLastRecvQueueCount;
+ sLinkErrorBuffer.lastSendQueueCount = gLastSendQueueCount;
+ SetMainCallback2(CB2_LinkError);
+ }
+ gLinkErrorOccurred = TRUE;
+ CloseLink();
+ }
+}
+
+void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
+{
+ sLinkErrorBuffer.status = status;
+ sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;
+ sLinkErrorBuffer.lastRecvQueueCount = lastRecvQueueCount;
+ sLinkErrorBuffer.unk_06 = unk_06;
+}
+
+void CB2_LinkError(void)
+{
+ u8 *tilemapBuffer;
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ m4aMPlayStop(&gMPlayInfo_SE3);
+ InitHeap(gHeap, HEAP_SIZE);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetPaletteFadeControl();
+ FillPalette(0, 0, 2);
+ ResetTasks();
+ ScanlineEffect_Stop();
+ if (gWirelessCommType)
+ {
+ if (!sLinkErrorBuffer.unk_06)
+ {
+ gWirelessCommType = 3;
+ }
+ sub_800E604();
+ }
+ SetVBlankCallback(sub_80096BC);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_082ED1FC, 2);
+ gUnknown_02022B0C = tilemapBuffer = malloc(0x800);
+ SetBgTilemapBuffer(1, tilemapBuffer);
+ if (InitWindows(gUnknown_082ED204))
+ {
+ DeactivateAllTextPrinters();
+ reset_temp_tile_data_buffers();
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON);
+ LoadPalette(gUnknown_0860F074, 0xf0, 0x20);
+ gSoftResetDisabled = FALSE;
+ CreateTask(Task_DestroySelf, 0);
+ StopMapMusic();
+ gMain.callback1 = NULL;
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ SetMainCallback2(CB2_PrintErrorMessage);
+ }
+}
+
+static void sub_800B080(void)
+{
+ LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0);
+ copy_decompressed_tile_data_to_vram_autofree(1, gWirelessLinkDisplayGfx, FALSE, 0, 0);
+ CopyToBgTilemapBuffer(1, gWirelessLinkDisplayTilemap, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ LoadPalette(gWirelessLinkDisplayPal, 0, 0x20);
+ FillWindowPixelBuffer(0, 0x00);
+ FillWindowPixelBuffer(2, 0x00);
+ box_print(0, 3, 2, 6, gUnknown_082ED224, 0, gText_CommErrorEllipsis);
+ box_print(2, 3, 2, 1, gUnknown_082ED224, 0, gText_MoveCloserToLinkPartner);
+ PutWindowTilemap(0);
+ PutWindowTilemap(2);
+ CopyWindowToVram(0, 0);
+ CopyWindowToVram(2, 3);
+}
+
+static void sub_800B138(void)
+{
+ LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0);
+ FillWindowPixelBuffer(1, 0x00);
+ FillWindowPixelBuffer(2, 0x00);
+ box_print(1, 3, 2, 0, gUnknown_082ED224, 0, gText_CommErrorCheckConnections);
+ PutWindowTilemap(1);
+ PutWindowTilemap(2);
+ CopyWindowToVram(1, 0);
+ CopyWindowToVram(2, 3);
+}
+
+static void CB2_PrintErrorMessage(void)
+{
+ switch (gMain.state)
+ {
+ case 00:
+ if (sLinkErrorBuffer.unk_06)
+ {
+ sub_800B080();
+ }
+ else
+ {
+ sub_800B138();
+ }
+ break;
+ case 02:
+ ShowBg(0);
+ if (sLinkErrorBuffer.unk_06)
+ {
+ ShowBg(1);
+ }
+ break;
+ case 30:
+ PlaySE(SE_BOO);
+ break;
+ case 60:
+ PlaySE(SE_BOO);
+ break;
+ case 90:
+ PlaySE(SE_BOO);
+ break;
+ case 130:
+ if (gWirelessCommType == 2)
+ {
+ box_print(0, 3, 2, 20, gUnknown_082ED224, 0, gText_ABtnTitleScreen);
+ }
+ else if (gWirelessCommType == 1)
+ {
+ box_print(0, 3, 2, 20, gUnknown_082ED224, 0, gText_ABtnRegistrationCounter);
+ }
+ break;
+ }
+ if (gMain.state == 160)
+ {
+ if (gWirelessCommType == 1)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_PIN);
+ gWirelessCommType = 0;
+ sLinkErrorBuffer.unk_06 = 0;
+ sub_81700F8();
+ }
+ }
+ else if (gWirelessCommType == 2)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ rfu_REQ_stopMode();
+ rfu_waitREQComplete();
+ DoSoftReset();
+ }
+ }
+ }
+ if (gMain.state != 160)
+ {
+ gMain.state++;
+ }
+}
+
+// TODO: there might be a file boundary here, let's name it
+
+bool8 GetSioMultiSI(void)
+{
+ return (REG_SIOCNT & 0x04) != 0;
+}
+
+static bool8 IsSioMultiMaster(void)
+{
+ return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04);
+}
+
+bool8 IsLinkConnectionEstablished(void)
+{
+ return EXTRACT_CONN_ESTABLISHED(gLinkStatus);
+}
+
+void SetSuppressLinkErrorMessage(bool8 flag)
+{
+ gSuppressLinkErrorMessage = flag;
+}
+
+bool8 HasLinkErrorOccurred(void)
+{
+ return gLinkErrorOccurred;
+}
+
+void sub_800B348(void)
+{
+ struct LinkPlayerBlock *block;
+
+ InitLocalLinkPlayer();
+ block = &gLocalLinkPlayerBlock;
+ block->linkPlayer = gLocalLinkPlayer;
+ memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1);
+ memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1);
+ memcpy(gBlockSendBuffer, block, sizeof(*block));
+}
+
+void sub_800B3A4(u32 who)
+{
+ u8 who_ = who;
+ struct LinkPlayerBlock *block;
+ struct LinkPlayer *player;
+
+ block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_];
+ player = &gLinkPlayers[who_];
+ *player = block->linkPlayer;
+ sub_800B524(player);
+ if (strcmp(block->magic1, gASCIIGameFreakInc) != 0 || strcmp(block->magic2, gASCIIGameFreakInc) != 0)
+ {
+ SetMainCallback2(CB2_LinkError);
+ }
+}
+
+bool8 HandleLinkConnection(void)
+{
+ bool32 r4;
+ bool32 r5;
+
+ if (gWirelessCommType == 0)
+ {
+ gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds);
+ LinkMain2(&gMain.heldKeys);
+ if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && sub_808766C() == TRUE)
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ r4 = sub_8010EC0();
+ r5 = sub_8010F1C();
+ if (sub_808766C() == TRUE)
+ {
+ if (r4 == TRUE || sub_800F0B8() || r5)
+ {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void sub_800B488(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gWirelessCommType = 1;
+ }
+}
+
+static void sub_800B4A4(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gWirelessCommType = 0;
+ }
+}
+
+void sub_800B4C0(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gWirelessCommType = 0;
+ }
+}
+
+u32 sub_800B4DC(void)
+{
+ if (gWirelessCommType != 0)
+ {
+ return sub_80124D4();
+ }
+ return gLink.recvQueue.count;
+}
+
+bool8 sub_800B504(void)
+{
+ if (sub_800B4DC() > 2)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u8 sub_800B518(void)
+{
+ return gWirelessCommType;
+}
+
+void sub_800B524(struct LinkPlayer *player)
+{
+ player->name[10] = player->name[8];
+ ConvertInternationalString(player->name, player->language);
+}
+
+static void DisableSerial(void)
+{
+ DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_SIOCNT = SIO_MULTI_MODE;
+ REG_TMCNT_H(3) = 0;
+ REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;
+ REG_SIOMLT_SEND = 0;
+ REG_SIOMLT_RECV = 0;
+ CpuFill32(0, &gLink, sizeof(gLink));
+}
+
+static void EnableSerial(void)
+{
+ DisableInterrupts(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ REG_RCNT = 0;
+ REG_SIOCNT = SIO_MULTI_MODE;
+ REG_SIOCNT |= SIO_115200_BPS | SIO_INTR_ENABLE;
+ EnableInterrupts(INTR_FLAG_SERIAL);
+ REG_SIOMLT_SEND = 0;
+ CpuFill32(0, &gLink, sizeof(gLink));
+ sNumVBlanksWithoutSerialIntr = 0;
+ sSendNonzeroCheck = 0;
+ sRecvNonzeroCheck = 0;
+ sChecksumAvailable = 0;
+ sHandshakePlayerCount = 0;
+ gLastSendQueueCount = 0;
+ gLastRecvQueueCount = 0;
+}
+
+void ResetSerial(void)
+{
+ EnableSerial();
+ DisableSerial();
+}
+
+// link_main1.c
+
+u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH])
+{
+ u32 retVal;
+ u32 retVal2;
+
+ switch (gLink.state)
+ {
+ case LINK_STATE_START0:
+ DisableSerial();
+ gLink.state = 1;
+ break;
+ case LINK_STATE_START1:
+ if (*shouldAdvanceLinkState == 1)
+ {
+ EnableSerial();
+ gLink.state = 2;
+ }
+ break;
+ case LINK_STATE_HANDSHAKE:
+ switch (*shouldAdvanceLinkState)
+ {
+ default:
+ CheckMasterOrSlave();
+ break;
+ case 1:
+ if (gLink.isMaster == LINK_MASTER && gLink.playerCount > 1)
+ {
+ gLink.handshakeAsMaster = TRUE;
+ }
+ break;
+ case 2:
+ gLink.state = LINK_STATE_START0;
+ REG_SIOMLT_SEND = 0;
+ break;
+ }
+ break;
+ case LINK_STATE_INIT_TIMER:
+ InitTimer();
+ gLink.state = LINK_STATE_CONN_ESTABLISHED;
+ // fallthrough
+ case LINK_STATE_CONN_ESTABLISHED:
+ EnqueueSendCmd(sendCmd);
+ DequeueRecvCmds(recvCmds);
+ break;
+ }
+ *shouldAdvanceLinkState = 0;
+ retVal = gLink.localId;
+ retVal |= (gLink.playerCount << LINK_STAT_PLAYER_COUNT_SHIFT);
+ if (gLink.isMaster == LINK_MASTER)
+ {
+ retVal |= LINK_STAT_MASTER;
+ }
+ {
+ u32 receivedNothing = gLink.receivedNothing << LINK_STAT_RECEIVED_NOTHING_SHIFT;
+ u32 link_field_F = gLink.link_field_F << LINK_STAT_UNK_FLAG_9_SHIFT;
+ u32 hardwareError = gLink.hardwareError << LINK_STAT_ERROR_HARDWARE_SHIFT;
+ u32 badChecksum = gLink.badChecksum << LINK_STAT_ERROR_CHECKSUM_SHIFT;
+ u32 queueFull = gLink.queueFull << LINK_STAT_ERROR_QUEUE_FULL_SHIFT;
+ u32 val;
+
+ if (gLink.state == LINK_STATE_CONN_ESTABLISHED)
+ {
+ val = LINK_STAT_CONN_ESTABLISHED;
+ val |= receivedNothing;
+ val |= retVal;
+ val |= link_field_F;
+ val |= hardwareError;
+ val |= badChecksum;
+ val |= queueFull;
+ }
+ else
+ {
+ val = retVal;
+ val |= receivedNothing;
+ val |= link_field_F;
+ val |= hardwareError;
+ val |= badChecksum;
+ val |= queueFull;
+ }
+
+ retVal = val;
+ }
+
+ if (gLink.lag == LAG_MASTER)
+ {
+ retVal |= LINK_STAT_ERROR_LAG_MASTER;
+ }
+
+ if (gLink.localId >= MAX_LINK_PLAYERS)
+ {
+ retVal |= LINK_STAT_ERROR_INVALID_ID;
+ }
+
+ retVal2 = retVal;
+ if (gLink.lag == LAG_SLAVE)
+ {
+ retVal2 |= LINK_STAT_ERROR_LAG_SLAVE;
+ }
+
+ return retVal2;
+}
+
+static void CheckMasterOrSlave(void)
+{
+ u32 terminals;
+
+ terminals = *(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI);
+ if (terminals == SIO_MULTI_SD && gLink.localId == 0)
+ {
+ gLink.isMaster = LINK_MASTER;
+ }
+ else
+ {
+ gLink.isMaster = LINK_SLAVE;
+ }
+}
+
+static void InitTimer(void)
+{
+ if (gLink.isMaster)
+ {
+ REG_TM3CNT_L = -197;
+ REG_TM3CNT_H = TIMER_64CLK | TIMER_INTR_ENABLE;
+ EnableInterrupts(INTR_FLAG_TIMER3);
+ }
+}
+
+static void EnqueueSendCmd(u16 *sendCmd)
+{
+ u8 i;
+ u8 offset;
+
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ if (gLink.sendQueue.count < QUEUE_CAPACITY)
+ {
+ offset = gLink.sendQueue.pos + gLink.sendQueue.count;
+ if (offset >= QUEUE_CAPACITY)
+ {
+ offset -= QUEUE_CAPACITY;
+ }
+ for (i = 0; i < CMD_LENGTH; i++)
+ {
+ sSendNonzeroCheck |= *sendCmd;
+ gLink.sendQueue.data[i][offset] = *sendCmd;
+ *sendCmd = 0;
+ sendCmd++;
+ }
+ }
+ else
+ {
+ gLink.queueFull = QUEUE_FULL_SEND;
+ }
+ if (sSendNonzeroCheck)
+ {
+ gLink.sendQueue.count++;
+ sSendNonzeroCheck = 0;
+ }
+ REG_IME = gLinkSavedIme;
+ gLastSendQueueCount = gLink.sendQueue.count;
+}
+
+
+static void DequeueRecvCmds(u16 (*recvCmds)[CMD_LENGTH])
+{
+ u8 i;
+ u8 j;
+
+ gLinkSavedIme = REG_IME;
+ REG_IME = 0;
+ if (gLink.recvQueue.count == 0)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ for (j = 0; j < CMD_LENGTH; j++)
+ {
+ recvCmds[i][j] = 0;
+ }
+ }
+
+ gLink.receivedNothing = TRUE;
+ }
+ else
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ for (j = 0; j < CMD_LENGTH; j++)
+ {
+ recvCmds[i][j] = gLink.recvQueue.data[i][j][gLink.recvQueue.pos];
+ }
+ }
+ gLink.recvQueue.count--;
+ gLink.recvQueue.pos++;
+ if (gLink.recvQueue.pos >= QUEUE_CAPACITY)
+ {
+ gLink.recvQueue.pos = 0;
+ }
+ gLink.receivedNothing = FALSE;
+ }
+ REG_IME = gLinkSavedIme;
+}
+
+// link_intr.c
+
+void LinkVSync(void)
+{
+ if (gLink.isMaster)
+ {
+ switch (gLink.state)
+ {
+ case LINK_STATE_CONN_ESTABLISHED:
+ if (gLink.serialIntrCounter < 9)
+ {
+ if (gLink.hardwareError != TRUE)
+ {
+ gLink.lag = LAG_MASTER;
+ }
+ else
+ {
+ StartTransfer();
+ }
+ }
+ else if (gLink.lag != LAG_MASTER)
+ {
+ gLink.serialIntrCounter = 0;
+ StartTransfer();
+ }
+ break;
+ case LINK_STATE_HANDSHAKE:
+ StartTransfer();
+ break;
+ }
+ }
+ else if (gLink.state == LINK_STATE_CONN_ESTABLISHED || gLink.state == LINK_STATE_HANDSHAKE)
+ {
+ if (++sNumVBlanksWithoutSerialIntr > 10)
+ {
+ if (gLink.state == LINK_STATE_CONN_ESTABLISHED)
+ {
+ gLink.lag = LAG_SLAVE;
+ }
+ if (gLink.state == LINK_STATE_HANDSHAKE)
+ {
+ gLink.playerCount = 0;
+ gLink.link_field_F = FALSE;
+ }
+ }
+ }
+}
+
+void Timer3Intr(void)
+{
+ StopTimer();
+ StartTransfer();
+}
+
+void SerialCB(void)
+{
+ gLink.localId = SIO_MULTI_CNT->id;
+ switch (gLink.state)
+ {
+ case LINK_STATE_CONN_ESTABLISHED:
+ gLink.hardwareError = SIO_MULTI_CNT->error;
+ DoRecv();
+ DoSend();
+ SendRecvDone();
+ break;
+ case LINK_STATE_HANDSHAKE:
+ if (DoHandshake())
+ {
+ if (gLink.isMaster)
+ {
+ gLink.state = LINK_STATE_INIT_TIMER;
+ gLink.serialIntrCounter = 8;
+ }
+ else
+ {
+ gLink.state = LINK_STATE_CONN_ESTABLISHED;
+ }
+ }
+ break;
+ }
+ gLink.serialIntrCounter++;
+ sNumVBlanksWithoutSerialIntr = 0;
+ if (gLink.serialIntrCounter == 8)
+ {
+ gLastRecvQueueCount = gLink.recvQueue.count;
+ }
+}
+
+static void StartTransfer(void)
+{
+ REG_SIOCNT |= SIO_START;
+}
+
+static bool8 DoHandshake(void)
+{
+ u8 i;
+ u8 playerCount;
+ u16 minRecv;
+
+ playerCount = 0;
+ minRecv = 0xFFFF;
+ if (gLink.handshakeAsMaster == TRUE)
+ {
+ REG_SIOMLT_SEND = MASTER_HANDSHAKE;
+ }
+ else
+ {
+ REG_SIOMLT_SEND = SLAVE_HANDSHAKE;
+ }
+ *(u64 *)gLink.tempRecvBuffer = REG_SIOMLT_RECV;
+ REG_SIOMLT_RECV = 0;
+ gLink.handshakeAsMaster = FALSE;
+ for (i = 0; i < 4; i++)
+ {
+ if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE)
+ {
+ playerCount++;
+ if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0)
+ {
+ minRecv = gLink.tempRecvBuffer[i];
+ }
+ }
+ else
+ {
+ if (gLink.tempRecvBuffer[i] != 0xFFFF)
+ {
+ playerCount = 0;
+ }
+ break;
+ }
+ }
+ gLink.playerCount = playerCount;
+ if (gLink.playerCount > 1 && gLink.playerCount == sHandshakePlayerCount && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE)
+ {
+ return TRUE;
+ }
+ if (gLink.playerCount > 1)
+ {
+ gLink.link_field_F = (minRecv & 3) + 1;
+ }
+ else
+ {
+ gLink.link_field_F = 0;
+ }
+ sHandshakePlayerCount = gLink.playerCount;
+ return FALSE;
+}
+
+static void DoRecv(void)
+{
+ u16 recv[4];
+ u8 i;
+ u8 index;
+
+ *(u64 *)recv = REG_SIOMLT_RECV;
+ if (gLink.sendCmdIndex == 0)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ if (gLink.checksum != recv[i] && sChecksumAvailable)
+ {
+ gLink.badChecksum = TRUE;
+ }
+ }
+ gLink.checksum = 0;
+ sChecksumAvailable = TRUE;
+ }
+ else
+ {
+ index = gLink.recvQueue.pos + gLink.recvQueue.count;
+ if (index >= QUEUE_CAPACITY)
+ {
+ index -= QUEUE_CAPACITY;
+ }
+ if (gLink.recvQueue.count < QUEUE_CAPACITY)
+ {
+ for (i = 0; i < gLink.playerCount; i++)
+ {
+ gLink.checksum += recv[i];
+ sRecvNonzeroCheck |= recv[i];
+ gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recv[i];
+ }
+ }
+ else
+ {
+ gLink.queueFull = QUEUE_FULL_RECV;
+ }
+ gLink.recvCmdIndex++;
+ if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck)
+ {
+ gLink.recvQueue.count++;
+ sRecvNonzeroCheck = 0;
+ }
+ }
+}
+
+static void DoSend(void)
+{
+ if (gLink.sendCmdIndex == CMD_LENGTH)
+ {
+ REG_SIOMLT_SEND = gLink.checksum;
+ if (!sSendBufferEmpty)
+ {
+ gLink.sendQueue.count--;
+ gLink.sendQueue.pos++;
+ if (gLink.sendQueue.pos >= QUEUE_CAPACITY)
+ {
+ gLink.sendQueue.pos = 0;
+ }
+ }
+ else
+ {
+ sSendBufferEmpty = FALSE;
+ }
+ }
+ else
+ {
+ if (!sSendBufferEmpty && gLink.sendQueue.count == 0)
+ {
+ sSendBufferEmpty = TRUE;
+ }
+ if (sSendBufferEmpty)
+ {
+ REG_SIOMLT_SEND = 0;
+ }
+ else
+ {
+ REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos];
+ }
+ gLink.sendCmdIndex++;
+ }
+}
+
+static void StopTimer(void)
+{
+ if (gLink.isMaster)
+ {
+ REG_TM3CNT_H &= ~TIMER_ENABLE;
+ REG_TM3CNT_L = -197;
+ }
+}
+
+static void SendRecvDone(void)
+{
+ if (gLink.recvCmdIndex == CMD_LENGTH)
+ {
+ gLink.sendCmdIndex = 0;
+ gLink.recvCmdIndex = 0;
+ }
+ else if (gLink.isMaster)
+ {
+ REG_TM3CNT_H |= TIMER_ENABLE;
+ }
+}
+
+void ResetSendBuffer(void)
+{
+ u8 i;
+ u8 j;
+
+ gLink.sendQueue.count = 0;
+ gLink.sendQueue.pos = 0;
+ for (i = 0; i < CMD_LENGTH; i++)
+ {
+ for (j = 0; j < QUEUE_CAPACITY; j++)
+ {
+ gLink.sendQueue.data[i][j] = 0xEFFF;
+ }
+ }
+}
+
+void ResetRecvBuffer(void)
+{
+ u8 i;
+ u8 j;
+ u8 k;
+
+ gLink.recvQueue.count = 0;
+ gLink.recvQueue.pos = 0;
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ for (j = 0; j < CMD_LENGTH; j++)
+ {
+ for (k = 0; k < QUEUE_CAPACITY; k++)
+ {
+ gLink.recvQueue.data[i][j][k] = 0xEFFF;
+ }
+ }
+ }
+}
diff --git a/src/link_rfu.c b/src/link_rfu.c
new file mode 100644
index 000000000..29256899d
--- /dev/null
+++ b/src/link_rfu.c
@@ -0,0 +1,4942 @@
+
+// Includes
+#include "global.h"
+#include "malloc.h"
+#include "battle.h"
+#include "berry_blender.h"
+#include "task.h"
+#include "random.h"
+#include "decompress.h"
+#include "text.h"
+#include "string_util.h"
+#include "event_data.h"
+#include "overworld.h"
+#include "link.h"
+#include "librfu.h"
+#include "rom_8011DC0.h"
+#include "link_rfu.h"
+
+extern u16 gUnknown_03005DA8;
+
+// Static type declarations
+
+// Static RAM declarations
+
+struct UnkRfuStruct_1 gUnknown_03004140;
+struct UnkRfuStruct_2 gUnknown_03005000;
+
+IWRAM_DATA u8 gUnknown_03000D74;
+ALIGNED(4) IWRAM_DATA u8 gUnknown_03000D78[8];
+IWRAM_DATA u8 gUnknown_03000D80[16];
+IWRAM_DATA u16 gUnknown_03000D90[8];
+
+EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0;
+EWRAM_DATA ALIGNED(4) struct UnkLinkRfuStruct_02022B14 gUnknown_02022B14 = {};
+EWRAM_DATA ALIGNED(2) u8 gUnknown_02022B22[8] = {};
+EWRAM_DATA struct UnkLinkRfuStruct_02022B2C gUnknown_02022B2C = {};
+EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_02022B44 = {};
+
+// Static ROM declarations
+
+static void sub_800C000(void);
+static void sub_800C7B4(u16 r8, u16 r6);
+static void sub_800C744(u32 a0);
+static void sub_800CEB0(u16 r6);
+static void sub_800CF34(void);
+static void sub_800D158(void);
+static void sub_800D20C(void);
+static void sub_800D268(void);
+static u8 sub_800D294(void);
+static void sub_800D30C(u8 a0, u8 a1);
+static void sub_800D334(u8 a0);
+static void sub_800D358(u8 a0);
+static void sub_800D434(void);
+static void sub_800D610(void);
+void sub_800D630(void);
+static bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
+static void sub_800EAB4(void);
+static void sub_800EAFC(void);
+void sub_800ED34(u16 unused);
+static void sub_800EDBC(u16 unused);
+static void sub_800F048(void);
+static void sub_800F86C(u8 unused);
+static void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data);
+void sub_800FD14(u16 command);
+static void rfufunc_80F9F44(void);
+static void sub_800FFB0(void);
+static void rfufunc_80FA020(void);
+bool32 sub_8010454(u32 a0);
+static void sub_8010528(void);
+void sub_8010750(void);
+int sub_80107A0(void);
+void sub_801084C(u8 taskId);
+void sub_80109E8(u16 a0);
+void sub_8010A70(void *a0);
+void sub_8010AAC(u8 taskId);
+void sub_8010D0C(u8 taskId);
+void sub_80115EC(u16 a0);
+u8 sub_8011CE4(const u8 *a0, u16 a1);
+void sub_8011D6C(u8 a0);
+void sub_8011E94(u8 a0, u8 a1);
+u8 sub_8012224(void);
+void sub_801227C(void);
+
+// .rodata
+
+const u16 gWirelessLinkIconPalette[] = INCBIN_U16("graphics/interface/wireless_link_icon.gbapal");
+const u8 gWirelessLinkIconPic[] = INCBIN_U8("graphics/interface/wireless_link_icon.4bpp.lz");
+const u8 sWireless_ASCIItoRSETable[] = {
+ 0xff, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x00, 0xab, 0xb5, 0xb6, 0xb1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xf1, 0x00, 0xae, 0xad, 0xba,
+ 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0x00, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+ 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1,
+ 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
+ 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1,
+ 0xd2, 0xd3, 0xd4, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
+ 0x00, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb,
+ 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0x2d, 0x2f, 0x30, 0x31, 0x32,
+ 0x33, 0x34, 0x35, 0x36, 0x50, 0x00, 0x01, 0x02,
+ 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
+ 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
+ 0x1b, 0xad, 0xb3, 0xb4, 0x00, 0xaf, 0x7d, 0x7f,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0xa0,
+ 0xae, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7e, 0xb0, 0xac,
+ 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
+ 0x2c, 0x2e, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c,
+ 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94
+};
+const u8 sWireless_RSEtoASCIITable[] = {
+ 0x20, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c,
+ 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
+ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c,
+ 0x9d, 0x9e, 0x9f, 0xa0, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0x7b, 0xf1, 0x7c,
+ 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ 0x84, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xa6, 0xdd, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xf2,
+ 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
+ 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x01, 0x02, 0x03,
+ 0x04, 0x05, 0x06, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+ 0xaf, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
+ 0x37, 0x38, 0x39, 0x21, 0xdf, 0xa1, 0xb0, 0xa5,
+ 0xde, 0x24, 0x2a, 0xa2, 0xa3, 0x22, 0x23, 0x20,
+ 0xa4, 0x20, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45,
+ 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d,
+ 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+ 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63,
+ 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x20,
+ 0x20, 0x2b, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00
+};
+const struct OamData sWirelessStatusIndicatorOamData = {
+ .size = 1
+};
+static const union AnimCmd sWirelessStatusIndicatorAnim0[] = {
+ // 3 bars
+ ANIMCMD_FRAME( 4, 5),
+ ANIMCMD_FRAME( 8, 5),
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_FRAME(16, 10),
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_FRAME( 8, 5),
+ ANIMCMD_JUMP(0)
+};
+static const union AnimCmd sWirelessStatusIndicatorAnim1[] = {
+ // 2 bars
+ ANIMCMD_FRAME( 4, 5),
+ ANIMCMD_FRAME( 8, 5),
+ ANIMCMD_FRAME(12, 10),
+ ANIMCMD_FRAME( 8, 5),
+ ANIMCMD_JUMP(0)
+};
+static const union AnimCmd sWirelessStatusIndicatorAnim2[] = {
+ // 1 bar
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_JUMP(0)
+};
+static const union AnimCmd sWirelessStatusIndicatorAnim3[] = {
+ // searching
+ ANIMCMD_FRAME( 4, 10),
+ ANIMCMD_FRAME(20, 10),
+ ANIMCMD_JUMP(0)
+};
+static const union AnimCmd sWirelessStatusIndicatorAnim4[] = {
+ // error
+ ANIMCMD_FRAME(24, 10),
+ ANIMCMD_FRAME( 4, 10),
+ ANIMCMD_JUMP(0)
+};
+static const union AnimCmd *const sWirelessStatusIndicatorAnims[] = {
+ sWirelessStatusIndicatorAnim0,
+ sWirelessStatusIndicatorAnim1,
+ sWirelessStatusIndicatorAnim2,
+ sWirelessStatusIndicatorAnim3,
+ sWirelessStatusIndicatorAnim4
+};
+const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = {
+ gWirelessLinkIconPic, 0x0380, 0xD431
+};
+const struct SpritePalette sWirelessStatusIndicatorSpritePalette = {
+ gWirelessLinkIconPalette, 0xD432
+};
+static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {
+ 0xD431,
+ 0xD432,
+ &sWirelessStatusIndicatorOamData,
+ sWirelessStatusIndicatorAnims,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+const struct UnkLinkRfuStruct_02022B2C gUnknown_082ED608 = {
+ 0x04, 0x20, 0x00, 0x00, 0x02,
+ &gUnknown_02022B14,
+ gUnknown_02022B22,
+ 0x01, 0x00, 0x258, 0x12c
+};
+const u8 gUnknown_082ED620[] = {
+ 0, 3, 2, 1, 0
+};
+const u32 gUnknown_082ED628[] = {
+ 0x000000,
+ 0x000001,
+ 0x000003,
+ 0x000007,
+ 0x00000f,
+ 0x00001f,
+ 0x00003f,
+ 0x00007f,
+ 0x0000ff,
+ 0x0001ff,
+ 0x0003ff,
+ 0x0007ff,
+ 0x000fff,
+ 0x001fff,
+ 0x003fff,
+ 0x007fff,
+ 0x00ffff,
+ 0x01ffff,
+ 0x03ffff,
+ 0x07ffff,
+ 0x0fffff,
+ 0x1fffff,
+ 0x3fffff,
+ 0x7fffff,
+ 0xffffff
+};
+const u8 gUnknown_082ED68C[] = {
+ 0, 0, 1,
+ 1, 2, 2,
+ 2, 2, 3
+};
+const u8 gUnknown_082ED695[] = {
+ 0, 1, 1, 2,
+ 1, 2, 2, 3,
+ 1, 2, 2, 3,
+ 2, 3, 3, 4
+};
+const u8 gUnknown_082ED6A5[] = {
+ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
+};
+const struct {
+ u8 *buffer;
+ u32 size;
+} gUnknown_082ED6B8[] = {
+ { gBlockSendBuffer, 200 },
+ { gBlockSendBuffer, 200 },
+ { gBlockSendBuffer, 100 },
+ { gBlockSendBuffer, 220 },
+ { gBlockSendBuffer, 40 }
+};
+const u16 gUnknown_082ED6E0[] = {
+ 0x0002, 0x7f7d, 0x0000, 0xffff
+};
+
+const char sUnref_082ED6E8[][15] = {
+ "RFU WAIT",
+ "RFU BOOT",
+ "RFU ERROR",
+ "RFU RESET",
+ "RFU CONFIG",
+ "RFU START",
+ "RFU SC POLL",
+ "RFU SP POLL",
+ "RFU START",
+ "RFU SEND ERR",
+ "RFU CP POLL"
+};
+const char sUnref_082ED6E9[][16] = {
+ " ",
+ "RECOVER START ",
+ "DISSCONECT ",
+ "RECOVER SUUSES",
+ "RECOVER FAILED"
+};
+const TaskFunc gUnknown_082ED7E0[] = {
+ sub_801084C,
+ sub_8010AAC,
+ sub_8010D0C
+};
+const char gUnknown_082ED7EC[] = "PokemonSioInfo";
+const char gUnknown_082ED7FC[] = "LINK LOSS DISCONNECT!";
+const char gUnknown_082ED814[] = "LINK LOSS RECOVERY NOW";
+
+// .text
+
+u32 sub_800BEC0(void)
+{
+ u32 r4;
+
+ r4 = rfu_REQBN_softReset_and_checkID();
+ if (r4 == 0x8001)
+ {
+ gUnknown_03004140.unk_08 = 1;
+ }
+ if (gUnknown_03004140.unk_04 != 0x17 && gUnknown_03004140.unk_04 != 0x01)
+ {
+ gUnknown_03004140.unk_05 = 0;
+ gUnknown_03004140.unk_04 = 0;
+ }
+ gUnknown_03004140.unk_07 = 0;
+ gUnknown_03004140.unk_0d = 0;
+ gUnknown_03004140.unk_01 = 0;
+ gUnknown_03004140.unk_00 = 0;
+ gUnknown_03004140.unk_06 = -1;
+ sub_800D610();
+ return r4;
+}
+
+void rfu_REQ_sendData_wrapper(u8 r2)
+{
+ u8 val;
+ if (!gUnknown_03007890->unk_00)
+ {
+ val = gUnknown_03004140.unk_02;
+ r2 = 0;
+ if (val == 1)
+ {
+ r2 = 1;
+ }
+ }
+ else
+ {
+ gUnknown_03004140.unk_03 = 0;
+ }
+ rfu_REQ_sendData(r2);
+}
+
+int sub_800BF4C(void (*func1)(u8, u8), void (*func2)(u16))
+{
+ if (func1 == NULL)
+ {
+ return 4;
+ }
+ CpuFill16(0, &gUnknown_03004140, offsetof(struct UnkRfuStruct_1, filler_48));
+ gUnknown_03004140.unk_06 = -1;
+ gUnknown_03004140.unk_40 = func1;
+ gUnknown_03004140.unk_44 = func2;
+ rfu_setMSCCallback(sub_800CEB0);
+ rfu_setREQCallback(sub_800C7B4);
+ return 0;
+}
+
+void sub_800BFA0(void)
+{
+ CpuFill16(0, &gUnknown_03004140, offsetof(struct UnkRfuStruct_1, unk_40));
+ gUnknown_03004140.unk_06 = -1;
+}
+
+void sub_800BFCC(const struct UnkLinkRfuStruct_02022B2C *unk0)
+{
+ sub_800C000();
+ gUnknown_03004140.unk_04 = 1;
+ gUnknown_03004140.unk_05 = 2;
+ gUnknown_03004140.unk_3c = unk0;
+ gUnknown_03004140.unk_09 = unk0->unk_11;
+ gUnknown_03004140.unk_32 = unk0->unk_12;
+ gUnknown_03004140.unk_18 = unk0->unk_14;
+ if (unk0->unk_10)
+ {
+ gUnknown_03004140.unk_0b = 1;
+ }
+}
+
+static void sub_800C000(void)
+{
+ u8 i;
+
+ gUnknown_03004140.unk_05 = 0;
+ gUnknown_03004140.unk_04 = 0;
+ gUnknown_03004140.unk_06 = -1;
+ gUnknown_03004140.unk_07 = 0;
+ gUnknown_03004140.unk_10 = 0;
+ gUnknown_03004140.unk_0c = 0;
+ gUnknown_03004140.unk_24 = 0;
+ gUnknown_03004140.unk_30 = 0;
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_03004140.unk_28[i] = 0;
+ gUnknown_03004140.unk_34[i] = 0;
+ }
+}
+
+void sub_800C048(void)
+{
+ gUnknown_03004140.unk_04 = 0x15;
+}
+
+u8 sub_800C054(u8 r5, u16 r7, u16 r8, const u16 *r6)
+{
+ u8 i;
+ const u16 *buffer;
+
+ if (gUnknown_03004140.unk_04 != 0 && (gUnknown_03004140.unk_04 != 0x08 || r5 != 1))
+ {
+ gUnknown_03004140.unk_14 = 1;
+ sub_800D30C(0xf3, 0x01);
+ return 1;
+ }
+ if (!rfu_getMasterSlave())
+ {
+ gUnknown_03004140.unk_14 = 2;
+ sub_800D30C(0xf3, 0x01);
+ return 2;
+ }
+ for (i = 0, buffer = r6; i < 16; i++)
+ {
+ if (*buffer++ == 0xFFFF)
+ {
+ break;
+ }
+ }
+ if (i == 16)
+ {
+ gUnknown_03004140.unk_14 = 4;
+ sub_800D30C(0xf3, 0x01);
+ return 4;
+ }
+ if (r5 > 1)
+ {
+ gUnknown_03004140.unk_07 = 1;
+ r5 = 1;
+ r7 = 0;
+ }
+ else
+ {
+ gUnknown_03004140.unk_07 = 0;
+ }
+ if (r5 != 0)
+ {
+ gUnknown_03004140.unk_04 = 5;
+ }
+ else
+ {
+ gUnknown_03004140.unk_04 = 9;
+ if (gUnknown_03004140.unk_0b)
+ {
+ gUnknown_03004140.unk_0b = 2;
+ }
+ }
+ gUnknown_03004140.unk_06 = r5;
+ gUnknown_03004140.unk_1a = r7;
+ gUnknown_03004140.unk_26 = r8;
+ gUnknown_03004140.unk_20 = r6;
+ return 0;
+}
+
+u8 sub_800C12C(u16 r6, u16 r8)
+{
+ u8 i;
+ struct RfuUnk5 *tmp;
+
+ if (gUnknown_03004140.unk_04 != 0 && (gUnknown_03004140.unk_04 < 9 || gUnknown_03004140.unk_04 > 11))
+ {
+ gUnknown_03004140.unk_14 = 1;
+ sub_800D30C(0xF3, 0x01);
+ return 1;
+ }
+ if (!rfu_getMasterSlave())
+ {
+ gUnknown_03004140.unk_14 = 2;
+ sub_800D30C(0xF3, 0x01);
+ return 2;
+ }
+ for (i = 0; i < gUnknown_03007890->unk_08; i++)
+ {
+ if (gUnknown_03007890->unk_14[i].unk_00 == r6)
+ {
+ break;
+ }
+ }
+ if (gUnknown_03007890->unk_08 == 0 || i == gUnknown_03007890->unk_08)
+ {
+ gUnknown_03004140.unk_14 = 3;
+ sub_800D30C(0xF3, 0x01);
+ return 3;
+ }
+ if (gUnknown_03004140.unk_04 == 0 || gUnknown_03004140.unk_04 == 9)
+ {
+ gUnknown_03004140.unk_04 = 12;
+ gUnknown_03004140.unk_05 = 13;
+ }
+ else
+ {
+ gUnknown_03004140.unk_04 = 11;
+ gUnknown_03004140.unk_05 = 12;
+ }
+ gUnknown_03004140.unk_1e = r6;
+ gUnknown_03004140.unk_1a = r8;
+ if (gUnknown_03004140.unk_07 != 0)
+ {
+ gUnknown_03004140.unk_07 = 7;
+ }
+ return 0;
+}
+
+void sub_800C210(u8 a0)
+{
+ u8 i;
+
+ if (a0 & gUnknown_03004140.unk_30)
+ {
+ gUnknown_03004140.unk_30 &= ~a0;
+ for (i = 0; i < 4; i++)
+ {
+ if ((a0 >> i) & 1)
+ {
+ gUnknown_03004140.unk_34[i] = 0;
+ }
+ }
+ i = gUnknown_03007890->unk_03 & a0;
+ if (i)
+ {
+ sub_800D334(i);
+ }
+ gUnknown_03004140.unk_14 = i;
+ sub_800D30C(0x33, i);
+ }
+}
+
+void sub_800C27C(bool8 a0)
+{
+ u8 r2;
+
+ r2 = 0;
+ gUnknown_03004140.unk_07 = 0;
+ if (a0)
+ {
+ sub_800C000();
+ gUnknown_03004140.unk_04 = 23;
+ }
+ else
+ {
+ switch (gUnknown_03004140.unk_04)
+ {
+ case 5:
+ gUnknown_03004140.unk_04 = 8;
+ gUnknown_03004140.unk_05 = 0;
+ r2 = 0x13;
+ break;
+ case 6:
+ gUnknown_03004140.unk_04 = 7;
+ gUnknown_03004140.unk_05 = 8;
+ break;
+ case 7:
+ gUnknown_03004140.unk_04 = 7;
+ gUnknown_03004140.unk_05 = 8;
+ break;
+ case 8:
+ break;
+ case 9:
+ gUnknown_03004140.unk_05 = 0;
+ gUnknown_03004140.unk_04 = 0;
+ r2 = 0x21;
+ break;
+ case 10:
+ gUnknown_03004140.unk_04 = 11;
+ gUnknown_03004140.unk_05 = 0;
+ break;
+ case 11:
+ gUnknown_03004140.unk_04 = 11;
+ gUnknown_03004140.unk_05 = 0;
+ break;
+ case 12:
+ gUnknown_03004140.unk_05 = 0;
+ gUnknown_03004140.unk_04 = 0;
+ r2 = 0x23;
+ break;
+ case 13:
+ gUnknown_03004140.unk_04 = 14;
+ break;
+ case 14:
+ gUnknown_03004140.unk_04 = 14;
+ break;
+ case 15:
+ break;
+ case 16:
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_11;
+ gUnknown_03004140.unk_05 = gUnknown_03004140.unk_12;
+ sub_800D334(gUnknown_03007890->unk_03);
+ gUnknown_03004140.unk_14 = gUnknown_03007890->unk_03;
+ sub_800D30C(0x33, 0x01);
+ return;
+ case 17:
+ gUnknown_03004140.unk_04 = 18;
+ break;
+ case 18:
+ gUnknown_03004140.unk_04 = 18;
+ break;
+ default:
+ gUnknown_03004140.unk_05 = 0;
+ gUnknown_03004140.unk_04 = 0;
+ r2 = 0x43;
+ break;
+ }
+ if (gUnknown_03004140.unk_04 == 0)
+ {
+ sub_800D30C(r2, 0);
+ }
+ }
+}
+
+bool8 sub_800C36C(u16 a0)
+{
+ bool8 retVal;
+ u8 i;
+ u8 sp0;
+ u8 sp1;
+ u8 sp2;
+ u8 flags;
+
+ retVal = FALSE;
+ rfu_REQBN_watchLink(a0, &sp0, &sp1, &sp2);
+ if (sp0)
+ {
+ gUnknown_03004140.unk_14 = sp0;
+ gUnknown_03004140.unk_16 = sp1;
+ if (gUnknown_03004140.unk_09)
+ {
+ gUnknown_03004140.unk_0a = 1;
+ if (gUnknown_03004140.unk_06 == 0 && sp1 == 0)
+ {
+ gUnknown_03004140.unk_0a = 4;
+ }
+ if (gUnknown_03004140.unk_0a == 1)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if ((sp0 >> i) & 1)
+ {
+ gUnknown_03004140.unk_30 |= (1 << i);
+ gUnknown_03004140.unk_34[i] = gUnknown_03004140.unk_32;
+ }
+ }
+ sub_800D30C(0x31, 0x01);
+ }
+ else
+ {
+ gUnknown_03004140.unk_0a = 0;
+ sub_800D334(sp0);
+ retVal = TRUE;
+ sub_800D30C(0x33, 0x01);
+ }
+ }
+ else
+ {
+ sub_800D334(sp0);
+ retVal = TRUE;
+ sub_800D30C(0x30, 0x02);
+ }
+ sub_800D610();
+ }
+ if (gUnknown_03007890->unk_00 == 1)
+ {
+ if (sp2)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if ((gUnknown_03004140.unk_30 >> i) & 1 && (sp2 >> i) & 1)
+ {
+ gUnknown_03004140.unk_34[i] = 0;
+ }
+ }
+ gUnknown_03004140.unk_30 &= ~sp2;
+ gUnknown_03004140.unk_14 = sp2;
+ sub_800D30C(0x32, 0x01);
+ }
+ if (gUnknown_03004140.unk_30)
+ {
+ flags = 0;
+ for (i = 0; i < 4; i++)
+ {
+ if ((gUnknown_03004140.unk_30 >> i) & 1 && gUnknown_03004140.unk_34[i] && --gUnknown_03004140.unk_34[i] == 0)
+ {
+ gUnknown_03004140.unk_30 &= ~(1 << i);
+ flags |= (1 << i);
+ }
+ }
+ if (flags)
+ {
+ sub_800D334(flags);
+ retVal = TRUE;
+ gUnknown_03004140.unk_14 = flags;
+ sub_800D30C(0x33, 0x01);
+ }
+ }
+ if (!gUnknown_03004140.unk_30)
+ {
+ gUnknown_03004140.unk_0a = 0;
+ }
+ }
+ return retVal;
+}
+
+void rfu_syncVBlank_(void)
+{
+ if (rfu_syncVBlank())
+ {
+ sub_800D30C(0xF1, 0x00);
+ sub_800D610();
+ }
+}
+
+void sub_800C54C(u32 a0)
+{
+ u8 r2;
+
+ if (gUnknown_03004140.unk_40 == NULL && gUnknown_03004140.unk_04 != 0)
+ {
+ gUnknown_03004140.unk_04 = 0;
+ }
+ else
+ {
+ if (gUnknown_03004140.unk_07 != 0)
+ {
+ sub_800C744(a0);
+ }
+ do
+ {
+ if (gUnknown_03004140.unk_04 != 0)
+ {
+ rfu_waitREQComplete();
+ gUnknown_03004140.unk_0e = 1;
+ switch (gUnknown_03004140.unk_04)
+ {
+ case 23:
+ r2 = sub_800BEC0() == 0x8001 ? 0x44 : 0xFF;
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D30C(r2, 0);
+ break;
+ case 1:
+ if (sub_800BEC0() == 0x8001)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05;
+ gUnknown_03004140.unk_05 = 3;
+ }
+ else
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D30C(0xFF, 0);
+ }
+ break;
+ case 2:
+ rfu_REQ_reset();
+ break;
+ case 3:
+ rfu_REQ_configSystem(gUnknown_03004140.unk_3c->unk_02, gUnknown_03004140.unk_3c->unk_00, gUnknown_03004140.unk_3c->unk_01);
+ break;
+ case 4:
+ rfu_REQ_configGameData(gUnknown_03004140.unk_3c->unk_04, gUnknown_03004140.unk_3c->unk_06, gUnknown_03004140.unk_3c->unk_08, gUnknown_03004140.unk_3c->unk_0c);
+ break;
+ case 5:
+ rfu_REQ_startSearchChild();
+ break;
+ case 6:
+ rfu_REQ_pollSearchChild();
+ break;
+ case 7:
+ rfu_REQ_endSearchChild();
+ break;
+ case 8:
+ break;
+ case 9:
+ rfu_REQ_startSearchParent();
+ break;
+ case 10:
+ rfu_REQ_pollSearchParent();
+ break;
+ case 11:
+ rfu_REQ_endSearchParent();
+ break;
+ case 12:
+ rfu_REQ_startConnectParent(gUnknown_03004140.unk_1e);
+ break;
+ case 13:
+ rfu_REQ_pollConnectParent();
+ break;
+ case 14:
+ rfu_REQ_endConnectParent();
+ break;
+ case 15:
+ break;
+ case 16:
+ rfu_REQ_CHILD_startConnectRecovery(gUnknown_03007890->unk_03);
+ break;
+ case 17:
+ rfu_REQ_CHILD_pollConnectRecovery();
+ break;
+ case 18:
+ rfu_REQ_CHILD_endConnectRecovery();
+ break;
+ case 19:
+ rfu_REQ_changeMasterSlave();
+ break;
+ case 20:
+ break;
+ case 21:
+ rfu_REQ_stopMode();
+ break;
+ case 22:
+ break;
+ }
+ rfu_waitREQComplete();
+ gUnknown_03004140.unk_0e = 0;
+ }
+ } while (gUnknown_03004140.unk_04 == 18 || gUnknown_03004140.unk_04 == 19);
+ if (gUnknown_03007890->unk_00 != 1 || !sub_800C36C(0))
+ {
+ sub_800CF34();
+ sub_800D158();
+ sub_800D268();
+ sub_800D434();
+ }
+ }
+}
+
+static void sub_800C744(u32 a0)
+{
+ if (gUnknown_03004140.unk_07 == 5)
+ {
+ gUnknown_03004140.unk_06 = 1;
+ gUnknown_03004140.unk_04 = 5;
+ gUnknown_03004140.unk_1a = gUnknown_03004140.unk_1c;
+ if (gUnknown_03004140.unk_1a)
+ {
+ gUnknown_03004140.unk_07 = 6;
+ }
+ else
+ {
+ gUnknown_03004140.unk_07 = 1;
+ }
+ }
+ if (gUnknown_03004140.unk_07 == 1)
+ {
+ gUnknown_03004140.unk_06 = 1;
+ gUnknown_03004140.unk_04 = 5;
+ gUnknown_03004140.unk_1a = a0 % 140;
+ gUnknown_03004140.unk_1c = 140 - gUnknown_03004140.unk_1a;
+ if (gUnknown_03004140.unk_1a)
+ {
+ gUnknown_03004140.unk_07 = 2;
+ }
+ else
+ {
+ gUnknown_03004140.unk_07 = 3;
+ }
+ }
+ if (gUnknown_03004140.unk_07 == 3)
+ {
+ gUnknown_03004140.unk_06 = 0;
+ gUnknown_03004140.unk_1a = 40;
+ gUnknown_03004140.unk_07 = 4;
+ gUnknown_03004140.unk_04 = 9;
+ }
+}
+
+static void sub_800C7B4(u16 r8, u16 r6)
+{
+ u8 sp0;
+ register u8 *stwiRecvBuffer asm("r0");
+ u8 *tmp;
+ u8 i;
+
+ if (gUnknown_03004140.unk_0e != 0)
+ {
+ gUnknown_03004140.unk_0e = 0;
+ switch (r8)
+ {
+ case 16:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05;
+ gUnknown_03004140.unk_05 = 4;
+ }
+ break;
+ case 23:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05;
+ gUnknown_03004140.unk_05 = 0;
+ }
+ break;
+ case 22:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D30C(0x00, 0x00);
+ }
+ break;
+ case 25:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 6;
+ }
+ break;
+ case 26:
+ if (gUnknown_03004140.unk_1a && --gUnknown_03004140.unk_1a == 0)
+ {
+ gUnknown_03004140.unk_04 = 7;
+ gUnknown_03004140.unk_05 = 8;
+ }
+ break;
+ case 27:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05;
+ gUnknown_03004140.unk_05 = 0;
+ if (gUnknown_03004140.unk_07 == 0)
+ {
+ sub_800D30C(0x13, 0x00);
+ }
+ }
+ break;
+ case 28:
+ if (r6 == 0)
+ {
+ if (gUnknown_03004140.unk_0b == 1 && gUnknown_03004140.unk_1a > 1)
+ {
+ gUnknown_03004140.unk_1a--;
+ }
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 10;
+ }
+ break;
+ case 29:
+ if (r6 == 0)
+ {
+ sp0 = sub_800D294();
+ gUnknown_03004140.unk_14 = sp0;
+ if (sp0)
+ {
+ sub_800D30C(0x20, 0x01);
+ }
+ if (gUnknown_03004140.unk_0b && gUnknown_03004140.unk_1a != 1 && gUnknown_03007890->unk_08 == 4)
+ {
+ rfu_REQ_endSearchParent();
+ rfu_waitREQComplete();
+ gUnknown_03004140.unk_04 = 9;
+ gUnknown_03004140.unk_0b = 1;
+ }
+ }
+ if (gUnknown_03004140.unk_1a && --gUnknown_03004140.unk_1a == 0)
+ {
+ gUnknown_03004140.unk_04 = 11;
+ gUnknown_03004140.unk_05 = 0;
+ }
+ break;
+ case 30:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05;
+ if (gUnknown_03004140.unk_07 == 0)
+ {
+ if (gUnknown_03004140.unk_04 == 0)
+ {
+ sub_800D30C(0x21, 0x00);
+ }
+ }
+ else if (gUnknown_03004140.unk_07 != 7)
+ {
+ gUnknown_03004140.unk_04 = 5;
+ gUnknown_03004140.unk_07 = 5;
+ }
+ }
+ break;
+ case 31:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 13;
+ }
+ break;
+ case 32:
+ if (r6 == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_03004140.unk_10) && !sp0)
+ {
+ gUnknown_03004140.unk_04 = 14;
+ }
+ if (gUnknown_03004140.unk_1a && --gUnknown_03004140.unk_1a == 0)
+ {
+ gUnknown_03004140.unk_04 = 14;
+ }
+ break;
+ case 33:
+ if (r6 == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_03004140.unk_10))
+ {
+ if (!sp0)
+ {
+ gUnknown_03004140.unk_04 = 19;
+ gUnknown_03004140.unk_05 = 15;
+ gUnknown_03004140.unk_1e = 0x22;
+ gUnknown_03004140.unk_14 = gUnknown_03004140.unk_10;
+ }
+ else
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ gUnknown_03004140.unk_1e = 0x23;
+ gUnknown_03004140.unk_14 = sp0;
+ if (gUnknown_03004140.unk_07)
+ {
+ gUnknown_03004140.unk_07 = 3;
+ gUnknown_03004140.unk_04 = 9;
+ }
+ }
+ sub_800D30C(gUnknown_03004140.unk_1e, 0x01);
+ gUnknown_03004140.unk_1e = 0;
+ }
+ break;
+ case 50:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_14 = gUnknown_03007890->unk_03;
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 17;
+ for (gUnknown_03004140.unk_10 = 0; gUnknown_03004140.unk_10 < 4; gUnknown_03004140.unk_10 ++)
+ {
+ if ((gUnknown_03007890->unk_03 >> gUnknown_03004140.unk_10) & 1)
+ {
+ break;
+ }
+ }
+ }
+ break;
+ case 51:
+ if (r6 == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0) && sp0 < 2)
+ {
+ gUnknown_03004140.unk_04 = 18;
+ }
+ if (gUnknown_03004140.unk_34[gUnknown_03004140.unk_10] && --gUnknown_03004140.unk_34[gUnknown_03004140.unk_10] == 0)
+ {
+ gUnknown_03004140.unk_04 = 18;
+ }
+ break;
+ case 52:
+ if (r6 == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0))
+ {
+ if (!sp0)
+ {
+ gUnknown_03004140.unk_04 = 19;
+ gUnknown_03004140.unk_05 = 22;
+ gUnknown_03004140.unk_1e = 0x32;
+ }
+ else
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D334(gUnknown_03007890->unk_03);
+ gUnknown_03004140.unk_1e = 0x33;
+ }
+ gUnknown_03004140.unk_34[gUnknown_03004140.unk_10] = 0;
+ gUnknown_03004140.unk_30 = 0;
+ gUnknown_03004140.unk_0a = 0;
+ sub_800D30C(gUnknown_03004140.unk_1e, 0x01);
+ gUnknown_03004140.unk_1e = 0;
+ }
+ break;
+ case 39:
+ if (r6 == 0)
+ {
+ if (gUnknown_03004140.unk_05 == 22)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_11;
+ gUnknown_03004140.unk_05 = gUnknown_03004140.unk_12;
+ gUnknown_03004140.unk_02 = 1;
+ sub_800D30C(0x41, 0x00);
+ }
+ else if (gUnknown_03004140.unk_05 == 15)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05;
+ gUnknown_03004140.unk_02 = 1;
+ sub_800D30C(0x41, 0x00);
+ gUnknown_03004140.unk_24 |= 1 << gUnknown_03004140.unk_10;
+ gUnknown_03004140.unk_28[gUnknown_03004140.unk_10] = gUnknown_03004140.unk_26;
+ rfu_clearSlot(4, gUnknown_03004140.unk_10);
+ tmp = &sp0;
+ *tmp = rfu_NI_CHILD_setSendGameName(gUnknown_03004140.unk_10, 0x0e);
+ if (*tmp)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D610();
+ sub_800D334(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03);
+ gUnknown_03004140.unk_14 = sp0;
+ sub_800D30C(0x25, 0x01);
+ }
+ }
+ }
+ break;
+ case 61:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D30C(0x42, 0x00);
+ }
+ break;
+ }
+ gUnknown_03004140.unk_0e = 1;
+ }
+ else if (r6 == 3 && gUnknown_03004140.unk_0f && (r8 == 0x24 || r8 == 0x26 || r8 == 0x27))
+ {
+ rfu_REQ_RFUStatus();
+ rfu_waitREQComplete();
+ rfu_getRFUStatus(&sp0);
+ if (sp0 == 0 && gUnknown_03007890->unk_00 == 0)
+ {
+ stwiRecvBuffer = rfu_getSTWIRecvBuffer();
+ stwiRecvBuffer[4] = gUnknown_03007890->unk_02;
+ stwiRecvBuffer[5] = 1;
+ sub_800C36C(0x29);
+ r6 = 0;
+ }
+ }
+ switch (r8)
+ {
+ case 48:
+ if (r6 == 0)
+ {
+ stwiRecvBuffer = rfu_getSTWIRecvBuffer();
+ gUnknown_03004140.unk_14 = stwiRecvBuffer[8];
+ sub_800D358(gUnknown_03004140.unk_14);
+ if (gUnknown_03004140.unk_30)
+ {
+ gUnknown_03004140.unk_30 &= ~gUnknown_03004140.unk_14;
+ for (i = 0; i < 4; i++)
+ {
+ if ((gUnknown_03004140.unk_14 >> i) & 1)
+ {
+ gUnknown_03004140.unk_34[i] = 0;
+ }
+ }
+ if (gUnknown_03004140.unk_06 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ }
+ }
+ sp0 = gUnknown_03004140.unk_00 & gUnknown_03004140.unk_14;
+ for (i = 0; i < 4; i++)
+ {
+ if ((sp0 >> i) & 1 && gUnknown_03004140.unk_01)
+ {
+ gUnknown_03004140.unk_01--;
+ }
+ }
+ gUnknown_03004140.unk_00 &= ~gUnknown_03004140.unk_14;
+ if (gUnknown_03004140.unk_07)
+ {
+ if (gUnknown_03007890->unk_00 == 0xFF)
+ {
+ if (gUnknown_03004140.unk_07 == 8)
+ {
+ gUnknown_03004140.unk_1a = gUnknown_03004140.unk_1c;
+ gUnknown_03004140.unk_07 = 6;
+ gUnknown_03004140.unk_04 = 6;
+ }
+ else if (gUnknown_03004140.unk_04 != 6 && gUnknown_03004140.unk_04 != 7)
+ {
+ gUnknown_03004140.unk_07 = 1;
+ gUnknown_03004140.unk_04 = 5;
+ }
+ }
+ }
+ if (gUnknown_03007890->unk_00 == 0xFF)
+ {
+ if (gUnknown_03004140.unk_04 == 0)
+ {
+ gUnknown_03004140.unk_06 = -1;
+ }
+ }
+ if (gUnknown_03004140.unk_0e == 0)
+ {
+ sub_800D30C(0x40, 0x01);
+ }
+ }
+ break;
+ case 38:
+ sub_800D20C();
+ if (gUnknown_03007890->unk_00 != 0xFF)
+ {
+ sub_800D30C(0x50, 0x00);
+ }
+ break;
+ case 16:
+ case 61:
+ if (r6 == 0)
+ {
+ gUnknown_03004140.unk_0d = 0;
+ gUnknown_03004140.unk_01 = 0;
+ gUnknown_03004140.unk_00 = 0;;
+ gUnknown_03004140.unk_06 = -1;
+ sub_800D610();
+ if (r8 == 61)
+ {
+ sub_800BFA0();
+ }
+ }
+ break;
+ }
+ if (r6 != 0)
+ {
+ if (r8 == 28 && r6 != 0 && gUnknown_03004140.unk_07 == 4)
+ {
+ gUnknown_03007890->unk_00 = 1;
+ gUnknown_03007890->unk_02 = 15;
+ sub_800D334(15);
+ rfu_waitREQComplete();
+ return;
+ }
+ else
+ {
+ gUnknown_03004140.unk_14 = r8;
+ gUnknown_03004140.unk_16 = r6;
+ if (gUnknown_03004140.unk_0e)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ }
+ sub_800D30C(0xf0, 0x02);
+ sub_800D610();
+ }
+ }
+ if (r8 == 0xFF)
+ {
+ sub_800D30C(0xf2, 0x00);
+ sub_800D610();
+ }
+}
+
+static void sub_800CEB0(u16 r6)
+{
+ u8 r7;
+ u8 sp0;
+
+ r7 = gUnknown_03004140.unk_0e;
+ gUnknown_03004140.unk_0e = 0;
+ gUnknown_03004140.unk_0f = 1;
+ if (gUnknown_03007890->unk_00 == 0)
+ {
+ sub_800C36C(r6);
+ if (gUnknown_03004140.unk_02 != 1)
+ {
+ sub_800D610();
+ gUnknown_03004140.unk_0f = 0;
+ gUnknown_03004140.unk_0e = r7;
+ return;
+ }
+ }
+ else
+ {
+ if (!rfu_UNI_PARENT_getDRAC_ACK(&sp0))
+ {
+ gUnknown_03004140.unk_03 |= sp0;
+ }
+ }
+ if (gUnknown_03004140.unk_44 != NULL)
+ {
+ gUnknown_03004140.unk_44(r6);
+ rfu_waitREQComplete();
+ if (gUnknown_03004140.unk_02 == 2)
+ {
+ sub_800D610();
+ }
+ }
+ gUnknown_03004140.unk_0f = 0;
+ gUnknown_03004140.unk_0e = r7;
+}
+
+static void sub_800CF34(void)
+{
+ u8 flags;
+ u8 sp0;
+ u8 i;
+ u8 r5;
+ u8 r4;
+ const u16 *ptr;
+
+ if (gUnknown_03004140.unk_04 == 5 || gUnknown_03004140.unk_04 == 6 || gUnknown_03004140.unk_04 == 7 || gUnknown_03004140.unk_04 == 8)
+ {
+ flags = ((gUnknown_03007890->unk_02 ^ gUnknown_03004140.unk_0c) & gUnknown_03007890->unk_02) & ~gUnknown_03007890->unk_07;
+ gUnknown_03004140.unk_0c = gUnknown_03007890->unk_02;
+ if (flags)
+ {
+ gUnknown_03004140.unk_14 = flags;
+ sub_800D30C(0x10, 0x01);
+ }
+ sp0 = 0x00;
+ for (i = 0; i < 4; i++)
+ {
+ r4 = 1 << i;
+ r5 = 0x00;
+ if (flags & r4)
+ {
+ gUnknown_03004140.unk_28[i] = gUnknown_03004140.unk_26;
+ gUnknown_03004140.unk_24 |= r4;
+ }
+ else if (gUnknown_03004140.unk_24 & r4)
+ {
+ if (gUnknown_03007880[i]->unk_34 == 0x46)
+ {
+ if (gUnknown_03007880[i]->unk_61 == 1)
+ {
+ r5 = 0x02;
+ for (ptr = gUnknown_03004140.unk_20; *ptr != 0xFFFF; ptr++)
+ {
+ if (gUnknown_03007890->unk_14[i].unk_04 == *ptr)
+ {
+ gUnknown_03004140.unk_00 |= r4;
+ gUnknown_03004140.unk_01++;
+ sp0 |= r4;
+ r5 |= 0x01;
+ break;
+ }
+ }
+ if (!(r5 & 0x01))
+ {
+ r5 |= 0x04;
+ }
+ }
+ }
+ else if (--gUnknown_03004140.unk_28[i] == 0)
+ {
+ r5 = 0x06;
+ }
+ if (r5 & 0x02)
+ {
+ gUnknown_03004140.unk_24 &= ~r4;
+ gUnknown_03004140.unk_28[i] = 0;
+ rfu_clearSlot(0x08, i);
+ }
+ if (r5 & 0x04)
+ {
+ gUnknown_03004140.unk_0d |= r4;
+ }
+ }
+ }
+ if (sp0)
+ {
+ gUnknown_03004140.unk_14 = sp0;
+ sub_800D30C(0x11, 0x01);
+ }
+ if (gUnknown_03004140.unk_0d)
+ {
+ r5 = 0x01;
+ if (gUnknown_03007890->unk_06 && ((gUnknown_03004140.unk_03 & gUnknown_03004140.unk_00) != gUnknown_03004140.unk_00))
+ {
+ r5 = 0x00;
+ }
+ if (r5)
+ {
+ sub_800D334(gUnknown_03004140.unk_0d);
+ gUnknown_03004140.unk_14 = gUnknown_03004140.unk_0d;
+ gUnknown_03004140.unk_0d = 0;
+ sub_800D30C(0x12, 0x01);
+ }
+ }
+ if (gUnknown_03004140.unk_24 == 0 && gUnknown_03004140.unk_04 == 8)
+ {
+ if (gUnknown_03004140.unk_07 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D30C(0x14, 0x00);
+ }
+ else
+ {
+ if (gUnknown_03004140.unk_07 == 2)
+ {
+ gUnknown_03004140.unk_07 = 3;
+ gUnknown_03004140.unk_04 = 9;
+ }
+ else
+ {
+ gUnknown_03004140.unk_07 = 1;
+ gUnknown_03004140.unk_04 = 5;
+ }
+ if (gUnknown_03004140.unk_00)
+ {
+ gUnknown_03004140.unk_1a = 0;
+ gUnknown_03004140.unk_07 = 8;
+ gUnknown_03004140.unk_04 = 5;
+ }
+ }
+ }
+ }
+}
+
+static void sub_800D158(void)
+{
+ u16 imeBak = REG_IME;
+ REG_IME = 0;
+ if (gUnknown_03004140.unk_04 == 15)
+ {
+ if (--gUnknown_03004140.unk_28[gUnknown_03004140.unk_10] == 0 || gUnknown_03007880[gUnknown_03004140.unk_10]->unk_0 == 0x27)
+ {
+ sub_800D630();
+ gUnknown_03004140.unk_04 = 24;
+ rfu_clearSlot(4, gUnknown_03004140.unk_10);
+ gUnknown_03004140.unk_24 &= ~(1 << gUnknown_03004140.unk_10);
+ gUnknown_03004140.unk_28[gUnknown_03004140.unk_10] = 0;
+ }
+ }
+ REG_IME = imeBak;
+ if (gUnknown_03004140.unk_04 == 24)
+ {
+ if (gUnknown_03004140.unk_02 == 1)
+ {
+ sub_800D630();
+ }
+ if (gUnknown_03004140.unk_02 == 0)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ sub_800D334(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03);
+ gUnknown_03004140.unk_14 = 0;
+ sub_800D30C(0x25, 0x01);
+ }
+ }
+}
+
+static void sub_800D20C(void)
+{
+ if (gUnknown_03004140.unk_04 == 15 && gUnknown_03007880[gUnknown_03004140.unk_10]->unk_0 == 0x26)
+ {
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ rfu_clearSlot(4, gUnknown_03004140.unk_10);
+ gUnknown_03004140.unk_24 &= ~(1 << gUnknown_03004140.unk_10);
+ gUnknown_03004140.unk_28[gUnknown_03004140.unk_10] = 0;
+ sub_800D30C(0x24, 0x00);
+ }
+}
+
+static void sub_800D268(void)
+{
+ if (gUnknown_03004140.unk_06 == 0 && gUnknown_03004140.unk_0a == 1)
+ {
+ gUnknown_03004140.unk_11 = gUnknown_03004140.unk_04;
+ gUnknown_03004140.unk_12 = gUnknown_03004140.unk_05;
+ gUnknown_03004140.unk_04 = 16;
+ gUnknown_03004140.unk_05 = 17;
+ gUnknown_03004140.unk_0a = 2;
+ }
+}
+
+static u8 sub_800D294(void)
+{
+ u8 i;
+ const u16 *ptr;
+ u8 flags = 0x00;
+
+ for (i = 0; i < gUnknown_03007890->unk_08; i++)
+ {
+ for (ptr = gUnknown_03004140.unk_20; *ptr != 0xffff; ptr++)
+ {
+ if (gUnknown_03007890->unk_14[i].unk_04 == *ptr)
+ {
+ flags |= (1 << i);
+ }
+ }
+ }
+ return flags;
+}
+
+static void sub_800D30C(u8 a0, u8 a1)
+{
+ if (gUnknown_03004140.unk_40 != NULL)
+ {
+ gUnknown_03004140.unk_40(a0, a1);
+ }
+ gUnknown_03004140.unk_14 = gUnknown_03004140.unk_16 = 0;
+}
+
+static void sub_800D334(u8 a0)
+{
+ u8 unk_0e_bak = gUnknown_03004140.unk_0e;
+ gUnknown_03004140.unk_0e = 1;
+ rfu_REQ_disconnect(a0);
+ rfu_waitREQComplete();
+ gUnknown_03004140.unk_0e = unk_0e_bak;
+}
+
+static void sub_800D358(u8 a0)
+{
+ u8 i;
+
+ if (gUnknown_03007890->unk_04)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03007880[i]->unk_0 & 0x8000 && gUnknown_03007880[i]->unk_1a & a0)
+ {
+ rfu_changeSendTarget(0x20, i, gUnknown_03007880[i]->unk_1a & ~a0);
+ }
+ }
+ }
+ if (gUnknown_03007890->unk_05)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03007880[i]->unk_34 & 0x8000 && gUnknown_03007880[i]->unk_4e & a0)
+ {
+ rfu_NI_stopReceivingData(i);
+ }
+ }
+ }
+ if (gUnknown_03007890->unk_06)
+ {
+ gUnknown_03007890->unk_06 &= ~a0;
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03007870[i]->unk_0 == 0x8024 && a0 & gUnknown_03007870[i]->unk_3)
+ {
+ gUnknown_03007870[i]->unk_3 &= ~a0;
+ }
+ }
+ }
+}
+
+static void sub_800D434(void)
+{
+ u8 i;
+ u8 j;
+ u8 flags;
+
+ if (gUnknown_03004140.unk_18)
+ {
+ if (gUnknown_03007890->unk_04)
+ {
+ for (i = 0; i < 4; i ++)
+ {
+ if (gUnknown_03007880[i]->unk_0 & 0x8000)
+ {
+ flags = 0;
+ for (j = 0; j < 4; j++)
+ {
+ if ((gUnknown_03007880[i]->unk_1a >> j) & 1 && gUnknown_03007880[j]->unk_2 > gUnknown_03004140.unk_18)
+ {
+ flags |= (1 << j);
+ }
+ if (flags)
+ {
+ rfu_changeSendTarget(0x20, i, flags ^ gUnknown_03007880[i]->unk_1a);
+ }
+ }
+ }
+ }
+ }
+ if (gUnknown_03007890->unk_05)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03007880[i]->unk_34 & 0x8000 && gUnknown_03007880[i]->unk_36 > gUnknown_03004140.unk_18)
+ {
+ rfu_NI_stopReceivingData(i);
+ }
+ }
+ }
+ }
+}
+
+void sub_800D52C(void (*func)(u16))
+{
+ gUnknown_03004140.unk_44 = func;
+ rfu_setMSCCallback(sub_800CEB0);
+}
+
+void sub_800D544(void (*func)(u8, u8))
+{
+ gUnknown_03004140.unk_40 = func;
+}
+
+u8 sub_800D550(u8 a0, u16 a1)
+{
+ u16 imeBak;
+ if (gUnknown_03004140.unk_09 && a0 == 0 && gUnknown_03004140.unk_30)
+ {
+ return 5;
+ }
+ imeBak = REG_IME;
+ REG_IME = 0;
+ gUnknown_03004140.unk_09 = a0;
+ gUnknown_03004140.unk_32 = a1;
+ REG_IME = imeBak;
+ return 0;
+}
+
+u8 sub_800D594(u16 a0)
+{
+ if (gUnknown_03007890->unk_04 | gUnknown_03007890->unk_05)
+ {
+ gUnknown_03004140.unk_14 = 6;
+ sub_800D30C(0xf3, 0x01);
+ return 6;
+ }
+ gUnknown_03004140.unk_18 = a0;
+ return 0;
+}
+
+u8 sub_800D5D0(u8 a0)
+{
+ if (gUnknown_03004140.unk_04 == 9 || gUnknown_03004140.unk_04 == 10 || gUnknown_03004140.unk_04 == 11)
+ {
+ gUnknown_03004140.unk_14 = 7;
+ sub_800D30C(0xf3, 0x01);
+ return 7;
+ }
+ if (a0)
+ {
+ gUnknown_03004140.unk_0b = 1;
+ }
+ else
+ {
+ gUnknown_03004140.unk_0b = 0;
+ }
+ return 0;
+}
+
+static void sub_800D610(void)
+{
+ if (gUnknown_03004140.unk_02)
+ {
+ gUnknown_03004140.unk_02 = 0;
+ sub_800D30C(0x45, 0x00);
+ }
+}
+
+void sub_800D630(void)
+{
+ if (gUnknown_03004140.unk_02 == 0)
+ {
+ sub_800D30C(0x45, 0x00);
+ }
+ else if (gUnknown_03004140.unk_02 == 1)
+ {
+ gUnknown_03004140.unk_02 = 2;
+ }
+}
+
+void sub_800D658(void)
+{
+ if (gUnknown_03004140.unk_07)
+ {
+ switch (gUnknown_03004140.unk_04)
+ {
+ case 5:
+ gUnknown_03004140.unk_07 = 3;
+ gUnknown_03004140.unk_04 = 9;
+ break;
+ case 6:
+ gUnknown_03004140.unk_07 = 2;
+ gUnknown_03004140.unk_1a = 1;
+ break;
+ case 7:
+ case 8:
+ gUnknown_03004140.unk_07 = 2;
+ break;
+ case 9:
+ case 10:
+ gUnknown_03004140.unk_1a = 40;
+ break;
+ case 11:
+ gUnknown_03004140.unk_1a = 40;
+ gUnknown_03004140.unk_04 = 10;
+ break;
+ }
+ }
+}
+
+// TODO: Is there a file boundary here?
+
+void sub_800D6C8(struct UnkRfuStruct_2_Sub_124 *ptr)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 70; j++)
+ {
+ ptr->unk_00[i][j] = 0;
+ }
+ }
+ ptr->unk_8c1 = 0;
+ ptr->unk_8c0 = 0;
+ ptr->unk_8c2 = 0;
+ ptr->unk_8c3 = 0;
+}
+
+void sub_800D724(struct UnkRfuStruct_2_Sub_9e8 *ptr)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < 40; i++)
+ {
+ for (j = 0; j < 14; j++)
+ {
+ ptr->unk_00[i][j] = 0;
+ }
+ }
+ ptr->unk_231 = 0;
+ ptr->unk_230 = 0;
+ ptr->unk_232 = 0;
+ ptr->unk_233 = 0;
+}
+
+void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 256; j++)
+ {
+ ptr->unk_00[i][j] = 0;
+ }
+ }
+ ptr->unk_201 = 0;
+ ptr->unk_200 = 0;
+ ptr->unk_202 = 0;
+ ptr->unk_203 = 0;
+}
+
+void sub_800D7D8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
+{
+ int i;
+ u16 imeBak;
+ u8 count;
+
+ if (q1->unk_8c2 < 32)
+ {
+ imeBak = REG_IME;
+ REG_IME = 0;
+ count = 0;
+ for (i = 0; i < 70; i += 14)
+ {
+ if (q2[i] == 0 && q2[i + 1] == 0)
+ {
+ count++;
+ }
+ }
+ if (count != 5)
+ {
+ for (i = 0; i < 70; i++)
+ {
+ q1->unk_00[q1->unk_8c0][i] = q2[i];
+ }
+ q1->unk_8c0++;
+ q1->unk_8c0 %= 32;
+ q1->unk_8c2++;
+ for (i = 0; i < 70; i++)
+ {
+ q2[i] = 0;
+ }
+ }
+ REG_IME = imeBak;
+ }
+ else
+ {
+ q1->unk_8c3 = 1;
+ }
+}
+
+void sub_800D888(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
+{
+ int i;
+ u16 imeBak;
+
+ if (q1->unk_232 < 40)
+ {
+ imeBak = REG_IME;
+ REG_IME = 0;
+ for (i = 0; i < 14; i++)
+ {
+ if (q2[i] != 0)
+ {
+ break;
+ }
+ }
+ if (i != 14)
+ {
+ for (i = 0; i < 14; i++)
+ {
+ q1->unk_00[q1->unk_230][i] = q2[i];
+ }
+ q1->unk_230++;
+ q1->unk_230 %= 40;
+ q1->unk_232++;
+ for (i = 0; i < 14; i++)
+ {
+ q2[i] = 0;
+ }
+ }
+ REG_IME = imeBak;
+ }
+ else
+ {
+ q1->unk_233 = 1;
+ }
+}
+
+bool8 sub_800D934(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
+{
+ u16 imeBak;
+ int i;
+
+ imeBak = REG_IME;
+ REG_IME = 0;
+ if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0)
+ {
+ for (i = 0; i < 70; i++)
+ {
+ q2[i] = 0;
+ }
+ REG_IME = imeBak;
+ return FALSE;
+ }
+ for (i = 0; i < 70; i++)
+ {
+ q2[i] = q1->unk_00[q1->unk_8c1][i];
+ }
+ q1->unk_8c1++;
+ q1->unk_8c1 %= 32;
+ q1->unk_8c2--;
+ REG_IME = imeBak;
+ return TRUE;
+}
+
+bool8 sub_800D9DC(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
+{
+ int i;
+ u16 imeBak;
+
+ if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0)
+ {
+ return FALSE;
+ }
+ imeBak = REG_IME;
+ REG_IME = 0;
+ for (i = 0; i < 14; i++)
+ {
+ q2[i] = q1->unk_00[q1->unk_231][i];
+ }
+ q1->unk_231++;
+ q1->unk_231 %= 40;
+ q1->unk_232--;
+ REG_IME = imeBak;
+ return TRUE;
+}
+
+void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2)
+{
+ int i;
+
+ if (q2[1] == 0)
+ {
+ sub_800DAC8(q1, NULL);
+ }
+ else
+ {
+ for (i = 0; i < 14; i++)
+ {
+ q1->unk_00[q1->unk_1c][i] = q2[i];
+ }
+ q1->unk_1c++;
+ q1->unk_1c %= 2;
+ if (q1->unk_1e < 2)
+ {
+ q1->unk_1e++;
+ }
+ else
+ {
+ q1->unk_1d = q1->unk_1c;
+ }
+ }
+}
+
+static bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2)
+{
+ int i;
+
+ if (q1->unk_1e == 0)
+ {
+ return FALSE;
+ }
+ if (q2 != NULL)
+ {
+ for (i = 0; i < 14; i++)
+ {
+ q2[i] = q1->unk_00[q1->unk_1d][i];
+ }
+ }
+ q1->unk_1d++;
+ q1->unk_1d %= 2;
+ q1->unk_1e--;
+ return TRUE;
+}
+
+void sub_800DB18(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
+{
+ int i;
+
+ if (q1->unk_202 < 2)
+ {
+ for (i = 0; i < 256; i++)
+ {
+ q1->unk_00[q1->unk_200][i] = q2[i];
+ }
+ q1->unk_200++;
+ q1->unk_200 %= 2;
+ q1->unk_202++;
+ }
+ else
+ {
+ q1->unk_203 = 1;
+ }
+}
+
+bool8 sub_800DB84(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
+{
+ int i;
+
+ if (q1->unk_200 == q1->unk_201 || q1->unk_203)
+ {
+ return FALSE;
+ }
+ for (i = 0; i < 256; i++)
+ {
+ q2[i] = q1->unk_00[q1->unk_201][i];
+ }
+ q1->unk_201++;
+ q1->unk_201 %= 2;
+ q1->unk_202--;
+ return TRUE;
+}
+
+void sub_800DBF8(u8 *q1, u8 mode)
+{
+ int i;
+ u8 rval;
+ u16 r5 = 0;
+ switch (mode)
+ {
+ case 0:
+ for (i = 0; i < 200; i++)
+ {
+ q1[i] = i + 1;
+ r5 += i + 1;
+ }
+ *((u16 *)(q1 + i)) = r5;
+ break;
+ case 1:
+ for (i = 0; i < 100; i++)
+ {
+ q1[i] = i + 1;
+ r5 += i + 1;
+ }
+ *((u16 *)(q1 + 200)) = r5;
+ break;
+ case 2:
+ for (i = 0; i < 200; i++)
+ {
+ rval = Random();
+ q1[i] = rval;
+ r5 += rval;
+ }
+ *((u16 *)(q1 + i)) = r5;
+ break;
+ case 3:
+ for (i = 0; i < 200; i++)
+ {
+ q1[i] = i + 1 + gUnknown_03000D74;
+ r5 += (i + 1 + gUnknown_03000D74) & 0xFF;
+ }
+ *((u16 *)(q1 + i)) = r5;
+ gUnknown_03000D74++;
+ break;
+ }
+}
+
+void PkmnStrToASCII(u8 *q1, const u8 *q2)
+{
+ int i;
+
+ for (i = 0; q2[i] != EOS; i++)
+ {
+ q1[i] = sWireless_RSEtoASCIITable[q2[i]];
+ }
+ q1[i] = 0;
+}
+
+void ASCIIToPkmnStr(u8 *q1, const u8 *q2)
+{
+ int i;
+
+ for (i = 0; q2[i] != 0; i++)
+ {
+ q1[i] = sWireless_ASCIItoRSETable[q2[i]];
+ }
+ q1[i] = EOS;
+}
+
+#ifdef NONMATCHING
+u8 sub_800DD1C(u8 maxFlags)
+{
+ u8 flagCount = 0;
+ u8 flags = gUnknown_03007890->unk_02;
+ u8 i;
+
+ if (gUnknown_03007890->unk_00 == 1)
+ {
+ i = 0;
+ for (i = 0; i < 4; flags >>= 1, i++)
+ {
+ if (flags & 1)
+ {
+ if (maxFlags == flagCount + 1)
+ {
+ return gUnknown_03007890->unk_0a[i];
+ }
+ flagCount++;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; flags >>= 1, i++)
+ {
+ if (flags & 1)
+ {
+ return gUnknown_03007890->unk_0a[i];
+ }
+ }
+ }
+ return 0;
+}
+#else
+NAKED u8 sub_800DD1C(u8 maxFlags)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tmovs r6, 0\n"
+ "\tldr r0, =gUnknown_03007890\n"
+ "\tldr r4, [r0]\n"
+ "\tldrb r2, [r4, 0x2]\n"
+ "\tldrb r1, [r4]\n"
+ "\tadds r7, r0, 0\n"
+ "\tcmp r1, 0x1\n"
+ "\tbne _0800DD72\n"
+ "\tmovs r3, 0\n"
+ "\tands r1, r2\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _0800DD4E\n"
+ "\tcmp r5, 0x1\n"
+ "\tbne _0800DD48\n"
+ "\tldrb r0, [r4, 0xA]\n"
+ "\tb _0800DD8C\n"
+ "\t.pool\n"
+ "_0800DD48:\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r6, r0, 24\n"
+ "_0800DD4E:\n"
+ "\tlsrs r2, 1\n"
+ "\tadds r0, r3, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r3, r0, 24\n"
+ "\tcmp r3, 0x3\n"
+ "\tbhi _0800DD8A\n"
+ "\tmovs r0, 0x1\n"
+ "\tands r0, r2\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800DD4E\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tcmp r5, r0\n"
+ "\tbne _0800DD48\n"
+ "_0800DD68:\n"
+ "\tldr r0, [r7]\n"
+ "\tadds r0, 0xA\n"
+ "\tadds r0, r3\n"
+ "\tldrb r0, [r0]\n"
+ "\tb _0800DD8C\n"
+ "_0800DD72:\n"
+ "\tmovs r3, 0\n"
+ "\tmovs r1, 0x1\n"
+ "_0800DD76:\n"
+ "\tadds r0, r2, 0\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0800DD68\n"
+ "\tlsrs r2, 1\n"
+ "\tadds r0, r3, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r3, r0, 24\n"
+ "\tcmp r3, 0x3\n"
+ "\tbls _0800DD76\n"
+ "_0800DD8A:\n"
+ "\tmovs r0, 0\n"
+ "_0800DD8C:\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+}
+#endif
+
+void sub_800DD94(struct UnkLinkRfuStruct_02022B14 *data, u8 r9, bool32 r2, int r3)
+{
+ int i;
+
+ for (i = 0; i < 2; i++)
+ {
+ data->unk_00.playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+ }
+ for (i = 0; i < 4; i++)
+ {
+ data->unk_04[i] = r3;
+ r3 >>= 8;
+ }
+ data->playerGender = gSaveBlock2Ptr->playerGender;
+ data->unk_0a_0 = r9;
+ data->unk_0a_7 = r2;
+ data->unk_00.unk_00_0 = 2;
+ data->unk_00.unk_01_2 = 3;
+ data->unk_00.unk_00_4 = 0;
+ data->unk_00.unk_00_5 = 0;
+ data->unk_00.unk_00_6 = 0;
+ data->unk_00.unk_00_7 = FlagGet(FLAG_0x87F);
+ data->unk_00.unk_01_0 = IsNationalPokedexEnabled();
+ data->unk_00.unk_01_1 = FlagGet(FLAG_SYS_GAME_CLEAR);
+}
+
+bool8 sub_800DE7C(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx)
+{
+ bool8 retVal;
+
+ if (gUnknown_03004140.unk_06 == 1)
+ {
+ retVal = TRUE;
+ if (sub_8010454(gUnknown_03007890->unk_14[idx].unk_04) && ((gUnknown_03007890->unk_07 >> idx) & 1))
+ {
+ memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, 0xD);
+ memcpy(buff2, gUnknown_03007890->unk_14[idx].unk_15, sizeof(gUnknown_03007890->unk_14[idx].unk_15));
+ }
+ else
+ {
+ memset(buff1, 0, 0xD);
+ memset(buff2, 0, sizeof(gUnknown_03007890->unk_14[idx].unk_15));
+ }
+ }
+ else
+ {
+ retVal = FALSE;
+ if (sub_8010454(gUnknown_03007890->unk_14[idx].unk_04))
+ {
+ memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, 0xD);
+ memcpy(buff2, gUnknown_03007890->unk_14[idx].unk_15, sizeof(gUnknown_03007890->unk_14[idx].unk_15));
+ }
+ else
+ {
+ memset(buff1, 0, 0xD);
+ memset(buff2, 0, sizeof(gUnknown_03007890->unk_14[idx].unk_15));
+ }
+ }
+ return retVal;
+}
+
+bool8 sub_800DF34(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx)
+{
+ bool8 retVal = FALSE;
+ if (gUnknown_03007890->unk_14[idx].unk_04 == 0x7F7D)
+ {
+ *buff1 = gUnknown_03007890->unk_14[idx].unk_06;
+ memcpy(buff2, gUnknown_03007890->unk_14[idx].unk_15, 8);
+ retVal = TRUE;
+ }
+ else
+ {
+ *buff1 = (struct UnkLinkRfuStruct_02022B14){};
+ memset(buff2, 0, 8);
+ }
+ return retVal;
+}
+
+void sub_800DF90(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2)
+{
+ *buff1 = gUnknown_02022B14;
+ memcpy(buff2, gUnknown_02022B22, 8);
+}
+
+void CreateWirelessStatusIndicatorSprite(u8 x, u8 y)
+{
+ u8 sprId;
+
+ if (x == 0 && y == 0)
+ {
+ x = 0xE7;
+ y = 0x08;
+ }
+ if (gUnknown_03007890->unk_00 == 1)
+ {
+ sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
+ gSprites[sprId].data[7] = 0x1234;
+ gSprites[sprId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
+ gSprites[sprId].invisible = TRUE;
+ gWirelessStatusIndicatorSpriteId = sprId;
+ }
+ else
+ {
+ gWirelessStatusIndicatorSpriteId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
+ gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0x1234;
+ gSprites[gWirelessStatusIndicatorSpriteId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
+ gSprites[gWirelessStatusIndicatorSpriteId].invisible = TRUE;
+ }
+}
+
+void sub_800E084(void)
+{
+ if (gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234)
+ {
+ gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0;
+ DestroySprite(&gSprites[gWirelessStatusIndicatorSpriteId]);
+ gMain.oamBuffer[125] = gDummyOamData;
+ CpuCopy16(&gDummyOamData, (struct OamData *)OAM + 125, sizeof(struct OamData));
+ }
+}
+
+void sub_800E0E8(void)
+{
+ if (GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag) == 0xFFFF)
+ {
+ LoadCompressedObjectPic(&sWirelessStatusIndicatorSpriteSheet);
+ }
+ LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette);
+ gWirelessStatusIndicatorSpriteId = 0xFF;
+}
+
+u8 sub_800E124(void)
+{
+ u8 i;
+ u8 flags = gUnknown_03007890->unk_02;
+ for (i = 0; i < 4; i++)
+ {
+ if (flags & 1)
+ {
+ return gUnknown_03007890->unk_0a[i];
+ }
+ flags >>= 1;
+ }
+ return 0;
+}
+
+void sub_800E15C(struct Sprite *sprite, int signalStrengthAnimNum)
+{
+ if (sprite->data[2] != signalStrengthAnimNum)
+ {
+ sprite->data[2] = signalStrengthAnimNum;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+}
+
+void sub_800E174(void)
+{
+ if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234)
+ {
+ struct Sprite *sprite = &gSprites[gWirelessStatusIndicatorSpriteId];
+ u8 signalStrength = 255;
+ u8 i = 0;
+ if (gUnknown_03007890->unk_00 == 1)
+ {
+ for (i = 0; i < GetLinkPlayerCount() - 1; i++)
+ {
+ if (signalStrength >= sub_800DD1C(i + 1))
+ {
+ signalStrength = sub_800DD1C(i + 1);
+ }
+ }
+ }
+ else
+ {
+ signalStrength = sub_800E124();
+ }
+ if (sub_8012224() == TRUE)
+ {
+ sprite->data[0] = 4;
+ }
+ else if (signalStrength < 25)
+ {
+ sprite->data[0] = 3;
+ }
+ else if (signalStrength >= 25 && signalStrength < 127)
+ {
+ sprite->data[0] = 2;
+ }
+ else if (signalStrength >= 127 && signalStrength < 229)
+ {
+ sprite->data[0] = 1;
+ }
+ else if (signalStrength >= 229)
+ {
+ sprite->data[0] = 0;
+ }
+ if (sprite->data[0] != sprite->data[1])
+ {
+ sub_800E15C(sprite, sprite->data[0]);
+ sprite->data[1] = sprite->data[0];
+ }
+ if (sprite->anims[sprite->data[2]][sprite->data[4]].frame.duration < sprite->data[3])
+ {
+ sprite->data[4]++;
+ sprite->data[3] = 0;
+ if (sprite->anims[sprite->data[2]][sprite->data[4]].type == -2)
+ {
+ sprite->data[4] = 0;
+ }
+ }
+ else
+ {
+ sprite->data[3]++;
+ }
+ gMain.oamBuffer[125] = sWirelessStatusIndicatorOamData;
+ gMain.oamBuffer[125].x = sprite->pos1.x + sprite->centerToCornerVecX;
+ gMain.oamBuffer[125].y = sprite->pos1.y + sprite->centerToCornerVecY;
+ gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;
+ gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue;
+ CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));
+ if (sub_8011A74() == 1)
+ {
+ sub_800E084();
+ }
+ }
+}
+
+void sub_800E378(struct UnkSaveSubstruct_3b98 *dest, u32 trainerId, const u8 *name)
+{
+ dest->trainerId = trainerId;
+ StringCopy(dest->trainerName, name);
+}
+
+bool32 sub_800E388(const u8 *name)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (name[i] != 0)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_800E3A8(void)
+{
+ if (gWirelessCommType != 0)
+ {
+ int i;
+ int j;
+ int cnt;
+ int sp0[5];
+ struct UnkSaveSubstruct_3b98 *sp14 = calloc(20, sizeof(struct UnkSaveSubstruct_3b98));
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ sp0[i] = -1;
+ for (j = 0; j < 20; j++)
+ {
+ if ((u16)gLinkPlayers[i].trainerId == gSaveBlock1Ptr->unk_3B98[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->unk_3B98[j].trainerName) == 0)
+ {
+ sp0[i] = j;
+ }
+ }
+ }
+ cnt = 0;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (i != GetMultiplayerId() && gLinkPlayers[i].language != LANGUAGE_JAPANESE)
+ {
+ sub_800E378(&sp14[cnt], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name);
+ if (sp0[i] >= 0)
+ {
+ memset(gSaveBlock1Ptr->unk_3B98[sp0[i]].trainerName, 0, 8);
+ }
+ cnt++;
+ }
+ }
+ for (i = 0; i < 20; i++)
+ {
+ if (sub_800E388(gSaveBlock1Ptr->unk_3B98[i].trainerName))
+ {
+ sub_800E378(&sp14[cnt], gSaveBlock1Ptr->unk_3B98[i].trainerId, gSaveBlock1Ptr->unk_3B98[i].trainerName);
+ if (++cnt >= 20)
+ {
+ break;
+ }
+ }
+ }
+ memcpy(gSaveBlock1Ptr->unk_3B98, sp14, 20 * sizeof(struct UnkSaveSubstruct_3b98));
+ free(sp14);
+ }
+}
+
+bool32 sub_800E540(u16 id, u8 *name)
+{
+ int i;
+
+ for (i = 0; i < 20; i++)
+ {
+ if (StringCompare(gSaveBlock1Ptr->unk_3B98[i].trainerName, name) == 0 && gSaveBlock1Ptr->unk_3B98[i].trainerId == id)
+ {
+ return TRUE;
+ }
+ if (!sub_800E388(gSaveBlock1Ptr->unk_3B98[i].trainerName))
+ {
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_800E5AC(void)
+{
+ int i;
+
+ for (i = 0; i < 20; i++)
+ {
+ gSaveBlock1Ptr->unk_3B98[i].trainerId = 0;
+ CpuFill16(0, gSaveBlock1Ptr->unk_3B98[i].trainerName, 8);
+ }
+}
+
+void nullsub_5(void *unused_0, u8 unused_1, u8 unused_2)
+{
+ // debug?
+}
+
+void nullsub_13(u8 unused_0, u8 unused_1, u8 unused_2, u8 unused_3)
+{
+
+}
+
+void sub_800E604(void)
+{
+ int i;
+ u8 unk_ee_bak = gUnknown_03005000.unk_ee;
+ CpuFill16(0, &gUnknown_03005000, sizeof gUnknown_03005000);
+ gUnknown_03005000.unk_ee = unk_ee_bak;
+ gUnknown_03005000.unk_0c = 0xFF;
+ if (gUnknown_03005000.unk_ee != 4)
+ {
+ gUnknown_03005000.unk_ee = 0;
+ }
+ for (i = 0; i < 5; i++)
+ {
+ sub_800FCC4(gUnknown_03005000.unk_80 + i);
+ }
+ sub_800FCC4(&gUnknown_03005000.unk_6c);
+ sub_800D6C8(&gUnknown_03005000.unk_124);
+ sub_800D724(&gUnknown_03005000.unk_9e8);
+ CpuFill16(0, gSendCmd, sizeof gSendCmd);
+ CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
+ CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers)
+}
+
+void sub_800E6D0(void)
+{
+ IntrFunc serialIntr = gIntrTable[1];
+ IntrFunc timerIntr = gIntrTable[2];
+ sub_800E700();
+ rfu_REQ_stopMode();
+ rfu_waitREQComplete();
+ REG_IME = 0;
+ gIntrTable[1] = serialIntr;
+ gIntrTable[2] = timerIntr;
+ REG_IME = INTR_FLAG_VBLANK;
+}
+
+void sub_800E700(void)
+{
+ if (!rfu_initializeAPI(gUnknown_03004140.unk_50, sizeof gUnknown_03004140.unk_50, gIntrTable + 1, TRUE))
+ {
+ gLinkType = 0;
+ sub_800AAF4();
+ sub_80111B0(0);
+ sub_800E604();
+ rfu_setTimerInterrupt(3, gIntrTable + 2);
+ }
+}
+
+void sub_800E748(u8 taskId)
+{
+ sub_8010750();
+ switch (gUnknown_03005000.unk_04)
+ {
+ case 0:
+ sub_800BFCC(&gUnknown_02022B2C);
+ gUnknown_03005000.unk_04 = 1;
+ gTasks[taskId].data[1] = 1;
+ break;
+ case 1:
+ break;
+ case 2:
+ sub_800C054(gUnknown_03005000.unk_0c, 0, 240, gUnknown_082ED6E0);
+ gUnknown_03005000.unk_04 = 3;
+ gTasks[taskId].data[1] = 6;
+ break;
+ case 3:
+ break;
+ case 4:
+ sub_800C27C(FALSE);
+ gUnknown_03005000.unk_04 = 5;
+ break;
+ case 5:
+ break;
+ case 18:
+ gUnknown_03005000.unk_cdb = 0;
+ sub_800D52C(sub_800EDBC);
+ sub_800EAB4();
+ sub_800EAFC();
+ gUnknown_03005000.unk_04 = 20;
+ gTasks[taskId].data[1] = 8;
+ CreateTask(sub_801084C, 5);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+u8 sub_800E87C(u8 idx)
+{
+ return gUnknown_082ED6A5[idx];
+}
+
+void sub_800E88C(int r2, int r5)
+{
+ u8 i;
+ u8 r4 = 1;
+ int r1 = r2;
+ int r6 = 0;
+ if (r5 == -1)
+ {
+ for (i = 0; i < 4; r2 >>= 1, i++)
+ {
+ if (r2 & 1)
+ {
+ gUnknown_03005000.unk_cde[i] = r4;
+ r4++;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; r1 >>= 1, i++)
+ {
+ if (!(r1 & 1))
+ {
+ gUnknown_03005000.unk_cde[i] = 0;
+ }
+ }
+ for (r4 = 4; r4 != 0; r4--)
+ {
+ for (i = 0; i < 4 && gUnknown_03005000.unk_cde[i] != r4; i++);
+ if (i == 4)
+ {
+ r6 = r4;
+ }
+ }
+ for (r5 &= ~r2, i = 0; i < 4; r5 >>= 1, i++)
+ {
+ if (r5 & 1)
+ {
+ gUnknown_03005000.unk_cde[i] = r6++;
+ }
+ }
+ }
+}
+
+void sub_800E94C(u8 taskId)
+{
+ switch (gUnknown_03005000.unk_04)
+ {
+ case 0:
+ sub_800BFCC(&gUnknown_082ED608);
+ gUnknown_03005000.unk_04 = 1;
+ gTasks[taskId].data[1] = 1;
+ break;
+ case 1:
+ break;
+ case 6:
+ sub_800C054(gUnknown_03005000.unk_0c, 0, 0xf0, gUnknown_082ED6E0);
+ gUnknown_03005000.unk_04 = 7;
+ gTasks[taskId].data[1] = 7;
+ break;
+ case 7:
+ break;
+ case 9:
+ gTasks[taskId].data[1] = 10;
+ break;
+ case 11:
+ switch (sub_80107A0())
+ {
+ case 5:
+ gUnknown_03005000.unk_04 = 12;
+ break;
+ case 6:
+ case 9:
+ sub_800D630();
+ gUnknown_03005000.unk_ce4 = 2;
+ DestroyTask(taskId);
+ break;
+ }
+ break;
+ case 12:
+ {
+ u8 r5 = 1 << gUnknown_03005000.unk_c3e;
+ rfu_clearSlot(12, gUnknown_03005000.unk_c3e);
+ rfu_setRecvBuffer(16, gUnknown_03005000.unk_c3e, gUnknown_03005000.unk_c3f, 70);
+ rfu_UNI_setSendData(r5, gUnknown_03005000.unk_4c, 14);
+ gTasks[taskId].data[1] = 8;
+ DestroyTask(taskId);
+ if (gUnknown_02022B44.unk_0f == 0)
+ {
+ sub_801227C();
+ gUnknown_02022B44.unk_0f++;
+ }
+ CreateTask(sub_801084C, 5);
+ break;
+ }
+ }
+}
+
+static void sub_800EAB4(void)
+{
+ u8 i;
+ u8 r5 = gUnknown_03004140.unk_00;
+ for (i = 0; i < 4; i++)
+ {
+ if (r5 & 1)
+ {
+ rfu_setRecvBuffer(16, i, gUnknown_03005000.unk_14[i], 14);
+ rfu_clearSlot(3, i);
+ }
+ r5 >>= 1;
+ }
+}
+
+static void sub_800EAFC(void)
+{
+ u8 r5 = gUnknown_03004140.unk_00;
+ rfu_UNI_setSendData(r5, gUnknown_03005000.unk_c87, 70);
+ gUnknown_03005000.unk_cda = sub_800E87C(r5);
+ gUnknown_03005000.unk_ce2 = r5;
+ sub_800E88C(r5, -1);
+ gUnknown_03005000.unk_0c = 1;
+}
+
+void sub_800EB44(u8 taskId)
+{
+ if (sub_800F7DC()->unk_0a_0 == 0x54 && sub_8011A74() == 4)
+ {
+ rfu_REQ_disconnect(gUnknown_03004140.unk_00);
+ rfu_waitREQComplete();
+ sub_8011A64(0, 0);
+ }
+ switch (gUnknown_03005000.unk_04)
+ {
+ case 0:
+ sub_800BFCC(&gUnknown_02022B2C);
+ gUnknown_03005000.unk_04 = 1;
+ gTasks[taskId].data[1] = 1;
+ break;
+ case 1:
+ break;
+ case 17:
+ sub_800C054(2, 0, 240, gUnknown_082ED6E0);
+ sub_800D52C(sub_800ED34);
+ gUnknown_03005000.unk_04 = 18;
+ break;
+ case 18:
+ break;
+ case 13:
+ if (rfu_UNI_setSendData(1 << gUnknown_03005000.unk_c3e, gUnknown_03005000.unk_4c, 14) == 0)
+ {
+ gUnknown_03005000.unk_0c = 0;
+ DestroyTask(taskId);
+ if (gTasks[taskId].data[7])
+ {
+ CreateTask(sub_8010D0C, 1);
+ }
+ else
+ {
+ CreateTask(sub_801084C, 5);
+ }
+ }
+ break;
+ case 14:
+ sub_800C27C(0);
+ gUnknown_03005000.unk_04 = 15;
+ break;
+ case 15:
+ break;
+ case 16:
+ gUnknown_03005000.unk_cdb = 0;
+ sub_800D52C(sub_800EDBC);
+ sub_8011068(1);
+ sub_800EAB4();
+ sub_800EAFC();
+ gUnknown_03005000.unk_04 = 20;
+ gTasks[taskId].data[1] = 8;
+ gUnknown_03005000.unk_0c = 1;
+ CreateTask(sub_801084C, 5);
+ gUnknown_03005000.unk_ce8 = 1;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_800ED10(void)
+{
+ sub_800C054(1, 0, 240, gUnknown_082ED6E0);
+}
+
+void sub_800ED28(void)
+{
+ sub_800C27C(FALSE);
+}
+
+void sub_800ED34(u16 unused)
+{
+ int i;
+
+ for (i = 0; i < 14; i++)
+ {
+ gUnknown_03005000.unk_4c[i] = 0;
+ }
+ rfu_REQ_recvData();
+ rfu_waitREQComplete();
+ if (gUnknown_03007870[gUnknown_03005000.unk_c3e]->unk_12)
+ {
+ gUnknown_03005000.unk_cd0++;
+ sub_800D7D8(&gUnknown_03005000.unk_124, gUnknown_03005000.unk_c3f);
+ gUnknown_02022B44.unk_06++;
+ sub_800F048();
+ rfu_UNI_readySendData(gUnknown_03005000.unk_c3e);
+ rfu_UNI_clearRecvNewDataFlag(gUnknown_03005000.unk_c3e);
+ }
+ rfu_REQ_sendData_wrapper(1);
+}
+
+static void sub_800EDBC(u16 unused)
+{
+ gUnknown_03005000.unk_cdb = 1;
+}
+
+void sub_800EDD4(void)
+{
+ u8 i;
+
+ sub_800C048();
+ if (gUnknown_03005000.unk_0c == 1)
+ {
+ if (FuncIsActiveTask(sub_800E748) == TRUE)
+ {
+ DestroyTask(gUnknown_03005000.unk_67);
+ sub_800E604();
+ }
+ }
+ else if (gUnknown_03005000.unk_0c == 0)
+ {
+ if (FuncIsActiveTask(sub_800E94C) == TRUE)
+ {
+ DestroyTask(gUnknown_03005000.unk_67);
+ sub_800E604();
+ }
+ }
+ else if (gUnknown_03005000.unk_0c == 2)
+ {
+ if (FuncIsActiveTask(sub_800EB44) == TRUE)
+ {
+ DestroyTask(gUnknown_03005000.unk_67);
+ sub_800E604();
+ }
+ }
+ for (i = 0; i < 3; i++)
+ {
+ if (FuncIsActiveTask(gUnknown_082ED7E0[i]) == TRUE)
+ {
+ DestroyTask(FindTaskIdByFunc(gUnknown_082ED7E0[i]));
+ }
+ }
+}
+
+void sub_800EE78(void)
+{
+ gUnknown_03005000.unk_67 = CreateTask(sub_800E748, 1);
+}
+
+bool8 sub_800EE94(void)
+{
+ if (gUnknown_03005000.unk_04 == 7 && gUnknown_03005000.unk_ccd)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_800EEBC(void)
+{
+ if (gUnknown_03005000.unk_04 == 7 && !sub_800C12C(gUnknown_03007890->unk_14[gUnknown_03005000.unk_c3d].unk_00, 240))
+ {
+ gUnknown_03005000.unk_04 = 9;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_800EF00(void)
+{
+ gUnknown_03005000.unk_67 = CreateTask(sub_800E94C, 1);
+}
+
+bool8 sub_800EF1C(void)
+{
+ if (gUnknown_03004140.unk_00)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_800EF38(void)
+{
+ gUnknown_03005000.unk_04 = 4;
+ gUnknown_03005000.unk_ce7 = gUnknown_03004140.unk_00;
+}
+
+bool32 sub_800EF58(bool32 a0)
+{
+ if (gUnknown_03005000.unk_04 == 17 || a0)
+ {
+ gUnknown_03005000.unk_04 = 18;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_800EF7C(void)
+{
+ gUnknown_03005000.unk_04 = 14;
+}
+
+void sub_800EF88(u8 a0)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (a0 & 1)
+ {
+ rfu_UNI_readySendData(i);
+ break;
+ }
+ a0 >>= 1;
+ }
+}
+
+#ifdef NONMATCHING
+// FIXME: gUnknown_03005000.unk_c87 should be in r5
+// FIXME: gRecvCmds should be in r6 and r7
+void sub_800EFB0(void)
+{
+ int i, j;
+ for (i = 0; i < 5; i++)
+ {
+ for (j = 0; j < 7; j++)
+ {
+ gUnknown_03005000.unk_c87[i][j][1] = gRecvCmds[i][j] >> 8;
+ gUnknown_03005000.unk_c87[i][j][0] = gRecvCmds[i][j];
+ }
+ }
+ CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
+}
+#else
+NAKED void sub_800EFB0(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tsub sp, 0x4\n"
+ "\tmovs r2, 0\n"
+ "\tldr r7, =gRecvCmds\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tadds r6, r7, 0\n"
+ "\tldr r1, =0x00000c87\n"
+ "\tadds r5, r0, r1\n"
+ "_0800EFC0:\n"
+ "\tmovs r3, 0\n"
+ "\tlsls r0, r2, 3\n"
+ "\tlsls r1, r2, 4\n"
+ "\tadds r4, r2, 0x1\n"
+ "\tsubs r0, r2\n"
+ "\tlsls r0, 1\n"
+ "\tadds r2, r0, r5\n"
+ "\tadds r1, r6\n"
+ "_0800EFD0:\n"
+ "\tldrh r0, [r1]\n"
+ "\tlsrs r0, 8\n"
+ "\tstrb r0, [r2, 0x1]\n"
+ "\tldrh r0, [r1]\n"
+ "\tstrb r0, [r2]\n"
+ "\tadds r2, 0x2\n"
+ "\tadds r1, 0x2\n"
+ "\tadds r3, 0x1\n"
+ "\tcmp r3, 0x6\n"
+ "\tble _0800EFD0\n"
+ "\tadds r2, r4, 0\n"
+ "\tcmp r2, 0x4\n"
+ "\tble _0800EFC0\n"
+ "\tmovs r0, 0\n"
+ "\tmov r1, sp\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r2, =0x01000028\n"
+ "\tmov r0, sp\n"
+ "\tadds r1, r7, 0\n"
+ "\tbl CpuSet\n"
+ "\tadd sp, 0x4\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif
+
+void sub_800F014(void)
+{
+ int i;
+ for (i = 0; i < 7; i++)
+ {
+ gRecvCmds[0][i] = gSendCmd[i];
+ }
+ for (i = 0; i < 7; i++)
+ {
+ gSendCmd[i] = 0;
+ }
+}
+
+static void sub_800F048(void)
+{
+ if (gUnknown_03005000.unk_c3c)
+ {
+ u8 r2 = sub_800DAC8(&gUnknown_03005000.unk_c1c, gUnknown_03005000.unk_4c);
+ if (gUnknown_03005000.unk_c1c.unk_1e == 0)
+ {
+ gUnknown_03005000.unk_c3c = 0;
+ }
+ if (r2)
+ {
+ return;
+ }
+ }
+ if (gUnknown_03005000.unk_c3c == 0)
+ {
+ sub_800D9DC(&gUnknown_03005000.unk_9e8, gUnknown_03005000.unk_4c);
+ sub_800DA68(&gUnknown_03005000.unk_c1c, gUnknown_03005000.unk_4c);
+ }
+}
+
+bool32 sub_800F0B8(void)
+{
+ int i;
+ int j;
+
+ if (gUnknown_03007890->unk_06 == 0)
+ {
+ return FALSE;
+ }
+ for (i = 0; i < 5; i++)
+ {
+ for (j = 0; j < 7; j++)
+ {
+ if (gRecvCmds[i][j] != 0)
+ {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+bool32 sub_800F0F8(void)
+{
+ if (gUnknown_03005000.unk_04 < 20)
+ {
+ rfu_REQ_recvData();
+ rfu_waitREQComplete();
+ rfu_REQ_sendData_wrapper(0);
+ }
+ else
+ {
+ gUnknown_03005000.unk_cdb = 0;
+ if ((gUnknown_03005000.unk_ce2 & gUnknown_03007890->unk_02) == gUnknown_03005000.unk_ce2 && (gUnknown_03005000.unk_ce2 & gUnknown_03007890->unk_02))
+ {
+ if (!gUnknown_03005000.unk_cdc)
+ {
+ if (gUnknown_03005000.unk_ce3)
+ {
+ sub_8011D6C(gUnknown_03005000.unk_ce3);
+ gUnknown_03005000.unk_ce3 = 0;
+ if (gUnknown_03005000.unk_ce4 == 1)
+ {
+ sub_8011A64(2, 0x8000);
+ sub_8011170(0x8000);
+ return FALSE;
+ }
+ if (!gUnknown_03004140.unk_00)
+ {
+ sub_800EDD4();
+ gReceivedRemoteLinkPlayers = 0;
+ return FALSE;
+ }
+ }
+ sub_800EFB0();
+ rfu_UNI_readySendData(gUnknown_03005000.unk_cda);
+ rfu_REQ_sendData_wrapper(1);
+ }
+ else
+ {
+ rfu_REQ_PARENT_resumeRetransmitAndChange();
+ }
+ gUnknown_03005000.unk_0e = 1;
+ }
+ }
+ return FALSE;
+}
+
+bool32 sub_800F1E0(void)
+{
+ u16 i;
+ u16 flags;
+ u8 r0;
+ u16 j;
+ u8 retval;
+
+ if (gUnknown_03005000.unk_04 >= 20 && gUnknown_03005000.unk_0e == 1)
+ {
+ rfu_waitREQComplete();
+ while (gUnknown_03005000.unk_cdb == 0)
+ {
+ if (gUnknown_03005000.unk_ee != 0)
+ {
+ return FALSE;
+ }
+ }
+ rfu_REQ_recvData();
+ rfu_waitREQComplete();
+ if ((gUnknown_03004140.unk_03 & gUnknown_03005000.unk_ce2) == gUnknown_03005000.unk_ce2)
+ {
+ gUnknown_03005000.unk_cdc = 0;
+ gUnknown_02022B44.unk_06++;
+ flags = gUnknown_03004140.unk_00;
+ for (i = 0; i < 4; i++)
+ {
+ if (flags & 1)
+ {
+ if (gUnknown_03005000.unk_14[i][1])
+ {
+ if (gUnknown_03005000.unk_cee[i] != 0xff && (gUnknown_03005000.unk_14[i][0] >> 5) != ((gUnknown_03005000.unk_cee[i] + 1) & 7))
+ {
+ if (++gUnknown_03005000.unk_cea[i] > 4)
+ sub_8011170(0x8100);
+ }
+ else
+ {
+ gUnknown_03005000.unk_cee[i] = gUnknown_03005000.unk_14[i][0] / 32;
+ gUnknown_03005000.unk_cea[i] = 0;
+ gUnknown_03005000.unk_14[i][0] &= 0x1f;
+ r0 = gUnknown_03005000.unk_cde[i];
+ for (j = 0; j < 7; j++)
+ {
+ gRecvCmds[r0][j] = (gUnknown_03005000.unk_14[i][(j << 1) + 1] << 8) | gUnknown_03005000.unk_14[i][(j << 1) + 0];
+ gUnknown_03005000.unk_14[i][(j << 1) + 1] = 0;
+ gUnknown_03005000.unk_14[i][(j << 1) + 0] = 0;
+ }
+ }
+ }
+ rfu_UNI_clearRecvNewDataFlag(i);
+ }
+ flags >>= 1;
+ }
+ sub_800F014();
+ sub_800F86C(0);
+ sub_8010528();
+ if (gUnknown_03005000.unk_ce5 && !gUnknown_03005000.unk_cd9)
+ {
+ gUnknown_02022B44.unk_0e = 0;
+ rfu_clearSlot(3, gUnknown_03005000.unk_cda);
+ for (i = 0; i < 4; i++)
+ {
+ if ((gUnknown_03005000.unk_ce5 >> i) & 1)
+ {
+ rfu_setRecvBuffer(0x10, i, gUnknown_03005000.unk_14[i], 14);
+ }
+ }
+ sub_800E88C(gUnknown_03005000.unk_ce2, gUnknown_03005000.unk_ce2 | gUnknown_03005000.unk_ce5);
+ gUnknown_03005000.unk_ce9 = gUnknown_03005000.unk_ce5;
+ gUnknown_03005000.unk_ce2 |= gUnknown_03005000.unk_ce5;
+ gUnknown_03005000.unk_ce5 = 0;
+ rfu_UNI_setSendData(gUnknown_03005000.unk_ce2, gUnknown_03005000.unk_c87, 70);
+ gUnknown_03005000.unk_cda = sub_800E87C(gUnknown_03005000.unk_ce2);
+ CreateTask(sub_8010AAC, 0);
+ }
+ }
+ else
+ {
+ gUnknown_03005000.unk_cdc = 1;
+ gUnknown_03005000.unk_0e = 0;
+ }
+ gUnknown_03005000.unk_0e = 0;
+ }
+ retval = gUnknown_03005000.unk_cdc;
+ return gUnknown_03007890->unk_06 ? retval & 1 : FALSE;
+}
+
+void sub_800F498(u16 *a0, u8 *a1)
+{
+ int i;
+
+ if (a0[0])
+ {
+ a0[0] |= (gUnknown_03005000.unk_102 << 5);
+ gUnknown_03005000.unk_102 = (gUnknown_03005000.unk_102 + 1) & 7;
+ for (i = 0; i < 7; i++)
+ {
+ a1[2 * i + 1] = a0[i] >> 8;
+ a1[2 * i + 0] = a0[i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < 14; i++)
+ a1[i] = 0;
+ }
+}
+
+bool32 sub_800F4F0(void)
+{
+ u8 i;
+ u8 j;
+ u8 sp00[MAX_RFU_PLAYERS * (2 * (CMD_LENGTH - 1))];
+ u8 sp48[2 * (CMD_LENGTH - 1)];
+ u8 switchval;
+
+ sub_800D934(&gUnknown_03005000.unk_124, sp00);
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ for (j = 0; j < CMD_LENGTH - 1; j++)
+ {
+ gRecvCmds[i][j] = (sp00[i * 14 + (j << 1) + 1] << 8) | sp00[i * 14 + (j << 1) + 0];
+ }
+ }
+ sub_800F86C(0);
+ if (gUnknown_03004140.unk_02 == 0 && gUnknown_03005000.unk_ce4)
+ {
+ rfu_REQ_disconnect(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03);
+ rfu_waitREQComplete();
+ switchval = sub_8011A74();
+ if (switchval != 1 && switchval != 6 && switchval != 9)
+ sub_8011A64(2, 0x9000);
+ rfu_clearAllSlot();
+ gReceivedRemoteLinkPlayers = FALSE;
+ gUnknown_03005000.unk_00 = 0;
+ if (gUnknown_03005000.unk_ce4 == 1)
+ {
+ sub_8011A64(2, 0x9000);
+ sub_8011170(0x9000);
+ }
+ gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0;
+ gUnknown_03005000.unk_ce4 = 0;
+ }
+ if (gUnknown_03005000.unk_cd0)
+ {
+ gUnknown_03005000.unk_cd0--;
+ sub_8010528();
+ sub_800F498(gSendCmd, sp48);
+ sub_800D888(&gUnknown_03005000.unk_9e8, sp48);
+ for (i = 0; i < CMD_LENGTH - 1; i++)
+ gSendCmd[i] = 0;
+ }
+ return sub_800F0B8();
+}
+
+#ifdef NONMATCHING
+void sub_800F638(u8 unused, u32 flags)
+{
+ int i;
+ int j;
+
+ u8 *r10 = gUnknown_03005000.unk_6c.unk_04;
+ for (i = 0; i < gUnknown_03005000.unk_6c.unk_02; i++)
+ {
+ if (!(flags & 1))
+ {
+ gUnknown_03000D90[0] = (~0x76ff) | i;
+ for (j = 0; j < 7; j++)
+ {
+ gUnknown_03000D90[j + 1] = (r10[12 * i + (j << 1) + 1] << 8) | r10[12 * i + (j << 1) + 0];
+ }
+ for (j = 0; j < 7; j++)
+ // This should be an ascending loop.
+ // GCC compiles this as descending.
+ {
+ gUnknown_03000D80[2 * j + 1] = gUnknown_03000D90[j] >> 8;
+ gUnknown_03000D80[2 * j + 0] = gUnknown_03000D90[j];
+ }
+ sub_800D888(&gUnknown_03005000.unk_9e8, gUnknown_03000D80);
+ gUnknown_03005000.unk_6c.unk_0c |= (1 << i);
+ }
+ flags >>= 1;
+ }
+}
+#else
+NAKED void sub_800F638(u8 unused, u32 flags)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tldr r2, [r0, 0x70]\n"
+ "\tmov r10, r2\n"
+ "\tmovs r5, 0\n"
+ "\tadds r2, r0, 0\n"
+ "\tadds r2, 0x6E\n"
+ "\tldrh r3, [r2]\n"
+ "\tcmp r5, r3\n"
+ "\tbge _0800F6D4\n"
+ "\tmov r9, r0\n"
+ "\tldr r0, =gUnknown_03000D90\n"
+ "\tmov r8, r0\n"
+ "_0800F65A:\n"
+ "\tmovs r0, 0x1\n"
+ "\tands r0, r1\n"
+ "\tlsrs r7, r1, 1\n"
+ "\tadds r6, r5, 0x1\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0800F6C8\n"
+ "\tldr r1, =0xffff8900\n"
+ "\tadds r0, r1, 0\n"
+ "\tadds r1, r5, 0\n"
+ "\torrs r1, r0\n"
+ "\tmov r2, r8\n"
+ "\tstrh r1, [r2]\n"
+ "\tmovs r4, 0\n"
+ "\tlsls r0, r5, 1\n"
+ "\tldr r3, =gUnknown_03000D80\n"
+ "\tmov r12, r3\n"
+ "\tadds r0, r5\n"
+ "\tlsls r0, 2\n"
+ "\tmov r1, r10\n"
+ "\tadds r2, r0, r1\n"
+ "\tmov r3, r8\n"
+ "\tadds r3, 0x2\n"
+ "_0800F686:\n"
+ "\tldrb r1, [r2, 0x1]\n"
+ "\tlsls r1, 8\n"
+ "\tldrb r0, [r2]\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r3]\n"
+ "\tadds r2, 0x2\n"
+ "\tadds r3, 0x2\n"
+ "\tadds r4, 0x1\n"
+ "\tcmp r4, 0x6\n"
+ "\tble _0800F686\n"
+ "\tmovs r4, 0\n"
+ "\tldr r2, =gUnknown_03000D90\n"
+ "\tldr r1, =gUnknown_03000D80\n"
+ "_0800F6A0:\n"
+ "\tldrh r0, [r2]\n"
+ "\tlsrs r0, 8\n"
+ "\tstrb r0, [r1, 0x1]\n"
+ "\tldrh r0, [r2]\n"
+ "\tstrb r0, [r1]\n"
+ "\tadds r2, 0x2\n"
+ "\tadds r1, 0x2\n"
+ "\tadds r4, 0x1\n"
+ "\tcmp r4, 0x6\n"
+ "\tble _0800F6A0\n"
+ "\tldr r0, =gUnknown_03005000+0x9E8\n"
+ "\tmov r1, r12\n"
+ "\tbl sub_800D888\n"
+ "\tmovs r1, 0x1\n"
+ "\tlsls r1, r5\n"
+ "\tmov r2, r9\n"
+ "\tldr r0, [r2, 0x78]\n"
+ "\torrs r0, r1\n"
+ "\tstr r0, [r2, 0x78]\n"
+ "_0800F6C8:\n"
+ "\tadds r1, r7, 0\n"
+ "\tadds r5, r6, 0\n"
+ "\tldr r3, =gUnknown_03005000+0x6E\n"
+ "\tldrh r3, [r3]\n"
+ "\tcmp r5, r3\n"
+ "\tblt _0800F65A\n"
+ "_0800F6D4:\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif
+
+void sub_800F6FC(u8 a0)
+{
+ if (gUnknown_03005000.unk_0c == 1 && a0)
+ gUnknown_03005000.unk_61[a0] = 1;
+ else
+ gUnknown_03005000.unk_5c[a0] = 1;
+}
+
+void sub_800F728(u8 a0)
+{
+ gUnknown_03005000.unk_5c[a0] = 0;
+ gUnknown_03005000.unk_80[a0].unk_12 = 0;
+}
+
+u8 sub_800F74C(const u8 *a0)
+{
+ u8 i;
+
+ if (gUnknown_03005000.unk_0c == 1)
+ return FALSE;
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_03005000.unk_cde[i] = a0[i];
+ }
+ return a0[gUnknown_03005000.unk_c3e];
+}
+
+void rfu_func_080F97B8(void)
+{
+ if (gReceivedRemoteLinkPlayers && gUnknown_03005DA8 && gLinkTransferringData != 1)
+ {
+ gUnknown_03000D78[0]++;
+ gUnknown_03005DA8 |= (gUnknown_03000D78[0] << 8);
+ sub_800FD14(0xbe00);
+ }
+}
+
+struct UnkLinkRfuStruct_02022B14 *sub_800F7DC(void)
+{
+ return &gUnknown_02022B14;
+}
+
+bool32 sub_800F7E4(void)
+{
+ return gUnknown_03005000.unk_00 == rfu_func_080F97B8;
+}
+
+void sub_800F804(void)
+{
+ gUnknown_03005000.unk_00 = rfu_func_080F97B8;
+}
+
+void Rfu_set_zero(void)
+{
+ gUnknown_03005000.unk_00 = NULL;
+}
+
+void sub_800F820(void)
+{
+ sub_800FD14(0x4400);
+ if (GetMultiplayerId() == 0)
+ gSendCmd[6] = GetBlenderArrowPosition();
+ gUnknown_020223C0++;
+}
+
+void sub_800F850(void)
+{
+ if (gUnknown_03005000.unk_00 == NULL)
+ gUnknown_03005000.unk_00 = sub_800F820;
+}
+
+static void sub_800F86C(u8 unused)
+{
+ u16 i;
+ u16 j;
+
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ switch (gRecvCmds[i][0] & 0xff00)
+ {
+ case 0x7800:
+ if (gUnknown_03005000.unk_0c == 0 && gReceivedRemoteLinkPlayers != 0)
+ return;
+ // fallthrough
+ case 0x7700:
+ if (gUnknown_03007890->unk_00 == 0)
+ {
+ gUnknown_03005000.playerCount = gRecvCmds[i][1];
+ gUnknown_03005000.unk_cce = sub_800F74C((u8 *)(gRecvCmds[i] + 2));
+ }
+ break;
+ case 0x8800:
+ if (gUnknown_03005000.unk_80[i].unk_12 == 0)
+ {
+ gUnknown_03005000.unk_80[i].unk_00 = 0;
+ gUnknown_03005000.unk_80[i].unk_02 = gRecvCmds[i][1];
+ gUnknown_03005000.unk_80[i].unk_11 = gRecvCmds[i][2];
+ gUnknown_03005000.unk_80[i].unk_08 = 0;
+ gUnknown_03005000.unk_80[i].unk_12 = 1;
+ gUnknown_03005000.unk_5c[i] = 0;
+ }
+ break;
+ case 0x8900:
+ if (gUnknown_03005000.unk_80[i].unk_12 == 1)
+ {
+ gUnknown_03005000.unk_80[i].unk_00 = gRecvCmds[i][0] & 0xff;
+ gUnknown_03005000.unk_80[i].unk_08 |= (1 << gUnknown_03005000.unk_80[i].unk_00);
+ for (j = 0; j < 6; j++)
+ gBlockRecvBuffer[i][gUnknown_03005000.unk_80[i].unk_00 * 6 + j] = gRecvCmds[i][j + 1];
+ if (gUnknown_03005000.unk_80[i].unk_08 == gUnknown_082ED628[gUnknown_03005000.unk_80[i].unk_02])
+ {
+ gUnknown_03005000.unk_80[i].unk_12 = 2;
+ sub_800F6FC(i);
+ if (sub_800F7DC()->unk_0a_0 == 0x45 && gReceivedRemoteLinkPlayers != 0 && gUnknown_03005000.unk_0c == 0)
+ sub_8010A70(gBlockRecvBuffer);
+ }
+ }
+ break;
+ case 0xa100:
+ sub_800FE84(gUnknown_082ED6B8[gRecvCmds[i][1]].buffer, (u16)gUnknown_082ED6B8[gRecvCmds[i][1]].size);
+ break;
+ case 0x5f00:
+ gUnknown_03005000.unk_e4[i] = 1;
+ break;
+ case 0x6600:
+ if (gUnknown_03005000.unk_100 == gRecvCmds[i][1])
+ gUnknown_03005000.unk_e9[i] = 1;
+ break;
+ case 0xed00:
+ if (gUnknown_03005000.unk_0c == 0)
+ {
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (gRecvCmds[i][1] & gUnknown_03007890->unk_02)
+ {
+ gReceivedRemoteLinkPlayers = 0;
+ sub_800D630();
+ gUnknown_03005000.unk_ce4 = gRecvCmds[i][2];
+ }
+ gUnknown_03005000.playerCount = gRecvCmds[i][3];
+ sub_80109E8(gRecvCmds[i][1]);
+ }
+ }
+ else
+ {
+ sub_800FD14(0xee00);
+ gSendCmd[1] = gRecvCmds[i][1];
+ gSendCmd[2] = gRecvCmds[i][2];
+ gSendCmd[3] = gRecvCmds[i][3];
+ }
+ break;
+ case 0xee00:
+ if (gUnknown_03005000.unk_0c == 1)
+ {
+ gUnknown_03005000.unk_ce3 |= gRecvCmds[i][1];
+ gUnknown_03005000.unk_ce4 = gRecvCmds[i][2];
+ sub_80109E8(gRecvCmds[i][1]);
+ }
+ break;
+ case 0x4400:
+ case 0xbe00:
+ gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
+ break;
+ }
+ if (gUnknown_03005000.unk_0c == 1 && gUnknown_03005000.unk_61[i])
+ {
+ if (gUnknown_03005000.unk_61[i] == 4)
+ {
+ gUnknown_03005000.unk_5c[i] = 1;
+ gUnknown_03005000.unk_61[i] = 0;
+ }
+ else
+ gUnknown_03005000.unk_61[i]++;
+ }
+ }
+}
+
+bool8 sub_800FC60(void)
+{
+ int i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (gUnknown_03005000.unk_80[i].unk_12)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_800FC88(void)
+{
+ int i;
+
+ for (i = 0; i < gUnknown_03005000.playerCount; i++)
+ {
+ if (gUnknown_03005000.unk_80[i].unk_12 != 2 || gUnknown_03005000.unk_5c[i] != 1)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data)
+{
+ data->unk_00 = 0;
+ data->unk_02 = 0;
+ data->unk_04 = NULL;
+ data->unk_08 = 0;
+ data->unk_10 = 0;
+ data->unk_11 = 0;
+ data->unk_12 = 0;
+}
+
+u8 sub_800FCD8(void)
+{
+ u8 flags = 0;
+ int i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (gUnknown_03005000.unk_80[i].unk_12 == 2 && gUnknown_03005000.unk_5c[i] == 1)
+ {
+ flags |= (1 << i);
+ }
+ }
+ return flags;
+}
+
+#ifdef NONMATCHING
+// The switch tree is incorrect
+void sub_800FD14(u16 command)
+{
+ u8 i;
+ u8 *buff;
+ u8 tmp;
+
+ gSendCmd[0] = command;
+ switch (command)
+ {
+ case 0x8800:
+ gSendCmd[1] = gUnknown_03005000.unk_6c.unk_02;
+ gSendCmd[2] = gUnknown_03005000.unk_6c.unk_11 + 0x80;
+ break;
+ case 0xa100:
+ if (sub_800FC60())
+ gSendCmd[1] = gUnknown_03005000.unk_5a;
+ break;
+ case 0x7800:
+ case 0x7700:
+ tmp = gUnknown_03005000.unk_ce2 ^ gUnknown_03005000.unk_ce3;
+ gUnknown_03005000.playerCount = gUnknown_082ED695[tmp] + 1;
+ gSendCmd[1] = gUnknown_03005000.playerCount;
+ buff = (u8 *)(gSendCmd + 2);
+ for (i = 0; i < 4; i++)
+ buff[i] = gUnknown_03005000.unk_cde[i];
+ break;
+ case 0x6600:
+ case 0x5f00:
+ gSendCmd[1] = gUnknown_03005000.unk_100;
+ break;
+ case 0x4400:
+ gSendCmd[0] = 0x4400;
+ gSendCmd[1] = gMain.heldKeys;
+ break;
+ case 0x2f00:
+ for (i = 0; i < 6; i++)
+ gSendCmd[1 + i] = gUnknown_03005000.unk_f2[i];
+ break;
+ case 0xbe00:
+ gSendCmd[1] = gUnknown_03005DA8;
+ break;
+ }
+}
+#else
+NAKED void sub_800FD14(u16 command)
+{
+ asm_unified("\tpush {r4,r5,lr}\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tldr r5, =gSendCmd\n"
+ "\tstrh r1, [r5]\n"
+ "\tmovs r0, 0xF0\n"
+ "\tlsls r0, 7\n"
+ "\tadds r4, r5, 0\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FDB0_case_7700_case_7800\n"
+ "\tcmp r1, r0\n"
+ "\tbgt _0800FD62\n"
+ "\tmovs r0, 0xBE\n"
+ "\tlsls r0, 7\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FE00_case_5f00_case_6600\n"
+ "\tcmp r1, r0\n"
+ "\tbgt _0800FD50\n"
+ "\tmovs r0, 0xBC\n"
+ "\tlsls r0, 6\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FE20_case_2f00\n"
+ "\tmovs r0, 0x88\n"
+ "\tlsls r0, 7\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FE14_case_4400\n"
+ "\tb _0800FE46_break\n"
+ "\t.pool\n"
+ "_0800FD50:\n"
+ "\tmovs r0, 0xCC\n"
+ "\tlsls r0, 7\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FE00_case_5f00_case_6600\n"
+ "\tmovs r0, 0xEE\n"
+ "\tlsls r0, 7\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FDB0_case_7700_case_7800\n"
+ "\tb _0800FE46_break\n"
+ "_0800FD62:\n"
+ "\tmovs r0, 0xBE\n"
+ "\tlsls r0, 8\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FE40_case_be00\n"
+ "\tcmp r1, r0\n"
+ "\tbgt _0800FE46_break\n"
+ "\tmovs r0, 0x88\n"
+ "\tlsls r0, 8\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FD80_case_8800\n"
+ "\tmovs r0, 0xA1\n"
+ "\tlsls r0, 8\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _0800FD98_case_a100\n"
+ "\tb _0800FE46_break\n"
+ "_0800FD80_case_8800:\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tadds r1, r0, 0\n"
+ "\tadds r1, 0x6E\n"
+ "\tldrh r1, [r1]\n"
+ "\tstrh r1, [r5, 0x2]\n"
+ "\tadds r0, 0x7D\n"
+ "\tldrb r0, [r0]\n"
+ "\tadds r0, 0x80\n"
+ "\tstrh r0, [r5, 0x4]\n"
+ "\tb _0800FE46_break\n"
+ "\t.pool\n"
+ "_0800FD98_case_a100:\n"
+ "\tbl sub_800FC60\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800FE46_break\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tadds r0, 0x5A\n"
+ "\tldrb r0, [r0]\n"
+ "\tb _0800FE44_str_break\n"
+ "\t.pool\n"
+ "_0800FDB0_case_7700_case_7800:\n"
+ "\tldr r3, =gUnknown_03005000\n"
+ "\tldr r1, =0x00000ce2\n"
+ "\tadds r0, r3, r1\n"
+ "\tldr r2, =0x00000ce3\n"
+ "\tadds r1, r3, r2\n"
+ "\tldrb r2, [r0]\n"
+ "\tldrb r0, [r1]\n"
+ "\teors r0, r2\n"
+ "\tldr r1, =gUnknown_082ED695\n"
+ "\tadds r0, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrb r0, [r3, 0xD]\n"
+ "\tldrb r0, [r3, 0xD]\n"
+ "\tstrh r0, [r4, 0x2]\n"
+ "\tadds r2, r4, 0x4\n"
+ "\tmovs r4, 0\n"
+ "\tldr r0, =0x00000cde\n"
+ "\tadds r3, r0\n"
+ "_0800FDD6:\n"
+ "\tadds r1, r2, r4\n"
+ "\tadds r0, r4, r3\n"
+ "\tldrb r0, [r0]\n"
+ "\tstrb r0, [r1]\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tcmp r4, 0x3\n"
+ "\tbls _0800FDD6\n"
+ "\tb _0800FE46_break\n"
+ "\t.pool\n"
+ "_0800FE00_case_5f00_case_6600:\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tmovs r1, 0x80\n"
+ "\tlsls r1, 1\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0]\n"
+ "\tstrh r0, [r4, 0x2]\n"
+ "\tb _0800FE46_break\n"
+ "\t.pool\n"
+ "_0800FE14_case_4400:\n"
+ "\tstrh r1, [r5]\n"
+ "\tldr r0, =gMain\n"
+ "\tldrh r0, [r0, 0x2C]\n"
+ "\tb _0800FE44_str_break\n"
+ "\t.pool\n"
+ "_0800FE20_case_2f00:\n"
+ "\tmovs r4, 0\n"
+ "\tldr r3, =gUnknown_03005000+0xF2\n"
+ "_0800FE24:\n"
+ "\tadds r2, r4, 0x1\n"
+ "\tlsls r1, r2, 1\n"
+ "\tadds r1, r5\n"
+ "\tlsls r0, r4, 1\n"
+ "\tadds r0, r3\n"
+ "\tldrh r0, [r0]\n"
+ "\tstrh r0, [r1]\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r4, r2, 24\n"
+ "\tcmp r4, 0x5\n"
+ "\tbls _0800FE24\n"
+ "\tb _0800FE46_break\n"
+ "\t.pool\n"
+ "_0800FE40_case_be00:\n"
+ "\tldr r0, =gUnknown_03005DA8\n"
+ "\tldrh r0, [r0]\n"
+ "_0800FE44_str_break:\n"
+ "\tstrh r0, [r5, 0x2]\n"
+ "_0800FE46_break:\n"
+ "\tpop {r4,r5}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif
+
+void sub_800FE50(u16 *a0)
+{
+ if (gSendCmd[0] == 0 && sub_8011A80() == 0)
+ {
+ memcpy(gUnknown_03005000.unk_f2, a0, sizeof(gUnknown_03005000.unk_f2));
+ sub_800FD14(0x2f00);
+ }
+}
+
+bool32 sub_800FE84(const u8 *src, size_t size)
+{
+ bool8 r4;
+ if (gUnknown_03005000.unk_00 != NULL)
+ return FALSE;
+ if (gSendCmd[0] != 0)
+ return FALSE;
+ if (gUnknown_03005000.unk_6c.unk_10 != 0)
+ {
+ gUnknown_02022B44.unk_83++;
+ return FALSE;
+ }
+ r4 = (size % 12) != 0;
+ gUnknown_03005000.unk_6c.unk_11 = GetMultiplayerId();
+ gUnknown_03005000.unk_6c.unk_10 = 1;
+ gUnknown_03005000.unk_6c.unk_02 = (size / 12) + r4;
+ gUnknown_03005000.unk_6c.unk_00 = 0;
+ if (size > 0x100)
+ gUnknown_03005000.unk_6c.unk_04 = src;
+ else
+ {
+ if (src != gBlockSendBuffer)
+ memcpy(gBlockSendBuffer, src, size);
+ gUnknown_03005000.unk_6c.unk_04 = gBlockSendBuffer;
+ }
+ sub_800FD14(0x8800);
+ gUnknown_03005000.unk_00 = rfufunc_80F9F44;
+ gUnknown_03005000.unk_5b = 0;
+ return TRUE;
+}
+
+static void rfufunc_80F9F44(void)
+{
+ if (gSendCmd[0] == 0)
+ {
+ sub_800FD14(0x8800);
+ if (gUnknown_03005000.unk_0c == 1)
+ {
+ if (++gUnknown_03005000.unk_5b > 2)
+ gUnknown_03005000.unk_00 = sub_800FFB0;
+ }
+ else
+ {
+ if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == 0x8800)
+ gUnknown_03005000.unk_00 = sub_800FFB0;
+ }
+ }
+}
+
+static void sub_800FFB0(void)
+{
+ int i;
+ const u8 *src = gUnknown_03005000.unk_6c.unk_04;
+ gSendCmd[0] = 0x8900 | gUnknown_03005000.unk_6c.unk_00;
+ for (i = 0; i < 7; i++)
+ gSendCmd[i + 1] = (src[(i << 1) + gUnknown_03005000.unk_6c.unk_00 * 12 + 1] << 8) | src[(i << 1) + gUnknown_03005000.unk_6c.unk_00 * 12 + 0];
+ gUnknown_03005000.unk_6c.unk_00++;
+ if (gUnknown_03005000.unk_6c.unk_02 <= gUnknown_03005000.unk_6c.unk_00)
+ {
+ gUnknown_03005000.unk_6c.unk_10 = 0;
+ gUnknown_03005000.unk_00 = rfufunc_80FA020;
+ }
+}
+
+static void rfufunc_80FA020(void)
+{
+ const u8 *src = gUnknown_03005000.unk_6c.unk_04;
+ u8 mpId = GetMultiplayerId();
+ int i;
+ if (gUnknown_03005000.unk_0c == 0)
+ {
+ gSendCmd[0] = (~0x76ff) | (gUnknown_03005000.unk_6c.unk_02 - 1);
+ for (i = 0; i < 7; i++)
+ gSendCmd[i + 1] = (src[(i << 1) + (gUnknown_03005000.unk_6c.unk_02 - 1) * 12 + 1] << 8) | src[(i << 1) + (gUnknown_03005000.unk_6c.unk_02 - 1) * 12 + 0];
+ if ((u8)gRecvCmds[mpId][0] == gUnknown_03005000.unk_6c.unk_02 - 1)
+ {
+ if (gUnknown_03005000.unk_80[mpId].unk_08 != gUnknown_082ED628[gUnknown_03005000.unk_80[mpId].unk_02])
+ {
+ sub_800F638(mpId, gUnknown_03005000.unk_80[mpId].unk_08);
+ gUnknown_02022B44.unk_64++;
+ }
+ else
+ gUnknown_03005000.unk_00 = NULL;
+ }
+ }
+ else
+ gUnknown_03005000.unk_00 = NULL;
+}
+
+bool8 sub_8010100(u8 a0)
+{
+ gUnknown_03005000.unk_5a = a0;
+ sub_800FD14(0xa100);
+ return TRUE;
+}
+
+void sub_801011C(void)
+{
+ rfu_clearAllSlot();
+ sub_800C048();
+ gReceivedRemoteLinkPlayers = 0;
+ gUnknown_03005000.unk_ef = 1;
+ gUnknown_03005000.unk_00 = NULL;
+}
+
+void sub_8010148(void)
+{
+ rfu_REQ_disconnect(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03);
+ rfu_waitREQComplete();
+ sub_801011C();
+}
+
+void sub_8010168(void)
+{
+ if (gUnknown_03005000.unk_0c == 0)
+ {
+ sub_800D630();
+ gUnknown_03005000.unk_ce4 = 2;
+ }
+ else
+ gUnknown_03005000.unk_00 = sub_8010148;
+}
+
+void sub_8010198(void)
+{
+ sub_800D630();
+ gUnknown_03005000.unk_ce4 = 1;
+ gUnknown_03005000.unk_ce3 = gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03;
+}
+
+void sub_80101CC(void)
+{
+ int i;
+ u8 playerCount = gUnknown_03005000.playerCount;
+ int count = 0;
+
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ if (gUnknown_03005000.unk_e4[i])
+ count++;
+ }
+ if (count == playerCount)
+ {
+ gBattleTypeFlags &= ~BATTLE_TYPE_20;
+ if (gUnknown_03005000.unk_0c == 0)
+ {
+ gUnknown_03005000.unk_ee = 3;
+ sub_8010168();
+ }
+ else
+ gUnknown_03005000.unk_00 = sub_8010168;
+ }
+}
+
+void sub_801022C(void)
+{
+ if (gSendCmd[0] == 0 && gUnknown_03005000.unk_ce8 == 0)
+ {
+ sub_800FD14(0x5f00);
+ gUnknown_03005000.unk_00 = sub_80101CC;
+ }
+}
+
+void sub_8010264(u8 taskId)
+{
+ if (gUnknown_03005000.unk_00 == NULL)
+ {
+ gUnknown_03005000.unk_cd9 = 1;
+ gUnknown_03005000.unk_00 = sub_801022C;
+ DestroyTask(taskId);
+ }
+}
+
+void task_add_05_task_del_08FA224_when_no_RfuFunc(void)
+{
+ if (!FuncIsActiveTask(sub_8010264))
+ CreateTask(sub_8010264, 5);
+}
+
+void sub_80102B8(void)
+{
+ u8 playerCount;
+ u8 i;
+
+ if (GetMultiplayerId() != 0)
+ {
+ u8 r4 = gUnknown_03005000.unk_124.unk_8c2;
+ if (r4 == 0 && gUnknown_03005000.unk_fe > 0x3c)
+ {
+ sub_800FD14(0x6600);
+ gUnknown_03005000.unk_fe = r4;
+ }
+ }
+ playerCount = GetLinkPlayerCount();
+ for (i = 0; i < playerCount; i++)
+ {
+ if (gUnknown_03005000.unk_e9[i] == 0)
+ break;
+ }
+ if (i == playerCount)
+ {
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ gUnknown_03005000.unk_e9[i] = 0;
+ gUnknown_03005000.unk_100++;
+ gUnknown_03005000.unk_00 = NULL;
+ }
+ gUnknown_03005000.unk_fe++;
+}
+
+void sub_8010358(void)
+{
+ if (gUnknown_03005000.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ {
+ sub_800FD14(0x6600);
+ gUnknown_03005000.unk_00 = sub_80102B8;
+ }
+}
+
+void sub_8010390(void)
+{
+ u8 i;
+ u8 playerCount;
+
+ if (GetMultiplayerId() != 0)
+ {
+ if (gUnknown_03005000.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ {
+ sub_800FD14(0x6600);
+ gUnknown_03005000.unk_00 = sub_80102B8;
+ }
+ }
+ else
+ {
+ playerCount = GetLinkPlayerCount();
+ for (i = 1; i < playerCount; i++)
+ {
+ if (gUnknown_03005000.unk_e9[i] == 0)
+ break;
+ }
+ if (i == playerCount)
+ {
+ if (gUnknown_03005000.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ {
+ sub_800FD14(0x6600);
+ gUnknown_03005000.unk_00 = sub_8010358;
+ }
+ }
+ }
+}
+
+void sub_8010434(void)
+{
+ if (gUnknown_03005000.unk_00 == NULL)
+ {
+ gUnknown_03005000.unk_00 = sub_8010390;
+ gUnknown_03005000.unk_fe = 0;
+ }
+}
+
+bool32 sub_8010454(u32 a0)
+{
+ int i;
+ for (i = 0; gUnknown_082ED6E0[i] != a0; i++)
+ {
+ if (gUnknown_082ED6E0[i] == 0xffff)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+u8 sub_801048C(bool32 a0)
+{
+ if (a0 == 0)
+ return sub_800D550(0, 0);
+ sub_800D550(1, 0x258);
+ return FALSE;
+}
+
+void sub_80104B0(void)
+{
+ gUnknown_03005000.unk_cd9 = 1;
+ sub_800C27C(FALSE);
+}
+
+u8 rfu_get_multiplayer_id(void)
+{
+ if (gUnknown_03005000.unk_0c == 1)
+ return 0;
+ return gUnknown_03005000.unk_cce;
+}
+
+u8 sub_80104F4(void)
+{
+ return gUnknown_03005000.playerCount;
+}
+
+bool8 sub_8010500(void)
+{
+ if (gUnknown_03005000.unk_f1 == 2)
+ return FALSE;
+ return gUnknown_03005000.unk_00 ? FALSE : TRUE;
+}
+
+static void sub_8010528(void)
+{
+ if (gUnknown_03005000.unk_00)
+ gUnknown_03005000.unk_00();
+}
+
+bool8 sub_8010540(void)
+{
+ int i;
+ bool8 retval = FALSE;
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03005000.unk_cd1[i] < 5 || gUnknown_03005000.unk_cd1[i] > 6)
+ {
+ if (gUnknown_03007880[i]->unk_34 == 0x46 || gUnknown_03007880[i]->unk_34 == 0x48)
+ {
+ if (gUnknown_03005000.unk_cd5[i] == 8)
+ {
+ gUnknown_03005000.unk_cd1[i] = 9;
+ gUnknown_03005000.unk_cd5[i] = 10;
+ rfu_clearSlot(8, i);
+ rfu_NI_setSendData(1 << i, 8, gUnknown_03005000.unk_cd1 + i, 1);
+ retval = TRUE;
+ }
+
+ }
+ else if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x47)
+ rfu_clearSlot(8, i);
+ {
+
+ }
+ }
+ }
+ return retval;
+}
+
+bool32 sub_80105EC(void)
+{
+ u8 flags = 0;
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03005000.unk_cd5[i] == 11)
+ {
+ flags |= (1 << i);
+ gUnknown_03005000.unk_cd5[i] = 0;
+ }
+ }
+ if (flags)
+ {
+ rfu_REQ_disconnect(flags);
+ rfu_waitREQComplete();
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03005000.unk_cd5[i] == 10 || gUnknown_03005000.unk_cd5[i] == 11)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_801064C(u16 a0, const u8 *a1)
+{
+ u8 r1 = sub_8011CE4(a1, a0);
+ if (r1 == 0xFF)
+ return TRUE;
+ if (gUnknown_03005000.unk_cd1[r1] == 9)
+ return TRUE;
+ return FALSE;
+}
+
+void sub_8010688(u8 a0, u16 a1, const u8 *a2)
+{
+ u8 r4 = sub_8011CE4(a2, a1);
+ gUnknown_03005000.unk_cd1[r4] = a0;
+ rfu_clearSlot(4, r4);
+ rfu_NI_setSendData(1 << r4, 8, gUnknown_03005000.unk_cd1 + r4, 1);
+}
+
+void sub_80106D4(void)
+{
+ gUnknown_03005000.unk_c85 = 8;
+ rfu_clearSlot(4, gUnknown_03005000.unk_c3e);
+ rfu_NI_setSendData(1 << gUnknown_03005000.unk_c3e, 8, &gUnknown_03005000.unk_c85, 1);
+}
+
+u32 sub_8010714(u16 a0, const u8 *a1)
+{
+ u8 r0 = sub_8011CE4(a1, a0);
+ if (r0 == 0xff)
+ return 2;
+ if (gUnknown_03007880[r0]->unk_0 == 0)
+ return 1;
+ return 0;
+}
+
+void sub_8010750(void)
+{
+ int i;
+
+ sub_8010540();
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_03007880[i]->unk_0 == 0x26 || gUnknown_03007880[i]->unk_0 == 0x27)
+ {
+ if (gUnknown_03005000.unk_cd5[i] == 10)
+ gUnknown_03005000.unk_cd5[i] = 11;
+ rfu_clearSlot(4, i);
+ }
+ }
+}
+
+int sub_80107A0(void)
+{
+ int retval = 0;
+ if (gUnknown_03005000.unk_c85 == 8)
+ {
+ if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_0 == 0x26 || gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_0 == 0x27)
+ rfu_clearSlot(4, gUnknown_03005000.unk_c3e);
+ }
+ if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x46 || gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x48)
+ {
+ rfu_clearSlot(8, gUnknown_03005000.unk_c3e);
+ sub_8011A64(gUnknown_03005000.unk_c86, 0);
+ retval = gUnknown_03005000.unk_c86;
+ }
+ else if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x47)
+ {
+ rfu_clearSlot(8, gUnknown_03005000.unk_c3e);
+ retval = 6;
+ }
+ return retval;
+}
+
+void sub_801084C(u8 taskId)
+{
+ int i;
+
+ if (gUnknown_03005000.unk_f1 == 1 || gUnknown_03005000.unk_f1 == 2)
+ {
+ gUnknown_03005000.unk_ce8 = 0;
+ DestroyTask(taskId);
+ }
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (sub_800FC60())
+ {
+ ResetBlockReceivedFlags();
+ sub_800B348();
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (gUnknown_03005000.unk_0c == 1)
+ {
+ if (gReceivedRemoteLinkPlayers)
+ sub_800FD14(0x7800);
+ else
+ sub_800FD14(0x7700);
+ gTasks[taskId].data[0] = 101;
+ }
+ else
+ gTasks[taskId].data[0] = 2;
+ break;
+ case 101:
+ if (gSendCmd[0] == 0)
+ gTasks[taskId].data[0] = 2;
+ break;
+ case 2:
+ if (gUnknown_03005000.playerCount)
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (gUnknown_03005000.unk_0c == 1)
+ {
+ if (sub_800FC60())
+ {
+ gUnknown_03005000.unk_5a = 0;
+ sub_800FD14(0xa100);
+ gTasks[taskId].data[0]++;
+ }
+ }
+ else
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ if (sub_800FC88())
+ gTasks[taskId].data[0]++;
+ break;
+ case 5:
+ for (i = 0; i < gUnknown_03005000.playerCount; i++)
+ {
+ sub_800B3A4(i);
+ sub_800F728(i);
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ DestroyTask(taskId);
+ gReceivedRemoteLinkPlayers = 1;
+ gUnknown_03005000.unk_ce8 = 0;
+ sub_800D550(1, 0x258);
+ if (gUnknown_03005000.unk_ce6)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if ((gUnknown_03005000.unk_ce6 >> i) & 1)
+ {
+ gUnknown_03005000.unk_ce5 = 1 << i;
+ gUnknown_03005000.unk_ce6 ^= (1 << i);
+ }
+ }
+ }
+ break;
+ }
+}
+
+void sub_80109E8(u16 a0)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if ((a0 >> i) & 1)
+ gUnknown_03005000.unk_cde[i] = 0;
+ }
+}
+
+void sub_8010A14(const struct UnkRfuStruct_8010A14 *a0)
+{
+ int i;
+ gUnknown_03005000.playerCount = a0->unk_0f;
+ for (i = 0; i < 4; i++)
+ gUnknown_03005000.unk_cde[i] = a0->unk_10[i];
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
+ {
+ gLinkPlayers[i] = a0->unk_14[i];
+ sub_800B524(gLinkPlayers + i);
+ }
+}
+
+void sub_8010A70(void *a0)
+{
+ if (strcmp(gUnknown_082ED7EC, a0) == 0)
+ {
+ sub_8010A14(a0);
+ CpuFill16(0, a0, sizeof(struct UnkRfuStruct_8010A14));
+ ResetBlockReceivedFlag(0);
+ }
+}
+
+void sub_8010AAC(u8 taskId)
+{
+ int i;
+ struct LinkPlayerBlock *r2;
+ struct UnkRfuStruct_8010A14 *r5;
+ u8 r4 = gUnknown_03005000.unk_cde[gUnknown_082ED68C[gUnknown_03005000.unk_ce9]];
+ if (gUnknown_03005000.unk_f1 == 1 || gUnknown_03005000.unk_f1 == 2)
+ {
+ gUnknown_03005000.unk_ce8 = 0;
+ DestroyTask(taskId);
+ }
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gSendCmd[0] == 0)
+ {
+ ResetBlockReceivedFlag(r4);
+ sub_800FD14(0x7800);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (gSendCmd[0] == 0)
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if ((GetBlockReceivedStatus() >> r4) & 1)
+ {
+ ResetBlockReceivedFlag(r4);
+ r2 = (struct LinkPlayerBlock *)gBlockRecvBuffer[r4];
+ gLinkPlayers[r4] = r2->linkPlayer;
+ sub_800B524(gLinkPlayers + r4);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ r5 = (struct UnkRfuStruct_8010A14 *)gBlockSendBuffer;
+ memcpy(r5->unk_00, gUnknown_082ED7EC, sizeof gUnknown_082ED7EC);
+ r5->unk_0f = gUnknown_03005000.playerCount;
+ for (i = 0; i < 4; i++)
+ r5->unk_10[i] = gUnknown_03005000.unk_cde[i];
+ memcpy(r5->unk_14, gLinkPlayers, sizeof gLinkPlayers);
+ gTasks[taskId].data[0]++;
+ // fallthrough
+ case 4:
+ r5 = (struct UnkRfuStruct_8010A14 *)gBlockSendBuffer;
+ r5->unk_0f = gUnknown_03005000.playerCount;
+ for (i = 0; i < 4; i++)
+ r5->unk_10[i] = gUnknown_03005000.unk_cde[i];
+ memcpy(r5->unk_14, gLinkPlayers, sizeof gLinkPlayers);
+ if (SendBlock(0, gBlockSendBuffer, 0xa0))
+ gTasks[taskId].data[0]++;
+ break;
+ case 5:
+ if (sub_800A520() && GetBlockReceivedStatus() & 1)
+ {
+ CpuFill16(0, gBlockRecvBuffer, sizeof(struct UnkRfuStruct_8010A14));
+ ResetBlockReceivedFlag(0);
+ gUnknown_03005000.unk_ce8 = 0;
+ if (gUnknown_03005000.unk_ce6)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if ((gUnknown_03005000.unk_ce6 >> i) & 1)
+ {
+ gUnknown_03005000.unk_ce5 = 1 << i;
+ gUnknown_03005000.unk_ce6 ^= (1 << i);
+ gUnknown_03005000.unk_ce8 = 1;
+ break;
+ }
+ }
+ }
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_8010D0C(u8 taskId)
+{
+ if (gUnknown_03005000.unk_f1 == 1 || gUnknown_03005000.unk_f1 == 2)
+ DestroyTask(taskId);
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gUnknown_03005000.playerCount)
+ {
+ sub_800B348();
+ SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock));
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (sub_800A520())
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (GetBlockReceivedStatus() & 1)
+ {
+ sub_8010A14((const struct UnkRfuStruct_8010A14 *)gBlockRecvBuffer);
+ ResetBlockReceivedFlag(0);
+ gReceivedRemoteLinkPlayers = 1;
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_8010DB4(void)
+{
+ if (gUnknown_03005000.unk_ee == 1 && gUnknown_03004140.unk_02 == 0)
+ {
+ if (gMain.callback2 == sub_8018438 || gUnknown_03004140.unk_3c->unk_04)
+ gWirelessCommType = 2;
+ SetMainCallback2(CB2_LinkError);
+ gMain.savedCallback = CB2_LinkError;
+ sub_800AF18((gUnknown_03005000.unk_0a << 16) | (gUnknown_03005000.unk_10 << 8) | gUnknown_03005000.unk_12, gUnknown_03005000.unk_124.unk_8c2, gUnknown_03005000.unk_9e8.unk_232, sub_8011A74() == 2);
+ gUnknown_03005000.unk_ee = 2;
+ CloseLink();
+ }
+ else if (gUnknown_03005000.unk_9e8.unk_233 == 1 || gUnknown_03005000.unk_124.unk_8c3 == 1)
+ {
+ if (gUnknown_03004140.unk_02)
+ sub_800D630();
+ sub_8011A64(1, 0x7000);
+ sub_8011170(0x7000);
+ }
+}
+
+void rfu_REQ_recvData_then_sendData(void)
+{
+ if (gUnknown_03004140.unk_06 == 1)
+ {
+ rfu_REQ_recvData();
+ rfu_waitREQComplete();
+ rfu_REQ_sendData_wrapper(0);
+ }
+}
+
+bool32 sub_8010EC0(void)
+{
+ bool32 retval = FALSE;
+ gUnknown_03005000.unk_ccd = 0;
+ sub_800C54C(Random2());
+ if (gUnknown_03005000.unk_ef == 0)
+ {
+ switch (gUnknown_03005000.unk_0c)
+ {
+ case 1:
+ sub_800F0F8();
+ break;
+ case 0:
+ retval = sub_800F4F0();
+ break;
+ case 2:
+ rfu_REQ_recvData_then_sendData();
+ break;
+ }
+ }
+ return retval;
+}
+
+bool32 sub_8010F1C(void)
+{
+ bool32 retval = FALSE;
+ if (gUnknown_03005000.unk_ef == 0)
+ {
+ if (gUnknown_03005000.unk_0c == 1)
+ retval = sub_800F1E0();
+ sub_8010DB4();
+ }
+ return retval;
+}
+
+void sub_8010F48(void)
+{
+ StringCopy(gUnknown_02022B22, gSaveBlock2Ptr->playerName);
+}
+
+void sub_8010F60(void)
+{
+ gUnknown_02022B14 = (struct UnkLinkRfuStruct_02022B14){};
+ sub_800DD94(&gUnknown_02022B14, 0, 0, 0);
+}
+
+void sub_8010F84(u8 a0, u32 a1, u32 a2)
+{
+ sub_800DD94(&gUnknown_02022B14, a0, a2, a1);
+}
+
+void sub_8010FA0(bool32 a0, bool32 a1)
+{
+ gUnknown_02022B14.unk_00.unk_00_4 = a0;
+ gUnknown_02022B14.unk_00.unk_00_5 = a1;
+}
+
+void sub_8010FCC(u32 a0, u32 a1, u32 a2)
+{
+ gUnknown_02022B14.type = a0;
+ gUnknown_02022B14.species = a1;
+ gUnknown_02022B14.unk_0b_1 = a2;
+}
+
+u8 sub_801100C(int a0)
+{
+ u8 retval = 0x80;
+ retval |= (gLinkPlayers[a0].gender << 3);
+ retval |= (gLinkPlayers[a0].trainerId & 7);
+ return retval;
+}
+
+void sub_801103C(void)
+{
+ struct UnkLinkRfuStruct_02022B14 *r5 = &gUnknown_02022B14;
+ int i;
+
+ for (i = 1; i < GetLinkPlayerCount(); i++)
+ r5->unk_04[i - 1] = sub_801100C(i);
+}
+
+void sub_8011068(u8 a0)
+{
+ gUnknown_02022B14.unk_0a_7 = a0;
+ rfu_REQ_configGameData(0, 2, &gUnknown_02022B14, gUnknown_02022B22);
+}
+
+void sub_8011090(u8 a0, u32 a1, u32 a2)
+{
+ if (a0)
+ sub_8010F84(a0, a1, a2);
+ rfu_REQ_configGameData(0, 2, &gUnknown_02022B14, gUnknown_02022B22);
+}
+
+void sub_80110B8(u32 a0)
+{
+ int i;
+ u32 r5;
+ u32 r7;
+ int r8;
+
+ if (sub_800F7DC()->unk_0a_0 == 0x45)
+ {
+ r5 = 0;
+ r7 = 0;
+ r8 = gUnknown_03005000.unk_ce2 ^ gUnknown_03005000.unk_ce3;
+ for (i = 0; i < 4; i++)
+ {
+ if ((r8 >> i) & 1)
+ {
+ r7 |= ((0x80 | ((gLinkPlayers[gUnknown_03005000.unk_cde[i]].gender & 1) << 3) | (gLinkPlayers[gUnknown_03005000.unk_cde[i]].trainerId & 7)) << (r5 << 3));
+ r5++;
+ if (r5 == a0 - 1)
+ break;
+ }
+ }
+ sub_8011090(0x45, r7, 0);
+ }
+}
+
+void sub_8011170(u32 a0)
+{
+ if (gUnknown_03005000.unk_ee == 0)
+ {
+ gUnknown_03005000.unk_10 = gUnknown_03004140.unk_14;
+ gUnknown_03005000.unk_12 = gUnknown_03004140.unk_16;
+ gUnknown_03005000.unk_0a = a0;
+ gUnknown_03005000.unk_ee = 1;
+ }
+}
+
+void sub_80111A0(void)
+{
+ gUnknown_03005000.unk_ee = 0;
+}
+
+void sub_80111B0(bool32 a0)
+{
+ if (!a0)
+ gUnknown_03005000.unk_ee = 0;
+ else
+ gUnknown_03005000.unk_ee = 4;
+}
+
+void sub_80111DC(void)
+{
+ sub_8011E94(gUnknown_03004140.unk_00, 1);
+ gUnknown_03005000.unk_00 = NULL;
+}
+
+void sub_80111FC(void)
+{
+ gUnknown_03005000.unk_00 = sub_80111DC;
+}
+
+#ifdef NONMATCHING
+void sub_801120C(u8 a0)
+{
+ u8 i;
+ u8 r6 = 0;
+ struct RfuUnk5Sub *unk5Sub;
+ switch (a0)
+ {
+ case 0x00:
+ gUnknown_03005000.unk_04 = 2;
+ break;
+ case 0x10:
+ break;
+ case 0x11:
+ sub_80115EC(gUnknown_03004140.unk_14);
+ for (i = 0; i < 4; i++)
+ {
+ if ((gUnknown_03004140.unk_14 >> i) & 1)
+ {
+ unk5Sub = &gUnknown_03007890->unk_14[i];
+ if (unk5Sub->unk_06.unk_0a_0 == sub_800F7DC()->unk_0a_0)
+ {
+ gUnknown_03005000.unk_cd1[i] = 0;
+ gUnknown_03005000.unk_cd5[i] = 0;
+ rfu_setRecvBuffer(0x20, i, gUnknown_03005000.unk_cd5 + i, 1);
+ }
+ else
+ {
+ r6 |= (1 << i);
+ }
+ }
+ }
+ if (r6)
+ {
+ rfu_REQ_disconnect(r6);
+ rfu_waitREQComplete();
+ }
+ break;
+ case 0x12:
+ break;
+ case 0x13:
+ break;
+ case 0x14:
+ if (gUnknown_03005000.unk_ce7 != gUnknown_03004140.unk_00)
+ {
+ rfu_REQ_disconnect(gUnknown_03005000.unk_ce7 ^ gUnknown_03004140.unk_00);
+ rfu_waitREQComplete();
+ }
+ gUnknown_03005000.unk_04 = 0x11;
+ break;
+ case 0x31:
+ gUnknown_03005000.unk_f0 = 1;
+ break;
+ case 0x32:
+ gUnknown_03005000.unk_f0 = 3;
+ break;
+ case 0x30:
+ case 0x33:
+ gUnknown_03005000.unk_f0 = 4;
+ gUnknown_03005000.unk_ce2 &= ~gUnknown_03004140.unk_14;
+ if (gReceivedRemoteLinkPlayers == 1)
+ {
+ if (gUnknown_03005000.unk_ce2 == 0)
+ sub_8011170(a0);
+ else
+ sub_80111FC();
+ }
+ sub_8011A64(2, a0);
+ break;
+ case 0x42 ... 0x44:
+ break;
+ case 0xf3:
+ sub_8011A64(1, a0);
+ sub_8011170(a0);
+ gUnknown_03005000.unk_ef = 1;
+ break;
+ case 0xf0 ... 0xf2:
+ case 0xff:
+ sub_8011170(a0);
+ sub_8011A64(1, a0);
+ gUnknown_03005000.unk_cdb = 1;
+ break;
+ }
+}
+#else
+NAKED void sub_801120C(u8 a0)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tmovs r6, 0\n"
+ "\tcmp r4, 0x32\n"
+ "\tbne _08011222\n"
+ "\tb _08011360_case_32\n"
+ "_08011222:\n"
+ "\tcmp r4, 0x32\n"
+ "\tbgt _08011252\n"
+ "\tcmp r4, 0x13\n"
+ "\tbgt _08011240\n"
+ "\tcmp r4, 0x12\n"
+ "\tblt _08011230\n"
+ "\tb _080113EE_break\n"
+ "_08011230:\n"
+ "\tcmp r4, 0x10\n"
+ "\tbne _08011236\n"
+ "\tb _080113EE_break\n"
+ "_08011236:\n"
+ "\tcmp r4, 0x10\n"
+ "\tbgt _0801128C_case_11\n"
+ "\tcmp r4, 0\n"
+ "\tbeq _0801127E_case_00\n"
+ "\tb _080113EE_break\n"
+ "_08011240:\n"
+ "\tcmp r4, 0x30\n"
+ "\tbne _08011246\n"
+ "\tb _0801136C_case_30_case_33\n"
+ "_08011246:\n"
+ "\tcmp r4, 0x30\n"
+ "\tble _0801124C\n"
+ "\tb _08011354_case_31\n"
+ "_0801124C:\n"
+ "\tcmp r4, 0x14\n"
+ "\tbeq _08011328_case_14\n"
+ "\tb _080113EE_break\n"
+ "_08011252:\n"
+ "\tcmp r4, 0x44\n"
+ "\tbgt _08011264\n"
+ "\tcmp r4, 0x42\n"
+ "\tblt _0801125C\n"
+ "\tb _080113EE_break\n"
+ "_0801125C:\n"
+ "\tcmp r4, 0x33\n"
+ "\tbne _08011262\n"
+ "\tb _0801136C_case_30_case_33\n"
+ "_08011262:\n"
+ "\tb _080113EE_break\n"
+ "_08011264:\n"
+ "\tcmp r4, 0xF3\n"
+ "\tbne _0801126A\n"
+ "\tb _080113BA_case_f3\n"
+ "_0801126A:\n"
+ "\tcmp r4, 0xF3\n"
+ "\tbgt _08011276\n"
+ "\tcmp r4, 0xF0\n"
+ "\tbge _08011274\n"
+ "\tb _080113EE_break\n"
+ "_08011274:\n"
+ "\tb _080113D4_case_f0_f1_f2_ff\n"
+ "_08011276:\n"
+ "\tcmp r4, 0xFF\n"
+ "\tbne _0801127C\n"
+ "\tb _080113D4_case_f0_f1_f2_ff\n"
+ "_0801127C:\n"
+ "\tb _080113EE_break\n"
+ "_0801127E_case_00:\n"
+ "\tldr r1, =gUnknown_03005000\n"
+ "\tmovs r0, 0x2\n"
+ "\tstrh r0, [r1, 0x4]\n"
+ "\tb _080113EE_break\n"
+ "\t.pool\n"
+ "_0801128C_case_11:\n"
+ "\tldr r0, =gUnknown_03004140\n"
+ "\tldrh r0, [r0, 0x14]\n"
+ "\tbl sub_80115EC\n"
+ "\tmovs r5, 0\n"
+ "\tmovs r0, 0x1\n"
+ "\tmov r8, r0\n"
+ "\tldr r1, =gUnknown_03005000\n"
+ "\tmov r9, r1\n"
+ "\tldr r3, =0x00000cd5\n"
+ "\tadd r3, r9\n"
+ "\tmov r10, r3\n"
+ "\tmovs r7, 0x7F\n"
+ "_080112A6:\n"
+ "\tldr r0, =gUnknown_03004140\n"
+ "\tldrh r0, [r0, 0x14]\n"
+ "\tasrs r0, r5\n"
+ "\tmov r1, r8\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0801130E\n"
+ "\tldr r0, =gUnknown_03007890\n"
+ "\tlsls r1, r5, 5\n"
+ "\tadds r1, 0x14\n"
+ "\tldr r0, [r0]\n"
+ "\tadds r0, r1\n"
+ "\tldrb r0, [r0, 0x10]\n"
+ "\tadds r4, r7, 0\n"
+ "\tands r4, r0\n"
+ "\tbl sub_800F7DC\n"
+ "\tldrb r1, [r0, 0xA]\n"
+ "\tadds r0, r7, 0\n"
+ "\tands r0, r1\n"
+ "\tcmp r4, r0\n"
+ "\tbne _08011304\n"
+ "\tldr r0, =0x00000cd1\n"
+ "\tadd r0, r9\n"
+ "\tadds r0, r5, r0\n"
+ "\tmovs r1, 0\n"
+ "\tstrb r1, [r0]\n"
+ "\tmov r3, r10\n"
+ "\tadds r2, r5, r3\n"
+ "\tstrb r1, [r2]\n"
+ "\tmovs r0, 0x20\n"
+ "\tadds r1, r5, 0\n"
+ "\tmovs r3, 0x1\n"
+ "\tbl rfu_setRecvBuffer\n"
+ "\tb _0801130E\n"
+ "\t.pool\n"
+ "_08011304:\n"
+ "\tmov r0, r8\n"
+ "\tlsls r0, r5\n"
+ "\torrs r6, r0\n"
+ "\tlsls r0, r6, 24\n"
+ "\tlsrs r6, r0, 24\n"
+ "_0801130E:\n"
+ "\tadds r0, r5, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tcmp r5, 0x3\n"
+ "\tbls _080112A6\n"
+ "\tcmp r6, 0\n"
+ "\tbeq _080113EE_break\n"
+ "\tadds r0, r6, 0\n"
+ "\tbl rfu_REQ_disconnect\n"
+ "\tbl rfu_waitREQComplete\n"
+ "\tb _080113EE_break\n"
+ "_08011328_case_14:\n"
+ "\tldr r4, =gUnknown_03005000\n"
+ "\tldr r1, =0x00000ce7\n"
+ "\tadds r0, r4, r1\n"
+ "\tldr r1, =gUnknown_03004140\n"
+ "\tldrb r2, [r0]\n"
+ "\tldrb r0, [r1]\n"
+ "\tcmp r2, r0\n"
+ "\tbeq _08011342\n"
+ "\teors r0, r2\n"
+ "\tbl rfu_REQ_disconnect\n"
+ "\tbl rfu_waitREQComplete\n"
+ "_08011342:\n"
+ "\tmovs r0, 0x11\n"
+ "\tstrh r0, [r4, 0x4]\n"
+ "\tb _080113EE_break\n"
+ "\t.pool\n"
+ "_08011354_case_31:\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tadds r0, 0xF0\n"
+ "\tb _080113EA\n"
+ "\t.pool\n"
+ "_08011360_case_32:\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tadds r0, 0xF0\n"
+ "\tmovs r1, 0x3\n"
+ "\tb _080113EC\n"
+ "\t.pool\n"
+ "_0801136C_case_30_case_33:\n"
+ "\tldr r1, =gUnknown_03005000\n"
+ "\tadds r2, r1, 0\n"
+ "\tadds r2, 0xF0\n"
+ "\tmovs r0, 0x4\n"
+ "\tstrb r0, [r2]\n"
+ "\tldr r3, =0x00000ce2\n"
+ "\tadds r1, r3\n"
+ "\tldr r0, =gUnknown_03004140\n"
+ "\tldrb r2, [r0, 0x14]\n"
+ "\tldrb r0, [r1]\n"
+ "\tadds r3, r0, 0\n"
+ "\tbics r3, r2\n"
+ "\tadds r2, r3, 0\n"
+ "\tstrb r2, [r1]\n"
+ "\tldr r0, =gReceivedRemoteLinkPlayers\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080113B0\n"
+ "\tcmp r2, 0\n"
+ "\tbne _080113AC\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_8011170\n"
+ "\tb _080113B0\n"
+ "\t.pool\n"
+ "_080113AC:\n"
+ "\tbl sub_80111FC\n"
+ "_080113B0:\n"
+ "\tmovs r0, 0x2\n"
+ "\tadds r1, r4, 0\n"
+ "\tbl sub_8011A64\n"
+ "\tb _080113EE_break\n"
+ "_080113BA_case_f3:\n"
+ "\tmovs r0, 0x1\n"
+ "\tmovs r1, 0xF3\n"
+ "\tbl sub_8011A64\n"
+ "\tmovs r0, 0xF3\n"
+ "\tbl sub_8011170\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tadds r0, 0xEF\n"
+ "\tb _080113EA\n"
+ "\t.pool\n"
+ "_080113D4_case_f0_f1_f2_ff:\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_8011170\n"
+ "\tmovs r0, 0x1\n"
+ "\tadds r1, r4, 0\n"
+ "\tbl sub_8011A64\n"
+ "\tldr r0, =gUnknown_03005000\n"
+ "\tldr r1, =0x00000cdb\n"
+ "\tadds r0, r1\n"
+ "\tldrb r1, [r0]\n"
+ "_080113EA:\n"
+ "\tmovs r1, 0x1\n"
+ "_080113EC:\n"
+ "\tstrb r1, [r0]\n"
+ "_080113EE_break:\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif
diff --git a/src/list_menu.c b/src/list_menu.c
new file mode 100644
index 000000000..6b5c3af94
--- /dev/null
+++ b/src/list_menu.c
@@ -0,0 +1,1462 @@
+#include "global.h"
+#include "menu.h"
+#include "list_menu.h"
+#include "window.h"
+#include "text_window.h"
+#include "main.h"
+#include "task.h"
+#include "trig.h"
+#include "decompress.h"
+#include "palette.h"
+#include "malloc.h"
+#include "strings.h"
+#include "sound.h"
+#include "constants/songs.h"
+
+struct UnkIndicatorsStruct
+{
+ u8 field_0;
+ u16 *field_4;
+ u16 field_8;
+ u16 field_A;
+ u16 field_C;
+ u16 field_E;
+ u8 field_10;
+ u8 field_11;
+ u8 field_12;
+ u8 field_13;
+ u8 field_14_0:4;
+ u8 field_14_1:4;
+ u8 field_15_0:4;
+ u8 field_15_1:4;
+ u8 field_16_0:3;
+ u8 field_16_1:3;
+ u8 field_16_2:2;
+ u8 field_17_0:6;
+ u8 field_17_1:2;
+};
+
+struct ScrollIndicatorPair
+{
+ u8 field_0;
+ u16 *scrollOffset;
+ u16 fullyUpThreshold;
+ u16 fullyDownThreshold;
+ u8 topSpriteId;
+ u8 bottomSpriteId;
+ u16 tileTag;
+ u16 palTag;
+};
+
+struct RedOutlineCursor
+{
+ struct SubspriteTable subspriteTable;
+ struct Subsprite *subspritesPtr; // not a const pointer
+ u8 spriteId;
+ u16 tileTag;
+ u16 palTag;
+};
+
+struct RedArrowCursor
+{
+ u8 spriteId;
+ u16 tileTag;
+ u16 palTag;
+};
+
+// this file's functions
+static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow);
+static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown);
+static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count);
+static void ListMenuDrawCursor(struct ListMenu *list);
+static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit);
+static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind);
+static void Task_ScrollIndicatorArrowPair(u8 taskId);
+static u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor);
+static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor);
+static void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y);
+static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y);
+static void ListMenuRemoveRedOutlineCursorObject(u8 taskId);
+static void ListMenuRemoveRedArrowCursorObject(u8 taskId);
+static u8 ListMenuAddCursorObjectInternal(struct CursorStruct *cursor, u32 cursorKind);
+static void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind);
+static void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind);
+static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite);
+static void SpriteCallback_RedArrowCursor(struct Sprite *sprite);
+
+// EWRAM vars
+static EWRAM_DATA struct {
+ s32 currItemId;
+ u8 state;
+ u8 windowId;
+ u8 listTaskId;
+} sMysteryGiftLinkMenu = {0};
+
+EWRAM_DATA struct ScrollArrowsTemplate gTempScrollArrowTemplate = {0};
+
+// IWRAM common
+struct {
+ u8 cursorPal:4;
+ u8 fillValue:4;
+ u8 cursorShadowPal:4;
+ u8 lettersSpacing:6;
+ u8 field_2_2:6; // unused
+ u8 fontId:7;
+ bool8 enabled:1;
+} gListMenuOverride;
+
+struct ListMenuTemplate gMultiuseListMenuTemplate;
+
+// const rom data
+static const struct
+{
+ u8 animNum:4;
+ u8 bounceDir:4;
+ u8 multiplier;
+ u16 frequency;
+} sScrollIndicatorTemplates[] =
+{
+ {0, 0, 2, 8},
+ {1, 0, 2, -8},
+ {2, 1, 2, 8},
+ {3, 1, 2, -8},
+};
+
+static const struct OamData sOamData_ScrollArrowIndicator =
+{
+ .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
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator0[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator1[] =
+{
+ ANIMCMD_FRAME(0, 30, 1, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator2[] =
+{
+ ANIMCMD_FRAME(4, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_ScrollArrowIndicator3[] =
+{
+ ANIMCMD_FRAME(4, 30, 0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_ScrollArrowIndicator[] =
+{
+ sSpriteAnim_ScrollArrowIndicator0,
+ sSpriteAnim_ScrollArrowIndicator1,
+ sSpriteAnim_ScrollArrowIndicator2,
+ sSpriteAnim_ScrollArrowIndicator3
+};
+
+static const struct SpriteTemplate sSpriteTemplate_ScrollArrowIndicator =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_ScrollArrowIndicator,
+ .anims = sSpriteAnimTable_ScrollArrowIndicator,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_ScrollIndicatorArrow,
+};
+
+static const struct Subsprite sSubsprite_RedOutline1 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 0,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline2 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 1,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline3 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 2,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline4 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 3,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline5 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 4,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline6 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 5,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline7 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 6,
+ .priority = 0,
+};
+
+static const struct Subsprite sSubsprite_RedOutline8 =
+{
+ .x = 0,
+ .y = 0,
+ .shape = 0,
+ .size = 0,
+ .tileOffset = 7,
+ .priority = 0,
+};
+
+static const struct OamData sOamData_RedArrowCursor =
+{
+ .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
+};
+
+static const union AnimCmd sSpriteAnim_RedArrowCursor[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_RedArrowCursor[] =
+{
+ sSpriteAnim_RedArrowCursor
+};
+
+static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_RedArrowCursor,
+ .anims = sSpriteAnimTable_RedArrowCursor,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_RedArrowCursor,
+};
+
+static const u16 sRedArrowPal[] = INCBIN_U16("graphics/interface/red_arrow.gbapal");
+static const u8 sRedArrowOtherGfx[] = INCBIN_U8("graphics/interface/red_arrow_other.4bpp.lz");
+static const u8 sSelectorOutlineGfx[] = INCBIN_U8("graphics/interface/selector_outline.4bpp.lz");
+static const u8 sRedArrowGfx[] = INCBIN_U8("graphics/interface/red_arrow.4bpp.lz");
+
+// code
+static void ListMenuDummyTask(u8 taskId)
+{
+
+}
+
+s32 DoMysteryGiftListMenu(struct WindowTemplate *windowTemplate, struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum)
+{
+ switch (sMysteryGiftLinkMenu.state)
+ {
+ case 0:
+ default:
+ sMysteryGiftLinkMenu.windowId = AddWindow(windowTemplate);
+ switch (arg2)
+ {
+ case 2:
+ LoadUserWindowBorderGfx(sMysteryGiftLinkMenu.windowId, tileNum, palNum);
+ case 1:
+ sub_8098858(sMysteryGiftLinkMenu.windowId, tileNum, palNum / 16);
+ break;
+ }
+ gMultiuseListMenuTemplate = *listMenuTemplate;
+ gMultiuseListMenuTemplate.windowId = sMysteryGiftLinkMenu.windowId;
+ sMysteryGiftLinkMenu.listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+ CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1);
+ sMysteryGiftLinkMenu.state = 1;
+ break;
+ case 1:
+ sMysteryGiftLinkMenu.currItemId = ListMenuHandleInputGetItemId(sMysteryGiftLinkMenu.listTaskId);
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sMysteryGiftLinkMenu.state = 2;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ sMysteryGiftLinkMenu.currItemId = LIST_B_PRESSED;
+ sMysteryGiftLinkMenu.state = 2;
+ }
+ if (sMysteryGiftLinkMenu.state == 2)
+ {
+ if (arg2 == 0)
+ {
+ ClearWindowTilemap(sMysteryGiftLinkMenu.windowId);
+ }
+ else
+ {
+ switch (arg2)
+ {
+ case 0: // can never be reached, because of the if statement above
+ sub_819746C(sMysteryGiftLinkMenu.windowId, FALSE);
+ break;
+ case 2:
+ case 1:
+ sub_819746C(sMysteryGiftLinkMenu.windowId, FALSE);
+ break;
+ }
+ }
+
+ CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1);
+ }
+ break;
+ case 2:
+ DestroyListMenuTask(sMysteryGiftLinkMenu.listTaskId, NULL, NULL);
+ RemoveWindow(sMysteryGiftLinkMenu.windowId);
+ sMysteryGiftLinkMenu.state = 0;
+ return sMysteryGiftLinkMenu.currItemId;
+ }
+
+ return LIST_NOTHING_CHOSEN;
+}
+
+u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow)
+{
+ u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow);
+ PutWindowTilemap(listMenuTemplate->windowId);
+ CopyWindowToVram(listMenuTemplate->windowId, 2);
+
+ return taskId;
+}
+
+// unused
+u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *rect, u16 scrollOffset, u16 selectedRow)
+{
+ s32 i;
+
+ u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow);
+ for (i = 0; rect[i].palNum != 0xFF; i++)
+ {
+ PutWindowRectTilemapOverridePalette(listMenuTemplate->windowId,
+ rect[i].x,
+ rect[i].y,
+ rect[i].width,
+ rect[i].height,
+ rect[i].palNum);
+ }
+ CopyWindowToVram(listMenuTemplate->windowId, 2);
+
+ return taskId;
+}
+
+s32 ListMenuHandleInputGetItemId(u8 listTaskId)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ return list->template.items[list->scrollOffset + list->selectedRow].id;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return LIST_B_PRESSED;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ ListMenuChangeSelection(list, TRUE, 1, FALSE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ ListMenuChangeSelection(list, TRUE, 1, TRUE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else // try to move by one window scroll
+ {
+ bool16 rightButton, leftButton;
+ switch (list->template.scrollMultiple)
+ {
+ case LIST_NO_MULTIPLE_SCROLL:
+ default:
+ leftButton = FALSE;
+ rightButton = FALSE;
+ break;
+ case LIST_MULTIPLE_SCROLL_DPAD:
+ leftButton = gMain.newAndRepeatedKeys & DPAD_LEFT;
+ rightButton = gMain.newAndRepeatedKeys & DPAD_RIGHT;
+ break;
+ case LIST_MULTIPLE_SCROLL_L_R:
+ leftButton = gMain.newAndRepeatedKeys & L_BUTTON;
+ rightButton = gMain.newAndRepeatedKeys & R_BUTTON;
+ break;
+ }
+
+ if (leftButton)
+ {
+ ListMenuChangeSelection(list, TRUE, list->template.maxShowed, FALSE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else if (rightButton)
+ {
+ ListMenuChangeSelection(list, TRUE, list->template.maxShowed, TRUE);
+ return LIST_NOTHING_CHOSEN;
+ }
+ else
+ {
+ return LIST_NOTHING_CHOSEN;
+ }
+ }
+}
+
+#define TASK_NONE 0xFF
+
+void DestroyListMenuTask(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ if (scrollOffset != NULL)
+ *scrollOffset = list->scrollOffset;
+ if (selectedRow != NULL)
+ *selectedRow = list->selectedRow;
+
+ if (list->taskId != TASK_NONE)
+ ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2);
+
+ DestroyTask(listTaskId);
+}
+
+void RedrawListMenu(u8 listTaskId)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ FillWindowPixelBuffer(list->template.windowId, (list->template.fillValue << 4) | (list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
+ ListMenuDrawCursor(list);
+ CopyWindowToVram(list->template.windowId, 2);
+}
+
+// unused
+void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillValue, u8 cursorShadowPal)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ list->template.cursorPal = cursorPal;
+ list->template.fillValue = fillValue;
+ list->template.cursorShadowPal = cursorShadowPal;
+}
+
+// unused
+void ChangeListMenuCoords(u8 listTaskId, u8 x, u8 y)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT, x);
+ SetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP, y);
+}
+
+// unused
+s32 ListMenuTestInput(struct ListMenuTemplate *template, u32 scrollOffset, u32 selectedRow, u16 keys, u16 *newScrollOffset, u16 *newSelectedRow)
+{
+ struct ListMenu list;
+
+ list.template = *template;
+ list.scrollOffset = scrollOffset;
+ list.selectedRow = selectedRow;
+ list.unk_1C = 0;
+ list.unk_1D = 0;
+
+ if (keys == DPAD_UP)
+ ListMenuChangeSelection(&list, FALSE, 1, FALSE);
+ if (keys == DPAD_DOWN)
+ ListMenuChangeSelection(&list, FALSE, 1, TRUE);
+
+ if (newScrollOffset != NULL)
+ *newScrollOffset = list.scrollOffset;
+ if (newSelectedRow != NULL)
+ *newSelectedRow = list.selectedRow;
+
+ return LIST_NOTHING_CHOSEN;
+}
+
+void ListMenuGetCurrentItemArrayId(u8 listTaskId, u16 *arrayId)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ if (arrayId != NULL)
+ *arrayId = list->scrollOffset + list->selectedRow;
+}
+
+void ListMenuGetScrollAndRow(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ if (scrollOffset != NULL)
+ *scrollOffset = list->scrollOffset;
+ if (selectedRow != NULL)
+ *selectedRow = list->selectedRow;
+}
+
+u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId)
+{
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+
+ return list->selectedRow * yMultiplier + list->template.upText_Y;
+}
+
+static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow)
+{
+ u8 listTaskId = CreateTask(ListMenuDummyTask, 0);
+ struct ListMenu *list = (void*) gTasks[listTaskId].data;
+
+ list->template = *listMenuTemplate;
+ list->scrollOffset = scrollOffset;
+ list->selectedRow = selectedRow;
+ list->unk_1C = 0;
+ list->unk_1D = 0;
+ list->taskId = TASK_NONE;
+ list->unk_1F = 0;
+
+ gListMenuOverride.cursorPal = list->template.cursorPal;
+ gListMenuOverride.fillValue = list->template.fillValue;
+ gListMenuOverride.cursorShadowPal = list->template.cursorShadowPal;
+ gListMenuOverride.lettersSpacing = list->template.lettersSpacing;
+ gListMenuOverride.fontId = list->template.fontId;
+ gListMenuOverride.enabled = FALSE;
+
+ if (list->template.totalItems < list->template.maxShowed)
+ list->template.maxShowed = list->template.totalItems;
+
+ FillWindowPixelBuffer(list->template.windowId, (list->template.fillValue << 4) | (list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
+ ListMenuDrawCursor(list);
+ ListMenuCallSelectionChangedCallback(list, TRUE);
+
+ return listTaskId;
+}
+
+static void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y)
+{
+ u8 colors[3];
+ if (gListMenuOverride.enabled)
+ {
+ colors[0] = gListMenuOverride.fillValue;
+ colors[1] = gListMenuOverride.cursorPal;
+ colors[2] = gListMenuOverride.cursorShadowPal;
+ AddTextPrinterParameterized2(list->template.windowId,
+ gListMenuOverride.fontId,
+ x, y,
+ gListMenuOverride.lettersSpacing,
+ 0, colors, TEXT_SPEED_FF, str);
+
+ gListMenuOverride.enabled = FALSE;
+ }
+ else
+ {
+ colors[0] = list->template.fillValue;
+ colors[1] = list->template.cursorPal;
+ colors[2] = list->template.cursorShadowPal;
+ AddTextPrinterParameterized2(list->template.windowId,
+ list->template.fontId,
+ x, y,
+ list->template.lettersSpacing,
+ 0, colors, TEXT_SPEED_FF, str);
+ }
+}
+
+static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count)
+{
+ s32 i;
+ u8 x, y;
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+
+ for (i = 0; i < count; i++)
+ {
+ if (list->template.items[startIndex].id != LIST_HEADER)
+ x = list->template.item_X;
+ else
+ x = list->template.header_X;
+
+ y = (yOffset + i) * yMultiplier + list->template.upText_Y;
+ if (list->template.itemPrintFunc != NULL)
+ list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].id, y);
+
+ ListMenuPrint(list, list->template.items[startIndex].name, x, y);
+ startIndex++;
+ }
+}
+
+static void ListMenuDrawCursor(struct ListMenu *list)
+{
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+ u8 x = list->template.cursor_X;
+ u8 y = list->selectedRow * yMultiplier + list->template.upText_Y;
+ switch (list->template.cursorKind)
+ {
+ case 0:
+ ListMenuPrint(list, gText_SelectorArrow2, x, y);
+ break;
+ case 1:
+ break;
+ case 2:
+ if (list->taskId == TASK_NONE)
+ list->taskId = ListMenuAddCursorObject(list, 0);
+ ListMenuUpdateCursorObject(list->taskId,
+ GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1,
+ GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0);
+ break;
+ case 3:
+ if (list->taskId == TASK_NONE)
+ list->taskId = ListMenuAddCursorObject(list, 1);
+ ListMenuUpdateCursorObject(list->taskId,
+ GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x,
+ GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1);
+ break;
+ }
+}
+
+#undef TASK_NONE
+
+static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind)
+{
+ struct CursorStruct cursor;
+
+ cursor.left = 0;
+ cursor.top = 160;
+ cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2;
+ cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2;
+ cursor.tileTag = 0x4000;
+ cursor.palTag = SPRITE_INVALID_TAG;
+ cursor.palNum = 15;
+
+ return ListMenuAddCursorObjectInternal(&cursor, cursorKind);
+}
+
+static void ListMenuErasePrintedCursor(struct ListMenu *list, u16 selectedRow)
+{
+ u8 cursorKind = list->template.cursorKind;
+ if (cursorKind == 0)
+ {
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+ u8 width = GetMenuCursorDimensionByFont(list->template.fontId, 0);
+ u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1);
+ FillWindowPixelRect(list->template.windowId,
+ (list->template.fillValue << 4) | (list->template.fillValue),
+ list->template.cursor_X,
+ selectedRow * yMultiplier + list->template.upText_Y,
+ width,
+ height);
+ }
+}
+
+static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, bool8 movingDown)
+{
+ u16 selectedRow = list->selectedRow;
+ u16 scrollOffset = list->scrollOffset;
+ u16 newRow;
+ u32 newScroll;
+
+ if (!movingDown)
+ {
+ if (list->template.maxShowed == 1)
+ newRow = 0;
+ else
+ newRow = list->template.maxShowed - ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)) - 1;
+
+ if (scrollOffset == 0)
+ {
+ while (selectedRow != 0)
+ {
+ selectedRow--;
+ if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+ else
+ {
+ while (selectedRow > newRow)
+ {
+ selectedRow--;
+ if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+
+ newScroll = scrollOffset - 1;
+ }
+ }
+ else
+ {
+ if (list->template.maxShowed == 1)
+ newRow = 0;
+ else
+ newRow = ((list->template.maxShowed / 2) + (list->template.maxShowed % 2));
+
+ if (scrollOffset == list->template.totalItems - list->template.maxShowed)
+ {
+ while (selectedRow < list->template.maxShowed - 1)
+ {
+ selectedRow++;
+ if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+ else
+ {
+ while (selectedRow < newRow)
+ {
+ selectedRow++;
+ if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER)
+ {
+ list->selectedRow = selectedRow;
+ return 1;
+ }
+ }
+
+ newScroll = scrollOffset + 1;
+ }
+ }
+
+ list->selectedRow = newRow;
+ list->scrollOffset = newScroll;
+ return 2;
+}
+
+static void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown)
+{
+ if (count >= list->template.maxShowed)
+ {
+ FillWindowPixelBuffer(list->template.windowId, (list->template.fillValue << 4) | (list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed);
+ }
+ else
+ {
+ u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding;
+
+ if (!movingDown)
+ {
+ u16 y, width, height;
+
+ ScrollWindow(list->template.windowId, 1, count * yMultiplier, (list->template.fillValue << 4) | (list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset, 0, count);
+
+ y = (list->template.maxShowed * yMultiplier) + list->template.upText_Y;
+ width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;
+ height = (GetWindowAttribute(list->template.windowId, WINDOW_HEIGHT) * 8) - y;
+ FillWindowPixelRect(list->template.windowId,
+ (list->template.fillValue << 4) | (list->template.fillValue),
+ 0, y, width, height);
+ }
+ else
+ {
+ u16 width;
+
+ ScrollWindow(list->template.windowId, 0, count * yMultiplier, (list->template.fillValue << 4) | (list->template.fillValue));
+ ListMenuPrintEntries(list, list->scrollOffset + (list->template.maxShowed - count), list->template.maxShowed - count, count);
+
+ width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8;
+ FillWindowPixelRect(list->template.windowId,
+ (list->template.fillValue << 4) | (list->template.fillValue),
+ 0, 0, width, list->template.upText_Y);
+ }
+ }
+}
+
+static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown)
+{
+ u16 oldSelectedRow;
+ u8 selectionChange, i, cursorCount;
+
+ oldSelectedRow = list->selectedRow;
+ cursorCount = 0;
+ selectionChange = 0;
+ for (i = 0; i < count; i++)
+ {
+ do
+ {
+ u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown);
+ selectionChange |= ret;
+ if (ret != 2)
+ break;
+ cursorCount++;
+ } while (list->template.items[list->scrollOffset + list->selectedRow].id == LIST_HEADER);
+ }
+
+ if (updateCursorAndCallCallback)
+ {
+ switch (selectionChange)
+ {
+ case 0:
+ default:
+ return TRUE;
+ case 1:
+ ListMenuErasePrintedCursor(list, oldSelectedRow);
+ ListMenuDrawCursor(list);
+ ListMenuCallSelectionChangedCallback(list, FALSE);
+ CopyWindowToVram(list->template.windowId, 2);
+ break;
+ case 2:
+ case 3:
+ ListMenuErasePrintedCursor(list, oldSelectedRow);
+ ListMenuScroll(list, cursorCount, movingDown);
+ ListMenuDrawCursor(list);
+ ListMenuCallSelectionChangedCallback(list, FALSE);
+ CopyWindowToVram(list->template.windowId, 2);
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit)
+{
+ if (list->template.moveCursorFunc != NULL)
+ list->template.moveCursorFunc(list->template.items[list->scrollOffset + list->selectedRow].id, onInit, list);
+}
+
+// unused
+void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal)
+{
+ gListMenuOverride.cursorPal = cursorPal;
+ gListMenuOverride.fillValue = fillValue;
+ gListMenuOverride.cursorShadowPal = cursorShadowPal;
+ gListMenuOverride.enabled = TRUE;
+}
+
+void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
+{
+ if (!onInit)
+ PlaySE(SE_SELECT);
+}
+
+// unused
+s32 ListMenuGetUnkIndicatorsStructFields(u8 taskId, u8 field)
+{
+ struct UnkIndicatorsStruct *data = (void*) gTasks[taskId].data;
+
+ switch (field)
+ {
+ case 0:
+ case 1:
+ return (s32)(data->field_4);
+ case 2:
+ return data->field_C;
+ case 3:
+ return data->field_E;
+ case 4:
+ return data->field_10;
+ case 5:
+ return data->field_11;
+ case 6:
+ return data->field_12;
+ case 7:
+ return data->field_13;
+ case 8:
+ return data->field_14_0;
+ case 9:
+ return data->field_14_1;
+ case 10:
+ return data->field_15_0;
+ case 11:
+ return data->field_15_1;
+ case 12:
+ return data->field_16_0;
+ case 13:
+ return data->field_16_1;
+ case 14:
+ return data->field_16_2;
+ case 15:
+ return data->field_17_0;
+ case 16:
+ return data->field_17_1;
+ default:
+ return -1;
+ }
+}
+
+void ListMenuSetUnkIndicatorsStructField(u8 taskId, u8 field, s32 value)
+{
+ struct UnkIndicatorsStruct *data = (void*) &gTasks[taskId].data;
+
+ switch (field)
+ {
+ case 0:
+ case 1:
+ data->field_4 = (void*)(value);
+ break;
+ case 2:
+ data->field_C = value;
+ break;
+ case 3:
+ data->field_E = value;
+ break;
+ case 4:
+ data->field_10 = value;
+ break;
+ case 5:
+ data->field_11 = value;
+ break;
+ case 6:
+ data->field_12 = value;
+ break;
+ case 7:
+ data->field_13 = value;
+ break;
+ case 8:
+ data->field_14_0 = value;
+ break;
+ case 9:
+ data->field_14_1 = value;
+ break;
+ case 10:
+ data->field_15_0 = value;
+ break;
+ case 11:
+ data->field_15_1 = value;
+ break;
+ case 12:
+ data->field_16_0 = value;
+ break;
+ case 13:
+ data->field_16_1 = value;
+ break;
+ case 14:
+ data->field_16_2 = value;
+ break;
+ case 15:
+ data->field_17_0 = value;
+ break;
+ case 16:
+ data->field_17_1 = value;
+ break;
+ }
+}
+
+#define tState data[0]
+#define tAnimNum data[1]
+#define tBounceDir data[2]
+#define tMultiplier data[3]
+#define tFrequency data[4]
+#define tSinePos data[5]
+
+static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite)
+{
+ s32 multiplier;
+
+ switch (sprite->tState)
+ {
+ case 0:
+ StartSpriteAnim(sprite, sprite->tAnimNum);
+ sprite->tState++;
+ break;
+ case 1:
+ switch (sprite->tBounceDir)
+ {
+ case 0:
+ multiplier = sprite->tMultiplier;
+ sprite->pos2.x = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;
+ break;
+ case 1:
+ multiplier = sprite->tMultiplier;
+ sprite->pos2.y = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256;
+ break;
+ }
+ sprite->tSinePos += sprite->tFrequency;
+ break;
+ }
+}
+
+static u8 AddScrollIndicatorArrowObject(u8 arrowDir, u8 x, u8 y, u16 tileTag, u16 palTag)
+{
+ u8 spriteId;
+ struct SpriteTemplate spriteTemplate;
+
+ spriteTemplate = sSpriteTemplate_ScrollArrowIndicator;
+ spriteTemplate.tileTag = tileTag;
+ spriteTemplate.paletteTag = palTag;
+
+ spriteId = CreateSprite(&spriteTemplate, x, y, 0);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].tState = 0;
+ gSprites[spriteId].tAnimNum = sScrollIndicatorTemplates[arrowDir].animNum;
+ gSprites[spriteId].tBounceDir = sScrollIndicatorTemplates[arrowDir].bounceDir;
+ gSprites[spriteId].tMultiplier = sScrollIndicatorTemplates[arrowDir].multiplier;
+ gSprites[spriteId].tFrequency = sScrollIndicatorTemplates[arrowDir].frequency;
+ gSprites[spriteId].tSinePos = 0;
+
+ return spriteId;
+}
+
+#undef tState
+#undef tAnimNum
+#undef tBounceDir
+#undef tMultiplier
+#undef tFrequency
+#undef tSinePos
+
+u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset)
+{
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpritePalette spritePal;
+ struct ScrollIndicatorPair *data;
+ u8 taskId;
+
+ spriteSheet.data = sRedArrowOtherGfx;
+ spriteSheet.size = 0x100;
+ spriteSheet.tag = arrowInfo->tileTag;
+ LoadCompressedObjectPic(&spriteSheet);
+
+ if (arrowInfo->palTag == SPRITE_INVALID_TAG)
+ {
+ LoadPalette(sRedArrowPal, (16 * arrowInfo->palNum) + 0x100, 0x20);
+ }
+ else
+ {
+ spritePal.data = sRedArrowPal;
+ spritePal.tag = arrowInfo->palTag;
+ LoadSpritePalette(&spritePal);
+ }
+
+ taskId = CreateTask(Task_ScrollIndicatorArrowPair, 0);
+ data = (void*) gTasks[taskId].data;
+
+ data->field_0 = 0;
+ data->scrollOffset = scrollOffset;
+ data->fullyUpThreshold = arrowInfo->fullyUpThreshold;
+ data->fullyDownThreshold = arrowInfo->fullyDownThreshold;
+ data->tileTag = arrowInfo->tileTag;
+ data->palTag = arrowInfo->palTag;
+ data->topSpriteId = AddScrollIndicatorArrowObject(arrowInfo->firstArrowType, arrowInfo->firstX, arrowInfo->firstY, arrowInfo->tileTag, arrowInfo->palTag);
+ data->bottomSpriteId = AddScrollIndicatorArrowObject(arrowInfo->secondArrowType, arrowInfo->secondX, arrowInfo->secondY, arrowInfo->tileTag, arrowInfo->palTag);
+
+ if (arrowInfo->palTag == SPRITE_INVALID_TAG)
+ {
+ gSprites[data->topSpriteId].oam.paletteNum = arrowInfo->palNum;
+ gSprites[data->bottomSpriteId].oam.paletteNum = arrowInfo->palNum;
+ }
+
+ return taskId;
+}
+
+u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset)
+{
+ if (arrowType == SCROLL_ARROW_UP || arrowType == SCROLL_ARROW_DOWN)
+ {
+ gTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_UP;
+ gTempScrollArrowTemplate.firstX = commonPos;
+ gTempScrollArrowTemplate.firstY = firstPos;
+ gTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_DOWN;
+ gTempScrollArrowTemplate.secondX = commonPos;
+ gTempScrollArrowTemplate.secondY = secondPos;
+ }
+ else
+ {
+ gTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_LEFT;
+ gTempScrollArrowTemplate.firstX = firstPos;
+ gTempScrollArrowTemplate.firstY = commonPos;
+ gTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_RIGHT;
+ gTempScrollArrowTemplate.secondX = secondPos;
+ gTempScrollArrowTemplate.secondY = commonPos;
+ }
+
+ gTempScrollArrowTemplate.fullyUpThreshold = 0;
+ gTempScrollArrowTemplate.fullyDownThreshold = fullyDownThreshold;
+ gTempScrollArrowTemplate.tileTag = tileTag;
+ gTempScrollArrowTemplate.palTag = palTag;
+ gTempScrollArrowTemplate.palNum = 0;
+
+ return AddScrollIndicatorArrowPair(&gTempScrollArrowTemplate, scrollOffset);
+}
+
+static void Task_ScrollIndicatorArrowPair(u8 taskId)
+{
+ struct ScrollIndicatorPair *data = (void*) gTasks[taskId].data;
+ u16 currItem = (*data->scrollOffset);
+
+ if (currItem == data->fullyUpThreshold && currItem != 0xFFFF)
+ gSprites[data->topSpriteId].invisible = TRUE;
+ else
+ gSprites[data->topSpriteId].invisible = FALSE;
+
+ if (currItem == data->fullyDownThreshold)
+ gSprites[data->bottomSpriteId].invisible = TRUE;
+ else
+ gSprites[data->bottomSpriteId].invisible = FALSE;
+}
+
+#define tIsScrolled data[15]
+
+void Task_ScrollIndicatorArrowPairOnMainMenu(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct ScrollIndicatorPair *scrollData = (void*) data;
+
+ if (tIsScrolled)
+ {
+ gSprites[scrollData->topSpriteId].invisible = FALSE;
+ gSprites[scrollData->bottomSpriteId].invisible = TRUE;
+ }
+ else
+ {
+ gSprites[scrollData->topSpriteId].invisible = TRUE;
+ gSprites[scrollData->bottomSpriteId].invisible = FALSE;
+ }
+}
+
+#undef tIsScrolled
+
+void RemoveScrollIndicatorArrowPair(u8 taskId)
+{
+ struct ScrollIndicatorPair *data = (void*) gTasks[taskId].data;
+
+ if (data->tileTag != SPRITE_INVALID_TAG)
+ FreeSpriteTilesByTag(data->tileTag);
+ if (data->palTag != SPRITE_INVALID_TAG)
+ FreeSpritePaletteByTag(data->palTag);
+
+ DestroySprite(&gSprites[data->topSpriteId]);
+ DestroySprite(&gSprites[data->bottomSpriteId]);
+
+ DestroyTask(taskId);
+}
+
+static u8 ListMenuAddCursorObjectInternal(struct CursorStruct *cursor, u32 cursorKind)
+{
+ switch (cursorKind)
+ {
+ case 0:
+ default:
+ return ListMenuAddRedOutlineCursorObject(cursor);
+ case 1:
+ return ListMenuAddRedArrowCursorObject(cursor);
+ }
+}
+
+static void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind)
+{
+ switch (cursorKind)
+ {
+ case 0:
+ ListMenuUpdateRedOutlineCursorObject(taskId, x, y);
+ break;
+ case 1:
+ ListMenuUpdateRedArrowCursorObject(taskId, x, y);
+ break;
+ }
+}
+
+static void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind)
+{
+ switch (cursorKind)
+ {
+ case 0:
+ ListMenuRemoveRedOutlineCursorObject(taskId);
+ break;
+ case 1:
+ ListMenuRemoveRedArrowCursorObject(taskId);
+ break;
+ }
+}
+
+static void Task_RedOutlineCursor(u8 taskId)
+{
+
+}
+
+u8 ListMenuGetRedOutlineCursorSpriteCount(u16 rowWidth, u16 rowHeight)
+{
+ s32 i;
+ s32 count = 4;
+
+ if (rowWidth > 16)
+ {
+ for (i = 8; i < (rowWidth - 8); i += 8)
+ count += 2;
+ }
+ if (rowHeight > 16)
+ {
+ for (i = 8; i < (rowHeight - 8); i += 8)
+ count += 2;
+ }
+
+ return count;
+}
+
+void ListMenuSetUpRedOutlineCursorSpriteOamTable(u16 rowWidth, u16 rowHeight, struct Subsprite *subsprites)
+{
+ s32 i, j, id = 0;
+
+ subsprites[id] = sSubsprite_RedOutline1;
+ subsprites[id].x = 136;
+ subsprites[id].y = 136;
+ id++;
+
+ subsprites[id] = sSubsprite_RedOutline2;
+ subsprites[id].x = rowWidth + 128;
+ subsprites[id].y = 136;
+ id++;
+
+ subsprites[id] = sSubsprite_RedOutline7;
+ subsprites[id].x = 136;
+ subsprites[id].y = rowHeight + 128;
+ id++;
+
+ subsprites[id] = sSubsprite_RedOutline8;
+ subsprites[id].x = rowWidth + 128;
+ subsprites[id].y = rowHeight + 128;
+ id++;
+
+ if (rowWidth > 16)
+ {
+ for (i = 8; i < rowWidth - 8; i += 8)
+ {
+ subsprites[id] = sSubsprite_RedOutline3;
+ subsprites[id].x = i - 120;
+ subsprites[id].y = 136;
+ id++;
+
+ subsprites[id] = sSubsprite_RedOutline6;
+ subsprites[id].x = i - 120;
+ subsprites[id].y = rowHeight + 128;
+ id++;
+ }
+ }
+
+ if (rowHeight > 16)
+ {
+ for (j = 8; j < rowHeight - 8; j += 8)
+ {
+ subsprites[id] = sSubsprite_RedOutline4;
+ subsprites[id].x = 136;
+ subsprites[id].y = j - 120;
+ id++;
+
+ subsprites[id] = sSubsprite_RedOutline5;
+ subsprites[id].x = rowWidth + 128;
+ subsprites[id].y = j - 120;
+ id++;
+ }
+ }
+}
+
+static u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor)
+{
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpritePalette spritePal;
+ struct RedOutlineCursor *data;
+ struct SpriteTemplate spriteTemplate;
+ u8 taskId;
+
+ spriteSheet.data = sSelectorOutlineGfx;
+ spriteSheet.size = 0x100;
+ spriteSheet.tag = cursor->tileTag;
+ LoadCompressedObjectPic(&spriteSheet);
+
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ {
+ LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20);
+ }
+ else
+ {
+ spritePal.data = sRedArrowPal;
+ spritePal.tag = cursor->palTag;
+ LoadSpritePalette(&spritePal);
+ }
+
+ taskId = CreateTask(Task_RedOutlineCursor, 0);
+ data = (void*) gTasks[taskId].data;
+
+ data->tileTag = cursor->tileTag;
+ data->palTag = cursor->palTag;
+ data->subspriteTable.subspriteCount = ListMenuGetRedOutlineCursorSpriteCount(cursor->rowWidth, cursor->rowHeight);
+ data->subspriteTable.subsprites = data->subspritesPtr = Alloc(data->subspriteTable.subspriteCount * 4);
+ ListMenuSetUpRedOutlineCursorSpriteOamTable(cursor->rowWidth, cursor->rowHeight, data->subspritesPtr);
+
+ spriteTemplate = gDummySpriteTemplate;
+ spriteTemplate.tileTag = cursor->tileTag;
+ spriteTemplate.paletteTag = cursor->palTag;
+
+ data->spriteId = CreateSprite(&spriteTemplate, cursor->left + 120, cursor->top + 120, 0);
+ SetSubspriteTables(&gSprites[data->spriteId], &data->subspriteTable);
+ gSprites[data->spriteId].oam.priority = 0;
+ gSprites[data->spriteId].subpriority = 0;
+ gSprites[data->spriteId].subspriteTableNum = 0;
+
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ {
+ gSprites[data->spriteId].oam.paletteNum = cursor->palNum;
+ }
+
+ return taskId;
+}
+
+static void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y)
+{
+ struct RedOutlineCursor *data = (void*) gTasks[taskId].data;
+
+ gSprites[data->spriteId].pos1.x = x + 120;
+ gSprites[data->spriteId].pos1.y = y + 120;
+}
+
+static void ListMenuRemoveRedOutlineCursorObject(u8 taskId)
+{
+ struct RedOutlineCursor *data = (void*) gTasks[taskId].data;
+
+ Free(data->subspritesPtr);
+
+ if (data->tileTag != SPRITE_INVALID_TAG)
+ FreeSpriteTilesByTag(data->tileTag);
+ if (data->palTag != SPRITE_INVALID_TAG)
+ FreeSpritePaletteByTag(data->palTag);
+
+ DestroySprite(&gSprites[data->spriteId]);
+ DestroyTask(taskId);
+}
+
+static void SpriteCallback_RedArrowCursor(struct Sprite *sprite)
+{
+ sprite->pos2.x = gSineTable[(u8)(sprite->data[0])] / 64;
+ sprite->data[0] += 8;
+}
+
+static void Task_RedArrowCursor(u8 taskId)
+{
+
+}
+
+static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor)
+{
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpritePalette spritePal;
+ struct RedArrowCursor *data;
+ struct SpriteTemplate spriteTemplate;
+ u8 taskId;
+
+ spriteSheet.data = sRedArrowGfx;
+ spriteSheet.size = 0x80;
+ spriteSheet.tag = cursor->tileTag;
+ LoadCompressedObjectPic(&spriteSheet);
+
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ {
+ LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20);
+ }
+ else
+ {
+ spritePal.data = sRedArrowPal;
+ spritePal.tag = cursor->palTag;
+ LoadSpritePalette(&spritePal);
+ }
+
+ taskId = CreateTask(Task_RedArrowCursor, 0);
+ data = (void*) gTasks[taskId].data;
+
+ data->tileTag = cursor->tileTag;
+ data->palTag = cursor->palTag;
+
+ spriteTemplate = sSpriteTemplate_RedArrowCursor;
+ spriteTemplate.tileTag = cursor->tileTag;
+ spriteTemplate.paletteTag = cursor->palTag;
+
+ data->spriteId = CreateSprite(&spriteTemplate, cursor->left, cursor->top, 0);
+ gSprites[data->spriteId].pos2.x = 8;
+ gSprites[data->spriteId].pos2.y = 8;
+
+ if (cursor->palTag == SPRITE_INVALID_TAG)
+ {
+ gSprites[data->spriteId].oam.paletteNum = cursor->palNum;
+ }
+
+ return taskId;
+}
+
+static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y)
+{
+ struct RedArrowCursor *data = (void*) gTasks[taskId].data;
+
+ gSprites[data->spriteId].pos1.x = x;
+ gSprites[data->spriteId].pos1.y = y;
+}
+
+static void ListMenuRemoveRedArrowCursorObject(u8 taskId)
+{
+ struct RedArrowCursor *data = (void*) gTasks[taskId].data;
+
+ if (data->tileTag != SPRITE_INVALID_TAG)
+ FreeSpriteTilesByTag(data->tileTag);
+ if (data->palTag != SPRITE_INVALID_TAG)
+ FreeSpritePaletteByTag(data->palTag);
+
+ DestroySprite(&gSprites[data->spriteId]);
+ DestroyTask(taskId);
+}
diff --git a/src/load_save.c b/src/load_save.c
index 68d978e3d..005af7c42 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -3,19 +3,31 @@
#include "load_save.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "malloc.h"
+#include "item.h"
extern void* gUnknown_0203CF5C;
extern bool16 IdentifyFlash(void);
-extern void SetBagItemsPointers(void);
extern void SetDecorationInventoriesPointers(void);
-
-void ApplyNewEncyprtionKeyToAllEncryptedData(u32 encryptionKey);
+extern void ApplyNewEncryptionKeyToGameStats(u32 key);
+extern void ApplyNewEncryptionKeyToBerryPowder(u32 key);
+extern void sub_8084FAC(int unused);
#define SAVEBLOCK_MOVE_RANGE 128
+struct LoadedSaveData
+{
+ /*0x0000*/ struct ItemSlot items[BAG_ITEMS_COUNT];
+ /*0x0078*/ struct ItemSlot keyItems[BAG_KEYITEMS_COUNT];
+ /*0x00F0*/ struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT];
+ /*0x0130*/ struct ItemSlot TMsHMs[BAG_TMHM_COUNT];
+ /*0x0230*/ struct ItemSlot berries[BAG_BERRIES_COUNT];
+ /*0x02E8*/ struct MailStruct mail[MAIL_COUNT];
+};
+
+// EWRAM DATA
EWRAM_DATA struct SaveBlock2 gSaveblock2 = {0};
EWRAM_DATA u8 gSaveblock2_DMA[SAVEBLOCK_MOVE_RANGE] = {0};
@@ -25,6 +37,16 @@ EWRAM_DATA u8 gSaveblock1_DMA[SAVEBLOCK_MOVE_RANGE] = {0};
EWRAM_DATA struct PokemonStorage gPokemonStorage = {0};
EWRAM_DATA u8 gSaveblock3_DMA[SAVEBLOCK_MOVE_RANGE] = {0};
+EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0};
+EWRAM_DATA u32 gLastEncryptionKey = 0;
+
+// IWRAM common
+IWRAM_DATA bool32 gFlashMemoryPresent;
+IWRAM_DATA struct SaveBlock1 *gSaveBlock1Ptr;
+IWRAM_DATA struct SaveBlock2 *gSaveBlock2Ptr;
+IWRAM_DATA struct PokemonStorage *gPokemonStoragePtr;
+
+// code
void CheckForFlashMemory(void)
{
if (!IdentifyFlash())
@@ -33,7 +55,9 @@ void CheckForFlashMemory(void)
InitFlashTimer();
}
else
+ {
gFlashMemoryPresent = FALSE;
+ }
}
void ClearSav2(void)
@@ -60,18 +84,13 @@ void SetSaveBlocksPointers(u16 offset)
SetDecorationInventoriesPointers();
}
-struct SaveBlocksInOne
-{
- struct SaveBlock2 sav2;
- struct SaveBlock1 sav1;
- struct PokemonStorage sav3;
-};
-/*
void MoveSaveBlocks_ResetHeap(void)
{
void *vblankCB, *hblankCB;
u32 encryptionKey;
- struct SaveBlocksInOne* copiedSavs;
+ struct SaveBlock2 *saveBlock2Copy;
+ struct SaveBlock1 *saveBlock1Copy;
+ struct PokemonStorage *pokemonStorageCopy;
// save interrupt functions and turn them off
vblankCB = gMain.vblankCallback;
@@ -80,24 +99,30 @@ void MoveSaveBlocks_ResetHeap(void)
gMain.hblankCallback = NULL;
gUnknown_0203CF5C = NULL;
- copiedSavs = (void*)(gHeap);
+ saveBlock2Copy = (struct SaveBlock2 *)(gHeap);
+ saveBlock1Copy = (struct SaveBlock1 *)(gHeap + sizeof(struct SaveBlock2));
+ pokemonStorageCopy = (struct PokemonStorage *)(gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1));
- // copy saveblocks' content
- copiedSavs->sav2 = *gSaveBlock2Ptr;
- copiedSavs->sav1 = *gSaveBlock1Ptr;
- copiedSavs->sav3 = *gPokemonStoragePtr;
+ // backup the saves.
+ *saveBlock2Copy = *gSaveBlock2Ptr;
+ *saveBlock1Copy = *gSaveBlock1Ptr;
+ *pokemonStorageCopy = *gPokemonStoragePtr;
// change saveblocks' pointers
// argument is a sum of the individual trainerId bytes
- SetSaveBlocksPointers(copiedSavs->sav2.playerTrainerId[0] + copiedSavs->sav2.playerTrainerId[1] + copiedSavs->sav2.playerTrainerId[2] + copiedSavs->sav2.playerTrainerId[3]);
+ SetSaveBlocksPointers(
+ saveBlock2Copy->playerTrainerId[0] +
+ saveBlock2Copy->playerTrainerId[1] +
+ saveBlock2Copy->playerTrainerId[2] +
+ saveBlock2Copy->playerTrainerId[3]);
// restore saveblock data since the pointers changed
- *gSaveBlock2Ptr = copiedSavs->sav2;
- *gSaveBlock1Ptr = copiedSavs->sav1;
- *gPokemonStoragePtr = copiedSavs->sav3;
+ *gSaveBlock2Ptr = *saveBlock2Copy;
+ *gSaveBlock1Ptr = *saveBlock1Copy;
+ *gPokemonStoragePtr = *pokemonStorageCopy;
// heap was destroyed in the copying process, so reset it
- InitHeap(gHeap, sizeof(gHeap));
+ InitHeap(gHeap, HEAP_SIZE);
// restore interrupt functions
gMain.hblankCallback = hblankCB;
@@ -105,6 +130,167 @@ void MoveSaveBlocks_ResetHeap(void)
// create a new encryption key
encryptionKey = (Random() << 0x10) + (Random());
- ApplyNewEncyprtionKeyToAllEncryptedData(encryptionKey);
+ ApplyNewEncryptionKeyToAllEncryptedData(encryptionKey);
gSaveBlock2Ptr->encryptionKey = encryptionKey;
-}*/
+}
+
+u32 GetSecretBase2Field_9(void)
+{
+ return gSaveBlock2Ptr->specialSaveWarp & 1;
+}
+
+void ClearSecretBase2Field_9(void)
+{
+ gSaveBlock2Ptr->specialSaveWarp &= ~1;
+}
+
+void sub_8076D48(void)
+{
+ gSaveBlock2Ptr->specialSaveWarp |= 1;
+}
+
+void sub_8076D5C(void)
+{
+ sub_8084FAC(0);
+ gSaveBlock2Ptr->specialSaveWarp |= 1;
+}
+
+void sav2_gender2_inplace_and_xFE(void)
+{
+ gSaveBlock2Ptr->specialSaveWarp &= ~1;
+}
+
+void SavePlayerParty(void)
+{
+ int i;
+
+ gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i];
+}
+
+void LoadPlayerParty(void)
+{
+ int i;
+
+ gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i];
+}
+
+void SaveEventObjects(void)
+{
+ int i;
+
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ gSaveBlock1Ptr->eventObjects[i] = gEventObjects[i];
+}
+
+void LoadEventObjects(void)
+{
+ int i;
+
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ gEventObjects[i] = gSaveBlock1Ptr->eventObjects[i];
+}
+
+void SaveSerializedGame(void)
+{
+ SavePlayerParty();
+ SaveEventObjects();
+}
+
+void LoadSerializedGame(void)
+{
+ LoadPlayerParty();
+ LoadEventObjects();
+}
+
+void LoadPlayerBag(void)
+{
+ int i;
+
+ // load player items.
+ for (i = 0; i < BAG_ITEMS_COUNT; i++)
+ gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i];
+
+ // load player key items.
+ for (i = 0; i < BAG_KEYITEMS_COUNT; i++)
+ gLoadedSaveData.keyItems[i] = gSaveBlock1Ptr->bagPocket_KeyItems[i];
+
+ // load player pokeballs.
+ for (i = 0; i < BAG_POKEBALLS_COUNT; i++)
+ gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i];
+
+ // load player TMs and HMs.
+ for (i = 0; i < BAG_TMHM_COUNT; i++)
+ gLoadedSaveData.TMsHMs[i] = gSaveBlock1Ptr->bagPocket_TMHM[i];
+
+ // load player berries.
+ for (i = 0; i < BAG_BERRIES_COUNT; i++)
+ gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i];
+
+ // load mail.
+ for (i = 0; i < MAIL_COUNT; i++)
+ gLoadedSaveData.mail[i] = gSaveBlock1Ptr->mail[i];
+
+ gLastEncryptionKey = gSaveBlock2Ptr->encryptionKey;
+}
+
+void SavePlayerBag(void)
+{
+ int i;
+ u32 encryptionKeyBackup;
+
+ // save player items.
+ for (i = 0; i < BAG_ITEMS_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i];
+
+ // save player key items.
+ for (i = 0; i < BAG_KEYITEMS_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i];
+
+ // save player pokeballs.
+ for (i = 0; i < BAG_POKEBALLS_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i];
+
+ // save player TMs and HMs.
+ for (i = 0; i < BAG_TMHM_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i];
+
+ // save player berries.
+ for (i = 0; i < BAG_BERRIES_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i];
+
+ // save mail.
+ for (i = 0; i < MAIL_COUNT; i++)
+ gSaveBlock1Ptr->mail[i] = gLoadedSaveData.mail[i];
+
+ encryptionKeyBackup = gSaveBlock2Ptr->encryptionKey;
+ gSaveBlock2Ptr->encryptionKey = gLastEncryptionKey;
+ ApplyNewEncryptionKeyToBagItems(encryptionKeyBackup);
+ gSaveBlock2Ptr->encryptionKey = encryptionKeyBackup; // updated twice?
+}
+
+void ApplyNewEncryptionKeyToHword(u16 *hWord, u32 newKey)
+{
+ *hWord ^= gSaveBlock2Ptr->encryptionKey;
+ *hWord ^= newKey;
+}
+
+void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey)
+{
+ *word ^= gSaveBlock2Ptr->encryptionKey;
+ *word ^= newKey;
+}
+
+void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey)
+{
+ ApplyNewEncryptionKeyToGameStats(encryptionKey);
+ ApplyNewEncryptionKeyToBagItems_(encryptionKey);
+ ApplyNewEncryptionKeyToBerryPowder(encryptionKey);
+ ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey);
+ ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey);
+}
diff --git a/src/lottery_corner.c b/src/lottery_corner.c
index 211b78f19..2ded9c943 100644
--- a/src/lottery_corner.c
+++ b/src/lottery_corner.c
@@ -2,9 +2,9 @@
#include "lottery_corner.h"
#include "event_data.h"
#include "pokemon.h"
-#include "items.h"
-#include "rng.h"
-#include "species.h"
+#include "constants/items.h"
+#include "random.h"
+#include "constants/species.h"
#include "string_util.h"
#include "text.h"
diff --git a/src/m4a_2.c b/src/m4a_2.c
index 2d3c65848..0625f05d1 100644
--- a/src/m4a_2.c
+++ b/src/m4a_2.c
@@ -11,10 +11,10 @@ void *gMPlayJumpTable[36];
struct CgbChannel gCgbChans[4];
struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];
struct PokemonCrySong gPokemonCrySong;
-struct MusicPlayerInfo gMPlay_BGM;
-struct MusicPlayerInfo gMPlay_SE1;
-struct MusicPlayerInfo gMPlay_SE2;
-struct MusicPlayerInfo gMPlay_SE3;
+struct MusicPlayerInfo gMPlayInfo_BGM;
+struct MusicPlayerInfo gMPlayInfo_SE1;
+struct MusicPlayerInfo gMPlayInfo_SE2;
+struct MusicPlayerInfo gMPlayInfo_SE3;
u8 gMPlayMemAccArea[0x10];
u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
diff --git a/src/m4a_4.c b/src/m4a_4.c
index 99195ec00..e645fbef5 100644
--- a/src/m4a_4.c
+++ b/src/m4a_4.c
@@ -45,7 +45,7 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
mplayInfo->ident = ID_NUMBER;
}
-void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch)
+void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
{
s32 i;
u32 bit;
@@ -66,7 +66,7 @@ void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
{
if (track->flags & MPT_FLG_EXIST)
{
- track->keyShiftX = (s16)pitch >> 8;
+ track->keyShiftX = pitch >> 8;
track->pitX = pitch;
track->flags |= MPT_FLG_PITCHG;
}
diff --git a/src/mail.c b/src/mail.c
index 1ceb1be1a..625b52de3 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -1,14 +1,14 @@
-
-// Includes
#include "global.h"
+#include "mail.h"
+#include "constants/items.h"
#include "main.h"
#include "overworld.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "palette.h"
+#include "text.h"
#include "menu.h"
#include "menu_helpers.h"
-#include "text.h"
#include "text_window.h"
#include "string_util.h"
#include "international_string_util.h"
@@ -16,11 +16,46 @@
#include "gpu_regs.h"
#include "bg.h"
#include "pokemon_icon.h"
-#include "species.h"
+#include "constants/species.h"
#include "malloc.h"
#include "easy_chat.h"
-#include "mail_data.h"
-#include "mail.h"
+
+extern const u16 gMailPalette_Orange[];
+extern const u16 gMailPalette_Harbor[];
+extern const u16 gMailPalette_Glitter[];
+extern const u16 gMailPalette_Mech[];
+extern const u16 gMailPalette_Wood[];
+extern const u16 gMailPalette_Wave[];
+extern const u16 gMailPalette_Bead[];
+extern const u16 gMailPalette_Shadow[];
+extern const u16 gMailPalette_Tropic[];
+extern const u16 gMailPalette_Dream[];
+extern const u16 gMailPalette_Fab[];
+extern const u16 gMailPalette_Retro[];
+extern const u8 gMailTiles_Orange[];
+extern const u8 gMailTilemap_Orange[];
+extern const u8 gMailTiles_Harbor[];
+extern const u8 gMailTilemap_Harbor[];
+extern const u8 gMailTiles_Glitter[];
+extern const u8 gMailTilemap_Glitter[];
+extern const u8 gMailTiles_Mech[];
+extern const u8 gMailTilemap_Mech[];
+extern const u8 gMailTiles_Wood[];
+extern const u8 gMailTilemap_Wood[];
+extern const u8 gMailTiles_Wave[];
+extern const u8 gMailTilemap_Wave[];
+extern const u8 gMailTiles_Bead[];
+extern const u8 gMailTilemap_Bead[];
+extern const u8 gMailTiles_Shadow[];
+extern const u8 gMailTilemap_Shadow[];
+extern const u8 gMailTiles_Tropic[];
+extern const u8 gMailTilemap_Tropic[];
+extern const u8 gMailTiles_Dream[];
+extern const u8 gMailTilemap_Dream[];
+extern const u8 gMailTiles_Fab[];
+extern const u8 gMailTilemap_Fab[];
+extern const u8 gMailTiles_Retro[];
+extern const u8 gMailTilemap_Retro[];
// Static type declarations
@@ -52,9 +87,7 @@ struct MailGraphics
u16 color12;
};
-// Static RAM declarations
-
-static EWRAM_DATA struct
+struct MailRead
{
/*0x0000*/ u8 strbuf[8][64];
/*0x0200*/ u8 playerName[12];
@@ -68,27 +101,31 @@ static EWRAM_DATA struct
/*0x021c*/ u8 monIconSprite;
/*0x021d*/ u8 language;
/*0x021e*/ bool8 playerIsSender;
- /*0x0220*/ void (*parserSingle)(u8 *dest, u16 word);
+ /*0x0220*/ u8 * (*parserSingle)(u8 *dest, u16 word);
/*0x0224*/ void (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2);
/*0x0228*/ const struct MailLayout *layout;
/*0x022c*/ u8 bg1TilemapBuffer[0x1000];
/*0x122c*/ u8 bg2TilemapBuffer[0x1000];
-} *gUnknown_0203A134 = NULL;
+};
+
+// Static RAM declarations
+
+static EWRAM_DATA struct MailRead *sMailRead = NULL;
// Static ROM declarations
-void sub_81219F0(void);
-void sub_8121A1C(void);
-void sub_8121B1C(void);
-void sub_8121C50(void);
-void sub_8121C64(void);
-void sub_8121C98(void);
-void sub_8121CC0(void);
-void sub_8121D00(void);
+static void CB2_InitMailRead(void);
+static void sub_8121A1C(void);
+static void sub_8121B1C(void);
+static void VBlankCB_MailRead(void);
+static void CB2_MailRead(void);
+static void CB2_WaitForPaletteExitOnKeyPress(void);
+static void CB2_ExitOnKeyPress(void);
+static void CB2_ExitMailReadFreeVars(void);
// .rodata
-const struct BgTemplate gUnknown_0859F290[] = {
+static const struct BgTemplate sUnknown_0859F290[] = {
{
.bg = 0,
.charBaseIndex = 2,
@@ -107,7 +144,7 @@ const struct BgTemplate gUnknown_0859F290[] = {
}
};
-const struct WindowTemplate gUnknown_0859F29C[] = {
+static const struct WindowTemplate sUnknown_0859F29C[] = {
{
.priority = 0,
.tilemapLeft = 2,
@@ -120,89 +157,52 @@ const struct WindowTemplate gUnknown_0859F29C[] = {
DUMMY_WIN_TEMPLATE
};
-const u8 gUnknown_0859F2AC[] = {
+static const u8 sUnknown_0859F2AC[] = {
0,
10,
11
};
-const u16 gUnknown_0859F2B0[][2] = {
+static const u16 sUnknown_0859F2B0[][2] = {
{ 0x6ACD, 0x51A5 },
{ 0x45FC, 0x38D4 }
};
-extern const u16 gUnknown_08DBE818[];
-extern const u16 gUnknown_08DBE838[];
-extern const u16 gUnknown_08DBE858[];
-extern const u16 gUnknown_08DBE878[];
-extern const u16 gUnknown_08DBE898[];
-extern const u16 gUnknown_08DBE8B8[];
-extern const u16 gUnknown_08DBE8D8[];
-extern const u16 gUnknown_08DBE8F8[];
-extern const u16 gUnknown_08DBE918[];
-extern const u16 gUnknown_08DBE938[];
-extern const u16 gUnknown_08DBE958[];
-extern const u16 gUnknown_08DBE978[];
-extern const u8 gUnknown_08DBE998[];
-extern const u8 gUnknown_08DBFBA4[];
-extern const u8 gUnknown_08DBEB38[];
-extern const u8 gUnknown_08DBFC7C[];
-extern const u8 gUnknown_08DBEC74[];
-extern const u8 gUnknown_08DBFD5C[];
-extern const u8 gUnknown_08DBEE84[];
-extern const u8 gUnknown_08DBFE68[];
-extern const u8 gUnknown_08DBEF5C[];
-extern const u8 gUnknown_08DBFF44[];
-extern const u8 gUnknown_08DBF154[];
-extern const u8 gUnknown_08DC0034[];
-extern const u8 gUnknown_08DBF2D4[];
-extern const u8 gUnknown_08DC0114[];
-extern const u8 gUnknown_08DBF37C[];
-extern const u8 gUnknown_08DC01F4[];
-extern const u8 gUnknown_08DBF50C[];
-extern const u8 gUnknown_08DC0300[];
-extern const u8 gUnknown_08DBF64C[];
-extern const u8 gUnknown_08DC03F0[];
-extern const u8 gUnknown_08DBF7B4[];
-extern const u8 gUnknown_08DC04E8[];
-extern const u8 gUnknown_08DBF904[];
-extern const u8 gUnknown_08DC0600[];
-
-const struct MailGraphics gUnknown_0859F2B8[] = {
+static const struct MailGraphics sUnknown_0859F2B8[] = {
{
- gUnknown_08DBE818, gUnknown_08DBE998, gUnknown_08DBFBA4, 0x02c0, 0x0000, 0x294a, 0x6739
+ gMailPalette_Orange, gMailTiles_Orange, gMailTilemap_Orange, 0x02c0, 0x0000, 0x294a, 0x6739
}, {
- gUnknown_08DBE838, gUnknown_08DBEB38, gUnknown_08DBFC7C, 0x02e0, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Harbor, gMailTiles_Harbor, gMailTilemap_Harbor, 0x02e0, 0x0000, 0x7fff, 0x4631
}, {
- gUnknown_08DBE858, gUnknown_08DBEC74, gUnknown_08DBFD5C, 0x0400, 0x0000, 0x294a, 0x6739
+ gMailPalette_Glitter, gMailTiles_Glitter, gMailTilemap_Glitter, 0x0400, 0x0000, 0x294a, 0x6739
}, {
- gUnknown_08DBE878, gUnknown_08DBEE84, gUnknown_08DBFE68, 0x01e0, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Mech, gMailTiles_Mech, gMailTilemap_Mech, 0x01e0, 0x0000, 0x7fff, 0x4631
}, {
- gUnknown_08DBE898, gUnknown_08DBEF5C, gUnknown_08DBFF44, 0x02e0, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Wood, gMailTiles_Wood, gMailTilemap_Wood, 0x02e0, 0x0000, 0x7fff, 0x4631
}, {
- gUnknown_08DBE8B8, gUnknown_08DBF154, gUnknown_08DC0034, 0x0300, 0x0000, 0x294a, 0x6739
+ gMailPalette_Wave, gMailTiles_Wave, gMailTilemap_Wave, 0x0300, 0x0000, 0x294a, 0x6739
}, {
- gUnknown_08DBE8D8, gUnknown_08DBF2D4, gUnknown_08DC0114, 0x0140, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Bead, gMailTiles_Bead, gMailTilemap_Bead, 0x0140, 0x0000, 0x7fff, 0x4631
}, {
- gUnknown_08DBE8F8, gUnknown_08DBF37C, gUnknown_08DC01F4, 0x0300, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Shadow, gMailTiles_Shadow, gMailTilemap_Shadow, 0x0300, 0x0000, 0x7fff, 0x4631
}, {
- gUnknown_08DBE918, gUnknown_08DBF50C, gUnknown_08DC0300, 0x0220, 0x0000, 0x294a, 0x6739
+ gMailPalette_Tropic, gMailTiles_Tropic, gMailTilemap_Tropic, 0x0220, 0x0000, 0x294a, 0x6739
}, {
- gUnknown_08DBE938, gUnknown_08DBF64C, gUnknown_08DC03F0, 0x0340, 0x0000, 0x294a, 0x6739
+ gMailPalette_Dream, gMailTiles_Dream, gMailTilemap_Dream, 0x0340, 0x0000, 0x294a, 0x6739
}, {
- gUnknown_08DBE958, gUnknown_08DBF7B4, gUnknown_08DC04E8, 0x02a0, 0x0000, 0x294a, 0x6739
+ gMailPalette_Fab, gMailTiles_Fab, gMailTilemap_Fab, 0x02a0, 0x0000, 0x294a, 0x6739
}, {
- gUnknown_08DBE978, gUnknown_08DBF904, gUnknown_08DC0600, 0x0520, 0x0000, 0x294a, 0x6739
+ gMailPalette_Retro, gMailTiles_Retro, gMailTilemap_Retro, 0x0520, 0x0000, 0x294a, 0x6739
}
};
-const struct UnkMailStruct Unknown_0859F3A8[] = {
+static const struct UnkMailStruct Unknown_0859F3A8[] = {
{ .numEasyChatWords = 3, .lineHeight = 16 },
{ .numEasyChatWords = 3, .lineHeight = 16 },
{ .numEasyChatWords = 3, .lineHeight = 16 }
};
-const struct MailLayout gUnknown_0859F3B4[] = {
+static const struct MailLayout sUnknown_0859F3B4[] = {
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
@@ -217,7 +217,7 @@ const struct MailLayout gUnknown_0859F3B4[] = {
{ 0x03, 0x00, 0x00, 0x02, 0x00, Unknown_0859F3A8 }
};
-const struct UnkMailStruct Unknown_0859F444[] = {
+static const struct UnkMailStruct Unknown_0859F444[] = {
{ .numEasyChatWords = 2, .lineHeight = 16 },
{ .numEasyChatWords = 2, .lineHeight = 16 },
{ .numEasyChatWords = 2, .lineHeight = 16 },
@@ -225,7 +225,7 @@ const struct UnkMailStruct Unknown_0859F444[] = {
{ .numEasyChatWords = 1, .lineHeight = 16 }
};
-const struct MailLayout gUnknown_0859F458[] = {
+static const struct MailLayout sUnknown_0859F458[] = {
{ 0x05, 0x07, 0x58, 0x0b, 0x1e, Unknown_0859F444 },
{ 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 },
{ 0x05, 0x0c, 0x68, 0x05, 0x1e, Unknown_0859F444 },
@@ -240,86 +240,64 @@ const struct MailLayout gUnknown_0859F458[] = {
{ 0x05, 0x09, 0x60, 0x05, 0x1e, Unknown_0859F444 }
};
-// What the heck are these meant to be? Call them u16 for now.
-
-const u16 Unknown_0859F4E8[] = {
- 0x00, 0x4000, 0x00, 0x00
-};
-
-const u16 Unknown_0859F4F0[] = {
- 0x00, 0x00, -1, 0x00
-};
-
-const u16 Unknown_0859F4F8[] = {
- 0x04, 0x00, -1, 0x00
-};
-
-const u16 Unknown_0859F500[] = {
- 0x00, 0x40, -1, 0x00
-};
-
-const u16 *const gUnknown_0859F508[] = {
- Unknown_0859F4F0,
- Unknown_0859F4F8,
- Unknown_0859F500
-};
-
// .text
-void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) {
+void ReadMail(struct MailStruct *mail, void (*callback)(void), bool8 flag)
+{
u16 buffer[2];
u16 species;
- gUnknown_0203A134 = calloc(1, sizeof(*gUnknown_0203A134));
- gUnknown_0203A134->language = LANGUAGE_ENGLISH;
- gUnknown_0203A134->playerIsSender = TRUE;
- gUnknown_0203A134->parserSingle = CopyEasyChatWord;
- gUnknown_0203A134->parserMultiple = ConvertEasyChatWordsToString;
- if (mail->itemId >= ITEM_ORANGE_MAIL && mail->itemId <= ITEM_RETRO_MAIL) {
- gUnknown_0203A134->mailType = mail->itemId - ITEM_ORANGE_MAIL;
+ sMailRead = calloc(1, sizeof(*sMailRead));
+ sMailRead->language = LANGUAGE_ENGLISH;
+ sMailRead->playerIsSender = TRUE;
+ sMailRead->parserSingle = CopyEasyChatWord;
+ sMailRead->parserMultiple = ConvertEasyChatWordsToString;
+ if (IS_ITEM_MAIL(mail->itemId))
+ {
+ sMailRead->mailType = mail->itemId - ITEM_ORANGE_MAIL;
}
else
{
- gUnknown_0203A134->mailType = 0;
+ sMailRead->mailType = 0;
flag = FALSE;
}
- switch (gUnknown_0203A134->playerIsSender)
+ switch (sMailRead->playerIsSender)
{
case FALSE:
default:
- gUnknown_0203A134->layout = &gUnknown_0859F3B4[gUnknown_0203A134->mailType];
+ sMailRead->layout = &sUnknown_0859F3B4[sMailRead->mailType];
break;
case TRUE:
- gUnknown_0203A134->layout = &gUnknown_0859F458[gUnknown_0203A134->mailType];
+ sMailRead->layout = &sUnknown_0859F458[sMailRead->mailType];
break;
}
- species = sub_80D45E8(mail->species, buffer);
+ species = MailSpeciesToSpecies(mail->species, buffer);
if (species >= SPECIES_BULBASAUR && species < NUM_SPECIES)
{
- switch (gUnknown_0203A134->mailType)
+ switch (sMailRead->mailType)
{
default:
- gUnknown_0203A134->animsActive = 0;
+ sMailRead->animsActive = 0;
break;
case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL:
- gUnknown_0203A134->animsActive = 1;
+ sMailRead->animsActive = 1;
break;
case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL:
- gUnknown_0203A134->animsActive = 2;
+ sMailRead->animsActive = 2;
break;
}
}
else
{
- gUnknown_0203A134->animsActive = 0;
+ sMailRead->animsActive = 0;
}
- gUnknown_0203A134->mail = mail;
- gUnknown_0203A134->callback = callback;
- gUnknown_0203A134->flag = flag;
- SetMainCallback2(sub_81219F0);
+ sMailRead->mail = mail;
+ sMailRead->callback = callback;
+ sMailRead->flag = flag;
+ SetMainCallback2(CB2_InitMailRead);
}
-bool8 sub_81215EC(void)
+static bool8 MailReadBuildGraphics(void)
{
u16 icon;
@@ -327,7 +305,7 @@ bool8 sub_81215EC(void)
{
case 0:
SetVBlankCallback(NULL);
- remove_some_task();
+ ScanlineEffect_Stop();
SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
break;
case 1:
@@ -353,21 +331,21 @@ bool8 sub_81215EC(void)
SetGpuReg(REG_OFFSET_BG2HOFS, 0x0000);
SetGpuReg(REG_OFFSET_BG3HOFS, 0x0000);
SetGpuReg(REG_OFFSET_BG3VOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000);
break;
case 6:
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_0859F290, 3);
- SetBgTilemapBuffer(1, gUnknown_0203A134->bg1TilemapBuffer);
- SetBgTilemapBuffer(2, gUnknown_0203A134->bg2TilemapBuffer);
+ InitBgsFromTemplates(0, sUnknown_0859F290, 3);
+ SetBgTilemapBuffer(1, sMailRead->bg1TilemapBuffer);
+ SetBgTilemapBuffer(2, sMailRead->bg2TilemapBuffer);
break;
case 7:
- InitWindows(gUnknown_0859F29C);
+ InitWindows(sUnknown_0859F29C);
DeactivateAllTextPrinters();
break;
case 8:
- decompress_and_copy_tile_data_to_vram(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tiles, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(1, sUnknown_0859F2B8[sMailRead->mailType].tiles, 0, 0, 0);
break;
case 9:
if (free_temp_tile_data_buffers_if_possible())
@@ -378,7 +356,7 @@ bool8 sub_81215EC(void)
case 10:
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 1, 0, 0, 30, 20);
- CopyToBgTilemapBuffer(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tileMap, 0, 0);
+ CopyToBgTilemapBuffer(1, sUnknown_0859F2B8[sMailRead->mailType].tileMap, 0, 0);
break;
case 11:
CopyBgTilemapBufferToVram(0);
@@ -387,24 +365,24 @@ bool8 sub_81215EC(void)
break;
case 12:
LoadPalette(GetOverworldTextboxPalettePtr(), 240, 32);
- gPlttBufferUnfaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10;
- gPlttBufferFaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10;
- gPlttBufferUnfaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12;
- gPlttBufferFaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12;
- LoadPalette(gUnknown_0859F2B8[gUnknown_0203A134->mailType].palette, 0, 32);
- gPlttBufferUnfaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
- gPlttBufferFaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
- gPlttBufferUnfaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
- gPlttBufferFaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
+ gPlttBufferUnfaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10;
+ gPlttBufferFaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10;
+ gPlttBufferUnfaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12;
+ gPlttBufferFaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12;
+ LoadPalette(sUnknown_0859F2B8[sMailRead->mailType].palette, 0, 32);
+ gPlttBufferUnfaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
+ gPlttBufferFaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
+ gPlttBufferUnfaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
+ gPlttBufferFaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
break;
case 13:
- if (gUnknown_0203A134->flag)
+ if (sMailRead->flag)
{
sub_8121A1C();
}
break;
case 14:
- if (gUnknown_0203A134->flag)
+ if (sMailRead->flag)
{
sub_8121B1C();
RunTextPrinters();
@@ -417,20 +395,20 @@ bool8 sub_81215EC(void)
}
break;
case 16:
- SetVBlankCallback(sub_8121C50);
+ SetVBlankCallback(VBlankCB_MailRead);
gPaletteFade.bufferTransferDisabled = TRUE;
break;
case 17:
- icon = sub_80D2E84(gUnknown_0203A134->mail->species);
- switch (gUnknown_0203A134->animsActive)
+ icon = sub_80D2E84(sMailRead->mail->species);
+ switch (sMailRead->animsActive)
{
case 1:
- sub_80D2F68(icon);
- gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0);
+ LoadMonIconPalette(icon);
+ sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0);
break;
case 2:
- sub_80D2F68(icon);
- gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0);
+ LoadMonIconPalette(icon);
+ sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0);
break;
}
break;
@@ -439,55 +417,55 @@ bool8 sub_81215EC(void)
ShowBg(0);
ShowBg(1);
ShowBg(2);
- BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
gPaletteFade.bufferTransferDisabled = FALSE;
- gUnknown_0203A134->callback2 = sub_8121C98;
+ sMailRead->callback2 = CB2_WaitForPaletteExitOnKeyPress;
return TRUE;
default:
return FALSE;
}
- gMain.state ++;
+ gMain.state++;
return FALSE;
}
-void sub_81219F0(void)
+static void CB2_InitMailRead(void)
{
do
{
- if (sub_81215EC() == TRUE)
+ if (MailReadBuildGraphics() == TRUE)
{
- SetMainCallback2(sub_8121C64);
+ SetMainCallback2(CB2_MailRead);
break;
}
} while (sub_81221AC() != TRUE);
}
-void sub_8121A1C(void)
+static void sub_8121A1C(void)
{
u16 i;
u8 total;
u8 *ptr;
total = 0;
- for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++)
+ for (i = 0; i < sMailRead->layout->numSubStructs; i ++)
{
- ConvertEasyChatWordsToString(gUnknown_0203A134->strbuf[i], &gUnknown_0203A134->mail->words[total], gUnknown_0203A134->layout->var8[i].numEasyChatWords, 1);
- total += gUnknown_0203A134->layout->var8[i].numEasyChatWords;
+ ConvertEasyChatWordsToString(sMailRead->strbuf[i], &sMailRead->mail->words[total], sMailRead->layout->var8[i].numEasyChatWords, 1);
+ total += sMailRead->layout->var8[i].numEasyChatWords;
}
- ptr = StringCopy(gUnknown_0203A134->playerName, gUnknown_0203A134->mail->playerName);
- if (!gUnknown_0203A134->playerIsSender)
+ ptr = StringCopy(sMailRead->playerName, sMailRead->mail->playerName);
+ if (!sMailRead->playerIsSender)
{
StringCopy(ptr, gText_FromSpace);
- gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60);
+ sMailRead->signatureWidth = sMailRead->layout->signatureWidth - (StringLength(sMailRead->playerName) * 8 - 0x60);
}
else
{
- sub_81DB52C(gUnknown_0203A134->playerName);
- gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth;
+ sub_81DB52C(sMailRead->playerName);
+ sMailRead->signatureWidth = sMailRead->layout->signatureWidth;
}
}
-void sub_8121B1C(void)
+static void sub_8121B1C(void)
{
u16 i;
u8 strbuf[0x20];
@@ -501,77 +479,76 @@ void sub_8121B1C(void)
PutWindowTilemap(1);
FillWindowPixelBuffer(0, 0);
FillWindowPixelBuffer(1, 0);
- for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++)
+ for (i = 0; i < sMailRead->layout->numSubStructs; i ++)
{
- if (gUnknown_0203A134->strbuf[i][0] == EOS || gUnknown_0203A134->strbuf[i][0] == CHAR_SPACE)
+ if (sMailRead->strbuf[i][0] == EOS || sMailRead->strbuf[i][0] == CHAR_SPACE)
{
continue;
}
- box_print(0, 1, gUnknown_0203A134->layout->var8[i].xOffset + gUnknown_0203A134->layout->wordsYPos, y + gUnknown_0203A134->layout->wordsXPos, gUnknown_0859F2AC, 0, gUnknown_0203A134->strbuf[i]);
- y += gUnknown_0203A134->layout->var8[i].lineHeight;
+ box_print(0, 1, sMailRead->layout->var8[i].xOffset + sMailRead->layout->wordsYPos, y + sMailRead->layout->wordsXPos, sUnknown_0859F2AC, 0, sMailRead->strbuf[i]);
+ y += sMailRead->layout->var8[i].lineHeight;
}
bufptr = StringCopy(strbuf, gText_FromSpace);
- StringCopy(bufptr, gUnknown_0203A134->playerName);
- box_x = GetStringCenterAlignXOffset(1, strbuf, gUnknown_0203A134->signatureWidth) + 0x68;
- box_y = gUnknown_0203A134->layout->signatureYPos + 0x58;
- box_print(0, 1, box_x, box_y, gUnknown_0859F2AC, 0, strbuf);
+ StringCopy(bufptr, sMailRead->playerName);
+ box_x = GetStringCenterAlignXOffset(1, strbuf, sMailRead->signatureWidth) + 0x68;
+ box_y = sMailRead->layout->signatureYPos + 0x58;
+ box_print(0, 1, box_x, box_y, sUnknown_0859F2AC, 0, strbuf);
CopyWindowToVram(0, 3);
CopyWindowToVram(1, 3);
}
-void sub_8121C50(void)
+static void VBlankCB_MailRead(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-void sub_8121C64(void)
+static void CB2_MailRead(void)
{
- if (gUnknown_0203A134->animsActive != 0)
+ if (sMailRead->animsActive != 0)
{
AnimateSprites();
BuildOamBuffer();
}
- gUnknown_0203A134->callback2();
+ sMailRead->callback2();
}
-void sub_8121C98(void)
+static void CB2_WaitForPaletteExitOnKeyPress(void)
{
if (!UpdatePaletteFade())
{
- gUnknown_0203A134->callback2 = sub_8121CC0;
+ sMailRead->callback2 = CB2_ExitOnKeyPress;
}
}
-void sub_8121CC0(void)
+static void CB2_ExitOnKeyPress(void)
{
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
- BeginNormalPaletteFade(-1, 0, 0, 16, 0);
- gUnknown_0203A134->callback2 = sub_8121D00;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ sMailRead->callback2 = CB2_ExitMailReadFreeVars;
}
}
-void sub_8121D00(void)
+static void CB2_ExitMailReadFreeVars(void)
{
if (!UpdatePaletteFade())
{
- SetMainCallback2(gUnknown_0203A134->callback);
- switch (gUnknown_0203A134->animsActive)
+ SetMainCallback2(sMailRead->callback);
+ switch (sMailRead->animsActive)
{
case 1:
case 2:
- sub_80D2FF0(sub_80D2E84(gUnknown_0203A134->mail->species));
- sub_80D2EF8(&gSprites[gUnknown_0203A134->monIconSprite]);
+ FreeMonIconPalette(sub_80D2E84(sMailRead->mail->species));
+ sub_80D2EF8(&gSprites[sMailRead->monIconSprite]);
}
- memset(gUnknown_0203A134, 0, sizeof(*gUnknown_0203A134));
+ memset(sMailRead, 0, sizeof(*sMailRead));
ResetPaletteFade();
UnsetBgTilemapBuffer(0);
UnsetBgTilemapBuffer(1);
ResetBgsAndClearDma3BusyFlags(0);
FreeAllWindowBuffers();
- free(gUnknown_0203A134);
- gUnknown_0203A134 = NULL;
+ FREE_AND_SET_NULL(sMailRead);
}
}
diff --git a/src/mail_data.c b/src/mail_data.c
new file mode 100644
index 000000000..ebb49febf
--- /dev/null
+++ b/src/mail_data.c
@@ -0,0 +1,203 @@
+#include "global.h"
+#include "mail.h"
+#include "constants/items.h"
+#include "pokemon.h"
+#include "pokemon_icon.h"
+#include "constants/species.h"
+#include "text.h"
+#include "international_string_util.h"
+
+void ClearMailData(void)
+{
+ u8 i;
+
+ for (i = 0; i < MAIL_COUNT; i++)
+ ClearMailStruct(&gSaveBlock1Ptr->mail[i]);
+}
+
+void ClearMailStruct(struct MailStruct *mail)
+{
+ s32 i;
+
+ for (i = 0; i < MAIL_WORDS_COUNT; i++)
+ mail->words[i] = 0xFFFF;
+
+ for (i = 0; i < PLAYER_NAME_LENGTH; i++)
+ mail->playerName[i] = EOS;
+
+ for (i = 0; i < 4; i++)
+ mail->trainerId[i] = 0;
+
+ mail->species = SPECIES_BULBASAUR;
+ mail->itemId = ITEM_NONE;
+}
+
+bool8 MonHasMail(struct Pokemon *mon)
+{
+ u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
+ if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 GiveMailToMon(struct Pokemon *mon, u16 itemId)
+{
+ u8 heldItem[2];
+ u8 id, i;
+ u16 species;
+ u32 personality;
+
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+
+ for (id = 0; id < PARTY_SIZE; id++)
+ {
+ if (gSaveBlock1Ptr->mail[id].itemId == 0)
+ {
+ for (i = 0; i < MAIL_WORDS_COUNT; i++)
+ gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF;
+
+ for (i = 0; i < PLAYER_NAME_LENGTH - 1; i++)
+ gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
+ gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
+ PadNameString(gSaveBlock1Ptr->mail[id].playerName, CHAR_SPACE);
+
+ for (i = 0; i < 4; i++)
+ gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+
+ species = GetBoxMonData(&mon->box, MON_DATA_SPECIES);
+ personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY);
+ gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality);
+ gSaveBlock1Ptr->mail[id].itemId = itemId;
+ SetMonData(mon, MON_DATA_MAIL, &id);
+ SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
+ return id;
+ }
+ }
+
+ return 0xFF;
+}
+
+u16 SpeciesToMailSpecies(u16 species, u32 personality)
+{
+ if (species == SPECIES_UNOWN)
+ {
+ u32 species = GetUnownLetterByPersonality(personality) + 30000;
+ return species;
+ }
+
+ return species;
+}
+
+u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer)
+{
+ u16 result;
+
+ if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT))
+ {
+ result = SPECIES_UNOWN;
+ *buffer = mailSpecies - 30000;
+ }
+ else
+ {
+ result = mailSpecies;
+ }
+
+ return result;
+}
+
+u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail)
+{
+ u8 heldItem[2];
+ u16 itemId = mail->itemId;
+ u8 mailId = GiveMailToMon(mon, itemId);
+
+ if (mailId == 0xFF)
+ return 0xFF;
+
+ gSaveBlock1Ptr->mail[mailId] = *mail;
+
+ SetMonData(mon, MON_DATA_MAIL, &mailId);
+
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+
+ SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
+
+ return mailId;
+}
+
+static bool32 DummyMailFunc(void)
+{
+ return FALSE;
+}
+
+void TakeMailFromMon(struct Pokemon *mon)
+{
+ u8 heldItem[2];
+ u8 mailId;
+
+ if (MonHasMail(mon))
+ {
+ mailId = GetMonData(mon, MON_DATA_MAIL);
+ gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
+ mailId = 0xFF;
+ heldItem[0] = ITEM_NONE;
+ heldItem[1] = ITEM_NONE << 8;
+ SetMonData(mon, MON_DATA_MAIL, &mailId);
+ SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
+ }
+}
+
+void ClearMailItemId(u8 mailId)
+{
+ gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
+}
+
+u8 TakeMailFromMon2(struct Pokemon *mon)
+{
+ u8 i;
+ u8 newHeldItem[2];
+ u8 newMailId;
+
+ newHeldItem[0] = ITEM_NONE;
+ newHeldItem[1] = ITEM_NONE << 8;
+ newMailId = 0xFF;
+
+ for (i = PARTY_SIZE; i < MAIL_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)
+ {
+ memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct));
+ gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE;
+ SetMonData(mon, MON_DATA_MAIL, &newMailId);
+ SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem);
+ return i;
+ }
+ }
+
+ return 0xFF;
+}
+
+bool8 ItemIsMail(u16 itemId)
+{
+ switch (itemId)
+ {
+ case ITEM_ORANGE_MAIL:
+ case ITEM_HARBOR_MAIL:
+ case ITEM_GLITTER_MAIL:
+ case ITEM_MECH_MAIL:
+ case ITEM_WOOD_MAIL:
+ case ITEM_WAVE_MAIL:
+ case ITEM_BEAD_MAIL:
+ case ITEM_SHADOW_MAIL:
+ case ITEM_TROPIC_MAIL:
+ case ITEM_DREAM_MAIL:
+ case ITEM_FAB_MAIL:
+ case ITEM_RETRO_MAIL:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
diff --git a/src/main.c b/src/main.c
index 665a4dd84..f04f9b61b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,50 +1,32 @@
#include "global.h"
-#include "main.h"
+#include "crt0.h"
+#include "malloc.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "librfu.h"
#include "m4a.h"
+#include "bg.h"
#include "rtc.h"
-#include "rng.h"
+#include "scanline_effect.h"
+#include "overworld.h"
+#include "play_time.h"
+#include "random.h"
#include "dma3.h"
#include "gba/flash_internal.h"
+#include "load_save.h"
+#include "gpu_regs.h"
+#include "agb_flash.h"
+#include "sound.h"
#include "battle.h"
+#include "battle_controllers.h"
+#include "text.h"
+#include "intro.h"
+#include "main.h"
-extern u16 GetGpuReg(u8);
-extern void SetGpuReg(u8, u16);
-extern void LinkVSync(void);
-extern void sub_800E174(void);
extern void sub_800B9B8(void);
-extern void InitGpuRegManager(void);
-extern void sub_800E6D0(void);
-extern void CheckForFlashMemory(void);
-extern void InitMapMusic(void);
-extern void ResetBgs(void);
-extern void SetDefaultFontsPointer(void);
-extern void InitHeap(void *heapStart, u32 heapSize); // malloc.h
-extern void rfu_REQ_stopMode(void);
-extern void rfu_waitREQComplete(void);
-extern bool32 sub_8087634(void);
-extern bool32 sub_80875C8(void);
-extern void ClearSpriteCopyRequests(void);
-extern void PlayTimeCounter_Update(void);
-extern void MapMusicMain(void);
-extern void EnableInterrupts(u16);
-extern void sub_8033648(void);
-extern u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
-extern void remove_some_task(void);
-
-extern struct SoundInfo gSoundInfo;
-extern u32 gFlashMemoryPresent;
-extern u32 IntrMain[];
-extern u8 gHeap[];
-extern struct SaveBlock2 gSaveblock2;
-extern struct PokemonStorage gPokemonStorage;
-extern u32 gBattleTypeFlags;
extern u8 gUnknown_03002748;
extern u32 *gUnknown_0203CF5C;
-void Timer3Intr(void);
-bool8 HandleLinkConnection(void);
-void c2_copyright_1(void);
-
static void VBlankIntr(void);
static void HBlankIntr(void);
static void VCountIntr(void);
@@ -79,19 +61,19 @@ const IntrFunc gIntrTableTemplate[] =
static u16 gUnknown_03000000;
-extern u16 gKeyRepeatStartDelay;
-extern u8 gUnknown_030022B4;
-extern struct Main gMain;
-extern u16 gKeyRepeatContinueDelay;
-extern u8 gSoftResetDisabled;
-extern IntrFunc gIntrTable[INTR_COUNT];
-extern bool8 gLinkVSyncDisabled;
-extern u32 IntrMain_Buffer[0x200];
-extern u8 gPcmDmaCounter;
+u16 gKeyRepeatStartDelay;
+bool8 gLinkTransferringData;
+struct Main gMain;
+u16 gKeyRepeatContinueDelay;
+bool8 gSoftResetDisabled;
+IntrFunc gIntrTable[INTR_COUNT];
+u8 gLinkVSyncDisabled;
+u32 IntrMain_Buffer[0x200];
+u8 gPcmDmaCounter;
-extern u16 gTrainerId;
+static EWRAM_DATA u16 gTrainerId = 0;
-EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL;
+//EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL;
static void UpdateLinkAndCallCallbacks(void);
static void InitMainCallbacks(void);
@@ -122,14 +104,14 @@ void AgbMain()
ClearDma3Requests();
ResetBgs();
SetDefaultFontsPointer();
- InitHeap(gHeap, 0x1C000);
+ InitHeap(gHeap, HEAP_SIZE);
gSoftResetDisabled = FALSE;
if (gFlashMemoryPresent != TRUE)
SetMainCallback2(NULL);
- gUnknown_030022B4 = 0;
+ gLinkTransferringData = FALSE;
gUnknown_03000000 = 0xFC0;
for (;;)
@@ -147,22 +129,22 @@ void AgbMain()
if (sub_8087634() == 1)
{
- gUnknown_030022B4 = 1;
+ gLinkTransferringData = TRUE;
UpdateLinkAndCallCallbacks();
- gUnknown_030022B4 = 0;
+ gLinkTransferringData = FALSE;
}
else
{
- gUnknown_030022B4 = 0;
+ gLinkTransferringData = FALSE;
UpdateLinkAndCallCallbacks();
if (sub_80875C8() == 1)
{
gMain.newKeys = 0;
ClearSpriteCopyRequests();
- gUnknown_030022B4 = 1;
+ gLinkTransferringData = TRUE;
UpdateLinkAndCallCallbacks();
- gUnknown_030022B4 = 0;
+ gLinkTransferringData = FALSE;
}
}
@@ -184,7 +166,7 @@ static void InitMainCallbacks(void)
gUnknown_0203CF5C = NULL;
gMain.vblankCounter2 = 0;
gMain.callback1 = NULL;
- SetMainCallback2(c2_copyright_1);
+ SetMainCallback2(CB2_InitCopyrightScreenAfterBootup);
gSaveBlock2Ptr = &gSaveblock2;
gPokemonStoragePtr = &gPokemonStorage;
}
@@ -332,14 +314,13 @@ void SetSerialCallback(IntrCallback callback)
}
extern void CopyBufferedValuesToGpuRegs(void);
-extern void ProcessDma3Requests(void);
static void VBlankIntr(void)
{
- if (gLinkVSyncDisabled != FALSE)
+ if (gWirelessCommType != 0)
+ RfuVSync();
+ else if (gLinkVSyncDisabled == FALSE)
LinkVSync();
- else if (gUnknown_03002748 == FALSE)
- sub_800B9B8();
gMain.vblankCounter1++;
@@ -426,7 +407,7 @@ void DoSoftReset(void)
{
REG_IME = 0;
m4aSoundVSyncOff();
- remove_some_task();
+ ScanlineEffect_Stop();
DmaStop(1);
DmaStop(2);
DmaStop(3);
diff --git a/src/main_menu.c b/src/main_menu.c
index 8608159c2..87673c9b2 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -1,15 +1,2005 @@
// Includes
#include "global.h"
+#include "battle_dome_cards.h"
+#include "bg.h"
+#include "constants/flags.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "field_effect.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "international_string_util.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "list_menu.h"
+#include "mystery_event_menu.h"
+#include "naming_screen.h"
+#include "option_menu.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokeball.h"
+#include "pokedex.h"
+#include "pokemon_3.h"
+#include "random.h"
+#include "rtc.h"
+#include "save.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string.h"
+#include "strings.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.h"
+#include "title_screen.h"
+#include "window.h"
// Static type declarations
// Static RAM declarations
-IWRAM_DATA u8 gUnknown_03000DD0;
+static EWRAM_DATA u8 gUnknown_02022D04 = 0;
+static EWRAM_DATA u16 sCurrItemAndOptionMenuCheck = 0;
+
+static IWRAM_DATA u8 gUnknown_03000DD0;
// Static ROM declarations
+u32 InitMainMenu(bool8);
+void Task_MainMenuCheckSaveFile(u8);
+void Task_MainMenuCheckBattery(u8);
+void Task_WaitForSaveFileErrorWindow(u8);
+void CreateMainMenuErrorWindow(const u8*);
+static void ClearMainMenuWindowTilemap(const struct WindowTemplate*);
+void Task_DisplayMainMenu(u8);
+void Task_WaitForBatteryDryErrorWindow(u8);
+void fmt_savegame(void);
+void HighlightSelectedMainMenuItem(u8, u8, s16);
+void Task_HandleMainMenuInput(u8);
+void Task_HandleMainMenuAPressed(u8);
+void Task_HandleMainMenuBPressed(u8);
+void task_new_game_prof_birch_speech_1(u8);
+void Task_DisplayMainMenuInvalidActionError(u8);
+void AddBirchSpeechObjects(u8);
+void task_new_game_prof_birch_speech_2(u8);
+void sub_8031BAC(u8, u8);
+void sub_8031D34(u8, u8);
+void task_new_game_prof_birch_speech_3(u8);
+void unknown_rbox_to_vram(u8, u8);
+void sub_8032318(u8);
+void task_new_game_prof_birch_speech_4(u8);
+void task_new_game_prof_birch_speech_5(u8);
+void sub_80323A0(struct TextSubPrinter *printer, u16 a);
+void task_new_game_prof_birch_speech_6(u8);
+void sub_8030B14(u8);
+void task_new_game_prof_birch_speech_7(u8);
+void sub_8031ACC(u8, u8);
+void sub_8031C88(u8, u8);
+void task_new_game_prof_birch_speech_8(u8);
+void task_new_game_prof_birch_speech_9(u8);
+void task_new_game_prof_birch_speech_10(u8);
+void task_new_game_prof_birch_speech_11(u8);
+void LoadMainMenuWindowFrameTiles(u8, u16);
+void DrawMainMenuWindowBorder(const struct WindowTemplate*, u16);
+void Task_HighlightSelectedMainMenuItem(u8);
+void task_new_game_prof_birch_speech_12(u8);
+void task_new_game_prof_birch_speech_13(u8);
+void sub_8031D74(void);
+s8 sub_8031DB4(void);
+void sub_80322E0(u8, u8);
+void task_new_game_prof_birch_speech_14(u8);
+void sub_8030ED4(u8);
+void sub_8030F7C(u8);
+void task_new_game_prof_birch_speech_15(u8);
+void task_new_game_prof_birch_speech_16(u8);
+void task_new_game_prof_birch_speech_17(u8);
+void new_game_prof_birch_speech_part2_start(void);
+void set_default_player_name(u8);
+void task_new_game_prof_birch_speech_part2_3(u8);
+void task_new_game_prof_birch_speech_part2_4(u8);
+void sub_80323CC(u8, u8, u16, u16, u8, u8);
+void task_new_game_prof_birch_speech_part2_5(u8);
+void task_new_game_prof_birch_speech_part2_6(u8);
+void task_new_game_prof_birch_speech_part2_7(u8);
+void task_new_game_prof_birch_speech_part2_8(u8);
+void task_new_game_prof_birch_speech_part2_9(u8);
+void sub_80318D8(struct Sprite*);
+void task_new_game_prof_birch_speech_part2_10(u8);
+void task_new_game_prof_birch_speech_part2_11(u8);
+void task_new_game_prof_birch_speech_part2_12(u8);
+void nullsub_11();
+void task_new_game_prof_birch_speech_part2_1(u8);
+void fmt_time(void);
+void fmt_pokedex(void);
+void fmt_player(void);
+void fmt_badges(void);
+void sub_8032474(u8, u8, u8, u8, u8, u8);
+
// .rodata
+const u16 gUnknown_082FECFC[][16] = {
+ INCBIN_U16("graphics/birch_speech/bg0.gbapal"),
+ INCBIN_U16("graphics/birch_speech/bg1.gbapal")
+};
+
+const u8 gBirchIntroShadowGfx[] = INCBIN_U8("graphics/birch_speech/shadow.4bpp.lz");
+const u8 gUnknown_082FEEF0[] = INCBIN_U8("graphics/birch_speech/map.bin.lz");
+const u16 gUnknown_082FF018[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal");
+const u16 gUnknown_082FF028[] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+const struct WindowTemplate sWindowTemplates_NoSavedGame[] = {
+ {0, 2, 1, 26, 2, 15, 1},
+ {0, 2, 5, 26, 2, 15, 0x35}
+};
+
+const struct WindowTemplate sWindowTemplates_HasSavedGame[] = {
+ {0, 2, 1, 26, 6, 15, 1},
+ {0, 2, 9, 26, 2, 15, 0x9D},
+ {0, 2, 13, 26, 2, 15, 0xD1},
+ {0, 2, 17, 26, 2, 15, 0x105},
+ {0, 2, 21, 26, 2, 15, 0x139}
+};
+
+const struct WindowTemplate sWindowTemplate_ErrorWindow[] = {
+ {0, 2, 15, 26, 4, 15, 0x16D},
+ {0xFF, 0, 0, 0, 0, 0, 0}
+};
+
+const struct WindowTemplate gUnknown_082FF080[] = {
+ {0, 2, 15, 27, 4, 15, 1},
+ {0, 3, 5, 6, 4, 15, 0x6D},
+ {0, 3, 2, 9, 10, 15, 0x85},
+ {0xFF, 0, 0, 0, 0, 0, 0}
+};
+
+const u16 gMainMenuBgPal[] = INCBIN_U16("graphics/misc/main_menu_bg.gbapal");
+const u16 gMainMenuTextPal[] = INCBIN_U16("graphics/misc/main_menu_text.gbapal");
+
+const u8 gTextColor_Headers[] = {10, 11, 12};
+const u8 gUnknown_082FF0E3[] = {10, 1, 12};
+
+const struct BgTemplate gUnknown_082FF0E8[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 7,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+const struct BgTemplate gUnknown_082FF0F0 = {
+ .bg = 0,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+};
+
+const struct ScrollArrowsTemplate sScrollArrowsTemplate_MainMenu = {2, 0x78, 8, 3, 0x78, 0x98, 3, 4, 1, 1, 0};
+
+const union AffineAnimCmd gUnknown_082FF104[] = {
+ AFFINEANIMCMD_FRAME(-2, -2, 0, 0x30),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gUnknown_082FF114 = gUnknown_082FF104;
+
+const struct MenuAction gUnknown_082FF118[] = {
+ {gText_BirchBoy, NULL},
+ {gText_BirchGirl, NULL}
+};
+
+const u8 *const gMalePresetNames[] = {
+ gText_DefaultNameStu,
+ gText_DefaultNameMilton,
+ gText_DefaultNameTom,
+ gText_DefaultNameKenny,
+ gText_DefaultNameReid,
+ gText_DefaultNameJude,
+ gText_DefaultNameJaxson,
+ gText_DefaultNameEaston,
+ gText_DefaultNameWalker,
+ gText_DefaultNameTeru,
+ gText_DefaultNameJohnny,
+ gText_DefaultNameBrett,
+ gText_DefaultNameSeth,
+ gText_DefaultNameTerry,
+ gText_DefaultNameCasey,
+ gText_DefaultNameDarren,
+ gText_DefaultNameLandon,
+ gText_DefaultNameCollin,
+ gText_DefaultNameStanley,
+ gText_DefaultNameQuincy
+};
+
+const u8 *const gFemalePresetNames[] = {
+ gText_DefaultNameKimmy,
+ gText_DefaultNameTiara,
+ gText_DefaultNameBella,
+ gText_DefaultNameJayla,
+ gText_DefaultNameAllie,
+ gText_DefaultNameLianna,
+ gText_DefaultNameSara,
+ gText_DefaultNameMonica,
+ gText_DefaultNameCamila,
+ gText_DefaultNameAubree,
+ gText_DefaultNameRuthie,
+ gText_DefaultNameHazel,
+ gText_DefaultNameNadine,
+ gText_DefaultNameTanja,
+ gText_DefaultNameYasmin,
+ gText_DefaultNameNicola,
+ gText_DefaultNameLillie,
+ gText_DefaultNameTerra,
+ gText_DefaultNameLucy,
+ gText_DefaultNameHalie
+};
+
// .text
+
+enum
+{
+ HAS_NO_SAVED_GAME, //NEW GAME, OPTION
+ HAS_SAVED_GAME, //CONTINUE, NEW GAME, OPTION
+ HAS_MYSTERY_GIFT, //CONTINUE, NEW GAME, MYSTERY EVENTS, OPTION
+ HAS_MYSTERY_EVENTS,
+};
+
+enum {
+ ACTION_NEW_GAME,
+ ACTION_CONTINUE,
+ ACTION_OPTIONS,
+ ACTION_MYSTERY_GIFT,
+ ACTION_MYSTERY_EVENTS,
+ ACTION_UNKNOWN, // TODO: change when rom_8011DC0 decompiled
+ ACTION_INVALID
+};
+
+#define MAIN_MENU_BORDER_TILE 0x1D5
+
+void CB2_MainMenu(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void VBlankCB_MainMenu(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_InitMainMenu(void)
+{
+ InitMainMenu(FALSE);
+}
+
+void CB2_ReinitMainMenu(void)
+{
+ InitMainMenu(TRUE);
+}
+
+u32 InitMainMenu(bool8 returningFromOptionsMenu)
+{
+ SetVBlankCallback(NULL);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+
+ ResetPaletteFade();
+ LoadPalette(gMainMenuBgPal, 0, 32);
+ LoadPalette(gMainMenuTextPal, 0xF0, 32);
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ if (returningFromOptionsMenu)
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0x0000); // fade to black
+ else
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); // fade to white
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_082FF0E8, 2);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ InitWindows(sWindowTemplates_NoSavedGame);
+ DeactivateAllTextPrinters();
+ LoadMainMenuWindowFrameTiles(0, MAIN_MENU_BORDER_TILE);
+
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+
+ EnableInterrupts(1);
+ SetVBlankCallback(VBlankCB_MainMenu);
+ SetMainCallback2(CB2_MainMenu);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ HideBg(1);
+ CreateTask(Task_MainMenuCheckSaveFile, 0);
+
+ return 0;
+}
+
+#define tMenuType data[0]
+#define tCurrItem data[1]
+#define tItemCount data[12]
+#define tScrollArrowTaskId data[13]
+#define tIsScrolled data[14]
+#define tWirelessAdapterConnected data[15]
+
+#define tArrowTaskIsScrolled data[15] // For scroll indicator arrow task
+
+void Task_MainMenuCheckSaveFile(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (!gPaletteFade.active)
+ {
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_DARKEN | BLDCNT_TGT1_BG0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 7);
+
+ if (IsWirelessAdapterConnected())
+ tWirelessAdapterConnected = TRUE;
+ switch (gSaveFileStatus)
+ {
+ case 1:
+ tMenuType = HAS_SAVED_GAME;
+ if (IsMysteryGiftEnabled())
+ tMenuType++;
+ gTasks[taskId].func = Task_MainMenuCheckBattery;
+ break;
+ case 2:
+ CreateMainMenuErrorWindow(gText_SaveFileErased);
+ tMenuType = HAS_NO_SAVED_GAME;
+ gTasks[taskId].func = Task_WaitForSaveFileErrorWindow;
+ break;
+ case 0xFF:
+ CreateMainMenuErrorWindow(gText_SaveFileCorrupted);
+ gTasks[taskId].func = Task_WaitForSaveFileErrorWindow;
+ tMenuType = HAS_SAVED_GAME;
+ if (IsMysteryGiftEnabled() == TRUE)
+ tMenuType++;
+ break;
+ case 0:
+ default:
+ tMenuType = HAS_NO_SAVED_GAME;
+ gTasks[taskId].func = Task_MainMenuCheckBattery;
+ break;
+ case 4:
+ CreateMainMenuErrorWindow(gJPText_No1MSubCircuit);
+ gTasks[taskId].tMenuType = HAS_NO_SAVED_GAME;
+ gTasks[taskId].func = Task_WaitForSaveFileErrorWindow;
+ break;
+ }
+ if (sCurrItemAndOptionMenuCheck & 0x8000) // are we returning from the options menu?
+ {
+ switch (tMenuType) // if so, highlight the OPTIONS item
+ {
+ case HAS_NO_SAVED_GAME:
+ case HAS_SAVED_GAME:
+ sCurrItemAndOptionMenuCheck = tMenuType + 1;
+ break;
+ case HAS_MYSTERY_GIFT:
+ sCurrItemAndOptionMenuCheck = 3;
+ break;
+ case HAS_MYSTERY_EVENTS:
+ sCurrItemAndOptionMenuCheck = 4;
+ break;
+ }
+ }
+ sCurrItemAndOptionMenuCheck &= 0x7FFF; // turn off the "returning from options menu" flag
+ tCurrItem = sCurrItemAndOptionMenuCheck;
+ tItemCount = tMenuType + 2;
+ }
+}
+
+void Task_WaitForSaveFileErrorWindow(u8 taskId)
+{
+ RunTextPrinters();
+ if (!IsTextPrinterActive(7) && (gMain.newKeys & A_BUTTON))
+ {
+ ClearWindowTilemap(7);
+ ClearMainMenuWindowTilemap(sWindowTemplate_ErrorWindow);
+ gTasks[taskId].func = Task_MainMenuCheckBattery;
+ }
+}
+
+void Task_MainMenuCheckBattery(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_DARKEN | BLDCNT_TGT1_BG0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 7);
+
+ if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK))
+ {
+ gTasks[taskId].func = Task_DisplayMainMenu;
+ }
+ else
+ {
+ CreateMainMenuErrorWindow(gText_BatteryRunDry);
+ gTasks[taskId].func = Task_WaitForBatteryDryErrorWindow;
+ }
+ }
+}
+
+void Task_WaitForBatteryDryErrorWindow(u8 taskId)
+{
+ RunTextPrinters();
+ if (!IsTextPrinterActive(7) && (gMain.newKeys & A_BUTTON))
+ {
+ ClearWindowTilemap(7);
+ ClearMainMenuWindowTilemap(sWindowTemplate_ErrorWindow);
+ gTasks[taskId].func = Task_DisplayMainMenu;
+ }
+}
+
+void Task_DisplayMainMenu(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ u16 palette;
+
+ if (!gPaletteFade.active)
+ {
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_DARKEN | BLDCNT_TGT1_BG0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 7);
+
+ palette = RGB_BLACK;
+ LoadPalette(&palette, 254, 2);
+
+ palette = RGB_WHITE;
+ LoadPalette(&palette, 250, 2);
+
+ palette = RGB(12, 12, 12);
+ LoadPalette(&palette, 251, 2);
+
+ palette = RGB(26, 26, 25);
+ LoadPalette(&palette, 252, 2);
+
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ {
+ palette = RGB(4, 16, 31);
+ LoadPalette(&palette, 241, 2);
+ }
+ else
+ {
+ palette = RGB(31, 3, 21);
+ LoadPalette(&palette, 241, 2);
+ }
+
+ switch (gTasks[taskId].tMenuType)
+ {
+ case HAS_NO_SAVED_GAME:
+ default:
+ FillWindowPixelBuffer(0, 0xAA);
+ FillWindowPixelBuffer(1, 0xAA);
+ box_print(0, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame);
+ box_print(1, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(0, 2);
+ CopyWindowToVram(1, 2);
+ DrawMainMenuWindowBorder(&sWindowTemplates_NoSavedGame[0], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_NoSavedGame[1], MAIN_MENU_BORDER_TILE);
+ break;
+ case HAS_SAVED_GAME:
+ FillWindowPixelBuffer(2, 0xAA);
+ FillWindowPixelBuffer(3, 0xAA);
+ FillWindowPixelBuffer(4, 0xAA);
+ box_print(2, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuContinue);
+ box_print(3, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame);
+ box_print(4, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption);
+ fmt_savegame();
+ PutWindowTilemap(2);
+ PutWindowTilemap(3);
+ PutWindowTilemap(4);
+ CopyWindowToVram(2, 2);
+ CopyWindowToVram(3, 2);
+ CopyWindowToVram(4, 2);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[0], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[1], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[2], MAIN_MENU_BORDER_TILE);
+ break;
+ case HAS_MYSTERY_GIFT:
+ FillWindowPixelBuffer(2, 0xAA);
+ FillWindowPixelBuffer(3, 0xAA);
+ FillWindowPixelBuffer(4, 0xAA);
+ FillWindowPixelBuffer(5, 0xAA);
+ box_print(2, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuContinue);
+ box_print(3, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame);
+ box_print(4, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuMysteryGift);
+ box_print(5, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption);
+ fmt_savegame();
+ PutWindowTilemap(2);
+ PutWindowTilemap(3);
+ PutWindowTilemap(4);
+ PutWindowTilemap(5);
+ CopyWindowToVram(2, 2);
+ CopyWindowToVram(3, 2);
+ CopyWindowToVram(4, 2);
+ CopyWindowToVram(5, 2);
+ DrawMainMenuWindowBorder(sWindowTemplates_HasSavedGame, MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[1], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[2], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[3], MAIN_MENU_BORDER_TILE);
+ break;
+ case HAS_MYSTERY_EVENTS:
+ FillWindowPixelBuffer(2, 0xAA);
+ FillWindowPixelBuffer(3, 0xAA);
+ FillWindowPixelBuffer(4, 0xAA);
+ FillWindowPixelBuffer(5, 0xAA);
+ FillWindowPixelBuffer(6, 0xAA);
+ box_print(2, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuContinue);
+ box_print(3, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame);
+ box_print(4, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuMysteryGift2);
+ box_print(5, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuMysteryEvents);
+ box_print(6, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption);
+ fmt_savegame();
+ PutWindowTilemap(2);
+ PutWindowTilemap(3);
+ PutWindowTilemap(4);
+ PutWindowTilemap(5);
+ PutWindowTilemap(6);
+ CopyWindowToVram(2, 2);
+ CopyWindowToVram(3, 2);
+ CopyWindowToVram(4, 2);
+ CopyWindowToVram(5, 2);
+ CopyWindowToVram(6, 2);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[0], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[1], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[2], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[3], MAIN_MENU_BORDER_TILE);
+ DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[4], MAIN_MENU_BORDER_TILE);
+ tScrollArrowTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_MainMenu, &sCurrItemAndOptionMenuCheck);
+ gTasks[tScrollArrowTaskId].func = Task_ScrollIndicatorArrowPairOnMainMenu;
+ if (sCurrItemAndOptionMenuCheck == 4)
+ {
+ ChangeBgY(0, 0x2000, 1);
+ ChangeBgY(1, 0x2000, 1);
+ tIsScrolled = TRUE;
+ gTasks[tScrollArrowTaskId].tArrowTaskIsScrolled = TRUE;
+ }
+ break;
+ }
+ gTasks[taskId].func = Task_HighlightSelectedMainMenuItem;
+ }
+}
+
+void Task_HighlightSelectedMainMenuItem(u8 taskId)
+{
+ HighlightSelectedMainMenuItem(gTasks[taskId].tMenuType, gTasks[taskId].tCurrItem, gTasks[taskId].tIsScrolled);
+ gTasks[taskId].func = Task_HandleMainMenuInput;
+}
+
+bool8 HandleMainMenuInput(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ IsWirelessAdapterConnected(); // why bother calling this here? debug? Task_HandleMainMenuAPressed will check too
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = Task_HandleMainMenuAPressed;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA);
+ SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0xA0);
+ gTasks[taskId].func = Task_HandleMainMenuBPressed;
+ }
+ else if ((gMain.newKeys & DPAD_UP) && tCurrItem > 0)
+ {
+ if (tMenuType == HAS_MYSTERY_EVENTS && tIsScrolled == TRUE && tCurrItem == 1)
+ {
+ ChangeBgY(0, 0x2000, 2);
+ ChangeBgY(1, 0x2000, 2);
+ gTasks[tScrollArrowTaskId].tArrowTaskIsScrolled = tIsScrolled = FALSE;
+ }
+ tCurrItem--;
+ sCurrItemAndOptionMenuCheck = tCurrItem;
+ return TRUE;
+ }
+ else if ((gMain.newKeys & DPAD_DOWN) && tCurrItem < tItemCount - 1)
+ {
+ if (tMenuType == HAS_MYSTERY_EVENTS && tCurrItem == 3 && tIsScrolled == FALSE)
+ {
+ ChangeBgY(0, 0x2000, 1);
+ ChangeBgY(1, 0x2000, 1);
+ gTasks[tScrollArrowTaskId].tArrowTaskIsScrolled = tIsScrolled = TRUE;
+ }
+ tCurrItem++;
+ sCurrItemAndOptionMenuCheck = tCurrItem;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void Task_HandleMainMenuInput(u8 taskId)
+{
+ if (HandleMainMenuInput(taskId))
+ gTasks[taskId].func = Task_HighlightSelectedMainMenuItem;
+}
+
+void Task_HandleMainMenuAPressed(u8 taskId)
+{
+ bool8 wirelessAdapterConnected;
+ u8 action;
+
+ if (!gPaletteFade.active)
+ {
+ if (gTasks[taskId].tMenuType == HAS_MYSTERY_EVENTS)
+ RemoveScrollIndicatorArrowPair(gTasks[taskId].tScrollArrowTaskId);
+ sub_819746C(0, 1);
+ sub_819746C(1, 1);
+ sub_819746C(2, 1);
+ sub_819746C(3, 1);
+ sub_819746C(4, 1);
+ sub_819746C(5, 1);
+ sub_819746C(6, 1);
+ sub_819746C(7, 1);
+ wirelessAdapterConnected = IsWirelessAdapterConnected();
+ switch (gTasks[taskId].tMenuType)
+ {
+ case HAS_NO_SAVED_GAME:
+ default:
+ switch (gTasks[taskId].tCurrItem)
+ {
+ case 0:
+ default:
+ action = ACTION_NEW_GAME;
+ break;
+ case 1:
+ action = ACTION_OPTIONS;
+ break;
+ }
+ break;
+ case HAS_SAVED_GAME:
+ switch (gTasks[taskId].tCurrItem)
+ {
+ case 0:
+ default:
+ action = ACTION_CONTINUE;
+ break;
+ case 1:
+ action = ACTION_NEW_GAME;
+ break;
+ case 2:
+ action = ACTION_OPTIONS;
+ break;
+ }
+ break;
+ case HAS_MYSTERY_GIFT:
+ switch (gTasks[taskId].tCurrItem)
+ {
+ case 0:
+ default:
+ action = ACTION_CONTINUE;
+ break;
+ case 1:
+ action = ACTION_NEW_GAME;
+ break;
+ case 2:
+ action = ACTION_MYSTERY_GIFT;
+ if (!wirelessAdapterConnected)
+ {
+ action = ACTION_INVALID;
+ gTasks[taskId].tMenuType = 0;
+ }
+ break;
+ case 3:
+ action = ACTION_OPTIONS;
+ break;
+ }
+ break;
+ case HAS_MYSTERY_EVENTS:
+ switch (gTasks[taskId].tCurrItem)
+ {
+ case 0:
+ default:
+ action = ACTION_CONTINUE;
+ break;
+ case 1:
+ action = ACTION_NEW_GAME;
+ break;
+ case 2:
+ if (gTasks[taskId].tWirelessAdapterConnected)
+ {
+ action = ACTION_MYSTERY_GIFT;
+ if (!wirelessAdapterConnected)
+ {
+ action = ACTION_INVALID;
+ gTasks[taskId].tMenuType = 0;
+ }
+ }
+ else if (wirelessAdapterConnected)
+ {
+ action = ACTION_INVALID;
+ gTasks[taskId].tMenuType = 1;
+ }
+ else
+ {
+ action = ACTION_UNKNOWN;
+ }
+ break;
+ case 3:
+ if (wirelessAdapterConnected)
+ {
+ action = ACTION_INVALID;
+ gTasks[taskId].tMenuType = 2;
+ }
+ else
+ {
+ action = ACTION_MYSTERY_EVENTS;
+ }
+ break;
+ case 4:
+ action = ACTION_OPTIONS;
+ break;
+ }
+ break;
+ }
+ ChangeBgY(0, 0, 0);
+ ChangeBgY(1, 0, 0);
+ switch (action)
+ {
+ case ACTION_NEW_GAME:
+ default:
+ gPlttBufferUnfaded[0] = RGB_BLACK;
+ gPlttBufferFaded[0] = RGB_BLACK;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_1;
+ break;
+ case ACTION_CONTINUE:
+ gPlttBufferUnfaded[0] = RGB_BLACK;
+ gPlttBufferFaded[0] = RGB_BLACK;
+ SetMainCallback2(CB2_ContinueSavedGame);
+ DestroyTask(taskId);
+ break;
+ case ACTION_OPTIONS:
+ gMain.savedCallback = CB2_ReinitMainMenu;
+ SetMainCallback2(CB2_InitOptionMenu);
+ DestroyTask(taskId);
+ break;
+ case ACTION_MYSTERY_GIFT:
+ SetMainCallback2(c2_mystery_gift);
+ DestroyTask(taskId);
+ break;
+ case ACTION_MYSTERY_EVENTS:
+ SetMainCallback2(CB2_InitMysteryEventMenu);
+ DestroyTask(taskId);
+ break;
+ case ACTION_UNKNOWN:
+ SetMainCallback2(sub_801867C);
+ DestroyTask(taskId);
+ break;
+ case ACTION_INVALID:
+ gTasks[taskId].tCurrItem = 0;
+ gTasks[taskId].func = Task_DisplayMainMenuInvalidActionError;
+ gPlttBufferUnfaded[0xF1] = RGB_WHITE;
+ gPlttBufferFaded[0xF1] = RGB_WHITE;
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ return;
+ }
+ FreeAllWindowBuffers();
+ if (action != ACTION_OPTIONS)
+ sCurrItemAndOptionMenuCheck = 0;
+ else
+ sCurrItemAndOptionMenuCheck |= 0x8000; // entering the options menu
+ }
+}
+
+void Task_HandleMainMenuBPressed(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gTasks[taskId].tMenuType == 3)
+ RemoveScrollIndicatorArrowPair(gTasks[taskId].tScrollArrowTaskId);
+ sCurrItemAndOptionMenuCheck = 0;
+ FreeAllWindowBuffers();
+ SetMainCallback2(CB2_InitTitleScreen);
+ DestroyTask(taskId);
+ }
+}
+
+void Task_DisplayMainMenuInvalidActionError(u8 taskId)
+{
+ switch (gTasks[taskId].tCurrItem)
+ {
+ case 0:
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ switch (gTasks[taskId].tMenuType)
+ {
+ case 0:
+ CreateMainMenuErrorWindow(gText_WirelessNotConnected);
+ break;
+ case 1:
+ CreateMainMenuErrorWindow(gText_MysteryGiftCantUse);
+ break;
+ case 2:
+ CreateMainMenuErrorWindow(gText_MysteryEventsCantUse);
+ break;
+ }
+ gTasks[taskId].tCurrItem++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ gTasks[taskId].tCurrItem++;
+ break;
+ case 2:
+ RunTextPrinters();
+ if (!IsTextPrinterActive(7))
+ gTasks[taskId].tCurrItem++;
+ break;
+ case 3:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = Task_HandleMainMenuBPressed;
+ }
+ }
+}
+
+#undef tMenuType
+#undef tCurrItem
+#undef tItemCount
+#undef tScrollArrowTaskId
+#undef tIsScrolled
+#undef tWirelessAdapterConnected
+
+#undef tArrowTaskIsScrolled
+
+void HighlightSelectedMainMenuItem(u8 menuType, u8 selectedMenuItem, s16 isScrolled)
+{
+ SetGpuReg(REG_OFFSET_WIN0H, WINHV_COORDS(9, 231));
+
+ switch (menuType)
+ {
+ case HAS_NO_SAVED_GAME:
+ default:
+ switch (selectedMenuItem)
+ {
+ case 0:
+ default:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 31));
+ break;
+ case 1:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(33, 63));
+ break;
+ }
+ break;
+ case HAS_SAVED_GAME:
+ switch (selectedMenuItem)
+ {
+ case 0:
+ default:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 63));
+ break;
+ case 1:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95));
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127));
+ break;
+ }
+ break;
+ case HAS_MYSTERY_GIFT:
+ switch (selectedMenuItem)
+ {
+ case 0:
+ default:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 63));
+ break;
+ case 1:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95));
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127));
+ break;
+ case 3:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(129, 159));
+ break;
+ }
+ break;
+ case HAS_MYSTERY_EVENTS:
+ switch (selectedMenuItem)
+ {
+ case 0:
+ default:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 63));
+ break;
+ case 1:
+ if (isScrolled)
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(33, 63));
+ else
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95));
+ break;
+ case 2:
+ if (isScrolled)
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95));
+ else
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127));
+ break;
+ case 3:
+ if (isScrolled)
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127));
+ else
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(129, 159));
+ break;
+ case 4:
+ SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(129, 159));
+ break;
+ }
+ break;
+ }
+}
+
+void task_new_game_prof_birch_speech_1(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ InitBgFromTemplate(&gUnknown_082FF0F0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+
+ LZ77UnCompVram(gBirchIntroShadowGfx, (void*)VRAM);
+ LZ77UnCompVram(gUnknown_082FEEF0, (void*)(VRAM + 0x3800));
+ LoadPalette(gUnknown_082FECFC, 0, 64);
+ LoadPalette(gUnknown_082FF028, 1, 16);
+ ScanlineEffect_Stop();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ dp13_810BB8C();
+ AddBirchSpeechObjects(taskId);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_2;
+ gTasks[taskId].data[2] = 0xFF;
+ gTasks[taskId].data[3] = 0xFF;
+ gTasks[taskId].data[7] = 0xD8;
+ PlayBGM(MUS_DOORO_X4);
+ ShowBg(0);
+ ShowBg(1);
+}
+
+void task_new_game_prof_birch_speech_2(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[7])
+ {
+ gTasks[taskId].data[7]--;
+ }
+ else
+ {
+ spriteId = gTasks[taskId].data[8];
+ gSprites[spriteId].pos1.x = 0x88;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gSprites[spriteId].oam.objMode = 1;
+ sub_8031BAC(taskId, 10);
+ sub_8031D34(taskId, 20);
+ gTasks[taskId].data[7] = 0x50;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_3;
+ }
+}
+
+void task_new_game_prof_birch_speech_3(u8 taskId)
+{
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[8]].oam.objMode = 0;
+ if (gTasks[taskId].data[7])
+ {
+ gTasks[taskId].data[7]--;
+ }
+ else
+ {
+ InitWindows(gUnknown_082FF080);
+ LoadMainMenuWindowFrameTiles(0, 0xF3);
+ LoadMessageBoxGfx(0, 0xFC, 0xF0);
+ unknown_rbox_to_vram(0, 1);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 2);
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_Welcome);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_4;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_4(u8 taskId)
+{
+ if (!gPaletteFade.active && !sub_8197224())
+ {
+ gTasks[taskId].func = task_new_game_prof_birch_speech_5;
+ StringExpandPlaceholders(gStringVar4, gText_ThisIsAPokemon);
+ AddTextPrinterWithCallbackForMessage(1, sub_80323A0);
+ gUnknown_03000DD0 = taskId;
+ }
+}
+
+void task_new_game_prof_birch_speech_5(u8 taskId)
+{
+ if (!sub_8197224())
+ {
+ StringExpandPlaceholders(gStringVar4, gText_Birch_MainSpeech);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_6;
+ }
+}
+
+void sub_8030A70(u8 taskId)
+{
+ u8 spriteId = gTasks[gUnknown_03000DD0].data[9];
+
+ gSprites[spriteId].pos1.x = 0x64;
+ gSprites[spriteId].pos1.y = 0x4B;
+ gSprites[spriteId].invisible = 0;
+ gSprites[spriteId].data[0] = 0;
+
+ CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.paletteNum, 0x70, 0x3A, 0, 0, 0x20, 0xFFFF, SPECIES_LOTAD);
+ gTasks[taskId].func = sub_8030B14;
+ gTasks[gUnknown_03000DD0].data[7] = 0;
+}
+
+void sub_8030B14(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite *sprite = &gSprites[gTasks[gUnknown_03000DD0].data[9]];
+
+ switch (data[0])
+ {
+ case 0:
+ if (sprite->callback == SpriteCallbackDummy)
+ {
+ sprite->oam.affineMode = 0;
+ goto _08030B98_inc_data0;
+ }
+ break;
+ case 1:
+ if (gTasks[gUnknown_03000DD0].data[7] >= 0x60)
+ {
+ DestroyTask(taskId);
+ if (gTasks[gUnknown_03000DD0].data[7] < 0x4000)
+ gTasks[gUnknown_03000DD0].data[7]++;
+ }
+ break;
+ _08030B98_inc_data0:
+ default:
+ data[0]++;
+ if (gTasks[gUnknown_03000DD0].data[7] < 0x4000)
+ gTasks[gUnknown_03000DD0].data[7]++;
+ break;
+ }
+}
+
+void task_new_game_prof_birch_speech_6(u8 taskId)
+{
+ if (!sub_8197224())
+ {
+ gUnknown_02022D04 = 0;
+ StringExpandPlaceholders(gStringVar4, gText_Birch_AndYouAre);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_7;
+ }
+}
+
+void task_new_game_prof_birch_speech_7(u8 taskId)
+{
+ if (!sub_8197224())
+ {
+ gSprites[gTasks[taskId].data[8]].oam.objMode = 1;
+ gSprites[gTasks[taskId].data[9]].oam.objMode = 1;
+ sub_8031ACC(taskId, 2);
+ sub_8031C88(taskId, 1);
+ gTasks[taskId].data[7] = 0x40;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_8;
+ }
+}
+
+void task_new_game_prof_birch_speech_8(u8 taskId)
+{
+ if (gTasks[taskId].data[4] != -60)
+ {
+ gTasks[taskId].data[4] -= 2;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gTasks[taskId].data[4]);
+ }
+ else
+ {
+ gTasks[taskId].data[4] = -60;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_9;
+ }
+}
+
+void task_new_game_prof_birch_speech_9(u8 taskId)
+{
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[8]].invisible = 1;
+ gSprites[gTasks[taskId].data[9]].invisible = 1;
+ if (gTasks[taskId].data[7])
+ {
+ gTasks[taskId].data[7]--;
+ }
+ else
+ {
+ u8 spriteId = gTasks[taskId].data[10];
+
+ gSprites[spriteId].pos1.x = 0xB4;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gSprites[spriteId].oam.objMode = 1;
+ gTasks[taskId].data[2] = spriteId;
+ gTasks[taskId].data[6] = 0;
+ sub_8031BAC(taskId, 2);
+ sub_8031D34(taskId, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_10;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_10(u8 taskId)
+{
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[2]].oam.objMode = 0;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_11;
+ }
+}
+
+void task_new_game_prof_birch_speech_11(u8 taskId)
+{
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_BoyOrGirl);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_12;
+}
+
+void task_new_game_prof_birch_speech_12(u8 taskId)
+{
+ if (!sub_8197224())
+ {
+ sub_8031D74();
+ gTasks[taskId].func = task_new_game_prof_birch_speech_13;
+ }
+}
+
+void task_new_game_prof_birch_speech_13(u8 taskId)
+{
+ int gender = sub_8031DB4();
+ int r3;
+
+ switch (gender)
+ {
+ case MALE:
+ PlaySE(SE_SELECT);
+ gSaveBlock2Ptr->playerGender = gender;
+ sub_80322E0(1, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_14;
+ break;
+ case FEMALE:
+ PlaySE(SE_SELECT);
+ gSaveBlock2Ptr->playerGender = gender;
+ sub_80322E0(1, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_14;
+ break;
+ }
+ r3 = GetMenuCursorPos();
+ if (r3 != gTasks[taskId].data[6])
+ {
+ gTasks[taskId].data[6] = r3;
+ gSprites[gTasks[taskId].data[2]].oam.objMode = 1;
+ sub_8031ACC(taskId, 0);
+ gTasks[taskId].func = sub_8030ED4;
+ }
+}
+
+void sub_8030ED4(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[2];
+ if (gTasks[taskId].data[5] == 0)
+ {
+ gSprites[spriteId].pos1.x += 4;
+ }
+ else
+ {
+ gSprites[spriteId].invisible = 1;
+ if (gTasks[taskId].data[6])
+ spriteId = gTasks[taskId].data[11];
+ else
+ spriteId = gTasks[taskId].data[10];
+ gSprites[spriteId].pos1.x = 0xF0;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gTasks[taskId].data[2] = spriteId;
+ gSprites[spriteId].oam.objMode = 1;
+ sub_8031BAC(taskId, 0);
+ gTasks[taskId].func = sub_8030F7C;
+ }
+}
+
+void sub_8030F7C(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[2];
+
+ if (gSprites[spriteId].pos1.x > 0xB4)
+ {
+ gSprites[spriteId].pos1.x -= 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos1.x = 0xB4;
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[spriteId].oam.objMode = 0;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_13;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_14(u8 taskId)
+{
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_WhatsYourName);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_15;
+}
+
+void task_new_game_prof_birch_speech_15(u8 taskId)
+{
+ if (!sub_8197224())
+ gTasks[taskId].func = task_new_game_prof_birch_speech_16;
+}
+
+void task_new_game_prof_birch_speech_16(u8 taskId)
+{
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_17;
+ }
+}
+
+void task_new_game_prof_birch_speech_17(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ sub_818D820(gTasks[taskId].data[9]);
+ set_default_player_name(Random() % 20);
+ DestroyTask(taskId);
+ DoNamingScreen(0, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, new_game_prof_birch_speech_part2_start);
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_2(u8 taskId)
+{
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_SoItsPlayer);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_3;
+}
+
+void task_new_game_prof_birch_speech_part2_3(u8 taskId)
+{
+ if (!sub_8197224())
+ {
+ sub_80323CC(2, 1, 0xF3, 0xDF, 2, 15);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_4;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_4(u8 taskId)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ gSprites[gTasks[taskId].data[2]].oam.objMode = 1;
+ sub_8031ACC(taskId, 2);
+ sub_8031C88(taskId, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_5;
+ break;
+ case -1:
+ case 1:
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_11;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_5(u8 taskId)
+{
+ if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4] += 2;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gTasks[taskId].data[4]);
+ }
+ else
+ {
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_6;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_6(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[10]].invisible = TRUE;
+ gSprites[gTasks[taskId].data[11]].invisible = TRUE;
+ spriteId = gTasks[taskId].data[8];
+ gSprites[spriteId].pos1.x = 0x88;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = FALSE;
+ gSprites[spriteId].oam.objMode = 1;
+ spriteId = gTasks[taskId].data[9];
+ gSprites[spriteId].pos1.x = 0x64;
+ gSprites[spriteId].pos1.y = 0x4B;
+ gSprites[spriteId].invisible = FALSE;
+ gSprites[spriteId].oam.objMode = 1;
+ sub_8031BAC(taskId, 2);
+ sub_8031D34(taskId, 1);
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_YourePlayer);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_7;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_7(u8 taskId)
+{
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[8]].oam.objMode = 0;
+ gSprites[gTasks[taskId].data[9]].oam.objMode = 0;
+ if (!sub_8197224())
+ {
+ gSprites[gTasks[taskId].data[8]].oam.objMode = 1;
+ gSprites[gTasks[taskId].data[9]].oam.objMode = 1;
+ sub_8031ACC(taskId, 2);
+ sub_8031C88(taskId, 1);
+ gTasks[taskId].data[7] = 64;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_8;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_8(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[8]].invisible = 1;
+ gSprites[gTasks[taskId].data[9]].invisible = 1;
+ if (gTasks[taskId].data[7])
+ {
+ gTasks[taskId].data[7]--;
+ return;
+ }
+ if (gSaveBlock2Ptr->playerGender != MALE)
+ spriteId = gTasks[taskId].data[11];
+ else
+ spriteId = gTasks[taskId].data[10];
+ gSprites[spriteId].pos1.x = 0x78;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gSprites[spriteId].oam.objMode = 1;
+ gTasks[taskId].data[2] = spriteId;
+ sub_8031BAC(taskId, 2);
+ sub_8031D34(taskId, 1);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_AreYouReady);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_9;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_9(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[2]].oam.objMode = 0;
+ if (!sub_8197224())
+ {
+ spriteId = gTasks[taskId].data[2];
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].affineAnims = &gUnknown_082FF114;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ gSprites[spriteId].callback = sub_80318D8;
+ BeginNormalPaletteFade(0x0000FFFF, 0, 0, 16, RGB_BLACK);
+ FadeOutBGM(4);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_10;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_10(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[2];
+
+ if (gSprites[spriteId].affineAnimEnded)
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_11;
+}
+
+void task_new_game_prof_birch_speech_part2_11(u8 taskId)
+{
+ u8 spriteId;
+
+ if (!gPaletteFade.active)
+ {
+ spriteId = gTasks[taskId].data[2];
+ gSprites[spriteId].callback = nullsub_11;
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ BeginNormalPaletteFade(0xFFFF0000, 0, 0, 16, RGB_WHITEALPHA);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_12;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_12(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ sub_818D820(gTasks[taskId].data[9]);
+ dp13_810BB8C();
+ SetMainCallback2(CB2_NewGame);
+ DestroyTask(taskId);
+ }
+}
+
+void new_game_prof_birch_speech_part2_start(void)
+{
+ u8 taskId;
+ u8 spriteId;
+ u16 savedIme;
+
+ ResetBgsAndClearDma3BusyFlags(0);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ InitBgsFromTemplates(0, gUnknown_082FF0E8, 2);
+ InitBgFromTemplate(&gUnknown_082FF0F0);
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT, PLTT_SIZE);
+ ResetPaletteFade();
+ LZ77UnCompVram(gBirchIntroShadowGfx, (u8*)VRAM);
+ LZ77UnCompVram(gUnknown_082FEEF0, (u8*)(VRAM + 0x3800));
+ LoadPalette(gUnknown_082FECFC, 0, 64);
+ LoadPalette(&gUnknown_082FF018[1], 1, 16);
+ ResetTasks();
+ taskId = CreateTask(task_new_game_prof_birch_speech_part2_1, 0);
+ gTasks[taskId].data[7] = 5;
+ gTasks[taskId].data[4] = -60;
+ ScanlineEffect_Stop();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ dp13_810BB8C();
+ AddBirchSpeechObjects(taskId);
+ if (gSaveBlock2Ptr->playerGender != MALE)
+ {
+ gTasks[taskId].data[6] = FEMALE;
+ spriteId = gTasks[taskId].data[11];
+ }
+ else
+ {
+ gTasks[taskId].data[6] = MALE;
+ spriteId = gTasks[taskId].data[10];
+ }
+ gSprites[spriteId].pos1.x = 0xB4;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gTasks[taskId].data[2] = spriteId;
+ SetGpuReg(REG_OFFSET_BG1HOFS, -60);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ ShowBg(0);
+ ShowBg(1);
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= 1;
+ REG_IME = savedIme;
+ SetVBlankCallback(VBlankCB_MainMenu);
+ SetMainCallback2(CB2_MainMenu);
+ InitWindows(gUnknown_082FF080);
+ LoadMainMenuWindowFrameTiles(0, 0xF3);
+ LoadMessageBoxGfx(0, 0xFC, 0xF0);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+}
+
+void nullsub_11(struct Sprite *sprite)
+{
+}
+
+void sub_80318D8(struct Sprite *sprite)
+{
+ u32 y;
+
+ y = (sprite->pos1.y << 16) + sprite->data[0] + 0xC000;
+ sprite->pos1.y = y >> 16;
+ sprite->data[0] = y;
+}
+
+u8 sub_80318F4(u8 a, u8 b)
+{
+ return sub_818D3E4(SPECIES_LOTAD, 8, 0, 1, a, b, 14, -1);
+}
+
+void AddBirchSpeechObjects(u8 taskId)
+{
+ u8 spriteId = AddNewGameBirchObject(0x88, 0x3C, 1);
+ u8 spriteId2;
+ u8 spriteId3;
+ u8 spriteId4;
+
+ gSprites[spriteId].callback = nullsub_11;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].invisible = TRUE;
+ gTasks[taskId].data[8] = spriteId;
+ spriteId2 = sub_80318F4(100, 0x4B);
+ gSprites[spriteId2].callback = nullsub_11;
+ gSprites[spriteId2].oam.priority = 0;
+ gSprites[spriteId2].invisible = TRUE;
+ gTasks[taskId].data[9] = spriteId2;
+ spriteId3 = CreateTrainerSprite(FacilityClassToPicIndex(0x3C), 0x78, 0x3C, 0, gDecompressionBuffer);
+ gSprites[spriteId3].callback = nullsub_11;
+ gSprites[spriteId3].invisible = TRUE;
+ gSprites[spriteId3].oam.priority = 0;
+ gTasks[taskId].data[10] = spriteId3;
+ spriteId4 = CreateTrainerSprite(FacilityClassToPicIndex(0x3F), 0x78, 0x3C, 0, &gDecompressionBuffer[0x800]);
+ gSprites[spriteId4].callback = nullsub_11;
+ gSprites[spriteId4].invisible = TRUE;
+ gSprites[spriteId4].oam.priority = 0;
+ gTasks[taskId].data[11] = spriteId4;
+}
+
+void sub_8031A5C(u8 taskId)
+{
+ int alpha;
+
+ if (gTasks[taskId].data[1] == 0)
+ {
+ gTasks[gTasks[taskId].data[0]].data[5] = 1;
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]--;
+ gTasks[taskId].data[2]++;
+ alpha = gTasks[taskId].data[2] << 8;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1] + alpha);
+ }
+}
+
+void sub_8031ACC(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gTasks[taskId].data[5] = 0;
+ taskId2 = CreateTask(sub_8031A5C, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 16;
+ gTasks[taskId2].data[2] = 0;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031B3C(u8 taskId)
+{
+ int alpha;
+
+ if (gTasks[taskId].data[1] == 16)
+ {
+ gTasks[gTasks[taskId].data[0]].data[5] = 1;
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]++;
+ gTasks[taskId].data[2]--;
+ alpha = gTasks[taskId].data[2] << 8;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1] + alpha);
+ }
+}
+
+void sub_8031BAC(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gTasks[taskId].data[5] = 0;
+ taskId2 = CreateTask(sub_8031B3C, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 0;
+ gTasks[taskId2].data[2] = 16;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031C1C(u8 taskId)
+{
+ if (gTasks[taskId].data[2])
+ {
+ gTasks[taskId].data[2]--;
+ }
+ else if (gTasks[taskId].data[1] == 8)
+ {
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]++;
+ LoadPalette(&gUnknown_082FF018[gTasks[taskId].data[1]], 1, 16);
+ }
+}
+
+void sub_8031C88(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ taskId2 = CreateTask(sub_8031C1C, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 0;
+ gTasks[taskId2].data[2] = 8;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031CC8(u8 taskId)
+{
+ if (gTasks[taskId].data[2])
+ {
+ gTasks[taskId].data[2]--;
+ }
+ else if (gTasks[taskId].data[1] == 0)
+ {
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]--;
+ LoadPalette(&gUnknown_082FF018[gTasks[taskId].data[1]], 1, 16);
+ }
+}
+
+void sub_8031D34(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ taskId2 = CreateTask(sub_8031CC8, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 8;
+ gTasks[taskId2].data[2] = 8;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031D74(void)
+{
+ DrawMainMenuWindowBorder(&gUnknown_082FF080[1], 0xF3);
+ FillWindowPixelBuffer(1, 17);
+ PrintMenuTable(1, 2, gUnknown_082FF118);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(1, 2, 0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 3);
+}
+
+s8 sub_8031DB4(void)
+{
+ return ProcessMenuInputNoWrapAround();
+}
+
+void set_default_player_name(u8 nameId)
+{
+ const u8* name;
+ u8 i;
+
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ name = gMalePresetNames[nameId];
+ else
+ name = gFemalePresetNames[nameId];
+ for (i = 0; i < 7; i++)
+ gSaveBlock2Ptr->playerName[i] = name[i];
+ gSaveBlock2Ptr->playerName[7] = 0xFF;
+}
+
+void CreateMainMenuErrorWindow(const u8* str)
+{
+ FillWindowPixelBuffer(7, 17);
+ PrintTextOnWindow(7, 1, str, 0, 1, 2, 0);
+ PutWindowTilemap(7);
+ CopyWindowToVram(7, 2);
+ DrawMainMenuWindowBorder(sWindowTemplate_ErrorWindow, MAIN_MENU_BORDER_TILE);
+ SetGpuReg(REG_OFFSET_WIN0H, 0x9E7);
+ SetGpuReg(REG_OFFSET_WIN0V, 0x719F);
+}
+
+void fmt_savegame(void)
+{
+ fmt_time();
+ fmt_pokedex();
+ fmt_player();
+ fmt_badges();
+}
+
+void fmt_time(void)
+{
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuPlayer);
+ box_print(2, 1, 0, 17, gUnknown_082FF0E3, -1, gStringVar4);
+ box_print(2, 1, GetStringRightAlignXOffset(1, gSaveBlock2Ptr->playerName, 100), 17, gUnknown_082FF0E3, -1, gSaveBlock2Ptr->playerName);
+}
+
+void fmt_player(void)
+{
+ u8 str[0x20];
+ u8* ptr;
+
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuTime);
+ box_print(2, 1, 0x6C, 17, gUnknown_082FF0E3, -1, gStringVar4);
+ ptr = ConvertIntToDecimalStringN(str, gSaveBlock2Ptr->playTimeHours, 0, 3);
+ *ptr = 0xF0;
+ ConvertIntToDecimalStringN(ptr + 1, gSaveBlock2Ptr->playTimeMinutes, 2, 2);
+ box_print(2, 1, GetStringRightAlignXOffset(1, str, 0xD0), 17, gUnknown_082FF0E3, -1, str);
+}
+
+void fmt_pokedex(void)
+{
+ u8 str[0x20];
+ u16 dexCount;
+
+ if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
+ {
+ if (IsNationalPokedexEnabled())
+ dexCount = GetNationalPokedexCount(1);
+ else
+ dexCount = GetHoennPokedexCount(1);
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuPokedex);
+ box_print(2, 1, 0, 33, gUnknown_082FF0E3, -1, gStringVar4);
+ ConvertIntToDecimalStringN(str, dexCount, 0, 3);
+ box_print(2, 1, GetStringRightAlignXOffset(1, str, 100), 33, gUnknown_082FF0E3, -1, str);
+ }
+}
+
+void fmt_badges(void)
+{
+ u8 str[0x20];
+ u8 badgeCount = 0;
+ u32 i;
+
+ for (i = FLAG_BADGE01_GET; i <= FLAG_BADGE08_GET; i++)
+ {
+ if (FlagGet(i))
+ badgeCount++;
+ }
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuBadges);
+ box_print(2, 1, 0x6C, 33, gUnknown_082FF0E3, -1, gStringVar4);
+ ConvertIntToDecimalStringN(str, badgeCount, 2, 1);
+ box_print(2, 1, GetStringRightAlignXOffset(1, str, 0xD0), 33, gUnknown_082FF0E3, -1, str);
+}
+
+void LoadMainMenuWindowFrameTiles(u8 bgId, u16 tileOffset)
+{
+ LoadBgTiles(bgId, GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, tileOffset);
+ LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, 32, 32);
+}
+
+void DrawMainMenuWindowBorder(const struct WindowTemplate *template, u16 baseTileNum)
+{
+ u16 r9 = 1 + baseTileNum;
+ u16 r10 = 2 + baseTileNum;
+ u16 sp18 = 3 + baseTileNum;
+ u16 spC = 5 + baseTileNum;
+ u16 sp10 = 6 + baseTileNum;
+ u16 sp14 = 7 + baseTileNum;
+ u16 r6 = 8 + baseTileNum;
+
+ FillBgTilemapBufferRect(template->priority, baseTileNum, template->tilemapLeft - 1, template->tilemapTop - 1, 1, 1, 2);
+ FillBgTilemapBufferRect(template->priority, r9, template->tilemapLeft, template->tilemapTop - 1, template->width, 1, 2);
+ FillBgTilemapBufferRect(template->priority, r10, template->tilemapLeft + template->width, template->tilemapTop - 1, 1, 1, 2);
+ FillBgTilemapBufferRect(template->priority, sp18, template->tilemapLeft - 1, template->tilemapTop, 1, template->height, 2);
+ FillBgTilemapBufferRect(template->priority, spC, template->tilemapLeft + template->width, template->tilemapTop, 1, template->height, 2);
+ FillBgTilemapBufferRect(template->priority, sp10, template->tilemapLeft - 1, template->tilemapTop + template->height, 1, 1, 2);
+ FillBgTilemapBufferRect(template->priority, sp14, template->tilemapLeft, template->tilemapTop + template->height, template->width, 1, 2);
+ FillBgTilemapBufferRect(template->priority, r6, template->tilemapLeft + template->width, template->tilemapTop + template->height, 1, 1, 2);
+ CopyBgTilemapBufferToVram(template->priority);
+}
+
+static void ClearMainMenuWindowTilemap(const struct WindowTemplate *template)
+{
+ FillBgTilemapBufferRect(template->priority, 0, template->tilemapLeft - 1, template->tilemapTop - 1, template->tilemapLeft + template->width + 1, template->tilemapTop + template->height + 1, 2);
+ CopyBgTilemapBufferToVram(template->priority);
+}
+
+void sub_8032298(u8 a, u8 b, u8 c, u8 d, u8 e, u8 unused)
+{
+ FillBgTilemapBufferRect(a, 0, b + 0xFF, c + 0xFF, d + 2, e + 2, 2);
+}
+
+void sub_80322E0(u8 windowId, u8 a)
+{
+ CallWindowFunction(windowId, sub_8032298);
+ FillWindowPixelBuffer(windowId, 0x11);
+ ClearWindowTilemap(windowId);
+ if (a == 1)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8032318(u8 a)
+{
+ u8 fontAttribute = GetFontAttribute(1, FONTATTR_COLOR_BACKGROUND);
+ u8 fontAttribute2 = GetFontAttribute(1, FONTATTR_MAX_LETTER_WIDTH);
+ u8 fontAttribute3 = GetFontAttribute(1, FONTATTR_MAX_LETTER_HEIGHT);
+ u8 windowAttribute = GetWindowAttribute(a, WINDOW_WIDTH);
+ u8 windowAttribute2 = GetWindowAttribute(a, WINDOW_HEIGHT);
+
+ FillWindowPixelRect(a, fontAttribute, 0, 0, fontAttribute2 * windowAttribute, fontAttribute3 * windowAttribute2);
+ CopyWindowToVram(a, 2);
+}
+
+void sub_80323A0(struct TextSubPrinter *printer, u16 a)
+{
+ if (*(printer->current_text_offset - 2) == 8 && gUnknown_02022D04 == 0)
+ {
+ gUnknown_02022D04 = 1;
+ CreateTask(sub_8030A70, 0);
+ }
+}
+
+void sub_80323CC(u8 a, u8 b, u16 c, u16 d, u8 e, u8 f)
+{
+ struct WindowTemplate sp;
+
+ sp = sub_8198A50(0, a + 1, b + 1, 5, 4, f, d);
+ CreateYesNoMenu(&sp, c, e, 0);
+}
+
+void unknown_rbox_to_vram(u8 windowId, u8 a)
+{
+ CallWindowFunction(windowId, sub_8032474);
+ FillWindowPixelBuffer(windowId, 17);
+ PutWindowTilemap(windowId);
+ if (a == 1)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8032474 (u8 a, u8 b, u8 c, u8 d, u8 e, u8 f)
+{
+ FillBgTilemapBufferRect(a, 0xFD, b-2, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0xFF, b-1, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x100, b, c-1, d, 1, f);
+ FillBgTilemapBufferRect(a, 0x101, b+d-1, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x102, b+d, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x103, b-2, c, 1, 5, f);
+ FillBgTilemapBufferRect(a, 0x105, b-1, c, d+1, 5, f);
+ FillBgTilemapBufferRect(a, 0x106, b+d, c, 1, 5, f);
+ FillBgTilemapBufferRect(a, BG_TILE_V_FLIP(0xFD), b-2, c+e, 1, 1, f);
+ FillBgTilemapBufferRect(a, BG_TILE_V_FLIP(0xFF), b-1, c+e, 1, 1, f);
+ FillBgTilemapBufferRect(a, BG_TILE_V_FLIP(0x100), b, c+e, d-1, 1, f);
+ FillBgTilemapBufferRect(a, BG_TILE_V_FLIP(0x101), b+d-1, c+e, 1, 1, f);
+ FillBgTilemapBufferRect(a, BG_TILE_V_FLIP(0x102), b+d, c+e, 1, 1, f);
+}
+
+void task_new_game_prof_birch_speech_part2_1(u8 taskId)
+{
+ if (gTasks[taskId].data[7]-- <= 0)
+ {
+ unknown_rbox_to_vram(0, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_2;
+ }
+}
diff --git a/src/map_name_popup.c b/src/map_name_popup.c
new file mode 100644
index 000000000..578636d40
--- /dev/null
+++ b/src/map_name_popup.c
@@ -0,0 +1,474 @@
+#include "global.h"
+#include "constants/region_map_sections.h"
+#include "constants/weather.h"
+#include "bg.h"
+#include "event_data.h"
+#include "gpu_regs.h"
+#include "international_string_util.h"
+#include "menu.h"
+#include "map_name_popup.h"
+#include "palette.h"
+#include "region_map.h"
+#include "rom_818CFC8.h"
+#include "start_menu.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+
+
+// enums
+enum MapPopUp_Themes
+{
+ MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_MARBLE,
+ MAPPOPUP_THEME_STONE,
+ MAPPOPUP_THEME_BRICK,
+ MAPPOPUP_THEME_UNDERWATER,
+ MAPPOPUP_THEME_STONE2,
+};
+
+// static functions
+static void Task_MapNamePopUpWindow(u8 taskId);
+static void ShowMapNamePopUpWindow(void);
+static void LoadMapNamePopUpWindowBg(void);
+
+// EWRAM
+static EWRAM_DATA u8 mapNamePopupTaskId = 0;
+
+// .rodata
+static const u8 gMapPopUp_Table[][960] =
+{
+ INCBIN_U8("graphics/interface/map_popup/wood.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/marble.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/stone.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/brick.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/underwater.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/stone2.4bpp"),
+};
+
+static const u8 gMapPopUp_Outline_Table[][960] =
+{
+ INCBIN_U8("graphics/interface/map_popup/wood_outline.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/marble_outline.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/stone_outline.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/brick_outline.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/underwater_outline.4bpp"),
+ INCBIN_U8("graphics/interface/map_popup/stone2_outline.4bpp"),
+};
+
+static const u16 gMapPopUp_Palette_Table[][16] =
+{
+ INCBIN_U16("graphics/interface/map_popup/wood.gbapal"),
+ INCBIN_U16("graphics/interface/map_popup/marble_outline.gbapal"),
+ INCBIN_U16("graphics/interface/map_popup/stone_outline.gbapal"),
+ INCBIN_U16("graphics/interface/map_popup/brick_outline.gbapal"),
+ INCBIN_U16("graphics/interface/map_popup/underwater_outline.gbapal"),
+ INCBIN_U16("graphics/interface/map_popup/stone2_outline.gbapal"),
+};
+
+static const u16 gUnknown_0857F444[16] = INCBIN_U16("graphics/interface/map_popup/857F444.gbapal");
+
+static const u8 gRegionMapSectionId_To_PopUpThemeIdMapping[] =
+{
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_BRICK,
+ MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK,
+ MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER,
+ MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_UNDERWATER,
+ MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER,
+ MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER,
+ MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2,
+ MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_STONE,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_MARBLE,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD,
+ MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2,
+ MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_MARBLE
+};
+
+static const u8 gText_PyramidFloor1[] = _("PYRAMID FLOOR 1");
+static const u8 gText_PyramidFloor2[] = _("PYRAMID FLOOR 2");
+static const u8 gText_PyramidFloor3[] = _("PYRAMID FLOOR 3");
+static const u8 gText_PyramidFloor4[] = _("PYRAMID FLOOR 4");
+static const u8 gText_PyramidFloor5[] = _("PYRAMID FLOOR 5");
+static const u8 gText_PyramidFloor6[] = _("PYRAMID FLOOR 6");
+static const u8 gText_PyramidFloor7[] = _("PYRAMID FLOOR 7");
+static const u8 gText_Pyramid[] = _("PYRAMID");
+
+static const u8 * const gBattlePyramid_MapHeaderStrings[] =
+{
+ gText_PyramidFloor1,
+ gText_PyramidFloor2,
+ gText_PyramidFloor3,
+ gText_PyramidFloor4,
+ gText_PyramidFloor5,
+ gText_PyramidFloor6,
+ gText_PyramidFloor7,
+ gText_Pyramid,
+};
+
+// text
+bool8 sub_80D47D4(void)
+{
+ HideStartMenu();
+ ShowMapNamePopup();
+ return 1;
+}
+
+void ShowMapNamePopup(void)
+{
+ if (FlagGet(FLAG_SPECIAL_FLAG_0x4000) != TRUE)
+ {
+ if (!FuncIsActiveTask(Task_MapNamePopUpWindow))
+ {
+ mapNamePopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 40);
+ gTasks[mapNamePopupTaskId].data[0] = 6;
+ gTasks[mapNamePopupTaskId].data[2] = 40;
+ }
+ else
+ {
+ if (gTasks[mapNamePopupTaskId].data[0] != 2)
+ gTasks[mapNamePopupTaskId].data[0] = 2;
+ gTasks[mapNamePopupTaskId].data[3] = 1;
+ }
+ }
+}
+
+static void Task_MapNamePopUpWindow(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 6:
+ task->data[4]++;
+ if (task->data[4] > 30)
+ {
+ task->data[0] = 0;
+ task->data[4] = 0;
+ ShowMapNamePopUpWindow();
+ }
+ break;
+ case 0:
+ task->data[2] -= 2;
+ if (task->data[2] <= 0 )
+ {
+ task->data[2] = 0;
+ task->data[0] = 1;
+ gTasks[mapNamePopupTaskId].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] > 39)
+ {
+ task->data[2] = 40;
+ if (task->data[3])
+ {
+ task->data[0] = 6;
+ task->data[4] = 0;
+ task->data[3] = 0;
+ }
+ else
+ {
+ task->data[0] = 4;
+ return;
+ }
+ }
+ break;
+ case 4:
+ sub_819746C(GetMapNamePopUpWindowId(), TRUE);
+ task->data[0] = 5;
+ break;
+ case 5:
+ HideMapNamePopUpWindow();
+ return;
+ }
+ SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
+}
+
+void HideMapNamePopUpWindow(void)
+{
+ if (FuncIsActiveTask(Task_MapNamePopUpWindow))
+ {
+ sub_819746C(GetMapNamePopUpWindowId(), TRUE);
+ RemoveMapNamePopUpWindow();
+ SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, 0);
+ DestroyTask(mapNamePopupTaskId);
+ }
+}
+
+static void ShowMapNamePopUpWindow(void)
+{
+ u8 mapDisplayHeader[24];
+ u8 *withoutPrefixPtr;
+ u8 x;
+ const u8* mapDisplayHeaderSource;
+
+ if(InBattlePyramid())
+ {
+ if(gMapHeader.mapLayoutId == 0x17A)
+ {
+ withoutPrefixPtr = &(mapDisplayHeader[3]);
+ mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[7];
+ }
+ else
+ {
+ withoutPrefixPtr = &(mapDisplayHeader[3]);
+ mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[gSaveBlock2Ptr->frontier.field_CB2];
+ }
+ StringCopy(withoutPrefixPtr, mapDisplayHeaderSource);
+ }
+ else
+ {
+ withoutPrefixPtr = &(mapDisplayHeader[3]);
+ GetMapName(withoutPrefixPtr, gMapHeader.regionMapSectionId, 0);
+ }
+ AddMapNamePopUpWindow();
+ LoadMapNamePopUpWindowBg();
+ x = GetStringCenterAlignXOffset(7, withoutPrefixPtr, 80);
+ mapDisplayHeader[0] = EXT_CTRL_CODE_BEGIN;
+ mapDisplayHeader[1] = EXT_CTRL_CODE_HIGHLIGHT;
+ mapDisplayHeader[2] = TEXT_COLOR_TRANSPARENT;
+ PrintTextOnWindow(GetMapNamePopUpWindowId(), 7, mapDisplayHeader, x, 3, 0xFF, NULL);
+ CopyWindowToVram(GetMapNamePopUpWindowId(), 3);
+}
+
+#ifdef NONMATCHING
+static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused)
+{
+ s32 i;
+
+ for(i=0; i<=11; i++)
+ {
+ FillBgTilemapBufferRect(bg, 0x21D + i, x + i - 1, y - 1, 1, 1, 0xE);
+ }
+ FillBgTilemapBufferRect(bg, 0x229 + i, x - 1, y, 1, 1, 0xE);
+ FillBgTilemapBufferRect(bg, 0x22A + i, deltaX + x, y, 1, 1, 0xE);
+ FillBgTilemapBufferRect(bg, 0x22B + i, x - 1, y + 1 , 1, 1, 0xE);
+ FillBgTilemapBufferRect(bg, 0x22C + i, deltaX + x, y + 1, 1, 1, 0xE);
+ FillBgTilemapBufferRect(bg, 0x22D + i, x - 1, y + 2, 1, 1, 0xE);
+ FillBgTilemapBufferRect(bg, 0x22E + i, deltaX + x, y + 2, 1, 1, 0xE);
+ for(i=0; i<=11; i++)
+ {
+ FillBgTilemapBufferRect(bg, 0x22F + i, x + i - 1, y + deltaY, 1, 1, 0xE);
+ }
+}
+#else
+NAKED
+static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused)
+{
+ asm("\n\
+ .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, 0x1C\n\
+ ldr r4, [sp, 0x3C]\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r10, r1\n\
+ lsls r2, 24\n\
+ lsls r3, 24\n\
+ lsrs r3, 24\n\
+ str r3, [sp, 0x10]\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ str r4, [sp, 0x14]\n\
+ movs r5, 0\n\
+ lsls r0, r1, 24\n\
+ asrs r1, r0, 24\n\
+ lsrs r3, r2, 24\n\
+ str r3, [sp, 0xC]\n\
+ movs r6, 0xFF\n\
+ lsls r6, 24\n\
+ adds r6, r2\n\
+ mov r8, r6\n\
+ str r0, [sp, 0x18]\n\
+ subs r4, r1, 0x1\n\
+ _080D4AB4:\n\
+ ldr r0, =0x0000021d\n\
+ adds r1, r5, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ lsls r2, r4, 24\n\
+ lsrs r2, 24\n\
+ movs r3, 0x1\n\
+ str r3, [sp]\n\
+ str r3, [sp, 0x4]\n\
+ movs r6, 0xE\n\
+ mov r9, r6\n\
+ str r6, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ mov r6, r8\n\
+ lsrs r3, r6, 24\n\
+ bl FillBgTilemapBufferRect\n\
+ adds r4, 0x1\n\
+ adds r5, 0x1\n\
+ cmp r5, 0xB\n\
+ ble _080D4AB4\n\
+ ldr r1, =0x00000229\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ add r0, r10\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ movs r5, 0x1\n\
+ str r5, [sp]\n\
+ str r5, [sp, 0x4]\n\
+ mov r2, r9\n\
+ str r2, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ mov r2, r8\n\
+ ldr r3, [sp, 0xC]\n\
+ bl FillBgTilemapBufferRect\n\
+ ldr r1, =0x0000022a\n\
+ ldr r6, [sp, 0x10]\n\
+ add r6, r10\n\
+ lsls r6, 24\n\
+ lsrs r6, 24\n\
+ str r5, [sp]\n\
+ str r5, [sp, 0x4]\n\
+ mov r3, r9\n\
+ str r3, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ adds r2, r6, 0\n\
+ ldr r3, [sp, 0xC]\n\
+ bl FillBgTilemapBufferRect\n\
+ ldr r1, =0x0000022b\n\
+ ldr r4, [sp, 0xC]\n\
+ adds r4, 0x1\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ str r5, [sp]\n\
+ str r5, [sp, 0x4]\n\
+ mov r0, r9\n\
+ str r0, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ mov r2, r8\n\
+ adds r3, r4, 0\n\
+ bl FillBgTilemapBufferRect\n\
+ movs r1, 0x8B\n\
+ lsls r1, 2\n\
+ str r5, [sp]\n\
+ str r5, [sp, 0x4]\n\
+ mov r2, r9\n\
+ str r2, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ adds r2, r6, 0\n\
+ adds r3, r4, 0\n\
+ bl FillBgTilemapBufferRect\n\
+ ldr r1, =0x0000022d\n\
+ ldr r4, [sp, 0xC]\n\
+ adds r4, 0x2\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ str r5, [sp]\n\
+ str r5, [sp, 0x4]\n\
+ mov r3, r9\n\
+ str r3, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ mov r2, r8\n\
+ adds r3, r4, 0\n\
+ bl FillBgTilemapBufferRect\n\
+ ldr r1, =0x0000022e\n\
+ str r5, [sp]\n\
+ str r5, [sp, 0x4]\n\
+ mov r0, r9\n\
+ str r0, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ adds r2, r6, 0\n\
+ adds r3, r4, 0\n\
+ bl FillBgTilemapBufferRect\n\
+ movs r5, 0\n\
+ ldr r1, [sp, 0xC]\n\
+ ldr r2, [sp, 0x14]\n\
+ adds r0, r1, r2\n\
+ lsls r4, r0, 24\n\
+ movs r6, 0x1\n\
+ _080D4B8A:\n\
+ ldr r3, =0x0000022f\n\
+ adds r1, r5, r3\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ subs r0, r5, 0x1\n\
+ ldr r3, [sp, 0x18]\n\
+ asrs r2, r3, 24\n\
+ adds r2, r0\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r6, [sp]\n\
+ str r6, [sp, 0x4]\n\
+ movs r0, 0xE\n\
+ str r0, [sp, 0x8]\n\
+ adds r0, r7, 0\n\
+ lsrs r3, r4, 24\n\
+ bl FillBgTilemapBufferRect\n\
+ adds r5, 0x1\n\
+ cmp r5, 0xB\n\
+ ble _080D4B8A\n\
+ add sp, 0x1C\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\
+ .pool\n\
+ .syntax divided");
+}
+#endif // NONMATCHING
+
+static void LoadMapNamePopUpWindowBg(void)
+{
+ u8 popupWindowId;
+ u16 regionMapSectionId;
+ u8 popUpThemeId;
+
+ popupWindowId = GetMapNamePopUpWindowId();
+ regionMapSectionId = gMapHeader.regionMapSectionId;
+ if(regionMapSectionId > MAPSEC_DYNAMIC)
+ {
+ if(regionMapSectionId > MAPSEC_SPECIAL_AREA)
+ regionMapSectionId -= (MAPSEC_SPECIAL_AREA - MAPSEC_DYNAMIC);
+ else
+ regionMapSectionId = 0; //discard kanto region sections
+ }
+ popUpThemeId = gRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId];
+
+ LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_PRIORITY), &(gMapPopUp_Outline_Table[popUpThemeId][0]), 0x400, 0x21D);
+ CallWindowFunction(popupWindowId, sub_80D4A78);
+ PutWindowTilemap(popupWindowId);
+ if(gMapHeader.weather == WEATHER_BUBBLES)
+ LoadPalette(&gUnknown_0857F444, 0xE0, 0x20);
+ else
+ LoadPalette(&(gMapPopUp_Palette_Table[popUpThemeId][0]), 0xE0, 0x20);
+ BlitBitmapToWindow(popupWindowId, &(gMapPopUp_Table[popUpThemeId][0]), 0, 0, 80, 24);
+}
diff --git a/src/match_call.c b/src/match_call.c
new file mode 100644
index 000000000..aa6945161
--- /dev/null
+++ b/src/match_call.c
@@ -0,0 +1,1275 @@
+
+// Includes
+#include "global.h"
+#include "battle_setup.h"
+#include "event_data.h"
+#include "string_util.h"
+#include "battle.h"
+#include "battle_frontier_1.h"
+#include "gym_leader_rematch.h"
+
+extern const u8 gTrainerClassNames[][13];
+
+// Static type declarations
+
+typedef struct MatchCallTextDataStruct {
+ const u8 *text;
+ u16 flag;
+ u16 flag2;
+} match_call_text_data_t;
+
+struct MatchCallStructCommon {
+ u8 type;
+ u8 v1;
+ u16 flag;
+};
+
+struct MatchCallStruct0 {
+ u8 type;
+ u8 v1;
+ u16 flag;
+ const u8 *desc;
+ const u8 *name;
+ const match_call_text_data_t *textData;
+};
+
+struct MatchCallStruct1 {
+ u8 type;
+ u8 v1;
+ u16 flag;
+ u16 rematchTableIdx;
+ const u8 *desc;
+ const u8 *name;
+ const match_call_text_data_t *textData;
+};
+
+struct MatchCallSubstruct2 {
+ u16 flag;
+ u8 v2;
+};
+
+struct MatchCallStruct2 {
+ u8 type;
+ u8 v1;
+ u16 flag;
+ u16 rematchTableIdx;
+ const u8 *desc;
+ const match_call_text_data_t *textData;
+ const struct MatchCallSubstruct2 *v10;
+};
+
+struct MatchCallStruct3 {
+ u8 type;
+ u8 v1;
+ u16 flag;
+ const u8 *desc;
+ const u8 *name;
+};
+
+struct MatchCallStruct4 {
+ u8 type;
+ u8 gender;
+ u16 flag;
+ const u8 *desc;
+ const u8 *name;
+ const match_call_text_data_t *textData;
+};
+
+struct MatchCallStruct5 {
+ u8 type;
+ u8 v1;
+ u16 flag;
+ u16 v4;
+ const u8 *desc;
+ const u8 *name;
+ const match_call_text_data_t *textData;
+};
+
+#define MATCHCALLDEF(name, type_, ...) \
+static const struct MatchCallStruct##type_ name = { \
+ .type = type_, \
+ __VA_ARGS__ \
+};
+
+typedef union {
+ const struct MatchCallStructCommon *common;
+ const struct MatchCallStruct0 *type0;
+ const struct MatchCallStruct1 *type1;
+ const struct MatchCallStruct2 *type2;
+ const struct MatchCallStruct3 *type3;
+ const struct MatchCallStruct4 *type4;
+ const struct MatchCallStruct5 *type5;
+} match_call_t;
+
+struct UnkStruct_08625388 {
+ u16 idx;
+ u16 v2;
+ u16 v4;
+ const u8 *v8[4];
+};
+
+// Static RAM declarations
+
+// Static ROM declarations
+
+static bool32 MatchCallGetFlag_Type0(match_call_t);
+static bool32 MatchCallGetFlag_Type1(match_call_t);
+static bool32 MatchCallGetFlag_Type2(match_call_t);
+static bool32 MatchCallGetFlag_Type3(match_call_t);
+static bool32 MatchCallGetFlag_Type4(match_call_t);
+
+static u8 sub_81D1714(match_call_t);
+static u8 sub_81D1718(match_call_t);
+static u8 sub_81D171C(match_call_t);
+static u8 sub_81D1750(match_call_t);
+static u8 sub_81D1754(match_call_t);
+
+static bool32 MatchCall_IsRematchable_Type0(match_call_t);
+static bool32 MatchCall_IsRematchable_Type1(match_call_t);
+static bool32 MatchCall_IsRematchable_Type2(match_call_t);
+static bool32 MatchCall_IsRematchable_Type3(match_call_t);
+static bool32 MatchCall_IsRematchable_Type4(match_call_t);
+
+static bool32 sub_81D1840(match_call_t);
+static bool32 sub_81D1844(match_call_t);
+static bool32 sub_81D1848(match_call_t);
+static bool32 sub_81D184C(match_call_t);
+static bool32 sub_81D1850(match_call_t);
+
+static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t);
+static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t);
+static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t);
+static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t);
+static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t);
+
+static void MatchCall_GetMessage_Type0(match_call_t, u8 *);
+static void MatchCall_GetMessage_Type1(match_call_t, u8 *);
+static void MatchCall_GetMessage_Type2(match_call_t, u8 *);
+static void MatchCall_GetMessage_Type3(match_call_t, u8 *);
+static void MatchCall_GetMessage_Type4(match_call_t, u8 *);
+
+static void MatchCall_GetNameAndDesc_Type0(match_call_t, const u8 **, const u8 **);
+static void MatchCall_GetNameAndDesc_Type1(match_call_t, const u8 **, const u8 **);
+static void MatchCall_GetNameAndDesc_Type2(match_call_t, const u8 **, const u8 **);
+static void MatchCall_GetNameAndDesc_Type3(match_call_t, const u8 **, const u8 **);
+static void MatchCall_GetNameAndDesc_Type4(match_call_t, const u8 **, const u8 **);
+
+static void sub_81D1920(const match_call_text_data_t *, u8 *);
+static void sub_81D199C(const match_call_text_data_t *, u16, u8 *);
+static void MatchCall_GetNameAndDescByRematchIdx(u32, const u8 **, const u8 **);
+
+extern const u8 gText_MrStone_Pokenav_2B60C0[];
+extern const u8 gText_MrStone_Pokenav_2B61E6[];
+extern const u8 gText_MrStone_Pokenav_2B6302[];
+extern const u8 gText_MrStone_Pokenav_2B63A0[];
+extern const u8 gText_MrStone_Pokenav_2B64A2[];
+extern const u8 gText_MrStone_Pokenav_2B6526[];
+extern const u8 gText_MrStone_Pokenav_2B65BB[];
+extern const u8 gText_MrStone_Pokenav_2B6664[];
+extern const u8 gText_MrStone_Pokenav_2B66B1[];
+extern const u8 gText_MrStone_Pokenav_2B6703[];
+extern const u8 gText_MrStone_Pokenav_2B67ED[];
+
+extern const u8 gMrStoneMatchCallDesc[];
+extern const u8 gMrStoneMatchCallName[];
+
+extern const u8 gText_Norman_Pokenav_2B5719[];
+extern const u8 gText_Norman_Pokenav_2B5795[];
+extern const u8 gText_Norman_Pokenav_2B584D[];
+extern const u8 gText_Norman_Pokenav_2B58E3[];
+extern const u8 gText_Norman_Pokenav_2B5979[];
+extern const u8 gText_Norman_Pokenav_2B5A07[];
+extern const u8 gText_Norman_Pokenav_2B5A69[];
+extern const u8 gText_Norman_Pokenav_2B5ACF[];
+extern const u8 gText_Norman_Pokenav_2B5B5E[];
+
+extern const u8 gNormanMatchCallDesc[];
+extern const u8 gNormanMatchCallName[];
+
+extern const u8 gProfBirchMatchCallDesc[];
+extern const u8 gProfBirchMatchCallName[];
+
+extern const u8 gText_Mom_Pokenav_2B227B[];
+extern const u8 gText_Mom_Pokenav_2B2310[];
+extern const u8 gText_Mom_Pokenav_2B23F3[];
+
+extern const u8 gMomMatchCallDesc[];
+extern const u8 gMomMatchCallName[];
+
+extern const u8 gText_Steven_Pokenav_2B5B95[];
+extern const u8 gText_Steven_Pokenav_2B5C53[];
+extern const u8 gText_Steven_Pokenav_2B5CC9[];
+extern const u8 gText_Steven_Pokenav_2B5DB4[];
+extern const u8 gText_Steven_Pokenav_2B5E26[];
+extern const u8 gText_Steven_Pokenav_2B5EA2[];
+extern const u8 gText_Steven_Pokenav_2B5ED9[];
+
+extern const u8 gStevenMatchCallDesc[];
+extern const u8 gStevenMatchCallName[];
+
+extern const u8 gText_May_Pokenav_2B3AB3[];
+extern const u8 gText_May_Pokenav_2B3B3F[];
+extern const u8 gText_May_Pokenav_2B3C13[];
+extern const u8 gText_May_Pokenav_2B3CF3[];
+extern const u8 gText_May_Pokenav_2B3D4B[];
+extern const u8 gText_May_Pokenav_2B3DD1[];
+extern const u8 gText_May_Pokenav_2B3E69[];
+extern const u8 gText_May_Pokenav_2B3ECD[];
+extern const u8 gText_May_Pokenav_2B3F2B[];
+extern const u8 gText_May_Pokenav_2B3FFB[];
+extern const u8 gText_May_Pokenav_2B402B[];
+extern const u8 gText_May_Pokenav_2B414B[];
+extern const u8 gText_May_Pokenav_2B4228[];
+extern const u8 gText_May_Pokenav_2B42E0[];
+extern const u8 gText_May_Pokenav_2B4350[];
+extern const u8 gMayBrendanMatchCallDesc[];
+extern const u8 gExpandedPlaceholder_May[];
+extern const u8 gText_Brendan_Pokenav_2B43EF[];
+extern const u8 gText_Brendan_Pokenav_2B4486[];
+extern const u8 gText_Brendan_Pokenav_2B4560[];
+extern const u8 gText_Brendan_Pokenav_2B463F[];
+extern const u8 gText_Brendan_Pokenav_2B46B7[];
+extern const u8 gText_Brendan_Pokenav_2B4761[];
+extern const u8 gText_Brendan_Pokenav_2B47F4[];
+extern const u8 gText_Brendan_Pokenav_2B4882[];
+extern const u8 gText_Brendan_Pokenav_2B4909[];
+extern const u8 gText_Brendan_Pokenav_2B49C4[];
+extern const u8 gText_Brendan_Pokenav_2B4A44[];
+extern const u8 gText_Brendan_Pokenav_2B4B28[];
+extern const u8 gText_Brendan_Pokenav_2B4C15[];
+extern const u8 gText_Brendan_Pokenav_2B4CD8[];
+extern const u8 gText_Brendan_Pokenav_2B4D46[];
+extern const u8 gExpandedPlaceholder_Brendan[];
+extern const u8 gText_Wally_Pokenav_2B4DE2[];
+extern const u8 gText_Wally_Pokenav_2B4E57[];
+extern const u8 gText_Wally_Pokenav_2B4EA5[];
+extern const u8 gText_Wally_Pokenav_2B4F41[];
+extern const u8 gText_Wally_Pokenav_2B4FF3[];
+extern const u8 gText_Wally_Pokenav_2B50B1[];
+extern const u8 gText_Wally_Pokenav_2B5100[];
+extern const u8 gWallyMatchCallDesc[];
+extern const u8 gText_Scott_Pokenav_2B5184[];
+extern const u8 gText_Scott_Pokenav_2B5275[];
+extern const u8 gText_Scott_Pokenav_2B5323[];
+extern const u8 gText_Scott_Pokenav_2B53DB[];
+extern const u8 gText_Scott_Pokenav_2B54A5[];
+extern const u8 gText_Scott_Pokenav_2B5541[];
+extern const u8 gText_Scott_Pokenav_2B56CA[];
+extern const u8 gScottMatchCallDesc[];
+extern const u8 gScottMatchCallName[];
+extern const u8 gText_Roxanne_Pokenav_2B2456[];
+extern const u8 gText_Roxanne_Pokenav_2B250E[];
+extern const u8 gText_Roxanne_Pokenav_2B25C1[];
+extern const u8 gText_Roxanne_Pokenav_2B2607[];
+extern const u8 gRoxanneMatchCallDesc[];
+extern const u8 gText_Brawly_Pokenav_2B2659[];
+extern const u8 gText_Brawly_Pokenav_2B275D[];
+extern const u8 gText_Brawly_Pokenav_2B286F[];
+extern const u8 gText_Brawly_Pokenav_2B28D1[];
+extern const u8 gBrawlyMatchCallDesc[];
+extern const u8 gText_Wattson_Pokenav_2B2912[];
+extern const u8 gText_Wattson_Pokenav_2B29CA[];
+extern const u8 gText_Wattson_Pokenav_2B2AB6[];
+extern const u8 gText_Wattson_Pokenav_2B2B01[];
+extern const u8 gWattsonMatchCallDesc[];
+extern const u8 gText_Flannery_Pokenav_2B2B4D[];
+extern const u8 gText_Flannery_Pokenav_2B2C0E[];
+extern const u8 gText_Flannery_Pokenav_2B2CF1[];
+extern const u8 gText_Flannery_Pokenav_2B2D54[];
+extern const u8 gFlanneryMatchCallDesc[];
+extern const u8 gText_Winona_Pokenav_2B2DA4[];
+extern const u8 gText_Winona_Pokenav_2B2E2B[];
+extern const u8 gText_Winona_Pokenav_2B2EC2[];
+extern const u8 gText_Winona_Pokenav_2B2F16[];
+extern const u8 gWinonaMatchCallDesc[];
+extern const u8 gText_TateLiza_Pokenav_2B2F97[];
+extern const u8 gText_TateLiza_Pokenav_2B306E[];
+extern const u8 gText_TateLiza_Pokenav_2B3158[];
+extern const u8 gText_TateLiza_Pokenav_2B31CD[];
+extern const u8 gTateLizaMatchCallDesc[];
+extern const u8 gText_Juan_Pokenav_2B3249[];
+extern const u8 gText_Juan_Pokenav_2B32EC[];
+extern const u8 gText_Juan_Pokenav_2B33AA[];
+extern const u8 gText_Juan_Pokenav_2B341E[];
+extern const u8 gJuanMatchCallDesc[];
+extern const u8 gText_Sidney_Pokenav_2B34CC[];
+extern const u8 gEliteFourMatchCallDesc[];
+extern const u8 gText_Phoebe_Pokenav_2B3561[];
+extern const u8 gText_Glacia_Pokenav_2B35E4[];
+extern const u8 gText_Drake_Pokenav_2B368B[];
+extern const u8 gText_Wallace_Pokenav_2B3790[];
+extern const u8 gChampionMatchCallDesc[];
+extern const u8 gMatchCallStevenStrategyText[];
+extern const u8 gMatchCall_StevenTrainersPokemonText[];
+extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle[];
+extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle[];
+extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle[];
+extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle[];
+extern const u8 gMatchCall_BrendanStrategyText[];
+extern const u8 gMatchCall_BrendanTrainersPokemonText[];
+extern const u8 gMatchCall_BrendanSelfIntroductionText_Line1[];
+extern const u8 gMatchCall_BrendanSelfIntroductionText_Line2[];
+extern const u8 gMatchCall_MayStrategyText[];
+extern const u8 gMatchCall_MayTrainersPokemonText[];
+extern const u8 gMatchCall_MaySelfIntroductionText_Line1[];
+extern const u8 gMatchCall_MaySelfIntroductionText_Line2[];
+// .rodata
+
+static const match_call_text_data_t sMrStoneTextScripts[] = {
+ { gText_MrStone_Pokenav_2B60C0, 0xFFFF, FLAG_0x158 },
+ { gText_MrStone_Pokenav_2B61E6, FLAG_0x158, 0xFFFF },
+ { gText_MrStone_Pokenav_2B6302, FLAG_0x0BD, 0xFFFF },
+ { gText_MrStone_Pokenav_2B63A0, FLAG_0x110, 0xFFFF },
+ { gText_MrStone_Pokenav_2B64A2, FLAG_0x06A, 0xFFFF },
+ { gText_MrStone_Pokenav_2B6526, FLAG_0x4F4, 0xFFFF },
+ { gText_MrStone_Pokenav_2B65BB, FLAG_0x097, 0xFFFF },
+ { gText_MrStone_Pokenav_2B6664, FLAG_0x06F, 0xFFFF },
+ { gText_MrStone_Pokenav_2B66B1, FLAG_0x070, 0xFFFF },
+ { gText_MrStone_Pokenav_2B6703, FLAG_0x4F7, 0xFFFF },
+ { gText_MrStone_Pokenav_2B67ED, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sMrStoneMatchCallHeader, 0, 10, 0xffff, gMrStoneMatchCallDesc, gMrStoneMatchCallName, sMrStoneTextScripts);
+
+static const match_call_text_data_t sNormanTextScripts[] = {
+ { gText_Norman_Pokenav_2B5719, FLAG_0x132, 0xFFFF },
+ { gText_Norman_Pokenav_2B5795, FLAG_0x4F1, 0xFFFF },
+ { gText_Norman_Pokenav_2B584D, FLAG_0x4F3, 0xFFFF },
+ { gText_Norman_Pokenav_2B58E3, FLAG_0x4F4, 0xFFFF },
+ { gText_Norman_Pokenav_2B5979, FLAG_0x0D4, 0xFFFF },
+ { gText_Norman_Pokenav_2B5A07, 0xFFFE, 0xFFFF },
+ { gText_Norman_Pokenav_2B5A69, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { gText_Norman_Pokenav_2B5ACF, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { gText_Norman_Pokenav_2B5B5E, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sNormanMatchCallHeader, 5, 7, FLAG_0x132, 0x45, gNormanMatchCallDesc, gNormanMatchCallName, sNormanTextScripts);
+
+MATCHCALLDEF(sProfBirchMatchCallHeader, 3, 0, FLAG_0x119, gProfBirchMatchCallDesc, gProfBirchMatchCallName)
+
+static const match_call_text_data_t sMomTextScripts[] = {
+ { gText_Mom_Pokenav_2B227B, 0xffff, 0xffff },
+ { gText_Mom_Pokenav_2B2310, FLAG_0x4F4, 0xffff },
+ { gText_Mom_Pokenav_2B23F3, FLAG_SYS_GAME_CLEAR, 0xffff },
+ { NULL, 0xffff, 0xffff }
+};
+
+MATCHCALLDEF(sMomMatchCallHeader, 0, 0, FLAG_0x0D8, gMomMatchCallDesc, gMomMatchCallName, sMomTextScripts);
+
+static const match_call_text_data_t sStevenTextScripts[] = {
+ { gText_Steven_Pokenav_2B5B95, 0xffff, 0xffff },
+ { gText_Steven_Pokenav_2B5C53, FLAG_0x0C7, 0xffff },
+ { gText_Steven_Pokenav_2B5CC9, FLAG_0x0D4, 0xffff },
+ { gText_Steven_Pokenav_2B5DB4, FLAG_0x070, 0xffff },
+ { gText_Steven_Pokenav_2B5E26, FLAG_0x4F6, 0xffff },
+ { gText_Steven_Pokenav_2B5EA2, FLAG_0x081, 0xffff },
+ { gText_Steven_Pokenav_2B5ED9, FLAG_SYS_GAME_CLEAR, 0xffff },
+ { NULL, 0xffff, 0xffff },
+};
+
+MATCHCALLDEF(sStevenMatchCallHeader, 0, 0xd5, FLAG_0x131, gStevenMatchCallDesc, gStevenMatchCallName, sStevenTextScripts);
+
+static const match_call_text_data_t sMayTextScripts[] = {
+ { gText_May_Pokenav_2B3AB3, 0xFFFF, 0xFFFF },
+ { gText_May_Pokenav_2B3B3F, FLAG_0x4F1, 0xFFFF },
+ { gText_May_Pokenav_2B3C13, FLAG_0x095, 0xFFFF },
+ { gText_May_Pokenav_2B3CF3, FLAG_0x324, 0xFFFF },
+ { gText_May_Pokenav_2B3D4B, FLAG_0x06A, 0xFFFF },
+ { gText_May_Pokenav_2B3DD1, FLAG_0x4F3, 0xFFFF },
+ { gText_May_Pokenav_2B3E69, FLAG_0x4F4, 0xFFFF },
+ { gText_May_Pokenav_2B3ECD, FLAG_0x097, 0xFFFF },
+ { gText_May_Pokenav_2B3F2B, FLAG_0x0D4, 0xFFFF },
+ { gText_May_Pokenav_2B3FFB, FLAG_0x06F, 0xFFFF },
+ { gText_May_Pokenav_2B402B, FLAG_0x061, 0xFFFF },
+ { gText_May_Pokenav_2B414B, FLAG_0x070, 0xFFFF },
+ { gText_May_Pokenav_2B4228, FLAG_0x081, 0xFFFF },
+ { gText_May_Pokenav_2B42E0, FLAG_0x4F7, 0xFFFF },
+ { gText_May_Pokenav_2B4350, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sMayMatchCallHeader, 4, MALE, FLAG_0x0FD, gMayBrendanMatchCallDesc, gExpandedPlaceholder_May, sMayTextScripts);
+
+static const match_call_text_data_t sBrendanTextScripts[] = {
+ { gText_Brendan_Pokenav_2B43EF, 0xFFFF, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4486, FLAG_0x4F1, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4560, FLAG_0x095, 0xFFFF },
+ { gText_Brendan_Pokenav_2B463F, FLAG_0x324, 0xFFFF },
+ { gText_Brendan_Pokenav_2B46B7, FLAG_0x06A, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4761, FLAG_0x4F3, 0xFFFF },
+ { gText_Brendan_Pokenav_2B47F4, FLAG_0x4F4, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4882, FLAG_0x097, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4909, FLAG_0x0D4, 0xFFFF },
+ { gText_Brendan_Pokenav_2B49C4, FLAG_0x06F, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4A44, FLAG_0x061, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4B28, FLAG_0x070, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4C15, FLAG_0x081, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4CD8, FLAG_0x4F7, 0xFFFF },
+ { gText_Brendan_Pokenav_2B4D46, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sBrendanMatchCallHeader, 4, FEMALE, FLAG_0x0FD, gMayBrendanMatchCallDesc, gExpandedPlaceholder_Brendan, sBrendanTextScripts);
+
+static const match_call_text_data_t sWallyTextScripts[] = {
+ { gText_Wally_Pokenav_2B4DE2, 0xFFFF, 0xFFFF },
+ { gText_Wally_Pokenav_2B4E57, FLAG_0x0C7, 0xFFFF },
+ { gText_Wally_Pokenav_2B4EA5, FLAG_0x4F3, 0xFFFF },
+ { gText_Wally_Pokenav_2B4F41, FLAG_0x097, 0xFFFF },
+ { gText_Wally_Pokenav_2B4FF3, FLAG_0x06F, 0xFFFF },
+ { gText_Wally_Pokenav_2B50B1, FLAG_0x081, 0xFFFF },
+ { gText_Wally_Pokenav_2B5100, FLAG_0x07E, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+const struct MatchCallSubstruct2 sWallyAdditionalData[] = {
+ { FLAG_0x324, 0x05 },
+ { FLAG_0x06F, 0xD5 },
+ { FLAG_0x35A, 0x46 },
+ { 0xFFFF, 0xD5 }
+};
+
+MATCHCALLDEF(sWallyMatchCallHeader, 2, 0, FLAG_0x0D6, REMATCH_WALLY_3, gWallyMatchCallDesc, sWallyTextScripts, sWallyAdditionalData);
+
+static const match_call_text_data_t sScottTextScripts[] = {
+ { gText_Scott_Pokenav_2B5184, 0xFFFF, 0xFFFF },
+ { gText_Scott_Pokenav_2B5275, FLAG_0x08B, 0xFFFF },
+ { gText_Scott_Pokenav_2B5323, FLAG_0x097, 0xFFFF },
+ { gText_Scott_Pokenav_2B53DB, FLAG_0x0D4, 0xFFFF },
+ { gText_Scott_Pokenav_2B54A5, FLAG_0x070, 0xFFFF },
+ { gText_Scott_Pokenav_2B5541, FLAG_0x4F7, 0xFFFF },
+ { gText_Scott_Pokenav_2B56CA, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+
+MATCHCALLDEF(sScottMatchCallHeader, 0, 0xD5, FLAG_0x0D7, gScottMatchCallDesc, gScottMatchCallName, sScottTextScripts);
+
+static const match_call_text_data_t sRoxanneTextScripts[] = {
+ { gText_Roxanne_Pokenav_2B2456, 0xFFFE, 0xFFFF },
+ { gText_Roxanne_Pokenav_2B250E, 0xFFFF, 0xFFFF },
+ { gText_Roxanne_Pokenav_2B25C1, 0xFFFF, 0xFFFF },
+ { gText_Roxanne_Pokenav_2B2607, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sRoxanneMatchCallHeader, 5, 10, FLAG_0x1D3, 0x41, gRoxanneMatchCallDesc, NULL, sRoxanneTextScripts);
+
+static const match_call_text_data_t sBrawlyTextScripts[] = {
+ { gText_Brawly_Pokenav_2B2659, 0xFFFE, 0xFFFF },
+ { gText_Brawly_Pokenav_2B275D, 0xFFFF, 0xFFFF },
+ { gText_Brawly_Pokenav_2B286F, 0xFFFF, 0xFFFF },
+ { gText_Brawly_Pokenav_2B28D1, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sBrawlyMatchCallHeader, 5, 2, FLAG_0x1D4, 0x42, gBrawlyMatchCallDesc, NULL, sBrawlyTextScripts);
+
+static const match_call_text_data_t sWattsonTextScripts[] = {
+ { gText_Wattson_Pokenav_2B2912, 0xFFFE, 0xFFFF },
+ { gText_Wattson_Pokenav_2B29CA, 0xFFFF, 0xFFFF },
+ { gText_Wattson_Pokenav_2B2AB6, 0xFFFF, 0xFFFF },
+ { gText_Wattson_Pokenav_2B2B01, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sWattsonMatchCallHeader, 5, 9, FLAG_0x1D5, 0x43, gWattsonMatchCallDesc, NULL, sWattsonTextScripts);
+
+static const match_call_text_data_t sFlanneryTextScripts[] = {
+ { gText_Flannery_Pokenav_2B2B4D, 0xFFFE, 0xFFFF },
+ { gText_Flannery_Pokenav_2B2C0E, 0xFFFF, 0xFFFF },
+ { gText_Flannery_Pokenav_2B2CF1, 0xFFFF, 0xFFFF },
+ { gText_Flannery_Pokenav_2B2D54, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sFlanneryMatchCallHeader, 5, 3, FLAG_0x1D6, 0x44, gFlanneryMatchCallDesc, NULL, sFlanneryTextScripts);
+
+static const match_call_text_data_t sWinonaTextScripts[] = {
+ { gText_Winona_Pokenav_2B2DA4, 0xFFFE, 0xFFFF },
+ { gText_Winona_Pokenav_2B2E2B, 0xFFFF, 0xFFFF },
+ { gText_Winona_Pokenav_2B2EC2, 0xFFFF, 0xFFFF },
+ { gText_Winona_Pokenav_2B2F16, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sWinonaMatchCallHeader, 5, 11, FLAG_0x1D7, 0x46, gWinonaMatchCallDesc, NULL, sWinonaTextScripts);
+
+static const match_call_text_data_t sTateLizaTextScripts[] = {
+ { gText_TateLiza_Pokenav_2B2F97, 0xFFFE, 0xFFFF },
+ { gText_TateLiza_Pokenav_2B306E, 0xFFFF, 0xFFFF },
+ { gText_TateLiza_Pokenav_2B3158, 0xFFFF, 0xFFFF },
+ { gText_TateLiza_Pokenav_2B31CD, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sTateLizaMatchCallHeader, 5, 13, FLAG_0x1D8, 0x47, gTateLizaMatchCallDesc, NULL, sTateLizaTextScripts);
+
+static const match_call_text_data_t sJuanTextScripts[] = {
+ { gText_Juan_Pokenav_2B3249, 0xFFFE, 0xFFFF },
+ { gText_Juan_Pokenav_2B32EC, 0xFFFF, 0xFFFF },
+ { gText_Juan_Pokenav_2B33AA, 0xFFFF, 0xFFFF },
+ { gText_Juan_Pokenav_2B341E, FLAG_SYS_GAME_CLEAR, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sJuanMatchCallHeader, 5, 14, FLAG_0x1D9, 0x48, gJuanMatchCallDesc, NULL, sJuanTextScripts);
+
+static const match_call_text_data_t sSidneyTextScripts[] = {
+ { gText_Sidney_Pokenav_2B34CC, 0xFFFF, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sSidneyMatchCallHeader, 5, 15, FLAG_0x1A5, 0x49, gEliteFourMatchCallDesc, NULL, sSidneyTextScripts);
+
+static const match_call_text_data_t sPhoebeTextScripts[] = {
+ { gText_Phoebe_Pokenav_2B3561, 0xFFFF, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sPhoebeMatchCallHeader, 5, 15, FLAG_0x1A6, 0x4A, gEliteFourMatchCallDesc, NULL, sPhoebeTextScripts);
+
+static const match_call_text_data_t sGlaciaTextScripts[] = {
+ { gText_Glacia_Pokenav_2B35E4, 0xFFFF, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sGlaciaMatchCallHeader, 5, 15, FLAG_0x1A7, 0x4B, gEliteFourMatchCallDesc, NULL, sGlaciaTextScripts);
+
+static const match_call_text_data_t sDrakeTextScripts[] = {
+ { gText_Drake_Pokenav_2B368B, 0xFFFF, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sDrakeMatchCallHeader, 5, 15, FLAG_0x1A8, 0x4C, gEliteFourMatchCallDesc, NULL, sDrakeTextScripts);
+
+static const match_call_text_data_t sWallaceTextScripts[] = {
+ { gText_Wallace_Pokenav_2B3790, 0xFFFF, 0xFFFF },
+ { NULL, 0xFFFF, 0xFFFF }
+};
+
+MATCHCALLDEF(sWallaceMatchCallHeader, 5, 15, FLAG_0x1A9, 0x4D, gChampionMatchCallDesc, NULL, sWallaceTextScripts);
+
+static const match_call_t sMatchCallHeaders[] = {
+ {.type0 = &sMrStoneMatchCallHeader},
+ {.type3 = &sProfBirchMatchCallHeader},
+ {.type4 = &sBrendanMatchCallHeader},
+ {.type4 = &sMayMatchCallHeader},
+ {.type2 = &sWallyMatchCallHeader},
+ {.type5 = &sNormanMatchCallHeader},
+ {.type0 = &sMomMatchCallHeader},
+ {.type0 = &sStevenMatchCallHeader},
+ {.type0 = &sScottMatchCallHeader},
+ {.type5 = &sRoxanneMatchCallHeader},
+ {.type5 = &sBrawlyMatchCallHeader},
+ {.type5 = &sWattsonMatchCallHeader},
+ {.type5 = &sFlanneryMatchCallHeader},
+ {.type5 = &sWinonaMatchCallHeader},
+ {.type5 = &sTateLizaMatchCallHeader},
+ {.type5 = &sJuanMatchCallHeader},
+ {.type5 = &sSidneyMatchCallHeader},
+ {.type5 = &sPhoebeMatchCallHeader},
+ {.type5 = &sGlaciaMatchCallHeader},
+ {.type5 = &sDrakeMatchCallHeader},
+ {.type5 = &sWallaceMatchCallHeader}
+};
+
+static bool32 (*const sMatchCallGetFlagFuncs[])(match_call_t) = {
+ MatchCallGetFlag_Type0,
+ MatchCallGetFlag_Type1,
+ MatchCallGetFlag_Type2,
+ MatchCallGetFlag_Type3,
+ MatchCallGetFlag_Type4
+};
+
+static u8 (*const gUnknown_08625310[])(match_call_t) = {
+ sub_81D1714,
+ sub_81D1718,
+ sub_81D171C,
+ sub_81D1750,
+ sub_81D1754
+};
+
+static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = {
+ MatchCall_IsRematchable_Type0,
+ MatchCall_IsRematchable_Type1,
+ MatchCall_IsRematchable_Type2,
+ MatchCall_IsRematchable_Type3,
+ MatchCall_IsRematchable_Type4
+};
+
+static bool32 (*const gUnknown_08625338[])(match_call_t) = {
+ sub_81D1840,
+ sub_81D1844,
+ sub_81D1848,
+ sub_81D184C,
+ sub_81D1850
+};
+
+static u32 (*const sMatchCall_GetRematchTableIdxFunctions[])(match_call_t) = {
+ MatchCall_GetRematchTableIdx_Type0,
+ MatchCall_GetRematchTableIdx_Type1,
+ MatchCall_GetRematchTableIdx_Type2,
+ MatchCall_GetRematchTableIdx_Type3,
+ MatchCall_GetRematchTableIdx_Type4
+};
+
+static void (*const sMatchCall_GetMessageFunctions[])(match_call_t, u8 *) = {
+ MatchCall_GetMessage_Type0,
+ MatchCall_GetMessage_Type1,
+ MatchCall_GetMessage_Type2,
+ MatchCall_GetMessage_Type3,
+ MatchCall_GetMessage_Type4
+};
+
+static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8 **, const u8 **) = {
+ MatchCall_GetNameAndDesc_Type0,
+ MatchCall_GetNameAndDesc_Type1,
+ MatchCall_GetNameAndDesc_Type2,
+ MatchCall_GetNameAndDesc_Type3,
+ MatchCall_GetNameAndDesc_Type4
+};
+
+static const struct UnkStruct_08625388 sMatchCallCheckPageOverrides[] = {
+ { 7, 0x4B, 0xffff, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN
+ { 7, 0x4B, FLAG_0x4F6, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN
+ { 2, 0x3c, 0xffff, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan
+ { 3, 0x3f, 0xffff, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May
+};
+
+// .text
+
+static u32 MatchCallGetFunctionIndex(match_call_t matchCall)
+{
+ switch (matchCall.common->type)
+ {
+ case 0:
+ default:
+ return 0;
+ case 1:
+ case 5:
+ return 1;
+ case 2:
+ return 2;
+ case 4:
+ return 3;
+ case 3:
+ return 4;
+ }
+}
+
+u32 GetTrainerIdxByRematchIdx(u32 rematchIdx)
+{
+ return gRematchTable[rematchIdx].trainerIds[0];
+}
+
+s32 GetRematchIdxByTrainerIdx(s32 trainerIdx)
+{
+ s32 rematchIdx;
+
+ for (rematchIdx = 0; rematchIdx < REMATCH_TABLE_ENTRIES; rematchIdx++)
+ {
+ if (gRematchTable[rematchIdx].trainerIds[0] == trainerIdx)
+ return rematchIdx;
+ }
+ return -1;
+}
+
+bool32 MatchCallFlagGetByIndex(u32 idx)
+{
+ match_call_t matchCall;
+ u32 i;
+
+ if (idx > 20)
+ return FALSE;
+ matchCall = sMatchCallHeaders[idx];
+ i = MatchCallGetFunctionIndex(matchCall);
+ return sMatchCallGetFlagFuncs[i](matchCall);
+}
+
+static bool32 MatchCallGetFlag_Type0(match_call_t matchCall)
+{
+ if (matchCall.type0->flag == 0xffff)
+ return TRUE;
+ return FlagGet(matchCall.type0->flag);
+}
+
+static bool32 MatchCallGetFlag_Type1(match_call_t matchCall)
+{
+ if (matchCall.type1->flag == 0xffff)
+ return TRUE;
+ return FlagGet(matchCall.type1->flag);
+}
+
+static bool32 MatchCallGetFlag_Type2(match_call_t matchCall)
+{
+ if (matchCall.type2->flag == 0xffff)
+ return TRUE;
+ return FlagGet(matchCall.type2->flag);
+}
+
+static bool32 MatchCallGetFlag_Type3(match_call_t matchCall)
+{
+ if (matchCall.type4->gender != gSaveBlock2Ptr->playerGender)
+ return FALSE;
+ if (matchCall.type4->flag == 0xffff)
+ return TRUE;
+ return FlagGet(matchCall.type4->flag);
+}
+
+static bool32 MatchCallGetFlag_Type4(match_call_t matchCall)
+{
+ return FlagGet(matchCall.type3->flag);
+}
+
+u8 sub_81D16DC(u32 idx)
+{
+ match_call_t matchCall;
+ u32 i;
+
+ if (idx > 20)
+ return 0;
+ matchCall = sMatchCallHeaders[idx];
+ i = MatchCallGetFunctionIndex(matchCall);
+ return gUnknown_08625310[i](matchCall);
+}
+
+static u8 sub_81D1714(match_call_t matchCall)
+{
+ return matchCall.type0->v1;
+}
+
+static u8 sub_81D1718(match_call_t matchCall)
+{
+ return matchCall.type1->v1;
+}
+
+static u8 sub_81D171C(match_call_t matchCall)
+{
+ s32 i;
+
+ for (i = 0; matchCall.type2->v10[i].flag != 0xffff; i++)
+ {
+ if (!FlagGet(matchCall.type2->v10[i].flag))
+ break;
+ }
+ return matchCall.type2->v10[i].v2;
+}
+
+static u8 sub_81D1750(match_call_t matchCall)
+{
+ return 0xd5;
+}
+
+static u8 sub_81D1754(match_call_t matchCall)
+{
+ return 0xd5;
+}
+
+bool32 MatchCall_IsRematchable(u32 idx)
+{
+ match_call_t matchCall;
+ u32 i;
+
+ if (idx > 20)
+ return 0;
+ matchCall = sMatchCallHeaders[idx];
+ i = MatchCallGetFunctionIndex(matchCall);
+ return sMatchCall_IsRematchableFunctions[i](matchCall);
+}
+
+static bool32 MatchCall_IsRematchable_Type0(match_call_t matchCall)
+{
+ return FALSE;
+}
+
+static bool32 MatchCall_IsRematchable_Type1(match_call_t matchCall)
+{
+ if (matchCall.type1->rematchTableIdx >= REMATCH_ELITE_FOUR_ENTRIES)
+ return FALSE;
+ return gSaveBlock1Ptr->trainerRematches[matchCall.type1->rematchTableIdx] ? TRUE : FALSE;
+}
+
+static bool32 MatchCall_IsRematchable_Type2(match_call_t matchCall)
+{
+ return gSaveBlock1Ptr->trainerRematches[matchCall.type2->rematchTableIdx] ? TRUE : FALSE;
+}
+
+static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall)
+{
+ return FALSE;
+}
+
+static bool32 MatchCall_IsRematchable_Type4(match_call_t matchCall)
+{
+ return FALSE;
+}
+
+bool32 sub_81D17E8(u32 idx)
+{
+ match_call_t matchCall;
+ u32 i;
+
+ if (idx > 20)
+ return FALSE;
+ matchCall = sMatchCallHeaders[idx];
+ i = MatchCallGetFunctionIndex(matchCall);
+ if (gUnknown_08625338[i](matchCall))
+ return TRUE;
+ for (i = 0; i < 4; i++)
+ {
+ if (sMatchCallCheckPageOverrides[i].idx == idx)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_81D1840(match_call_t matchCall)
+{
+ return FALSE;
+}
+
+static bool32 sub_81D1844(match_call_t matchCall)
+{
+ return TRUE;
+}
+
+static bool32 sub_81D1848(match_call_t matchCall)
+{
+ return TRUE;
+}
+
+static bool32 sub_81D184C(match_call_t matchCall)
+{
+ return FALSE;
+}
+
+static bool32 sub_81D1850(match_call_t matchCall)
+{
+ return FALSE;
+}
+
+u32 MatchCall_GetRematchTableIdx(u32 idx)
+{
+ match_call_t matchCall;
+ u32 i;
+
+ if (idx > 20)
+ return REMATCH_TABLE_ENTRIES;
+ matchCall = sMatchCallHeaders[idx];
+ i = MatchCallGetFunctionIndex(matchCall);
+ return sMatchCall_GetRematchTableIdxFunctions[i](matchCall);
+}
+
+static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t matchCall)
+{
+ return REMATCH_TABLE_ENTRIES;
+}
+
+static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t matchCall)
+{
+ return matchCall.type1->rematchTableIdx;
+}
+
+static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t matchCall)
+{
+ return matchCall.type2->rematchTableIdx;
+}
+
+static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t matchCall)
+{
+ return REMATCH_TABLE_ENTRIES;
+}
+
+static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t matchCall)
+{
+ return REMATCH_TABLE_ENTRIES;
+}
+
+void MatchCall_GetMessage(u32 idx, u8 *dest)
+{
+ match_call_t matchCall;
+ u32 i;
+
+ if (idx > 20)
+ return;
+ matchCall = sMatchCallHeaders[idx];
+ i = MatchCallGetFunctionIndex(matchCall);
+ sMatchCall_GetMessageFunctions[i](matchCall, dest);
+}
+
+static void MatchCall_GetMessage_Type0(match_call_t matchCall, u8 *dest)
+{
+ sub_81D1920(matchCall.type0->textData, dest);
+}
+
+static void MatchCall_GetMessage_Type1(match_call_t matchCall, u8 *dest)
+{
+ if (matchCall.common->type != 5)
+ sub_81D1920(matchCall.type5->textData, dest);
+ else
+ sub_81D199C(matchCall.type1->textData, matchCall.type1->rematchTableIdx, dest);
+}
+
+static void MatchCall_GetMessage_Type2(match_call_t matchCall, u8 *dest)
+{
+ sub_81D1920(matchCall.type2->textData, dest);
+}
+
+static void MatchCall_GetMessage_Type3(match_call_t matchCall, u8 *dest)
+{
+ sub_81D1920(matchCall.type4->textData, dest);
+}
+
+static void MatchCall_GetMessage_Type4(match_call_t matchCall, u8 *dest)
+{
+ sub_8197080(dest);
+}
+
+void sub_81D1920(const match_call_text_data_t *sub0, u8 *dest)
+{
+ u32 i;
+ for (i = 0; sub0[i].text != NULL; i++)
+ ;
+ if (i)
+ i--;
+ while (i)
+ {
+ if (sub0[i].flag != 0xffff && FlagGet(sub0[i].flag) == TRUE)
+ break;
+ i--;
+ }
+ if (sub0[i].flag2 != 0xffff)
+ FlagSet(sub0[i].flag2);
+ StringExpandPlaceholders(dest, sub0[i].text);
+}
+
+#ifdef NONMATCHING
+// There's some weird upmerge going on that I cannot replicate at this time.
+static void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest)
+{
+ u32 i;
+ for (i = 0; sub0[i].text != NULL; i++)
+ {
+ if (sub0[i].flag == 0xfffe)
+ break;
+ if (sub0[i].flag == 0xffff && !FlagGet(sub0[i].flag))
+ break;
+ }
+ if (sub0[i].flag != 0xfffe)
+ {
+ if (i)
+ i--;
+ if (sub0[i].flag2 != 0xffff)
+ FlagSet(sub0[i].flag2);
+ StringExpandPlaceholders(dest, sub0[i].text);
+ }
+ else
+ {
+ if (!FlagGet(FLAG_SYS_GAME_CLEAR))
+ ;
+ else if (gSaveBlock1Ptr->trainerRematches[idx])
+ i += 2;
+ else if (CountBattledRematchTeams(idx) >= 2)
+ i += 3;
+ else
+ i++;
+ StringExpandPlaceholders(dest, sub0[i].text);
+ }
+}
+#else
+static NAKED void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tadds r6, r0, 0\n"
+ "\tmov r10, r2\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r7, r1, 16\n"
+ "\tmovs r5, 0\n"
+ "\tldr r0, [r6]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _081D19E6\n"
+ "\tldrh r0, [r6, 0x4]\n"
+ "\tldr r1, =0x0000fffe\n"
+ "\tcmp r0, r1\n"
+ "\tbeq _081D1A24\n"
+ "\tldr r0, =0x0000ffff\n"
+ "\tmov r9, r0\n"
+ "\tmov r8, r1\n"
+ "\tadds r4, r6, 0\n"
+ "_081D19C6:\n"
+ "\tldrh r0, [r4, 0x4]\n"
+ "\tcmp r0, r9\n"
+ "\tbeq _081D19D6\n"
+ "\tbl FlagGet\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _081D19E6\n"
+ "_081D19D6:\n"
+ "\tadds r4, 0x8\n"
+ "\tadds r5, 0x1\n"
+ "\tldr r0, [r4]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _081D19E6\n"
+ "\tldrh r0, [r4, 0x4]\n"
+ "\tcmp r0, r8\n"
+ "\tbne _081D19C6\n"
+ "_081D19E6:\n"
+ "\tlsls r0, r5, 3\n"
+ "\tadds r0, r6\n"
+ "\tldrh r1, [r0, 0x4]\n"
+ "\tldr r0, =0x0000fffe\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _081D1A24\n"
+ "\tcmp r5, 0\n"
+ "\tbeq _081D19F8\n"
+ "\tsubs r5, 0x1\n"
+ "_081D19F8:\n"
+ "\tlsls r0, r5, 3\n"
+ "\tadds r4, r0, r6\n"
+ "\tldrh r1, [r4, 0x6]\n"
+ "\tldr r0, =0x0000ffff\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _081D1A0A\n"
+ "\tadds r0, r1, 0\n"
+ "\tbl FlagSet\n"
+ "_081D1A0A:\n"
+ "\tldr r1, [r4]\n"
+ "\tmov r0, r10\n"
+ "\tbl StringExpandPlaceholders\n"
+ "\tb _081D1A5C\n"
+ "\t.pool\n"
+ "_081D1A1C:\n"
+ "\tadds r5, 0x2\n"
+ "\tb _081D1A50\n"
+ "_081D1A20:\n"
+ "\tadds r5, 0x3\n"
+ "\tb _081D1A50\n"
+ "_081D1A24:\n"
+ "\tldr r0, =0x00000864\n"
+ "\tbl FlagGet\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _081D1A50\n"
+ "\tldr r0, =gSaveBlock1Ptr\n"
+ "\tldr r0, [r0]\n"
+ "\tldr r1, =0x000009ca\n"
+ "\tadds r0, r1\n"
+ "\tadds r0, r7\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _081D1A1C\n"
+ "\tadds r0, r7, 0\n"
+ "\tbl CountBattledRematchTeams\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x1\n"
+ "\tbhi _081D1A20\n"
+ "\tadds r5, 0x1\n"
+ "_081D1A50:\n"
+ "\tlsls r0, r5, 3\n"
+ "\tadds r0, r6\n"
+ "\tldr r1, [r0]\n"
+ "\tmov r0, r10\n"
+ "\tbl StringExpandPlaceholders\n"
+ "_081D1A5C:\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif
+
+void sub_81D1A78(u32 idx, const u8 **desc, const u8 **name)
+{
+ match_call_t matchCall;
+ u32 i;
+
+ if (idx > 20)
+ return;
+ matchCall = sMatchCallHeaders[idx];
+ i = MatchCallGetFunctionIndex(matchCall);
+ sMatchCall_GetNameAndDescFunctions[i](matchCall, desc, name);
+}
+
+static void MatchCall_GetNameAndDesc_Type0(match_call_t matchCall, const u8 **desc, const u8 **name)
+{
+ *desc = matchCall.type0->desc;
+ *name = matchCall.type0->name;
+}
+
+static void MatchCall_GetNameAndDesc_Type1(match_call_t matchCall, const u8 **desc, const u8 **name)
+{
+ match_call_t _matchCall = matchCall;
+ if (_matchCall.type1->name == NULL)
+ MatchCall_GetNameAndDescByRematchIdx(_matchCall.type1->rematchTableIdx, desc, name);
+ else
+ *name = _matchCall.type1->name;
+ *desc = _matchCall.type1->desc;
+}
+
+static void MatchCall_GetNameAndDesc_Type2(match_call_t matchCall, const u8 **desc, const u8 **name)
+{
+ MatchCall_GetNameAndDescByRematchIdx(matchCall.type2->rematchTableIdx, desc, name);
+ *desc = matchCall.type2->desc;
+}
+
+static void MatchCall_GetNameAndDesc_Type3(match_call_t matchCall, const u8 **desc, const u8 **name)
+{
+ *desc = matchCall.type4->desc;
+ *name = matchCall.type4->name;
+}
+
+static void MatchCall_GetNameAndDesc_Type4(match_call_t matchCall, const u8 **desc, const u8 **name)
+{
+ *desc = matchCall.type3->desc;
+ *name = matchCall.type3->name;
+}
+
+static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const u8 **name)
+{
+ const struct Trainer *trainer = gTrainers + GetTrainerIdxByRematchIdx(idx);
+ *desc = gTrainerClassNames[trainer->trainerClass];
+ *name = trainer->trainerName;
+}
+
+#ifdef NONMATCHING
+const u8 *sub_81D1B40(u32 idx, u32 offset)
+{
+ u32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sMatchCallCheckPageOverrides[i].idx == idx)
+ {
+ for (; i + 1 < 4 && sMatchCallCheckPageOverrides[i + 1].idx == idx; i++)
+ {
+ if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4))
+ break;
+ }
+ return sMatchCallCheckPageOverrides[i].v8[offset];
+ }
+ }
+ return NULL;
+}
+#else
+NAKED const u8 *sub_81D1B40(u32 idx, u32 offset)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r9\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6,r7}\n"
+ "\tadds r6, r0, 0\n"
+ "\tmovs r5, 0\n"
+ "\tldr r2, =sMatchCallCheckPageOverrides\n"
+ "\tmovs r0, 0x8\n"
+ "\tadds r0, r2\n"
+ "\tmov r9, r0\n"
+ "_081D1B54:\n"
+ "\tlsls r0, r5, 1\n"
+ "\tadds r0, r5\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r2\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, r6\n"
+ "\tbne _081D1BBC\n"
+ "\tadds r4, r5, 0x1\n"
+ "\tlsls r1, 2\n"
+ "\tmov r8, r1\n"
+ "\tcmp r4, 0x3\n"
+ "\tbhi _081D1BA8\n"
+ "\tlsls r0, r4, 1\n"
+ "\tadds r0, r4\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r2\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, r6\n"
+ "\tbne _081D1BA8\n"
+ "\tldr r7, =sMatchCallCheckPageOverrides\n"
+ "_081D1B7C:\n"
+ "\tlsls r0, r4, 1\n"
+ "\tadds r0, r4\n"
+ "\tlsls r0, 3\n"
+ "\tadds r1, r7, 0x4\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0]\n"
+ "\tbl FlagGet\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _081D1BA8\n"
+ "\tadds r5, r4, 0\n"
+ "\tadds r4, r5, 0x1\n"
+ "\tcmp r4, 0x3\n"
+ "\tbhi _081D1BA8\n"
+ "\tlsls r0, r4, 1\n"
+ "\tadds r0, r4\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r7\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, r6\n"
+ "\tbeq _081D1B7C\n"
+ "_081D1BA8:\n"
+ "\tlsls r0, r5, 1\n"
+ "\tadds r0, r5\n"
+ "\tlsls r0, 3\n"
+ "\tadd r0, r8\n"
+ "\tadd r0, r9\n"
+ "\tldr r0, [r0]\n"
+ "\tb _081D1BC4\n"
+ "\t.pool\n"
+ "_081D1BBC:\n"
+ "\tadds r5, 0x1\n"
+ "\tcmp r5, 0x3\n"
+ "\tbls _081D1B54\n"
+ "\tmovs r0, 0\n"
+ "_081D1BC4:\n"
+ "\tpop {r3,r4}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+}
+#endif
+
+s32 sub_81D1BD0(u32 idx)
+{
+ u32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sMatchCallCheckPageOverrides[i].idx == idx)
+ return sMatchCallCheckPageOverrides[i].v2;
+ }
+ return -1;
+}
+
+bool32 sub_81D1BF8(u32 idx)
+{
+ s32 i;
+
+ for (i = 0; i < 21; i++)
+ {
+ u32 r0 = MatchCall_GetRematchTableIdx(i);
+ if (r0 != REMATCH_TABLE_ENTRIES && r0 == idx)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void SetMatchCallRegisteredFlag(void)
+{
+ s32 r0 = GetRematchIdxByTrainerIdx(gSpecialVar_0x8004);
+ if (r0 >= 0)
+ FlagSet(FLAG_MATCH_CALL_REGISTERED + r0);
+}
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
new file mode 100644
index 000000000..591e3ad9a
--- /dev/null
+++ b/src/mauville_old_man.c
@@ -0,0 +1,1248 @@
+#include "global.h"
+#include "main.h"
+#include "constants/songs.h"
+#include "constants/easy_chat.h"
+#include "constants/event_objects.h"
+#include "constants/vars.h"
+#include "mauville_old_man.h"
+#include "event_data.h"
+#include "string_util.h"
+#include "text.h"
+#include "easy_chat.h"
+#include "script.h"
+#include "random.h"
+#include "event_scripts.h"
+#include "task.h"
+#include "menu.h"
+#include "m4a.h"
+#include "bard_music.h"
+#include "sound.h"
+#include "strings.h"
+#include "overworld.h"
+#include "field_message_box.h"
+#include "script_menu.h"
+#include "trader.h"
+
+#define CHAR_SONG_WORD_SEPARATOR 0x37
+
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
+
+static void InitGiddyTaleList(void);
+static void StartBardSong(bool8 useTemporaryLyrics);
+static void Task_BardSong(u8 taskId);
+static void StorytellerSetup(void);
+static void Storyteller_ResetFlag(void);
+
+IWRAM_DATA u8 sSelectedStory;
+
+struct BardSong gBardSong;
+
+static EWRAM_DATA u16 sUnknownBardRelated = 0;
+static EWRAM_DATA struct MauvilleManStoryteller * sStorytellerPtr = NULL;
+static EWRAM_DATA u8 sStorytellerWindowId = 0;
+
+static const u16 sDefaultBardSongLyrics[6] = {
+ EC_WORD_SHAKE,
+ EC_WORD_IT,
+ EC_WORD_DO,
+ EC_WORD_THE,
+ EC_WORD_DIET,
+ EC_WORD_DANCE
+};
+
+static const u8 * const sGiddyAdjectives[] = {
+ gText_SoPretty,
+ gText_SoDarling,
+ gText_SoRelaxed,
+ gText_SoSunny,
+ gText_SoDesirable,
+ gText_SoExciting,
+ gText_SoAmusing,
+ gText_SoMagical
+};
+
+static const u8 * const sGiddyQuestions[] = {
+ gUnknown_08294313,
+ gUnknown_08294359,
+ gUnknown_08294398,
+ gUnknown_082943DA,
+ gUnknown_0829441C,
+ gUnknown_08294460,
+ gUnknown_082944A0,
+ gUnknown_082944D5
+};
+
+static void SetupBard(void)
+{
+ u16 i;
+ struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
+
+ bard->id = MAUVILLE_MAN_BARD;
+ bard->hasChangedSong = FALSE;
+ bard->language = gGameLanguage;
+ for (i = 0; i < 6; i++)
+ bard->songLyrics[i] = sDefaultBardSongLyrics[i];
+}
+
+static void SetupHipster(void)
+{
+ struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
+
+ hipster->id = MAUVILLE_MAN_HIPSTER;
+ hipster->alreadySpoken = FALSE;
+ hipster->language = gGameLanguage;
+}
+
+static void SetupStoryteller(void)
+{
+ StorytellerSetup();
+}
+
+static void SetupGiddy(void)
+{
+ struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy;
+
+ giddy->id = MAUVILLE_MAN_GIDDY;
+ giddy->taleCounter = 0;
+ giddy->language = gGameLanguage;
+}
+
+static void SetupTrader(void)
+{
+ TraderSetup();
+}
+
+void SetMauvilleOldMan(void)
+{
+ u16 trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];
+
+
+ // Determine man based on the last digit of the player's trainer ID.
+ switch ((trainerId % 10) / 2)
+ {
+ case MAUVILLE_MAN_BARD:
+ SetupBard();
+ break;
+ case MAUVILLE_MAN_HIPSTER:
+ SetupHipster();
+ break;
+ case MAUVILLE_MAN_TRADER:
+ SetupTrader();
+ break;
+ case MAUVILLE_MAN_STORYTELLER:
+ SetupStoryteller();
+ break;
+ case MAUVILLE_MAN_GIDDY:
+ SetupGiddy();
+ break;
+ }
+ ScrSpecial_SetMauvilleOldManEventObjGfx();
+}
+
+u8 GetCurrentMauvilleOldMan(void)
+{
+ struct MauvilleManCommon *common = &gSaveBlock1Ptr->oldMan.common;
+
+ return common->id;
+}
+
+void ScrSpecial_GetCurrentMauvilleMan(void)
+{
+ gSpecialVar_Result = GetCurrentMauvilleOldMan();
+}
+
+void ScrSpecial_HasBardSongBeenChanged(void)
+{
+ u16 *scriptResult = &gSpecialVar_Result; // why??
+ struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
+
+ *scriptResult = bard->hasChangedSong;
+}
+
+void ScrSpecial_SaveBardSongLyrics(void)
+{
+ u16 i;
+ struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
+
+ StringCopy(bard->playerName, gSaveBlock2Ptr->playerName);
+
+ for (i = 0; i < 4; i++)
+ bard->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+
+ for (i = 0; i < 6; i++)
+ bard->songLyrics[i] = bard->temporaryLyrics[i];
+
+ bard->hasChangedSong = TRUE;
+}
+
+// Copies lyrics into gStringVar4
+static void PrepareSongText(void)
+{
+ struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
+ u16 * lyrics = gSpecialVar_0x8004 == 0 ? bard->songLyrics : bard->temporaryLyrics;
+ u8 * wordEnd = gStringVar4;
+ u8 * str = wordEnd;
+ u16 lineNum;
+
+ // Put three words on each line
+ for (lineNum = 0; lineNum < 2; lineNum++)
+ {
+ wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++));
+ while (wordEnd != str)
+ {
+ if (*str == CHAR_SPACE)
+ *str = CHAR_SONG_WORD_SEPARATOR;
+ str++;
+ }
+
+ str++;
+ *(wordEnd++) = CHAR_SPACE;
+
+ wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++));
+ while (wordEnd != str)
+ {
+ if (*str == CHAR_SPACE)
+ *str = CHAR_SONG_WORD_SEPARATOR;
+ str++;
+ }
+
+ str++;
+ *(wordEnd++) = CHAR_NEWLINE;
+
+ wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++));
+ while (wordEnd != str)
+ {
+ if (*str == CHAR_SPACE)
+ *str = CHAR_SONG_WORD_SEPARATOR;
+ str++;
+ }
+
+ if (lineNum == 0)
+ {
+ *(wordEnd++) = EXT_CTRL_CODE_BEGIN;
+ *(wordEnd++) = 15;
+ }
+ }
+}
+
+void ScrSpecial_PlayBardSong(void)
+{
+ StartBardSong(gSpecialVar_0x8004);
+ ScriptContext1_Stop();
+}
+
+void ScrSpecial_GetHipsterSpokenFlag(void)
+{
+ u16 *scriptResult = &gSpecialVar_Result; // again??
+ struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
+
+ *scriptResult = hipster->alreadySpoken;
+}
+
+void ScrSpecial_SetHipsterSpokenFlag(void)
+{
+ struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
+
+ hipster->alreadySpoken = TRUE;
+}
+
+void ScrSpecial_HipsterTeachWord(void)
+{
+ u16 var = sub_811F01C();
+
+ if (var == 0xFFFF)
+ {
+ gSpecialVar_Result = FALSE;
+ }
+ else
+ {
+ CopyEasyChatWord(gStringVar1, var);
+ gSpecialVar_Result = TRUE;
+ }
+}
+
+void ScrSpecial_GiddyShouldTellAnotherTale(void)
+{
+ struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy;
+
+ if (giddy->taleCounter == 10)
+ {
+ gSpecialVar_Result = FALSE;
+ giddy->taleCounter = 0;
+ }
+ else
+ {
+ gSpecialVar_Result = TRUE;
+ }
+}
+
+void ScrSpecial_GenerateGiddyLine(void)
+{
+ struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy;
+
+ if (giddy->taleCounter == 0)
+ InitGiddyTaleList();
+
+ if (giddy->randomWords[giddy->taleCounter] != 0xFFFF) // is not the last element of the array?
+ {
+ u8 *stringPtr;
+ u32 adjective = Random();
+
+ adjective %= 8;
+ stringPtr = CopyEasyChatWord(gStringVar4, giddy->randomWords[giddy->taleCounter]);
+ stringPtr = StringCopy(stringPtr, gOtherText_Is);
+ stringPtr = StringCopy(stringPtr, sGiddyAdjectives[adjective]);
+ StringCopy(stringPtr, gOtherText_DontYouAgree);
+ }
+ else
+ {
+ StringCopy(gStringVar4, sGiddyQuestions[giddy->questionList[giddy->questionNum++]]);
+ }
+
+ if (!(Random() % 10))
+ giddy->taleCounter = 10;
+ else
+ giddy->taleCounter++;
+
+ gSpecialVar_Result = TRUE;
+}
+
+static void InitGiddyTaleList(void)
+{
+ struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy;
+ u16 arr[][2] = {
+ {EC_GROUP_POKEMON, 0},
+ {EC_GROUP_LIFESTYLE, 0},
+ {EC_GROUP_HOBBIES, 0},
+ {EC_GROUP_MOVE_1, 0},
+ {EC_GROUP_MOVE_2, 0},
+ {EC_GROUP_POKEMON_2, 0}
+ };
+ u16 i;
+ u16 r10;
+ u16 r7;
+ u16 r1;
+
+ for (i = 0; i < 8; i++)
+ giddy->questionList[i] = i;
+
+ for (i = 0; i < 8; i++)
+ {
+ r1 = Random() % (i + 1);
+ r7 = giddy->questionList[i];
+ giddy->questionList[i] = giddy->questionList[r1];
+ giddy->questionList[r1] = r7;
+ }
+
+ r10 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ arr[i][1] = EasyChat_GetNumWordsInGroup(arr[i][0]);
+ r10 += arr[i][1];
+ }
+
+ giddy->questionNum = 0;
+ r7 = 0;
+ for (i = 0; i < 10; i++)
+ {
+ r1 = Random() % 10;
+ if (r1 < 3 && r7 < 8)
+ {
+ giddy->randomWords[i] = 0xFFFF;
+ r7++;
+ }
+ else
+ {
+ s16 r2 = Random() % r10;
+ for (r1 = 0; i < 6; r1++)
+ if ((r2 -= arr[r1][1]) <= 0)
+ break;
+ if (r1 == 6)
+ r1 = 0;
+ giddy->randomWords[i] = sub_811EE90(arr[r1][0]);
+ }
+ }
+}
+static void ResetBardFlag(void)
+{
+ struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
+
+ bard->hasChangedSong = FALSE;
+}
+
+static void ResetHipsterFlag(void)
+{
+ struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster;
+
+ hipster->alreadySpoken = FALSE;
+}
+
+static void ResetTraderFlag(void)
+{
+ Trader_ResetFlag();
+}
+
+static void ResetStorytellerFlag(void)
+{
+ Storyteller_ResetFlag();
+}
+
+void ResetMauvilleOldManFlag(void)
+{
+ switch (GetCurrentMauvilleOldMan())
+ {
+ case MAUVILLE_MAN_BARD:
+ ResetBardFlag();
+ break;
+ case MAUVILLE_MAN_HIPSTER:
+ ResetHipsterFlag();
+ break;
+ case MAUVILLE_MAN_STORYTELLER:
+ ResetStorytellerFlag();
+ break;
+ case MAUVILLE_MAN_TRADER:
+ ResetTraderFlag();
+ break;
+ case MAUVILLE_MAN_GIDDY:
+ break;
+ }
+ ScrSpecial_SetMauvilleOldManEventObjGfx();
+}
+
+
+#define tState data[0]
+#define tCharIndex data[3]
+#define tCurrWord data[4]
+#define tUseTemporaryLyrics data[5]
+
+#define MACRO1(a) (((a) & 3) + (((a) / 8) & 1))
+#define MACRO2(a) (((a) % 4) + (((a) / 8) & 1))
+
+static void StartBardSong(bool8 useTemporaryLyrics)
+{
+ u8 taskId = CreateTask(Task_BardSong, 80);
+
+ gTasks[taskId].tUseTemporaryLyrics = useTemporaryLyrics;
+}
+
+static void sub_81206F0(void)
+{
+ gUnknown_03002F84 = FALSE;
+}
+
+static void BardSong_TextSubPrinter(struct TextSubPrinter * printer, u16 a1)
+{
+ gUnknown_03002F84 = TRUE;
+}
+
+static void sub_8120708(const u8 * src)
+{
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ PrintTextOnWindow(0, 1, src, 0, 1, 1, BardSong_TextSubPrinter);
+ gUnknown_03002F84 = TRUE;
+ CopyWindowToVram(0, 3);
+}
+
+static void BardSing(struct Task *task, struct BardSong *song)
+{
+ switch (task->tState)
+ {
+ case 0: // Initialize song
+ {
+ struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
+ u16 *lyrics;
+ s32 i;
+
+ // Copy lyrics
+ if (gSpecialVar_0x8004 == 0)
+ lyrics = bard->songLyrics;
+ else
+ lyrics = bard->temporaryLyrics;
+ for (i = 0; i < 6; i++)
+ song->lyrics[i] = lyrics[i];
+ song->currWord = 0;
+ }
+ break;
+ case 1: // Wait for BGM to end
+ break;
+ case 2: // Initialize word
+ {
+ u16 word = song->lyrics[song->currWord];
+ song->sound = GetWordSounds(word);
+ GetWordPhonemes(song, MACRO1(word));
+ song->currWord++;
+ if (song->sound->var00 != 0xFF)
+ song->state = 0;
+ else
+ {
+ song->state = 3;
+ song->phonemeTimer = 2;
+ }
+ break;
+ }
+ case 3:
+ case 4:
+ {
+ const struct BardSound *sound = &song->sound[song->currPhoneme];
+
+ switch (song->state)
+ {
+ case 0:
+ song->phonemeTimer = song->phonemes[song->currPhoneme].length;
+ if (sound->var00 <= 50)
+ {
+ u8 num = sound->var00 / 3;
+ m4aSongNumStart(PH_TRAP_HELD + 3 * num);
+ }
+ song->state = 2;
+ song->phonemeTimer--;
+ break;
+ case 2:
+ song->state = 1;
+ if (sound->var00 <= 50)
+ {
+ song->volume = 0x100 + sound->volume * 16;
+ m4aMPlayVolumeControl(&gMPlayInfo_SE2, 0xFFFF, song->volume);
+ song->pitch = 0x200 + song->phonemes[song->currPhoneme].pitch;
+ m4aMPlayPitchControl(&gMPlayInfo_SE2, 0xFFFF, song->pitch);
+ }
+ break;
+ case 1:
+ if (song->voiceInflection > 10)
+ song->volume -= 2;
+ if (song->voiceInflection & 1)
+ song->pitch += 64;
+ else
+ song->pitch -= 64;
+ m4aMPlayVolumeControl(&gMPlayInfo_SE2, 0xFFFF, song->volume);
+ m4aMPlayPitchControl(&gMPlayInfo_SE2, 0xFFFF, song->pitch);
+ song->voiceInflection++;
+ song->phonemeTimer--;
+ if (song->phonemeTimer == 0)
+ {
+ song->currPhoneme++;
+ if (song->currPhoneme != 6 && song->sound[song->currPhoneme].var00 != 0xFF)
+ song->state = 0;
+ else
+ {
+ song->state = 3;
+ song->phonemeTimer = 2;
+ }
+ }
+ break;
+ case 3:
+ song->phonemeTimer--;
+ if (song->phonemeTimer == 0)
+ {
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ song->state = 4;
+ }
+ break;
+ }
+ }
+ break;
+ case 5:
+ break;
+ }
+}
+
+static void Task_BardSong(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId]; // r5
+
+ BardSing(task, &gBardSong);
+ switch (task->tState)
+ {
+ case 0: // Initialize song
+ PrepareSongText();
+ sub_8120708(gStringVar4);
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->tCharIndex = 0;
+ task->tCurrWord = 0;
+ FadeOutBGMTemporarily(4);
+ task->tState = 1;
+ break;
+ case 1: // Wait for BGM to end
+ if (IsBGMPausedOrStopped())
+ task->tState = 2;
+ break;
+ case 2: // Initialize word
+ {
+ struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard;
+ u8 *str = gStringVar4 + task->tCharIndex;
+ u16 wordLen = 0;
+ // Can't get it to match without hacking
+ u32 temp;
+ register s16 zero asm("r1");
+
+ while (*str != CHAR_SPACE
+ && *str != CHAR_NEWLINE
+ && *str != EXT_CTRL_CODE_BEGIN
+ && *str != EOS)
+ {
+ str++;
+ wordLen++;
+ }
+ if (!task->tUseTemporaryLyrics)
+ sUnknownBardRelated = MACRO2(bard->songLyrics[task->tCurrWord]);
+ else
+ sUnknownBardRelated = MACRO2(bard->temporaryLyrics[task->tCurrWord]);
+ temp = gBardSong.length / wordLen;
+ zero = 0;
+ gBardSong.length = temp;
+ if (gBardSong.length <= 0)
+ gBardSong.length = 1;
+ task->tCurrWord++;
+ if (task->data[2] == 0)
+ task->tState = 3;
+ else
+ task->tState = 5;
+ task->data[1] = zero;
+ }
+ break;
+ case 5:
+ if (task->data[2] == 0)
+ task->tState = 3;
+ else
+ task->data[2]--;
+ break;
+ case 3:
+ if (gStringVar4[task->tCharIndex] == EOS)
+ {
+ FadeInBGM(6);
+ m4aMPlayFadeOutTemporarily(&gMPlayInfo_SE2, 2);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ else if (gStringVar4[task->tCharIndex] == CHAR_SPACE)
+ {
+
+ sub_81206F0();
+ task->tCharIndex++;
+ task->tState = 2;
+ task->data[2] = 0;
+ }
+ else if (gStringVar4[task->tCharIndex] == CHAR_NEWLINE)
+ {
+ task->tCharIndex++;
+ task->tState = 2;
+ task->data[2] = 0;
+ }
+ else if (gStringVar4[task->tCharIndex] == EXT_CTRL_CODE_BEGIN)
+ {
+ task->tCharIndex += 2; // skip over control codes
+ task->tState = 2;
+ task->data[2] = 8;
+ }
+ else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR)
+ {
+ gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space
+ sub_81206F0();
+ task->tCharIndex++;
+ task->data[2] = 0;
+ }
+ else
+ {
+ switch (task->data[1])
+ {
+ case 0:
+ sub_81206F0();
+ task->data[1]++;
+ break;
+ case 1:
+ task->data[1]++;
+ break;
+ case 2:
+ task->tCharIndex++;
+ task->data[1] = 0;
+ task->data[2] = gBardSong.length;
+ task->tState = 4;
+ break;
+ }
+ }
+ break;
+ case 4:
+ task->data[2]--;
+ if (task->data[2] == 0)
+ task->tState = 3;
+ break;
+ }
+ sub_8197224();
+}
+
+void ScrSpecial_SetMauvilleOldManEventObjGfx(void)
+{
+ VarSet(VAR_OBJ_GFX_ID_0, EVENT_OBJ_GFX_BARD);
+}
+
+// Language fixers?
+
+void sub_8120B70(union OldMan * oldMan)
+{
+ s32 i;
+ u8 sp00[8];
+
+ switch (oldMan->common.id)
+ {
+ case MAUVILLE_MAN_TRADER:
+ {
+ struct MauvilleOldManTrader * trader = &oldMan->trader;
+ for (i = 0; i < 4; i++)
+ {
+ if (trader->language[i] == LANGUAGE_JAPANESE)
+ {
+ ConvertInternationalString(trader->playerNames[i], LANGUAGE_JAPANESE);
+ }
+ }
+ }
+ break;
+ case MAUVILLE_MAN_STORYTELLER:
+ {
+ struct MauvilleManStoryteller * storyteller = &oldMan->storyteller;
+ for (i = 0; i < 4; i++)
+ {
+ if (storyteller->gameStatIDs[i] != 0)
+ {
+ memcpy(sp00, storyteller->trainerNames[i], 7);
+ sp00[7] = EOS;
+ if (IsStringJapanese(sp00))
+ {
+ memset(sp00, CHAR_SPACE, 8);
+ StringCopy(sp00, gText_Friend);
+ memcpy(storyteller->trainerNames[i], sp00, 7);
+ storyteller->language[i] = GAME_LANGUAGE;
+ }
+ }
+ }
+ }
+ break;
+ }
+}
+
+void sub_8120C0C(union OldMan * oldMan, u32 r8, u32 r7, u32 r3)
+{
+ s32 i;
+
+ switch (oldMan->common.id)
+ {
+ case MAUVILLE_MAN_TRADER:
+ {
+ struct MauvilleOldManTrader * trader = &oldMan->trader;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (IsStringJapanese(trader->playerNames[i]))
+ {
+ trader->language[i] = r8;
+ }
+ else
+ {
+ trader->language[i] = r7;
+ }
+ }
+ }
+ break;
+ case MAUVILLE_MAN_STORYTELLER:
+ {
+ struct MauvilleManStoryteller * storyteller = &oldMan->storyteller;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (IsStringJapanese(storyteller->trainerNames[i]))
+ {
+ storyteller->language[i] = r8;
+ }
+ else
+ {
+ storyteller->language[i] = r7;
+ }
+ }
+ }
+ break;
+ case MAUVILLE_MAN_BARD:
+ {
+ struct MauvilleManBard * bard = &oldMan->bard;
+
+ if (r3 == LANGUAGE_JAPANESE)
+ bard->language = r8;
+ else
+ bard->language = r7;
+ }
+ break;
+ case MAUVILLE_MAN_HIPSTER:
+ {
+ struct MauvilleManHipster * hipster = &oldMan->hipster;
+
+ if (r3 == LANGUAGE_JAPANESE)
+ hipster->language = r8;
+ else
+ hipster->language = r7;
+ }
+ break;
+ case MAUVILLE_MAN_GIDDY:
+ {
+ struct MauvilleManGiddy * giddy = &oldMan->giddy;
+
+ if (r3 == LANGUAGE_JAPANESE)
+ giddy->language = r8;
+ else
+ giddy->language = r7;
+ }
+ break;
+ }
+}
+
+void SanitizeReceivedEmeraldOldMan(union OldMan * oldMan, u32 version, u32 language)
+{
+ u8 sp00[8];
+ s32 i;
+ if (oldMan->common.id == MAUVILLE_MAN_STORYTELLER && language == LANGUAGE_JAPANESE)
+ {
+ struct MauvilleManStoryteller * storyteller = &oldMan->storyteller;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (storyteller->gameStatIDs[i] != 0)
+ {
+ memcpy(sp00, storyteller->trainerNames[i], 7);
+ sp00[7] = EOS;
+ if (IsStringJapanese(sp00))
+ storyteller->language[i] = LANGUAGE_JAPANESE;
+ else
+ storyteller->language[i] = GAME_LANGUAGE;
+ }
+ }
+ }
+}
+
+void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language)
+{
+ bool32 isRuby = (version == VERSION_SAPPHIRE || version == VERSION_RUBY);
+
+ switch (oldMan->common.id)
+ {
+ case MAUVILLE_MAN_TRADER:
+ {
+ struct MauvilleOldManTrader * trader = &oldMan->trader;
+ s32 i;
+
+ if (isRuby)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ u8 * str = trader->playerNames[i];
+ if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_JPN)
+ {
+ StripExtCtrlCodes(str);
+ trader->language[i] = LANGUAGE_JAPANESE;
+ }
+ else
+ trader->language[i] = language;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (trader->language[i] == LANGUAGE_JAPANESE)
+ {
+ StripExtCtrlCodes(trader->playerNames[i]);
+ }
+ }
+ }
+ }
+ break;
+ case MAUVILLE_MAN_STORYTELLER:
+ {
+
+ struct MauvilleManStoryteller * storyteller = &oldMan->storyteller;
+ s32 i;
+
+ if (isRuby)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (storyteller->gameStatIDs[i] != 0)
+ storyteller->language[i] = language;
+ }
+ }
+ }
+ break;
+ case MAUVILLE_MAN_BARD:
+ {
+ struct MauvilleManBard * bard = &oldMan->bard;
+
+ if (isRuby)
+ {
+ bard->language = language;
+ }
+ }
+ break;
+ case MAUVILLE_MAN_HIPSTER:
+ {
+ struct MauvilleManHipster * hipster = &oldMan->hipster;
+
+ if (isRuby)
+ {
+ hipster->language = language;
+ }
+ }
+ break;
+ case MAUVILLE_MAN_GIDDY:
+ {
+ struct MauvilleManGiddy * giddy = &oldMan->giddy;
+
+ if (isRuby)
+ {
+ giddy->language = language;
+ }
+ }
+ break;
+ }
+}
+
+struct Story
+{
+ u8 stat;
+ u8 minVal;
+ const u8 *title;
+ const u8 *action;
+ const u8 *fullText;
+};
+
+static const struct Story sStorytellerStories[] = {
+ {GAME_STAT_50, 1, MauvilleCity_PokemonCenter_1F_Text_28E930, MauvilleCity_PokemonCenter_1F_Text_28E947, MauvilleCity_PokemonCenter_1F_Text_28E956},
+ {GAME_STAT_STARTED_TRENDS, 1, MauvilleCity_PokemonCenter_1F_Text_28E9D7, MauvilleCity_PokemonCenter_1F_Text_28E9EF, MauvilleCity_PokemonCenter_1F_Text_28E9FE},
+ {GAME_STAT_PLANTED_BERRIES, 1, MauvilleCity_PokemonCenter_1F_Text_28EA7D, MauvilleCity_PokemonCenter_1F_Text_28EA98, MauvilleCity_PokemonCenter_1F_Text_28EAA8},
+ {GAME_STAT_TRADED_BIKES, 1, MauvilleCity_PokemonCenter_1F_Text_28EB19, MauvilleCity_PokemonCenter_1F_Text_28EB31, MauvilleCity_PokemonCenter_1F_Text_28EB3E},
+ {GAME_STAT_GOT_INTERVIEWED, 1, MauvilleCity_PokemonCenter_1F_Text_28EBB5, MauvilleCity_PokemonCenter_1F_Text_28EBCD, MauvilleCity_PokemonCenter_1F_Text_28EBDD},
+ {GAME_STAT_TRAINER_BATTLES, 1, MauvilleCity_PokemonCenter_1F_Text_28EC60, MauvilleCity_PokemonCenter_1F_Text_28EC79, MauvilleCity_PokemonCenter_1F_Text_28EC81},
+ {GAME_STAT_POKEMON_CAPTURES, 1, MauvilleCity_PokemonCenter_1F_Text_28ED04, MauvilleCity_PokemonCenter_1F_Text_28ED21, MauvilleCity_PokemonCenter_1F_Text_28ED30},
+ {GAME_STAT_FISHING_CAPTURES, 1, MauvilleCity_PokemonCenter_1F_Text_28EDA1, MauvilleCity_PokemonCenter_1F_Text_28EDB5, MauvilleCity_PokemonCenter_1F_Text_28EDCF},
+ {GAME_STAT_HATCHED_EGGS, 1, MauvilleCity_PokemonCenter_1F_Text_28EE45, MauvilleCity_PokemonCenter_1F_Text_28EE5D, MauvilleCity_PokemonCenter_1F_Text_28EE6A},
+ {GAME_STAT_EVOLVED_POKEMON, 1, MauvilleCity_PokemonCenter_1F_Text_28EEDD, MauvilleCity_PokemonCenter_1F_Text_28EEF1, MauvilleCity_PokemonCenter_1F_Text_28EF01},
+ {GAME_STAT_USED_POKECENTER, 1, MauvilleCity_PokemonCenter_1F_Text_28EF73, MauvilleCity_PokemonCenter_1F_Text_28EF95, MauvilleCity_PokemonCenter_1F_Text_28EFAA},
+ {GAME_STAT_RESTED_AT_HOME, 1, MauvilleCity_PokemonCenter_1F_Text_28F045, MauvilleCity_PokemonCenter_1F_Text_28F05A, MauvilleCity_PokemonCenter_1F_Text_28F071},
+ {GAME_STAT_ENTERED_SAFARI_ZONE, 1, MauvilleCity_PokemonCenter_1F_Text_28F0F3, MauvilleCity_PokemonCenter_1F_Text_28F10D, MauvilleCity_PokemonCenter_1F_Text_28F125},
+ {GAME_STAT_USED_CUT, 1, MauvilleCity_PokemonCenter_1F_Text_28F1BE, MauvilleCity_PokemonCenter_1F_Text_28F1D5, MauvilleCity_PokemonCenter_1F_Text_28F1DE},
+ {GAME_STAT_USED_ROCK_SMASH, 1, MauvilleCity_PokemonCenter_1F_Text_28F24F, MauvilleCity_PokemonCenter_1F_Text_28F269, MauvilleCity_PokemonCenter_1F_Text_28F277},
+ {GAME_STAT_MOVED_SECRET_BASE, 1, MauvilleCity_PokemonCenter_1F_Text_28F2FC, MauvilleCity_PokemonCenter_1F_Text_28F314, MauvilleCity_PokemonCenter_1F_Text_28F32A},
+ {GAME_STAT_USED_SPLASH, 1, MauvilleCity_PokemonCenter_1F_Text_28F3AD, MauvilleCity_PokemonCenter_1F_Text_28F3C6, MauvilleCity_PokemonCenter_1F_Text_28F3D2},
+ {GAME_STAT_USED_STRUGGLE, 1, MauvilleCity_PokemonCenter_1F_Text_28F44B, MauvilleCity_PokemonCenter_1F_Text_28F461, MauvilleCity_PokemonCenter_1F_Text_28F47C},
+ {GAME_STAT_SLOT_JACKPOTS, 1, MauvilleCity_PokemonCenter_1F_Text_28F50C, MauvilleCity_PokemonCenter_1F_Text_28F51B, MauvilleCity_PokemonCenter_1F_Text_28F538},
+ {GAME_STAT_CONSECUTIVE_ROULETTE_WINS, 2, MauvilleCity_PokemonCenter_1F_Text_28F5BE, MauvilleCity_PokemonCenter_1F_Text_28F5D1, MauvilleCity_PokemonCenter_1F_Text_28F5F2},
+ {GAME_STAT_ENTERED_BATTLE_TOWER, 1, MauvilleCity_PokemonCenter_1F_Text_28F678, MauvilleCity_PokemonCenter_1F_Text_28F694, MauvilleCity_PokemonCenter_1F_Text_28F6B4},
+ {GAME_STAT_POKEBLOCKS, 1, MauvilleCity_PokemonCenter_1F_Text_28F751, MauvilleCity_PokemonCenter_1F_Text_28F76A, MauvilleCity_PokemonCenter_1F_Text_28F776},
+ {GAME_STAT_ENTERED_CONTEST, 1, MauvilleCity_PokemonCenter_1F_Text_28F7F6, MauvilleCity_PokemonCenter_1F_Text_28F811, MauvilleCity_PokemonCenter_1F_Text_28F822},
+ {GAME_STAT_WON_CONTEST, 1, MauvilleCity_PokemonCenter_1F_Text_28F89C, MauvilleCity_PokemonCenter_1F_Text_28F8AF, MauvilleCity_PokemonCenter_1F_Text_28F8BC},
+ {GAME_STAT_SHOPPED, 1, MauvilleCity_PokemonCenter_1F_Text_28F92F, MauvilleCity_PokemonCenter_1F_Text_28F941, MauvilleCity_PokemonCenter_1F_Text_28F949},
+ {GAME_STAT_USED_ITEMFINDER, 1, MauvilleCity_PokemonCenter_1F_Text_28F9D1, MauvilleCity_PokemonCenter_1F_Text_28F9EA, MauvilleCity_PokemonCenter_1F_Text_28F9FD},
+ {GAME_STAT_GOT_RAINED_ON, 1, MauvilleCity_PokemonCenter_1F_Text_28FA81, MauvilleCity_PokemonCenter_1F_Text_28FA99, MauvilleCity_PokemonCenter_1F_Text_28FAA7},
+ {GAME_STAT_CHECKED_POKEDEX, 1, MauvilleCity_PokemonCenter_1F_Text_28FB1D, MauvilleCity_PokemonCenter_1F_Text_28FB35, MauvilleCity_PokemonCenter_1F_Text_28FB47},
+ {GAME_STAT_RECEIVED_RIBBONS, 1, MauvilleCity_PokemonCenter_1F_Text_28FBC4, MauvilleCity_PokemonCenter_1F_Text_28FBD9, MauvilleCity_PokemonCenter_1F_Text_28FBEA},
+ {GAME_STAT_JUMPED_DOWN_LEDGES, 1, MauvilleCity_PokemonCenter_1F_Text_28FC6B, MauvilleCity_PokemonCenter_1F_Text_28FC85, MauvilleCity_PokemonCenter_1F_Text_28FC98},
+ {GAME_STAT_WATCHED_TV, 1, MauvilleCity_PokemonCenter_1F_Text_28FD1D, MauvilleCity_PokemonCenter_1F_Text_28FD35, MauvilleCity_PokemonCenter_1F_Text_28FD40},
+ {GAME_STAT_CHECKED_CLOCK, 1, MauvilleCity_PokemonCenter_1F_Text_28FDA2, MauvilleCity_PokemonCenter_1F_Text_28FDBD, MauvilleCity_PokemonCenter_1F_Text_28FDCE},
+ {GAME_STAT_WON_POKEMON_LOTTERY, 1, MauvilleCity_PokemonCenter_1F_Text_28FE57, MauvilleCity_PokemonCenter_1F_Text_28FE72, MauvilleCity_PokemonCenter_1F_Text_28FE88},
+ {GAME_STAT_USED_DAYCARE, 1, MauvilleCity_PokemonCenter_1F_Text_28FF0C, MauvilleCity_PokemonCenter_1F_Text_28FF27, MauvilleCity_PokemonCenter_1F_Text_28FF44},
+ {GAME_STAT_RODE_CABLE_CAR, 1, MauvilleCity_PokemonCenter_1F_Text_28FFDD, MauvilleCity_PokemonCenter_1F_Text_28FFFA, MauvilleCity_PokemonCenter_1F_Text_29000D},
+ {GAME_STAT_ENTERED_HOT_SPRINGS, 1, MauvilleCity_PokemonCenter_1F_Text_290097, MauvilleCity_PokemonCenter_1F_Text_2900B5, MauvilleCity_PokemonCenter_1F_Text_2900CB}
+};
+
+static void StorytellerSetup(void)
+{
+ s32 i;
+ sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller;
+
+ sStorytellerPtr->id = MAUVILLE_MAN_STORYTELLER;
+ sStorytellerPtr->alreadyRecorded = FALSE;
+ for (i = 0; i < 4; i++)
+ {
+ sStorytellerPtr->gameStatIDs[i] = 0;
+ sStorytellerPtr->trainerNames[0][i] = EOS; // Maybe they meant storyteller->trainerNames[i][0] instead?
+ }
+}
+
+static void Storyteller_ResetFlag(void)
+{
+ sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller;
+
+ sStorytellerPtr->id = MAUVILLE_MAN_STORYTELLER;
+ sStorytellerPtr->alreadyRecorded = FALSE;
+}
+
+static u32 StorytellerGetGameStat(u8 stat)
+{
+ if (stat == 50)
+ stat = 0;
+ return GetGameStat(stat);
+}
+
+static const struct Story *GetStoryByStat(u32 stat)
+{
+ s32 i;
+
+ for (i = 0; i < 36; i++)
+ {
+ if (sStorytellerStories[i].stat == stat)
+ return &sStorytellerStories[i];
+ }
+ return &sStorytellerStories[35];
+}
+
+static const u8 *GetStoryTitleByStat(u32 stat)
+{
+ return GetStoryByStat(stat)->title;
+}
+
+static const u8 *GetStoryTextByStat(u32 stat)
+{
+ return GetStoryByStat(stat)->fullText;
+}
+
+static const u8 *GetStoryActionByStat(u32 stat)
+{
+ return GetStoryByStat(stat)->action;
+}
+
+static u8 GetFreeStorySlot(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sStorytellerPtr->gameStatIDs[i] == 0)
+ break;
+ }
+ return i;
+}
+
+static u32 StorytellerGetRecordedTrainerStat(u32 trainer)
+{
+ u8 *ptr = sStorytellerPtr->statValues[trainer];
+
+ return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24);
+}
+
+static void StorytellerSetRecordedTrainerStat(u32 trainer, u32 val)
+{
+ u8 *ptr = sStorytellerPtr->statValues[trainer];
+
+ ptr[0] = val;
+ ptr[1] = val >> 8;
+ ptr[2] = val >> 16;
+ ptr[3] = val >> 24;
+}
+
+static bool32 HasTrainerStatIncreased(u32 trainer)
+{
+ if (StorytellerGetGameStat(sStorytellerPtr->gameStatIDs[trainer]) > StorytellerGetRecordedTrainerStat(trainer))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void GetStoryByStattellerPlayerName(u32 player, void *dst)
+{
+ u8 *name = sStorytellerPtr->trainerNames[player];
+
+ memset(dst, EOS, 8);
+ memcpy(dst, name, 7);
+}
+
+static void StorytellerSetPlayerName(u32 player, const u8 * src)
+{
+ u8 * name = sStorytellerPtr->trainerNames[player];
+ memset(name, EOS, 7);
+ memcpy(name, src, 7);
+}
+
+
+static void StorytellerRecordNewStat(u32 player, u32 stat)
+{
+ sStorytellerPtr->gameStatIDs[player] = stat;
+ StorytellerSetPlayerName(player, gSaveBlock2Ptr->playerName);
+ StorytellerSetRecordedTrainerStat(player, StorytellerGetGameStat(stat));
+ ConvertIntToDecimalStringN(gStringVar1, StorytellerGetGameStat(stat), STR_CONV_MODE_LEFT_ALIGN, 10);
+ StringCopy(gStringVar2, GetStoryActionByStat(stat));
+ sStorytellerPtr->language[player] = gGameLanguage;
+}
+
+static void ScrambleStatList(u8 * arr, s32 count)
+{
+ s32 i;
+
+ for (i = 0; i < count; i++)
+ arr[i] = i;
+ for (i = 0; i < count; i++)
+ {
+ u32 a = Random() % count;
+ u32 b = Random() % count;
+ u8 temp = arr[a];
+ arr[a] = arr[b];
+ arr[b] = temp;
+ }
+}
+
+struct UnknownStruct_0859F288
+{
+ s32 length;
+ u32 unused2;
+};
+
+static const struct UnknownStruct_0859F288 sStorytellerStuff = {
+ ARRAY_COUNT(sStorytellerStories),
+ sizeof(sStorytellerStuff)
+};
+
+static bool8 StorytellerInitializeRandomStat(void)
+{
+ u8 arr[sStorytellerStuff.length];
+ s32 i;
+ s32 j;
+
+ ScrambleStatList(arr, ARRAY_COUNT(sStorytellerStories));
+ for (i = 0; i < (s32)ARRAY_COUNT(sStorytellerStories); i++)
+ {
+ u8 stat = sStorytellerStories[arr[i]].stat;
+ u8 minVal = sStorytellerStories[arr[i]].minVal;
+
+ for (j = 0; j < 4; j++)
+ {
+ if (sStorytellerPtr->gameStatIDs[j] == stat)
+ break;
+ }
+ if (j == 4 && StorytellerGetGameStat(stat) >= minVal)
+ {
+ sStorytellerPtr->alreadyRecorded = TRUE;
+ if (GetFreeStorySlot() == 4)
+ StorytellerRecordNewStat(sSelectedStory, stat);
+ else
+ StorytellerRecordNewStat(GetFreeStorySlot(), stat);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void StorytellerDisplayStory(u32 player)
+{
+ u8 stat = sStorytellerPtr->gameStatIDs[player];
+
+ ConvertIntToDecimalStringN(gStringVar1, StorytellerGetRecordedTrainerStat(player), 0, 10);
+ StringCopy(gStringVar2, GetStoryActionByStat(stat));
+ GetStoryByStattellerPlayerName(player, gStringVar3);
+ ConvertInternationalString(gStringVar3, sStorytellerPtr->language[player]);
+ ShowFieldMessage(GetStoryTextByStat(stat));
+}
+
+static void PrintStoryList(void)
+{
+ s32 i;
+ s32 width = GetStringWidth(1, gText_Exit, 0);
+ u8 tileWidth;
+ for (i = 0; i < 4; i++)
+ {
+ s32 curWidth;
+ u16 gameStatID = sStorytellerPtr->gameStatIDs[i];
+
+ if (gameStatID == 0)
+ break;
+ curWidth = GetStringWidth(1, GetStoryTitleByStat(gameStatID), 0);
+ if (curWidth > width)
+ width = curWidth;
+ }
+ sStorytellerWindowId = CreateWindowFromRect(0, 0, convert_pixel_width_to_tile_width(width), GetFreeStorySlot() * 2 + 2);
+ SetStandardWindowBorderStyle(sStorytellerWindowId, 0);
+ for (i = 0; i < 4; i++)
+ {
+ u16 gameStatID = sStorytellerPtr->gameStatIDs[i];
+ if (gameStatID == 0)
+ break;
+ PrintTextOnWindow(sStorytellerWindowId, 1, GetStoryTitleByStat(gameStatID), 8, 16 * i + 1, 0xFF, NULL);
+ }
+ PrintTextOnWindow(sStorytellerWindowId, 1, gText_Exit, 8, 16 * i + 1, 0xFF, NULL);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sStorytellerWindowId, GetFreeStorySlot() + 1, 0);
+ CopyWindowToVram(sStorytellerWindowId, 3);
+}
+
+static void Task_StoryListMenu(u8 taskId) // Task_StoryListMenu
+{
+ struct Task *task = &gTasks[taskId];
+ s32 selection;
+
+ switch (task->data[0])
+ {
+ case 0:
+ PrintStoryList();
+ task->data[0]++;
+ break;
+ case 1:
+ selection = ProcessMenuInput();
+ if (selection == -2)
+ break;
+ if (selection == -1 || selection == GetFreeStorySlot())
+ {
+ gSpecialVar_Result = 0;
+ }
+ else
+ {
+ gSpecialVar_Result = 1;
+ sSelectedStory = selection;
+ }
+ sub_80E2A78(sStorytellerWindowId);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+}
+
+// Sets gSpecialVar_Result to TRUE if player selected a story
+void ScrSpecial_StorytellerStoryListMenu(void)
+{
+ CreateTask(Task_StoryListMenu, 80);
+}
+
+void ScrSpecial_StorytellerDisplayStory(void)
+{
+ StorytellerDisplayStory(sSelectedStory);
+}
+
+u8 ScrSpecial_StorytellerGetFreeStorySlot(void)
+{
+ sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller;
+ return GetFreeStorySlot();
+}
+
+// Returns TRUE if stat has increased
+bool8 ScrSpecial_StorytellerUpdateStat(void)
+{
+ u8 r4;
+ sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller;
+ r4 = sStorytellerPtr->gameStatIDs[sSelectedStory];
+
+ if (HasTrainerStatIncreased(sSelectedStory) == TRUE)
+ {
+ StorytellerRecordNewStat(sSelectedStory, r4);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 ScrSpecial_HasStorytellerAlreadyRecorded(void)
+{
+ sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller;
+
+ if (sStorytellerPtr->alreadyRecorded == FALSE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 ScrSpecial_StorytellerInitializeRandomStat(void)
+{
+ sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller;
+ return StorytellerInitializeRandomStat();
+}
+
diff --git a/src/menu.c b/src/menu.c
new file mode 100644
index 000000000..96dda3075
--- /dev/null
+++ b/src/menu.c
@@ -0,0 +1,2416 @@
+#include "global.h"
+#include "bg.h"
+#include "window.h"
+#include "palette.h"
+#include "menu.h"
+#include "constants/songs.h"
+#include "main.h"
+#include "sound.h"
+#include "menu_helpers.h"
+#include "malloc.h"
+#include "task.h"
+#include "dma3.h"
+#include "string_util.h"
+#include "pokemon_icon.h"
+#include "constants/flags.h"
+#include "event_data.h"
+#include "pokedex.h"
+#include "region_map.h"
+#include "text_window.h"
+#include "strings.h"
+#include "graphics.h"
+
+#define DLG_WINDOW_PALETTE_NUM 15
+#define DLG_WINDOW_BASE_TILE_NUM 0x200
+#define STD_WINDOW_PALETTE_NUM 14
+#define STD_WINDOW_BASE_TILE_NUM 0x214
+
+struct MoveMenuInfoIcon
+{
+ u8 width;
+ u8 height;
+ u16 offset;
+};
+
+struct Menu
+{
+ u8 left;
+ u8 top;
+ s8 cursorPos;
+ s8 minCursorPos;
+ s8 maxCursorPos;
+ u8 windowId;
+ u8 fontId;
+ u8 optionWidth;
+ u8 optionHeight;
+ u8 horizontalCount;
+ u8 verticalCount;
+ bool8 APressMuted;
+};
+
+static EWRAM_DATA u8 gStartMenuWindowId = 0;
+static EWRAM_DATA u8 gUnknown_0203CD8D = 0;
+static EWRAM_DATA struct Menu gUnknown_0203CD90 = {0};
+static EWRAM_DATA u16 gUnknown_0203CD9C = 0;
+static EWRAM_DATA u8 gUnknown_0203CD9E = 0;
+static EWRAM_DATA u8 gUnknown_0203CD9F = 0;
+static EWRAM_DATA u8 gUnknown_0203CDA0 = 0;
+static EWRAM_DATA u16 sFiller = 0; // needed to align
+static EWRAM_DATA bool8 gUnknown_0203CDA4[4] = {FALSE};
+static EWRAM_DATA u16 gUnknown_0203CDA8 = 0;
+static EWRAM_DATA void *gUnknown_0203CDAC[0x20] = {NULL};
+
+const u16 gUnknown_0860F074[] = INCBIN_U16("graphics/interface/860F074.gbapal");
+static const u8 gUnknown_0860F094[] = { 8, 4, 1 };
+
+static const struct WindowTemplate gUnknown_0860F098[] =
+{
+ { 0x00, 0x02, 0x0F, 0x1B, 0x04, 0x0F, 0x194 },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_0860F0A8 =
+{
+ 0x00, 0x15, 0x09, 0x05, 0x04, 0x0F, 0x125
+};
+
+const u16 gUnknown_0860F0B0[] = INCBIN_U16("graphics/interface/860F0B0.gbapal");
+const u8 gUnknown_0860F0D0[] = { 15, 1, 2 };
+
+// Table of move info icon offsets in graphics/interface_fr/menu.png
+const struct MoveMenuInfoIcon gMoveMenuInfoIcons[] =
+{ // { width, height, offset }
+ { 12, 12, 0x00 }, // Unused
+ { 32, 12, 0x20 }, // Normal icon
+ { 32, 12, 0x64 }, // Fight icon
+ { 32, 12, 0x60 }, // Flying icon
+ { 32, 12, 0x80 }, // Poison icon
+ { 32, 12, 0x48 }, // Ground icon
+ { 32, 12, 0x44 }, // Rock icon
+ { 32, 12, 0x6C }, // Bug icon
+ { 32, 12, 0x68 }, // Ghost icon
+ { 32, 12, 0x88 }, // Steel icon
+ { 32, 12, 0xA4 }, // ??? (Mystery) icon
+ { 32, 12, 0x24 }, // Fire icon
+ { 32, 12, 0x28 }, // Water icon
+ { 32, 12, 0x2C }, // Grass icon
+ { 32, 12, 0x40 }, // Electric icon
+ { 32, 12, 0x84 }, // Psychic icon
+ { 32, 12, 0x4C }, // Ice icon
+ { 32, 12, 0xA0 }, // Dragon icon
+ { 32, 12, 0x8C }, // Dark icon
+ { 42, 12, 0xA8 }, // -Type- icon
+ { 42, 12, 0xC0 }, // -Power- icon
+ { 42, 12, 0xC8 }, // -Accuracy- icon
+ { 42, 12, 0xE0 }, // -PP- icon
+ { 42, 12, 0xE8 }, // -Effect- icon
+ { 8, 8, 0xAE }, // Unused (Small white pokeball)
+ { 8, 8, 0xAF }, // Unused (Small dark pokeball)
+};
+
+// Forward declarations
+extern void sub_81973A4(void);
+extern void DrawStandardFrame(u8, u8, u8, u8, u8, u8);
+extern void DrawDialogueFrame(u8, u8, u8, u8, u8, u8);
+extern void sub_81977BC(u8, u8, u8, u8, u8, u8);
+extern void sub_8197804(u8, u8, u8, u8, u8, u8);
+extern void sub_8197BB4(u8, u8, u8, u8, u8, u8);
+extern void sub_8197E30(u8, u8, u8, u8, u8, u8);
+extern void DrawWindowBorder(u8, u8, u8, u8, u8, u8);
+extern void sub_81980A8(u8, u8, u8, u8, u8, u8);
+extern u8 MoveMenuCursor(s8);
+extern u8 sub_8199134(s8, s8);
+extern void sub_8199F74(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, void (*callback)(struct TextSubPrinter *, u16), u8 letterSpacing, u8 lineSpacing);
+extern void sub_8198C78(void);
+extern void task_free_buf_after_copying_tile_data_to_vram(u8 taskId);
+
+void sub_81971D0(void)
+{
+ InitWindows(gUnknown_0860F098);
+ gStartMenuWindowId = 0xFF;
+ gUnknown_0203CD8D = 0xFF;
+}
+
+void sub_81971F4(void)
+{
+ FreeAllWindowBuffers();
+}
+
+void sub_8197200(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ DeactivateAllTextPrinters();
+ sub_81973A4();
+}
+
+u16 sub_8197224(void)
+{
+ RunTextPrinters();
+ return IsTextPrinterActive(0);
+}
+
+u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextSubPrinter *, u16), u8 fgColor, u8 bgColor, u8 shadowColor)
+{
+ struct TextSubPrinter printer;
+
+ printer.current_text_offset = str;
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.x = 0;
+ printer.y = 1;
+ printer.currentX = 0;
+ printer.currentY = 1;
+ printer.letterSpacing = 0;
+ printer.lineSpacing = 0;
+ printer.fontColor_l = 0;
+ printer.fgColor = fgColor;
+ printer.bgColor = bgColor;
+ printer.shadowColor = shadowColor;
+
+ gTextFlags.flag_1 = 0;
+ return AddTextPrinter(&printer, speed, callback);
+}
+
+void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress)
+{
+ void (*callback)(struct TextSubPrinter *, u16) = NULL;
+ gTextFlags.flag_0 = allowSkippingDelayWithButtonPress;
+ AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), callback, 2, 1, 3);
+}
+
+void AddTextPrinterForMessage_2(bool8 allowSkippingDelayWithButtonPress)
+{
+ gTextFlags.flag_0 = allowSkippingDelayWithButtonPress;
+ AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), NULL, 2, 1, 3);
+}
+
+void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed)
+{
+ gTextFlags.flag_0 = allowSkippingDelayWithButtonPress;
+ AddTextPrinterParameterized(0, 1, gStringVar4, speed, NULL, 2, 1, 3);
+}
+
+void sub_81973A4(void)
+{
+ LoadMessageBoxGfx(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10);
+ LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10);
+}
+
+void NewMenuHelpers_DrawDialogueFrame(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, DrawDialogueFrame);
+ FillWindowPixelBuffer(windowId, 0x11);
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void NewMenuHelpers_DrawStdWindowFrame(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, DrawStandardFrame);
+ FillWindowPixelBuffer(windowId, 0x11);
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8197434(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, sub_8197804);
+ FillWindowPixelBuffer(windowId, 0x11);
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_819746C(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, sub_81977BC);
+ FillWindowPixelBuffer(windowId, 0x11);
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ int i;
+
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 0,
+ tilemapLeft - 1,
+ tilemapTop - 1,
+ 1,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 1,
+ tilemapLeft,
+ tilemapTop - 1,
+ width,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 2,
+ tilemapLeft + width,
+ tilemapTop - 1,
+ 1,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+
+ for (i = tilemapTop; i < tilemapTop + height; i++)
+ {
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 3,
+ tilemapLeft - 1,
+ i,
+ 1,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 5,
+ tilemapLeft + width,
+ i,
+ 1,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+ }
+
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 6,
+ tilemapLeft - 1,
+ tilemapTop + height,
+ 1,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 7,
+ tilemapLeft,
+ tilemapTop + height,
+ width,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ STD_WINDOW_BASE_TILE_NUM + 8,
+ tilemapLeft + width,
+ tilemapTop + height,
+ 1,
+ 1,
+ STD_WINDOW_PALETTE_NUM);
+}
+
+void DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 1,
+ tilemapLeft - 2,
+ tilemapTop - 1,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 3,
+ tilemapLeft - 1,
+ tilemapTop - 1,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 4,
+ tilemapLeft,
+ tilemapTop - 1,
+ width - 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 5,
+ tilemapLeft + width - 1,
+ tilemapTop - 1,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 6,
+ tilemapLeft + width,
+ tilemapTop - 1,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 7,
+ tilemapLeft - 2,
+ tilemapTop,
+ 1,
+ 5,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 9,
+ tilemapLeft - 1,
+ tilemapTop,
+ width + 1,
+ 5,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ DLG_WINDOW_BASE_TILE_NUM + 10,
+ tilemapLeft + width,
+ tilemapTop,
+ 1,
+ 5,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1),
+ tilemapLeft - 2,
+ tilemapTop + height,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3),
+ tilemapLeft - 1,
+ tilemapTop + height,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4),
+ tilemapLeft,
+ tilemapTop + height,
+ width - 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5),
+ tilemapLeft + width - 1,
+ tilemapTop + height,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6),
+ tilemapLeft + width,
+ tilemapTop + height,
+ 1,
+ 1,
+ DLG_WINDOW_PALETTE_NUM);
+}
+
+void sub_81977BC(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, STD_WINDOW_PALETTE_NUM);
+}
+
+void sub_8197804(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 3, tilemapTop - 1, width + 6, height + 2, STD_WINDOW_PALETTE_NUM);
+}
+
+void SetStandardWindowBorderStyle(u8 windowId, bool8 copyToVram)
+{
+ SetWindowBorderStyle(windowId, copyToVram, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM);
+}
+
+void sub_819786C(u8 windowId, bool8 copyToVram)
+{
+ LoadMessageBoxGfx(windowId, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10);
+ sub_8197B1C(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, 0xF);
+}
+
+void sub_819789C(void)
+{
+ LoadPalette(gUnknown_0860F074, STD_WINDOW_PALETTE_NUM * 0x10, 0x14);
+}
+
+void sub_81978B0(u16 offset)
+{
+ LoadPalette(gUnknown_0860F074, offset, 0x14);
+}
+
+const u16 *sub_81978C8(void)
+{
+ return gUnknown_0860F074;
+}
+
+u16 sub_81978D0(u8 colorNum)
+{
+ if (colorNum > 15)
+ colorNum = 0;
+ return gUnknown_0860F074[colorNum];
+}
+
+void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback)
+{
+ sub_81973A4();
+ DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, 1, GetPlayerTextSpeed(), string, callback);
+ CopyWindowToVram(0, 3);
+}
+
+void sub_8197930(void)
+{
+ CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0);
+}
+
+void sub_8197948(u8 initialCursorPos)
+{
+ CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, initialCursorPos);
+}
+
+u32 sub_8197964(void)
+{
+ if (gTextFlags.flag_3)
+ return 1;
+ return gSaveBlock2Ptr->optionsTextSpeed;
+}
+
+u8 GetPlayerTextSpeed(void)
+{
+ u32 speed;
+ if (gSaveBlock2Ptr->optionsTextSpeed > 2)
+ gSaveBlock2Ptr->optionsTextSpeed = 1;
+ speed = sub_8197964();
+ return gUnknown_0860F094[speed];
+}
+
+u8 sub_81979C4(u8 a1)
+{
+ if (gStartMenuWindowId == 0xFF)
+ gStartMenuWindowId = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139);
+ return gStartMenuWindowId;
+}
+
+u8 GetStartMenuWindowId(void)
+{
+ return gStartMenuWindowId;
+}
+
+void RemoveStartMenuWindow(void)
+{
+ if (gStartMenuWindowId != 0xFF)
+ {
+ RemoveWindow(gStartMenuWindowId);
+ gStartMenuWindowId = 0xFF;
+ }
+}
+
+u16 sub_8197A30(void)
+{
+ return DLG_WINDOW_BASE_TILE_NUM;
+}
+
+u16 sub_8197A38(void)
+{
+ return STD_WINDOW_BASE_TILE_NUM;
+}
+
+u8 AddMapNamePopUpWindow(void)
+{
+ if (gUnknown_0203CD8D == 0xFF)
+ gUnknown_0203CD8D = sub_8198AA4(0, 1, 1, 10, 3, 14, 0x107);
+ return gUnknown_0203CD8D;
+}
+
+u8 GetMapNamePopUpWindowId(void)
+{
+ return gUnknown_0203CD8D;
+}
+
+void RemoveMapNamePopUpWindow(void)
+{
+ if (gUnknown_0203CD8D != 0xFF)
+ {
+ RemoveWindow(gUnknown_0203CD8D);
+ gUnknown_0203CD8D = 0xFF;
+ }
+}
+
+void AddTextPrinterWithCallbackForMessage(bool8 a1, void (*callback)(struct TextSubPrinter *, u16))
+{
+ gTextFlags.flag_0 = a1;
+ AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), callback, 2, 1, 3);
+}
+
+void sub_8197AE8(bool8 copyToVram)
+{
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0x11);
+ if (copyToVram == TRUE)
+ CopyBgTilemapBufferToVram(0);
+}
+
+void sub_8197B1C(u8 windowId, bool8 copyToVram, u16 a3, u8 a4)
+{
+ gUnknown_0203CD9C = a3;
+ gUnknown_0203CD9E = a4;
+ CallWindowFunction(windowId, sub_8197BB4);
+ FillWindowPixelBuffer(windowId, 0x11);
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8197B64(u8 windowId, bool8 copyToVram, u16 a3)
+{
+ gUnknown_0203CD9C = a3;
+ gUnknown_0203CD9E = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);
+ CallWindowFunction(windowId, sub_8197BB4);
+ FillWindowPixelBuffer(windowId, 0x11);
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8197BB4(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 1,
+ tilemapLeft - 2,
+ tilemapTop - 1,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 3,
+ tilemapLeft - 1,
+ tilemapTop - 1,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 4,
+ tilemapLeft,
+ tilemapTop - 1,
+ width - 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 5,
+ tilemapLeft + width - 1,
+ tilemapTop - 1,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 6,
+ tilemapLeft + width,
+ tilemapTop - 1,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 7,
+ tilemapLeft - 2,
+ tilemapTop,
+ 1,
+ 5,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 9,
+ tilemapLeft - 1,
+ tilemapTop,
+ width + 1,
+ 5,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 10,
+ tilemapLeft + width,
+ tilemapTop,
+ 1,
+ 5,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(gUnknown_0203CD9C + 1),
+ tilemapLeft - 2,
+ tilemapTop + height,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(gUnknown_0203CD9C + 3),
+ tilemapLeft - 1,
+ tilemapTop + height,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(gUnknown_0203CD9C + 4),
+ tilemapLeft,
+ tilemapTop + height,
+ width - 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(gUnknown_0203CD9C + 5),
+ tilemapLeft + width - 1,
+ tilemapTop + height,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ BG_TILE_V_FLIP(gUnknown_0203CD9C + 6),
+ tilemapLeft + width,
+ tilemapTop + height,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+}
+
+void sub_8197DF8(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, sub_8197E30);
+ FillWindowPixelBuffer(windowId, 0);
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8197E30(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 3, tilemapTop - 1, width + 6, height + 2, 0);
+}
+
+void SetWindowBorderStyle(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum)
+{
+ gUnknown_0203CD9C = baseTileNum;
+ gUnknown_0203CD9E = paletteNum;
+ CallWindowFunction(windowId, DrawWindowBorder);
+ FillWindowPixelBuffer(windowId, 0x11);
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8197EC8(u8 windowId, bool8 copyToVram, u16 baseTileNum)
+{
+ gUnknown_0203CD9C = baseTileNum;
+ gUnknown_0203CD9E = GetWindowAttribute(windowId, WINDOW_PALETTE_NUM);
+ CallWindowFunction(windowId, DrawWindowBorder);
+ FillWindowPixelBuffer(windowId, 0x11);
+ PutWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void DrawWindowBorder(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 0,
+ tilemapLeft - 1,
+ tilemapTop - 1,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 1,
+ tilemapLeft,
+ tilemapTop - 1,
+ width,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 2,
+ tilemapLeft + width,
+ tilemapTop - 1,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 3,
+ tilemapLeft - 1,
+ tilemapTop,
+ 1,
+ height,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 5,
+ tilemapLeft + width,
+ tilemapTop,
+ 1,
+ height,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 6,
+ tilemapLeft - 1,
+ tilemapTop + height,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 7,
+ tilemapLeft,
+ tilemapTop + height,
+ width,
+ 1,
+ gUnknown_0203CD9E);
+ FillBgTilemapBufferRect(bg,
+ gUnknown_0203CD9C + 8,
+ tilemapLeft + width,
+ tilemapTop + height,
+ 1,
+ 1,
+ gUnknown_0203CD9E);
+}
+
+void sub_8198070(u8 windowId, bool8 copyToVram)
+{
+ CallWindowFunction(windowId, sub_81980A8);
+ FillWindowPixelBuffer(windowId, 0);
+ ClearWindowTilemap(windowId);
+ if (copyToVram == TRUE)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_81980A8(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum)
+{
+ FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 0);
+}
+
+u8 sub_81980F0(u8 bg, u8 xPos, u8 yPos, u8 palette, u16 baseTile)
+{
+ struct WindowTemplate window;
+ memset(&window, 0, sizeof(window));
+
+ if (bg > 3)
+ window.priority = 0;
+ else
+ window.priority = bg;
+
+ window.tilemapTop = yPos;
+ window.height = 2;
+ window.tilemapLeft = 0x1E - xPos;
+ window.width = xPos;
+ window.paletteNum = palette;
+ window.baseBlock = baseTile;
+
+ gUnknown_0203CDA0 = AddWindow(&window);
+
+ if (palette > 15)
+ palette = 15 * 16;
+ else
+ palette *= 16;
+
+ LoadPalette(gUnknown_0860F0B0, palette, sizeof(gUnknown_0860F0B0));
+ return gUnknown_0203CDA0;
+}
+
+void sub_8198180(const u8 *string, u8 a2, bool8 copyToVram)
+{
+ u16 width = 0;
+
+ if (gUnknown_0203CDA0 != 0xFF)
+ {
+ PutWindowTilemap(gUnknown_0203CDA0);
+ FillWindowPixelBuffer(gUnknown_0203CDA0, 0xFF);
+ width = GetStringWidth(0, string, 0);
+ box_print(gUnknown_0203CDA0,
+ 0,
+ 0xEC - (GetWindowAttribute(gUnknown_0203CDA0, WINDOW_TILEMAP_LEFT) * 8) - a2 - width,
+ 1,
+ gUnknown_0860F0D0,
+ 0,
+ string);
+ if (copyToVram)
+ CopyWindowToVram(gUnknown_0203CDA0, 3);
+ }
+}
+
+void sub_8198204(const u8 *string, const u8 *string2, u8 a3, u8 a4, bool8 copyToVram)
+{
+ u8 color[3];
+ u16 width = 0;
+
+ if (gUnknown_0203CDA0 != 0xFF)
+ {
+ if (a3 != 0)
+ {
+ color[0] = 0;
+ color[1] = 1;
+ color[2] = 2;
+ }
+ else
+ {
+ color[0] = 15;
+ color[1] = 1;
+ color[2] = 2;
+ }
+ PutWindowTilemap(gUnknown_0203CDA0);
+ FillWindowPixelBuffer(gUnknown_0203CDA0, 0xFF);
+ if (string2 != NULL)
+ {
+ width = GetStringWidth(0, string2, 0);
+ box_print(gUnknown_0203CDA0,
+ 0,
+ 0xEC - (GetWindowAttribute(gUnknown_0203CDA0, WINDOW_TILEMAP_LEFT) * 8) - a4 - width,
+ 1,
+ color,
+ 0,
+ string2);
+ }
+ AddTextPrinterParameterized2(gUnknown_0203CDA0, 1, 4, 1, 0, 0, color, 0, string);
+ if (copyToVram)
+ CopyWindowToVram(gUnknown_0203CDA0, 3);
+ }
+}
+
+void sub_81982D8(void)
+{
+ if (gUnknown_0203CDA0 != 0xFF)
+ CopyWindowToVram(gUnknown_0203CDA0, 3);
+}
+
+void sub_81982F0(void)
+{
+ if (gUnknown_0203CDA0 != 0xFF)
+ {
+ FillWindowPixelBuffer(gUnknown_0203CDA0, 0xFF);
+ CopyWindowToVram(gUnknown_0203CDA0, 3);
+ }
+}
+
+void sub_8198314(void)
+{
+ if (gUnknown_0203CDA0 != 0xFF)
+ {
+ FillWindowPixelBuffer(gUnknown_0203CDA0, 0);
+ ClearWindowTilemap(gUnknown_0203CDA0);
+ CopyWindowToVram(gUnknown_0203CDA0, 3);
+ RemoveWindow(gUnknown_0203CDA0);
+ gUnknown_0203CDA0 = 0xFF;
+ }
+}
+
+u8 sub_8198348(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos, u8 a7)
+{
+ s32 pos;
+
+ gUnknown_0203CD90.left = left;
+ gUnknown_0203CD90.top = top;
+ gUnknown_0203CD90.minCursorPos = 0;
+ gUnknown_0203CD90.maxCursorPos = numChoices - 1;
+ gUnknown_0203CD90.windowId = windowId;
+ gUnknown_0203CD90.fontId = fontId;
+ gUnknown_0203CD90.optionHeight = cursorHeight;
+ gUnknown_0203CD90.APressMuted = a7;
+
+ pos = initialCursorPos;
+
+ if (pos < 0 || pos > gUnknown_0203CD90.maxCursorPos)
+ gUnknown_0203CD90.cursorPos = 0;
+ else
+ gUnknown_0203CD90.cursorPos = pos;
+
+ MoveMenuCursor(0);
+ return gUnknown_0203CD90.cursorPos;
+}
+
+u8 sub_81983AC(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos)
+{
+ return sub_8198348(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos, 0);
+}
+
+u8 sub_81983EC(u8 windowId, u8 fontId, u8 left, u8 top, u8 numChoices, u8 initialCursorPos)
+{
+ u8 cursorHeight = GetMenuCursorDimensionByFont(fontId, 1);
+ return sub_81983AC(windowId, fontId, left, top, cursorHeight, numChoices, initialCursorPos);
+}
+
+void RedrawMenuCursor(u8 oldPos, u8 newPos)
+{
+ u8 width, height;
+
+ width = GetMenuCursorDimensionByFont(gUnknown_0203CD90.fontId, 0);
+ height = GetMenuCursorDimensionByFont(gUnknown_0203CD90.fontId, 1);
+ FillWindowPixelRect(gUnknown_0203CD90.windowId, 0x11, gUnknown_0203CD90.left, gUnknown_0203CD90.optionHeight * oldPos + gUnknown_0203CD90.top, width, height);
+ PrintTextOnWindow(gUnknown_0203CD90.windowId, gUnknown_0203CD90.fontId, gText_SelectorArrow3, gUnknown_0203CD90.left, gUnknown_0203CD90.optionHeight * newPos + gUnknown_0203CD90.top, 0, 0);
+}
+
+u8 MoveMenuCursor(s8 cursorDelta)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+ int newPos = gUnknown_0203CD90.cursorPos + cursorDelta;
+
+ if (newPos < gUnknown_0203CD90.minCursorPos)
+ gUnknown_0203CD90.cursorPos = gUnknown_0203CD90.maxCursorPos;
+ else if (newPos > gUnknown_0203CD90.maxCursorPos)
+ gUnknown_0203CD90.cursorPos = gUnknown_0203CD90.minCursorPos;
+ else
+ gUnknown_0203CD90.cursorPos += cursorDelta;
+
+ RedrawMenuCursor(oldPos, gUnknown_0203CD90.cursorPos);
+ return gUnknown_0203CD90.cursorPos;
+}
+
+u8 MoveMenuCursorNoWrapAround(s8 cursorDelta)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+ int newPos = gUnknown_0203CD90.cursorPos + cursorDelta;
+
+ if (newPos < gUnknown_0203CD90.minCursorPos)
+ gUnknown_0203CD90.cursorPos = gUnknown_0203CD90.minCursorPos;
+ else if (newPos > gUnknown_0203CD90.maxCursorPos)
+ gUnknown_0203CD90.cursorPos = gUnknown_0203CD90.maxCursorPos;
+ else
+ gUnknown_0203CD90.cursorPos += cursorDelta;
+
+ RedrawMenuCursor(oldPos, gUnknown_0203CD90.cursorPos);
+ return gUnknown_0203CD90.cursorPos;
+}
+
+u8 GetMenuCursorPos(void)
+{
+ return gUnknown_0203CD90.cursorPos;
+}
+
+s8 ProcessMenuInput(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (!gUnknown_0203CD90.APressMuted)
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(-1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(1);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 ProcessMenuInputNoWrapAround(void)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (!gUnknown_0203CD90.APressMuted)
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ if (oldPos != MoveMenuCursorNoWrapAround(-1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ if (oldPos != MoveMenuCursorNoWrapAround(1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 ProcessMenuInput_other(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (!gUnknown_0203CD90.APressMuted)
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(-1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(1);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 ProcessMenuInputNoWrapAround_other(void)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (!gUnknown_0203CD90.APressMuted)
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
+ {
+ if (oldPos != MoveMenuCursorNoWrapAround(-1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
+ {
+ if (oldPos != MoveMenuCursorNoWrapAround(1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+void PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)
+{
+ u8 i;
+ for (i = 0; i < itemCount; i++)
+ {
+ PrintTextOnWindow(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL);
+ }
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_81987BC(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 a6, u8 a7)
+{
+ u8 i;
+ for (i = 0; i < itemCount; i++)
+ {
+ sub_8199F74(windowId, fontId, strs[i].text, left, (lineHeight * i) + top, 0xFF, NULL, a6, a7);
+ }
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_8198854(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs)
+{
+ PrintTextArray(windowId, fontId, GetFontAttribute(fontId, 0), 1, lineHeight, itemCount, strs);
+}
+
+void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *a8)
+{
+ u8 i;
+ struct TextSubPrinter printer;
+
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);
+ printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);
+ printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);
+ printer.fontColor_l = GetFontAttribute(fontId, FONTATTR_COLOR_LOWNIBBLE);
+ printer.letterSpacing = letterSpacing;
+ printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
+ printer.x = left;
+ printer.currentX = left;
+
+ for (i = 0; i < itemCount; i++)
+ {
+ printer.current_text_offset = strs[a8[i]].text;
+ printer.y = (lineHeight * i) + top;
+ printer.currentY = printer.y;
+ AddTextPrinter(&printer, 0xFF, NULL);
+ }
+
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_81989B8(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *a5)
+{
+ AddItemMenuActionTextPrinters(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 1, GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), lineHeight, itemCount, strs, a5);
+}
+
+void SetWindowTemplateFields(struct WindowTemplate *template, u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
+{
+ template->priority = bg;
+ template->tilemapLeft = left;
+ template->tilemapTop = top;
+ template->width = width;
+ template->height = height;
+ template->paletteNum = paletteNum;
+ template->baseBlock = baseBlock;
+}
+
+struct WindowTemplate sub_8198A50(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
+{
+ struct WindowTemplate template;
+ SetWindowTemplateFields(&template, bg, left, top, width, height, paletteNum, baseBlock);
+ return template;
+}
+
+u16 sub_8198AA4(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
+{
+ struct WindowTemplate template;
+ SetWindowTemplateFields(&template, bg, left, top, width, height, paletteNum, baseBlock);
+ return AddWindow(&template);
+}
+
+void sub_8198AF8(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos)
+{
+ struct TextSubPrinter printer;
+
+ gUnknown_0203CD9F = AddWindow(window);
+ SetWindowBorderStyle(gUnknown_0203CD9F, TRUE, baseTileNum, paletteNum);
+
+ printer.current_text_offset = gText_YesNo;
+ printer.windowId = gUnknown_0203CD9F;
+ printer.fontId = fontId;
+ printer.x = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + left;
+ printer.y = top;
+ printer.currentX = printer.x;
+ printer.currentY = printer.y;
+ printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND);
+ printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND);
+ printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW);
+ printer.fontColor_l = GetFontAttribute(fontId, FONTATTR_COLOR_LOWNIBBLE);
+ printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);
+ printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
+
+ AddTextPrinter(&printer, 0xFF, NULL);
+
+ sub_81983AC(gUnknown_0203CD9F, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT), 2, initialCursorPos);
+}
+
+void sub_8198C34(const struct WindowTemplate *window, u8 fontId, u16 baseTileNum, u8 paletteNum)
+{
+ sub_8198AF8(window, fontId, 0, 1, baseTileNum, paletteNum, 0);
+}
+
+s8 ProcessMenuInputNoWrap_(void)
+{
+ s8 result = ProcessMenuInputNoWrapAround();
+ if (result != MENU_NOTHING_CHOSEN)
+ sub_8198C78();
+ return result;
+}
+
+void sub_8198C78(void)
+{
+ sub_8198070(gUnknown_0203CD9F, TRUE);
+ RemoveWindow(gUnknown_0203CD9F);
+}
+
+void sub_8198C94(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 a5, u8 a6, u8 a7, const struct MenuAction *strs)
+{
+ u8 i;
+ u8 j;
+ for (i = 0; i < a7; i++)
+ {
+ for (j = 0; j < a6; j++)
+ {
+ PrintTextOnWindow(windowId, fontId, strs[(i * a6) + j].text, (a4 * j) + left, (a5 * i) + top, 0xFF, NULL);
+ }
+ }
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_8198D54(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struct MenuAction *strs)
+{
+ sub_8198C94(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a3, a4, a5, strs);
+}
+
+void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8)
+{
+ u8 i;
+ u8 j;
+ struct TextSubPrinter printer;
+
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.fgColor = GetFontAttribute(fontId, 5);
+ printer.bgColor = GetFontAttribute(fontId, 6);
+ printer.shadowColor = GetFontAttribute(fontId, 7);
+ printer.fontColor_l = GetFontAttribute(fontId, 4);
+ printer.letterSpacing = GetFontAttribute(fontId, 2);
+ printer.lineSpacing = GetFontAttribute(fontId, 3);
+
+ for (i = 0; i < itemCount2; i++)
+ {
+ for (j = 0; j < itemCount; j++)
+ {
+ printer.current_text_offset = strs[a8[(itemCount * i) + j]].text;
+ printer.x = (a4 * j) + left;
+ printer.y = (GetFontAttribute(fontId, 1) * i) + top;
+ printer.currentX = printer.x;
+ printer.currentY = printer.y;
+ AddTextPrinter(&printer, 0xFF, NULL);
+ }
+ }
+
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_8198EF8(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struct MenuAction *strs, const u8 *a8)
+{
+ sub_8198DBC(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a4, a5, strs, a8);
+}
+
+u8 sub_8198F58(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 cursorHeight, u8 a6, u8 a7, u8 numChoices, u8 a9)
+{
+ s32 pos;
+
+ gUnknown_0203CD90.left = left;
+ gUnknown_0203CD90.top = top;
+ gUnknown_0203CD90.minCursorPos = 0;
+ gUnknown_0203CD90.maxCursorPos = numChoices - 1;
+ gUnknown_0203CD90.windowId = windowId;
+ gUnknown_0203CD90.fontId = fontId;
+ gUnknown_0203CD90.optionWidth = a4;
+ gUnknown_0203CD90.optionHeight = cursorHeight;
+ gUnknown_0203CD90.horizontalCount = a6;
+ gUnknown_0203CD90.verticalCount = a7;
+
+ pos = a9;
+
+ if (pos < 0 || pos > gUnknown_0203CD90.maxCursorPos)
+ gUnknown_0203CD90.cursorPos = 0;
+ else
+ gUnknown_0203CD90.cursorPos = pos;
+
+ sub_8199134(0, 0);
+ return gUnknown_0203CD90.cursorPos;
+}
+
+u8 sub_8198FD4(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 a5, u8 a6, u8 a7)
+{
+ u8 cursorHeight = GetMenuCursorDimensionByFont(fontId, 1);
+ u8 numChoices = a5 * a6;
+ return sub_8198F58(windowId, fontId, left, top, a4, cursorHeight, a5, a6, numChoices, a7);
+}
+
+void sub_8199060(u8 oldCursorPos, u8 newCursorPos)
+{
+ u8 cursorWidth = GetMenuCursorDimensionByFont(gUnknown_0203CD90.fontId, 0);
+ u8 cursorHeight = GetMenuCursorDimensionByFont(gUnknown_0203CD90.fontId, 1);
+ u8 xPos = (oldCursorPos % gUnknown_0203CD90.horizontalCount) * gUnknown_0203CD90.optionWidth + gUnknown_0203CD90.left;
+ u8 yPos = (oldCursorPos / gUnknown_0203CD90.horizontalCount) * gUnknown_0203CD90.optionHeight + gUnknown_0203CD90.top;
+ FillWindowPixelRect(gUnknown_0203CD90.windowId,
+ 0x11,
+ xPos,
+ yPos,
+ cursorWidth,
+ cursorHeight);
+ xPos = (newCursorPos % gUnknown_0203CD90.horizontalCount) * gUnknown_0203CD90.optionWidth + gUnknown_0203CD90.left;
+ yPos = (newCursorPos / gUnknown_0203CD90.horizontalCount) * gUnknown_0203CD90.optionHeight + gUnknown_0203CD90.top;
+ PrintTextOnWindow(gUnknown_0203CD90.windowId,
+ gUnknown_0203CD90.fontId,
+ gText_SelectorArrow3,
+ xPos,
+ yPos,
+ 0,
+ 0);
+}
+
+u8 sub_8199134(s8 deltaX, s8 deltaY)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+
+ if (deltaX != 0)
+ {
+ if ((gUnknown_0203CD90.cursorPos % gUnknown_0203CD90.horizontalCount) + deltaX < 0)
+ {
+ gUnknown_0203CD90.cursorPos += gUnknown_0203CD90.horizontalCount - 1;
+ }
+ else if ((gUnknown_0203CD90.cursorPos % gUnknown_0203CD90.horizontalCount) + deltaX >= gUnknown_0203CD90.horizontalCount)
+ {
+ gUnknown_0203CD90.cursorPos = (gUnknown_0203CD90.cursorPos / gUnknown_0203CD90.horizontalCount) * gUnknown_0203CD90.horizontalCount;
+ }
+ else
+ {
+ gUnknown_0203CD90.cursorPos += deltaX;
+ }
+ }
+
+ if (deltaY != 0)
+ {
+ if ((gUnknown_0203CD90.cursorPos / gUnknown_0203CD90.horizontalCount) + deltaY < 0)
+ {
+ gUnknown_0203CD90.cursorPos += gUnknown_0203CD90.horizontalCount * (gUnknown_0203CD90.verticalCount - 1);
+ }
+ else if ((gUnknown_0203CD90.cursorPos / gUnknown_0203CD90.horizontalCount) + deltaY >= gUnknown_0203CD90.verticalCount)
+ {
+ gUnknown_0203CD90.cursorPos -= gUnknown_0203CD90.horizontalCount * (gUnknown_0203CD90.verticalCount - 1);
+ }
+ else
+ {
+ gUnknown_0203CD90.cursorPos += (gUnknown_0203CD90.horizontalCount * deltaY);
+ }
+ }
+
+ if (gUnknown_0203CD90.cursorPos > gUnknown_0203CD90.maxCursorPos)
+ {
+ gUnknown_0203CD90.cursorPos = oldPos;
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else
+ {
+ sub_8199060(oldPos, gUnknown_0203CD90.cursorPos);
+ return gUnknown_0203CD90.cursorPos;
+ }
+}
+
+u8 sub_81991F8(s8 deltaX, s8 deltaY)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+
+ if (deltaX != 0)
+ {
+ if (((gUnknown_0203CD90.cursorPos % gUnknown_0203CD90.horizontalCount) + deltaX >= 0) &&
+ ((gUnknown_0203CD90.cursorPos % gUnknown_0203CD90.horizontalCount) + deltaX < gUnknown_0203CD90.horizontalCount))
+ {
+ gUnknown_0203CD90.cursorPos += deltaX;
+ }
+ }
+
+ if (deltaY != 0)
+ {
+ if (((gUnknown_0203CD90.cursorPos / gUnknown_0203CD90.horizontalCount) + deltaY >= 0) &&
+ ((gUnknown_0203CD90.cursorPos / gUnknown_0203CD90.horizontalCount) + deltaY < gUnknown_0203CD90.verticalCount))
+ {
+ gUnknown_0203CD90.cursorPos += (gUnknown_0203CD90.horizontalCount * deltaY);
+ }
+ }
+
+ if (gUnknown_0203CD90.cursorPos > gUnknown_0203CD90.maxCursorPos)
+ {
+ gUnknown_0203CD90.cursorPos = oldPos;
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else
+ {
+ sub_8199060(oldPos, gUnknown_0203CD90.cursorPos);
+ return gUnknown_0203CD90.cursorPos;
+ }
+}
+
+s8 sub_8199284(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(0, -1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(0, 1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_LEFT || GetLRKeysState() == 1)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(-1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_RIGHT || GetLRKeysState() == 2)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 sub_8199334(void)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ if (oldPos != sub_81991F8(0, -1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ if (oldPos != sub_81991F8(0, 1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_LEFT || GetLRKeysState() == 1)
+ {
+ if (oldPos != sub_81991F8(-1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if (gMain.newKeys & DPAD_RIGHT || GetLRKeysState() == 2)
+ {
+ if (oldPos != sub_81991F8(1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 sub_81993D8(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(0, -1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(0, 1);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT || sub_812210C() == 1)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(-1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT || sub_812210C() == 2)
+ {
+ PlaySE(SE_SELECT);
+ sub_8199134(1, 0);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+s8 sub_8199484(void)
+{
+ u8 oldPos = gUnknown_0203CD90.cursorPos;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return gUnknown_0203CD90.cursorPos;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return MENU_B_PRESSED;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
+ {
+ if (oldPos != sub_81991F8(0, -1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
+ {
+ if (oldPos != sub_81991F8(0, 1))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT || sub_812210C() == 1)
+ {
+ if (oldPos != sub_81991F8(-1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT || sub_812210C() == 2)
+ {
+ if (oldPos != sub_81991F8(1, 0))
+ PlaySE(SE_SELECT);
+ return MENU_NOTHING_CHOSEN;
+ }
+
+ return MENU_NOTHING_CHOSEN;
+}
+
+u8 InitMenuInUpperLeftCorner(u8 windowId, u8 itemCount, u8 initialCursorPos, bool8 APressMuted)
+{
+ s32 pos;
+
+ gUnknown_0203CD90.left = 0;
+ gUnknown_0203CD90.top = 1;
+ gUnknown_0203CD90.minCursorPos = 0;
+ gUnknown_0203CD90.maxCursorPos = itemCount - 1;
+ gUnknown_0203CD90.windowId = windowId;
+ gUnknown_0203CD90.fontId = 1;
+ gUnknown_0203CD90.optionHeight = 16;
+ gUnknown_0203CD90.APressMuted = APressMuted;
+
+ pos = initialCursorPos;
+
+ if (pos < 0 || pos > gUnknown_0203CD90.maxCursorPos)
+ gUnknown_0203CD90.cursorPos = 0;
+ else
+ gUnknown_0203CD90.cursorPos = pos;
+
+ return MoveMenuCursor(0);
+}
+
+u8 InitMenuInUpperLeftCornerPlaySoundWhenAPressed(u8 windowId, u8 itemCount, u8 initialCursorPos)
+{
+ return InitMenuInUpperLeftCorner(windowId, itemCount, initialCursorPos, FALSE);
+}
+
+void PrintMenuTable(u8 windowId, u8 itemCount, const struct MenuAction *strs)
+{
+ u32 i;
+
+ for (i = 0; i < itemCount; i++)
+ {
+ PrintTextOnWindow(windowId, 1, strs[i].text, 8, (i * 16) + 1, 0xFF, NULL);
+ }
+
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_81995E4(u8 windowId, u8 itemCount, const struct MenuAction *strs, const u8 *a8)
+{
+ u8 i;
+ struct TextSubPrinter printer;
+
+ printer.windowId = windowId;
+ printer.fontId = 1;
+ printer.fgColor = GetFontAttribute(1, 5);
+ printer.bgColor = GetFontAttribute(1, 6);
+ printer.shadowColor = GetFontAttribute(1, 7);
+ printer.fontColor_l = GetFontAttribute(1, 4);
+ printer.letterSpacing = 0;
+ printer.lineSpacing = 0;
+ printer.x = 8;
+ printer.currentX = 8;
+
+ for (i = 0; i < itemCount; i++)
+ {
+ printer.current_text_offset = strs[a8[i]].text;
+ printer.y = (i * 16) + 1;
+ printer.currentY = (i * 16) + 1;
+ AddTextPrinter(&printer, 0xFF, NULL);
+ }
+
+ CopyWindowToVram(windowId, 2);
+}
+
+void CreateYesNoMenu(const struct WindowTemplate *window, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos)
+{
+ struct TextSubPrinter printer;
+
+ gUnknown_0203CD9F = AddWindow(window);
+ SetWindowBorderStyle(gUnknown_0203CD9F, TRUE, baseTileNum, paletteNum);
+
+ printer.current_text_offset = gText_YesNo;
+ printer.windowId = gUnknown_0203CD9F;
+ printer.fontId = 1;
+ printer.x = 8;
+ printer.y = 1;
+ printer.currentX = printer.x;
+ printer.currentY = printer.y;
+ printer.fgColor = GetFontAttribute(1, 5);
+ printer.bgColor = GetFontAttribute(1, 6);
+ printer.shadowColor = GetFontAttribute(1, 7);
+ printer.fontColor_l = GetFontAttribute(1, 4);
+ printer.letterSpacing = 0;
+ printer.lineSpacing = 0;
+
+ AddTextPrinter(&printer, 0xFF, NULL);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(gUnknown_0203CD9F, 2, initialCursorPos);
+}
+
+void sub_81997AC(u8 windowId, u8 a4, u8 a6, u8 a7, const struct MenuAction *strs)
+{
+ u32 i;
+ u32 j;
+ for (i = 0; i < a7; i++)
+ {
+ for (j = 0; j < a6; j++)
+ {
+ PrintTextOnWindow(windowId, 1, strs[(i * a6) + j].text, (a4 * j) + 8, (i * 16) + 1, 0xFF, NULL);
+ }
+ }
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_819983C(u8 windowId, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8)
+{
+ u8 i;
+ u8 j;
+ struct TextSubPrinter printer;
+
+ printer.windowId = windowId;
+ printer.fontId = 1;
+ printer.fgColor = GetFontAttribute(1, 5);
+ printer.bgColor = GetFontAttribute(1, 6);
+ printer.shadowColor = GetFontAttribute(1, 7);
+ printer.fontColor_l = GetFontAttribute(1, 4);
+ printer.letterSpacing = 0;
+ printer.lineSpacing = 0;
+
+ for (i = 0; i < itemCount2; i++)
+ {
+ for (j = 0; j < itemCount; j++)
+ {
+ printer.current_text_offset = strs[a8[(itemCount * i) + j]].text;
+ printer.x = (a4 * j) + 8;
+ printer.y = (16 * i) + 1;
+ printer.currentX = printer.x;
+ printer.currentY = printer.y;
+ AddTextPrinter(&printer, 0xFF, NULL);
+ }
+ }
+
+ CopyWindowToVram(windowId, 2);
+}
+
+u8 sub_8199944(u8 windowId, u8 optionWidth, u8 horizontalCount, u8 verticalCount, u8 initialCursorPos)
+{
+ s32 pos;
+
+ gUnknown_0203CD90.left = 0;
+ gUnknown_0203CD90.top = 1;
+ gUnknown_0203CD90.minCursorPos = 0;
+ gUnknown_0203CD90.maxCursorPos = (horizontalCount * verticalCount) - 1;
+ gUnknown_0203CD90.windowId = windowId;
+ gUnknown_0203CD90.fontId = 1;
+ gUnknown_0203CD90.optionWidth = optionWidth;
+ gUnknown_0203CD90.optionHeight = 16;
+ gUnknown_0203CD90.horizontalCount = horizontalCount;
+ gUnknown_0203CD90.verticalCount = verticalCount;
+
+ pos = initialCursorPos;
+
+ if (pos < 0 || pos > gUnknown_0203CD90.maxCursorPos)
+ gUnknown_0203CD90.cursorPos = 0;
+ else
+ gUnknown_0203CD90.cursorPos = pos;
+
+ sub_8199134(0, 0);
+ return gUnknown_0203CD90.cursorPos;
+}
+
+void clear_scheduled_bg_copies_to_vram(void)
+{
+ memset(gUnknown_0203CDA4, 0, sizeof(gUnknown_0203CDA4));
+}
+
+void schedule_bg_copy_tilemap_to_vram(u8 bgId)
+{
+ gUnknown_0203CDA4[bgId] = TRUE;
+}
+
+void do_scheduled_bg_tilemap_copies_to_vram(void)
+{
+ if (gUnknown_0203CDA4[0] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_0203CDA4[0] = FALSE;
+ }
+ if (gUnknown_0203CDA4[1] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(1);
+ gUnknown_0203CDA4[1] = FALSE;
+ }
+ if (gUnknown_0203CDA4[2] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(2);
+ gUnknown_0203CDA4[2] = FALSE;
+ }
+ if (gUnknown_0203CDA4[3] == TRUE)
+ {
+ CopyBgTilemapBufferToVram(3);
+ gUnknown_0203CDA4[3] = FALSE;
+ }
+}
+
+void reset_temp_tile_data_buffers(void)
+{
+ int i;
+ for (i = 0; i < (s32)ARRAY_COUNT(gUnknown_0203CDAC); i++)
+ {
+ gUnknown_0203CDAC[i] = NULL;
+ }
+ gUnknown_0203CDA8 = 0;
+}
+
+bool8 free_temp_tile_data_buffers_if_possible(void)
+{
+ int i;
+
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ if (gUnknown_0203CDA8)
+ {
+ for (i = 0; i < gUnknown_0203CDA8; i++)
+ {
+ FREE_AND_SET_NULL(gUnknown_0203CDAC[i]);
+ }
+ gUnknown_0203CDA8 = 0;
+ }
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, int size, u16 offset, u8 mode)
+{
+ int sizeOut;
+ if (gUnknown_0203CDA8 < ARRAY_COUNT(gUnknown_0203CDAC))
+ {
+ void *ptr = malloc_and_decompress(src, &sizeOut);
+ if (!size)
+ size = sizeOut;
+ if (ptr)
+ {
+ copy_decompressed_tile_data_to_vram(bgId, ptr, size, offset, mode);
+ gUnknown_0203CDAC[gUnknown_0203CDA8++] = ptr;
+ }
+ return ptr;
+ }
+ return NULL;
+}
+
+void copy_decompressed_tile_data_to_vram_autofree(u8 bgId, const void *src, int size, u16 offset, u8 mode)
+{
+ int sizeOut;
+ void *ptr = malloc_and_decompress(src, &sizeOut);
+ if (!size)
+ size = sizeOut;
+ if (ptr)
+ {
+ u8 taskId = CreateTask(task_free_buf_after_copying_tile_data_to_vram, 0);
+ gTasks[taskId].data[0] = copy_decompressed_tile_data_to_vram(bgId, ptr, size, offset, mode);
+ SetWordTaskArg(taskId, 1, (u32)ptr);
+ }
+}
+
+void task_free_buf_after_copying_tile_data_to_vram(u8 taskId)
+{
+ if (!CheckForSpaceForDma3Request(gTasks[taskId].data[0]))
+ {
+ Free((void *)GetWordTaskArg(taskId, 1));
+ DestroyTask(taskId);
+ }
+}
+
+void *malloc_and_decompress(const void *src, int *size)
+{
+ void *ptr;
+ u8 *sizeAsBytes = (u8 *)size;
+ u8 *srcAsBytes = (u8 *)src;
+
+ sizeAsBytes[0] = srcAsBytes[1];
+ sizeAsBytes[1] = srcAsBytes[2];
+ sizeAsBytes[2] = srcAsBytes[3];
+ sizeAsBytes[3] = 0;
+
+ ptr = Alloc(*size);
+ if (ptr)
+ LZ77UnCompWram(src, ptr);
+ return ptr;
+}
+
+u16 copy_decompressed_tile_data_to_vram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode)
+{
+ switch (mode)
+ {
+ case 0:
+ return LoadBgTiles(bgId, src, size, offset);
+ case 1:
+ return LoadBgTilemap(bgId, src, size, offset);
+ default:
+ return -1;
+ }
+}
+
+void sub_8199C30(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette)
+{
+ u8 i;
+ u8 j;
+ u16 *ptr = GetBgTilemapBuffer(bgId);
+
+ for (i = top; i < top + height; i++)
+ {
+ for (j = left; j < left + width; j++)
+ {
+ ptr[(i * 32) + j] = (ptr[(i * 32) + j] & 0xFFF) | (palette << 12);
+ }
+ }
+}
+
+void sub_8199CBC(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i;
+ u8 j;
+ const u16 *src = GetBgTilemapBuffer(bgId);
+
+ for (i = 0; i < height; i++)
+ {
+ for (j = 0; j < width; j++)
+ {
+ dest[(i * width) + j] = src[(i + top) * 32 + j + left];
+ }
+ }
+}
+
+void sub_8199D3C(void *ptr, int delta, int width, int height, bool32 is8BPP)
+{
+ int i;
+ int area = width * height;
+ if (is8BPP == TRUE)
+ {
+ u8 *as8BPP = ptr;
+ for (i = 0; i < area; i++)
+ {
+ as8BPP[i] += delta;
+ }
+ }
+ else
+ {
+ u16 *as4BPP = ptr;
+ for (i = 0; i < area; i++)
+ {
+ as4BPP[i] = (as4BPP[i] & 0xFC00) | ((as4BPP[i] + delta) & 0x3FF);
+ }
+ }
+}
+
+void sub_8199D98(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgY(3, 0, 0);
+}
+
+void sub_8199DF0(u32 bg, u8 a1, int a2, int a3)
+{
+ int temp = (!GetBgAttribute(bg, 4)) ? 0x20 : 0x40;
+ void *addr = (void *)((GetBgAttribute(bg, 1) * 0x4000) + (GetBgAttribute(bg, 10) + a2) * temp);
+ RequestDma3Fill(a1 << 24 | a1 << 16 | a1 << 8 | a1, addr + VRAM, a3 * temp, 1);
+}
+
+void box_print(u8 windowId, u8 fontId, u8 left, u8 top, const u8 *color, s8 speed, const u8 *str)
+{
+ struct TextSubPrinter printer;
+
+ printer.current_text_offset = str;
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.x = left;
+ printer.y = top;
+ printer.currentX = printer.x;
+ printer.currentY = printer.y;
+ printer.letterSpacing = GetFontAttribute(fontId, 2);
+ printer.lineSpacing = GetFontAttribute(fontId, 3);
+ printer.fontColor_l = 0;
+ printer.fgColor = color[1];
+ printer.bgColor = color[0];
+ printer.shadowColor = color[2];
+
+ AddTextPrinter(&printer, speed, NULL);
+}
+
+void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str)
+{
+ struct TextSubPrinter printer;
+
+ printer.current_text_offset = str;
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.x = left;
+ printer.y = top;
+ printer.currentX = printer.x;
+ printer.currentY = printer.y;
+ printer.letterSpacing = letterSpacing;
+ printer.lineSpacing = lineSpacing;
+ printer.fontColor_l = 0;
+ printer.fgColor = color[1];
+ printer.bgColor = color[0];
+ printer.shadowColor = color[2];
+
+ AddTextPrinter(&printer, speed, NULL);
+}
+
+void sub_8199F74(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, void (*callback)(struct TextSubPrinter *, u16), u8 letterSpacing, u8 lineSpacing)
+{
+ struct TextSubPrinter printer;
+
+ printer.current_text_offset = str;
+ printer.windowId = windowId;
+ printer.fontId = fontId;
+ printer.x = left;
+ printer.y = top;
+ printer.currentX = left;
+ printer.currentY = top;
+ printer.letterSpacing = letterSpacing;
+ printer.lineSpacing = lineSpacing;
+ printer.fontColor_l = 0;
+
+ printer.fgColor = GetFontAttribute(fontId, 5);
+ printer.bgColor = GetFontAttribute(fontId, 6);
+ printer.shadowColor = GetFontAttribute(fontId, 7);
+
+ AddTextPrinter(&printer, speed, callback);
+}
+
+void PrintPlayerNameOnWindow(u8 windowId, const u8 *src, u16 x, u16 y)
+{
+ int count = 0;
+ while (gSaveBlock2Ptr->playerName[count] != EOS)
+ count++;
+
+ StringExpandPlaceholders(gStringVar4, src);
+
+ PrintTextOnWindow(windowId, 1, gStringVar4, x, y, 0xFF, 0);
+}
+
+//Screw this function, it's long and unreferenced and ugh
+
+struct UnkStruct_819A080 {
+ u8 *unk00;
+ u16 unk04;
+ u16 unk06;
+};
+
+#ifdef NONMATCHING
+void sub_819A080(struct UnkStruct_819A080 *a0, struct UnkStruct_819A080 *a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
+{
+ // r3 = a3
+ // r4 = a5
+ // r1 = a6
+ // r5 = a7
+ // sp+00 = a0
+ // sp+04 = a1
+ // sp+08 = a2
+ // sp+0c = a4
+ int sp10 = a1->unk04 - a4 < a6 ? a1->unk04 - a4 + a2 : a6 + a2;
+ int sp14 = a0->unk06 - a5 < a7 ? a3 + a0->unk06 - a5 : a3 + a7;
+ int sp18 = (a0->unk04 + (a0->unk04 & 0x7)) / 8;
+ int sp1c = (a1->unk04 + (a1->unk04 & 0x7)) / 8;
+ int r12; // sp+20
+ int r8; // sp+24
+ int r5;
+ int r6;
+ u16 r2;
+
+ for (r12 = a3, r8 = a5; r12 < sp14; r12++, r8++)
+ {
+ for (r5 = a2, r6 = a4; a5 < sp10; a5++, a6++)
+ {
+ u8 *r3 = a0->unk00 + ((r5 >> 1) & 0x3) + ((r5 >> 3) << 5) + (((r12 >> 3) * sp18) << 5) + ((r12 & 0x7) << 2);
+ u8 *r4 = a1->unk00 + ((r6 >> 1) & 0x3) + ((r6 >> 3) << 5) + (((r8 >> 3) * sp1c) << 5) + ((r8 & 0x7) << 2);
+ if (((uintptr_t)r4) & 0x1)
+ {
+ u16 *r4_2 = (u16 *)(r4 - 1);
+ if (r6 & 0x1)
+ {
+ r2 = *r4_2 & 0x0fff;
+ if (r5 & 0x1)
+ *r4_2 = r2 | ((*r3 & 0xf0) << 8);
+ else
+ *r4_2 = r2 | ((*r3 & 0x0f) << 12);
+ }
+ else
+ {
+ r2 = *r4_2 * 0xf0ff;
+ if (r5 & 0x1)
+ *r4_2 = r2 | ((*r3 & 0xf0) << 4);
+ else
+ *r4_2 = r2 | ((*r3 & 0x0f) << 8);
+ }
+ }
+ else
+ {
+ u16 *r4_2 = (u16 *)r4;
+ if (r6 & 1)
+ {
+ r2 = *r4_2 & 0xff0f;
+ if (r5 & 1)
+ *r4_2 = r2 | ((*r3 & 0xf0) << 0);
+ else
+ *r4_2 = r2 | ((*r3 & 0x0f) << 4);
+ }
+ else
+ {
+ r2 = *r4_2 & 0xfff0;
+ if (r5 & 1)
+ *r4_2 = r2 | ((*r3 & 0xf0) >> 4);
+ else
+ *r4_2 = r2 | ((*r3 & 0x0f) >> 0);
+ }
+ }
+ }
+ }
+}
+#else
+NAKED
+void sub_819A080(struct UnkStruct_819A080 *a0, struct UnkStruct_819A080 *a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
+{
+ asm("push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, #0x28\n\
+ str r0, [sp]\n\
+ str r1, [sp, #0x4]\n\
+ ldr r0, [sp, #0x48]\n\
+ ldr r4, [sp, #0x4C]\n\
+ ldr r1, [sp, #0x50]\n\
+ ldr r5, [sp, #0x54]\n\
+ lsl r2, #16\n\
+ lsr r2, #16\n\
+ str r2, [sp, #0x8]\n\
+ lsl r3, #16\n\
+ lsr r3, #16\n\
+ lsl r0, #16\n\
+ lsr r0, #16\n\
+ str r0, [sp, #0xC]\n\
+ lsl r4, #16\n\
+ lsr r4, #16\n\
+ lsl r1, #16\n\
+ lsr r1, #16\n\
+ lsl r5, #16\n\
+ lsr r5, #16\n\
+ ldr r2, [sp, #0x4]\n\
+ ldrh r0, [r2, #0x4]\n\
+ ldr r2, [sp, #0xC]\n\
+ sub r0, r2\n\
+ ldr r2, [sp, #0x8]\n\
+ add r2, r1, r2\n\
+ str r2, [sp, #0x10]\n\
+ cmp r0, r1\n\
+ bge _0819A0CC\n\
+ ldr r1, [sp, #0x8]\n\
+ add r0, r1\n\
+ str r0, [sp, #0x10]\n\
+_0819A0CC:\n\
+ ldr r2, [sp, #0x4]\n\
+ ldrh r1, [r2, #0x6]\n\
+ sub r0, r1, r4\n\
+ cmp r0, r5\n\
+ bge _0819A0DE\n\
+ add r0, r3, r1\n\
+ sub r0, r4\n\
+ str r0, [sp, #0x14]\n\
+ b _0819A0E2\n\
+_0819A0DE:\n\
+ add r5, r3, r5\n\
+ str r5, [sp, #0x14]\n\
+_0819A0E2:\n\
+ ldr r0, [sp]\n\
+ ldrh r1, [r0, #0x4]\n\
+ mov r2, #0x7\n\
+ add r0, r1, #0\n\
+ and r0, r2\n\
+ add r1, r0\n\
+ asr r1, #3\n\
+ str r1, [sp, #0x18]\n\
+ ldr r0, [sp, #0x4]\n\
+ ldrh r1, [r0, #0x4]\n\
+ add r0, r1, #0\n\
+ and r0, r2\n\
+ add r1, r0\n\
+ asr r1, #3\n\
+ str r1, [sp, #0x1C]\n\
+ mov r12, r3\n\
+ mov r8, r4\n\
+ ldr r1, [sp, #0x14]\n\
+ cmp r12, r1\n\
+ blt _0819A10C\n\
+ b _0819A24A\n\
+_0819A10C:\n\
+ ldr r5, [sp, #0x8]\n\
+ ldr r6, [sp, #0xC]\n\
+ mov r2, r12\n\
+ add r2, #0x1\n\
+ str r2, [sp, #0x20]\n\
+ mov r0, r8\n\
+ add r0, #0x1\n\
+ str r0, [sp, #0x24]\n\
+ ldr r1, [sp, #0x10]\n\
+ cmp r5, r1\n\
+ blt _0819A124\n\
+ b _0819A23A\n\
+_0819A124:\n\
+ mov r7, #0x1\n\
+ mov r2, #0xF0\n\
+ mov r10, r2\n\
+ mov r0, #0xF\n\
+ mov r9, r0\n\
+_0819A12E:\n\
+ asr r0, r5, #1\n\
+ mov r1, #0x3\n\
+ and r0, r1\n\
+ ldr r2, [sp]\n\
+ ldr r1, [r2]\n\
+ add r1, r0\n\
+ asr r0, r5, #3\n\
+ lsl r0, #5\n\
+ add r1, r0\n\
+ mov r2, r12\n\
+ asr r0, r2, #3\n\
+ ldr r2, [sp, #0x18]\n\
+ mul r0, r2\n\
+ lsl r0, #5\n\
+ add r1, r0\n\
+ mov r2, r12\n\
+ lsl r0, r2, #29\n\
+ lsr r0, #27\n\
+ add r3, r1, r0\n\
+ asr r0, r6, #1\n\
+ mov r1, #0x3\n\
+ and r0, r1\n\
+ ldr r2, [sp, #0x4]\n\
+ ldr r1, [r2]\n\
+ add r1, r0\n\
+ asr r0, r6, #3\n\
+ lsl r0, #5\n\
+ add r1, r0\n\
+ mov r2, r8\n\
+ asr r0, r2, #3\n\
+ ldr r2, [sp, #0x1C]\n\
+ mul r0, r2\n\
+ lsl r0, #5\n\
+ add r1, r0\n\
+ mov r2, r8\n\
+ lsl r0, r2, #29\n\
+ lsr r0, #27\n\
+ add r4, r1, r0\n\
+ add r0, r4, #0\n\
+ and r0, r7\n\
+ cmp r0, #0\n\
+ beq _0819A1DA\n\
+ sub r4, #0x1\n\
+ add r0, r6, #0\n\
+ and r0, r7\n\
+ cmp r0, #0\n\
+ beq _0819A1B2\n\
+ ldrh r0, [r4]\n\
+ ldr r2, =0x00000fff\n\
+ and r2, r0\n\
+ add r0, r5, #0\n\
+ and r0, r7\n\
+ cmp r0, #0\n\
+ beq _0819A1A8\n\
+ ldrb r1, [r3]\n\
+ mov r0, r10\n\
+ and r0, r1\n\
+ lsl r0, #8\n\
+ b _0819A22A\n\
+ .pool\n\
+_0819A1A8:\n\
+ ldrb r1, [r3]\n\
+ mov r0, r9\n\
+ and r0, r1\n\
+ lsl r0, #12\n\
+ b _0819A22A\n\
+_0819A1B2:\n\
+ ldrh r0, [r4]\n\
+ ldr r2, =0x0000f0ff\n\
+ and r2, r0\n\
+ add r0, r5, #0\n\
+ and r0, r7\n\
+ cmp r0, #0\n\
+ beq _0819A1D0\n\
+ ldrb r1, [r3]\n\
+ mov r0, r10\n\
+ and r0, r1\n\
+ lsl r0, #4\n\
+ b _0819A22A\n\
+ .pool\n\
+_0819A1D0:\n\
+ ldrb r1, [r3]\n\
+ mov r0, r9\n\
+ and r0, r1\n\
+ lsl r0, #8\n\
+ b _0819A22A\n\
+_0819A1DA:\n\
+ add r0, r6, #0\n\
+ and r0, r7\n\
+ cmp r0, #0\n\
+ beq _0819A206\n\
+ ldrh r0, [r4]\n\
+ ldr r2, =0x0000ff0f\n\
+ and r2, r0\n\
+ add r0, r5, #0\n\
+ and r0, r7\n\
+ cmp r0, #0\n\
+ beq _0819A1FC\n\
+ ldrb r1, [r3]\n\
+ mov r0, r10\n\
+ b _0819A228\n\
+ .pool\n\
+_0819A1FC:\n\
+ ldrb r1, [r3]\n\
+ mov r0, r9\n\
+ and r0, r1\n\
+ lsl r0, #4\n\
+ b _0819A22A\n\
+_0819A206:\n\
+ ldrh r0, [r4]\n\
+ ldr r2, =0x0000fff0\n\
+ and r2, r0\n\
+ add r0, r5, #0\n\
+ and r0, r7\n\
+ cmp r0, #0\n\
+ beq _0819A224\n\
+ ldrb r1, [r3]\n\
+ mov r0, r10\n\
+ and r0, r1\n\
+ lsr r0, #4\n\
+ b _0819A22A\n\
+ .pool\n\
+_0819A224:\n\
+ ldrb r1, [r3]\n\
+ mov r0, r9\n\
+_0819A228:\n\
+ and r0, r1\n\
+_0819A22A:\n\
+ orr r2, r0\n\
+ strh r2, [r4]\n\
+ add r5, #0x1\n\
+ add r6, #0x1\n\
+ ldr r0, [sp, #0x10]\n\
+ cmp r5, r0\n\
+ bge _0819A23A\n\
+ b _0819A12E\n\
+_0819A23A:\n\
+ ldr r1, [sp, #0x20]\n\
+ mov r12, r1\n\
+ ldr r2, [sp, #0x24]\n\
+ mov r8, r2\n\
+ ldr r0, [sp, #0x14]\n\
+ cmp r12, r0\n\
+ bge _0819A24A\n\
+ b _0819A10C\n\
+_0819A24A:\n\
+ add sp, #0x28\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");
+}
+#endif
+
+void sub_819A25C(u8 palOffset, u16 speciesId)
+{
+ LoadPalette(GetValidMonIconPalettePtr(speciesId), palOffset, 0x20);
+}
+
+void sub_819A27C(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y)
+{
+ BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32);
+}
+
+void sub_819A2BC(u8 palOffset, u8 palId)
+{
+ const u16 *palette;
+
+ switch (palId)
+ {
+ case 0:
+ default:
+ palette = gFireRedMenuElements1_Pal;
+ break;
+ case 1:
+ palette = gFireRedMenuElements2_Pal;
+ break;
+ case 2:
+ palette = gFireRedMenuElements3_Pal;
+ break;
+ }
+
+ LoadPalette(palette, palOffset, 0x20);
+}
+
+void blit_move_info_icon(u8 windowId, u8 iconId, u16 x, u16 y)
+{
+ BlitBitmapRectToWindow(windowId, gFireRedMenuElements_Gfx + gMoveMenuInfoIcons[iconId].offset * 32, 0, 0, 128, 128, x, y, gMoveMenuInfoIcons[iconId].width, gMoveMenuInfoIcons[iconId].height);
+}
+
+void sub_819A344(u8 a0, u8 *dest, u8 color)
+{
+ s32 curFlag;
+ s32 flagCount;
+ u8 *endOfString;
+ u8 *string = dest;
+
+ *(string++) = EXT_CTRL_CODE_BEGIN;
+ *(string++) = EXT_CTRL_CODE_COLOR;
+ *(string++) = color;
+ *(string++) = EXT_CTRL_CODE_BEGIN;
+ *(string++) = EXT_CTRL_CODE_SHADOW;
+ *(string++) = color + 1;
+
+ switch (a0)
+ {
+ case 0:
+ StringCopy(string, gSaveBlock2Ptr->playerName);
+ break;
+ case 1:
+ if (IsNationalPokedexEnabled())
+ string = ConvertIntToDecimalStringN(string, GetNationalPokedexCount(1), 0, 3);
+ else
+ string = ConvertIntToDecimalStringN(string, GetHoennPokedexCount(1), 0, 3);
+ *string = EOS;
+ break;
+ case 2:
+ string = ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->playTimeHours, 0, 3);
+ *(string++) = CHAR_COLON;
+ ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->playTimeMinutes, 2, 2);
+ break;
+ case 3:
+ sub_81245DC(string, gMapHeader.regionMapSectionId);
+ break;
+ case 4:
+ for (curFlag = FLAG_BADGE01_GET, flagCount = 0, endOfString = string + 1; curFlag <= FLAG_BADGE08_GET; curFlag++)
+ {
+ if (FlagGet(curFlag))
+ flagCount++;
+ }
+ *string = flagCount + CHAR_0;
+ *endOfString = EOS;
+ break;
+ }
+}
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
new file mode 100644
index 000000000..178fbb5fa
--- /dev/null
+++ b/src/menu_helpers.c
@@ -0,0 +1,455 @@
+#include "global.h"
+#include "task.h"
+#include "window.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "gpu_regs.h"
+#include "bg.h"
+#include "main.h"
+#include "text.h"
+#include "link.h"
+#include "string_util.h"
+#include "sound.h"
+#include "mail.h"
+#include "overworld.h"
+#include "decompress.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+#include "constants/maps.h"
+
+extern bool32 sub_800B504(void);
+
+extern const u8 gBagSwapLineGfx[];
+extern const u8 gBagSwapLinePal[];
+
+// this file's functions
+static void Task_ContinueTaskAfterMessagePrints(u8 taskId);
+static void Task_CallYesOrNoCallback(u8 taskId);
+
+// EWRAM vars
+EWRAM_DATA static struct YesNoFuncTable gUnknown_0203A138 = {0};
+EWRAM_DATA static u8 gUnknown_0203A140 = 0;
+
+// IWRAM bss vars
+IWRAM_DATA static TaskFunc gUnknown_0300117C;
+
+// const rom data
+static const struct OamData sOamData_859F4E8 =
+{
+ .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
+};
+
+static const union AnimCmd sSpriteAnim_859F4F0[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_859F4F8[] =
+{
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_859F500[] =
+{
+ ANIMCMD_FRAME(0, 0, 1, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_859F508[] =
+{
+ sSpriteAnim_859F4F0,
+ sSpriteAnim_859F4F8,
+ sSpriteAnim_859F500
+};
+
+static const struct CompressedSpriteSheet gUnknown_0859F514 =
+{
+ gBagSwapLineGfx, 0x100, 109
+};
+
+static const struct CompressedSpritePalette gUnknown_0859F51C =
+{
+ gBagSwapLinePal, 109
+};
+
+static const struct SpriteTemplate gUnknown_0859F524 =
+{
+ .tileTag = 109,
+ .paletteTag = 109,
+ .oam = &sOamData_859F4E8,
+ .anims = sSpriteAnimTable_859F508,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+// code
+void ResetVramOamAndBgCntRegs(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ CpuFill16(0, (void*) VRAM, VRAM_SIZE);
+ CpuFill32(0, (void*) OAM, OAM_SIZE);
+ CpuFill16(0, (void*) PLTT, PLTT_SIZE);
+}
+
+void ResetAllBgsCoordinates(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+}
+
+void SetVBlankHBlankCallbacksToNull(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+}
+
+void DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 arg2, u8 arg3, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc)
+{
+ gUnknown_0203A140 = windowId;
+ sub_8197B1C(windowId, TRUE, arg2, arg3);
+
+ if (string != gStringVar4)
+ StringExpandPlaceholders(gStringVar4, string);
+
+ gTextFlags.flag_0 = 1;
+ AddTextPrinterParameterized(windowId, fontId, gStringVar4, textSpeed, NULL, 2, 1, 3);
+ gUnknown_0300117C = taskFunc;
+ gTasks[taskId].func = Task_ContinueTaskAfterMessagePrints;
+}
+
+bool16 RunTextPrintersRetIsActive(u8 textPrinterId)
+{
+ RunTextPrinters();
+ return IsTextPrinterActive(textPrinterId);
+}
+
+static void Task_ContinueTaskAfterMessagePrints(u8 taskId)
+{
+ if (!RunTextPrintersRetIsActive(gUnknown_0203A140))
+ gUnknown_0300117C(taskId);
+}
+
+void sub_8121F68(u8 taskId, const struct YesNoFuncTable *data)
+{
+ gUnknown_0203A138 = *data;
+ gTasks[taskId].func = Task_CallYesOrNoCallback;
+}
+
+void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 arg2, u8 arg3, u8 arg4, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo)
+{
+ CreateYesNoMenu(template, tileStart, palette, 0);
+ gUnknown_0203A138 = *yesNo;
+ gTasks[taskId].func = Task_CallYesOrNoCallback;
+}
+
+static void Task_CallYesOrNoCallback(u8 taskId)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ gUnknown_0203A138.yesFunc(taskId);
+ break;
+ case 1:
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ gUnknown_0203A138.noFunc(taskId);
+ break;
+ }
+}
+
+bool8 AdjustQuantityAccordingToDPadInput(s16 *arg0, u16 arg1)
+{
+ s16 valBefore = (*arg0);
+
+ if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
+ {
+ (*arg0)++;
+ if ((*arg0) > arg1)
+ (*arg0) = 1;
+
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
+ {
+ (*arg0)--;
+ if ((*arg0) <= 0)
+ (*arg0) = arg1;
+
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT)
+ {
+ (*arg0) += 10;
+ if ((*arg0) > arg1)
+ (*arg0) = arg1;
+
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT)
+ {
+ (*arg0) -= 10;
+ if ((*arg0) <= 0)
+ (*arg0) = 1;
+
+ if ((*arg0) == valBefore)
+ {
+ return FALSE;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+u8 GetLRKeysState(void)
+{
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.newKeys & L_BUTTON)
+ return 1;
+ if (gMain.newKeys & R_BUTTON)
+ return 2;
+ }
+
+ return 0;
+}
+
+u8 sub_812210C(void)
+{
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ return 1;
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ return 2;
+ }
+
+ return 0;
+}
+
+bool8 sub_8122148(u16 itemId)
+{
+ if (itemId != ITEM_ENIGMA_BERRY)
+ return TRUE;
+ else if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRADE_CENTER) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRADE_CENTER))
+ return FALSE;
+ else if (InUnionRoom() != TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 itemid_80BF6D8_mail_related(u16 itemId)
+{
+ if (is_c1_link_related_active() != TRUE && InUnionRoom() != TRUE)
+ return TRUE;
+ else if (ItemIsMail(itemId) != TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 sub_81221AC(void)
+{
+ if (is_c1_link_related_active() == TRUE || gReceivedRemoteLinkPlayers == 1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 sub_81221D0(void)
+{
+ if (!sub_81221AC())
+ return FALSE;
+ else
+ return sub_8087598();
+}
+
+bool8 sub_81221EC(void)
+{
+ if (sub_81221D0() == TRUE)
+ return TRUE;
+ else if (sub_800B504() != TRUE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_812220C(struct ItemSlot *slots, u8 count, u8 *arg2, u8 *usedSlotsCount, u8 maxUsedSlotsCount)
+{
+ u16 i;
+ struct ItemSlot *slots_ = slots;
+
+ (*usedSlotsCount) = 0;
+ for (i = 0; i < count; i++)
+ {
+ if (slots_[i].itemId != ITEM_NONE)
+ (*usedSlotsCount)++;
+ }
+
+ (*usedSlotsCount)++;
+ if ((*usedSlotsCount) > maxUsedSlotsCount)
+ *arg2 = maxUsedSlotsCount;
+ else
+ *arg2 = (*usedSlotsCount);
+}
+
+void sub_812225C(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3)
+{
+ if ((*arg0) != 0 && (*arg0) + arg2 > arg3)
+ (*arg0) = arg3 - arg2;
+
+ if ((*arg0) + (*arg1) >= arg3)
+ {
+ if (arg3 == 0)
+ (*arg1) = 0;
+ else
+ (*arg1) = arg3 - 1;
+ }
+}
+
+void sub_8122298(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3, u8 arg4)
+{
+ u8 i;
+
+ if (arg4 % 2 != 0)
+ {
+ if ((*arg1) >= arg4 / 2)
+ {
+ for (i = 0; i < (*arg1) - (arg4 / 2); i++)
+ {
+ if ((*arg0) + arg2 == arg3)
+ break;
+ (*arg1)--;
+ (*arg0)++;
+ }
+ }
+ }
+ else
+ {
+ if ((*arg1) >= (arg4 / 2) + 1)
+ {
+ for (i = 0; i <= (*arg1) - (arg4 / 2); i++)
+ {
+ if ((*arg0) + arg2 == arg3)
+ break;
+ (*arg1)--;
+ (*arg0)++;
+ }
+ }
+ }
+}
+
+void LoadListMenuArrowsGfx(void)
+{
+ LoadCompressedObjectPic(&gUnknown_0859F514);
+ LoadCompressedObjectPalette(&gUnknown_0859F51C);
+}
+
+void sub_8122344(u8 *spriteIds, u8 count)
+{
+ u8 i;
+
+ for (i = 0; i < count; i++)
+ {
+ spriteIds[i] = CreateSprite(&gUnknown_0859F524, i * 16, 0, 0);
+ if (i != 0)
+ StartSpriteAnim(&gSprites[spriteIds[i]], 1);
+
+ gSprites[spriteIds[i]].invisible = 1;
+ }
+}
+
+void sub_81223B0(u8 *spriteIds, u8 count)
+{
+ u8 i;
+
+ for (i = 0; i < count; i++)
+ {
+ if (i == count - 1)
+ DestroySpriteAndFreeResources(&gSprites[spriteIds[i]]);
+ else
+ DestroySprite(&gSprites[spriteIds[i]]);
+ }
+}
+
+void sub_81223FC(u8 *spriteIds, u8 count, bool8 invisible)
+{
+ u8 i;
+
+ for (i = 0; i < count; i++)
+ {
+ gSprites[spriteIds[i]].invisible = invisible;
+ }
+}
+
+void sub_8122448(u8 *spriteIds, u8 count, s16 x, u16 y)
+{
+ u8 i;
+ bool8 unknownBit = count & 0x80;
+ count &= ~(0x80);
+
+ for (i = 0; i < count; i++)
+ {
+ if (i == count - 1 && unknownBit)
+ gSprites[spriteIds[i]].pos2.x = x - 8;
+ else
+ gSprites[spriteIds[i]].pos2.x = x;
+
+ gSprites[spriteIds[i]].pos1.y = 1 + y;
+ }
+}
diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c
index b9760f522..a5e328e4a 100644
--- a/src/metatile_behavior.c
+++ b/src/metatile_behavior.c
@@ -252,8 +252,7 @@ static const u8 sTileBitAttributes[] =
TILE_ATTRIBUTES(FALSE, FALSE, FALSE), // ? 0xEF
};
-// only used as default case for checking jump landing in field_ground_effect.
-bool8 ShouldDoJumpLandingDustEffect(u8 var)
+bool8 MetatileBehavior_IsATile(u8 var)
{
return TRUE;
}
@@ -847,7 +846,7 @@ bool8 MetatileBehavior_IsBerryTreeSoil(u8 var)
return FALSE;
}
-bool8 MetatileBehavior_IsAsh(u8 var)
+bool8 MetatileBehavior_IsAshGrass(u8 var)
{
if (var == MB_ASHGRASS)
return TRUE;
diff --git a/src/mon_markings.c b/src/mon_markings.c
new file mode 100644
index 000000000..7f320002d
--- /dev/null
+++ b/src/mon_markings.c
@@ -0,0 +1,612 @@
+#include "global.h"
+#include "dma3.h"
+#include "graphics.h"
+#include "main.h"
+#include "window.h"
+#include "list_menu.h"
+#include "mon_markings.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "text_window.h"
+
+#define MENU_TEXT_SPRITE_X_OFFSET 32
+
+// static functions
+static void sub_811FC80(s16, s16, u16, u16);
+static void TaskDummy7(struct Sprite *);
+static void sub_811FF40(struct Sprite *);
+static void sub_811FF7C(struct Sprite *);
+static struct Sprite *sub_811FFD4(u16, u16, const u16 *, u16);
+
+// .rodata
+static const u16 gUnknown_0859E65C[] = INCBIN_U16("graphics/misc/mon_markings.gbapal");
+static const u8 gUnknown_0859E67C[] = INCBIN_U8("graphics/misc/mon_markings.4bpp");
+
+static const struct OamData gUnknown_0859EE7C =
+{
+ .y = 0,
+ .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 struct OamData gUnknown_0859EE84 =
+{
+ .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,
+};
+
+static const union AnimCmd gUnknown_0859EE8C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EE94[] =
+{
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EE9C[] =
+{
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EEA4[] =
+{
+ ANIMCMD_FRAME(3, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EEAC[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EEB4[] =
+{
+ ANIMCMD_FRAME(5, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EEBC[] =
+{
+ ANIMCMD_FRAME(6, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EEC4[] =
+{
+ ANIMCMD_FRAME(7, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EECC[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EED4[] =
+{
+ ANIMCMD_FRAME(9, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_0859EEDC[] =
+{
+ gUnknown_0859EE8C,
+ gUnknown_0859EE94,
+ gUnknown_0859EE9C,
+ gUnknown_0859EEA4,
+ gUnknown_0859EEAC,
+ gUnknown_0859EEB4,
+ gUnknown_0859EEBC,
+ gUnknown_0859EEC4,
+ gUnknown_0859EECC,
+ gUnknown_0859EED4,
+};
+
+static const union AnimCmd gUnknown_0859EF04[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF0C[] =
+{
+ ANIMCMD_FRAME(64, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_0859EF14[] =
+{
+ gUnknown_0859EF04,
+ gUnknown_0859EF0C,
+};
+
+static const struct OamData gUnknown_0859EF1C =
+{
+ .y = 0,
+ .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 gUnknown_0859EF24[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF2C[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF34[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF3C[] =
+{
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF44[] =
+{
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF4C[] =
+{
+ ANIMCMD_FRAME(20, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF54[] =
+{
+ ANIMCMD_FRAME(24, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF5C[] =
+{
+ ANIMCMD_FRAME(28, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF64[] =
+{
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF6C[] =
+{
+ ANIMCMD_FRAME(36, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF74[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF7C[] =
+{
+ ANIMCMD_FRAME(44, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF84[] =
+{
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF8C[] =
+{
+ ANIMCMD_FRAME(52, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF94[] =
+{
+ ANIMCMD_FRAME(56, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_0859EF9C[] =
+{
+ ANIMCMD_FRAME(60, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gUnknown_0859EFA4[] =
+{
+ gUnknown_0859EF24,
+ gUnknown_0859EF2C,
+ gUnknown_0859EF34,
+ gUnknown_0859EF3C,
+ gUnknown_0859EF44,
+ gUnknown_0859EF4C,
+ gUnknown_0859EF54,
+ gUnknown_0859EF5C,
+ gUnknown_0859EF64,
+ gUnknown_0859EF6C,
+ gUnknown_0859EF74,
+ gUnknown_0859EF7C,
+ gUnknown_0859EF84,
+ gUnknown_0859EF8C,
+ gUnknown_0859EF94,
+ gUnknown_0859EF9C,
+};
+
+static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL;
+
+void sub_811F90C(struct PokemonMarkMenu *ptr)
+{
+ sMenu = ptr;
+}
+
+void sub_811F918(void)
+{
+ const struct TilesPal *frame = GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType);
+ sMenu->frameTiles = frame->tiles;
+ sMenu->framePalette = frame->pal;
+ sMenu->tileLoadState = 0;
+ CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles));
+}
+
+bool8 sub_811F960(void)
+{
+ u16 i;
+ u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100;
+
+ switch (sMenu->tileLoadState)
+ {
+ case 0:
+ CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP);
+ for (i = 0; i < 6; i++)
+ {
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
+ }
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
+ sMenu->tileLoadState++;
+ break;
+ default:
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP);
+ for (i = 0; i < 6; i++)
+ {
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
+ }
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
+ sMenu->tileLoadState++;
+ break;
+ case 13:
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP);
+ for (i = 0; i < 6; i++)
+ {
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP);
+ }
+ CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP);
+ sMenu->tileLoadState++;
+ return FALSE;
+ case 14:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void sub_811FA90(void)
+{
+ sub_811F918();
+ while (sub_811F960());
+}
+
+void sub_811FAA4(u8 markings, s16 x, s16 y)
+{
+ u16 i;
+ sMenu->cursorPos = 0;
+ sMenu->markings = markings;
+ for (i = 0; i < 4; i++)
+ sMenu->markingsArray[i] = (sMenu->markings >> i) & 1;
+ sub_811FC80(x, y, sMenu->baseTileTag, sMenu->basePaletteTag);
+}
+
+void sub_811FAF8(void)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ FreeSpriteTilesByTag(sMenu->baseTileTag + i);
+ FreeSpritePaletteByTag(sMenu->basePaletteTag + i);
+ }
+ for (i = 0; i < 2; i++)
+ {
+ if (!sMenu->menuWindowSprites[i])
+ return;
+ DestroySprite(sMenu->menuWindowSprites[i]);
+ sMenu->menuWindowSprites[i] = NULL;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (!sMenu->menuMarkingSprites[i])
+ return;
+ DestroySprite(sMenu->menuMarkingSprites[i]);
+ sMenu->menuMarkingSprites[i] = NULL;
+ }
+ if (sMenu->unkSprite)
+ {
+ DestroySprite(sMenu->unkSprite);
+ sMenu->unkSprite = NULL;
+ }
+ if (sMenu->menuTextSprite)
+ {
+ DestroySprite(sMenu->menuTextSprite);
+ sMenu->menuTextSprite = NULL;
+ }
+}
+
+
+bool8 sub_811FBA4(void)
+{
+ u16 i;
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ s8 pos;
+ PlaySE(SE_SELECT);
+ pos = --sMenu->cursorPos;
+ if (pos < 0)
+ sMenu->cursorPos = 5;
+ return TRUE;
+ }
+
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ s8 pos;
+ PlaySE(SE_SELECT);
+ pos = ++sMenu->cursorPos;
+ if (pos > 5)
+ sMenu->cursorPos = 0;
+ return TRUE;
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+
+ switch (sMenu->cursorPos)
+ {
+ case 4:
+ sMenu->markings = 0;
+ for (i = 0; i < 4; i++)
+ sMenu->markings |= sMenu->markingsArray[i] << i;
+ return FALSE;
+ case 5:
+ return FALSE;
+ }
+
+ sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos];
+ return TRUE;
+ }
+
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_811FC80(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)
+{
+ u16 i;
+ u8 spriteId;
+
+ struct SpriteSheet sheets[] =
+ {
+ { sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag },
+ { gPokenavConditionMarker_Gfx, 0x320, baseTileTag + 1 },
+ { NULL, 0 }
+ };
+
+ struct SpritePalette palettes[] =
+ {
+ { sMenu->framePalette, basePaletteTag },
+ { gPokenavConditionMarker_Pal, basePaletteTag + 1},
+ { NULL, 0 }
+ };
+
+ struct SpriteTemplate sprTemplate =
+ {
+ baseTileTag,
+ basePaletteTag,
+ &gUnknown_0859EE7C,
+ gUnknown_0859EF14,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ TaskDummy7,
+ };
+
+ LoadSpriteSheets(sheets);
+ LoadSpritePalettes(palettes);
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 1);
+ if (spriteId != 64)
+ {
+ sMenu->menuWindowSprites[i] = &gSprites[spriteId];
+ StartSpriteAnim(&gSprites[spriteId], i);
+ }
+ else
+ {
+ sMenu->menuWindowSprites[i] = NULL;
+ return;
+ }
+ }
+
+ sMenu->menuWindowSprites[1]->pos1.y = y + 96;
+
+ sprTemplate.tileTag++;
+ sprTemplate.paletteTag++;
+ sprTemplate.anims = gUnknown_0859EEDC;
+ sprTemplate.callback = sub_811FF40;
+ sprTemplate.oam = &gUnknown_0859EE84;
+
+ for (i = 0; i < 4; i++)
+ {
+ spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 0);
+ if (spriteId != 64)
+ {
+ sMenu->menuMarkingSprites[i] = &gSprites[spriteId];
+ gSprites[spriteId].data[0] = i;
+ }
+ else
+ {
+ sMenu->menuMarkingSprites[i] = NULL;
+ return;
+ }
+ }
+
+ sprTemplate.callback = SpriteCallbackDummy;
+
+ spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
+
+ if (spriteId != 64)
+ {
+ sMenu->menuTextSprite = &gSprites[spriteId];
+ sMenu->menuTextSprite->oam.shape = ST_OAM_SQUARE;
+ sMenu->menuTextSprite->oam.size = 2;
+ StartSpriteAnim(sMenu->menuTextSprite, 9);
+ sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET;
+ sMenu->menuTextSprite->pos1.y = y + 80;
+ CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0);
+ }
+ else
+ {
+ sMenu->menuTextSprite = NULL;
+ }
+
+ sprTemplate.callback = sub_811FF7C;
+ spriteId = CreateSprite(&sprTemplate, x + 12, 0, 0);
+ if(spriteId != 64)
+ {
+ sMenu->unkSprite = &gSprites[spriteId];
+ sMenu->unkSprite->data[0] = y + 16;
+ StartSpriteAnim(sMenu->unkSprite, 8);
+ }
+ else
+ {
+ sMenu->unkSprite = NULL;
+ }
+
+}
+
+static void TaskDummy7(struct Sprite *sprite)
+{
+}
+
+static void sub_811FF40(struct Sprite *sprite)
+{
+ if (sMenu->markingsArray[sprite->data[0]])
+ StartSpriteAnim(sprite, 2 * sprite->data[0] + 1);
+ else
+ StartSpriteAnim(sprite, 2 * sprite->data[0]);
+}
+
+static void sub_811FF7C(struct Sprite *sprite)
+{
+ sprite->pos1.y = (16 * sMenu->cursorPos) + sprite->data[0];
+}
+
+struct Sprite *sub_811FF94(u16 tileTag, u16 paletteTag, const u16 *palette)
+{
+ if (!palette)
+ palette = gUnknown_0859E65C;
+ return sub_811FFD4(tileTag, paletteTag, palette, 16);
+}
+
+struct Sprite *sub_811FFB4(u16 tileTag, u16 paletteTag, const u16 *palette)
+{
+ if (!palette)
+ palette = gUnknown_0859E65C;
+ return sub_811FFD4(tileTag, paletteTag, palette, 1);
+}
+
+static struct Sprite *sub_811FFD4(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
+{
+ u8 spriteId;
+ struct SpriteTemplate sprTemplate;
+ struct SpriteSheet sheet = { gUnknown_0859E67C, 0x80, tileTag };
+ struct SpritePalette sprPalette = { palette, paletteTag };
+
+ sprTemplate.tileTag = tileTag;
+ sprTemplate.paletteTag = paletteTag;
+ sprTemplate.oam = &gUnknown_0859EF1C;
+ sprTemplate.anims = gUnknown_0859EFA4;
+ sprTemplate.images = NULL;
+ sprTemplate.affineAnims = gDummySpriteAffineAnimTable;
+ sprTemplate.callback = TaskDummy7;
+
+ sheet.size = size * 0x80;
+
+ LoadSpriteSheet(&sheet);
+ LoadSpritePalette(&sprPalette);
+
+ spriteId = CreateSprite(&sprTemplate, 0, 0, 0);
+ if (spriteId != 64)
+ return &gSprites[spriteId];
+ else
+ return NULL;
+}
+
+void sub_8120084(u8 markings, void *dest)
+{
+ RequestDma3Copy(gUnknown_0859E67C + markings * 0x80, dest, 0x80, 0x10);
+}
diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c
new file mode 100644
index 000000000..68f31584b
--- /dev/null
+++ b/src/mystery_event_menu.c
@@ -0,0 +1,302 @@
+#include "global.h"
+#include "mystery_event_menu.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "mystery_event_script.h"
+#include "palette.h"
+#include "save.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "bg.h"
+#include "window.h"
+#include "gpu_regs.h"
+#include "text_window.h"
+#include "decompress.h"
+
+// this file's functions
+static void CB2_MysteryEventMenu(void);
+static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed);
+
+// EWRAM vars
+static EWRAM_DATA u8 sUnknown_0203BCF8 = 0; // set but unused
+
+// const rom data
+static const struct BgTemplate sBgTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ }
+};
+
+static const struct WindowTemplate sWindowTemplates[] =
+{
+ {0, 4, 15, 22, 4, 14, 20},
+ {0, 7, 6, 16, 4, 14, 0x6C},
+ DUMMY_WIN_TEMPLATE
+};
+
+// code
+static void VBlankCB(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static bool8 CheckLanguageMatch(void)
+{
+ return (gLinkPlayers[0].language == gLinkPlayers[1].language);
+}
+
+void CB2_InitMysteryEventMenu(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(VBlankCB);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
+ if (InitWindows(sWindowTemplates))
+ {
+ s32 i;
+
+ DeactivateAllTextPrinters();
+ for (i = 0; i < 2; i++)
+ FillWindowPixelBuffer(i, 0);
+
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14);
+ LoadUserWindowBorderGfx(0, 1u, 0xD0u);
+ sub_81978B0(0xE0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ CreateTask(Task_DestroySelf, 0);
+ StopMapMusic();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+ FillPalette(0, 0, 2);
+ SetMainCallback2(CB2_MysteryEventMenu);
+ }
+}
+
+static bool8 GetEventLoadMessage(u8 *dest, u32 status)
+{
+ bool8 retVal = TRUE;
+
+ if (status == 0)
+ {
+ StringCopy(dest, gText_EventSafelyLoaded);
+ retVal = FALSE;
+ }
+
+ if (status == 2)
+ retVal = FALSE;
+
+ if (status == 1)
+ StringCopy(dest, gText_LoadErrorEndingSession);
+
+ return retVal;
+}
+
+static void CB2_MysteryEventMenu(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetWindowBorderStyle(0, 1, 1, 0xD);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ ShowBg(0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ gMain.state++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ PrintMysteryMenuText(0, gText_LinkStandby2, 1, 2, 1);
+ gMain.state++;
+ }
+ break;
+ case 2:
+ if (!IsTextPrinterActive(0))
+ {
+ gMain.state++;
+ gLinkType = 21761;
+ OpenLink();
+ }
+ break;
+ case 3:
+ if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4)
+ {
+ PlaySE(SE_PIN);
+ PrintMysteryMenuText(0, gText_PressAToLoadEvent, 1, 2, 1);
+ gMain.state++;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ break;
+ case 4:
+ if (!IsTextPrinterActive(0))
+ gMain.state++;
+ break;
+ case 5:
+ if (GetLinkPlayerCount_2() == 2)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_800A620();
+ SetWindowBorderStyle(1, 1, 1, 0xD);
+ PrintMysteryMenuText(1, gText_LoadingEvent, 1, 2, 0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 3);
+ gMain.state++;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ }
+ else
+ {
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+ break;
+ case 6:
+ if (IsLinkConnectionEstablished())
+ {
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (GetLinkPlayerDataExchangeStatusTimed(2, 2) == 3)
+ {
+ sub_800AC34();
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+ else if (CheckLanguageMatch())
+ {
+ PrintMysteryMenuText(0, gText_DontRemoveCableTurnOff, 1, 2, 1);
+ gMain.state++;
+ }
+ else
+ {
+ CloseLink();
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ break;
+ case 7:
+ if (!IsTextPrinterActive(0))
+ gMain.state++;
+ break;
+ case 8:
+ if (GetBlockReceivedStatus())
+ {
+ ResetBlockReceivedFlags();
+ gMain.state++;
+ }
+ break;
+ case 9:
+ gMain.state++;
+ break;
+ case 10:
+ sub_800AC34();
+ gMain.state++;
+ break;
+ case 11:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ u16 unkVal = RunMysteryEventScript(gDecompressionBuffer);
+ CpuFill32(0, gDecompressionBuffer, 0x7D4);
+ if (!GetEventLoadMessage(gStringVar4, unkVal))
+ TrySavingData(SAVE_NORMAL);
+ gMain.state++;
+ }
+ break;
+ case 12:
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state++;
+ break;
+ case 13:
+ if (!IsTextPrinterActive(0))
+ {
+ gMain.state++;
+ sUnknown_0203BCF8 = 0;
+ }
+ break;
+ case 14:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gMain.state++;
+ }
+ break;
+ case 15:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gMain.state++;
+ break;
+ case 16:
+ if (!gPaletteFade.active)
+ DoSoftReset();
+ break;
+ }
+
+ if (gLinkStatus & 0x40 && !IsLinkMaster())
+ {
+ CloseLink();
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed)
+{
+ u8 textColor[3];
+ u8 letterSpacing = 0;
+ u8 lineSpacing = 1;
+ textColor[0] = 1;
+ textColor[1] = 2;
+ textColor[2] = 3;
+
+ FillWindowPixelBuffer(windowId, (textColor[0]) | (textColor[0] << 4));
+ AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, lineSpacing, textColor, speed, text);
+}
diff --git a/src/mystery_event_msg.c b/src/mystery_event_msg.c
new file mode 100644
index 000000000..74261179b
--- /dev/null
+++ b/src/mystery_event_msg.c
@@ -0,0 +1,13 @@
+#include "global.h"
+
+const u8 gText_MysteryGiftBerry[] = _("Obtained a {STR_VAR_2} BERRY!\nDad has it at PETALBURG GYM.");
+const u8 gText_MysteryGiftBerryTransform[] = _("The {STR_VAR_1} BERRY transformed into\none {STR_VAR_2} BERRY.");
+const u8 gText_MysteryGiftBerryObtained[] = _("The {STR_VAR_1} BERRY has already been\nobtained.");
+const u8 gText_MysteryGiftSpecialRibbon[] = _("A special RIBBON was awarded to\nyour party POKéMON.");
+const u8 gText_MysteryGiftNationalDex[] = _("The POKéDEX has been upgraded\nwith the NATIONAL MODE.");
+const u8 gText_MysteryGiftRareWord[] = _("A rare word has been added.");
+const u8 gText_MysteryGiftSentOver[] = _("{STR_VAR_1} was sent over!");
+const u8 gText_MysteryGiftFullParty[] = _("Your party is full.\n{STR_VAR_1} could not be sent over.");
+const u8 gText_MysteryGiftNewTrainer[] = _("A new TRAINER has arrived in\nHOENN.");
+const u8 gText_MysteryGiftNewAdversaryInBattleTower[] = _("A new adversary has arrived in the\nBATTLE TOWER.");
+const u8 gText_MysteryGiftCantBeUsed[] = _("This data can’t be used in\nthis version.");
diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c
new file mode 100644
index 000000000..8822cd05a
--- /dev/null
+++ b/src/mystery_event_script.c
@@ -0,0 +1,396 @@
+#include "global.h"
+#include "berry.h"
+#include "battle_tower.h"
+#include "easy_chat.h"
+#include "event_data.h"
+#include "mail.h"
+#include "mystery_event_script.h"
+#include "pokedex.h"
+#include "pokemon.h"
+#include "pokemon_size_record.h"
+#include "script.h"
+#include "constants/species.h"
+#include "strings.h"
+#include "string_util.h"
+#include "text.h"
+#include "util.h"
+#include "mystery_event_msg.h"
+#include "pokemon_storage_system.h"
+
+extern void sub_811EFC0(u8);
+extern void ValidateEReaderTrainer(void);
+
+extern ScrCmdFunc gMysteryEventScriptCmdTable[];
+extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[];
+
+#define LANGUAGE_MASK 0x1
+#define VERSION_MASK 0x200
+
+EWRAM_DATA static struct ScriptContext sMysteryEventScriptContext = {0};
+
+static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4)
+{
+ if (!(a1 & LANGUAGE_MASK))
+ return FALSE;
+
+ if (!(a2 & LANGUAGE_MASK))
+ return FALSE;
+
+ if (!(a3 & 0x4))
+ return FALSE;
+
+ if (!(a4 & VERSION_MASK))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void SetIncompatible(void)
+{
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftCantBeUsed);
+ SetMysteryEventScriptStatus(3);
+}
+
+static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script)
+{
+ InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd);
+ SetupBytecodeScript(ctx, script);
+ ctx->data[0] = (u32)script;
+ ctx->data[1] = 0;
+ ctx->data[2] = 0;
+ ctx->data[3] = 0;
+}
+
+static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx)
+{
+ if (RunScriptCommand(ctx) && ctx->data[3])
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8153870(u8 *script)
+{
+ InitMysteryEventScript(&sMysteryEventScriptContext, script);
+}
+
+bool32 sub_8153884(u32 *a0)
+{
+ bool32 ret = RunMysteryEventScriptCommand(&sMysteryEventScriptContext);
+ *a0 = sMysteryEventScriptContext.data[2];
+
+ return ret;
+}
+
+u32 RunMysteryEventScript(u8 *script)
+{
+ struct ScriptContext *ctx = &sMysteryEventScriptContext;
+ InitMysteryEventScript(ctx, script);
+ while (RunMysteryEventScriptCommand(ctx));
+
+ return ctx->data[2];
+}
+
+void SetMysteryEventScriptStatus(u32 val)
+{
+ sMysteryEventScriptContext.data[2] = val;
+}
+
+static int CalcRecordMixingGiftChecksum(void)
+{
+ unsigned int i;
+ int sum = 0;
+ u8 *data = (u8*)(&gSaveBlock1Ptr->recordMixingGift.data);
+
+ for (i = 0; i < sizeof(gSaveBlock1Ptr->recordMixingGift.data); i++)
+ sum += data[i];
+
+ return sum;
+}
+
+static bool32 IsRecordMixingGiftValid(void)
+{
+ struct RecordMixingGiftData *data = &gSaveBlock1Ptr->recordMixingGift.data;
+ int checksum = CalcRecordMixingGiftChecksum();
+
+ if (data->unk0 == 0
+ || data->quantity == 0
+ || data->itemId == 0
+ || checksum == 0
+ || checksum != gSaveBlock1Ptr->recordMixingGift.checksum)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static void ClearRecordMixingGift(void)
+{
+ CpuFill16(0, &gSaveBlock1Ptr->recordMixingGift, sizeof(gSaveBlock1Ptr->recordMixingGift));
+}
+
+static void SetRecordMixingGift(u8 unk, u8 quantity, u16 itemId)
+{
+ if (!unk || !quantity || !itemId)
+ {
+ ClearRecordMixingGift();
+ }
+ else
+ {
+ gSaveBlock1Ptr->recordMixingGift.data.unk0 = unk;
+ gSaveBlock1Ptr->recordMixingGift.data.quantity = quantity;
+ gSaveBlock1Ptr->recordMixingGift.data.itemId = itemId;
+ gSaveBlock1Ptr->recordMixingGift.checksum = CalcRecordMixingGiftChecksum();
+ }
+}
+
+u16 GetRecordMixingGift(void)
+{
+ struct RecordMixingGiftData *data = &gSaveBlock1Ptr->recordMixingGift.data;
+
+ if (!IsRecordMixingGiftValid())
+ {
+ ClearRecordMixingGift();
+ return 0;
+ }
+ else
+ {
+ u16 itemId = data->itemId;
+ data->quantity--;
+ if (data->quantity == 0)
+ ClearRecordMixingGift();
+ else
+ gSaveBlock1Ptr->recordMixingGift.checksum = CalcRecordMixingGiftChecksum();
+
+ return itemId;
+ }
+}
+
+bool8 MEScrCmd_end(struct ScriptContext *ctx)
+{
+ StopScript(ctx);
+ return TRUE;
+}
+
+bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx)
+{
+ u16 v1;
+ u32 v2;
+ u16 v3;
+ u32 v4;
+
+ ctx->data[1] = ScriptReadWord(ctx);
+ v1 = ScriptReadHalfword(ctx);
+ v2 = ScriptReadWord(ctx);
+ v3 = ScriptReadHalfword(ctx);
+ v4 = ScriptReadWord(ctx);
+
+ if (CheckCompatibility(v1, v2, v3, v4) == TRUE)
+ ctx->data[3] = 1;
+ else
+ SetIncompatible();
+
+ return TRUE;
+}
+
+bool8 MEScrCmd_nop(struct ScriptContext *ctx)
+{
+ return FALSE;
+}
+
+bool8 MEScrCmd_setstatus(struct ScriptContext *ctx)
+{
+ u8 value = ScriptReadByte(ctx);
+ ctx->data[2] = value;
+ return FALSE;
+}
+
+bool8 MEScrCmd_setmsg(struct ScriptContext *ctx)
+{
+ u8 value = ScriptReadByte(ctx);
+ u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ if (value == 0xFF || value == ctx->data[2])
+ StringExpandPlaceholders(gStringVar4, str);
+ return FALSE;
+}
+
+bool8 MEScrCmd_runscript(struct ScriptContext *ctx)
+{
+ u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ ScriptContext2_RunNewScript(script);
+ return FALSE;
+}
+
+bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx)
+{
+ u8 *str;
+ const u8 *message;
+ bool32 haveBerry = IsEnigmaBerryValid();
+ u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ StringCopyN(gStringVar1, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_COUNT);
+ SetEnigmaBerry(berry);
+ StringCopyN(gStringVar2, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_COUNT);
+
+ if (!haveBerry)
+ {
+ str = gStringVar4;
+ message = gText_MysteryGiftBerry;
+ }
+ else if (StringCompare(gStringVar1, gStringVar2))
+ {
+ str = gStringVar4;
+ message = gText_MysteryGiftBerryTransform;
+ }
+ else
+ {
+ str = gStringVar4;
+ message = gText_MysteryGiftBerryObtained;
+ }
+
+ StringExpandPlaceholders(str, message);
+
+ ctx->data[2] = 2;
+
+ if (IsEnigmaBerryValid() == TRUE)
+ VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1);
+ else
+ ctx->data[2] = 1;
+
+ return FALSE;
+}
+
+bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+ u8 ribbonId = ScriptReadByte(ctx);
+ GiveGiftRibbonToParty(index, ribbonId);
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSpecialRibbon);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_initramscript(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 objectId = ScriptReadByte(ctx);
+ u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId);
+ return FALSE;
+}
+
+bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx)
+{
+ EnableNationalPokedex();
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNationalDex);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_addrareword(struct ScriptContext *ctx)
+{
+ sub_811EFC0(ScriptReadByte(ctx));
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftRareWord);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx)
+{
+ u8 unk = ScriptReadByte(ctx);
+ u8 quantity = ScriptReadByte(ctx);
+ u16 itemId = ScriptReadHalfword(ctx);
+ SetRecordMixingGift(unk, quantity, itemId);
+ return FALSE;
+}
+
+bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)
+{
+ struct MailStruct mail;
+ struct Pokemon pokemon;
+ u16 species;
+ u16 heldItem;
+ u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];
+ void *pokemonPtr = (void *)data;
+ void *mailPtr = (void *)(data + sizeof(struct Pokemon));
+
+ pokemon = *(struct Pokemon *)pokemonPtr;
+ species = GetMonData(&pokemon, MON_DATA_SPECIES2);
+
+ if (species == SPECIES_EGG)
+ StringCopyN(gStringVar1, gText_EggNickname, POKEMON_NAME_LENGTH + 1);
+ else
+ StringCopyN(gStringVar1, gText_Pokemon, POKEMON_NAME_LENGTH + 1);
+
+ if (gPlayerPartyCount == PARTY_SIZE)
+ {
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftFullParty);
+ ctx->data[2] = 3;
+ }
+ else
+ {
+ memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon));
+ memcpy(&mail, mailPtr, sizeof(struct MailStruct));
+
+ if (species != SPECIES_EGG)
+ {
+ u16 pokedexNum = SpeciesToNationalPokedexNum(species);
+ GetSetPokedexFlag(pokedexNum, FLAG_SET_SEEN);
+ GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT);
+ }
+
+ heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM);
+ if (ItemIsMail(heldItem))
+ GiveMailToMon2(&gPlayerParty[5], &mail);
+ CompactPartySlots();
+ CalculatePlayerPartyCount();
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSentOver);
+ ctx->data[2] = 2;
+ }
+
+ return FALSE;
+}
+
+bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx)
+{
+ u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];
+ memcpy((void*)(gSaveBlock2Ptr) + 0xBEC, (void *)data, 0xBC);
+ ValidateEReaderTrainer();
+ StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx)
+{
+ EnableResetRTC();
+ StringExpandPlaceholders(gStringVar4, gText_InGameClockUsable);
+ ctx->data[2] = 2;
+ return FALSE;
+}
+
+bool8 MEScrCmd_checksum(struct ScriptContext *ctx)
+{
+ int checksum = ScriptReadWord(ctx);
+ u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ if (checksum != CalcByteArraySum(data, dataEnd - data))
+ {
+ ctx->data[3] = 0;
+ ctx->data[2] = 1;
+ }
+ return TRUE;
+}
+
+bool8 MEScrCmd_crc(struct ScriptContext *ctx)
+{
+ int crc = ScriptReadWord(ctx);
+ u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
+ if (crc != CalcCRC16(data, dataEnd - data))
+ {
+ ctx->data[3] = 0;
+ ctx->data[2] = 1;
+ }
+ return TRUE;
+}
diff --git a/src/naming_screen.c b/src/naming_screen.c
new file mode 100644
index 000000000..f99d23bc3
--- /dev/null
+++ b/src/naming_screen.c
@@ -0,0 +1,2175 @@
+#include "global.h"
+#include "naming_screen.h"
+#include "malloc.h"
+#include "palette.h"
+#include "task.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "window.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "pokemon.h"
+#include "field_specials.h"
+#include "field_player_avatar.h"
+#include "event_object_movement.h"
+#include "event_data.h"
+#include "constants/vars.h"
+#include "constants/songs.h"
+#include "pokemon_storage_system.h"
+#include "sound.h"
+#include "trig.h"
+#include "field_effect.h"
+#include "pokemon_icon.h"
+#include "data2.h"
+#include "strings.h"
+#include "menu.h"
+#include "text_window.h"
+#include "overworld.h"
+#include "constants/event_objects.h"
+
+EWRAM_DATA static struct NamingScreenData *gNamingScreenData = NULL;
+extern u16 gKeyRepeatStartDelay;
+
+// extern graphics
+extern const u16 gNamingScreenMenu_Pal[];
+extern const u8 gNamingScreenMenu_Gfx[];
+extern const u8 gUnknown_08DD4544[];
+extern const u8 gUnknown_08DD4620[];
+extern const u8 gUnknown_08DD46E0[];
+extern const u8 gUnknown_08DD47A0[];
+extern const u8 gNamingScreenRWindow_Gfx[];
+extern const u8 gNamingScreenKeyboardButton_Gfx[];
+extern const u8 gNamingScreenROptions_Gfx[];
+extern const u8 gNamingScreenCursor_Gfx[];
+extern const u8 gNamingScreenRightPointingTriangleTiles[];
+extern const u8 gNamingScreenUnderscoreTiles[];
+
+// extern text
+extern const u8 gExpandedPlaceholder_Empty[];
+extern const u8 gText_PkmnTransferredSomeonesPC[];
+extern const u8 gText_PkmnTransferredLanettesPC[];
+extern const u8 gText_PkmnBoxSomeonesPCFull[];
+extern const u8 gText_PkmnBoxLanettesPCFull[];
+extern const u8 gText_MoveOkBack[];
+extern const u8 gText_YourName[];
+extern const u8 gText_BoxName[];
+extern const u8 gText_PkmnsNickname[];
+extern const u8 gText_TellHimTheWords[];
+extern const u8 gUnknown_0862B88D[];
+extern const u8 gUnknown_0862B8AE[];
+extern const u8 gUnknown_0862B8CF[];
+extern const u8 gUnknown_0862B8F0[];
+extern const u8 gUnknown_0862B911[];
+extern const u8 gUnknown_0862B932[];
+extern const u8 gUnknown_0862B953[];
+extern const u8 gUnknown_0862B974[];
+extern const u8 gUnknown_0862B995[];
+extern const u8 gUnknown_0862B9AE[];
+extern const u8 gUnknown_0862B9C7[];
+extern const u8 gUnknown_0862B9E0[];
+
+
+// start of .rodata
+static const u8 gSpriteImage_858BBF8[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp");
+static const u8 gSpriteImage_858BCB8[] = INCBIN_U8("graphics/naming_screen/pc_icon/1.4bpp");
+static const u16 gUnknown_0858BD78[] = INCBIN_U16("graphics/naming_screen/0.gbapal");
+static const u16 gUnknown_0858BD98[] = INCBIN_U16("graphics/naming_screen/1.gbapal");
+
+static const u8 *const gUnknown_0858BDB8[] =
+{
+ gText_PkmnTransferredSomeonesPC,
+ gText_PkmnTransferredLanettesPC,
+ gText_PkmnBoxSomeonesPCFull,
+ gText_PkmnBoxLanettesPCFull
+};
+
+static const u8 gUnknown_0858BDC8[] = _("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!");
+
+static const struct BgTemplate gUnknown_0858BE00[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .priority = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 29,
+ .priority = 1
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 28,
+ .priority = 2
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .priority = 3
+ }
+};
+
+static const struct WindowTemplate gUnknown_0858BE10[] = {
+ { 0x01, 0x03, 0x0A, 0x13, 0x08, 0x0A, 0x030 },
+ { 0x02, 0x03, 0x0A, 0x13, 0x08, 0x0A, 0x0C8 },
+ { 0x03, 0x08, 0x06, 0x11, 0x02, 0x0A, 0x030 },
+ { 0x03, 0x08, 0x04, 0x11, 0x02, 0x0A, 0x052 },
+ { 0x00, 0x00, 0x00, 0x1E, 0x02, 0x0B, 0x074 },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const u8 gUnknown_0858BE40[] = __("abcdef .ghijkl ,mnopqrs tuvwxyz ABCDEF .GHIJKL ,MNOPQRS TUVWXYZ 01234 56789 !?♂♀/- …“”‘’ ");
+
+static const u8 gUnknown_0858BEA0[] = { 8, 8, 6 };
+static const u8 gUnknown_0858BEA3[] = { 0, 12, 24, 56, 68, 80, 92, 123, 0, 12, 24, 56, 68, 80, 92, 123, 0, 22, 44, 66, 88, 110, 0, 0 };
+
+// forward declarations
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[];
+static const struct SubspriteTable gUnknown_0858C050[];
+static const struct SubspriteTable gUnknown_0858C058[];
+static const struct SubspriteTable gUnknown_0858C070[];
+static const struct SubspriteTable gUnknown_0858C078[];
+static const struct SpriteTemplate gUnknown_0858C0C0;
+static const struct SpriteTemplate gUnknown_0858C0D8;
+static const struct SpriteTemplate gUnknown_0858C0F0;
+static const struct SpriteTemplate gUnknown_0858C108;
+static const struct SpriteTemplate gUnknown_0858C120;
+static const struct SpriteTemplate gUnknown_0858C138;
+static const struct SpriteTemplate sSpriteTemplate_InputArrow;
+static const struct SpriteTemplate sSpriteTemplate_Underscore;
+static const struct SpriteTemplate gUnknown_0858C180;
+static const u8* const gUnknown_0858C198[][4];
+static const struct SpriteSheet gUnknown_0858C1C8[];
+static const struct SpritePalette gUnknown_0858C230[];
+
+static void C2_NamingScreen(void);
+static void NamingScreen_Init(void);
+static void NamingScreen_InitBGs(void);
+static void sub_80E3194(void);
+static void sub_80E31B0(u8 taskId);
+static bool8 MainState_BeginFadeIn(void);
+static bool8 MainState_WaitFadeIn(void);
+static bool8 MainState_HandleInput(void);
+static bool8 MainState_MoveToOKButton(void);
+static bool8 MainState_6(void);
+static bool8 MainState_BeginFadeInOut(void);
+static bool8 MainState_WaitFadeOutAndExit(void);
+static void DisplaySentToPCMessage(void);
+static bool8 sub_80E3604(void);
+static bool8 MainState_StartPageSwap(void);
+static bool8 MainState_WaitPageSwap(void);
+static void StartPageSwapAnim(void);
+static void Task_HandlePageSwapAnim(u8);
+static bool8 IsPageSwapAnimNotInProgress(void);
+static void sub_80E3948(u8, u8, u8);
+static void Task_80E39BC(u8);
+static u16 sub_80E3A74(u8);
+static void sub_80E3AE8(u8);
+static void sub_80E3B10(struct Task *, u8, u8);
+static void sub_80E3CC8(void);
+static void CursorInit(void);
+static void SetCursorPos(s16, s16);
+static void GetCursorPos(s16 *x, s16 *y);
+static void MoveCursorToOKButton(void);
+static void sub_80E3E3C(u8);
+static void sub_80E3E94(u8);
+static u8 IsCursorAnimFinished(void);
+static u8 GetCurrentPageColumnCount(void);
+static void CreatePageSwitcherSprites(void);
+static void sub_80E4050(void);
+static void sub_80E41B8(u8, struct Sprite *, struct Sprite *);
+static void CreateBackOkSprites(void);
+static void CreateUnderscoreSprites(void);
+static void CreateInputTargetIcon(void);
+static u8 HandleKeyboardEvent(void);
+static u8 sub_80E45E0(void);
+static u8 GetInputEvent(void);
+static void SetInputState(u8);
+static void sub_80E4964(void);
+static u8 GetTextCaretPosition(void);
+static void DeleteTextCharacter(void);
+static bool8 sub_80E4B54(void);
+static void AddTextCharacter(u8);
+static void sub_80E4BE4(void);
+static void choose_name_or_words_screen_load_bg_tile_patterns(void);
+static void sub_80E4CB8(void);
+static void choose_name_or_words_screen_apply_bg_pals(void);
+static void sub_80E4CF8(u8, const void *);
+static void nullsub_10(u8, u8);
+static void sub_80E4D10(void);
+static void sub_80E4DE4(u8, u8);
+static void sub_80E4E5C(void);
+static void sub_80E4EF0(void);
+static void sub_80E4F58(void);
+static void NamingScreen_TurnOffScreen(void);
+static void NamingScreen_InitDisplayMode(void);
+static void VBlankCB_NamingScreen(void);
+static void sub_80E501C(void);
+static bool8 sub_80E503C(u8);
+
+void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback)
+{
+ gNamingScreenData = Alloc(sizeof(struct NamingScreenData));
+ if (!gNamingScreenData)
+ {
+ SetMainCallback2(returnCallback);
+ }
+ else
+ {
+ gNamingScreenData->templateNum = templateNum;
+ gNamingScreenData->monSpecies = monSpecies;
+ gNamingScreenData->monGender = monGender;
+ gNamingScreenData->monPersonality = monPersonality;
+ gNamingScreenData->destBuffer = destBuffer;
+ gNamingScreenData->returnCallback = returnCallback;
+
+ if (templateNum == 0)
+ StartTimer1();
+
+ SetMainCallback2(C2_NamingScreen);
+ }
+}
+
+static void C2_NamingScreen(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ NamingScreen_TurnOffScreen();
+ NamingScreen_Init();
+ gMain.state++;
+ break;
+ case 1:
+ NamingScreen_InitBGs();
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 3:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 4:
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 5:
+ choose_name_or_words_screen_apply_bg_pals();
+ gMain.state++;
+ break;
+ case 6:
+ choose_name_or_words_screen_load_bg_tile_patterns();
+ gMain.state++;
+ break;
+ case 7:
+ sub_80E3CC8();
+ UpdatePaletteFade();
+ sub_80E501C();
+ gMain.state++;
+ break;
+ default:
+ sub_80E4CB8();
+ sub_80E3194();
+ break;
+ }
+}
+
+static void NamingScreen_Init(void)
+{
+ gNamingScreenData->state = 0;
+ gNamingScreenData->bg1vOffset = 0;
+ gNamingScreenData->bg2vOffset = 0;
+ gNamingScreenData->bg1Priority = BGCNT_PRIORITY(1);
+ gNamingScreenData->bg2Priority = BGCNT_PRIORITY(2);
+ gNamingScreenData->bgToReveal = 0;
+ gNamingScreenData->bgToHide = 1;
+ gNamingScreenData->template = sNamingScreenTemplates[gNamingScreenData->templateNum];
+ gNamingScreenData->currentPage = gNamingScreenData->template->initialPage;
+ gNamingScreenData->inputCharBaseXPos = (240 - gNamingScreenData->template->maxChars * 8) / 2 + 6;
+ if (gNamingScreenData->templateNum == 4)
+ gNamingScreenData->inputCharBaseXPos += 11;
+ gNamingScreenData->keyRepeatStartDelayCopy = gKeyRepeatStartDelay;
+ memset(gNamingScreenData->textBuffer, 0xFF, sizeof(gNamingScreenData->textBuffer));
+ if (gNamingScreenData->template->copyExistingString != 0)
+ StringCopy(gNamingScreenData->textBuffer, gNamingScreenData->destBuffer);
+ gKeyRepeatStartDelay = 16;
+}
+
+static void sub_80E2FA4(void)
+{
+ u8 i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].inUse)
+ gSprites[i].invisible = FALSE;
+ }
+ sub_80E3E3C(0);
+}
+
+static void NamingScreen_InitBGs(void)
+{
+ u8 i;
+
+ DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+ DmaClear32(3, (void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_0858BE00, 4);
+
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+
+ sub_81971D0();
+ sub_8197200();
+
+ for (i = 0; i < 5; i++)
+ gNamingScreenData->windows[i] = AddWindow(&gUnknown_0858BE10[i]);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0xC, 0x8));
+
+ SetBgTilemapBuffer(1, gNamingScreenData->tilemapBuffer1);
+ SetBgTilemapBuffer(2, gNamingScreenData->tilemapBuffer2);
+ SetBgTilemapBuffer(3, gNamingScreenData->tilemapBuffer3);
+
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20);
+}
+
+static void sub_80E3194(void)
+{
+ CreateTask(sub_80E31B0, 2);
+ SetMainCallback2(sub_80E4F58);
+}
+
+static void sub_80E31B0(u8 taskId)
+{
+ switch (gNamingScreenData->state)
+ {
+ case 0:
+ MainState_BeginFadeIn();
+ sub_80E2FA4();
+ NamingScreen_InitDisplayMode();
+ break;
+ case 1:
+ MainState_WaitFadeIn();
+ break;
+ case 2:
+ MainState_HandleInput();
+ break;
+ case 3:
+ MainState_MoveToOKButton();
+ MainState_HandleInput();
+ break;
+ case 4:
+ MainState_StartPageSwap();
+ break;
+ case 5:
+ MainState_WaitPageSwap();
+ break;
+ case 6:
+ MainState_6();
+ break;
+ case 7:
+ sub_80E3604();
+ break;
+ case 8:
+ MainState_BeginFadeInOut();
+ break;
+ case 9:
+ MainState_WaitFadeOutAndExit();
+ break;
+ }
+}
+
+static const u8 gUnknown_0858BEBB[] = { 0, 2, 1 };
+static const u8 gUnknown_0858BEBE[] = { 1, 0, 2 };
+static const u8 gUnknown_0858BEC1[] = { 2, 1, 0 };
+
+static u8 sub_80E3244(u8 a1)
+{
+ return gUnknown_0858BEBB[a1];
+}
+
+static u8 sub_80E3254(void)
+{
+ return gUnknown_0858BEBE[gNamingScreenData->currentPage];
+}
+
+static u8 sub_80E3274(void)
+{
+ return gUnknown_0858BEC1[gNamingScreenData->currentPage];
+}
+
+static bool8 MainState_BeginFadeIn(void)
+{
+ sub_80E4CF8(3, gUnknown_08DD4544);
+ gNamingScreenData->currentPage = 1;
+ sub_80E4CF8(2, gUnknown_08DD46E0);
+ sub_80E4CF8(1, gUnknown_08DD4620);
+ sub_80E4DE4(gNamingScreenData->windows[1], 0);
+ sub_80E4DE4(gNamingScreenData->windows[0], 1);
+ nullsub_10(2, 0);
+ nullsub_10(1, 1);
+ sub_80E4D10();
+ sub_80E4964();
+ sub_80E4EF0();
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ BlendPalettes(-1, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ gNamingScreenData->state++;
+ return FALSE;
+}
+
+static bool8 MainState_WaitFadeIn(void)
+{
+ if (!gPaletteFade.active)
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ sub_80E3E94(1);
+ gNamingScreenData->state++;
+ }
+ return FALSE;
+}
+
+static bool8 MainState_HandleInput(void)
+{
+ return HandleKeyboardEvent();
+}
+
+static bool8 MainState_MoveToOKButton(void)
+{
+ if (IsCursorAnimFinished())
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ MoveCursorToOKButton();
+ gNamingScreenData->state = MAIN_STATE_HANDLE_INPUT;
+ }
+ return FALSE;
+}
+
+static bool8 MainState_6(void)
+{
+ sub_80E4BE4();
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_80E3E94(0);
+ sub_80E3948(3, 0, 1);
+ if (gNamingScreenData->templateNum == NAMING_SCREEN_CAUGHT_MON &&
+ CalculatePlayerPartyCount() >= 6)
+ {
+ DisplaySentToPCMessage();
+ gNamingScreenData->state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE;
+ return FALSE;
+ }
+ else
+ {
+ gNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT;
+ return TRUE; //Exit the naming screen
+ }
+}
+
+static bool8 MainState_BeginFadeInOut(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gNamingScreenData->state++;
+ return FALSE;
+}
+
+static bool8 MainState_WaitFadeOutAndExit(void)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gNamingScreenData->templateNum == NAMING_SCREEN_PLAYER)
+ SeedRngAndSetTrainerId();
+ SetMainCallback2(gNamingScreenData->returnCallback);
+ DestroyTask(FindTaskIdByFunc(sub_80E31B0));
+ FreeAllWindowBuffers();
+ FREE_AND_SET_NULL(gNamingScreenData);
+ }
+ return FALSE;
+}
+
+static void DisplaySentToPCMessage(void)
+{
+ u8 stringToDisplay = 0;
+
+ if (!sub_813B260())
+ {
+ StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN)));
+ StringCopy(gStringVar2, gNamingScreenData->destBuffer);
+ }
+ else
+ {
+ StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN)));
+ StringCopy(gStringVar2, gNamingScreenData->destBuffer);
+ StringCopy(gStringVar3, GetBoxNamePtr(get_unknown_box_id()));
+ stringToDisplay = 2;
+ }
+
+ if (FlagGet(FLAG_SYS_PC_LANETTE))
+ stringToDisplay++;
+
+ StringExpandPlaceholders(gStringVar4, gUnknown_0858BDB8[stringToDisplay]);
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ gTextFlags.flag_0 = TRUE;
+ AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), 0, 2, 1, 3);
+ CopyWindowToVram(0, 3);
+}
+
+static bool8 sub_80E3604(void)
+{
+ RunTextPrinters();
+
+ if (!IsTextPrinterActive(0) && (gMain.newKeys & A_BUTTON))
+ gNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT;
+
+ return FALSE;
+}
+
+static bool8 MainState_StartPageSwap(void)
+{
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_80E4050();
+ StartPageSwapAnim();
+ sub_80E3E3C(1);
+ sub_80E3948(0, 0, 1);
+ PlaySE(SE_WIN_OPEN);
+ gNamingScreenData->state = MAIN_STATE_WAIT_PAGE_SWAP;
+ return FALSE;
+}
+
+static bool8 MainState_WaitPageSwap(void)
+{
+ s16 cursorX;
+ s16 cursorY;
+ bool32 var3;
+
+ if (IsPageSwapAnimNotInProgress())
+ {
+
+ GetCursorPos(&cursorX, &cursorY);
+ var3 = (cursorX == GetCurrentPageColumnCount());
+
+ gNamingScreenData->state = MAIN_STATE_HANDLE_INPUT;
+ gNamingScreenData->currentPage++;
+ gNamingScreenData->currentPage %= 3;
+
+ if (var3)
+ {
+ cursorX = GetCurrentPageColumnCount();
+ }
+ else
+ {
+ if (cursorX >= GetCurrentPageColumnCount())
+ cursorX = GetCurrentPageColumnCount() - 1;
+ }
+
+ SetCursorPos(cursorX, cursorY);
+ sub_80E4E5C();
+ SetInputState(INPUT_STATE_ENABLED);
+ sub_80E3E3C(0);
+ }
+ return FALSE;
+}
+
+//--------------------------------------------------
+// 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 void Task_HandlePageSwapAnim(u8 taskId)
+{
+ while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0);
+}
+
+static bool8 IsPageSwapAnimNotInProgress(void)
+{
+ if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 PageSwapAnimState_Init(struct Task *task)
+{
+ gNamingScreenData->bg1vOffset = 0;
+ gNamingScreenData->bg2vOffset = 0;
+ task->tState++;
+ return 0;
+}
+
+static bool8 PageSwapAnimState_1(struct Task *task)
+{
+ u16 *const arr[] =
+ {
+ &gNamingScreenData->bg2vOffset,
+ &gNamingScreenData->bg1vOffset
+ };
+
+ task->tFrameCount += 4;
+ *arr[gNamingScreenData->bgToReveal] = Sin(task->tFrameCount, 40);
+ *arr[gNamingScreenData->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 64)
+ {
+ u8 temp = gNamingScreenData->bg1Priority; //Why u8 and not u16?
+
+ gNamingScreenData->bg1Priority = gNamingScreenData->bg2Priority;
+ gNamingScreenData->bg2Priority = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_2(struct Task *task)
+{
+ u16 *const arr[] =
+ {
+ &gNamingScreenData->bg2vOffset,
+ &gNamingScreenData->bg1vOffset
+ };
+
+ task->tFrameCount += 4;
+ *arr[gNamingScreenData->bgToReveal] = Sin(task->tFrameCount, 40);
+ *arr[gNamingScreenData->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 128)
+ {
+ u8 temp = gNamingScreenData->bgToReveal;
+
+ gNamingScreenData->bgToReveal = gNamingScreenData->bgToHide;
+ gNamingScreenData->bgToHide = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_Done(struct Task *task)
+{
+ DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim));
+ return 0;
+}
+
+#undef tState
+#undef tFrameCount
+
+//--------------------------------------------------
+//
+//--------------------------------------------------
+
+static void sub_80E3920(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_80E39BC, 3);
+ gTasks[taskId].data[0] = 3;
+}
+
+static void sub_80E3948(u8 a, u8 b, u8 c)
+{
+ struct Task *task = &gTasks[FindTaskIdByFunc(Task_80E39BC)];
+
+ 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_80E3AE8(task->data[0]);
+ sub_80E3B10(task, a, b);
+}
+
+static void Task_80E39BC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (task->data[0] == 3 || task->data[2] == 0)
+ return;
+ MultiplyInvertedPaletteRGBComponents(sub_80E3A74(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;
+ if (task->data[4] >= 0)
+ {
+ if (task->data[3] < 14)
+ {
+ task->data[3] += task->data[4];
+ task->data[6] += task->data[4];
+ }
+ else
+ {
+ task->data[3] = 16;
+ task->data[6]++;
+ }
+ }
+ else
+ {
+ task->data[3] += task->data[4];
+ task->data[6] += task->data[4];
+ }
+
+ if (task->data[3] == 16 && task->data[6] == 22)
+ {
+ task->data[4] = -4;
+ }
+ else if (task->data[3] == 0)
+ {
+ task->data[2] = task->data[1];
+ task->data[4] = 2;
+ task->data[6] = 0;
+ }
+}
+
+static u16 sub_80E3A74(u8 a)
+{
+ const u16 arr[] =
+ {
+ IndexOfSpritePaletteTag(4) * 16 + 0x10E,
+ IndexOfSpritePaletteTag(6) * 16 + 0x10E,
+ IndexOfSpritePaletteTag(7) * 16 + 0x10E,
+ IndexOfSpritePaletteTag(7) * 16 + 0x101,
+ };
+
+ return arr[a];
+}
+
+static void sub_80E3AE8(u8 a)
+{
+ u16 index = sub_80E3A74(a);
+
+ gPlttBufferFaded[index] = gPlttBufferUnfaded[index];
+}
+
+static void sub_80E3B10(struct Task *task, u8 b, u8 c)
+{
+ task->data[0] = b;
+ task->data[1] = c;
+ task->data[2] = 1;
+ task->data[3] = 4;
+ task->data[4] = 2;
+ task->data[5] = 0;
+ task->data[6] = 4;
+}
+
+static void sub_80E3B30(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ StartSpriteAnim(sprite, 0);
+ sprite->invisible = (sprite->data[4] & 0xFF);
+ if (sprite->data[0] == GetCurrentPageColumnCount())
+ sprite->invisible = TRUE;
+ if (sprite->invisible || (sprite->data[4] & 0xFF00) == 0
+ || sprite->data[0] != sprite->data[2] || sprite->data[1] != sprite->data[3])
+ {
+ sprite->data[5] = 0;
+ sprite->data[6] = 2;
+ sprite->data[7] = 2;
+ }
+ sprite->data[7]--;
+ if (sprite->data[7] == 0)
+ {
+ sprite->data[5] += sprite->data[6];
+ if (sprite->data[5] == 16 || sprite->data[5] == 0)
+ sprite->data[6] = -sprite->data[6];
+ sprite->data[7] = 2;
+ }
+ if ((sprite->data[4] & 0xFF00) != 0)
+ {
+ s8 gb = sprite->data[5];
+ s8 r = sprite->data[5] >> 1;
+ u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101;
+
+ MultiplyInvertedPaletteRGBComponents(index, r, gb, gb);
+ }
+}
+
+static void sub_80E3C20(struct Sprite *sprite)
+{
+ const s16 arr[] = {0, -4, -2, -1};
+
+ if (sprite->data[0] == 0 || --sprite->data[0] == 0)
+ {
+ sprite->data[0] = 8;
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
+ }
+ sprite->pos2.x = arr[sprite->data[1]];
+}
+
+static void sub_80E3C6C(struct Sprite *sprite)
+{
+ const s16 arr[] = {2, 3, 2, 1};
+ u8 var;
+
+ var = GetTextCaretPosition();
+ if (var != (u8)sprite->data[0])
+ {
+ sprite->pos2.y = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sprite->pos2.y = arr[sprite->data[1]];
+ sprite->data[2]++;
+ if (sprite->data[2] > 8)
+ {
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
+ sprite->data[2] = 0;
+ }
+ }
+}
+
+//--------------------------------------------------
+// Cursor
+//--------------------------------------------------
+
+static void sub_80E3CC8(void)
+{
+ CursorInit();
+ CreatePageSwitcherSprites();
+ CreateBackOkSprites();
+ CreateUnderscoreSprites();
+ CreateInputTargetIcon();
+}
+
+static void CursorInit(void)
+{
+ gNamingScreenData->cursorSpriteId = CreateSprite(&gUnknown_0858C138, 38, 88, 1);
+ sub_80E3E3C(1);
+ gSprites[gNamingScreenData->cursorSpriteId].oam.priority = 1;
+ gSprites[gNamingScreenData->cursorSpriteId].oam.objMode = 1;
+ gSprites[gNamingScreenData->cursorSpriteId].data[6] = 1;
+ gSprites[gNamingScreenData->cursorSpriteId].data[6] = 2;
+ SetCursorPos(0, 0);
+}
+
+static void SetCursorPos(s16 x, s16 y)
+{
+ struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId];
+
+ if (x < gUnknown_0858BEA0[sub_80E3274()])
+ cursorSprite->pos1.x = gUnknown_0858BEA3[x + sub_80E3274() * 8] + 38;
+ else
+ cursorSprite->pos1.x = 0;
+
+ cursorSprite->pos1.y = y * 16 + 88;
+ cursorSprite->data[2] = cursorSprite->data[0];
+ cursorSprite->data[3] = cursorSprite->data[1];
+ cursorSprite->data[0] = x;
+ cursorSprite->data[1] = y;
+}
+
+static void GetCursorPos(s16 *x, s16 *y)
+{
+ struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId];
+
+ *x = cursorSprite->data[0];
+ *y = cursorSprite->data[1];
+}
+
+static void MoveCursorToOKButton(void)
+{
+ SetCursorPos(GetCurrentPageColumnCount(), 2);
+}
+
+static void sub_80E3E3C(u8 a)
+{
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] &= -256;
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] |= a;
+ StartSpriteAnim(&gSprites[gNamingScreenData->cursorSpriteId], 0);
+}
+
+static void sub_80E3E94(u8 a)
+{
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] &= 0xFF;
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] |= a << 8;
+}
+
+static void sub_80E3ED8(void)
+{
+ StartSpriteAnim(&gSprites[gNamingScreenData->cursorSpriteId], 1);
+}
+
+static bool8 IsCursorAnimFinished(void)
+{
+ return gSprites[gNamingScreenData->cursorSpriteId].animEnded;
+}
+
+enum
+{
+ KEY_ROLE_CHAR,
+ KEY_ROLE_PAGE,
+ KEY_ROLE_BACKSPACE,
+ KEY_ROLE_OK,
+};
+
+static const u8 sKeyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK};
+
+static u8 GetKeyRoleAtCursorPos(void)
+{
+ s16 cursorX;
+ s16 cursorY;
+
+ GetCursorPos(&cursorX, &cursorY);
+ if (cursorX < GetCurrentPageColumnCount())
+ return KEY_ROLE_CHAR;
+ else
+ return sKeyRoles[cursorY];
+}
+
+static u8 GetCurrentPageColumnCount(void)
+{
+ return gUnknown_0858BEA0[sub_80E3274()];
+}
+
+static void CreatePageSwitcherSprites(void)
+{
+ u8 spriteId1;
+ u8 spriteId2;
+ u8 spriteId3;
+
+ spriteId1 = CreateSprite(&gUnknown_0858C0C0, 0xCC, 0x58, 0);
+ gNamingScreenData->selectBtnFrameSpriteId = spriteId1;
+ SetSubspriteTables(&gSprites[spriteId1], gUnknown_0858C050);
+ gSprites[spriteId1].invisible = TRUE;
+
+ spriteId2 = CreateSprite(&gUnknown_0858C0F0, 0xCC, 0x54, 1);
+ gSprites[spriteId1].data[6] = spriteId2;
+ SetSubspriteTables(&gSprites[spriteId2], gUnknown_0858C058);
+ gSprites[spriteId2].invisible = TRUE;
+
+ spriteId3 = CreateSprite(&gUnknown_0858C0D8, 0xCC, 0x53, 2);
+ gSprites[spriteId3].oam.priority = 1;
+ gSprites[spriteId1].data[7] = spriteId3;
+ gSprites[spriteId3].invisible = TRUE;
+}
+
+static void sub_80E4050(void)
+{
+ struct Sprite *sprite = &gSprites[gNamingScreenData->selectBtnFrameSpriteId];
+
+ sprite->data[0] = 2;
+ sprite->data[1] = gNamingScreenData->currentPage;
+}
+
+static u8 sub_80E40AC(struct Sprite *);
+static u8 sub_80E4100(struct Sprite *);
+static u8 sub_80E4104(struct Sprite *);
+static u8 sub_80E4178(struct Sprite *);
+
+static u8 (*const gUnknown_0858BEE8[])(struct Sprite *) =
+{
+ sub_80E40AC,
+ sub_80E4100,
+ sub_80E4104,
+ sub_80E4178,
+};
+
+static void sub_80E4084(struct Sprite *sprite)
+{
+ while (gUnknown_0858BEE8[sprite->data[0]](sprite) != 0);
+}
+
+static u8 sub_80E40AC(struct Sprite *sprite)
+{
+ struct Sprite *sprite1 = &gSprites[sprite->data[6]];
+ struct Sprite *sprite2 = &gSprites[sprite->data[7]];
+
+ sub_80E41B8(sub_80E3244(gNamingScreenData->currentPage), sprite1, sprite2);
+ sprite->data[0]++;
+ return 0;
+}
+
+static u8 sub_80E4100(struct Sprite *sprite)
+{
+ return 0;
+}
+
+static u8 sub_80E4104(struct Sprite *sprite)
+{
+ struct Sprite *r4 = &gSprites[sprite->data[6]];
+ struct Sprite *r5 = &gSprites[sprite->data[7]];
+
+ r4->pos2.y++;
+ if (r4->pos2.y > 7)
+ {
+ sprite->data[0]++;
+ r4->pos2.y = -4;
+ r4->invisible = TRUE;
+ sub_80E41B8(sub_80E3244(((u8)sprite->data[1] + 1) % 3), r4, r5);
+ }
+ return 0;
+}
+
+static u8 sub_80E4178(struct Sprite *sprite)
+{
+ struct Sprite *r2 = &gSprites[sprite->data[6]];
+
+ r2->invisible = FALSE;
+ r2->pos2.y++;
+ if (r2->pos2.y >= 0)
+ {
+ r2->pos2.y = 0;
+ sprite->data[0] = 1;
+ }
+ return 0;
+}
+
+static const u16 gUnknown_0858BEF8[] = {1, 3, 2};
+static const u16 gUnknown_0858BEFE[] = {4, 6, 5};
+
+static void sub_80E41B8(u8 a, struct Sprite *b, struct Sprite *c)
+{
+ c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_0858BEF8[a]);
+ b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_0858BEFE[a]);
+ b->subspriteTableNum = a;
+}
+
+//
+
+static void CreateBackOkSprites(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_0858C108, 0xCC, 0x74, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_0858C070);
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0858C120, 0xCC, 0x8C, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_0858C070);
+ gSprites[spriteId].invisible = TRUE;
+}
+
+static void CreateUnderscoreSprites(void)
+{
+ u8 spriteId;
+ s16 xPos;
+ u8 i;
+
+ xPos = gNamingScreenData->inputCharBaseXPos - 5;
+ spriteId = CreateSprite(&sSpriteTemplate_InputArrow, xPos, 0x38, 0);
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].invisible = TRUE;
+ xPos = gNamingScreenData->inputCharBaseXPos;
+ for (i = 0; i < gNamingScreenData->template->maxChars; i++, xPos += 8)
+ {
+ spriteId = CreateSprite(&sSpriteTemplate_Underscore, xPos + 3, 0x3C, 0);
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].data[0] = i;
+ gSprites[spriteId].invisible = TRUE;
+ }
+}
+
+//--------------------------------------------------
+// Icon creation (the thing you're naming or giving input to)
+//--------------------------------------------------
+
+static void TaskDummy2(void);
+static void NamingScreen_CreatePlayerIcon(void);
+static void NamingScreen_CreatePCIcon(void);
+static void NamingScreen_CreateMonIcon(void);
+static void NamingScreen_CreateWandaDadIcon(void);
+
+static void (*const sIconFunctions[])(void) =
+{
+ TaskDummy2,
+ NamingScreen_CreatePlayerIcon,
+ NamingScreen_CreatePCIcon,
+ NamingScreen_CreateMonIcon,
+ NamingScreen_CreateWandaDadIcon,
+};
+
+static void CreateInputTargetIcon(void)
+{
+ sIconFunctions[gNamingScreenData->template->iconFunction]();
+}
+
+static void TaskDummy2(void)
+{
+
+}
+
+static void NamingScreen_CreatePlayerIcon(void)
+{
+ u8 rivalGfxId;
+ u8 spriteId;
+
+ rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, gNamingScreenData->monSpecies);
+ spriteId = AddPseudoEventObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x25, 0);
+ gSprites[spriteId].oam.priority = 3;
+ StartSpriteAnim(&gSprites[spriteId], 4);
+}
+
+static void NamingScreen_CreatePCIcon(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_0858C180, 0x38, 0x29, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_0858C078);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static void NamingScreen_CreateMonIcon(void)
+{
+ u8 spriteId;
+
+ LoadMonIconPalettes();
+ spriteId = CreateMonIcon(gNamingScreenData->monSpecies, SpriteCallbackDummy, 0x38, 0x28, 0, gNamingScreenData->monPersonality, 1);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static void NamingScreen_CreateWandaDadIcon(void)
+{
+ u8 spriteId;
+
+ spriteId = AddPseudoEventObject(EVENT_OBJ_GFX_MAN_1, SpriteCallbackDummy, 0x38, 0x25, 0);
+ gSprites[spriteId].oam.priority = 3;
+ StartSpriteAnim(&gSprites[spriteId], 4);
+}
+
+//--------------------------------------------------
+// Keyboard handling
+//--------------------------------------------------
+
+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_80E45E0();
+ }
+ else if (event == KBEVENT_PRESSED_B)
+ {
+ DeleteTextCharacter();
+ return FALSE;
+ }
+ else if (event == KBEVENT_PRESSED_START)
+ {
+ MoveCursorToOKButton();
+ return FALSE;
+ }
+ else
+ {
+ return sKeyboardKeyHandlers[keyRole](event);
+ }
+}
+
+static bool8 KeyboardKeyHandler_Character(u8 event)
+{
+ sub_80E3948(3, 0, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ bool8 var = sub_80E4B54();
+
+ sub_80E3ED8();
+ if (var)
+ {
+ SetInputState(INPUT_STATE_2);
+ gNamingScreenData->state = MAIN_STATE_MOVE_TO_OK_BUTTON;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Page(u8 event)
+{
+ sub_80E3948(0, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ return sub_80E45E0();
+ else
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Backspace(u8 event)
+{
+ sub_80E3948(1, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ DeleteTextCharacter();
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_OK(u8 event)
+{
+ sub_80E3948(2, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ PlaySE(SE_SELECT);
+ gNamingScreenData->state = MAIN_STATE_6;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static bool8 sub_80E45E0(void)
+{
+ gNamingScreenData->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 InputState_2(struct Task *);
+
+static void (*const sInputStateFuncs[])(struct Task *) =
+{
+ InputState_Disabled,
+ InputState_Enabled,
+ InputState_2,
+};
+
+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;
+ else if (gMain.newKeys & B_BUTTON)
+ task->tKeyboardEvent = KBEVENT_PRESSED_B;
+ else if (gMain.newKeys & SELECT_BUTTON)
+ task->tKeyboardEvent = KBEVENT_PRESSED_SELECT;
+ else if (gMain.newKeys & START_BUTTON)
+ task->tKeyboardEvent = KBEVENT_PRESSED_START;
+ else
+ HandleDpadMovement(task);
+}
+
+static void InputState_2(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+}
+
+static void HandleDpadMovement(struct Task *task)
+{
+ const s16 sDpadDeltaX[] =
+ {
+ 0, //none
+ 0, //up
+ 0, //down
+ -1, //left
+ 1 //right
+ };
+
+ const s16 sDpadDeltaY[] =
+ {
+ 0, //none
+ -1, //up
+ 1, //down
+ 0, //left
+ 0 //right
+ };
+
+ const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2};
+ const s16 gUnknown_0858BF50[] = {0, 0, 3};
+
+ 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 = GetCurrentPageColumnCount();
+ if (cursorX > GetCurrentPageColumnCount())
+ cursorX = 0;
+
+ //Handle cursor movement in X direction
+ if (sDpadDeltaX[dpadDir] != 0)
+ {
+ if (cursorX == GetCurrentPageColumnCount())
+ {
+ //We are now on the last column
+ task->tKbFunctionKey = cursorY;
+ cursorY = s4RowTo3RowTableY[cursorY];
+ }
+ else if (prevCursorX == GetCurrentPageColumnCount())
+ {
+ if (cursorY == 1)
+ cursorY = task->tKbFunctionKey;
+ else
+ cursorY = gUnknown_0858BF50[cursorY];
+ }
+ }
+
+ if (cursorX == GetCurrentPageColumnCount())
+ {
+ //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 sub_80E4894(void)
+{
+ FillWindowPixelBuffer(gNamingScreenData->windows[3], 0x11);
+ PrintTextOnWindow(gNamingScreenData->windows[3], 1, gNamingScreenData->template->title, 8, 1, 0, 0);
+ PutWindowTilemap(gNamingScreenData->windows[3]);
+}
+
+static void sub_80E48E8(void)
+{
+ u8 buffer[0x20];
+
+ StringCopy(buffer, gSpeciesNames[gNamingScreenData->monSpecies]);
+ StringAppendN(buffer, gNamingScreenData->template->title, 15);
+ FillWindowPixelBuffer(gNamingScreenData->windows[3], 0x11);
+ PrintTextOnWindow(gNamingScreenData->windows[3], 1, buffer, 8, 1, 0, 0);
+ PutWindowTilemap(gNamingScreenData->windows[3]);
+}
+
+static void (*const gUnknown_0858BF58[])(void) =
+{
+ sub_80E4894,
+ sub_80E4894,
+ sub_80E48E8,
+ sub_80E48E8,
+ sub_80E4894,
+};
+
+static void sub_80E4964(void)
+{
+ gUnknown_0858BF58[gNamingScreenData->templateNum]();
+}
+
+static void TaskDummy3(void);
+static void sub_80E49BC(void);
+
+static void (*const gUnknown_0858BF6C[])(void) =
+{
+ TaskDummy3,
+ sub_80E49BC,
+};
+
+static void sub_80E498C(void)
+{
+ gUnknown_0858BF6C[gNamingScreenData->template->addGenderIcon]();
+}
+
+static void TaskDummy3(void)
+{
+
+}
+
+static const u8 sGenderColors[2][3] =
+{
+ {0, 9, 8},
+ {0, 5, 4}
+};
+
+static void sub_80E49BC(void)
+{
+ u8 genderSymbol[2];
+ bool8 isFemale = FALSE;
+
+ StringCopy(genderSymbol, gText_MaleSymbol);
+
+ if (gNamingScreenData->monGender != MON_GENDERLESS)
+ {
+ if (gNamingScreenData->monGender == MON_FEMALE)
+ {
+ StringCopy(genderSymbol, gText_FemaleSymbol);
+ isFemale = TRUE;
+ }
+ box_print(gNamingScreenData->windows[2], 1, 0x68, 1, sGenderColors[isFemale], -1, genderSymbol);
+ }
+}
+
+static u8 GetCharAtKeyboardPos(s16 a, s16 b)
+{
+ return gUnknown_0858BE40[a + b * 8 + sub_80E3274() * 32];
+}
+
+
+static u8 GetTextCaretPosition(void)
+{
+ u8 i;
+
+ for (i = 0; i < gNamingScreenData->template->maxChars; i++)
+ {
+ if (gNamingScreenData->textBuffer[i] == EOS)
+ return i;
+ }
+ return gNamingScreenData->template->maxChars - 1;
+}
+
+static u8 GetPreviousTextCaretPosition(void)
+{
+ s8 i;
+
+ for (i = gNamingScreenData->template->maxChars - 1; i > 0; i--)
+ {
+ if (gNamingScreenData->textBuffer[i] != EOS)
+ return i;
+ }
+ return 0;
+}
+
+static void DeleteTextCharacter(void)
+{
+ u8 index;
+ u8 var2;
+
+ index = GetPreviousTextCaretPosition();
+ gNamingScreenData->textBuffer[index] = 0;
+ sub_80E4D10();
+ CopyBgTilemapBufferToVram(3);
+ gNamingScreenData->textBuffer[index] = EOS;
+ var2 = GetKeyRoleAtCursorPos();
+ if (var2 == 0 || var2 == 2)
+ sub_80E3948(1, 0, 1);
+ PlaySE(SE_BOWA);
+}
+
+static bool8 sub_80E4B54(void)
+{
+ s16 x;
+ s16 y;
+
+ GetCursorPos(&x, &y);
+ AddTextCharacter(GetCharAtKeyboardPos(x, y));
+ sub_80E4D10();
+ CopyBgTilemapBufferToVram(3);
+ PlaySE(SE_SELECT);
+
+ if (GetPreviousTextCaretPosition() != gNamingScreenData->template->maxChars - 1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static void AddTextCharacter(u8 ch)
+{
+ u8 index = GetTextCaretPosition();
+
+ gNamingScreenData->textBuffer[index] = ch;
+}
+
+static void sub_80E4BE4(void)
+{
+ u8 i;
+
+ for (i = 0; i < gNamingScreenData->template->maxChars; i++)
+ {
+ if (gNamingScreenData->textBuffer[i] != CHAR_SPACE && gNamingScreenData->textBuffer[i] != EOS)
+ {
+ StringCopyN(gNamingScreenData->destBuffer, gNamingScreenData->textBuffer, gNamingScreenData->template->maxChars + 1);
+ break;
+ }
+ }
+}
+
+static void choose_name_or_words_screen_load_bg_tile_patterns(void)
+{
+ LZ77UnCompWram(gNamingScreenMenu_Gfx, gNamingScreenData->tileBuffer);
+ LoadBgTiles(1, gNamingScreenData->tileBuffer, 0x600, 0);
+ LoadBgTiles(2, gNamingScreenData->tileBuffer, 0x600, 0);
+ LoadBgTiles(3, gNamingScreenData->tileBuffer, 0x600, 0);
+ LoadSpriteSheets(gUnknown_0858C1C8);
+ LoadSpritePalettes(gUnknown_0858C230);
+}
+
+static void sub_80E4CB8(void)
+{
+ InputInit();
+ sub_80E3920();
+}
+
+static void choose_name_or_words_screen_apply_bg_pals(void)
+{
+ LoadPalette(gNamingScreenMenu_Pal, 0, 0xC0);
+ LoadPalette(gUnknown_0858BD78, 0xA0, sizeof(gUnknown_0858BD78));
+ LoadPalette(stdpal_get(2), 0xB0, 0x20);
+}
+
+static void sub_80E4CF8(u8 bg, const void *src)
+{
+ CopyToBgTilemapBuffer(bg, src, 0, 0);
+}
+
+static void nullsub_10(u8 a1, u8 a2)
+{
+
+}
+
+static void sub_80E4D10(void)
+{
+ u8 i;
+ u8 temp[2];
+ u16 unk2;
+ u8 maxChars = gNamingScreenData->template->maxChars;
+ u16 unk = gNamingScreenData->inputCharBaseXPos - 0x40;
+
+ FillWindowPixelBuffer(gNamingScreenData->windows[2], 0x11);
+
+ for (i = 0; i < maxChars; i++)
+ {
+ temp[0] = gNamingScreenData->textBuffer[i];
+ temp[1] = gExpandedPlaceholder_Empty[0];
+ unk2 = (sub_80E503C(temp[0]) == 1) ? 2 : 0;
+
+ PrintTextOnWindow(gNamingScreenData->windows[2], 1, temp, i * 8 + unk + unk2, 1, 0xFF, NULL);
+ }
+
+ sub_80E498C();
+ CopyWindowToVram(gNamingScreenData->windows[2], 2);
+ PutWindowTilemap(gNamingScreenData->windows[2]);
+}
+
+struct TextColorThing // needed because of alignment... it's so stupid
+{
+ u8 colors[3][4];
+};
+
+static const struct TextColorThing sUnkColorStruct =
+{
+ {
+ {13, 1, 2},
+ {14, 1, 2},
+ {15, 1, 2}
+ }
+};
+
+static const u8 sFillValues[3] =
+{
+ 0xEE, 0xDD, 0xFF
+};
+
+static const u8 *const sUnkColors[3] =
+{
+ sUnkColorStruct.colors[1],
+ sUnkColorStruct.colors[0],
+ sUnkColorStruct.colors[2]
+};
+
+static void sub_80E4DE4(u8 window, u8 a1)
+{
+ u8 i;
+
+ FillWindowPixelBuffer(window, sFillValues[a1]);
+
+ for (i = 0; i < 4; i++)
+ {
+ box_print(window, 1, 0, i * 16 + 1, sUnkColors[a1], 0, gUnknown_0858C198[a1][i]);
+ }
+
+ PutWindowTilemap(window);
+}
+
+static const u8 *const gUnknown_0858BF98[] =
+{
+ gUnknown_08DD4620,
+ gUnknown_08DD46E0,
+ gUnknown_08DD47A0
+};
+
+static void sub_80E4E5C(void)
+{
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;
+ u8 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;
+
+ if (bg1Priority > bg2Priority)
+ {
+ unk1 = 1;
+ unk2 = 1;
+ unk3 = gNamingScreenData->windows[0];
+ }
+ else
+ {
+ unk1 = 2;
+ unk2 = 2;
+ unk3 = gNamingScreenData->windows[1];
+ }
+
+ sub_80E4CF8(unk1, gUnknown_0858BF98[gNamingScreenData->currentPage]);
+ sub_80E4DE4(unk3, sub_80E3254());
+ nullsub_10(unk1, sub_80E3254());
+ CopyBgTilemapBufferToVram(unk2);
+}
+
+static void sub_80E4EF0(void)
+{
+ const u8 color[3] = { 15, 1, 2 };
+
+ FillWindowPixelBuffer(gNamingScreenData->windows[4], 0xFF);
+ box_print(gNamingScreenData->windows[4], 0, 2, 1, color, 0, gText_MoveOkBack);
+ PutWindowTilemap(gNamingScreenData->windows[4]);
+ CopyWindowToVram(gNamingScreenData->windows[4], 3);
+}
+
+static void sub_80E4F58(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void NamingScreen_TurnOffScreen(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+}
+
+static void NamingScreen_InitDisplayMode(void)
+{
+ SetVBlankCallback(VBlankCB_NamingScreen);
+}
+
+static void VBlankCB_NamingScreen(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ SetGpuReg(REG_OFFSET_BG1VOFS, gNamingScreenData->bg1vOffset);
+ SetGpuReg(REG_OFFSET_BG2VOFS, gNamingScreenData->bg2vOffset);
+ SetGpuReg(REG_OFFSET_BG1CNT, GetGpuReg(REG_OFFSET_BG1CNT) & 0xFFFC);
+ SetGpuRegBits(REG_OFFSET_BG1CNT, gNamingScreenData->bg1Priority);
+ SetGpuReg(REG_OFFSET_BG2CNT, GetGpuReg(REG_OFFSET_BG2CNT) & 0xFFFC);
+ SetGpuRegBits(REG_OFFSET_BG2CNT, gNamingScreenData->bg2Priority);
+}
+
+static void sub_80E501C(void)
+{
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+}
+
+static bool8 sub_80E503C(u8 character)
+{
+ u8 i;
+
+ for (i = 0; gUnknown_0858BDC8[i] != EOS; i++)
+ {
+ if (character == gUnknown_0858BDC8[i])
+ return FALSE;
+ }
+ return FALSE;
+}
+
+static void sub_80E5074(void)
+{
+ DoNamingScreen(0, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+static void sub_80E509C(void)
+{
+ DoNamingScreen(1, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+static void sub_80E50C4(void)
+{
+ DoNamingScreen(2, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+static void sub_80E50EC(void)
+{
+ DoNamingScreen(3, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldWithOpenMenu);
+}
+
+//--------------------------------------------------
+// Forward-declared variables
+//--------------------------------------------------
+
+static const struct NamingScreenTemplate playerNamingScreenTemplate =
+{
+ .copyExistingString = 0,
+ .maxChars = 7,
+ .iconFunction = 1,
+ .addGenderIcon = 0,
+ .initialPage = 1,
+ .unused = 35,
+ .title = gText_YourName,
+};
+
+static const struct NamingScreenTemplate pcBoxNamingTemplate =
+{
+ .copyExistingString = 0,
+ .maxChars = 8,
+ .iconFunction = 2,
+ .addGenderIcon = 0,
+ .initialPage = 1,
+ .unused = 19,
+ .title = gText_BoxName,
+};
+
+static const struct NamingScreenTemplate monNamingScreenTemplate =
+{
+ .copyExistingString = 0,
+ .maxChars = 10,
+ .iconFunction = 3,
+ .addGenderIcon = 1,
+ .initialPage = 1,
+ .unused = 35,
+ .title = gText_PkmnsNickname,
+};
+
+static const struct NamingScreenTemplate wandaWordsScreenTemplate =
+{
+ .copyExistingString = 1,
+ .maxChars = 15,
+ .iconFunction = 4,
+ .addGenderIcon = 0,
+ .initialPage = 1,
+ .unused = 11,
+ .title = gText_TellHimTheWords,
+};
+
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[] =
+{
+ &playerNamingScreenTemplate,
+ &pcBoxNamingTemplate,
+ &monNamingScreenTemplate,
+ &monNamingScreenTemplate,
+ &wandaWordsScreenTemplate,
+};
+
+const struct OamData gOamData_858BFEC =
+{
+ .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_858BFF4 =
+{
+ .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_858BFFC =
+{
+ .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,
+};
+
+static const struct Subsprite gUnknown_0858C004[] =
+{
+ {-20, -16, 1, 1, 0, 1},
+ { 12, -16, 0, 0, 4, 1},
+ {-20, -8, 1, 1, 5, 1},
+ { 12, -8, 0, 0, 9, 1},
+ {-20, 0, 1, 1, 10, 1},
+ { 12, 0, 0, 0, 14, 1},
+ {-20, 8, 1, 1, 15, 1},
+ { 12, 8, 0, 0, 19, 1}
+};
+
+static const struct Subsprite gUnknown_0858C024[] =
+{
+ {-12, -4, 1, 0, 0, 1},
+ { 4, -4, 0, 0, 2, 1}
+};
+
+static const struct Subsprite gUnknown_0858C02C[] =
+{
+ {-20, -12, 1, 1, 0, 1},
+ { 12, -12, 0, 0, 4, 1},
+ {-20, -4, 1, 1, 5, 1},
+ { 12, -4, 0, 0, 9, 1},
+ {-20, 4, 1, 1, 10, 1},
+ { 12, 4, 0, 0, 14, 1}
+};
+
+static const struct Subsprite gUnknown_0858C044[] =
+{
+ {-8, -12, 1, 0, 0, 3},
+ {-8, -4, 1, 0, 2, 3},
+ {-8, 4, 1, 0, 4, 3}
+};
+
+static const struct SubspriteTable gUnknown_0858C050[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C004), gUnknown_0858C004}
+};
+
+static const struct SubspriteTable gUnknown_0858C058[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C024), gUnknown_0858C024},
+ {ARRAY_COUNT(gUnknown_0858C024), gUnknown_0858C024},
+ {ARRAY_COUNT(gUnknown_0858C024), gUnknown_0858C024}
+};
+
+static const struct SubspriteTable gUnknown_0858C070[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C02C), gUnknown_0858C02C}
+};
+
+static const struct SubspriteTable gUnknown_0858C078[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C044), gUnknown_0858C044}
+};
+
+static const struct SpriteFrameImage gUnknown_0858C080[] =
+{
+ {gSpriteImage_858BBF8, sizeof(gSpriteImage_858BBF8)},
+ {gSpriteImage_858BCB8, sizeof(gSpriteImage_858BCB8)},
+};
+
+static const union AnimCmd gSpriteAnim_858C090[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_858C098[] =
+{
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(8, 8),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_858C0A4[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0B0[] =
+{
+ gSpriteAnim_858C090
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0B4[] =
+{
+ gSpriteAnim_858C090,
+ gSpriteAnim_858C098
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0BC[] =
+{
+ gSpriteAnim_858C0A4
+};
+
+static const struct SpriteTemplate gUnknown_0858C0C0 =
+{
+ .tileTag = 0x0002,
+ .paletteTag = 0x0004,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E4084
+};
+
+static const struct SpriteTemplate gUnknown_0858C0D8 =
+{
+ .tileTag = 0x0003,
+ .paletteTag = 0x0001,
+ .oam = &gOamData_858BFFC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C0F0 =
+{
+ .tileTag = 0x0004,
+ .paletteTag = 0x0004,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C108 =
+{
+ .tileTag = 0x0000,
+ .paletteTag = 0x0006,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C120 =
+{
+ .tileTag = 0x0001,
+ .paletteTag = 0x0007,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C138 =
+{
+ .tileTag = 0x0007,
+ .paletteTag = 0x0005,
+ .oam = &gOamData_858BFF4,
+ .anims = gSpriteAnimTable_858C0B4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E3B30
+};
+
+static const struct SpriteTemplate sSpriteTemplate_InputArrow =
+{
+ .tileTag = 0x000A,
+ .paletteTag = 0x0003,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E3C20
+};
+
+static const struct SpriteTemplate sSpriteTemplate_Underscore =
+{
+ .tileTag = 0x000B,
+ .paletteTag = 0x0003,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E3C6C
+};
+
+static const struct SpriteTemplate gUnknown_0858C180 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x0000,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0BC,
+ .images = gUnknown_0858C080,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const u8* const gUnknown_0858C198[][4] =
+{
+ {
+ gUnknown_0862B88D,
+ gUnknown_0862B8AE,
+ gUnknown_0862B8CF,
+ gUnknown_0862B8F0
+ },
+ {
+ gUnknown_0862B911,
+ gUnknown_0862B932,
+ gUnknown_0862B953,
+ gUnknown_0862B974
+ },
+ {
+ gUnknown_0862B995,
+ gUnknown_0862B9AE,
+ gUnknown_0862B9C7,
+ gUnknown_0862B9E0
+ },
+};
+
+static const struct SpriteSheet gUnknown_0858C1C8[] =
+{
+ {gNamingScreenRWindow_Gfx + 0x280, 0x1E0, 0x0000},
+ {gNamingScreenRWindow_Gfx + 0x460, 0x1E0, 0x0001},
+ {gNamingScreenRWindow_Gfx, 0x280, 0x0002},
+ {gNamingScreenKeyboardButton_Gfx + 0x20, 0x100, 0x0003},
+ {gNamingScreenROptions_Gfx, 0x060, 0x0004},
+ {gNamingScreenROptions_Gfx + 0xA0, 0x060, 0x0005},
+ {gNamingScreenROptions_Gfx + 0x140, 0x060, 0x0006},
+ {gNamingScreenCursor_Gfx, 0x080, 0x0007},
+ {gNamingScreenCursor_Gfx + 0xA0, 0x080, 0x0008},
+ {gNamingScreenCursor_Gfx + 0x140, 0x080, 0x0009},
+ {gNamingScreenRightPointingTriangleTiles, 0x020, 0x000A},
+ {gNamingScreenUnderscoreTiles, 0x020, 0x000B},
+ {NULL}
+};
+
+static const struct SpritePalette gUnknown_0858C230[] =
+{
+ {gNamingScreenMenu_Pal, 0x0000},
+ {gNamingScreenMenu_Pal + 0x10, 0x0001},
+ {gNamingScreenMenu_Pal + 0x20, 0x0002},
+ {gNamingScreenMenu_Pal + 0x30, 0x0003},
+ {gNamingScreenMenu_Pal + 0x40, 0x0004},
+ {gNamingScreenMenu_Pal + 0x50, 0x0005},
+ {gNamingScreenMenu_Pal + 0x40, 0x0006},
+ {gNamingScreenMenu_Pal + 0x40, 0x0007},
+ {NULL}
+};
diff --git a/src/new_game.c b/src/new_game.c
index 75e80dc8e..8b8436d10 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -1,6 +1,6 @@
#include "global.h"
#include "new_game.h"
-#include "rng.h"
+#include "random.h"
#include "pokemon.h"
#include "roamer.h"
#include "pokemon_size_record.h"
@@ -20,8 +20,10 @@
#include "tv.h"
#include "coins.h"
#include "text.h"
+#include "overworld.h"
+#include "mail.h"
+#include "battle_records.h"
-extern u8 gPlayerPartyCount;
extern u8 gDifferentSaveFile;
extern u16 gSaveFileStatus;
extern u8 gUnknown_030060B0;
@@ -29,20 +31,13 @@ extern u8 gUnknown_030060B0;
// TODO: replace those declarations with file headers
extern u16 GetGeneratedTrainerIdLower(void);
extern void ClearContestWinnerPicsInContestHall(void);
-extern void Overworld_SetWarpDestination(s8 mapBank, s8 mapNo, s8 warpNo, s8 xPos, s8 yPos);
-extern void warp_in(void);
extern void sub_80BB358(void);
extern void ResetBagScrollPositions(void);
-extern void sub_813624C(void); // clears something pokeblock related
extern void ResetPokedex(void);
-extern void sub_8084400(void);
-extern void ClearMailData(void);
extern void ResetGabbyAndTy(void);
extern void ResetSecretBases(void);
extern void ResetLinkContestBoolean(void);
-extern void ResetGameStats(void);
extern void sub_8052DA8(void);
-extern void InitLinkBattleRecords(void);
extern void ResetPokemonStorageSystem(void);
extern void ClearBag(void);
extern void NewGameInitPCItems(void);
@@ -59,8 +54,21 @@ extern void ResetContestLinkResults(void);
extern void ResetPokeJumpResults(void);
extern void SetBerryPowder(u32* powder, u32 newValue);
-extern u8 EventScript_2715DE[];
+extern const u8 EventScript_2715DE[];
+// this file's functions
+static void ClearFrontierRecord(void);
+static void WarpToTruck(void);
+static void ResetMiniGamesResults(void);
+
+// const rom data
+static const struct ContestWinner sContestWinnerPicDummy =
+{
+ .monName = _(""),
+ .trainerName = _("")
+};
+
+// code
void WriteUnalignedWord(u32 var, u8 *dataPtr)
{
dataPtr[0] = var;
@@ -81,14 +89,14 @@ void CopyUnalignedWord(u8 *copyTo, u8 *copyFrom)
copyTo[i] = copyFrom[i];
}
-void InitPlayerTrainerId(void)
+static void InitPlayerTrainerId(void)
{
u32 trainerId = (Random() << 0x10) | GetGeneratedTrainerIdLower();
WriteUnalignedWord(trainerId, gSaveBlock2Ptr->playerTrainerId);
}
// L=A isnt set here for some reason.
-void SetDefaultOptions(void)
+static void SetDefaultOptions(void)
{
gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID;
gSaveBlock2Ptr->optionsWindowFrameType = 0;
@@ -98,38 +106,31 @@ void SetDefaultOptions(void)
gSaveBlock2Ptr->regionMapZoom = FALSE;
}
-void ClearPokedexFlags(void)
+static void ClearPokedexFlags(void)
{
gUnknown_030060B0 = 0;
memset(&gSaveBlock2Ptr->pokedex.owned, 0, sizeof(gSaveBlock2Ptr->pokedex.owned));
memset(&gSaveBlock2Ptr->pokedex.seen, 0, sizeof(gSaveBlock2Ptr->pokedex.seen));
}
-const struct ContestWinner gContestWinnerPicDummy = {
- .monName = _(""),
- .trainerName = _("")
-};
-
void ClearAllContestWinnerPics(void)
{
s32 i;
ClearContestWinnerPicsInContestHall();
for (i = 8; i < 13; i++)
- gSaveBlock1Ptr->contestWinners[i] = gContestWinnerPicDummy;
+ gSaveBlock1Ptr->contestWinners[i] = sContestWinnerPicDummy;
}
-void sub_8084400(void)
+static void ClearFrontierRecord(void)
{
- // probably clearing one struct for battle frontier
- CpuFill32(0, gSaveBlock2Ptr->field_64C, 2272);
+ CpuFill32(0, &gSaveBlock2Ptr->frontier, sizeof(gSaveBlock2Ptr->frontier));
- // those look like strings
- gSaveBlock2Ptr->field_EE1 = 0xFF;
- gSaveBlock2Ptr->field_EE9 = 0xFF;
+ gSaveBlock2Ptr->frontier.field_EE1[0][0] = EOS;
+ gSaveBlock2Ptr->frontier.field_EE1[1][0] = EOS;
}
-void WarpToTruck(void)
+static void WarpToTruck(void)
{
Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck
warp_in();
@@ -148,7 +149,7 @@ void sub_808447C(void)
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
ResetBagScrollPositions();
- sub_813624C();
+ ResetPokeblockScrollPositions();
}
void NewGameInitData(void)
@@ -161,7 +162,7 @@ void NewGameInitData(void)
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
ResetPokedex();
- sub_8084400();
+ ClearFrontierRecord();
ClearSav1();
ClearMailData();
gSaveBlock2Ptr->specialSaveWarp = 0;
@@ -179,7 +180,7 @@ void NewGameInitData(void)
ResetLinkContestBoolean();
ResetGameStats();
ClearAllContestWinnerPics();
- InitLinkBattleRecords();
+ ClearPlayerLinkBattleRecords();
InitSeedotSizeRecord();
InitLotadSizeRecord();
gPlayerPartyCount = 0;
@@ -211,7 +212,7 @@ void NewGameInitData(void)
ResetContestLinkResults();
}
-void ResetMiniGamesResults(void)
+static void ResetMiniGamesResults(void)
{
CpuFill16(0, &gSaveBlock2Ptr->berryCrush, sizeof(struct BerryCrush));
SetBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, 0);
diff --git a/src/option_menu.c b/src/option_menu.c
new file mode 100644
index 000000000..fc0c0c24e
--- /dev/null
+++ b/src/option_menu.c
@@ -0,0 +1,645 @@
+#include "global.h"
+#include "option_menu.h"
+#include "main.h"
+#include "menu.h"
+#include "scanline_effect.h"
+#include "palette.h"
+#include "sprite.h"
+#include "task.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "window.h"
+#include "text.h"
+#include "text_window.h"
+#include "international_string_util.h"
+#include "strings.h"
+
+extern void SetPokemonCryStereo(u32 val);
+
+// Task data
+enum
+{
+ TD_MENUSELECTION,
+ TD_TEXTSPEED,
+ TD_BATTLESCENE,
+ TD_BATTLESTYLE,
+ TD_SOUND,
+ TD_BUTTONMODE,
+ TD_FRAMETYPE,
+};
+
+// Menu items
+enum
+{
+ MENUITEM_TEXTSPEED,
+ MENUITEM_BATTLESCENE,
+ MENUITEM_BATTLESTYLE,
+ MENUITEM_SOUND,
+ MENUITEM_BUTTONMODE,
+ MENUITEM_FRAMETYPE,
+ MENUITEM_CANCEL,
+ MENUITEM_COUNT,
+};
+
+// Window Ids
+enum
+{
+ WIN_TEXT_OPTION,
+ WIN_OPTIONS
+};
+
+// this file's functions
+static void Task_OptionMenuFadeIn(u8 taskId);
+static void Task_OptionMenuProcessInput(u8 taskId);
+static void Task_OptionMenuSave(u8 taskId);
+static void Task_OptionMenuFadeOut(u8 taskId);
+static void HighlightOptionMenuItem(u8 selection);
+static u8 TextSpeed_ProcessInput(u8 selection);
+static void TextSpeed_DrawChoices(u8 selection);
+static u8 BattleScene_ProcessInput(u8 selection);
+static void BattleScene_DrawChoices(u8 selection);
+static u8 BattleStyle_ProcessInput(u8 selection);
+static void BattleStyle_DrawChoices(u8 selection);
+static u8 Sound_ProcessInput(u8 selection);
+static void Sound_DrawChoices(u8 selection);
+static u8 FrameType_ProcessInput(u8 selection);
+static void FrameType_DrawChoices(u8 selection);
+static u8 ButtonMode_ProcessInput(u8 selection);
+static void ButtonMode_DrawChoices(u8 selection);
+static void DrawTextOption(void);
+static void DrawOptionMenuTexts(void);
+static void sub_80BB154(void);
+
+// EWRAM vars
+EWRAM_DATA static bool8 sArrowPressed = FALSE;
+
+// const rom data
+static const u16 sUnknown_0855C604[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal");
+// note: this is only used in the Japanese release
+static const u8 sEqualSignGfx[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp");
+
+static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] =
+{
+ gText_TextSpeed,
+ gText_BattleScene,
+ gText_BattleStyle,
+ gText_Sound,
+ gText_ButtonMode,
+ gText_Frame,
+ gText_OptionMenuCancel,
+};
+
+static const struct WindowTemplate sOptionMenuWinTemplates[] =
+{
+ {1, 2, 1, 0x1A, 2, 1, 2},
+ {0, 2, 5, 0x1A, 0xE, 1, 0x36},
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct BgTemplate sOptionMenuBgTemplates[] =
+{
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 0,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ }
+};
+
+static const u16 sUnknown_0855C6A0[] = {0x7E51};
+
+// code
+static void MainCB2(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_InitOptionMenu(void)
+{
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ SetVBlankCallback(NULL);
+ gMain.state++;
+ break;
+ case 1:
+ DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000);
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sOptionMenuBgTemplates, ARRAY_COUNT(sOptionMenuBgTemplates));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ InitWindows(sOptionMenuWinTemplates);
+ DeactivateAllTextPrinters();
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 1);
+ SetGpuReg(REG_OFFSET_WINOUT, 35);
+ SetGpuReg(REG_OFFSET_BLDCNT, 193);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 4);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 3:
+ LoadBgTiles(1, GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1A2);
+ gMain.state++;
+ break;
+ case 4:
+ LoadPalette(sUnknown_0855C6A0, 0, sizeof(sUnknown_0855C6A0));
+ LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, 0x70, 0x20);
+ gMain.state++;
+ break;
+ case 5:
+ LoadPalette(sUnknown_0855C604, 0x10, sizeof(sUnknown_0855C604));
+ gMain.state++;
+ break;
+ case 6:
+ PutWindowTilemap(0);
+ DrawTextOption();
+ gMain.state++;
+ break;
+ case 7:
+ gMain.state++;
+ break;
+ case 8:
+ PutWindowTilemap(1);
+ DrawOptionMenuTexts();
+ gMain.state++;
+ case 9:
+ sub_80BB154();
+ gMain.state++;
+ break;
+ case 10:
+ {
+ u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0);
+
+ gTasks[taskId].data[TD_MENUSELECTION] = 0;
+ gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed;
+ gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2Ptr->optionsBattleSceneOff;
+ gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle;
+ gTasks[taskId].data[TD_SOUND] = gSaveBlock2Ptr->optionsSound;
+ gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode;
+ gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType;
+
+ 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]);
+ HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+
+ CopyWindowToVram(WIN_OPTIONS, 3);
+ gMain.state++;
+ break;
+ }
+ case 11:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ SetVBlankCallback(VBlankCB);
+ SetMainCallback2(MainCB2);
+ return;
+ }
+}
+
+static void Task_OptionMenuFadeIn(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ gTasks[taskId].func = Task_OptionMenuProcessInput;
+}
+
+static void Task_OptionMenuProcessInput(u8 taskId)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL)
+ gTasks[taskId].func = Task_OptionMenuSave;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ gTasks[taskId].func = Task_OptionMenuSave;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ 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)
+ {
+ if (gTasks[taskId].data[TD_MENUSELECTION] <= 5)
+ gTasks[taskId].data[TD_MENUSELECTION]++;
+ else
+ gTasks[taskId].data[TD_MENUSELECTION] = 0;
+ HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ }
+ else
+ {
+ u8 previousOption;
+
+ switch (gTasks[taskId].data[TD_MENUSELECTION])
+ {
+ case MENUITEM_TEXTSPEED:
+ previousOption = gTasks[taskId].data[TD_TEXTSPEED];
+ gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
+
+ if (previousOption != gTasks[taskId].data[TD_TEXTSPEED])
+ TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
+ break;
+ case MENUITEM_BATTLESCENE:
+ previousOption = gTasks[taskId].data[TD_BATTLESCENE];
+ gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]);
+
+ if (previousOption != gTasks[taskId].data[TD_BATTLESCENE])
+ BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
+ break;
+ case MENUITEM_BATTLESTYLE:
+ previousOption = gTasks[taskId].data[TD_BATTLESTYLE];
+ gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]);
+
+ if (previousOption != gTasks[taskId].data[TD_BATTLESTYLE])
+ BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
+ break;
+ case MENUITEM_SOUND:
+ previousOption = gTasks[taskId].data[TD_SOUND];
+ gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]);
+
+ if (previousOption != gTasks[taskId].data[TD_SOUND])
+ Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
+ break;
+ case MENUITEM_BUTTONMODE:
+ previousOption = gTasks[taskId].data[TD_BUTTONMODE];
+ gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]);
+
+ if (previousOption != gTasks[taskId].data[TD_BUTTONMODE])
+ ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
+ break;
+ case MENUITEM_FRAMETYPE:
+ previousOption = gTasks[taskId].data[TD_FRAMETYPE];
+ gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]);
+
+ if (previousOption != gTasks[taskId].data[TD_FRAMETYPE])
+ FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
+ break;
+ default:
+ return;
+ }
+
+ if (sArrowPressed)
+ {
+ sArrowPressed = FALSE;
+ CopyWindowToVram(WIN_OPTIONS, 2);
+ }
+ }
+}
+
+static void Task_OptionMenuSave(u8 taskId)
+{
+ gSaveBlock2Ptr->optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED];
+ gSaveBlock2Ptr->optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE];
+ gSaveBlock2Ptr->optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE];
+ gSaveBlock2Ptr->optionsSound = gTasks[taskId].data[TD_SOUND];
+ gSaveBlock2Ptr->optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE];
+ gSaveBlock2Ptr->optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE];
+
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_OptionMenuFadeOut;
+}
+
+static void Task_OptionMenuFadeOut(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ FreeAllWindowBuffers();
+ SetMainCallback2(gMain.savedCallback);
+ }
+}
+
+static void HighlightOptionMenuItem(u8 index)
+{
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(16, 224));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(index * 16 + 40, index * 16 + 56));
+}
+
+static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style)
+{
+ u8 dst[16];
+ u16 i;
+
+ for (i = 0; *text != EOS && i <= 14; i++)
+ dst[i] = *(text++);
+
+ if (style != 0)
+ {
+ dst[2] = 4;
+ dst[5] = 5;
+ }
+
+ dst[i] = EOS;
+ PrintTextOnWindow(WIN_OPTIONS, 1, dst, x, y + 1, TEXT_SPEED_FF, NULL);
+}
+
+static u8 TextSpeed_ProcessInput(u8 selection)
+{
+ if (gMain.newKeys & DPAD_RIGHT)
+ {
+ if (selection <= 1)
+ selection++;
+ else
+ selection = 0;
+
+ sArrowPressed = TRUE;
+ }
+ if (gMain.newKeys & DPAD_LEFT)
+ {
+ if (selection != 0)
+ selection--;
+ else
+ selection = 2;
+
+ sArrowPressed = TRUE;
+ }
+ return selection;
+}
+
+static void TextSpeed_DrawChoices(u8 selection)
+{
+ u8 styles[3];
+ s32 widthSlow, widthMid, widthFast, xMid;
+
+ styles[0] = 0;
+ styles[1] = 0;
+ styles[2] = 0;
+ styles[selection] = 1;
+
+ DrawOptionMenuChoice(gText_TextSpeedSlow, 104, 0, styles[0]);
+
+ widthSlow = GetStringWidth(1, gText_TextSpeedSlow, 0);
+ widthMid = GetStringWidth(1, gText_TextSpeedMid, 0);
+ widthFast = GetStringWidth(1, gText_TextSpeedFast, 0);
+
+ widthMid -= 94;
+ xMid = (widthSlow - widthMid - widthFast) / 2 + 104;
+ DrawOptionMenuChoice(gText_TextSpeedMid, xMid, 0, styles[1]);
+
+ DrawOptionMenuChoice(gText_TextSpeedFast, GetStringRightAlignXOffset(1, gText_TextSpeedFast, 198), 0, styles[2]);
+}
+
+static u8 BattleScene_ProcessInput(u8 selection)
+{
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
+ {
+ selection ^= 1;
+ sArrowPressed = TRUE;
+ }
+
+ return selection;
+}
+
+static void BattleScene_DrawChoices(u8 selection)
+{
+ u8 styles[2];
+
+ styles[0] = 0;
+ styles[1] = 0;
+ styles[selection] = 1;
+
+ DrawOptionMenuChoice(gText_BattleSceneOn, 104, 16, styles[0]);
+ DrawOptionMenuChoice(gText_BattleSceneOff, GetStringRightAlignXOffset(1, gText_BattleSceneOff, 198), 16, styles[1]);
+}
+
+static u8 BattleStyle_ProcessInput(u8 selection)
+{
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
+ {
+ selection ^= 1;
+ sArrowPressed = TRUE;
+ }
+
+ return selection;
+}
+
+static void BattleStyle_DrawChoices(u8 selection)
+{
+ u8 styles[2];
+
+ styles[0] = 0;
+ styles[1] = 0;
+ styles[selection] = 1;
+
+ DrawOptionMenuChoice(gText_BattleStyleShift, 104, 32, styles[0]);
+ DrawOptionMenuChoice(gText_BattleStyleSet, GetStringRightAlignXOffset(1, gText_BattleStyleSet, 198), 32, styles[1]);
+}
+
+static u8 Sound_ProcessInput(u8 selection)
+{
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
+ {
+ selection ^= 1;
+ SetPokemonCryStereo(selection);
+ sArrowPressed = TRUE;
+ }
+
+ return selection;
+}
+
+static void Sound_DrawChoices(u8 selection)
+{
+ u8 styles[2];
+
+ styles[0] = 0;
+ styles[1] = 0;
+ styles[selection] = 1;
+
+ DrawOptionMenuChoice(gText_SoundMono, 104, 48, styles[0]);
+ DrawOptionMenuChoice(gText_SoundStereo, GetStringRightAlignXOffset(1, gText_SoundStereo, 198), 48, styles[1]);
+}
+
+static u8 FrameType_ProcessInput(u8 selection)
+{
+ if (gMain.newKeys & DPAD_RIGHT)
+ {
+ if (selection < WINDOW_FRAMES_COUNT - 1)
+ selection++;
+ else
+ selection = 0;
+
+ LoadBgTiles(1, GetWindowFrameTilesPal(selection)->tiles, 0x120, 0x1A2);
+ LoadPalette(GetWindowFrameTilesPal(selection)->pal, 0x70, 0x20);
+ sArrowPressed = TRUE;
+ }
+ if (gMain.newKeys & DPAD_LEFT)
+ {
+ if (selection != 0)
+ selection--;
+ else
+ selection = WINDOW_FRAMES_COUNT - 1;
+
+ LoadBgTiles(1, GetWindowFrameTilesPal(selection)->tiles, 0x120, 0x1A2);
+ LoadPalette(GetWindowFrameTilesPal(selection)->pal, 0x70, 0x20);
+ sArrowPressed = TRUE;
+ }
+ return selection;
+}
+
+static void FrameType_DrawChoices(u8 selection)
+{
+ u8 text[16];
+ u8 n = selection + 1;
+ u16 i;
+
+ for (i = 0; gText_FrameTypeNumber[i] != EOS && i <= 5; i++)
+ text[i] = gText_FrameTypeNumber[i];
+
+ // Convert a number to decimal string
+ if (n / 10 != 0)
+ {
+ text[i] = n / 10 + CHAR_0;
+ i++;
+ text[i] = n % 10 + CHAR_0;
+ i++;
+ }
+ else
+ {
+ text[i] = n % 10 + CHAR_0;
+ i++;
+ text[i] = 0x77;
+ i++;
+ }
+
+ text[i] = EOS;
+
+ DrawOptionMenuChoice(gText_FrameType, 104, 80, 0);
+ DrawOptionMenuChoice(text, 128, 80, 1);
+}
+
+static u8 ButtonMode_ProcessInput(u8 selection)
+{
+ if (gMain.newKeys & DPAD_RIGHT)
+ {
+ if (selection <= 1)
+ selection++;
+ else
+ selection = 0;
+
+ sArrowPressed = TRUE;
+ }
+ if (gMain.newKeys & DPAD_LEFT)
+ {
+ if (selection != 0)
+ selection--;
+ else
+ selection = 2;
+
+ sArrowPressed = TRUE;
+ }
+ return selection;
+}
+
+static void ButtonMode_DrawChoices(u8 selection)
+{
+ s32 widthNormal, widthLR, widthLA, xLR;
+ u8 styles[3];
+
+ styles[0] = 0;
+ styles[1] = 0;
+ styles[2] = 0;
+ styles[selection] = 1;
+
+ DrawOptionMenuChoice(gText_ButtonTypeNormal, 104, 64, styles[0]);
+
+ widthNormal = GetStringWidth(1, gText_ButtonTypeNormal, 0);
+ widthLR = GetStringWidth(1, gText_ButtonTypeLR, 0);
+ widthLA = GetStringWidth(1, gText_ButtonTypeLEqualsA, 0);
+
+ widthLR -= 94;
+ xLR = (widthNormal - widthLR - widthLA) / 2 + 104;
+ DrawOptionMenuChoice(gText_ButtonTypeLR, xLR, 64, styles[1]);
+
+ DrawOptionMenuChoice(gText_ButtonTypeLEqualsA, GetStringRightAlignXOffset(1, gText_ButtonTypeLEqualsA, 198), 64, styles[2]);
+}
+
+static void DrawTextOption(void)
+{
+ FillWindowPixelBuffer(WIN_TEXT_OPTION, 0x11);
+ PrintTextOnWindow(WIN_TEXT_OPTION, 1, gText_Option, 8, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(WIN_TEXT_OPTION, 3);
+}
+
+static void DrawOptionMenuTexts(void)
+{
+ u8 i;
+
+ FillWindowPixelBuffer(WIN_OPTIONS, 0x11);
+ for (i = 0; i < MENUITEM_COUNT; i++)
+ {
+ PrintTextOnWindow(WIN_OPTIONS, 1, sOptionMenuItemsNames[i], 8, (i * 16) + 1, TEXT_SPEED_FF, NULL);
+ }
+ CopyWindowToVram(WIN_OPTIONS, 3);
+}
+
+static void sub_80BB154(void)
+{
+ // bg, tileNum, x, y, width, height, pal
+ FillBgTilemapBufferRect(1, 0x1A2, 1, 0, 1, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A3, 2, 0, 0x1B, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A4, 28, 0, 1, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A5, 1, 1, 1, 2, 7);
+ FillBgTilemapBufferRect(1, 0x1A7, 28, 1, 1, 2, 7);
+ FillBgTilemapBufferRect(1, 0x1A8, 1, 3, 1, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A9, 2, 3, 0x1B, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1AA, 28, 3, 1, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A2, 1, 4, 1, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A3, 2, 4, 0x1A, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A4, 28, 4, 1, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A5, 1, 5, 1, 0x12, 7);
+ FillBgTilemapBufferRect(1, 0x1A7, 28, 5, 1, 0x12, 7);
+ FillBgTilemapBufferRect(1, 0x1A8, 1, 19, 1, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1A9, 2, 19, 0x1A, 1, 7);
+ FillBgTilemapBufferRect(1, 0x1AA, 28, 19, 1, 1, 7);
+
+ CopyBgTilemapBufferToVram(1);
+}
diff --git a/src/overworld.c b/src/overworld.c
new file mode 100644
index 000000000..772f8a057
--- /dev/null
+++ b/src/overworld.c
@@ -0,0 +1,3180 @@
+#include "global.h"
+#include "overworld.h"
+#include "main.h"
+#include "battle_setup.h"
+#include "berry.h"
+// #include "cable_club.h"
+#include "clock.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "field_control_avatar.h"
+#include "field_effect.h"
+#include "field_fadetransition.h"
+#include "event_object_movement.h"
+#include "field_message_box.h"
+#include "field_player_avatar.h"
+#include "field_screen_effect.h"
+// #include "field_special_scene.h"
+#include "field_specials.h"
+#include "field_tasks.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+// #include "fldeff_flash.h"
+#include "heal_location.h"
+#include "link.h"
+#include "load_save.h"
+#include "main.h"
+#include "m4a.h"
+#include "constants/maps.h"
+#include "map_name_popup.h"
+#include "menu.h"
+#include "metatile_behavior.h"
+#include "new_game.h"
+#include "palette.h"
+#include "play_time.h"
+#include "random.h"
+#include "roamer.h"
+// #include "rotating_gate.h"
+#include "safari_zone.h"
+#include "save.h"
+#include "script.h"
+// #include "script_pokemon_80C4.h"
+#include "secret_base.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "start_menu.h"
+#include "task.h"
+// #include "tileset_anim.h"
+#include "time_events.h"
+#include "tv.h"
+#include "scanline_effect.h"
+#include "wild_encounter.h"
+#include "bg.h"
+#include "money.h"
+#include "save_location.h"
+#include "constants/abilities.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "link_rfu.h"
+#include "constants/map_types.h"
+
+// event scripts
+extern const u8 EventScript_WhiteOut[];
+extern const u8 EventScript_271862[];
+extern const u8 EventScript_277513[];
+extern const u8 EventScript_TradeRoom_TooBusyToNotice[];
+extern const u8 EventScript_TradeRoom_ReadTrainerCard1[];
+extern const u8 EventScript_TradeRoom_ReadTrainerCard2[];
+extern const u8 gUnknown_08277388[];
+extern const u8 gUnknown_082773A3[];
+extern const u8 gUnknown_082773BE[];
+extern const u8 gUnknown_082773D9[];
+extern const u8 gUnknown_0827741D[];
+extern const u8 gUnknown_08277432[];
+extern const u8 gUnknown_08277447[];
+extern const u8 gUnknown_0827745C[];
+extern const u8 gUnknown_08277374[];
+extern const u8 gUnknown_0827737E[];
+extern const u8 gUnknown_082773FF[];
+extern const u8 gUnknown_082773F5[];
+extern const u8 gUnknown_082774EF[];
+extern const u8 gUnknown_08277509[];
+
+// vars
+extern const struct MapLayout *const gMapLayouts[];
+extern const struct MapHeader *const *const gMapGroups[];
+extern const s32 gMaxFlashLevel;
+extern const u16 gUnknown_82EC7C4[];
+
+u16 gUnknown_03005DA8;
+MainCallback gFieldCallback;
+bool8 (*gFieldCallback2)(void);
+u8 gUnknown_03005DB4;
+u8 gFieldLinkPlayerCount;
+
+// functions
+extern void HealPlayerParty(void);
+extern void move_tilemap_camera_to_upper_left_corner(void);
+extern void cur_mapheader_run_tileset_funcs_after_some_cpuset(void);
+extern void DrawWholeMapView(void);
+extern void copy_map_tileset1_tileset2_to_vram(const struct MapLayout *);
+extern void apply_map_tileset1_tileset2_palette(const struct MapLayout *);
+extern void ResetCyclingRoadChallengeData(void);
+extern void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey);
+extern void mapheader_run_script_with_tag_x5(void);
+extern void ResetFieldTasksArgs(void);
+extern void sub_80A0A2C(void);
+extern void not_trainer_hill_battle_pyramid(void);
+extern void apply_map_tileset2_palette(const struct MapLayout *);
+extern void copy_map_tileset2_to_vram_2(const struct MapLayout *);
+extern void prev_quest_postbuffer_cursor_backup_reset(void);
+extern void ShowMapNamePopup(void);
+extern bool32 InTrainerHill(void);
+extern bool32 sub_808651C(void);
+extern bool8 sub_80AF6A4(void);
+extern bool8 sub_81A9E6C(void);
+extern bool8 sub_80E909C(void);
+extern void sub_81AA1D8(void);
+extern void c2_change_map(void);
+extern void sub_81D5DF8(void);
+extern void sub_80EB218(void);
+extern void sub_81BE72C(void);
+extern void sub_80AF3C8(void);
+extern void sub_81971F4(void);
+extern void sub_808B578(void);
+extern void sub_80AF314(void);
+extern void sub_80AF214(void);
+extern void sub_80AF188(void);
+extern void door_upload_tiles(void);
+extern void RotatingGate_InitPuzzleAndGraphics(void);
+extern void sub_80AF168(void);
+extern void sub_80AF3C8(void);
+extern void ExecuteTruckSequence(void);
+extern void sub_80A0A38(void);
+extern void trainer_hill_map_load_related(void);
+extern void sub_8087D74(void);
+extern void battle_pyramid_map_load_related(u8);
+extern void sub_80B00E8(u8);
+extern void sub_80E9238(u8);
+extern void sub_81A3908(void);
+extern void sub_81AA2F8(void);
+extern void sub_8195E10(void);
+extern void sub_80EDB44(void);
+extern void sub_81D64C0(void);
+extern void sub_81BE6AC(void);
+extern void sub_8098128(void);
+extern void copy_map_tileset1_to_vram(const struct MapLayout *);
+extern void copy_map_tileset2_to_vram(const struct MapLayout *);
+extern void FieldUpdateBgTilemapScroll(void);
+extern void TransferTilesetAnimsBuffer(void);
+extern bool32 sub_81D5F48(void);
+extern u8 GetCurrentTrainerHillMapId(void);
+extern bool8 warp0_in_pokecenter(void);
+extern void dp13_810BB8C(void);
+extern void FieldEffectActiveListClear(void);
+extern void SetUpFieldTasks(void);
+extern void sub_81BE6B8(void);
+extern void sub_80AAFA4(void);
+extern void ShowStartMenu(void);
+extern void sub_80AEE84(void);
+extern void mapldr_default(void);
+extern void npc_paltag_set_load(u8);
+extern void sub_8088B3C(u16, u16);
+extern bool32 sub_800F0B8(void);
+extern bool32 sub_8009F3C(void);
+extern void sub_8010198(void);
+extern u32 sub_800B4DC(void);
+extern bool32 sub_80B39D4(u8);
+extern const u8* sub_809C2C8(struct MapPosition *a1, u8, u8);
+extern u8 *sub_809D0F4(void*);
+extern u8 sub_808BD6C(u8);
+extern u8 sub_808BD7C(u8);
+extern void UpdateEventObjectSpriteVisibility(struct Sprite*, u8);
+
+// this file's functions
+static void Overworld_ResetStateAfterWhiteOut(void);
+static void c2_80567AC(void);
+static void CB2_LoadMap2(void);
+static void VBlankCB_Field(void);
+static void SpriteCB_LinkPlayer(struct Sprite *sprite);
+static void ChooseAmbientCrySpecies(void);
+static void do_load_map_stuff_loop(u8 *state);
+static bool32 map_loading_iteration_3(u8 *state);
+static bool32 sub_8086638(u8 *state);
+static bool32 load_map_stuff(u8 *state, u32);
+static bool32 map_loading_iteration_2_link(u8 *state);
+static void mli4_mapscripts_and_other(void);
+static void map_loading_lcd_reset(void);
+static u8 sub_8087858(u8);
+static u16 sub_80871C0(u32 a1);
+static void sub_80867C8(void);
+static void sub_80867D8(void);
+static void sub_8086AE4(void);
+static void sub_80869DC(void);
+static void sub_8086B14(void);
+static void sub_8086AAC(void);
+static void sub_8086988(bool32 arg0);
+static void sub_8086A80(void);
+static void sub_8086A68(void);
+static void sub_8086860(void);
+static void sub_8086AC8(void);
+static void sub_8086B9C(void);
+static void sub_8086C40(void);
+static void sub_8086C90(void);
+static void sub_8086FA0(u16);
+static void sub_8086F38(u16*, s32);
+static u8 npc_something3(u8 a1, u8 a2);
+static u8 LinkPlayerDetectCollision(u8 selfEventObjId, u8 a2, s16 x, s16 y);
+static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion);
+static void sub_8087878(u8 linkPlayerId, u16 *x, u16 *y);
+static u8 sub_80878A0(u8 linkPlayerId);
+static u8 sub_80878C0(u8 linkPlayerId);
+static s32 sub_80878E4(u8 linkPlayerId);
+static u8 GetLinkPlayerIdAt(s16 x, s16 y);
+static void sub_808796C(u8 linkPlayerId, u8 a2);
+static void ZeroEventObject(struct EventObject *eventObj);
+static void SpawnLinkPlayerEventObject(u8 linkPlayerId, s16 x, s16 y, u8 a4);
+static void InitLinkPlayerEventObjectPos(struct EventObject *eventObj, s16 x, s16 y);
+static void sub_80877DC(u8 linkPlayerId, u8 a2);
+static void sub_808780C(u8 linkPlayerId);
+static u8 sub_8087858(u8 linkPlayerId);
+static void sub_8087584(void);
+static u32 sub_8087690(void);
+static void ZeroLinkPlayerEventObject(struct LinkPlayerEventObject *linkPlayerEventObj);
+static const u8 *sub_80873B4(struct UnkStruct_8054FF8 *a1);
+static u16 sub_8087480(const u8 *script);
+static void sub_8087510(void);
+static void sub_808751C(void);
+static void sub_8087530(const u8 *script);
+static void sub_808754C(void);
+static void sub_8087568(const u8 *script);
+static void sub_80872D8(s32 linkPlayerId, s32 a2, struct UnkStruct_8054FF8 *a3);
+static bool32 sub_8087340(struct UnkStruct_8054FF8 *a1);
+static bool32 sub_8087358(struct UnkStruct_8054FF8 *a1);
+static u8 *sub_8087370(struct UnkStruct_8054FF8 *a1);
+static bool32 sub_8087388(struct UnkStruct_8054FF8 *a1);
+static const u8 *sub_80873B4(struct UnkStruct_8054FF8 *a1);
+static u16 sub_808711C(u32);
+static u16 sub_8087140(u32);
+static void sub_808709C(u16 *a1);
+static u16 sub_80870B0(u32 a1);
+static u16 sub_80870F8(u32 a1);
+static u16 sub_8087068(u16 a1);
+static void c1_link_related(void);
+static void c1_link_related_func_set(u16 (*func)(u32));
+static void SetFieldVBlankCallback(void);
+static void FieldClearVBlankHBlankCallbacks(void);
+static void sub_8085810(void);
+static u8 sub_808532C(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3);
+static u8 sub_808538C(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4);
+static u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void);
+
+// IWRAM bss vars
+IWRAM_DATA static void *sUnknown_03000E0C;
+IWRAM_DATA static u8 sUnknown_03000E10[4];
+IWRAM_DATA static u16 (*sUnknown_03000E14)(u32);
+IWRAM_DATA static u8 sUnknown_03000E18;
+IWRAM_DATA static u8 sUnknown_03000E19;
+IWRAM_DATA static u32 sUnusedVar;
+
+// EWRAM vars
+EWRAM_DATA static u8 sUnknown_020322D8 = 0;
+EWRAM_DATA struct WarpData gUnknown_020322DC = {0};
+EWRAM_DATA static struct WarpData sWarpDestination = {0}; // new warp position
+EWRAM_DATA static struct WarpData sUnknown_020322EC = {0};
+EWRAM_DATA static struct WarpData sUnknown_020322F4 = {0};
+EWRAM_DATA static u16 sLastMapSectionId = 0;
+EWRAM_DATA static struct UnkPlayerStruct sUnknown_02032300 = {0};
+EWRAM_DATA static u16 sAmbientCrySpecies = 0;
+EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE;
+EWRAM_DATA struct LinkPlayerEventObject gLinkPlayerEventObjects[4] = {0};
+
+// const rom data
+static const struct WarpData sDummyWarpData =
+{
+ .mapGroup = -1,
+ .mapNum = -1,
+ .warpId = -1,
+ .x = -1,
+ .y = -1,
+};
+
+static const u8 sUnusedData[] =
+{
+ 0xB0, 0x04, 0x00, 0x00,
+ 0x10, 0x0E, 0x00, 0x00,
+ 0xB0, 0x04, 0x00, 0x00,
+ 0x60, 0x09, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00,
+ 0x50, 0x00, 0x00, 0x00,
+ 0xD4, 0xFF, 0xFF, 0xFF,
+ 0x2C, 0x00, 0x00, 0x00,
+};
+
+const struct UCoords32 gUnknown_08339D64[] =
+{
+ { 0, 0},
+ { 0, 1},
+ { 0, -1},
+ {-1, 0},
+ { 1, 0},
+ {-1, 1},
+ { 1, 1},
+ {-1, -1},
+ { 1, -1},
+};
+
+static const struct BgTemplate gUnknown_08339DAC[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const struct ScanlineEffectParams gUnknown_08339DBC =
+{
+ (void *)REG_ADDR_WIN0H,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
+ 1,
+ 0,
+};
+
+static u8 sub_80879D8(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 sub_80879F8(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 sub_80879FC(struct LinkPlayerEventObject *, struct EventObject *, u8);
+
+static u8 (*const gUnknown_08339DC8[])(struct LinkPlayerEventObject *, struct EventObject *, u8) =
+{
+ sub_80879D8,
+ sub_80879F8,
+ sub_80879FC,
+};
+
+static u8 sub_8087A1C(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 sub_8087A20(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 sub_8087A88(struct LinkPlayerEventObject *, struct EventObject *, u8);
+
+static u8 (*const gUnknown_08339DD4[])(struct LinkPlayerEventObject *, struct EventObject *, u8) =
+{
+ sub_8087A1C,
+ sub_8087A20,
+ sub_8087A20,
+ sub_8087A20,
+ sub_8087A20,
+ sub_8087A1C,
+ sub_8087A1C,
+ sub_8087A88,
+ sub_8087A88,
+ sub_8087A88,
+ sub_8087A88,
+};
+
+static void sub_8087AA0(struct LinkPlayerEventObject *, struct EventObject *);
+static void sub_8087AA8(struct LinkPlayerEventObject *, struct EventObject *);
+
+static void (*const gUnknown_08339E00[])(struct LinkPlayerEventObject *, struct EventObject *) =
+{
+ sub_8087AA0,
+ sub_8087AA8,
+};
+
+// code
+void DoWhiteOut(void)
+{
+ ScriptContext2_RunNewScript(EventScript_WhiteOut);
+ SetMoney(&gSaveBlock1Ptr->money, GetMoney(&gSaveBlock1Ptr->money) / 2);
+ HealPlayerParty();
+ Overworld_ResetStateAfterWhiteOut();
+ Overworld_SetWarpDestToLastHealLoc();
+ warp_in();
+}
+
+void Overworld_ResetStateAfterFly(void)
+{
+ player_avatar_init_params_reset();
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
+}
+
+void Overworld_ResetStateAfterTeleport(void)
+{
+ player_avatar_init_params_reset();
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
+ ScriptContext2_RunNewScript(EventScript_271862);
+}
+
+void Overworld_ResetStateAfterDigEscRope(void)
+{
+ player_avatar_init_params_reset();
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
+}
+
+static void Overworld_ResetStateAfterWhiteOut(void)
+{
+ player_avatar_init_params_reset();
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
+ if (VarGet(VAR_0x4039) == 1)
+ {
+ VarSet(VAR_0x4039, 0);
+ VarSet(VAR_0x4037, 0);
+ }
+}
+
+static void sub_8084788(void)
+{
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ ChooseAmbientCrySpecies();
+ ResetCyclingRoadChallengeData();
+ UpdateLocationHistoryForRoamer();
+ RoamerMoveToOtherLocationSet();
+}
+
+void ResetGameStats(void)
+{
+ s32 i;
+
+ for (i = 0; i < NUM_GAME_STATS; i++)
+ SetGameStat(i, 0);
+}
+
+void IncrementGameStat(u8 index)
+{
+ if (index < NUM_USED_GAME_STATS)
+ {
+ u32 statVal = GetGameStat(index);
+ if (statVal < 0xFFFFFF)
+ statVal++;
+ else
+ statVal = 0xFFFFFF;
+
+ SetGameStat(index, statVal);
+ }
+}
+
+u32 GetGameStat(u8 index)
+{
+ if (index >= NUM_USED_GAME_STATS)
+ return 0;
+
+ return gSaveBlock1Ptr->gameStats[index] ^ gSaveBlock2Ptr->encryptionKey;
+}
+
+void SetGameStat(u8 index, u32 value)
+{
+ if (index < NUM_USED_GAME_STATS)
+ gSaveBlock1Ptr->gameStats[index] = value ^ gSaveBlock2Ptr->encryptionKey;
+}
+
+void ApplyNewEncryptionKeyToGameStats(u32 newKey)
+{
+ u8 i;
+
+ for (i = 0; i < NUM_GAME_STATS; i++)
+ ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->gameStats[i], newKey);
+}
+
+void LoadEventObjTemplatesFromHeader(void)
+{
+ // Clear map object templates
+ CpuFill32(0, gSaveBlock1Ptr->eventObjectTemplates, sizeof(gSaveBlock1Ptr->eventObjectTemplates));
+
+ // Copy map header events to save block
+ CpuCopy32(gMapHeader.events->eventObjects,
+ gSaveBlock1Ptr->eventObjectTemplates,
+ gMapHeader.events->eventObjectCount * sizeof(struct EventObjectTemplate));
+}
+
+void LoadSaveblockEventObjScripts(void)
+{
+ struct EventObjectTemplate *mapHeaderObjTemplates = gMapHeader.events->eventObjects;
+ struct EventObjectTemplate *savObjTemplates = gSaveBlock1Ptr->eventObjectTemplates;
+ s32 i;
+
+ for (i = 0; i < 64; i++)
+ savObjTemplates[i].script = mapHeaderObjTemplates[i].script;
+}
+
+void Overworld_SetEventObjTemplateCoords(u8 localId, s16 x, s16 y)
+{
+ s32 i;
+ struct EventObjectTemplate *savObjTemplates = gSaveBlock1Ptr->eventObjectTemplates;
+
+ for (i = 0; i < 64; i++)
+ {
+ struct EventObjectTemplate *eventObjectTemplate = &savObjTemplates[i];
+ if (eventObjectTemplate->localId == localId)
+ {
+ eventObjectTemplate->x = x;
+ eventObjectTemplate->y = y;
+ return;
+ }
+ }
+}
+
+void Overworld_SetEventObjTemplateMovementType(u8 localId, u8 movementType)
+{
+ s32 i;
+
+ struct EventObjectTemplate *savObjTemplates = gSaveBlock1Ptr->eventObjectTemplates;
+ for (i = 0; i < 64; i++)
+ {
+ struct EventObjectTemplate *eventObjectTemplate = &savObjTemplates[i];
+ if (eventObjectTemplate->localId == localId)
+ {
+ eventObjectTemplate->movementType = movementType;
+ return;
+ }
+ }
+}
+
+static void mapdata_load_assets_to_gpu_and_full_redraw(void)
+{
+ move_tilemap_camera_to_upper_left_corner();
+ copy_map_tileset1_tileset2_to_vram(gMapHeader.mapLayout);
+ apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout);
+ DrawWholeMapView();
+ cur_mapheader_run_tileset_funcs_after_some_cpuset();
+}
+
+const struct MapLayout *GetMapLayout(void)
+{
+ u16 mapLayoutId = gSaveBlock1Ptr->mapLayoutId;
+ if (mapLayoutId)
+ return gMapLayouts[mapLayoutId - 1];
+ return NULL;
+}
+
+void ApplyCurrentWarp(void)
+{
+ gUnknown_020322DC = gSaveBlock1Ptr->location;
+ gSaveBlock1Ptr->location = sWarpDestination;
+ sUnknown_020322EC = sDummyWarpData;
+ sUnknown_020322F4 = sDummyWarpData;
+}
+
+void set_warp2_warp3_to_neg_1(void)
+{
+ sUnknown_020322EC = sDummyWarpData;
+ sUnknown_020322F4 = sDummyWarpData;
+}
+
+void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+{
+ warp->mapGroup = mapGroup;
+ warp->mapNum = mapNum;
+ warp->warpId = warpId;
+ warp->x = x;
+ warp->y = y;
+}
+
+bool32 warp_data_is_not_neg_1(struct WarpData *warp)
+{
+ if (warp->mapGroup != -1)
+ return FALSE;
+ else if (warp->mapNum != -1)
+ return FALSE;
+ else if (warp->warpId != -1)
+ return FALSE;
+ else if (warp->x != -1)
+ return FALSE;
+ else if (warp->y != -1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+struct MapHeader const *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum)
+{
+ return gMapGroups[mapGroup][mapNum];
+}
+
+struct MapHeader const *const warp1_get_mapheader(void)
+{
+ return Overworld_GetMapHeaderByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum);
+}
+
+void set_current_map_header_from_sav1_save_old_name(void)
+{
+ sLastMapSectionId = gMapHeader.regionMapSectionId;
+ gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);
+ gSaveBlock1Ptr->mapLayoutId = gMapHeader.mapLayoutId;
+ gMapHeader.mapLayout = GetMapLayout();
+}
+
+void LoadSaveblockMapHeader(void)
+{
+ gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);
+ gMapHeader.mapLayout = GetMapLayout();
+}
+
+void update_camera_pos_from_warpid(void)
+{
+ if (gSaveBlock1Ptr->location.warpId >= 0 && gSaveBlock1Ptr->location.warpId < gMapHeader.events->warpCount)
+ {
+ gSaveBlock1Ptr->pos.x = gMapHeader.events->warps[gSaveBlock1Ptr->location.warpId].x;
+ gSaveBlock1Ptr->pos.y = gMapHeader.events->warps[gSaveBlock1Ptr->location.warpId].y;
+ }
+ else if (gSaveBlock1Ptr->location.x >= 0 && gSaveBlock1Ptr->location.y >= 0)
+ {
+ gSaveBlock1Ptr->pos.x = gSaveBlock1Ptr->location.x;
+ gSaveBlock1Ptr->pos.y = gSaveBlock1Ptr->location.y;
+ }
+ else
+ {
+ gSaveBlock1Ptr->pos.x = gMapHeader.mapLayout->width / 2;
+ gSaveBlock1Ptr->pos.y = gMapHeader.mapLayout->height / 2;
+ }
+}
+
+void warp_in(void)
+{
+ ApplyCurrentWarp();
+ set_current_map_header_from_sav1_save_old_name();
+ update_camera_pos_from_warpid();
+}
+
+void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+{
+ SetWarpData(&sWarpDestination, mapGroup, mapNum, warpId, x, y);
+}
+
+void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId)
+{
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, -1, -1);
+}
+
+void saved_warp2_set(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId)
+{
+ SetWarpData(&gSaveBlock1Ptr->warp2, mapGroup, mapNum, warpId, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y);
+}
+
+void saved_warp2_set_2(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+{
+ SetWarpData(&gSaveBlock1Ptr->warp2, mapGroup, mapNum, warpId, x, y);
+}
+
+void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused)
+{
+ sWarpDestination = gSaveBlock1Ptr->warp2;
+}
+
+void sub_8084CCC(u8 a1)
+{
+ const struct HealLocation *warp = GetHealLocationPointer(a1);
+
+ if (warp)
+ Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y);
+}
+
+void Overworld_SetWarpDestToLastHealLoc(void)
+{
+ sWarpDestination = gSaveBlock1Ptr->lastHealLocation;
+}
+
+void Overworld_SetHealLocationWarp(u8 healLocationId)
+{
+ const struct HealLocation *healLocation = GetHealLocationPointer(healLocationId);
+
+ if (healLocation != NULL)
+ SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y);
+}
+
+void sub_8084D5C(s16 a1, s16 a2)
+{
+ u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation();
+ u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum);
+ if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE)
+ sub_8084DD4(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, a1 - 7, a2 - 6);
+}
+
+void sub_8084DD4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+{
+ SetWarpData(&gSaveBlock1Ptr->warp4, mapGroup, mapNum, warpId, x, y);
+}
+
+void sub_8084E14(void)
+{
+ sWarpDestination = gSaveBlock1Ptr->warp4;
+}
+
+void sub_8084E2C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+{
+ SetWarpData(&sUnknown_020322EC, mapGroup, mapNum, warpId, x, y);
+}
+
+void warp1_set_to_warp2(void)
+{
+ sWarpDestination = sUnknown_020322EC;
+}
+
+void sub_8084E80(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+{
+ SetWarpData(&sUnknown_020322F4, mapGroup, mapNum, warpId, x, y);
+}
+
+void sub_8084EBC(s16 x, s16 y)
+{
+ if (warp_data_is_not_neg_1(&sUnknown_020322F4) == TRUE)
+ sWarpDestination = gUnknown_020322DC;
+ else
+ Overworld_SetWarpDestination(sUnknown_020322F4.mapGroup, sUnknown_020322F4.mapNum, -1, x, y);
+}
+
+void warp1_set_to_sav1w(void)
+{
+ sWarpDestination = gSaveBlock1Ptr->warp1;
+}
+
+void sub_8084F2C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+{
+ SetWarpData(&gSaveBlock1Ptr->warp1, mapGroup, mapNum, warpId, x, y);
+}
+
+void sub_8084F6C(u8 a1)
+{
+ const struct HealLocation *warp = GetHealLocationPointer(a1);
+ if (warp)
+ SetWarpData(&gSaveBlock1Ptr->warp1, warp->group, warp->map, -1, warp->x, warp->y);
+}
+
+void sub_8084FAC(void)
+{
+ gSaveBlock1Ptr->warp1 = gSaveBlock1Ptr->warp2;
+}
+
+const struct MapConnection *GetMapConnection(u8 dir)
+{
+ s32 i;
+ s32 count = gMapHeader.connections->count;
+ const struct MapConnection *connection = gMapHeader.connections->connections;
+
+ if (connection == NULL)
+ return NULL;
+
+ for(i = 0; i < count; i++, connection++)
+ if (connection->direction == dir)
+ return connection;
+
+ return NULL;
+}
+
+bool8 sub_8084FF8(u8 dir, u16 x, u16 y)
+{
+ const struct MapConnection *connection = GetMapConnection(dir);
+
+ if (connection != NULL)
+ {
+ Overworld_SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y);
+ }
+ else
+ {
+ mapheader_run_script_with_tag_x6();
+ if (warp_data_is_not_neg_1(&sUnknown_020322EC))
+ return FALSE;
+ warp1_set_to_warp2();
+ }
+ return TRUE;
+}
+
+bool8 sub_8085058(u16 x, u16 y)
+{
+ return sub_8084FF8(CONNECTION_EMERGE, x, y);
+}
+
+bool8 sub_8085078(u16 x, u16 y)
+{
+ return sub_8084FF8(CONNECTION_DIVE, x, y);
+}
+
+void mliX_load_map(u8 mapGroup, u8 mapNum)
+{
+ s32 paletteIndex;
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1);
+ if (gMapHeader.regionMapSectionId != 0x3A)
+ sub_8085810();
+
+ ApplyCurrentWarp();
+ set_current_map_header_from_sav1_save_old_name();
+ LoadEventObjTemplatesFromHeader();
+ TrySetMapSaveWarpStatus();
+ ClearTempFieldEventData();
+ ResetCyclingRoadChallengeData();
+ prev_quest_postbuffer_cursor_backup_reset();
+ TryUpdateRandomTrainerRematches(mapGroup, mapNum);
+ DoTimeBasedEvents();
+ SetSav1WeatherFromCurrMapHeader();
+ ChooseAmbientCrySpecies();
+ SetDefaultFlashLevel();
+ Overworld_ClearSavedMusic();
+ mapheader_run_script_with_tag_x3();
+ not_trainer_hill_battle_pyramid();
+ copy_map_tileset2_to_vram_2(gMapHeader.mapLayout);
+ apply_map_tileset2_palette(gMapHeader.mapLayout);
+
+ for (paletteIndex = 6; paletteIndex < 13; paletteIndex++)
+ ApplyWeatherGammaShiftToPal(paletteIndex);
+
+ sub_80A0A2C();
+ UpdateLocationHistoryForRoamer();
+ RoamerMove();
+ DoCurrentWeather();
+ ResetFieldTasksArgs();
+ mapheader_run_script_with_tag_x5();
+
+ if (gMapHeader.regionMapSectionId != 0x3A || gMapHeader.regionMapSectionId != sLastMapSectionId)
+ ShowMapNamePopup();
+}
+
+static void mli0_load_map(u32 a1)
+{
+ bool8 v2;
+ bool8 indoors;
+
+ set_current_map_header_from_sav1_save_old_name();
+ if (!(sUnknown_020322D8 & 1))
+ {
+ if (gMapHeader.mapLayoutId == 0x169)
+ sub_81AA1D8();
+ else if (InTrainerHill())
+ sub_81D5DF8();
+ else
+ LoadEventObjTemplatesFromHeader();
+ }
+
+ v2 = is_map_type_1_2_3_5_or_6(gMapHeader.mapType);
+ indoors = Overworld_MapTypeIsIndoors(gMapHeader.mapType);
+
+ sub_80EB218();
+ TrySetMapSaveWarpStatus();
+ ClearTempFieldEventData();
+ ResetCyclingRoadChallengeData();
+ prev_quest_postbuffer_cursor_backup_reset();
+ TryUpdateRandomTrainerRematches(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);
+ if (a1 != 1)
+ DoTimeBasedEvents();
+ SetSav1WeatherFromCurrMapHeader();
+ ChooseAmbientCrySpecies();
+ if (v2)
+ FlagClear(FLAG_SYS_USE_FLASH);
+ SetDefaultFlashLevel();
+ Overworld_ClearSavedMusic();
+ mapheader_run_script_with_tag_x3();
+ UpdateLocationHistoryForRoamer();
+ RoamerMoveToOtherLocationSet();
+ if (gMapHeader.mapLayoutId == 0x169)
+ battle_pyramid_map_load_related(0);
+ else if (InTrainerHill())
+ trainer_hill_map_load_related();
+ else
+ not_trainer_hill_battle_pyramid();
+
+ if (a1 != 1 && indoors)
+ {
+ UpdateTVScreensOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height);
+ sub_80E9238(1);
+ }
+}
+
+void player_avatar_init_params_reset(void)
+{
+ sUnknown_02032300.player_field_1 = 1;
+ sUnknown_02032300.player_field_0 = 1;
+}
+
+void walkrun_find_lowest_active_bit_in_bitfield(void)
+{
+ sUnknown_02032300.player_field_1 = GetPlayerFacingDirection();
+
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE))
+ sUnknown_02032300.player_field_0 = 2;
+ else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ sUnknown_02032300.player_field_0 = 4;
+ else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ sUnknown_02032300.player_field_0 = 8;
+ else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4))
+ sUnknown_02032300.player_field_0 = 16;
+ else
+ sUnknown_02032300.player_field_0 = 1;
+}
+
+static struct UnkPlayerStruct *sub_80852D4(void)
+{
+ struct UnkPlayerStruct playerStruct;
+ u8 mapType = Overworld_GetMapTypeOfSaveblockLocation();
+ u16 v2 = cur_mapdata_block_role_at_screen_center_acc_to_sav1();
+ u8 v4 = sub_808532C(&sUnknown_02032300, v2, mapType);
+ playerStruct.player_field_0 = v4;
+ playerStruct.player_field_1 = sub_808538C(&sUnknown_02032300, v4, v2, mapType);
+ sUnknown_02032300 = playerStruct;
+ return &sUnknown_02032300;
+}
+
+static u8 sub_808532C(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3)
+{
+ if (a3 != 8 && FlagGet(FLAG_SYS_CRUISE_MODE))
+ return 1;
+ else if (a3 == 5)
+ return 16;
+ else if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1)
+ return 8;
+ else if (Overworld_IsBikingAllowed() != TRUE)
+ return 1;
+ else if (playerStruct->player_field_0 == 2)
+ return 2;
+ else if (playerStruct->player_field_0 != 4)
+ return 1;
+ else
+ return 4;
+}
+
+static u8 sub_808538C(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4)
+{
+ if (FlagGet(FLAG_SYS_CRUISE_MODE) && a4 == 6)
+ return 4;
+ else if (MetatileBehavior_IsDeepSouthWarp(a3) == TRUE)
+ return 2;
+ else if (MetatileBehavior_IsNonAnimDoor(a3) == TRUE || MetatileBehavior_IsDoor(a3) == TRUE)
+ return 1;
+ else if (MetatileBehavior_IsSouthArrowWarp(a3) == TRUE)
+ return 2;
+ else if (MetatileBehavior_IsNorthArrowWarp(a3) == TRUE)
+ return 1;
+ else if (MetatileBehavior_IsWestArrowWarp(a3) == TRUE)
+ return 4;
+ else if (MetatileBehavior_IsEastArrowWarp(a3) == TRUE)
+ return 3;
+ else if ((playerStruct->player_field_0 == 16 && a2 == 8)
+ || (playerStruct->player_field_0 == 8 && a2 == 16))
+ return playerStruct->player_field_1;
+ else if (MetatileBehavior_IsLadder(a3) == TRUE)
+ return playerStruct->player_field_1;
+ else
+ return 1;
+}
+
+static u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void)
+{
+ return MapGridGetMetatileBehaviorAt(gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7);
+}
+
+bool32 Overworld_IsBikingAllowed(void)
+{
+ if (!(gMapHeader.flags & 1))
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void SetDefaultFlashLevel(void)
+{
+ if (!gMapHeader.cave)
+ gSaveBlock1Ptr->flashLevel = 0;
+ else if (FlagGet(FLAG_SYS_USE_FLASH))
+ gSaveBlock1Ptr->flashLevel = 1;
+ else
+ gSaveBlock1Ptr->flashLevel = gMaxFlashLevel - 1;
+}
+
+void Overworld_SetFlashLevel(s32 flashLevel)
+{
+ if (flashLevel < 0 || flashLevel > gMaxFlashLevel)
+ flashLevel = 0;
+ gSaveBlock1Ptr->flashLevel = flashLevel;
+}
+
+u8 Overworld_GetFlashLevel(void)
+{
+ return gSaveBlock1Ptr->flashLevel;
+}
+
+void sub_8085524(u16 mapLayoutId)
+{
+ gSaveBlock1Ptr->mapLayoutId = mapLayoutId;
+ gMapHeader.mapLayout = GetMapLayout();
+}
+
+void sub_8085540(u8 var)
+{
+ sUnknown_020322D8 = var;
+}
+
+u8 sub_808554C(void)
+{
+ return sUnknown_020322D8;
+}
+
+static bool16 ShouldLegendaryMusicPlayAtLocation(struct WarpData *warp)
+{
+ if (!FlagGet(FLAG_SYS_WEATHER_CTRL))
+ return FALSE;
+ if (warp->mapGroup == 0)
+ {
+ switch (warp->mapNum)
+ {
+ case MAP_NUM(LILYCOVE_CITY):
+ case MAP_NUM(MOSSDEEP_CITY):
+ case MAP_NUM(SOOTOPOLIS_CITY):
+ case MAP_NUM(EVER_GRANDE_CITY):
+ case MAP_NUM(ROUTE124):
+ case MAP_NUM(ROUTE125):
+ case MAP_NUM(ROUTE126):
+ case MAP_NUM(ROUTE127):
+ case MAP_NUM(ROUTE128):
+ return TRUE;
+ default:
+ if (VarGet(VAR_0x405E) < 4)
+ return FALSE;
+ switch (warp->mapNum)
+ {
+ case MAP_NUM(ROUTE129):
+ case MAP_NUM(ROUTE130):
+ case MAP_NUM(ROUTE131):
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool16 NoMusicInSotopolisWithLegendaries(struct WarpData *warp)
+{
+ if (VarGet(VAR_0x40CA) != 1)
+ return FALSE;
+ else if (warp->mapGroup != MAP_GROUP(SOOTOPOLIS_CITY))
+ return FALSE;
+ else if (warp->mapNum == MAP_NUM(SOOTOPOLIS_CITY))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool16 IsInfiltratedWeatherInstitute(struct WarpData *warp)
+{
+ if (VarGet(VAR_WEATHER_INSTITUTE_STATE))
+ return FALSE;
+ else if (warp->mapGroup != MAP_GROUP(ROUTE119_WEATHER_INSTITUTE_1F))
+ return FALSE;
+ else if (warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_1F)
+ || warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_2F))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool16 IsInflitratedSpaceCenter(struct WarpData *warp)
+{
+ if (VarGet(VAR_0x405D) == 0)
+ return FALSE;
+ else if (VarGet(VAR_0x405D) > 2)
+ return FALSE;
+ else if (warp->mapGroup != MAP_GROUP(MOSSDEEP_CITY_SPACE_CENTER_1F))
+ return FALSE;
+ else if (warp->mapNum == MAP_NUM(MOSSDEEP_CITY_SPACE_CENTER_1F)
+ || warp->mapNum == MAP_NUM(MOSSDEEP_CITY_SPACE_CENTER_2F))
+ return TRUE;
+ return FALSE;
+}
+
+u16 GetLocationMusic(struct WarpData *warp)
+{
+ if (NoMusicInSotopolisWithLegendaries(warp) == TRUE)
+ return 0xFFFF;
+ else if (ShouldLegendaryMusicPlayAtLocation(warp) == TRUE)
+ return MUS_OOAME;
+ else if (IsInflitratedSpaceCenter(warp) == TRUE)
+ return MUS_MGM0;
+ else if (IsInfiltratedWeatherInstitute(warp) == TRUE)
+ return MUS_TOZAN;
+ else
+ return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music;
+}
+
+u16 GetCurrLocationDefaultMusic(void)
+{
+ u16 music;
+
+ // Play the desert music only when the sandstorm is active on Route 111.
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE111)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE111)
+ && GetSav1Weather() == 8)
+ return MUS_ASHROAD;
+
+ music = GetLocationMusic(&gSaveBlock1Ptr->location);
+ if (music != 0x7FFF)
+ {
+ return music;
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->pos.x < 24)
+ return MUS_DOORO_X1;
+ else
+ return MUS_GRANROAD;
+ }
+}
+
+u16 GetWarpDestinationMusic(void)
+{
+ u16 music = GetLocationMusic(&sWarpDestination);
+ if (music != 0x7FFF)
+ {
+ return music;
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAUVILLE_CITY)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAUVILLE_CITY))
+ return MUS_DOORO_X1;
+ else
+ return MUS_GRANROAD;
+ }
+}
+
+void Overworld_ResetMapMusic(void)
+{
+ ResetMapMusic();
+}
+
+void Overworld_PlaySpecialMapMusic(void)
+{
+ u16 music = GetCurrLocationDefaultMusic();
+
+ if (music != MUS_OOAME && music != 0xFFFF)
+ {
+ if (gSaveBlock1Ptr->savedMusic)
+ music = gSaveBlock1Ptr->savedMusic;
+ else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER)
+ music = MUS_DEEPDEEP;
+ else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ music = MUS_NAMINORI;
+ }
+
+ if (music != GetCurrentMapMusic())
+ PlayNewMapMusic(music);
+}
+
+void Overworld_SetSavedMusic(u16 songNum)
+{
+ gSaveBlock1Ptr->savedMusic = songNum;
+}
+
+void Overworld_ClearSavedMusic(void)
+{
+ gSaveBlock1Ptr->savedMusic = 0;
+}
+
+static void sub_8085810(void)
+{
+ if (FlagGet(FLAG_SPECIAL_FLAG_0x4001) != TRUE)
+ {
+ u16 newMusic = GetWarpDestinationMusic();
+ u16 currentMusic = GetCurrentMapMusic();
+ if (newMusic != MUS_OOAME && newMusic != 0xFFFF)
+ {
+ if (currentMusic == MUS_DEEPDEEP || currentMusic == MUS_NAMINORI)
+ return;
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ newMusic = MUS_NAMINORI;
+ }
+ if (newMusic != currentMusic)
+ {
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ FadeOutAndFadeInNewMapMusic(newMusic, 4, 4);
+ else
+ FadeOutAndPlayNewMapMusic(newMusic, 8);
+ }
+ }
+}
+
+void Overworld_ChangeMusicToDefault(void)
+{
+ u16 currentMusic = GetCurrentMapMusic();
+ if (currentMusic != GetCurrLocationDefaultMusic())
+ FadeOutAndPlayNewMapMusic(GetCurrLocationDefaultMusic(), 8);
+}
+
+void Overworld_ChangeMusicTo(u16 newMusic)
+{
+ u16 currentMusic = GetCurrentMapMusic();
+ if (currentMusic != newMusic && currentMusic != MUS_OOAME)
+ FadeOutAndPlayNewMapMusic(newMusic, 8);
+}
+
+u8 GetMapMusicFadeoutSpeed(void)
+{
+ const struct MapHeader *mapHeader = warp1_get_mapheader();
+ if (Overworld_MapTypeIsIndoors(mapHeader->mapType) == TRUE)
+ return 2;
+ else
+ return 4;
+}
+
+void music_something(void)
+{
+ u16 currentMusic = GetCurrentMapMusic();
+ u16 warpMusic = GetWarpDestinationMusic();
+ if (FlagGet(FLAG_SPECIAL_FLAG_0x4001) != TRUE && warpMusic != GetCurrentMapMusic())
+ {
+ if (currentMusic == MUS_NAMINORI
+ && VarGet(VAR_0x40CA) == 2
+ && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SOOTOPOLIS_CITY)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SOOTOPOLIS_CITY)
+ && sWarpDestination.mapGroup == MAP_GROUP(SOOTOPOLIS_CITY)
+ && sWarpDestination.mapNum == MAP_NUM(SOOTOPOLIS_CITY)
+ && sWarpDestination.x == 0x1D
+ && sWarpDestination.y == 0x35)
+ return;
+ FadeOutMapMusic(GetMapMusicFadeoutSpeed());
+ }
+}
+
+bool8 sub_80859A0(void)
+{
+ return IsNotWaitingForBGMStop();
+}
+
+void Overworld_FadeOutMapMusic(void)
+{
+ FadeOutMapMusic(4);
+}
+
+static void PlayAmbientCry(void)
+{
+ s16 x, y;
+ s8 pan;
+ s8 volume;
+
+ PlayerGetDestCoords(&x, &y);
+ if (sIsAmbientCryWaterMon == TRUE
+ && !MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y)))
+ return;
+ pan = (Random() % 88) + 212;
+ volume = (Random() % 30) + 50;
+ PlayCry2(sAmbientCrySpecies, pan, volume, 1);
+}
+
+void UpdateAmbientCry(s16 *state, u16 *delayCounter)
+{
+ u8 i, monsCount, divBy;
+
+ switch (*state)
+ {
+ case 0:
+ if (sAmbientCrySpecies == SPECIES_NONE)
+ *state = 4;
+ else
+ *state = 1;
+ break;
+ case 1:
+ *delayCounter = (Random() % 2400) + 1200;
+ *state = 3;
+ break;
+ case 2:
+ divBy = 1;
+ monsCount = CalculatePlayerPartyCount();
+ for (i = 0; i < monsCount; i++)
+ {
+ if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3)
+ && GetMonAbility(&gPlayerParty[0]) == ABILITY_SWARM)
+ {
+ divBy = 2;
+ break;
+ }
+ }
+ *delayCounter = ((Random() % 1200) + 1200) / divBy;
+ *state = 3;
+ break;
+ case 3:
+ (*delayCounter)--;
+ if (*delayCounter == 0)
+ {
+ PlayAmbientCry();
+ *state = 2;
+ }
+ break;
+ case 4:
+ break;
+ }
+}
+
+static void ChooseAmbientCrySpecies(void)
+{
+ if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE130)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE130))
+ && !IsMirageIslandPresent())
+ {
+ // Only play water pokemon cries on this route
+ // when Mirage Island is not present
+ sIsAmbientCryWaterMon = TRUE;
+ sAmbientCrySpecies = GetLocalWaterMon();
+ }
+ else
+ {
+ sAmbientCrySpecies = GetLocalWildMon(&sIsAmbientCryWaterMon);
+ }
+}
+
+u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum)
+{
+ return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType;
+}
+
+u8 GetMapTypeByWarpData(struct WarpData *warp)
+{
+ return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum);
+}
+
+u8 Overworld_GetMapTypeOfSaveblockLocation(void)
+{
+ return GetMapTypeByWarpData(&gSaveBlock1Ptr->location);
+}
+
+u8 get_map_light_from_warp0(void)
+{
+ return GetMapTypeByWarpData(&gUnknown_020322DC);
+}
+
+bool8 is_map_type_1_2_3_5_or_6(u8 mapType)
+{
+ if (mapType == MAP_TYPE_ROUTE
+ || mapType == MAP_TYPE_TOWN
+ || mapType == MAP_TYPE_UNDERWATER
+ || mapType == MAP_TYPE_CITY
+ || mapType == MAP_TYPE_6)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType)
+{
+ if (mapType == MAP_TYPE_ROUTE
+ || mapType == MAP_TYPE_TOWN
+ || mapType == MAP_TYPE_6
+ || mapType == MAP_TYPE_CITY)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 Overworld_MapTypeIsIndoors(u8 mapType)
+{
+ if (mapType == MAP_TYPE_INDOOR
+ || mapType == MAP_TYPE_SECRET_BASE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 sav1_saved_warp2_map_get_name(void)
+{
+ return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp2.mapGroup, gSaveBlock1Ptr->warp2.mapNum)->regionMapSectionId;
+}
+
+u8 sav1_map_get_name(void)
+{
+ return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId;
+}
+
+u8 GetCurrentMapBattleScene(void)
+{
+ return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->battleType;
+}
+
+static void overworld_bg_setup(void)
+{
+ InitBgsFromTemplates(0, gUnknown_08339DAC, ARRAY_COUNT(gUnknown_08339DAC));
+ SetBgAttribute(1, BG_CTRL_ATTR_PALETTEMODE, 1);
+ SetBgAttribute(2, BG_CTRL_ATTR_PALETTEMODE, 1);
+ SetBgAttribute(3, BG_CTRL_ATTR_PALETTEMODE, 1);
+ gBGTilemapBuffers2 = AllocZeroed(0x800);
+ gBGTilemapBuffers1 = AllocZeroed(0x800);
+ gBGTilemapBuffers3 = AllocZeroed(0x800);
+ SetBgTilemapBuffer(1, gBGTilemapBuffers2);
+ SetBgTilemapBuffer(2, gBGTilemapBuffers1);
+ SetBgTilemapBuffer(3, gBGTilemapBuffers3);
+ sub_81971D0();
+}
+
+void overworld_free_bg_tilemaps(void)
+{
+ sub_81BE72C();
+ sub_81971F4();
+ if (gBGTilemapBuffers3 != NULL)
+ FREE_AND_SET_NULL(gBGTilemapBuffers3);
+ if (gBGTilemapBuffers1 != NULL)
+ FREE_AND_SET_NULL(gBGTilemapBuffers1);
+ if (gBGTilemapBuffers2 != NULL)
+ FREE_AND_SET_NULL(gBGTilemapBuffers2);
+}
+
+static void ResetSafariZoneFlag_(void)
+{
+ ResetSafariZoneFlag();
+}
+
+bool32 is_c1_link_related_active(void)
+{
+ if (gMain.callback1 == c1_link_related)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void DoCB1_Overworld(u16 newKeys, u16 heldKeys)
+{
+ struct FieldInput inputStruct;
+
+ sub_808B578();
+ FieldClearPlayerInput(&inputStruct);
+ FieldGetPlayerInput(&inputStruct, newKeys, heldKeys);
+ if (!ScriptContext2_IsEnabled())
+ {
+ if (sub_809C014(&inputStruct) == 1)
+ {
+ ScriptContext2_Enable();
+ HideMapNamePopUpWindow();
+ }
+ else
+ {
+ player_step(inputStruct.dpadDirection, newKeys, heldKeys);
+ }
+ }
+}
+
+void CB1_Overworld(void)
+{
+ if (gMain.callback2 == CB2_Overworld)
+ DoCB1_Overworld(gMain.newKeys, gMain.heldKeys);
+}
+
+static void OverworldBasic(void)
+{
+ ScriptContext2_RunScript();
+ RunTasks();
+ AnimateSprites();
+ CameraUpdate();
+ UpdateCameraPanning();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ sub_80A0A38();
+ do_scheduled_bg_tilemap_copies_to_vram();
+}
+
+// This CB2 is used when starting
+void CB2_OverworldBasic(void)
+{
+ OverworldBasic();
+}
+
+void CB2_Overworld(void)
+{
+ bool32 fading = (gPaletteFade.active != 0);
+ if (fading)
+ SetVBlankCallback(NULL);
+ OverworldBasic();
+ if (fading)
+ SetFieldVBlankCallback();
+}
+
+void SetMainCallback1(MainCallback cb)
+{
+ gMain.callback1 = cb;
+}
+
+void sub_8085E94(void *a0)
+{
+ sUnknown_03000E0C = a0;
+}
+
+static bool8 map_post_load_hook_exec(void)
+{
+ if (gFieldCallback2 != NULL)
+ {
+ if (!gFieldCallback2())
+ {
+ return FALSE;
+ }
+ else
+ {
+ gFieldCallback2 = NULL;
+ gFieldCallback = NULL;
+ }
+ }
+ else
+ {
+ if (gFieldCallback != NULL)
+ gFieldCallback();
+ else
+ mapldr_default();
+
+ gFieldCallback = NULL;
+ }
+
+ return TRUE;
+}
+
+void CB2_NewGame(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ StopMapMusic();
+ ResetSafariZoneFlag_();
+ NewGameInitData();
+ player_avatar_init_params_reset();
+ PlayTimeCounter_Start();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+ gFieldCallback = ExecuteTruckSequence;
+ gFieldCallback2 = NULL;
+ do_load_map_stuff_loop(&gMain.state);
+ SetFieldVBlankCallback();
+ SetMainCallback1(CB1_Overworld);
+ SetMainCallback2(CB2_Overworld);
+}
+
+void CB2_WhiteOut(void)
+{
+ u8 val;
+
+ if (++gMain.state >= 120)
+ {
+ FieldClearVBlankHBlankCallbacks();
+ StopMapMusic();
+ ResetSafariZoneFlag_();
+ DoWhiteOut();
+ player_avatar_init_params_reset();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+ gFieldCallback = sub_80AF3C8;
+ val = 0;
+ do_load_map_stuff_loop(&val);
+ SetFieldVBlankCallback();
+ SetMainCallback1(CB1_Overworld);
+ SetMainCallback2(CB2_Overworld);
+ }
+}
+
+void CB2_LoadMap(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+ SetMainCallback1(NULL);
+ SetMainCallback2(c2_change_map);
+ gMain.savedCallback = CB2_LoadMap2;
+}
+
+static void CB2_LoadMap2(void)
+{
+ do_load_map_stuff_loop(&gMain.state);
+ SetFieldVBlankCallback();
+ SetMainCallback1(CB1_Overworld);
+ SetMainCallback2(CB2_Overworld);
+}
+
+void sub_8086024(void)
+{
+ if (!gMain.state)
+ {
+ FieldClearVBlankHBlankCallbacks();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+ SetMainCallback1(NULL);
+ }
+ if (load_map_stuff(&gMain.state, 1))
+ {
+ SetFieldVBlankCallback();
+ SetMainCallback1(CB1_Overworld);
+ SetMainCallback2(CB2_Overworld);
+ }
+}
+
+void sub_8086074(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ gFieldCallback = sub_80AF314;
+ SetMainCallback2(c2_80567AC);
+}
+
+static void c2_80567AC(void)
+{
+ if (map_loading_iteration_3(&gMain.state))
+ {
+ SetFieldVBlankCallback();
+ SetMainCallback1(c1_link_related);
+ sub_8086C2C();
+ SetMainCallback2(CB2_Overworld);
+ }
+}
+
+void CB2_ReturnToField(void)
+{
+ if (is_c1_link_related_active() == TRUE)
+ {
+ SetMainCallback2(CB2_ReturnToFieldLink);
+ }
+ else
+ {
+ FieldClearVBlankHBlankCallbacks();
+ SetMainCallback2(CB2_ReturnToFieldLocal);
+ }
+}
+
+void CB2_ReturnToFieldLocal(void)
+{
+ if (sub_8086638(&gMain.state))
+ {
+ SetFieldVBlankCallback();
+ SetMainCallback2(CB2_Overworld);
+ }
+}
+
+void CB2_ReturnToFieldLink(void)
+{
+ if (!sub_8087598() && map_loading_iteration_2_link(&gMain.state))
+ SetMainCallback2(CB2_Overworld);
+}
+
+void c2_8056854(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ StopMapMusic();
+ SetMainCallback1(c1_link_related);
+ sub_8086C2C();
+
+ if (gWirelessCommType != 0)
+ gFieldCallback = sub_80AF314;
+ else
+ gFieldCallback = sub_80AF214;
+
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+ CB2_ReturnToField();
+}
+
+void CB2_ReturnToFieldWithOpenMenu(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ gFieldCallback2 = sub_80AF6A4;
+ CB2_ReturnToField();
+}
+
+void CB2_ReturnToFieldContinueScript(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ gFieldCallback = sub_80AF188;
+ CB2_ReturnToField();
+}
+
+void CB2_ReturnToFieldContinueScriptPlayMapMusic(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ gFieldCallback = sub_80AF168;
+ CB2_ReturnToField();
+}
+
+void sub_80861E8(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ gFieldCallback = sub_80AF3C8;
+ CB2_ReturnToField();
+}
+
+static void sub_8086204(void)
+{
+ if ((gMapHeader.flags & 0xF8) == 8 && sub_80E909C() == TRUE)
+ ShowMapNamePopup();
+ sub_80AF3C8();
+}
+
+void CB2_ContinueSavedGame(void)
+{
+ u8 trainerHillMapId;
+
+ FieldClearVBlankHBlankCallbacks();
+ StopMapMusic();
+ ResetSafariZoneFlag_();
+ if (gSaveFileStatus == 0xFF)
+ sub_81A3908();
+
+ LoadSaveblockMapHeader();
+ set_warp2_warp3_to_neg_1();
+ trainerHillMapId = GetCurrentTrainerHillMapId();
+ if (gMapHeader.mapLayoutId == 0x169)
+ sub_81AA2F8();
+ else if (trainerHillMapId != 0 && trainerHillMapId != 6)
+ sub_81D5F48();
+ else
+ LoadSaveblockEventObjScripts();
+
+ UnfreezeEventObjects();
+ DoTimeBasedEvents();
+ sub_8084788();
+ if (gMapHeader.mapLayoutId == 0x169)
+ battle_pyramid_map_load_related(1);
+ else if (trainerHillMapId != 0)
+ trainer_hill_map_load_related();
+ else
+ sub_8087D74();
+
+ PlayTimeCounter_Start();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+ sub_8195E10();
+ if (GetSecretBase2Field_9() == 1)
+ {
+ ClearSecretBase2Field_9();
+ warp1_set_to_sav1w();
+ warp_in();
+ sub_80EDB44();
+ SetMainCallback2(CB2_LoadMap);
+ }
+ else
+ {
+ sub_80EDB44();
+ gFieldCallback = sub_8086204;
+ SetMainCallback1(CB1_Overworld);
+ CB2_ReturnToField();
+ }
+}
+
+static void FieldClearVBlankHBlankCallbacks(void)
+{
+ if (warp0_in_pokecenter() == TRUE)
+ CloseLink();
+
+ if (gWirelessCommType != 0)
+ {
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ DisableInterrupts(INTR_FLAG_HBLANK);
+ }
+ else
+ {
+ u16 savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE &= ~INTR_FLAG_HBLANK;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ }
+
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+}
+
+static void SetFieldVBlankCallback(void)
+{
+ SetVBlankCallback(VBlankCB_Field);
+}
+
+static void VBlankCB_Field(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ ScanlineEffect_InitHBlankDmaTransfer();
+ FieldUpdateBgTilemapScroll();
+ TransferPlttBuffer();
+ TransferTilesetAnimsBuffer();
+}
+
+static void sub_80863B0(void)
+{
+ u8 val;
+
+ if (sub_81A9E6C())
+ {
+ door_upload_tiles();
+ ScanlineEffect_SetParams(gUnknown_08339DBC);
+ }
+ else if ((val = Overworld_GetFlashLevel()))
+ {
+ sub_80B00E8(val);
+ ScanlineEffect_SetParams(gUnknown_08339DBC);
+ }
+}
+
+static bool32 map_loading_iteration_3(u8 *state)
+{
+ switch (*state)
+ {
+ case 0:
+ overworld_bg_setup();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+ sub_80867C8();
+ sub_80867D8();
+ (*state)++;
+ break;
+ case 1:
+ mli0_load_map(1);
+ (*state)++;
+ break;
+ case 2:
+ sub_8086988(TRUE);
+ (*state)++;
+ break;
+ case 3:
+ sub_8086AE4();
+ sub_80869DC();
+ sub_8086B14();
+ sub_8086AAC();
+ (*state)++;
+ break;
+ case 4:
+ sub_80863B0();
+ map_loading_lcd_reset();
+ sub_8197200();
+ (*state)++;
+ break;
+ case 5:
+ move_tilemap_camera_to_upper_left_corner();
+ (*state)++;
+ break;
+ case 6:
+ copy_map_tileset1_to_vram(gMapHeader.mapLayout);
+ (*state)++;
+ break;
+ case 7:
+ copy_map_tileset2_to_vram(gMapHeader.mapLayout);
+ (*state)++;
+ break;
+ case 8:
+ if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ {
+ apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout);
+ (*state)++;
+ }
+ break;
+ case 9:
+ DrawWholeMapView();
+ (*state)++;
+ break;
+ case 10:
+ cur_mapheader_run_tileset_funcs_after_some_cpuset();
+ (*state)++;
+ break;
+ case 11:
+ if (gWirelessCommType != 0)
+ {
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ (*state)++;
+ break;
+ case 12:
+ if (map_post_load_hook_exec())
+ (*state)++;
+ break;
+ case 13:
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool32 load_map_stuff(u8 *state, u32 a2)
+{
+ switch (*state)
+ {
+ case 0:
+ FieldClearVBlankHBlankCallbacks();
+ mli0_load_map(a2);
+ (*state)++;
+ break;
+ case 1:
+ sub_80867C8();
+ sub_80867D8();
+ (*state)++;
+ break;
+ case 2:
+ sub_8086988(a2);
+ (*state)++;
+ break;
+ case 3:
+ mli4_mapscripts_and_other();
+ sub_8086A80();
+ (*state)++;
+ break;
+ case 4:
+ sub_80863B0();
+ map_loading_lcd_reset();
+ sub_8197200();
+ (*state)++;
+ break;
+ case 5:
+ move_tilemap_camera_to_upper_left_corner();
+ (*state)++;
+ break;
+ case 6:
+ copy_map_tileset1_to_vram(gMapHeader.mapLayout);
+ (*state)++;
+ break;
+ case 7:
+ copy_map_tileset2_to_vram(gMapHeader.mapLayout);
+ (*state)++;
+ break;
+ case 8:
+ if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ {
+ apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout);
+ (*state)++;
+ }
+ break;
+ case 9:
+ DrawWholeMapView();
+ (*state)++;
+ break;
+ case 10:
+ cur_mapheader_run_tileset_funcs_after_some_cpuset();
+ (*state)++;
+ break;
+ case 11:
+ if ((gMapHeader.flags & 0xF8) == 8 && sub_80E909C() == 1)
+ ShowMapNamePopup();
+ (*state)++;
+ break;
+ case 12:
+ if (map_post_load_hook_exec())
+ (*state)++;
+ break;
+ case 13:
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool32 sub_8086638(u8 *state)
+{
+ switch (*state)
+ {
+ case 0:
+ sub_80867C8();
+ sub_80867D8();
+ sub_8086988(0);
+ sub_8086A68();
+ sub_8086A80();
+ (*state)++;
+ break;
+ case 1:
+ sub_8086860();
+ sub_81D64C0();
+ (*state)++;
+ break;
+ case 2:
+ if (map_post_load_hook_exec())
+ (*state)++;
+ break;
+ case 3:
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool32 map_loading_iteration_2_link(u8 *state)
+{
+ switch (*state)
+ {
+ case 0:
+ FieldClearVBlankHBlankCallbacks();
+ sub_80867C8();
+ sub_80867D8();
+ (*state)++;
+ break;
+ case 1:
+ sub_8086988(1);
+ (*state)++;
+ break;
+ case 2:
+ sub_8086B9C();
+ sub_8086A68();
+ sub_8086AC8();
+ (*state)++;
+ break;
+ case 3:
+ sub_80863B0();
+ map_loading_lcd_reset();
+ sub_8197200();
+ (*state)++;
+ break;
+ case 4:
+ move_tilemap_camera_to_upper_left_corner();
+ (*state)++;
+ break;
+ case 5:
+ copy_map_tileset1_to_vram(gMapHeader.mapLayout);
+ (*state)++;
+ break;
+ case 6:
+ copy_map_tileset2_to_vram(gMapHeader.mapLayout);
+ (*state)++;
+ break;
+ case 7:
+ if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ {
+ apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout);
+ (*state)++;
+ }
+ break;
+ case 8:
+ DrawWholeMapView();
+ (*state)++;
+ break;
+ case 9:
+ cur_mapheader_run_tileset_funcs_after_some_cpuset();
+ (*state)++;
+ break;
+ case 11:
+ if (gWirelessCommType != 0)
+ {
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ (*state)++;
+ break;
+ case 12:
+ if (map_post_load_hook_exec())
+ (*state)++;
+ break;
+ case 10:
+ (*state)++;
+ break;
+ case 13:
+ SetFieldVBlankCallback();
+ (*state)++;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void do_load_map_stuff_loop(u8 *state)
+{
+ while (!load_map_stuff(state, 0));
+}
+
+static void sub_80867C8(void)
+{
+ sub_81BE6AC();
+ MoveSaveBlocks_ResetHeap();
+}
+
+static void sub_80867D8(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ScanlineEffect_Stop();
+
+ DmaClear16(3, PLTT + 2, PLTT_SIZE - 2);
+ DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
+ ResetOamRange(0, 128);
+ LoadOam();
+}
+
+static void sub_8086860(void)
+{
+ sub_80863B0();
+ map_loading_lcd_reset();
+ sub_8197200();
+ mapdata_load_assets_to_gpu_and_full_redraw();
+}
+
+static void map_loading_lcd_reset(void)
+{
+ clear_scheduled_bg_copies_to_vram();
+ reset_temp_tile_data_buffers();
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0x1F1F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x101);
+ SetGpuReg(REG_OFFSET_WIN0H, 0xFF);
+ SetGpuReg(REG_OFFSET_WIN0V, 0xFF);
+ SetGpuReg(REG_OFFSET_WIN1H, 0xFFFF);
+ SetGpuReg(REG_OFFSET_WIN1V, 0xFFFF);
+ SetGpuReg(REG_OFFSET_BLDCNT, gUnknown_82EC7C4[1] | gUnknown_82EC7C4[2] | gUnknown_82EC7C4[3]
+ | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(13, 7));
+ overworld_bg_setup();
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ schedule_bg_copy_tilemap_to_vram(3);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON
+ | DISPCNT_OBJ_1D_MAP | DISPCNT_HBLANK_INTERVAL);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ sub_8098128();
+}
+
+static void sub_8086988(u32 a1)
+{
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ ScanlineEffect_Clear();
+ dp13_810BB8C();
+ ResetCameraUpdateInfo();
+ InstallCameraPanAheadCallback();
+ if (!a1)
+ npc_paltag_set_load(0);
+ else
+ npc_paltag_set_load(1);
+
+ FieldEffectActiveListClear();
+ sub_80AAFA4();
+ sub_80AEE84();
+ if (!a1)
+ SetUpFieldTasks();
+ mapheader_run_script_with_tag_x5();
+ sub_81BE6B8();
+}
+
+static void sub_80869DC(void)
+{
+ gUnknown_03005DEC = 0;
+ gUnknown_03005DE8 = 0;
+ sub_808D438();
+ TrySpawnEventObjects(0, 0);
+ mapheader_run_first_tag4_script_list_match();
+}
+
+static void mli4_mapscripts_and_other(void)
+{
+ s16 x, y;
+ struct UnkPlayerStruct *player;
+
+ gUnknown_03005DEC = 0;
+ gUnknown_03005DE8 = 0;
+ sub_808D438();
+ sav1_camera_get_focus_coords(&x, &y);
+ player = sub_80852D4();
+ InitPlayerAvatar(x, y, player->player_field_1, gSaveBlock2Ptr->playerGender);
+ SetPlayerAvatarTransitionFlags(player->player_field_0);
+ player_avatar_init_params_reset();
+ TrySpawnEventObjects(0, 0);
+ mapheader_run_first_tag4_script_list_match();
+}
+
+static void sub_8086A68(void)
+{
+ sub_808E16C(0, 0);
+ RotatingGate_InitPuzzleAndGraphics();
+ mapheader_run_script_with_tag_x7();
+}
+
+static void sub_8086A80(void)
+{
+ gEventObjects[gPlayerAvatar.eventObjectId].trackedByCamera = 1;
+ InitCameraUpdateCallback(gPlayerAvatar.spriteId);
+}
+
+static void sub_8086AAC(void)
+{
+ InitCameraUpdateCallback(sub_8087858(gUnknown_03005DB4));
+}
+
+static void sub_8086AC8(void)
+{
+ InitCameraUpdateCallback(sub_8087858(gUnknown_03005DB4));
+}
+
+static void sub_8086AE4(void)
+{
+ u16 x, y;
+ sav1_camera_get_focus_coords(&x, &y);
+ sub_8088B3C(x + gUnknown_03005DB4, y);
+}
+
+static void sub_8086B14(void)
+{
+ u16 i;
+ u16 x, y;
+
+ sav1_camera_get_focus_coords(&x, &y);
+ x -= gUnknown_03005DB4;
+
+ for (i = 0; i < gFieldLinkPlayerCount; i++)
+ {
+ SpawnLinkPlayerEventObject(i, i + x, y, gLinkPlayers[i].gender);
+ CreateLinkPlayerSprite(i, gLinkPlayers[i].version);
+ }
+
+ sub_8086C40();
+}
+
+static void sub_8086B9C(void)
+{
+ u16 i;
+ for (i = 0; i < gFieldLinkPlayerCount; i++)
+ CreateLinkPlayerSprite(i, gLinkPlayers[i].version);
+}
+
+static void c1_link_related(void)
+{
+ if (gWirelessCommType == 0 || !sub_800F0B8() || !sub_8009F3C())
+ {
+ u8 var = gUnknown_03005DB4;
+ sub_8086F38(gLinkPartnersHeldKeys, var);
+ sub_8086FA0(sUnknown_03000E14(var));
+ sub_8086C40();
+ }
+}
+
+void sub_8086C2C(void)
+{
+ sub_8086C90();
+ c1_link_related_func_set(sub_80870B0);
+}
+
+static void sub_8086C40(void)
+{
+ sub_808709C(gLinkPartnersHeldKeys);
+}
+
+static void c1_link_related_func_set(u16 (*func)(u32))
+{
+ sUnknown_03000E19 = 0;
+ sUnknown_03000E14 = func;
+}
+
+static void sub_8086C64(void)
+{
+ if (gWirelessCommType != 0 && ++sUnknown_03000E19 > 60)
+ sub_8010198();
+}
+
+static void sub_8086C90(void)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ sUnknown_03000E10[i] = 0x80;
+}
+
+static bool32 sub_8086CA8(u16 a1)
+{
+ s32 i;
+ s32 count = gFieldLinkPlayerCount;
+
+ for (i = 0; i < count; i++)
+ if (sUnknown_03000E10[i] != a1)
+ return FALSE;
+ return TRUE;
+}
+
+static bool32 sub_8086CE0(u16 a1)
+{
+ s32 i;
+ s32 count = gFieldLinkPlayerCount;
+
+ for (i = 0; i < count; i++)
+ if (sUnknown_03000E10[i] == a1)
+ return TRUE;
+ return FALSE;
+}
+
+static void sub_8086D18(u32 a1, u16 a2, struct UnkStruct_8054FF8 *a3, u16 *a4)
+{
+ const u8 *script;
+
+ if (sUnknown_03000E10[a1] == 0x80)
+ {
+ script = sub_8087370(a3);
+ if (script)
+ {
+ *a4 = sub_8087480(script);
+ sUnknown_03000E10[a1] = 0x81;
+ if (a3->b)
+ {
+ c1_link_related_func_set(sub_80870F8);
+ sub_8087530(script);
+ }
+ return;
+ }
+ if (sub_8086CE0(0x83) == 1)
+ {
+ sUnknown_03000E10[a1] = 0x81;
+ if (a3->b)
+ {
+ c1_link_related_func_set(sub_80870F8);
+ sub_8087584();
+ }
+ return;
+ }
+ switch (a2)
+ {
+ case 24:
+ if (sub_8087358(a3))
+ {
+ sUnknown_03000E10[a1] = 0x81;
+ if (a3->b)
+ {
+ c1_link_related_func_set(sub_80870F8);
+ sub_808751C();
+ }
+ }
+ break;
+ case 18:
+ if (sub_8087388(a3) == TRUE)
+ {
+ sUnknown_03000E10[a1] = 0x81;
+ if (a3->b)
+ {
+ c1_link_related_func_set(sub_80870F8);
+ sub_808754C();
+ }
+ }
+ break;
+ case 25:
+ script = sub_80873B4(a3);
+ if (script)
+ {
+ sUnknown_03000E10[a1] = 0x81;
+ if (a3->b)
+ {
+ c1_link_related_func_set(sub_80870F8);
+ sub_8087568(script);
+ }
+ }
+ break;
+ case 27:
+ if (sub_8087340(a3))
+ {
+ sUnknown_03000E10[a1] = 0x81;
+ if (a3->b)
+ {
+ c1_link_related_func_set(sub_808711C);
+ sub_8087510();
+ }
+ }
+ break;
+ case 28:
+ if (sub_8087340(a3))
+ {
+ sUnknown_03000E10[a1] = 0x81;
+ if (a3->b)
+ {
+ c1_link_related_func_set(sub_8087140);
+ sub_8087510();
+ }
+ }
+ break;
+ }
+ }
+
+ switch (a2)
+ {
+ case 23:
+ sUnknown_03000E10[a1] = 0x83;
+ break;
+ case 22:
+ sUnknown_03000E10[a1] = 0x82;
+ break;
+ case 26:
+ sUnknown_03000E10[a1] = 0x80;
+ if (a3->b)
+ c1_link_related_func_set(sub_80870B0);
+ break;
+ case 29:
+ if (sUnknown_03000E10[a1] == 0x82)
+ sUnknown_03000E10[a1] = 0x81;
+ break;
+ }
+}
+
+static void sub_8086F38(u16 *a1, s32 a2)
+{
+ struct UnkStruct_8054FF8 st;
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 v5 = a1[i];
+ u16 v8 = 0;
+ sub_80872D8(i, a2, &st);
+ sub_8086D18(i, v5, &st, &v8);
+ if (sUnknown_03000E10[i] == 0x80)
+ v8 = sub_8087068(v5);
+ sub_808796C(i, v8);
+ }
+}
+
+static void sub_8086FA0(u16 a1)
+{
+ if (a1 >= 17 && a1 < 30)
+ gUnknown_03005DA8 = a1;
+ else
+ gUnknown_03005DA8 = 17;
+
+ if (gWirelessCommType != 0
+ && sub_8087690() > 1
+ && is_c1_link_related_active() == TRUE
+ && sub_8009F3C() == TRUE)
+ {
+ switch (a1)
+ {
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 24:
+ case 25:
+ gUnknown_03005DA8 = 0;
+ break;
+ }
+ }
+}
+
+static u16 sub_808700C(u32 a1)
+{
+ if (gMain.heldKeys & DPAD_UP)
+ return 19;
+ else if (gMain.heldKeys & DPAD_DOWN)
+ return 18;
+ else if (gMain.heldKeys & DPAD_LEFT)
+ return 20;
+ else if (gMain.heldKeys & DPAD_RIGHT)
+ return 21;
+ else if (gMain.newKeys & START_BUTTON)
+ return 24;
+ else if (gMain.newKeys & A_BUTTON)
+ return 25;
+ else
+ return 17;
+}
+
+static u16 sub_8087068(u16 a1)
+{
+ switch (a1)
+ {
+ case 21:
+ return 4;
+ case 20:
+ return 3;
+ case 19:
+ return 1;
+ case 18:
+ return 2;
+ default:
+ return 0;
+ }
+}
+
+static void sub_808709C(u16 *a1)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ a1[i] = 17;
+}
+
+static u16 sub_80870B0(u32 a1)
+{
+ if (ScriptContext2_IsEnabled() == 1)
+ return 17;
+ if (sub_800B4DC() > 4)
+ return 27;
+ if (sub_8087690() <= 4)
+ return sub_808700C(a1);
+ return 28;
+}
+
+static u16 sub_80870EC(u32 a1)
+{
+ sub_8086C64();
+ return 17;
+}
+
+static u16 sub_80870F8(u32 a1)
+{
+ u16 retVal;
+ if (ScriptContext2_IsEnabled() == TRUE)
+ {
+ retVal = 17;
+ }
+ else
+ {
+ retVal = 26;
+ c1_link_related_func_set(sub_80870EC);
+ }
+ return retVal;
+}
+
+static u16 sub_808711C(u32 a1)
+{
+ u16 retVal;
+ if (sub_800B4DC() > 2)
+ {
+ retVal = 17;
+ }
+ else
+ {
+ retVal = 26;
+ ScriptContext2_Disable();
+ c1_link_related_func_set(sub_80870EC);
+ }
+ return retVal;
+}
+
+static u16 sub_8087140(u32 a1)
+{
+ u16 retVal;
+ if (sub_8087690() > 2)
+ {
+ retVal = 17;
+ }
+ else
+ {
+ retVal = 26;
+ ScriptContext2_Disable();
+ c1_link_related_func_set(sub_80870EC);
+ }
+ return retVal;
+}
+
+static u16 sub_8087164(u32 a1)
+{
+ sub_8086C64();
+ return 17;
+}
+
+static u16 sub_8087170(u32 linkPlayerId)
+{
+ if (sUnknown_03000E10[linkPlayerId] == 0x82)
+ {
+ if (gMain.newKeys & B_BUTTON)
+ {
+ c1_link_related_func_set(sub_8087164);
+ return 29;
+ }
+ else
+ {
+ return 17;
+ }
+ }
+ else
+ {
+ sub_8086C64();
+ return 17;
+ }
+}
+
+static u16 sub_80871AC(u32 a1)
+{
+ c1_link_related_func_set(sub_8087170);
+ return 22;
+}
+
+static u16 sub_80871C0(u32 a1)
+{
+ return 17;
+}
+
+static u16 sub_80871C4(u32 a1)
+{
+ if (sUnknown_03000E10[a1] != 0x83)
+ sub_8086C64();
+ if (sub_8086CA8(0x83) == TRUE)
+ {
+ ScriptContext1_SetupScript(EventScript_277513);
+ c1_link_related_func_set(sub_80871C0);
+ }
+ return 17;
+}
+
+static u16 sub_80871FC(u32 a1)
+{
+ c1_link_related_func_set(sub_80871C4);
+ return 23;
+}
+
+static u16 sub_8087210(u32 a1)
+{
+ return 17;
+}
+
+u32 sub_8087214(void)
+{
+ if (sub_8086CE0(0x83) == TRUE)
+ return 2;
+ if (sUnknown_03000E14 == sub_8087170 && sUnknown_03000E10[gUnknown_03005DB4] != 0x82)
+ return 0;
+ if (sUnknown_03000E14 == sub_8087164 && sUnknown_03000E10[gUnknown_03005DB4] == 0x81)
+ return 2;
+ if (sub_8086CA8(0x82) != 0)
+ return 1;
+ return 0;
+}
+
+bool32 sub_808727C(void)
+{
+ return sub_8086CE0(0x83);
+}
+
+u16 sub_8087288(void)
+{
+ c1_link_related_func_set(sub_80871AC);
+ return 0;
+}
+
+u16 sub_808729C(void)
+{
+ c1_link_related_func_set(sub_80870F8);
+ return 0;
+}
+
+u16 sub_80872B0(void)
+{
+ c1_link_related_func_set(sub_80871FC);
+ return 0;
+}
+
+u16 sub_80872C4(void)
+{
+ c1_link_related_func_set(sub_8087210);
+ return 0;
+}
+
+static void sub_80872D8(s32 linkPlayerId, s32 a2, struct UnkStruct_8054FF8 *a3)
+{
+ s16 x, y;
+
+ a3->a = linkPlayerId;
+ a3->b = (linkPlayerId == a2) ? 1 : 0;
+ a3->c = gLinkPlayerEventObjects[linkPlayerId].mode;
+ a3->d = sub_80878A0(linkPlayerId);
+ sub_8087878(linkPlayerId, &x, &y);
+ a3->sub.x = x;
+ a3->sub.y = y;
+ a3->sub.height = sub_80878C0(linkPlayerId);
+ a3->field_C = MapGridGetMetatileBehaviorAt(x, y);
+}
+
+static bool32 sub_8087340(struct UnkStruct_8054FF8 *a1)
+{
+ u8 v1 = a1->c;
+ if (v1 == 2 || v1 == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool32 sub_8087358(struct UnkStruct_8054FF8 *a1)
+{
+ u8 v1 = a1->c;
+ if (v1 == 2 || v1 == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static u8 *sub_8087370(struct UnkStruct_8054FF8 *a1)
+{
+ if (a1->c != 2)
+ return 0;
+ return sub_809D0F4(&a1->sub);
+}
+
+static bool32 sub_8087388(struct UnkStruct_8054FF8 *a1)
+{
+ if (a1->c != 2 && a1->c != 0)
+ return FALSE;
+ else if (!MetatileBehavior_IsSouthArrowWarp(a1->field_C))
+ return FALSE;
+ else if (a1->d != 1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static const u8 *sub_80873B4(struct UnkStruct_8054FF8 *a1)
+{
+ struct MapPosition unkStruct;
+ u8 linkPlayerId;
+
+ if (a1->c && a1->c != 2)
+ return 0;
+
+ unkStruct = a1->sub;
+ unkStruct.x += gUnknown_08339D64[a1->d].x;
+ unkStruct.y += gUnknown_08339D64[a1->d].y;
+ unkStruct.height = 0;
+ linkPlayerId = GetLinkPlayerIdAt(unkStruct.x, unkStruct.y);
+
+ if (linkPlayerId != 4)
+ {
+ if (!a1->b)
+ return EventScript_TradeRoom_TooBusyToNotice;
+ else if (sUnknown_03000E10[linkPlayerId] != 0x80)
+ return EventScript_TradeRoom_TooBusyToNotice;
+ else if (!sub_80B39D4(linkPlayerId))
+ return EventScript_TradeRoom_ReadTrainerCard1;
+ else
+ return EventScript_TradeRoom_ReadTrainerCard2;
+ }
+
+ return sub_809C2C8(&unkStruct, a1->field_C, a1->d);
+}
+
+static u16 sub_8087480(const u8 *script)
+{
+ if (script == gUnknown_08277388)
+ return 10;
+ else if (script == gUnknown_082773A3)
+ return 9;
+ else if (script == gUnknown_082773BE)
+ return 10;
+ else if (script == gUnknown_082773D9)
+ return 9;
+ else if (script == gUnknown_0827741D)
+ return 10;
+ else if (script == gUnknown_08277432)
+ return 9;
+ else if (script == gUnknown_08277447)
+ return 10;
+ else if (script == gUnknown_0827745C)
+ return 9;
+ else if (script == gUnknown_08277374)
+ return 10;
+ else if (script == gUnknown_0827737E)
+ return 9;
+ else if (script == gUnknown_082773F5)
+ return 10;
+ else if (script == gUnknown_082773FF)
+ return 9;
+ else
+ return 0;
+}
+
+static void sub_8087510(void)
+{
+ ScriptContext2_Enable();
+}
+
+static void sub_808751C(void)
+{
+ PlaySE(SE_WIN_OPEN);
+ ShowStartMenu();
+ ScriptContext2_Enable();
+}
+
+static void sub_8087530(const u8 *script)
+{
+ PlaySE(SE_SELECT);
+ ScriptContext1_SetupScript(script);
+ ScriptContext2_Enable();
+}
+
+static void sub_808754C(void)
+{
+ PlaySE(SE_WIN_OPEN);
+ ScriptContext1_SetupScript(gUnknown_082774EF);
+ ScriptContext2_Enable();
+}
+
+static void sub_8087568(const u8 *script)
+{
+ PlaySE(SE_SELECT);
+ ScriptContext1_SetupScript(script);
+ ScriptContext2_Enable();
+}
+
+static void sub_8087584(void)
+{
+ ScriptContext1_SetupScript(gUnknown_08277509);
+ ScriptContext2_Enable();
+}
+
+bool32 sub_8087598(void)
+{
+ if (!is_c1_link_related_active())
+ return 0;
+ if (sub_800B4DC() >= 3)
+ sUnknown_03000E18 = 1;
+ else
+ sUnknown_03000E18 = 0;
+ return sUnknown_03000E18;
+}
+
+bool32 sub_80875C8(void)
+{
+ u8 temp;
+
+ if (sub_800B4DC() < 2)
+ return FALSE;
+ else if (is_c1_link_related_active() != TRUE)
+ return FALSE;
+ else if (sub_8009F3C() != TRUE)
+ return FALSE;
+ else if (sUnknown_03000E14 == sub_808711C)
+ return TRUE;
+ else if (sUnknown_03000E14 != sub_80870F8)
+ return FALSE;
+
+ temp = sUnknown_03000E18;
+ sUnknown_03000E18 = 0;
+
+ if (temp == TRUE)
+ return TRUE;
+ else if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool32 sub_8087634(void)
+{
+ if (sub_8087690() < 2)
+ return FALSE;
+ else if (is_c1_link_related_active() != TRUE)
+ return FALSE;
+ else if (sub_8009F3C() != TRUE)
+ return FALSE;
+ else if (sUnknown_03000E14 == sub_8087140)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool32 sub_808766C(void)
+{
+ if (gWirelessCommType != 0)
+ return FALSE;
+ else if (!sub_8009F3C())
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static u32 sub_8087690(void)
+{
+ if (gWirelessCommType != 0)
+ return gUnknown_03005000.unk_9e8.unk_232;
+ else
+ return gLink.sendQueue.count;
+}
+
+static void ZeroLinkPlayerEventObject(struct LinkPlayerEventObject *linkPlayerEventObj)
+{
+ memset(linkPlayerEventObj, 0, sizeof(struct LinkPlayerEventObject));
+}
+
+void ClearLinkPlayerEventObjects(void)
+{
+ memset(gLinkPlayerEventObjects, 0, sizeof(gLinkPlayerEventObjects));
+}
+
+static void ZeroEventObject(struct EventObject *eventObj)
+{
+ memset(eventObj, 0, sizeof(struct EventObject));
+}
+
+static void SpawnLinkPlayerEventObject(u8 linkPlayerId, s16 x, s16 y, u8 a4)
+{
+ u8 eventObjId = GetFirstInactiveEventObjectId();
+ struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId];
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+
+ ZeroLinkPlayerEventObject(linkPlayerEventObj);
+ ZeroEventObject(eventObj);
+
+ linkPlayerEventObj->active = 1;
+ linkPlayerEventObj->linkPlayerId = linkPlayerId;
+ linkPlayerEventObj->eventObjId = eventObjId;
+ linkPlayerEventObj->mode = 0;
+
+ eventObj->active = 1;
+ eventObj->singleMovementActive = a4;
+ eventObj->range.as_byte = 2;
+ eventObj->spriteId = 64;
+
+ InitLinkPlayerEventObjectPos(eventObj, x, y);
+}
+
+static void InitLinkPlayerEventObjectPos(struct EventObject *eventObj, s16 x, s16 y)
+{
+ eventObj->currentCoords.x = x;
+ eventObj->currentCoords.y = y;
+ eventObj->previousCoords.x = x;
+ eventObj->previousCoords.y = y;
+ sub_8093038(x, y, &eventObj->initialCoords.x, &eventObj->initialCoords.y);
+ eventObj->initialCoords.x += 8;
+ EventObjectUpdateZCoord(eventObj);
+}
+
+static void sub_80877DC(u8 linkPlayerId, u8 a2)
+{
+ if (gLinkPlayerEventObjects[linkPlayerId].active)
+ {
+ u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ eventObj->range.as_byte = a2;
+ }
+}
+
+static void sub_808780C(u8 linkPlayerId)
+{
+ struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId];
+ u8 eventObjId = linkPlayerEventObj->eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ if (eventObj->spriteId != 64 )
+ DestroySprite(&gSprites[eventObj->spriteId]);
+ linkPlayerEventObj->active = 0;
+ eventObj->active = 0;
+}
+
+static u8 sub_8087858(u8 linkPlayerId)
+{
+ u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ return eventObj->spriteId;
+}
+
+static void sub_8087878(u8 linkPlayerId, u16 *x, u16 *y)
+{
+ u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ *x = eventObj->currentCoords.x;
+ *y = eventObj->currentCoords.y;
+}
+
+static u8 sub_80878A0(u8 linkPlayerId)
+{
+ u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ return eventObj->range.as_byte;
+}
+
+static u8 sub_80878C0(u8 linkPlayerId)
+{
+ u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ return eventObj->currentElevation;
+}
+
+static s32 sub_80878E4(u8 linkPlayerId)
+{
+ u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ return 16 - (s8)eventObj->directionSequenceIndex;
+}
+
+static u8 GetLinkPlayerIdAt(s16 x, s16 y)
+{
+ u8 i;
+ for (i = 0; i < 4; i++)
+ {
+ if (gLinkPlayerEventObjects[i].active
+ && (gLinkPlayerEventObjects[i].mode == 0 || gLinkPlayerEventObjects[i].mode == 2))
+ {
+ struct EventObject *eventObj = &gEventObjects[gLinkPlayerEventObjects[i].eventObjId];
+ if (eventObj->currentCoords.x == x && eventObj->currentCoords.y == y)
+ return i;
+ }
+ }
+ return 4;
+}
+
+static void sub_808796C(u8 linkPlayerId, u8 a2)
+{
+ struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId];
+ u8 eventObjId = linkPlayerEventObj->eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+
+ if (linkPlayerEventObj->active)
+ {
+ if (a2 > 10)
+ eventObj->triggerGroundEffectsOnMove = 1;
+ else
+ gUnknown_08339E00[gUnknown_08339DC8[linkPlayerEventObj->mode](linkPlayerEventObj, eventObj, a2)](linkPlayerEventObj, eventObj);
+ }
+}
+
+static u8 sub_80879D8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+{
+ return gUnknown_08339DD4[a3](linkPlayerEventObj, eventObj, a3);
+}
+
+static u8 sub_80879F8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+{
+ return 1;
+}
+
+static u8 sub_80879FC(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+{
+ return gUnknown_08339DD4[a3](linkPlayerEventObj, eventObj, a3);
+}
+
+static u8 sub_8087A1C(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+{
+ return 0;
+}
+
+static u8 sub_8087A20(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+{
+ s16 x, y;
+
+ eventObj->range.as_byte = npc_something3(a3, eventObj->range.as_byte);
+ EventObjectMoveDestCoords(eventObj, eventObj->range.as_byte, &x, &y);
+
+ if (LinkPlayerDetectCollision(linkPlayerEventObj->eventObjId, eventObj->range.as_byte, x, y))
+ {
+ return 0;
+ }
+ else
+ {
+ eventObj->directionSequenceIndex = 16;
+ ShiftEventObjectCoords(eventObj, x, y);
+ EventObjectUpdateZCoord(eventObj);
+ return 1;
+ }
+}
+
+static u8 sub_8087A88(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+{
+ eventObj->range.as_byte = npc_something3(a3, eventObj->range.as_byte);
+ return 0;
+}
+
+static void sub_8087AA0(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj)
+{
+ linkPlayerEventObj->mode = 0;
+}
+
+static void sub_8087AA8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj)
+{
+ eventObj->directionSequenceIndex--;
+ linkPlayerEventObj->mode = 1;
+ MoveCoords(eventObj->range.as_byte, &eventObj->initialCoords.x, &eventObj->initialCoords.y);
+ if (!eventObj->directionSequenceIndex)
+ {
+ ShiftStillEventObjectCoords(eventObj);
+ linkPlayerEventObj->mode = 2;
+ }
+}
+
+static u8 npc_something3(u8 a1, u8 a2)
+{
+ switch (a1 - 1)
+ {
+ case 0:
+ case 6:
+ return 2;
+ case 1:
+ case 7:
+ return 1;
+ case 2:
+ case 8:
+ return 3;
+ case 3:
+ case 9:
+ return 4;
+ }
+ return a2;
+}
+
+static u8 LinkPlayerDetectCollision(u8 selfEventObjId, u8 a2, s16 x, s16 y)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ {
+ if (i != selfEventObjId)
+ {
+ if ((gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y)
+ || (gEventObjects[i].previousCoords.x == x && gEventObjects[i].previousCoords.y == y))
+ {
+ return 1;
+ }
+ }
+ }
+ return MapGridIsImpassableAt(x, y);
+}
+
+static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion)
+{
+ struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId];
+ u8 eventObjId = linkPlayerEventObj->eventObjId;
+ struct EventObject *eventObj = &gEventObjects[eventObjId];
+ struct Sprite *sprite;
+
+ if (linkPlayerEventObj->active)
+ {
+ switch (gameVersion)
+ {
+ case VERSION_FIRE_RED:
+ case VERSION_LEAF_GREEN:
+ eventObj->spriteId = AddPseudoEventObject(sub_808BD6C(eventObj->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0);
+ break;
+ case VERSION_RUBY:
+ case VERSION_SAPPHIRE:
+ eventObj->spriteId = AddPseudoEventObject(sub_808BD7C(eventObj->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0);
+ break;
+ case VERSION_EMERALD:
+ eventObj->spriteId = AddPseudoEventObject(GetRivalAvatarGraphicsIdByStateIdAndGender(0, eventObj->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0);
+ break;
+ }
+
+ sprite = &gSprites[eventObj->spriteId];
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[0] = linkPlayerId;
+ eventObj->triggerGroundEffectsOnMove = 0;
+ }
+}
+
+static void SpriteCB_LinkPlayer(struct Sprite *sprite)
+{
+ struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[sprite->data[0]];
+ struct EventObject *eventObj = &gEventObjects[linkPlayerEventObj->eventObjId];
+ sprite->pos1.x = eventObj->initialCoords.x;
+ sprite->pos1.y = eventObj->initialCoords.y;
+ SetObjectSubpriorityByZCoord(eventObj->previousElevation, sprite, 1);
+ sprite->oam.priority = ZCoordToPriority(eventObj->previousElevation);
+
+ if (!linkPlayerEventObj->mode)
+ StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObj->range.as_byte));
+ else
+ StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(eventObj->range.as_byte));
+
+ UpdateEventObjectSpriteVisibility(sprite, 0);
+ if (eventObj->triggerGroundEffectsOnMove)
+ {
+ sprite->invisible = ((sprite->data[7] & 4) >> 2);
+ sprite->data[7]++;
+ }
+}
diff --git a/src/palette.c b/src/palette.c
index d4bb593da..fd4ad32ad 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -4,6 +4,7 @@
#include "decompress.h"
#include "gpu_regs.h"
#include "task.h"
+#include "constants/rgb.h"
enum
{
@@ -65,7 +66,8 @@ static const struct PaletteStructTemplate gDummyPaletteStructTemplate = {
.uid = 0xFFFF,
.pst_field_B_5 = 1
};
-static const u8 gUnknown_0852489C[] = {
+
+static const u8 sRoundedDownGrayscaleMap[] = {
0, 0, 0, 0, 0,
5, 5, 5, 5, 5,
11, 11, 11, 11, 11,
@@ -620,7 +622,7 @@ static u8 UpdateFastPaletteFade(void)
gPlttBufferFaded[i] = r | (g << 5) | (b << 10);
}
break;
- case FAST_FADE_OUT_TO_WHTIE:
+ case FAST_FADE_OUT_TO_WHITE:
for (i = paletteOffsetStart; i < paletteOffsetEnd; i++)
{
struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i];
@@ -701,7 +703,7 @@ static u8 UpdateFastPaletteFade(void)
case FAST_FADE_IN_FROM_BLACK:
CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE);
break;
- case FAST_FADE_OUT_TO_WHTIE:
+ case FAST_FADE_OUT_TO_WHITE:
CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE);
break;
case FAST_FADE_OUT_TO_BLACK:
@@ -838,292 +840,94 @@ void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color)
void TintPalette_GrayScale(u16 *palette, u16 count)
{
- s32 r;
- s32 g;
- s32 b;
- s32 gray;
+ s32 r, g, b, i;
+ u32 gray;
- int i;
for (i = 0; i < count; i++)
{
- r = *palette & 0x1F;
- g = (*palette >> 5) & 0x1F;
+ r = (*palette >> 0) & 0x1F;
+ g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
-
- r *= 0x4C;
- r += g * 0x97;
- r += b * 0x1D;
-
- gray = r >> 8;
-
- *palette++ = gray << 10 | gray << 5 | gray;
+
+ gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
+
+ *palette++ = (gray << 10) | (gray << 5) | (gray << 0);
}
- return;
}
void TintPalette_GrayScale2(u16 *palette, u16 count)
{
- s32 r;
- s32 g;
- s32 b;
- s32 gray;
+ s32 r, g, b, i;
+ u32 gray;
- int i;
for (i = 0; i < count; i++)
{
- r = *palette & 0x1F;
- g = (*palette >> 5) & 0x1F;
+ r = (*palette >> 0) & 0x1F;
+ g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
-
- r *= 0x4C;
- r += g * 0x97;
- r += b * 0x1D;
-
- gray = r >> 8;
-
- if ((u32)gray > 0x1F)
+
+ gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
+
+ if (gray > 0x1F)
gray = 0x1F;
-
- gray = gUnknown_0852489C[gray];
-
- *palette++ = gray << 10 | gray << 5 | gray;
+
+ gray = sRoundedDownGrayscaleMap[gray];
+
+ *palette++ = (gray << 10) | (gray << 5) | (gray << 0);
}
- return;
}
-#ifdef NONMATCHING
void TintPalette_SepiaTone(u16 *palette, u16 count)
{
- s32 r;
- s32 g;
- s32 b;
+ s32 r, g, b, i;
u32 gray;
- u32 sepia;
- s8 r2;
- s8 g2;
- s8 b2;
- int i;
for (i = 0; i < count; i++)
{
- r = *palette & 0x1F;
- g = (*palette >> 5) & 0x1F;
+ r = (*palette >> 0) & 0x1F;
+ g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
-
- r *= 0x4C;
- r += g * 0x97;
- r += b * 0x1D;
-
- gray = (s32)(r >> 8);
-
- sepia = (gray * 0x133);
-
- r2 = (u16)sepia >> 8;
-
- g2 = gray;
-
- b2 = (gray * 15);
-
- if (r2 > 0x1F)
- r2 = 0x1F;
-
- *palette++ = b2 << 10 | g2 << 5 | r2;
+
+ gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
+
+ r = (u16)((Q_8_8(1.2) * gray)) >> 8;
+ g = (u16)((Q_8_8(1.0) * gray)) >> 8;
+ b = (u16)((Q_8_8(0.94) * gray)) >> 8;
+
+ if (r > 31)
+ r = 31;
+
+ *palette++ = (b << 10) | (g << 5) | (r << 0);
}
- return;
}
-#else
-__attribute__((naked))
-void TintPalette_SepiaTone(u16 *palette, u16 count)
-{
- asm("push {r4-r7,lr}\n\
- add r5, r0, #0\n\
- lsl r1, #16\n\
- lsr r1, #16\n\
- cmp r1, #0\n\
- beq _080A2BA2\n\
- mov r7, #0x1F\n\
- add r6, r1, #0\n\
-_080A2B50:\n\
- ldrh r0, [r5]\n\
- mov r1, #0x1F\n\
- and r1, r0\n\
- lsl r0, #16\n\
- lsr r2, r0, #21\n\
- and r2, r7\n\
- lsr r3, r0, #26\n\
- and r3, r7\n\
- mov r0, #0x4C\n\
- mul r1, r0\n\
- mov r0, #0x97\n\
- mul r0, r2\n\
- add r1, r0\n\
- lsl r0, r3, #3\n\
- sub r0, r3\n\
- lsl r0, #2\n\
- add r0, r3\n\
- add r1, r0\n\
- asr r1, #8\n\
- ldr r0, =0x00000133\n\
- mul r0, r1\n\
- lsl r0, #16\n\
- lsr r2, r0, #24\n\
- lsl r0, r1, #24\n\
- lsr r4, r0, #24\n\
- lsl r0, r1, #4\n\
- sub r0, r1\n\
- lsl r0, #20\n\
- lsr r3, r0, #24\n\
- cmp r2, #0x1F\n\
- ble _080A2B90\n\
- mov r2, #0x1F\n\
-_080A2B90:\n\
- lsl r0, r3, #10\n\
- lsl r1, r4, #5\n\
- orr r0, r1\n\
- orr r0, r2\n\
- strh r0, [r5]\n\
- add r5, #0x2\n\
- sub r6, #0x1\n\
- cmp r6, #0\n\
- bne _080A2B50\n\
-_080A2BA2:\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool");
-}
-#endif // NONMATCHING
-#ifdef NONMATCHING
-void sub_80A2BAC(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5)
+void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone)
{
- s32 r;
- s32 g;
- s32 b;
- s32 gray;
- u8 r2;
- u8 g2;
- u8 b2;
+ s32 r, g, b, i;
+ u32 gray;
- int i;
for (i = 0; i < count; i++)
{
- r = *palette & 0x1F;
- g = (*palette >> 5) & 0x1F;
+ r = (*palette >> 0) & 0x1F;
+ g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
-
- r *= 0x4C;
- r += g * 0x97;
- r += b * 0x1D;
-
- gray = r >> 8;
-
- r2 = (u16)(gray * a3) >> 8;
-
- g2 = (u16)(gray * a4) >> 8;
-
- b2 = (u16)(gray * a5) >> 8;
-
- if (r2 > 0x1F)
- r2 = 0x1F;
-
- if (g2 > 0x1F)
- g2 = 0x1F;
-
- if (b2 > 0x1F)
- b2 = 0x1F;
-
- *palette++ = b2 << 10 | g2 << 5 | r2;
+
+ gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
+
+ r = (u16)((rTone * gray)) >> 8;
+ g = (u16)((gTone * gray)) >> 8;
+ b = (u16)((bTone * gray)) >> 8;
+
+ if (r > 31)
+ r = 31;
+ if (g > 31)
+ g = 31;
+ if (b > 31)
+ b = 31;
+
+ *palette++ = (b << 10) | (g << 5) | (r << 0);
}
- return;
-}
-#else
-__attribute__((naked))
-void sub_80A2BAC(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5)
-{
- asm("push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- add r5, r0, #0\n\
- ldr r0, [sp, #0x1C]\n\
- lsl r1, #16\n\
- lsr r1, #16\n\
- lsl r2, #16\n\
- lsr r2, #16\n\
- mov r9, r2\n\
- lsl r3, #16\n\
- lsr r3, #16\n\
- mov r8, r3\n\
- lsl r0, #16\n\
- lsr r0, #16\n\
- mov r12, r0\n\
- cmp r1, #0\n\
- beq _080A2C38\n\
- mov r7, #0x1F\n\
- add r6, r1, #0\n\
-_080A2BD6:\n\
- ldrh r0, [r5]\n\
- mov r1, #0x1F\n\
- and r1, r0\n\
- lsl r0, #16\n\
- lsr r2, r0, #21\n\
- and r2, r7\n\
- lsr r3, r0, #26\n\
- and r3, r7\n\
- mov r0, #0x4C\n\
- mul r1, r0\n\
- mov r0, #0x97\n\
- mul r0, r2\n\
- add r1, r0\n\
- lsl r0, r3, #3\n\
- sub r0, r3\n\
- lsl r0, #2\n\
- add r0, r3\n\
- add r1, r0\n\
- asr r1, #8\n\
- mov r0, r9\n\
- mul r0, r1\n\
- lsl r0, #16\n\
- lsr r4, r0, #24\n\
- mov r0, r8\n\
- mul r0, r1\n\
- lsl r0, #16\n\
- lsr r2, r0, #24\n\
- mov r0, r12\n\
- mul r0, r1\n\
- lsl r0, #16\n\
- lsr r3, r0, #24\n\
- cmp r4, #0x1F\n\
- ble _080A2C1A\n\
- mov r4, #0x1F\n\
-_080A2C1A:\n\
- cmp r2, #0x1F\n\
- ble _080A2C20\n\
- mov r2, #0x1F\n\
-_080A2C20:\n\
- cmp r3, #0x1F\n\
- ble _080A2C26\n\
- mov r3, #0x1F\n\
-_080A2C26:\n\
- lsl r0, r3, #10\n\
- lsl r1, r2, #5\n\
- orr r0, r1\n\
- orr r0, r4\n\
- strh r0, [r5]\n\
- add r5, #0x2\n\
- sub r6, #0x1\n\
- cmp r6, #0\n\
- bne _080A2BD6\n\
-_080A2C38:\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0");
}
-#endif
void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7)
{
@@ -1153,7 +957,7 @@ void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7)
gTasks[taskId].func(taskId);
}
-u32 sub_80A2CF8(u8 var)
+bool32 sub_80A2CF8(u8 var)
{
int i;
@@ -1181,7 +985,7 @@ void sub_80A2D54(u8 taskId)
{
u32 wordVar;
s16 *data;
- u16 temp;
+ s16 temp;
data = gTasks[taskId].data;
wordVar = GetWordTaskArg(taskId, 5);
@@ -1191,7 +995,7 @@ void sub_80A2D54(u8 taskId)
data[4] = 0;
BlendPalettes(wordVar, data[0], data[7]);
temp = data[1];
- if (data[0] == (s16)temp)
+ if (data[0] == temp)
{
DestroyTask(taskId);
}
@@ -1200,12 +1004,12 @@ void sub_80A2D54(u8 taskId)
data[0] += data[2];
if (data[2] >= 0)
{
- if (data[0] < (s16)temp)
+ if (data[0] < temp)
{
return;
}
}
- else if (data[0] > (s16)temp)
+ else if (data[0] > temp)
{
return;
}
diff --git a/src/player_pc.c b/src/player_pc.c
new file mode 100644
index 000000000..ba18b45ab
--- /dev/null
+++ b/src/player_pc.c
@@ -0,0 +1,1360 @@
+#include "global.h"
+#include "constants/songs.h"
+#include "bg.h"
+#include "decoration.h"
+#include "event_scripts.h"
+#include "field_fadetransition.h"
+#include "event_object_movement.h"
+#include "field_screen.h"
+#include "field_weather.h"
+#include "international_string_util.h"
+#include "item.h"
+#include "item_icon.h"
+#include "item_menu.h"
+#include "constants/items.h"
+#include "list_menu.h"
+#include "mail.h"
+#include "main.h"
+#include "malloc.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokenav.h"
+#include "player_pc.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "window.h"
+
+// structures
+struct Struct203BCC4
+{
+ struct ListMenuItem unk0[51];
+ u8 unk198[51][0x18];
+ u8 windowIds[6];
+ u8 unk666;
+ u8 spriteId;
+ u8 spriteIds[7];
+};
+
+// static functions
+static void InitPlayerPCMenu(u8 taskId);
+static void PlayerPCProcessMenuInput(u8 taskId);
+static void InitItemStorageMenu(u8 taskId, u8 var);
+
+static u8 GetMailboxMailCount(void);
+static void Mailbox_UpdateMailList(void);
+static void Mailbox_DrawMailboxMenu(u8 taskId);
+static void Mailbox_ProcessInput(u8 taskId);
+static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId);
+static void Mailbox_ReturnToPlayerPC(u8);
+static void Mailbox_PrintMailOptions(u8 taskId);
+static void Mailbox_MailOptionsProcessInput(u8 taskId);
+
+static void PlayerPC_ItemStorage(u8 taskId);
+static void PlayerPC_Mailbox(u8 taskId);
+static void PlayerPC_Decoration(u8 var);
+static void PlayerPC_TurnOff(u8 taskId);
+
+static void Mailbox_DoMailMoveToBag(u8 taskId);
+static void Mailbox_DoMailRead(u8 taskId);
+static void Mailbox_MoveToBag(u8 taskId);
+static void Mailbox_Give(u8 taskId);
+static void Mailbox_Cancel(u8 taskId);
+
+static void Mailbox_CancelMoveToBag(u8 taskId);
+static void Mailbox_MoveToBagYesNoPrompt(u8 taskId);
+static void Mailbox_DrawYesNoBeforeMove(u8 taskId);
+static void Mailbox_DoGiveMailPokeMenu(u8 taskId);
+static void Mailbox_NoPokemonForMail(u8 taskId);
+
+static void Mailbox_FadeAndReadMail(u8 taskId);
+static void Mailbox_ReturnToFieldFromReadMail(void);
+static void Mailbox_DoRedrawMailboxMenuAfterReturn(void);
+static void pal_fill_for_maplights_or_black(void);
+static void Mailbox_HandleReturnToProcessInput(u8 taskId);
+static void Mailbox_UpdateMailListAfterDeposit(void);
+
+static void ItemStorage_Withdraw(u8 taskId);
+static void ItemStorage_Deposit(u8 taskId);
+static void ItemStorage_Toss(u8 taskId);
+static void ItemStorage_Exit(u8 taskId);
+static void ItemStorage_ResumeInputFromYesToss(u8 taskId);
+static void ItemStorage_ResumeInputFromNoToss(u8 taskId);
+
+static void ItemStorageMenuPrint(const u8 *);
+static void ItemStorageMenuProcessInput(u8 taskId);
+static void ItemStorage_ProcessWithdrawTossInput(u8 taskId);
+static void ItemStorage_SetItemAndMailCount(u8);
+static void ItemStorage_HandleReturnToProcessInput(u8 taskId);
+
+static void ItemStorage_WithdrawToss_Helper(u8 taskId, bool8 toss);
+static void Task_ItemStorage_Deposit(u8 taskId);
+static void ItemStorage_DoItemWithdraw(u8 taskId);
+static void ItemStorage_DoItemToss(u8 taskid);
+static void ItemStorage_HandleQuantityRolling(u8 taskid);
+static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId);
+static void ItemStorage_ItemSwapChoosePrompt(u8 taskId);
+static void ItemStorage_DoItemAction(u8 taskId);
+static void ItemStorage_ProcessInput(u8 taskId);
+static void ItemStorage_DoItemSwap(u8 taskId, bool8 a);
+static void ItemStorage_HandleRemoveItem(u8 taskId);
+static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId);
+static void ItemStorage_StartScrollIndicatorAndProcessInput(u8 taskId);
+
+static const u8* ItemStorage_GetItemPcResponse(u16);
+static void CopyItemName_PlayerPC(u8 *string, u16 itemId);
+
+static void sub_816BC14(void);
+static void sub_816BFE0(u8 y, u8, u8 speed);
+static void sub_816BCC4(u8);
+static void sub_816C690(u8);
+static void sub_816C4FC(u8 taskId);
+static void sub_816C0C8(void);
+static void sub_816C060(u16 itemId);
+static void sub_816BEF0(s32 id);
+static void sub_816B4DC(u8 taskId);
+static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu * thisMenu);
+static void fish4_goto_x5_or_x6(u8 windowId, s32 id, u8 yOffset);
+
+// EWRAM
+static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL;
+static EWRAM_DATA u8 gPcItemMenuOptionsNum = 0;
+EWRAM_DATA struct PlayerPCItemPageStruct playerPCItemPageInfo = {0, 0, 0, 0, {0, 0, 0}, 0};
+static EWRAM_DATA struct Struct203BCC4 *gUnknown_0203BCC4 = NULL;
+
+// .rodata
+static const u8 *const gPCText_OptionDescList[] =
+{
+ gText_TakeOutItemsFromPC,
+ gText_StoreItemsInPC,
+ gText_ThrowAwayItemsInPC,
+ gText_GoBackPrevMenu,
+};
+
+static const struct MenuAction sPlayerPCMenuActions[] =
+{
+ { gText_ItemStorage, PlayerPC_ItemStorage },
+ { gText_Mailbox, PlayerPC_Mailbox },
+ { gText_Decoration, PlayerPC_Decoration },
+ { gText_TurnOff, PlayerPC_TurnOff }
+};
+
+static const u8 gBedroomPC_OptionOrder[] =
+{
+ PLAYERPC_MENU_ITEMSTORAGE,
+ PLAYERPC_MENU_MAILBOX,
+ PLAYERPC_MENU_DECORATION,
+ PLAYERPC_MENU_TURNOFF
+};
+
+static const u8 gPlayerPC_OptionOrder[] =
+{
+ PLAYERPC_MENU_ITEMSTORAGE,
+ PLAYERPC_MENU_MAILBOX,
+ PLAYERPC_MENU_TURNOFF
+};
+
+static const struct MenuAction gPCText_ItemPCOptionsText[] =
+{
+ { gText_WithdrawItem, ItemStorage_Withdraw },
+ { gText_DepositItem, ItemStorage_Deposit },
+ { gText_TossItem, ItemStorage_Toss },
+ { gText_Cancel, ItemStorage_Exit }
+};
+
+static const struct ItemSlot gNewGamePCItems[] =
+{
+ { ITEM_POTION, 1 },
+ { ITEM_NONE, 0 }
+};
+
+const struct MenuAction gMailboxMailOptions[] =
+{
+ { gText_Read, Mailbox_DoMailRead },
+ { gText_MoveToBag, Mailbox_MoveToBag },
+ { gText_Give2, Mailbox_Give },
+ { gText_Cancel2, Mailbox_Cancel }
+};
+
+static const struct WindowTemplate gUnknown_085DFF24[3] =
+{
+ {0x00, 0x01, 0x01, 0x09, 0x06, 0x0F, 0x0001},
+ {0x00, 0x01, 0x01, 0x09, 0x08, 0x0F, 0x0001},
+ {0x00, 0x01, 0x01, 0x0A, 0x08, 0x0F, 0x0001}
+};
+
+static const struct YesNoFuncTable ResumeFromWithdrawYesNoFuncList = // ResumeFromWithdrawYesNoFuncList
+{
+ ItemStorage_ResumeInputFromYesToss,
+ ItemStorage_ResumeInputFromNoToss
+};
+
+static const struct ListMenuTemplate gUnknown_085DFF44 = {
+ NULL,
+ ItemStorage_MoveCursor,
+ fish4_goto_x5_or_x6,
+ 0, 0,
+ 0, 0, 8, 0,
+ 9, 2, 1, 3, FALSE, 0, FALSE, 7
+};
+
+static const struct WindowTemplate gUnknown_085DFF5C[5] =
+{
+ {0x00, 0x10, 0x01, 0x0D, 0x12, 0x0F, 0x0001},
+ {0x00, 0x01, 0x0D, 0x0D, 0x06, 0x0F, 0x00EB},
+ {0x00, 0x01, 0x08, 0x03, 0x03, 0x0F, 0x0153},
+ {0x00, 0x01, 0x01, 0x0D, 0x02, 0x0F, 0x0139},
+ {0x00, 0x08, 0x09, 0x06, 0x02, 0x0F, 0x015C}
+};
+
+static const struct WindowTemplate gUnknown_085DFF84 =
+{
+ 0x00, 0x09, 0x07, 0x05, 0x04, 0x0F, 0x0168
+};
+
+static const u8 gUnknown_085DFF8C[] = {0x01, 0x03, 0x02, 0x00};
+
+// text
+void NewGameInitPCItems(void)
+{
+ u8 i;
+
+ // because Game Freak don't know how to use a struct or a 2d array
+ for(i = 0, ClearItemSlots(gSaveBlock1Ptr->pcItems, ARRAY_COUNT(gSaveBlock1Ptr->pcItems)); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) &&
+ AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++);
+}
+
+void BedroomPC(void)
+{
+ gPcItemMenuOptionOrder = gBedroomPC_OptionOrder;
+ gPcItemMenuOptionsNum = 4;
+ DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gText_WhatWouldYouLike, InitPlayerPCMenu);
+}
+
+void PlayerPC(void)
+{
+ gPcItemMenuOptionOrder = gPlayerPC_OptionOrder;
+ gPcItemMenuOptionsNum = 3;
+ DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gText_WhatWouldYouLike, InitPlayerPCMenu);
+}
+
+static void InitPlayerPCMenu(u8 taskId)
+{
+ u16 *data;
+ struct WindowTemplate windowTemplate;
+
+ data = gTasks[taskId].data;
+ if(gPcItemMenuOptionsNum == 3)
+ windowTemplate = gUnknown_085DFF24[0];
+ else
+ windowTemplate = gUnknown_085DFF24[1];
+ windowTemplate.width = sub_81DB3D8(sPlayerPCMenuActions, gPcItemMenuOptionOrder, gPcItemMenuOptionsNum);
+ data[4] = AddWindow(&windowTemplate);
+ SetStandardWindowBorderStyle(data[4], 0);
+ sub_81995E4(data[4], gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[4], gPcItemMenuOptionsNum, 0);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = PlayerPCProcessMenuInput;
+}
+
+static void PlayerPCProcessMenuInput(u8 taskId)
+{
+ u16 *data;
+ s8 inputOptionId;
+
+ data = gTasks[taskId].data;
+ if(gPcItemMenuOptionsNum > 3)
+ inputOptionId = ProcessMenuInput();
+ else
+ inputOptionId = ProcessMenuInputNoWrapAround();
+
+ switch(inputOptionId)
+ {
+ case -2:
+ break;
+ case -1:
+ PlaySE(SE_SELECT);
+ sub_8198070(data[4], FALSE);
+ ClearWindowTilemap(data[4]);
+ RemoveWindow(data[4]);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = PlayerPC_TurnOff;
+ break;
+ default:
+ sub_8198070(data[4], FALSE);
+ ClearWindowTilemap(data[4]);
+ RemoveWindow(data[4]);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = sPlayerPCMenuActions[gPcItemMenuOptionOrder[inputOptionId]].func.void_u8;
+ break;
+ }
+}
+
+void ReshowPlayerPC(u8 var)
+{
+ DisplayItemMessageOnField(var, gText_WhatWouldYouLike, InitPlayerPCMenu);
+}
+
+static void PlayerPC_ItemStorage(u8 taskId)
+{
+ InitItemStorageMenu(taskId, ITEMPC_MENU_WITHDRAW);
+ gTasks[taskId].func = ItemStorageMenuProcessInput;
+}
+
+static void PlayerPC_Mailbox(u8 taskId)
+{
+ playerPCItemPageInfo.count = GetMailboxMailCount();
+
+ if (playerPCItemPageInfo.count == 0)
+ DisplayItemMessageOnField(taskId, gText_NoMailHere, ReshowPlayerPC);
+ else
+ {
+ playerPCItemPageInfo.cursorPos = 0;
+ playerPCItemPageInfo.itemsAbove = 0;
+ playerPCItemPageInfo.scrollIndicatorId = 0xFF;
+ Mailbox_UpdateMailList();
+ ItemStorage_SetItemAndMailCount(taskId);
+ if(sub_81D1C44(playerPCItemPageInfo.count) == TRUE)
+ {
+ sub_8197434(0, 0);
+ Mailbox_DrawMailboxMenu(taskId);
+ gTasks[taskId].func = Mailbox_ProcessInput;
+ }
+ else
+ DisplayItemMessageOnField(taskId, gText_NoMailHere, ReshowPlayerPC);
+ }
+}
+
+static void PlayerPC_Decoration(u8 var)
+{
+ sub_8126B2C(var); //DoPlayerPCDecoration(var);
+}
+
+static void PlayerPC_TurnOff(u8 taskId)
+{
+ if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC and not player PC, so do gender specific handling.
+ {
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ ScriptContext1_SetupScript(LittlerootTown_BrendansHouse_2F_EventScript_1F863F);
+ else
+ ScriptContext1_SetupScript(LittlerootTown_MaysHouse_2F_EventScript_1F958F);
+ }
+ else
+ {
+ EnableBothScriptContexts();
+ }
+ DestroyTask(taskId);
+}
+
+static void InitItemStorageMenu(u8 taskId, u8 var)
+{
+ u16 *data;
+ struct WindowTemplate windowTemplate;
+
+ data = gTasks[taskId].data;
+ windowTemplate = gUnknown_085DFF24[2];
+ windowTemplate.width = GetMaxWidthInMenuTable(gPCText_ItemPCOptionsText, 4);
+ data[4] = AddWindow(&windowTemplate);
+ SetStandardWindowBorderStyle(data[4], 0);
+ PrintMenuTable(data[4], 4, gPCText_ItemPCOptionsText);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[4], 4, var);
+ schedule_bg_copy_tilemap_to_vram(0);
+ ItemStorageMenuPrint(gPCText_OptionDescList[var]);
+}
+
+static void ItemStorageMenuPrint(const u8 *textPtr)
+{
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ PrintTextOnWindow(0, 1, textPtr, 0, 1, 0, 0);
+}
+
+static void ItemStorageMenuProcessInput(u8 taskId)
+{
+ s8 r5;
+ s8 r2;
+ s8 inputOptionId;
+
+ r5 = GetMenuCursorPos();
+ inputOptionId = ProcessMenuInput();
+ r2 = GetMenuCursorPos();
+ switch(inputOptionId)
+ {
+ case -2:
+ if (r5 != r2)
+ ItemStorageMenuPrint(gPCText_OptionDescList[r2]);
+ break;
+ case -1:
+ PlaySE(SE_SELECT);
+ ItemStorage_Exit(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ gPCText_ItemPCOptionsText[inputOptionId].func.void_u8(taskId);
+ break;
+ }
+}
+
+static void ItemStorage_Deposit(u8 taskId)
+{
+ gTasks[taskId].func = Task_ItemStorage_Deposit;
+ FadeScreen(1, 0);
+}
+
+static void Task_ItemStorage_Deposit(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ overworld_free_bg_tilemaps();
+ sub_81AAC14();
+ DestroyTask(taskId);
+ }
+}
+
+void sub_816B31C(void)
+{
+ gFieldCallback = Mailbox_DoRedrawMailboxMenuAfterReturn;
+ SetMainCallback2(CB2_ReturnToField);
+}
+
+void Mailbox_DoRedrawMailboxMenuAfterReturn(void)
+{
+ sub_81973A4();
+ NewMenuHelpers_DrawDialogueFrame(0, 1);
+ InitItemStorageMenu(CreateTask(ItemStorage_HandleReturnToProcessInput, 0), 1);
+ pal_fill_black();
+}
+
+static void ItemStorage_HandleReturnToProcessInput(u8 taskId)
+{
+ if (IsWeatherNotFadingIn() == TRUE)
+ gTasks[taskId].func = ItemStorageMenuProcessInput;
+}
+
+static void ItemStorage_Withdraw(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ NUM_ITEMS = CountUsedPCItemSlots();
+ if (NUM_ITEMS != 0)
+ ItemStorage_WithdrawToss_Helper(taskId, FALSE);
+ else
+ {
+ sub_816B4DC(taskId);
+ DisplayItemMessageOnField(taskId, gText_NoItems, PlayerPC_ItemStorage);
+ }
+
+}
+
+static void ItemStorage_Toss(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ NUM_ITEMS = CountUsedPCItemSlots();
+ if (NUM_ITEMS != 0)
+ ItemStorage_WithdrawToss_Helper(taskId, TRUE);
+ else
+ {
+ sub_816B4DC(taskId);
+ DisplayItemMessageOnField(taskId, gText_NoItems, PlayerPC_ItemStorage);
+ }
+}
+
+static void ItemStorage_WithdrawToss_Helper(u8 taskId, bool8 toss)
+{
+ u16 *data = gTasks[taskId].data;
+
+ data[3] = toss;
+ sub_816B4DC(taskId);
+ playerPCItemPageInfo.cursorPos = 0;
+ playerPCItemPageInfo.itemsAbove = 0;
+ playerPCItemPageInfo.scrollIndicatorId = 0xFF;
+ ItemStorage_SetItemAndMailCount(taskId);
+ sub_816BC14();
+ gpu_pal_allocator_reset__manage_upper_four();
+ LoadListMenuArrowsGfx();
+ sub_8122344(gUnknown_0203BCC4->spriteIds, 7);
+ sub_8197434(0,0);
+ gTasks[taskId].func = ItemStorage_ProcessWithdrawTossInput;
+}
+
+static void ItemStorage_Exit(u8 taskId)
+{
+ sub_816B4DC(taskId);
+ ReshowPlayerPC(taskId);
+}
+
+
+static void ItemStorage_SetItemAndMailCount(u8 taskId)
+{
+ if (playerPCItemPageInfo.count > 7)
+ playerPCItemPageInfo.pageItems = 8;
+ else
+ playerPCItemPageInfo.pageItems = playerPCItemPageInfo.count + 1;
+}
+
+static void sub_816B4DC(u8 taskId)
+{
+ u16 *data = gTasks[taskId].data;
+
+ sub_8198070(data[4], FALSE);
+ ClearWindowTilemap(data[4]);
+ RemoveWindow(data[4]);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static u8 GetMailboxMailCount(void)
+{
+ u8 i, j;
+
+ for(i = 0, j = 6; j < 16; j++)
+ if(gSaveBlock1Ptr->mail[j].itemId != 0)
+ i++;
+
+ return i;
+}
+
+static void Mailbox_UpdateMailList(void)
+{
+ struct MailStruct mailBuffer;
+ u8 i, j;
+
+ for (i=6; i<15; i++)
+ {
+ for (j=i+1; j<16; j++)
+ {
+ if (gSaveBlock1Ptr->mail[i].itemId == 0)
+ {
+ mailBuffer = gSaveBlock1Ptr->mail[i];
+ gSaveBlock1Ptr->mail[i] = gSaveBlock1Ptr->mail[j];
+ gSaveBlock1Ptr->mail[j] = mailBuffer;
+ }
+ }
+ }
+}
+
+static void Mailbox_DrawMailboxMenu(u8 taskId)
+{
+ u8 windowId;
+
+ windowId = sub_81D1C84(0);
+ sub_81D1C84(1);
+ PrintTextOnWindow(windowId, 1, gText_Mailbox, GetStringCenterAlignXOffset(1, gText_Mailbox, 0x40), 1, 0, NULL);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].data[5] = sub_81D1DC0(&playerPCItemPageInfo);
+ sub_81D1E90(&playerPCItemPageInfo);
+}
+
+static void Mailbox_ProcessInput(u8 taskId)
+{
+ u16 *data = gTasks[taskId].data;
+ s32 inputOptionId;
+
+ if(!gPaletteFade.active)
+ {
+ inputOptionId = ListMenuHandleInputGetItemId(data[5]);
+ ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+
+ switch(inputOptionId)
+ {
+ case -1:
+ break;
+ case -2:
+ PlaySE(SE_SELECT);
+ RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId);
+ Mailbox_ReturnToPlayerPC(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sub_81D1D04(0);
+ sub_81D1D04(1);
+ DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+ schedule_bg_copy_tilemap_to_vram(0);
+ RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId);
+ gTasks[taskId].func = Mailbox_PrintWhatToDoWithPlayerMailText;
+ break;
+ }
+ }
+}
+
+static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId)
+{
+ StringCopy(gStringVar1, gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos].playerName);
+ sub_81DB554(gStringVar1, 0);
+ StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithVar1sMail);
+ DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions);
+}
+
+static void Mailbox_ReturnToPlayerPC(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ sub_81D1D04(0);
+ sub_81D1D04(1);
+ DestroyListMenuTask(data[5], NULL, NULL);
+ schedule_bg_copy_tilemap_to_vram(0);
+ sub_81D1EC0();
+ ReshowPlayerPC(taskId);
+}
+
+static void Mailbox_PrintMailOptions(u8 taskId)
+{
+ u8 r4 = sub_81D1C84(2);
+ PrintMenuTable(r4, 4, gMailboxMailOptions);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(r4, 4, 0);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = Mailbox_MailOptionsProcessInput;
+}
+
+static void Mailbox_MailOptionsProcessInput(u8 taskId)
+{
+ s8 inputOptionId = ProcessMenuInput_other();
+
+ switch(inputOptionId)
+ {
+ case -2:
+ break;
+ case -1:
+ PlaySE(SE_SELECT);
+ Mailbox_Cancel(taskId);
+ break;
+
+ default:
+ PlaySE(SE_SELECT);
+ gMailboxMailOptions[inputOptionId].func.void_u8(taskId);
+ break;
+ }
+}
+
+static void Mailbox_DoMailRead(u8 taskId)
+{
+ FadeScreen(1, 0);
+ gTasks[taskId].func = Mailbox_FadeAndReadMail;
+}
+
+static void Mailbox_FadeAndReadMail(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ sub_81D1EC0();
+ overworld_free_bg_tilemaps();
+ ReadMail(&(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]), Mailbox_ReturnToFieldFromReadMail, TRUE);
+ DestroyTask(taskId);
+ }
+}
+
+static void Mailbox_ReturnToFieldFromReadMail(void)
+{
+ gFieldCallback = pal_fill_for_maplights_or_black;
+ SetMainCallback2(CB2_ReturnToField);
+}
+
+static void pal_fill_for_maplights_or_black(void)
+{
+ u8 taskId;
+
+ sub_81973A4();
+ taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0);
+ if(sub_81D1C44(playerPCItemPageInfo.count) == TRUE)
+ Mailbox_DrawMailboxMenu(taskId);
+ else
+ DestroyTask(taskId);
+ pal_fill_black();
+}
+
+static void Mailbox_HandleReturnToProcessInput(u8 taskId)
+{
+ if(IsWeatherNotFadingIn() == TRUE)
+ gTasks[taskId].func = Mailbox_ProcessInput;
+}
+
+static void Mailbox_MoveToBag(u8 taskId)
+{
+ DisplayItemMessageOnField(taskId, gText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove);
+}
+
+static void Mailbox_DrawYesNoBeforeMove(u8 taskId)
+{
+ sub_8197930();
+ gTasks[taskId].func = Mailbox_MoveToBagYesNoPrompt;
+}
+
+static void Mailbox_MoveToBagYesNoPrompt(u8 taskId)
+{
+ switch(ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ Mailbox_DoMailMoveToBag(taskId);
+ break;
+ case -1:
+ PlaySE(SE_SELECT);
+ case 1:
+ Mailbox_CancelMoveToBag(taskId);
+ break;
+ case -2:
+ default:
+ break;
+ }
+}
+
+static void Mailbox_DoMailMoveToBag(u8 taskId)
+{
+ struct MailStruct *mailStruct = &(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]);
+ if(!AddBagItem(mailStruct->itemId, 1))
+ {
+ DisplayItemMessageOnField(taskId, gText_BagIsFull, Mailbox_Cancel);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gText_MailToBagMessageErased, Mailbox_Cancel);
+ ClearMailStruct(mailStruct);
+ Mailbox_UpdateMailList();
+ playerPCItemPageInfo.count--;
+ if(playerPCItemPageInfo.count < (playerPCItemPageInfo.pageItems + playerPCItemPageInfo.itemsAbove) && playerPCItemPageInfo.itemsAbove != 0)
+ playerPCItemPageInfo.itemsAbove--;
+ ItemStorage_SetItemAndMailCount(taskId);
+ }
+}
+
+static void Mailbox_CancelMoveToBag(u8 taskId)
+{
+ Mailbox_Cancel(taskId);
+}
+
+static void Mailbox_Give(u8 taskId)
+{
+ if(CalculatePlayerPartyCount() == 0)
+ Mailbox_NoPokemonForMail(taskId);
+ else
+ {
+ FadeScreen(1, 0);
+ gTasks[taskId].func = Mailbox_DoGiveMailPokeMenu;
+ }
+}
+
+static void Mailbox_DoGiveMailPokeMenu(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ sub_81D1EC0();
+ overworld_free_bg_tilemaps();
+ sub_81B8448();
+ DestroyTask(taskId);
+ }
+}
+
+void Mailbox_ReturnToMailListAfterDeposit(void)
+{
+ gFieldCallback = Mailbox_UpdateMailListAfterDeposit;
+ SetMainCallback2(CB2_ReturnToField);
+}
+
+static void Mailbox_UpdateMailListAfterDeposit(void)
+{
+ u8 taskId;
+ u8 prevCount;
+ taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0);
+ prevCount = playerPCItemPageInfo.count;
+ playerPCItemPageInfo.count = GetMailboxMailCount();
+ Mailbox_UpdateMailList();
+ if(prevCount != playerPCItemPageInfo.count && (playerPCItemPageInfo.count < (playerPCItemPageInfo.pageItems + playerPCItemPageInfo.itemsAbove))
+ && playerPCItemPageInfo.itemsAbove != 0)
+ playerPCItemPageInfo.itemsAbove--;
+ ItemStorage_SetItemAndMailCount(taskId);
+ sub_81973A4();
+ if(sub_81D1C44(playerPCItemPageInfo.count) == TRUE)
+ Mailbox_DrawMailboxMenu(taskId);
+ else
+ DestroyTask(taskId);
+ pal_fill_black();
+}
+
+static void Mailbox_NoPokemonForMail(u8 taskId)
+{
+ DisplayItemMessageOnField(taskId, gText_NoPokemon, Mailbox_Cancel);
+}
+
+static void Mailbox_Cancel(u8 taskId)
+{
+ sub_81D1D04(2);
+ sub_8197434(0, 0);
+ Mailbox_DrawMailboxMenu(taskId);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = Mailbox_ProcessInput;
+}
+
+static void sub_816BC14(void)
+{
+ gUnknown_0203BCC4 = AllocZeroed(sizeof(struct Struct203BCC4));
+ memset(gUnknown_0203BCC4->windowIds, 0xFF, 0x6);
+ gUnknown_0203BCC4->unk666 = 0xFF;
+ gUnknown_0203BCC4->spriteId = 0xFF;
+}
+
+static void sub_816BC58(void)
+{
+ u32 i;
+
+ for(i = 0; i < 6; i++)
+ sub_816BCC4(i);
+ Free(gUnknown_0203BCC4);
+}
+
+static u8 sub_816BC7C(u8 a)
+{
+ u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]);
+ if(*windowIdLoc == 0xFF)
+ {
+ *windowIdLoc = AddWindow(&gUnknown_085DFF5C[a]);
+ SetWindowBorderStyle(*windowIdLoc, FALSE, 0x214, 0xE);
+ schedule_bg_copy_tilemap_to_vram(0);
+ }
+ return *windowIdLoc;
+}
+
+static void sub_816BCC4(u8 a)
+{
+ u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]);
+ if(*windowIdLoc != 0xFF)
+ {
+ sub_8198070(*windowIdLoc, FALSE);
+ ClearWindowTilemap(*windowIdLoc);
+ schedule_bg_copy_tilemap_to_vram(0);
+ RemoveWindow(*windowIdLoc);
+ *windowIdLoc = 0xFF;
+ }
+}
+
+void ItemStorage_RefreshListMenu(void)
+{
+ u16 i;
+
+ for(i = 0; i < playerPCItemPageInfo.count - 1; i++)
+ {
+ CopyItemName_PlayerPC(&(gUnknown_0203BCC4->unk198[i][0]), gSaveBlock1Ptr->pcItems[i].itemId);
+ gUnknown_0203BCC4->unk0[i].name = &(gUnknown_0203BCC4->unk198[i][0]);
+ gUnknown_0203BCC4->unk0[i].id = i;
+ }
+ StringCopy(&(gUnknown_0203BCC4->unk198[i][0]) ,gText_Cancel2);
+ gUnknown_0203BCC4->unk0[i].name = &(gUnknown_0203BCC4->unk198[i][0]);
+ gUnknown_0203BCC4->unk0[i].id = -2;
+ gMultiuseListMenuTemplate = gUnknown_085DFF44;
+ gMultiuseListMenuTemplate.windowId = sub_816BC7C(0);
+ gMultiuseListMenuTemplate.totalItems = playerPCItemPageInfo.count;
+ gMultiuseListMenuTemplate.items = gUnknown_0203BCC4->unk0;
+ gMultiuseListMenuTemplate.maxShowed = playerPCItemPageInfo.pageItems;
+}
+
+void CopyItemName_PlayerPC(u8 *string, u16 itemId)
+{
+ CopyItemName(itemId, string);
+}
+
+static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu *thisMenu)
+{
+ if(b != TRUE)
+ PlaySE(SE_SELECT);
+ if(gUnknown_0203BCC4->unk666 == 0xFF)
+ {
+ sub_816C0C8();
+ if(id != -2)
+ sub_816C060(gSaveBlock1Ptr->pcItems[id].itemId);
+ else
+ sub_816C060(ITEMPC_GO_BACK_TO_PREV);
+ sub_816BEF0(id);
+ }
+}
+
+static void fish4_goto_x5_or_x6(u8 windowId, s32 id, u8 yOffset)
+{
+ if(id != -2)
+ {
+ if(gUnknown_0203BCC4->unk666 != 0xFF)
+ {
+ if(gUnknown_0203BCC4->unk666 == (u8)id)
+ sub_816BFE0(yOffset, 0, 0xFF);
+ else
+ sub_816BFE0(yOffset, 0xFF, 0xFF);
+ }
+ ConvertIntToDecimalStringN(gStringVar1, gSaveBlock1Ptr->pcItems[id].quantity, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gText_xVar1);
+ PrintTextOnWindow(windowId, 7, gStringVar4, GetStringRightAlignXOffset(7, gStringVar4, 104), yOffset, 0xFF, NULL);
+ }
+}
+
+static void sub_816BEF0(s32 id)
+{
+ const u8* description;
+ u8 windowId = gUnknown_0203BCC4->windowIds[1];
+
+ if(id != -2)
+ description = (u8 *)ItemId_GetDescription(gSaveBlock1Ptr->pcItems[id].itemId);
+ else
+ description = ItemStorage_GetItemPcResponse(ITEMPC_GO_BACK_TO_PREV);
+ FillWindowPixelBuffer(windowId, 17);
+ PrintTextOnWindow(windowId, 1, description, 0, 1, 0, NULL);
+}
+
+static void ItemStorage_StartScrollIndicator(void)
+{
+ if(playerPCItemPageInfo.scrollIndicatorId == 0xFF)
+ playerPCItemPageInfo.scrollIndicatorId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 0xC, 0x94, playerPCItemPageInfo.count - playerPCItemPageInfo.pageItems, 0x13F8, 0x13F8, &(playerPCItemPageInfo.itemsAbove));
+}
+
+static void ItemStorage_RemoveScrollIndicator(void)
+{
+ if(playerPCItemPageInfo.scrollIndicatorId != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId);
+ playerPCItemPageInfo.scrollIndicatorId = 0xFF;
+ }
+}
+
+static void sub_816BFB8(u8 a, u8 b, u8 speed)
+{
+ sub_816BFE0(ListMenuGetYCoordForPrintingArrowCursor(a), b, speed);
+}
+
+static void sub_816BFE0(u8 y, u8 b, u8 speed)
+{
+ u8 windowId = gUnknown_0203BCC4->windowIds[0];
+ if(b == 0xFF)
+ FillWindowPixelRect(windowId, 17, 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1));
+ else
+ AddTextPrinterParameterized2(windowId, 1, 0, y, 0, 0, gUnknown_085DFF8C, speed, gText_SelectorArrow2);
+}
+
+static void sub_816C060(u16 itemId)
+{
+ u8 spriteId;
+ u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId);
+
+ if(*spriteIdLoc == 0xFF)
+ {
+ FreeSpriteTilesByTag(0x13F6);
+ FreeSpritePaletteByTag(0x13F6);
+ spriteId = AddItemIconSprite(0x13F6, 0x13F6, itemId);
+ if(spriteId != 64)
+ {
+ *spriteIdLoc = spriteId;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].pos2.x = 24;
+ gSprites[spriteId].pos2.y = 80;
+ }
+ }
+}
+
+static void sub_816C0C8(void)
+{
+ u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId);
+ if(*spriteIdLoc != 0xFF)
+ {
+ FreeSpriteTilesByTag(0x13F6);
+ FreeSpritePaletteByTag(0x13F6);
+ DestroySprite(&(gSprites[*spriteIdLoc]));
+ *spriteIdLoc = 0xFF;
+ }
+}
+
+static void sub_816C110(void)
+{
+ CompactPCItems();
+ sub_812220C(gSaveBlock1Ptr->pcItems, 50, &(playerPCItemPageInfo.pageItems), &(playerPCItemPageInfo.count), 0x8);
+}
+
+static void sub_816C140(void)
+{
+ sub_812225C(&(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos), playerPCItemPageInfo.pageItems, playerPCItemPageInfo.count);
+}
+
+static void ItemStorage_ProcessWithdrawTossInput(u8 taskId)
+{
+ s16 *data;
+ bool32 toss;
+ u32 i, x;
+ u8 windowId;
+ const u8* text;
+
+ data = gTasks[taskId].data;
+ for(i = 0; i <=3; i++)
+ sub_816BC7C(i);
+ toss = data[3];
+ text = gText_TossItem;
+ if(!toss)
+ text = gText_WithdrawItem;
+ x = GetStringCenterAlignXOffset(1, text, 104);
+ PrintTextOnWindow(gUnknown_0203BCC4->windowIds[3], 1, text, x, 1, 0, NULL);
+ CopyWindowToVram(gUnknown_0203BCC4->windowIds[2], 2);
+ sub_816C110();
+ sub_816C140();
+ ItemStorage_RefreshListMenu();
+ data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos);
+ ItemStorage_StartScrollIndicator();
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = ItemStorage_ProcessInput;
+}
+
+static const u8* ItemStorage_GetItemPcResponse(u16 itemId)
+{
+ const u8 *string;
+
+ switch(itemId)
+ {
+ case ITEMPC_GO_BACK_TO_PREV:
+ string = gText_GoBackPrevMenu;
+ break;
+ case ITEMPC_HOW_MANY_TO_WITHDRAW:
+ string = gText_WithdrawHowManyItems;
+ break;
+ case ITEMPC_WITHDREW_THING:
+ string = gText_WithdrawXItems;
+ break;
+ case ITEMPC_HOW_MANY_TO_TOSS:
+ string = gText_TossHowManyVar1s;
+ break;
+ case ITEMPC_THREW_AWAY_ITEM:
+ string = gText_ThrewAwayVar2Var1s;
+ break;
+ case ITEMPC_NO_MORE_ROOM:
+ string = gText_NoRoomInBag;
+ break;
+ case ITEMPC_TOO_IMPORTANT:
+ string = gText_TooImportantToToss;
+ break;
+ case ITEMPC_OKAY_TO_THROW_AWAY:
+ string = gText_ConfirmTossItems;
+ break;
+ case ITEMPC_SWITCH_WHICH_ITEM:
+ string = gText_MoveVar1Where;
+ break;
+ default:
+ string = ItemId_GetDescription(itemId);
+ break;
+ }
+ return string;
+}
+
+static void ItemStorage_PrintItemPcResponse(const u8 *string)
+{
+ u8 windowId = gUnknown_0203BCC4->windowIds[1];
+ FillWindowPixelBuffer(windowId, 0x11);
+ StringExpandPlaceholders(gStringVar4, string);
+ PrintTextOnWindow(windowId, 1, gStringVar4, 0, 1, 0, NULL);
+}
+
+static void ItemStorage_ProcessInput(u8 taskId)
+{
+ s16 *data;
+ s32 id;
+
+ data = gTasks[taskId].data;
+ if(gMain.newKeys & SELECT_BUTTON)
+ {
+ ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+ if((playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos) != (playerPCItemPageInfo.count - 1))
+ {
+ PlaySE(SE_SELECT);
+ ItemStorage_ItemSwapChoosePrompt(taskId);
+ }
+ }
+ else
+ {
+ id = ListMenuHandleInputGetItemId(data[5]);
+ ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+ switch(id)
+ {
+ case -1:
+ break;
+ case -2:
+ PlaySE(SE_SELECT);
+ ItemStorage_GoBackToPlayerPCMenu(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ ItemStorage_DoItemAction(taskId);
+ break;
+ }
+ }
+}
+
+static void ItemStorage_GoBackToPlayerPCMenu_InitStorage(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ if(!IsDma3ManagerBusyWithBgCopy())
+ {
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ if(!data[3])
+ InitItemStorageMenu(taskId, ITEMPC_MENU_WITHDRAW);
+ else
+ InitItemStorageMenu(taskId, ITEMPC_MENU_TOSS);
+ gTasks[taskId].func = ItemStorageMenuProcessInput;
+ }
+}
+
+static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ sub_816C0C8();
+ ItemStorage_RemoveScrollIndicator();
+ DestroyListMenuTask(data[5], NULL, NULL);
+ sub_81223B0(gUnknown_0203BCC4->spriteIds, 7);
+ sub_816BC58();
+ gTasks[taskId].func = ItemStorage_GoBackToPlayerPCMenu_InitStorage;
+}
+
+static void ItemStorage_ItemSwapChoosePrompt(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ ListMenuSetUnkIndicatorsStructField(data[5], 16, 1);
+ gUnknown_0203BCC4->unk666 = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos);
+ sub_816BFB8(data[5], 0, 0);
+ sub_816C690(gUnknown_0203BCC4->unk666);
+ CopyItemName(gSaveBlock1Ptr->pcItems[gUnknown_0203BCC4->unk666].itemId, gStringVar1);
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM));
+ gTasks[taskId].func = sub_816C4FC;
+}
+
+static void sub_816C4FC(u8 taskId)
+{
+ s16 *data;
+ s32 id;
+
+ data = gTasks[taskId].data;
+ if(gMain.newKeys & SELECT_BUTTON)
+ {
+ ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+ ItemStorage_DoItemSwap(taskId, FALSE);
+ return;
+ }
+ id = ListMenuHandleInputGetItemId(data[5]);
+ ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+ sub_81223FC(gUnknown_0203BCC4->spriteIds, 7, 0);
+ sub_816C690(playerPCItemPageInfo.cursorPos);
+ switch(id)
+ {
+ case -1:
+ break;
+ case -2:
+ if(gMain.newKeys & A_BUTTON)
+ {
+ ItemStorage_DoItemSwap(taskId, FALSE);
+ }
+ else
+ ItemStorage_DoItemSwap(taskId, TRUE);
+ break;
+ default:
+ ItemStorage_DoItemSwap(taskId, FALSE);
+ break;
+ }
+}
+
+static void ItemStorage_DoItemSwap(u8 taskId, bool8 a)
+{
+ s16 *data;
+ u16 b;
+ u8 c;
+
+ data = gTasks[taskId].data;
+ b = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos);
+ PlaySE(SE_SELECT);
+ DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+ if(!a)
+ {
+ c = gUnknown_0203BCC4->unk666;
+ if(c != b)
+ {
+ if(c != b - 1)
+ {
+ MoveItemSlotInList(gSaveBlock1Ptr->pcItems, c, b);
+ ItemStorage_RefreshListMenu();
+ }
+ }
+ else
+ goto LABEL_SKIP_CURSOR_DECREMENT;
+ }
+ if (gUnknown_0203BCC4->unk666 < b)
+ playerPCItemPageInfo.cursorPos--;
+ LABEL_SKIP_CURSOR_DECREMENT:
+ sub_81223FC(gUnknown_0203BCC4->spriteIds, 7, 1);
+ gUnknown_0203BCC4->unk666 = 0xFF;
+ data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gTasks[taskId].func = ItemStorage_ProcessInput;
+}
+
+static void sub_816C690(u8 a)
+{
+ sub_8122448(gUnknown_0203BCC4->spriteIds, 7, 128, ((a+1) * 16));
+}
+
+static void sub_816C6BC(u8 windowId, u16 value, u32 mode, u8 x, u8 y, u8 n)
+{
+ ConvertIntToDecimalStringN(gStringVar1, value, mode, n);
+ StringExpandPlaceholders(gStringVar4, gText_xVar1);
+ PrintTextOnWindow(windowId, 1, gStringVar4, GetStringCenterAlignXOffset(1, gStringVar4, 48), y, 0, NULL);
+}
+
+static void ItemStorage_DoItemAction(u8 taskId)
+{
+ s16 *data;
+ u16 b;
+
+ data = gTasks[taskId].data;
+ b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove);
+ ItemStorage_RemoveScrollIndicator();
+ data[2] = 1;
+ if(!data[3])
+ {
+ if(gSaveBlock1Ptr->pcItems[b].quantity == 1)
+ {
+ ItemStorage_DoItemWithdraw(taskId);
+ return;
+ }
+ CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1);
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_HOW_MANY_TO_WITHDRAW));
+ }
+ else
+ {
+ if(gSaveBlock1Ptr->pcItems[b].quantity == 1)
+ {
+ ItemStorage_DoItemToss(taskId);
+ return;
+ }
+ CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1);
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS));
+ }
+ sub_816C6BC(sub_816BC7C(4), data[2], STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3);
+ gTasks[taskId].func = ItemStorage_HandleQuantityRolling;
+}
+
+static void ItemStorage_HandleQuantityRolling(u8 taskId)
+{
+ s16 *data;
+ u16 b;
+
+ data = gTasks[taskId].data;
+ b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove);
+ if(AdjustQuantityAccordingToDPadInput(&(data[2]), gSaveBlock1Ptr->pcItems[b].quantity) == TRUE)
+ sub_816C6BC(sub_816BC7C(4), data[2], STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3);
+ else
+ {
+ if(gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_816BCC4(4);
+ if(!data[3])
+ ItemStorage_DoItemWithdraw(taskId);
+ else
+ ItemStorage_DoItemToss(taskId);
+ }
+ else if(gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_816BCC4(4);
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[b].itemId));
+ ItemStorage_StartScrollIndicatorAndProcessInput(taskId);
+ }
+ }
+}
+
+static void ItemStorage_DoItemWithdraw(u8 taskId)
+{
+ s16 *data;
+ u16 b;
+
+ data = gTasks[taskId].data;
+ b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove);
+ if(AddBagItem(gSaveBlock1Ptr->pcItems[b].itemId, data[2]) == TRUE)
+ {
+ CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[2], STR_CONV_MODE_LEFT_ALIGN, 3);
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_WITHDREW_THING));
+ gTasks[taskId].func = ItemStorage_HandleRemoveItem;
+ }
+ else
+ {
+ data[2] = 0;
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_NO_MORE_ROOM));
+ gTasks[taskId].func = ItemStorage_WaitPressHandleResumeProcessInput;
+ }
+}
+
+static void ItemStorage_DoItemToss(u8 taskId)
+{
+ s16 *data;
+ u16 b;
+
+ data = gTasks[taskId].data;
+ b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove);
+ if(!ItemId_GetImportance(gSaveBlock1Ptr->pcItems[b].itemId))
+ {
+ CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, data[2], STR_CONV_MODE_LEFT_ALIGN, 3);
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_OKAY_TO_THROW_AWAY));
+ CreateYesNoMenuWithCallbacks(taskId, &gUnknown_085DFF84, 1, 0, 1, 0x214, 0xE, &ResumeFromWithdrawYesNoFuncList);
+ }
+ else
+ {
+ data[2] = 0;
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_TOO_IMPORTANT));
+ gTasks[taskId].func = ItemStorage_WaitPressHandleResumeProcessInput;
+ }
+}
+
+static void ItemStorage_ResumeInputFromYesToss(u8 taskId)
+{
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_THREW_AWAY_ITEM));
+ gTasks[taskId].func = ItemStorage_HandleRemoveItem;
+}
+
+static void ItemStorage_ResumeInputFromNoToss(u8 taskId)
+{
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[(playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos)].itemId));
+ ItemStorage_StartScrollIndicatorAndProcessInput(taskId);
+}
+
+static void ItemStorage_HandleRemoveItem(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ if(gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ RemovePCItem((playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove), data[2]);
+ DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
+ sub_816C110();
+ sub_816C140();
+ ItemStorage_RefreshListMenu();
+ data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos);
+ ItemStorage_StartScrollIndicatorAndProcessInput(taskId);
+ }
+}
+
+static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ if(gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[(playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos)].itemId));
+ ItemStorage_StartScrollIndicatorAndProcessInput(taskId);
+ }
+}
+
+static void ItemStorage_StartScrollIndicatorAndProcessInput(u8 taskId)
+{
+ ItemStorage_StartScrollIndicator();
+ gTasks[taskId].func = ItemStorage_ProcessInput;
+}
diff --git a/src/pokeball.c b/src/pokeball.c
new file mode 100644
index 000000000..3dbbb2967
--- /dev/null
+++ b/src/pokeball.c
@@ -0,0 +1,1276 @@
+#include "global.h"
+#include "pokemon.h"
+#include "sprite.h"
+#include "pokeball.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "task.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "trig.h"
+#include "main.h"
+#include "m4a.h"
+#include "decompress.h"
+#include "constants/species.h"
+#include "util.h"
+#include "graphics.h"
+
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+
+// this file's functions
+static void Task_DoPokeballSendOutAnim(u8 taskId);
+static void SpriteCB_TestBallThrow(struct Sprite *sprite);
+static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite);
+static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite);
+static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite);
+static void sub_80756D4(struct Sprite *sprite);
+static void sub_80756E0(struct Sprite *sprite);
+static void sub_807574C(struct Sprite *sprite);
+static void sub_80757E4(struct Sprite *sprite);
+static void sub_8075838(struct Sprite *sprite);
+static void sub_8075930(struct Sprite *sprite);
+static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite);
+static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite);
+static void sub_8075970(struct Sprite *sprite);
+static void HandleBallAnimEnd(struct Sprite *sprite);
+static void sub_8075FB4(struct Sprite *sprite);
+static void sub_80760F8(struct Sprite *sprite);
+static void sub_8076524(struct Sprite *sprite);
+static void sub_80765E0(struct Sprite *sprite);
+static void sub_80767D4(struct Sprite *sprite);
+static void sub_807687C(struct Sprite *sprite);
+static void sub_80768F0(struct Sprite *sprite);
+static void sub_80769A8(struct Sprite *sprite);
+static void sub_80769CC(struct Sprite *sprite);
+static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite);
+static u16 GetBattlerPokeballItemId(u8 battlerId);
+
+// rom const data
+
+#define GFX_TAG_POKEBALL 55000
+#define GFX_TAG_GREATBALL 55001
+#define GFX_TAG_SAFARIBALL 55002
+#define GFX_TAG_ULTRABALL 55003
+#define GFX_TAG_MASTERBALL 55004
+#define GFX_TAG_NETBALL 55005
+#define GFX_TAG_DIVEBALL 55006
+#define GFX_TAG_NESTBALL 55007
+#define GFX_TAG_REPEATBALL 55008
+#define GFX_TAG_TIMERBALL 55009
+#define GFX_TAG_LUXURYBALL 55010
+#define GFX_TAG_PREMIERBALL 55011
+
+const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] =
+{
+ {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL},
+ {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL},
+ {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL},
+ {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL},
+ {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL},
+ {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL},
+ {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL},
+ {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL},
+ {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL},
+ {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL},
+ {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL},
+ {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL},
+};
+
+const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] =
+{
+ {gInterfacePal_PokeBall, GFX_TAG_POKEBALL},
+ {gInterfacePal_GreatBall, GFX_TAG_GREATBALL},
+ {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL},
+ {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL},
+ {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL},
+ {gInterfacePal_NetBall, GFX_TAG_NETBALL},
+ {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL},
+ {gInterfacePal_NestBall, GFX_TAG_NESTBALL},
+ {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL},
+ {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL},
+ {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL},
+ {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL},
+};
+
+static const struct OamData sBallOamData =
+{
+ .y = 0,
+ .affineMode = 3,
+ .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 sBallAnimSeq3[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq5[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq4[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq6[] =
+{
+ ANIMCMD_FRAME(12, 1),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sBallAnimSeq0[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sBallAnimSeq1[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sBallAnimSeq2[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sBallAnimSequences[] =
+{
+ sBallAnimSeq0,
+ sBallAnimSeq1,
+ sBallAnimSeq2,
+
+ // unused?
+ sBallAnimSeq3,
+ sBallAnimSeq4,
+ sBallAnimSeq5,
+ sBallAnimSeq6,
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq0[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -3, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq2[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 3, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq3[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sBallAffineAnimSeq4[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 25, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sBallAffineAnimSequences[] =
+{
+ sBallAffineAnimSeq0,
+ sBallAffineAnimSeq1,
+ sBallAffineAnimSeq2,
+ sBallAffineAnimSeq3,
+ sBallAffineAnimSeq4,
+};
+
+const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
+{
+ {
+ .tileTag = GFX_TAG_POKEBALL,
+ .paletteTag = GFX_TAG_POKEBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_GREATBALL,
+ .paletteTag = GFX_TAG_GREATBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_SAFARIBALL,
+ .paletteTag = GFX_TAG_SAFARIBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_ULTRABALL,
+ .paletteTag = GFX_TAG_ULTRABALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_MASTERBALL,
+ .paletteTag = GFX_TAG_MASTERBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_NETBALL,
+ .paletteTag = GFX_TAG_NETBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_DIVEBALL,
+ .paletteTag = GFX_TAG_DIVEBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_NESTBALL,
+ .paletteTag = GFX_TAG_NESTBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_REPEATBALL,
+ .paletteTag = GFX_TAG_REPEATBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_TIMERBALL,
+ .paletteTag = GFX_TAG_TIMERBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_LUXURYBALL,
+ .paletteTag = GFX_TAG_LUXURYBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+ {
+ .tileTag = GFX_TAG_PREMIERBALL,
+ .paletteTag = GFX_TAG_PREMIERBALL,
+ .oam = &sBallOamData,
+ .anims = sBallAnimSequences,
+ .images = NULL,
+ .affineAnims = sBallAffineAnimSequences,
+ .callback = SpriteCB_TestBallThrow,
+ },
+};
+
+#define tFrames data[0]
+#define tPan data[1]
+#define tThrowId data[2]
+#define tBattler data[3]
+#define tOpponentBattler data[4]
+
+u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow)
+{
+ u8 taskId;
+
+ gDoingBattleAnim = TRUE;
+ gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive = 1;
+
+ taskId = CreateTask(Task_DoPokeballSendOutAnim, 5);
+ gTasks[taskId].tPan = pan;
+ gTasks[taskId].tThrowId = kindOfThrow;
+ gTasks[taskId].tBattler = gActiveBattler;
+
+ return 0;
+}
+
+#define sBattler data[6]
+
+static void Task_DoPokeballSendOutAnim(u8 taskId)
+{
+ u16 throwCaseId;
+ u8 battlerId;
+ u16 itemId, ballId;
+ u8 ballSpriteId;
+ bool8 notSendOut = FALSE;
+
+ if (gTasks[taskId].tFrames == 0)
+ {
+ gTasks[taskId].tFrames++;
+ return;
+ }
+
+ throwCaseId = gTasks[taskId].tThrowId;
+ battlerId = gTasks[taskId].tBattler;
+
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ itemId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);
+ else
+ itemId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);
+
+ ballId = ItemIdToBallId(itemId);
+ LoadBallGfx(ballId);
+ ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29);
+ gSprites[ballSpriteId].data[0] = 0x80;
+ gSprites[ballSpriteId].data[1] = 0;
+ gSprites[ballSpriteId].data[7] = throwCaseId;
+
+ switch (throwCaseId)
+ {
+ case POKEBALL_PLAYER_SENDOUT:
+ gBattlerTarget = battlerId;
+ gSprites[ballSpriteId].pos1.x = 24;
+ gSprites[ballSpriteId].pos1.y = 68;
+ gSprites[ballSpriteId].callback = SpriteCB_PlayerMonSendOut_1;
+ break;
+ case POKEBALL_OPPONENT_SENDOUT:
+ gSprites[ballSpriteId].pos1.x = GetBattlerSpriteCoord(battlerId, BANK_X_POS);
+ gSprites[ballSpriteId].pos1.y = GetBattlerSpriteCoord(battlerId, BANK_Y_POS) + 24;
+ gBattlerTarget = battlerId;
+ gSprites[ballSpriteId].data[0] = 0;
+ gSprites[ballSpriteId].callback = SpriteCB_OpponentMonSendOut;
+ break;
+ default:
+ gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ notSendOut = TRUE;
+ break;
+ }
+
+ gSprites[ballSpriteId].sBattler = gBattlerTarget;
+ if (!notSendOut)
+ {
+ DestroyTask(taskId);
+ return;
+ }
+
+ // this will perform an unused ball throw animation
+ gSprites[ballSpriteId].data[0] = 0x22;
+ gSprites[ballSpriteId].data[2] = GetBattlerSpriteCoord(gBattlerTarget, BANK_X_POS);
+ gSprites[ballSpriteId].data[4] = GetBattlerSpriteCoord(gBattlerTarget, BANK_Y_POS) - 16;
+ gSprites[ballSpriteId].data[5] = -40;
+ sub_80A68D4(&gSprites[ballSpriteId]);
+ gSprites[ballSpriteId].oam.affineParam = taskId;
+ gTasks[taskId].tOpponentBattler = gBattlerTarget;
+ gTasks[taskId].func = TaskDummy;
+ PlaySE(SE_NAGERU);
+}
+
+static void SpriteCB_TestBallThrow(struct Sprite *sprite)
+{
+ if (AnimateBallThrow(sprite))
+ {
+ u16 ballId;
+ u8 taskId = sprite->oam.affineParam;
+ u8 opponentBattler = gTasks[taskId].tOpponentBattler;
+ u8 noOfShakes = gTasks[taskId].tThrowId;
+
+ StartSpriteAnim(sprite, 1);
+ sprite->affineAnimPaused = 1;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[5] = 0;
+ ballId = ItemIdToBallId(GetBattlerPokeballItemId(opponentBattler));
+ LaunchBallStarsTask(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, ballId);
+ sprite->data[0] = LaunchBallFadeMonTask(FALSE, opponentBattler, 14, ballId);
+ sprite->sBattler = opponentBattler;
+ sprite->data[7] = noOfShakes;
+ DestroyTask(taskId);
+ sprite->callback = sub_80756D4;
+ }
+}
+
+#undef tFrames
+#undef tPan
+#undef tThrowId
+#undef tBattler
+#undef tOpponentBattler
+
+static void sub_80756D4(struct Sprite *sprite)
+{
+ sprite->callback = sub_80756E0;
+}
+
+static void sub_80756E0(struct Sprite *sprite)
+{
+ if (++sprite->data[5] == 10)
+ {
+ sprite->data[5] = 0;
+ sprite->callback = sub_807574C;
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 2);
+ AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0;
+ }
+}
+
+static void sub_807574C(struct Sprite *sprite)
+{
+ sprite->data[5]++;
+ if (sprite->data[5] == 11)
+ PlaySE(SE_SUIKOMU);
+ if (gSprites[gBattlerSpriteIds[sprite->sBattler]].affineAnimEnded)
+ {
+ StartSpriteAnim(sprite, 2);
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].invisible = TRUE;
+ sprite->data[5] = 0;
+ sprite->callback = sub_80757E4;
+ }
+ else
+ {
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] += 0x60;
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].pos2.y = -gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] >> 8;
+ }
+}
+
+static void sub_80757E4(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ sprite->data[5]++;
+ if (sprite->data[5] == 1)
+ {
+ sprite->data[3] = 0;
+ sprite->data[4] = 32;
+ sprite->data[5] = 0;
+ sprite->pos1.y += Cos(0, 32);
+ sprite->pos2.y = -Cos(0, sprite->data[4]);
+ sprite->callback = sub_8075838;
+ }
+ }
+}
+
+static void sub_8075838(struct Sprite *sprite)
+{
+ bool8 r5 = FALSE;
+
+ switch (sprite->data[3] & 0xFF)
+ {
+ case 0:
+ sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]);
+ sprite->data[5] += 4 + (sprite->data[3] >> 8);
+ if (sprite->data[5] >= 64)
+ {
+ sprite->data[4] -= 10;
+ sprite->data[3] += 0x101;
+ if (sprite->data[3] >> 8 == 4)
+ r5 = TRUE;
+ switch (sprite->data[3] >> 8)
+ {
+ case 1:
+ PlaySE(SE_KON);
+ break;
+ case 2:
+ PlaySE(SE_KON2);
+ break;
+ case 3:
+ PlaySE(SE_KON3);
+ break;
+ default:
+ PlaySE(SE_KON4);
+ break;
+ }
+ }
+ break;
+ case 1:
+ sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]);
+ sprite->data[5] -= 4 + (sprite->data[3] >> 8);
+ if (sprite->data[5] <= 0)
+ {
+ sprite->data[5] = 0;
+ sprite->data[3] &= 0xFF00;
+ }
+ break;
+ }
+ if (r5)
+ {
+ sprite->data[3] = 0;
+ sprite->pos1.y += Cos(64, 32);
+ sprite->pos2.y = 0;
+ if (sprite->data[7] == 0)
+ {
+ sprite->callback = SpriteCB_ReleaseMonFromBall;
+ }
+ else
+ {
+ sprite->callback = sub_8075930;
+ sprite->data[4] = 1;
+ sprite->data[5] = 0;
+ }
+ }
+}
+
+static void sub_8075930(struct Sprite *sprite)
+{
+ sprite->data[3]++;
+ if (sprite->data[3] == 31)
+ {
+ sprite->data[3] = 0;
+ sprite->affineAnimPaused = TRUE;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_8075970;
+ PlaySE(SE_BOWA);
+ }
+}
+
+static void sub_8075970(struct Sprite *sprite)
+{
+ switch (sprite->data[3] & 0xFF)
+ {
+ case 0:
+ case 2:
+ sprite->pos2.x += sprite->data[4];
+ sprite->data[5] += sprite->data[4];
+ sprite->affineAnimPaused = FALSE;
+ if (sprite->data[5] > 3 || sprite->data[5] < -3)
+ {
+ sprite->data[3]++;
+ sprite->data[5] = 0;
+ }
+ break;
+ case 1:
+ sprite->data[5]++;
+ if (sprite->data[5] == 1)
+ {
+ sprite->data[5] = 0;
+ sprite->data[4] = -sprite->data[4];
+ sprite->data[3]++;
+ sprite->affineAnimPaused = FALSE;
+ if (sprite->data[4] < 0)
+ ChangeSpriteAffineAnim(sprite, 2);
+ else
+ ChangeSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->affineAnimPaused = TRUE;
+ }
+ break;
+ case 3:
+ sprite->data[3] += 0x100;
+ if (sprite->data[3] >> 8 == sprite->data[7])
+ {
+ sprite->callback = SpriteCB_ReleaseMonFromBall;
+ }
+ else
+ {
+ if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3)
+ {
+ sprite->callback = sub_8075FB4;
+ sprite->affineAnimPaused = TRUE;
+ }
+ else
+ {
+ sprite->data[3]++;
+ sprite->affineAnimPaused = TRUE;
+ }
+ }
+ break;
+ case 4:
+ default:
+ sprite->data[5]++;
+ if (sprite->data[5] == 31)
+ {
+ sprite->data[5] = 0;
+ sprite->data[3] &= 0xFF00;
+ StartSpriteAffineAnim(sprite, 3);
+ if (sprite->data[4] < 0)
+ StartSpriteAffineAnim(sprite, 2);
+ else
+ StartSpriteAffineAnim(sprite, 1);
+ PlaySE(SE_BOWA);
+ }
+ break;
+ }
+}
+
+#define tCryTaskSpecies data[0]
+#define tCryTaskPan data[1]
+#define tCryTaskWantedCry data[2]
+#define tCryTaskBattler data[3]
+#define tCryTaskMonSpriteId data[4]
+#define tCryTaskMonPtr1 data[5]
+#define tCryTaskMonPtr2 data[6]
+#define tCryTaskFrames data[10]
+#define tCryTaskState data[15]
+
+static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
+{
+ u8 wantedCry = gTasks[taskId].tCryTaskWantedCry;
+ s8 pan = gTasks[taskId].tCryTaskPan;
+ u16 species = gTasks[taskId].tCryTaskSpecies;
+ u8 battlerId = gTasks[taskId].tCryTaskBattler;
+ u8 monSpriteId = gTasks[taskId].tCryTaskMonSpriteId;
+ struct Pokemon *mon = (void*)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 0x10) | (u16)(gTasks[taskId].tCryTaskMonPtr2));
+
+ switch (gTasks[taskId].tCryTaskState)
+ {
+ case 0:
+ default:
+ if (gSprites[monSpriteId].affineAnimEnded)
+ gTasks[taskId].tCryTaskState = wantedCry + 1;
+ break;
+ case 1:
+ if (ShouldPlayNormalMonCry(mon) == TRUE)
+ PlayCry3(species, pan, 0);
+ else
+ PlayCry3(species, pan, 11);
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 0;
+ DestroyTask(taskId);
+ break;
+ case 2:
+ StopCryAndClearCrySongs();
+ gTasks[taskId].tCryTaskFrames = 3;
+ gTasks[taskId].tCryTaskState = 20;
+ break;
+ case 20:
+ if (gTasks[taskId].tCryTaskFrames == 0)
+ {
+ if (ShouldPlayNormalMonCry(mon) == TRUE)
+ PlayCry4(species, pan, 1);
+ else
+ PlayCry4(species, pan, 12);
+
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 0;
+ DestroyTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].tCryTaskFrames--;
+ }
+ break;
+ case 3:
+ gTasks[taskId].tCryTaskFrames = 6;
+ gTasks[taskId].tCryTaskState = 30;
+ break;
+ case 30:
+ if (gTasks[taskId].tCryTaskFrames != 0)
+ {
+ gTasks[taskId].tCryTaskFrames--;
+ break;
+ }
+ gTasks[taskId].tCryTaskState++;
+ // fall through
+ case 31:
+ if (!IsCryPlayingOrClearCrySongs())
+ {
+ StopCryAndClearCrySongs();
+ gTasks[taskId].tCryTaskFrames = 3;
+ gTasks[taskId].tCryTaskState++;
+ }
+ break;
+ case 32:
+ if (gTasks[taskId].tCryTaskFrames != 0)
+ {
+ gTasks[taskId].tCryTaskFrames--;
+ break;
+ }
+ if (ShouldPlayNormalMonCry(mon) == TRUE)
+ PlayCry4(species, pan, 0);
+ else
+ PlayCry4(species, pan, 11);
+
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 0;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
+{
+ u8 battlerId = sprite->sBattler;
+ u32 ballId;
+
+ StartSpriteAnim(sprite, 1);
+ ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId));
+ LaunchBallStarsTask(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, ballId);
+ sprite->data[0] = LaunchBallFadeMonTask(1, sprite->sBattler, 14, ballId);
+ sprite->callback = HandleBallAnimEnd;
+
+ if (gMain.inBattle)
+ {
+ struct Pokemon *mon;
+ u16 species;
+ s8 pan;
+ u16 wantedCryCase;
+ u8 taskId;
+
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ {
+ mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]];
+ pan = 25;
+ }
+ else
+ {
+ mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]];
+ pan = -25;
+ }
+
+ species = GetMonData(mon, MON_DATA_SPECIES);
+ if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
+ && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ if (IsBGMPlaying())
+ m4aMPlayStop(&gMPlayInfo_BGM);
+ }
+ else
+ {
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 128);
+ }
+ }
+
+ if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->field_9_x1)
+ wantedCryCase = 0;
+ else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
+ wantedCryCase = 1;
+ else
+ wantedCryCase = 2;
+
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 1;
+
+ taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3);
+ gTasks[taskId].tCryTaskSpecies = species;
+ gTasks[taskId].tCryTaskPan = pan;
+ gTasks[taskId].tCryTaskWantedCry = wantedCryCase;
+ gTasks[taskId].tCryTaskBattler = battlerId;
+ gTasks[taskId].tCryTaskMonSpriteId = gBattlerSpriteIds[sprite->sBattler];
+ gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 0x10;
+ gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon);
+ gTasks[taskId].tCryTaskState = 0;
+ }
+
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 1);
+
+ if (GetBattlerSide(sprite->sBattler) == B_SIDE_OPPONENT)
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = sub_8039B58;
+ else
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = sub_8039E44;
+
+ AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000;
+}
+
+#undef tCryTaskSpecies
+#undef tCryTaskPan
+#undef tCryTaskWantedCry
+#undef tCryTaskBattler
+#undef tCryTaskMonSpriteId
+#undef tCryTaskMonPtr1
+#undef tCryTaskMonPtr2
+#undef tCryTaskFrames
+#undef tCryTaskState
+
+static void sub_8075FB4(struct Sprite *sprite)
+{
+ sprite->animPaused = TRUE;
+ sprite->callback = sub_80760F8;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+}
+
+static void HandleBallAnimEnd(struct Sprite *sprite)
+{
+ bool8 affineAnimEnded = FALSE;
+ u8 battlerId = sprite->sBattler;
+
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;
+ if (sprite->animEnded)
+ sprite->invisible = TRUE;
+ if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded)
+ {
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0);
+ affineAnimEnded = TRUE;
+ }
+ else
+ {
+ gSprites[gBattlerSpriteIds[battlerId]].data[1] -= 288;
+ gSprites[gBattlerSpriteIds[battlerId]].pos2.y = gSprites[gBattlerSpriteIds[battlerId]].data[1] >> 8;
+ }
+ if (sprite->animEnded && affineAnimEnded)
+ {
+ s32 i, doneBattlers;
+
+ gSprites[gBattlerSpriteIds[battlerId]].pos2.y = 0;
+ gDoingBattleAnim = FALSE;
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = 0;
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+
+ for (doneBattlers = 0, i = 0; i < MAX_BATTLERS_COUNT; i++)
+ {
+ if (gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive == 0)
+ doneBattlers++;
+ }
+ if (doneBattlers == MAX_BATTLERS_COUNT)
+ {
+ for (i = 0; i < POKEBALL_COUNT; i++)
+ FreeBallGfx(i);
+ }
+ }
+}
+
+static void sub_80760F8(struct Sprite *sprite)
+{
+ u8 battlerId = sprite->sBattler;
+
+ sprite->data[4]++;
+ if (sprite->data[4] == 40)
+ {
+ return;
+ }
+ else if (sprite->data[4] == 95)
+ {
+ gDoingBattleAnim = FALSE;
+ m4aMPlayAllStop();
+ PlaySE(MUS_FANFA5);
+ }
+ else if (sprite->data[4] == 315)
+ {
+ FreeOamMatrix(gSprites[gBattlerSpriteIds[sprite->sBattler]].oam.matrixNum);
+ DestroySprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
+ DestroySpriteAndFreeResources(sprite);
+ if (gMain.inBattle)
+ gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = 0;
+ }
+}
+
+static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite)
+{
+ sprite->data[0] = 25;
+ sprite->data[2] = GetBattlerSpriteCoord(sprite->sBattler, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, 3) + 24;
+ sprite->data[5] = -30;
+ sprite->oam.affineParam = sprite->sBattler;
+ sub_80A68D4(sprite);
+ sprite->callback = SpriteCB_PlayerMonSendOut_2;
+}
+
+#define HIBYTE(x) (((x) >> 8) & 0xFF)
+
+static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite)
+{
+ u32 r6;
+ u32 r7;
+
+ if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80)
+ {
+ s16 r4;
+
+ if ((sprite->oam.affineParam & 0xFF00) == 0)
+ {
+ r6 = sprite->data[1] & 1;
+ r7 = sprite->data[2] & 1;
+ sprite->data[1] = ((sprite->data[1] / 3) & ~1) | r6;
+ sprite->data[2] = ((sprite->data[2] / 3) & ~1) | r7;
+ StartSpriteAffineAnim(sprite, 4);
+ }
+ r4 = sprite->data[0];
+ sub_80A6F3C(sprite);
+ sprite->data[7] += sprite->sBattler / 3;
+ sprite->pos2.y += Sin(HIBYTE(sprite->data[7]), sprite->data[5]);
+ sprite->oam.affineParam += 0x100;
+ if ((sprite->oam.affineParam >> 8) % 3 != 0)
+ sprite->data[0] = r4;
+ else
+ sprite->data[0] = r4 - 1;
+ if (HIBYTE(sprite->data[7]) >= 80)
+ {
+ r6 = sprite->data[1] & 1;
+ r7 = sprite->data[2] & 1;
+ sprite->data[1] = ((sprite->data[1] * 3) & ~1) | r6;
+ sprite->data[2] = ((sprite->data[2] * 3) & ~1) | r7;
+ }
+ }
+ else
+ {
+ if (AnimateBallThrow(sprite))
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->sBattler = sprite->oam.affineParam & 0xFF;
+ sprite->data[0] = 0;
+
+ if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1
+ && sprite->sBattler == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))
+ sprite->callback = SpriteCB_ReleaseMon2FromBall;
+ else
+ sprite->callback = SpriteCB_ReleaseMonFromBall;
+
+ StartSpriteAffineAnim(sprite, 0);
+ }
+ }
+}
+
+static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite)
+{
+ if (sprite->data[0]++ > 24)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = SpriteCB_ReleaseMonFromBall;
+ }
+}
+
+static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] > 15)
+ {
+ sprite->data[0] = 0;
+ if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1
+ && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))
+ sprite->callback = SpriteCB_ReleaseMon2FromBall;
+ else
+ sprite->callback = SpriteCB_ReleaseMonFromBall;
+ }
+}
+
+#undef sBattler
+
+static u8 LaunchBallStarsTaskForPokeball(u8 x, u8 y, u8 kindOfStars, u8 d)
+{
+ return LaunchBallStarsTask(x, y, kindOfStars, d, BALL_POKE);
+}
+
+static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 battlerId, u32 arg2)
+{
+ return LaunchBallFadeMonTask(unFadeLater, battlerId, arg2, BALL_POKE);
+}
+
+void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 battlerId, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h, u16 species)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]);
+ LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]);
+ spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subpriortiy);
+
+ gSprites[spriteId].data[0] = monSpriteId;
+ gSprites[spriteId].data[5] = gSprites[monSpriteId].pos1.x;
+ gSprites[spriteId].data[6] = gSprites[monSpriteId].pos1.y;
+
+ gSprites[monSpriteId].pos1.x = x;
+ gSprites[monSpriteId].pos1.y = y;
+ gSprites[monSpriteId].data[7] = species;
+
+ gSprites[spriteId].data[1] = g;
+ gSprites[spriteId].data[2] = battlerId;
+ gSprites[spriteId].data[3] = h;
+ gSprites[spriteId].data[4] = h >> 0x10;
+ gSprites[spriteId].oam.priority = oamPriority;
+ gSprites[spriteId].callback = sub_8076524;
+
+ gSprites[monSpriteId].invisible = TRUE;
+}
+
+static void sub_8076524(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ u8 r5;
+ u8 r7 = sprite->data[0];
+ u8 battlerId = sprite->data[2];
+ u32 r4 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16);
+
+ if (sprite->subpriority != 0)
+ r5 = sprite->subpriority - 1;
+ else
+ r5 = 0;
+
+ StartSpriteAnim(sprite, 1);
+ LaunchBallStarsTaskForPokeball(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5);
+ sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, battlerId, r4);
+ sprite->callback = sub_80765E0;
+ gSprites[r7].invisible = FALSE;
+ StartSpriteAffineAnim(&gSprites[r7], 1);
+ AnimateSprite(&gSprites[r7]);
+ gSprites[r7].data[1] = 0x1000;
+ sprite->data[7] = 0;
+ }
+ else
+ {
+ sprite->data[1]--;
+ }
+}
+
+static void sub_80765E0(struct Sprite *sprite)
+{
+ bool8 r12 = FALSE;
+ bool8 r6 = FALSE;
+ u8 monSpriteId = sprite->data[0];
+ u16 var1;
+ u16 var2;
+
+ if (sprite->animEnded)
+ sprite->invisible = TRUE;
+ if (gSprites[monSpriteId].affineAnimEnded)
+ {
+ StartSpriteAffineAnim(&gSprites[monSpriteId], 0);
+ r12 = TRUE;
+ }
+ var1 = (sprite->data[5] - sprite->pos1.x) * sprite->data[7] / 128 + sprite->pos1.x;
+ var2 = (sprite->data[6] - sprite->pos1.y) * sprite->data[7] / 128 + sprite->pos1.y;
+ gSprites[monSpriteId].pos1.x = var1;
+ gSprites[monSpriteId].pos1.y = var2;
+ if (sprite->data[7] < 128)
+ {
+ s16 sine = -(gSineTable[(u8)sprite->data[7]] / 8);
+
+ sprite->data[7] += 4;
+ gSprites[monSpriteId].pos2.x = sine;
+ gSprites[monSpriteId].pos2.y = sine;
+ }
+ else
+ {
+ gSprites[monSpriteId].pos1.x = sprite->data[5];
+ gSprites[monSpriteId].pos1.y = sprite->data[6];
+ gSprites[monSpriteId].pos2.x = 0;
+ gSprites[monSpriteId].pos2.y = 0;
+ r6 = TRUE;
+ }
+ if (sprite->animEnded && r12 && r6)
+ {
+ if (gSprites[monSpriteId].data[7] == SPECIES_EGG)
+ DoMonFrontSpriteAnimation(&gSprites[monSpriteId], gSprites[monSpriteId].data[7], TRUE, 0);
+ else
+ DoMonFrontSpriteAnimation(&gSprites[monSpriteId], gSprites[monSpriteId].data[7], FALSE, 0);
+
+ DestroySpriteAndFreeResources(sprite);
+ }
+}
+
+u8 sub_807671C(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 g, u32 h)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]);
+ LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]);
+ spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subPriority);
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[1] = g;
+ gSprites[spriteId].data[2] = b;
+ gSprites[spriteId].data[3] = h;
+ gSprites[spriteId].data[4] = h >> 16;
+ gSprites[spriteId].oam.priority = oamPriority;
+ gSprites[spriteId].callback = sub_80767D4;
+ return spriteId;
+}
+
+static void sub_80767D4(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ u8 r6;
+ u8 r7 = sprite->data[0];
+ u8 r8 = sprite->data[2];
+ u32 r5 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16);
+
+ if (sprite->subpriority != 0)
+ r6 = sprite->subpriority - 1;
+ else
+ r6 = 0;
+
+ StartSpriteAnim(sprite, 1);
+ LaunchBallStarsTaskForPokeball(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6);
+ sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, r8, r5);
+ sprite->callback = sub_807687C;
+ StartSpriteAffineAnim(&gSprites[r7], 2);
+ AnimateSprite(&gSprites[r7]);
+ gSprites[r7].data[1] = 0;
+ }
+ else
+ {
+ sprite->data[1]--;
+ }
+}
+
+static void sub_807687C(struct Sprite *sprite)
+{
+ u8 r1;
+
+ sprite->data[5]++;
+ if (sprite->data[5] == 11)
+ PlaySE(SE_SUIKOMU);
+ r1 = sprite->data[0];
+ if (gSprites[r1].affineAnimEnded)
+ {
+ StartSpriteAnim(sprite, 2);
+ gSprites[r1].invisible = TRUE;
+ sprite->data[5] = 0;
+ sprite->callback = sub_80768F0;
+ }
+ else
+ {
+ gSprites[r1].data[1] += 96;
+ gSprites[r1].pos2.y = -gSprites[r1].data[1] >> 8;
+ }
+}
+
+static void sub_80768F0(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ sprite->callback = SpriteCallbackDummy;
+}
+
+static void DestroySpriteAndFreeResources_(struct Sprite *sprite)
+{
+ DestroySpriteAndFreeResources(sprite);
+}
+
+void sub_8076918(u8 battlerId)
+{
+ struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]];
+
+ healthboxSprite->data[0] = 5;
+ healthboxSprite->data[1] = 0;
+ healthboxSprite->pos2.x = 0x73;
+ healthboxSprite->pos2.y = 0;
+ healthboxSprite->callback = sub_80769CC;
+ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ {
+ healthboxSprite->data[0] = -healthboxSprite->data[0];
+ healthboxSprite->data[1] = -healthboxSprite->data[1];
+ healthboxSprite->pos2.x = -healthboxSprite->pos2.x;
+ healthboxSprite->pos2.y = -healthboxSprite->pos2.y;
+ }
+ gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]);
+ if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT)
+ healthboxSprite->callback = sub_80769A8;
+}
+
+static void sub_80769A8(struct Sprite *sprite)
+{
+ sprite->data[1]++;
+ if (sprite->data[1] == 20)
+ {
+ sprite->data[1] = 0;
+ sprite->callback = sub_80769CC;
+ }
+}
+
+static void sub_80769CC(struct Sprite *sprite)
+{
+ sprite->pos2.x -= sprite->data[0];
+ sprite->pos2.y -= sprite->data[1];
+ if (sprite->pos2.x == 0 && sprite->pos2.y == 0)
+ sprite->callback = SpriteCallbackDummy;
+}
+
+void DoHitAnimHealthboxEffect(u8 battlerId)
+{
+ u8 spriteId;
+
+ spriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HitAnimHealthoxEffect);
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[1] = gHealthboxSpriteIds[battlerId];
+ gSprites[spriteId].callback = SpriteCB_HitAnimHealthoxEffect;
+}
+
+static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite)
+{
+ u8 r1 = sprite->data[1];
+
+ gSprites[r1].pos2.y = sprite->data[0];
+ sprite->data[0] = -sprite->data[0];
+ sprite->data[2]++;
+ if (sprite->data[2] == 21)
+ {
+ gSprites[r1].pos2.x = 0;
+ gSprites[r1].pos2.y = 0;
+ DestroySprite(sprite);
+ }
+}
+
+void LoadBallGfx(u8 ballId)
+{
+ u16 var;
+
+ if (GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag) == 0xFFFF)
+ {
+ LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[ballId]);
+ LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[ballId]);
+ }
+ switch (ballId)
+ {
+ case BALL_DIVE:
+ case BALL_LUXURY:
+ case BALL_PREMIER:
+ break;
+ default:
+ var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag);
+ LZDecompressVram(gOpenPokeballGfx, (void *)(VRAM + 0x10100 + var * 32));
+ break;
+ }
+}
+
+void FreeBallGfx(u8 ballId)
+{
+ FreeSpriteTilesByTag(gBallSpriteSheets[ballId].tag);
+ FreeSpritePaletteByTag(gBallSpritePalettes[ballId].tag);
+}
+
+static u16 GetBattlerPokeballItemId(u8 battlerId)
+{
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);
+ else
+ return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL);
+}
diff --git a/src/pokeblock.c b/src/pokeblock.c
new file mode 100644
index 000000000..7dd20b237
--- /dev/null
+++ b/src/pokeblock.c
@@ -0,0 +1,1334 @@
+#include "global.h"
+#include "pokeblock.h"
+#include "bg.h"
+#include "strings.h"
+#include "text.h"
+#include "text_window.h"
+#include "menu.h"
+#include "task.h"
+#include "menu_helpers.h"
+#include "pokemon.h"
+#include "graphics.h"
+#include "malloc.h"
+#include "main.h"
+#include "battle.h"
+#include "battle_controllers.h"
+#include "palette.h"
+#include "scanline_effect.h"
+#include "list_menu.h"
+#include "gpu_regs.h"
+#include "decompress.h"
+#include "international_string_util.h"
+#include "item.h"
+#include "constants/items.h"
+#include "string_util.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "berry.h"
+#include "event_data.h"
+#include "battle_message.h"
+#include "safari_zone.h"
+#include "lilycove_lady.h"
+#include "overworld.h"
+
+#define POKEBLOCK_MAX_FEEL 99
+#define FIELD_E75_COUNT 7
+
+struct PokeblockMenuStruct
+{
+ u8 tilemap[0x800];
+ void (*callbackOnUse)(void);
+ const u8 *pokeblockOptionsIds;
+ u8 optionsNo;
+ u8 caseId;
+ u8 itemsNo;
+ u8 maxShowed;
+ struct ListMenuItem items[POKEBLOCKS_COUNT + 1];
+ u8 menuItemsStrings[POKEBLOCKS_COUNT + 1][0x20]; // + 1 because of STOW CASE item
+ u8 pokeblockCaseSpriteId;
+ u8 field_E75[FIELD_E75_COUNT];
+ u8 unkTaskId;
+ bool8 isSwapping;
+ s16 gfxState;
+ u8 unused[8];
+};
+
+struct PokeblockSavedData
+{
+ void (*callback)(void);
+ u16 lastItemPos;
+ u16 lastItemPage;
+};
+
+enum
+{
+ PKBL_USE_ON_FIELD,
+ PKBL_TOSS,
+ PKBL_CANCEL,
+ PKBL_USE_IN_BATTLE,
+ PKBL_USE_ON_FEEDER,
+ PKBL_GIVE_TO_LADY
+};
+
+extern u16 gSpecialVar_ItemId;
+
+extern const u16 gUnknown_0860F074[];
+
+extern void CB2_ReturnToField(void);
+extern bool8 sub_81221EC(void);
+extern void sub_80AF168(void);
+
+// this file's functions
+static void CB2_InitPokeblockMenu(void);
+static bool8 InitPokeblockMenu(void);
+static bool8 LoadPokeblockMenuGfx(void);
+static void HandleInitBackgrounds(void);
+static void HandleInitWindows(void);
+static void SetMenuItemsCountAndMaxShowed(void);
+static void sub_81362E0(void);
+static void sub_8136344(void);
+static void HandlePokeblockListMenuItems(void);
+static void sub_81363BC(void);
+static void MovePokeblockMenuCursor(s32 pkblId, bool8 arg1, struct ListMenu *arg2);
+static void PutPokeblockInfoText(void);
+static void HandlePokeblockMenuCursor(u16 cursorPos, u16 arg1);
+static void PutPokeblockListMenuString(u8 *dst, u16 pkblId);
+static void Task_HandlePokeblockMenuInput(u8 taskId);
+static void PokeblockAction_UseOnField(u8 taskId);
+static void PokeblockAction_Toss(u8 taskId);
+static void PokeblockAction_Cancel(u8 taskId);
+static void PokeblockAction_UseInBattle(u8 taskId);
+static void PokeblockAction_UseOnPokeblockFeeder(u8 taskId);
+static void PokeblockAction_GiveToContestLady(u8 taskId);
+static void TossPokeblockChoice_Yes(u8 taskId);
+static void TossPokeblockChoice_No(u8 taskId);
+static void Task_FreeDataAndExitPokeblockCase(u8 taskId);
+static void Task_HandlePokeblockOptionsInput(u8 taskId);
+static void PutPokeblockOptionsWindow(u8 taskId);
+static void Task_HandlePokeblocksSwapInput(u8 taskId);
+static void sub_8136470(struct Sprite *sprite);
+static void sub_8135FCC(s32 pkblId);
+static void HandlePokeblocksSwap(u8 taskId, bool8 noSwap);
+static void UsePokeblockOnField(void);
+static void ReturnToPokeblockCaseOnField(void);
+static void CreateTossPokeblockYesNoMenu(u8 taskId);
+static void HandleErasePokeblock(u8 taskId);
+
+// ram variables
+EWRAM_DATA static struct PokeblockSavedData sSavedPokeblockData = {0};
+EWRAM_DATA static struct PokeblockMenuStruct *sPokeblockMenu = NULL;
+
+// const rom data
+const s8 gPokeblockFlavorCompatibilityTable[] =
+{
+ // Cool, Beauty, Cute, Smart, Tough
+ 0, 0, 0, 0, 0, // Hardy
+ 1, 0, 0, 0, -1, // Lonely
+ 1, 0, -1, 0, 0, // Brave
+ 1, -1, 0, 0, 0, // Adamant
+ 1, 0, 0, -1, 0, // Naughty
+ -1, 0, 0, 0, 1, // Bold
+ 0, 0, 0, 0, 0, // Docile
+ 0, 0, -1, 0, 1, // Relaxed
+ 0, -1, 0, 0, 1, // Impish
+ 0, 0, 0, -1, 1, // Lax
+ -1, 0, 1, 0, 0, // Timid
+ 0, 0, 1, 0, -1, // Hasty
+ 0, 0, 0, 0, 0, // Serious
+ 0, -1, 1, 0, 0, // Jolly
+ 0, 0, 1, -1, 0, // Naive
+ -1, 1, 0, 0, 0, // Modest
+ 0, 1, 0, 0, -1, // Mild
+ 0, 1, -1, 0, 0, // Quiet
+ 0, 0, 0, 0, 0, // Bashful
+ 0, 1, 0, -1, 0, // Rash
+ -1, 0, 0, 1, 0, // Calm
+ 0, 0, 0, 1, -1, // Gentle
+ 0, 0, -1, 1, 0, // Sassy
+ 0, -1, 0, 1, 0, // Careful
+ 0, 0, 0, 0, 0 // Quirky
+};
+
+static const struct BgTemplate sBgTemplatesForPokeblockMenu[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ }
+};
+
+const u8 *const gPokeblockNames[] =
+{
+ NULL,
+ gText_RedPokeblock,
+ gText_BluePokeblock,
+ gText_PinkPokeblock,
+ gText_GreenPokeblock,
+ gText_YellowPokeblock,
+ gText_PurplePokeblock,
+ gText_IndigoPokeblock,
+ gText_BrownPokeblock,
+ gText_LiteBluePokeblock,
+ gText_OlivePokeblock,
+ gText_GrayPokeblock,
+ gText_BlackPokeblock,
+ gText_WhitePokeblock,
+ gText_GoldPokeblock
+};
+
+static const struct MenuAction sPokeblockMenuActions[] =
+{
+ {gMenuText_Use, PokeblockAction_UseOnField},
+ {gMenuText_Toss, PokeblockAction_Toss},
+ {gText_Cancel2, PokeblockAction_Cancel},
+ {gMenuText_Use, PokeblockAction_UseInBattle},
+ {gMenuText_Use, PokeblockAction_UseOnPokeblockFeeder},
+ {gMenuText_Give2, PokeblockAction_GiveToContestLady},
+};
+
+static const u8 sActionsOnField[] = {PKBL_USE_ON_FIELD, PKBL_TOSS, PKBL_CANCEL};
+static const u8 sActionsInBattle[] = {PKBL_USE_IN_BATTLE, PKBL_CANCEL};
+static const u8 sActionsOnPokeblockFeeder[] = {PKBL_USE_ON_FEEDER, PKBL_CANCEL};
+static const u8 sActionsWhenGivingToLady[] = {PKBL_GIVE_TO_LADY, PKBL_CANCEL};
+
+static const struct YesNoFuncTable sTossYesNoFuncTable = {TossPokeblockChoice_Yes, TossPokeblockChoice_No};
+
+static const u8 sContestStatsMonData[] = {MON_DATA_COOL, MON_DATA_BEAUTY, MON_DATA_CUTE, MON_DATA_SMART, MON_DATA_TOUGH};
+
+static const struct OamData sOamData_PokeblockCase =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_PokeblockCase[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_PokeblockCase[] =
+{
+ sSpriteAnim_PokeblockCase
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_85B26C8[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -2, 2),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 4),
+ AFFINEANIMCMD_FRAME(0, 0, -2, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 2),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_85B26F0[] =
+{
+ sSpriteAffineAnim_85B26C8
+};
+
+const struct CompressedSpriteSheet gPokeblockCase_SpriteSheet =
+{
+ gMenuPokeblockDevice_Gfx, 0x800, GFX_TAG_POKEBLOCK_CASE
+};
+
+const struct CompressedSpritePalette gPokeblockCase_SpritePal =
+{
+ gMenuPokeblockDevice_Pal, GFX_TAG_POKEBLOCK_CASE
+};
+
+static const struct SpriteTemplate sSpriteTemplate_PokeblockCase =
+{
+ GFX_TAG_POKEBLOCK_CASE,
+ GFX_TAG_POKEBLOCK_CASE,
+ &sOamData_PokeblockCase,
+ sSpriteAnimTable_PokeblockCase,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+static const u8 sTextColorInPokeblockMenu[3] = {0, 2, 3};
+
+static const struct Pokeblock sFavoritePokeblocksTable[] =
+{
+ { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20},
+ { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20},
+ { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20},
+ { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20},
+ { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20}
+};
+
+static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] =
+{
+ {0, 2, 1, 9, 2, 0xF, 0x1E},
+ {0, 0xF, 1, 0xE, 0x12, 0xF, 0x30},
+ {0, 2, 0xD, 5, 2, 0xF, 0x12C},
+ {0, 2, 0xF, 5, 2, 0xF, 0x136},
+ {0, 2, 0x11, 5, 2, 0xF, 0x140},
+ {0, 8, 0xD, 5, 2, 0xF, 0x14A},
+ {0, 8, 0xF, 5, 2, 0xF, 0x154},
+ {0, 0xB, 0x11, 2, 2, 0xF, 0x15E},
+ {1, 7, 5, 6, 6, 0xF, 0x162},
+ {1, 7, 7, 6, 4, 0xF, 0x186},
+ {1, 2, 0xF, 0x1B, 4, 0xF, 0x19E},
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate sTossPkblockWindowTemplate = {1, 0x15, 9, 5, 4, 0xF, 0x20A};
+
+static const struct ListMenuTemplate sPokeblockListMenuTemplate =
+{
+ .items = NULL,
+ .moveCursorFunc = MovePokeblockMenuCursor,
+ .itemPrintFunc = NULL,
+ .totalItems = 0,
+ .maxShowed = 0,
+ .windowId = 1,
+ .header_X = 0,
+ .item_X = 1,
+ .cursor_X = 0,
+ .upText_Y = 1,
+ .cursorPal = 2,
+ .fillValue = 0,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD,
+ .fontId = 1,
+ .cursorKind = 1
+};
+
+// code
+void OpenPokeblockCase(u8 caseId, void (*callback)(void))
+{
+ sPokeblockMenu = Alloc(sizeof(*sPokeblockMenu));
+ sPokeblockMenu->caseId = caseId;
+ sPokeblockMenu->callbackOnUse = NULL;
+ sPokeblockMenu->unkTaskId = 0xFF;
+ sPokeblockMenu->isSwapping = FALSE;
+ sSavedPokeblockData.callback = callback;
+
+ switch (sPokeblockMenu->caseId)
+ {
+ case PBLOCK_CASE_BATTLE:
+ sPokeblockMenu->pokeblockOptionsIds = sActionsInBattle;
+ sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsInBattle);
+ break;
+ case PBLOCK_CASE_FEEDER:
+ sPokeblockMenu->pokeblockOptionsIds = sActionsOnPokeblockFeeder;
+ sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsOnPokeblockFeeder);
+ break;
+ case PBLOCK_CASE_GIVE:
+ sPokeblockMenu->pokeblockOptionsIds = sActionsWhenGivingToLady;
+ sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsWhenGivingToLady);
+ break;
+ default:
+ sPokeblockMenu->pokeblockOptionsIds = sActionsOnField;
+ sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsOnField);
+ break;
+ }
+
+ SetMainCallback2(CB2_InitPokeblockMenu);
+}
+
+void OpenPokeblockCaseInBattle(void)
+{
+ OpenPokeblockCase(PBLOCK_CASE_BATTLE, SetCB2ToReshowScreenAfterMenu2);
+}
+
+void OpenPokeblockCaseOnFeeder(void)
+{
+ OpenPokeblockCase(PBLOCK_CASE_FEEDER, CB2_ReturnToField);
+}
+
+static void CB2_PokeblockMenu(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB_PokeblockMenu(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void CB2_InitPokeblockMenu(void)
+{
+ while (1)
+ {
+ if (sub_81221EC() == TRUE)
+ break;
+ if (InitPokeblockMenu() == TRUE)
+ break;
+ if (sub_81221AC() == TRUE)
+ break;
+ }
+}
+
+static bool8 InitPokeblockMenu(void)
+{
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankHBlankCallbacksToNull();
+ clear_scheduled_bg_copies_to_vram();
+ gMain.state++;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ gMain.state++;
+ break;
+ case 2:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 3:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = 1;
+ gMain.state++;
+ break;
+ case 4:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 5:
+ if (sPokeblockMenu->caseId != PBLOCK_CASE_BATTLE)
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 6:
+ HandleInitBackgrounds();
+ sPokeblockMenu->gfxState = 0;
+ gMain.state++;
+ break;
+ case 7:
+ if (!LoadPokeblockMenuGfx())
+ return FALSE;
+ gMain.state++;
+ break;
+ case 8:
+ SetMenuItemsCountAndMaxShowed();
+ sub_81362E0();
+ sub_8136344();
+ gMain.state++;
+ break;
+ case 9:
+ sPokeblockMenu->pokeblockCaseSpriteId = CreatePokeblockCaseSprite(56, 64, 0);
+ gMain.state++;
+ break;
+ case 10:
+ sub_8122344(sPokeblockMenu->field_E75, FIELD_E75_COUNT);
+ gMain.state++;
+ break;
+ case 11:
+ HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x1005);
+ gMain.state++;
+ break;
+ case 12:
+ HandleInitWindows();
+ gMain.state++;
+ break;
+ case 13:
+ HandlePokeblockListMenuItems();
+ gMain.state++;
+ break;
+ case 14:
+ sub_81363BC();
+ gMain.state++;
+ break;
+ case 15:
+ taskId = CreateTask(Task_HandlePokeblockMenuInput, 0);
+ gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sSavedPokeblockData.lastItemPage, sSavedPokeblockData.lastItemPos);
+ gMain.state++;
+ break;
+ case 16:
+ PutPokeblockInfoText();
+ gMain.state++;
+ break;
+ case 17:
+ BlendPalettes(-1, 0x10, 0);
+ gMain.state++;
+ break;
+ case 18:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ gPaletteFade.bufferTransferDisabled = 0;
+ gMain.state++;
+ break;
+ default:
+ SetVBlankCallback(VBlankCB_PokeblockMenu);
+ SetMainCallback2(CB2_PokeblockMenu);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void HandleInitBackgrounds(void)
+{
+ ResetVramOamAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBgTemplatesForPokeblockMenu, ARRAY_COUNT(sBgTemplatesForPokeblockMenu));
+ SetBgTilemapBuffer(2, sPokeblockMenu->tilemap);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(2);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static bool8 LoadPokeblockMenuGfx(void)
+{
+ switch (sPokeblockMenu->gfxState)
+ {
+ case 0:
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(2, gMenuPokeblock_Gfx, 0, 0, 0);
+ sPokeblockMenu->gfxState++;
+ break;
+ case 1:
+ if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ {
+ LZDecompressWram(gMenuPokeblock_Tilemap, sPokeblockMenu->tilemap);
+ sPokeblockMenu->gfxState++;
+ }
+ break;
+ case 2:
+ LoadCompressedPalette(gMenuPokeblock_Pal, 0, 0xC0);
+ sPokeblockMenu->gfxState++;
+ break;
+ case 3:
+ LoadCompressedObjectPic(&gPokeblockCase_SpriteSheet);
+ sPokeblockMenu->gfxState++;
+ break;
+ case 4:
+ LoadCompressedObjectPalette(&gPokeblockCase_SpritePal);
+ sPokeblockMenu->gfxState++;
+ break;
+ case 5:
+ LoadListMenuArrowsGfx();
+ sPokeblockMenu->gfxState = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void HandleInitWindows(void)
+{
+ u8 i;
+
+ InitWindows(sWindowTemplatesForPokeblockMenu);
+ DeactivateAllTextPrinters();
+ LoadUserWindowBorderGfx(0, 1, 0xE0);
+ LoadMessageBoxGfx(0, 0xA, 0xD0);
+ LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
+
+ for (i = 0; i < ARRAY_COUNT(sWindowTemplatesForPokeblockMenu) - 1; i++)
+ {
+ FillWindowPixelBuffer(i, 0);
+ }
+
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+static void PrintOnPokeblockWindow(u8 windowId, const u8 *string, s32 x)
+{
+ AddTextPrinterParameterized2(windowId, 1, x, 1, 0, 0, sTextColorInPokeblockMenu, 0, string);
+}
+
+static void PutPokeblockInfoText(void)
+{
+ u8 i;
+
+ const u8 *itemName = ItemId_GetName(ITEM_POKEBLOCK_CASE);
+ PrintOnPokeblockWindow(0, itemName, GetStringCenterAlignXOffset(1, itemName, 0x48));
+
+ PrintOnPokeblockWindow(2, gText_Spicy, 0);
+ PrintOnPokeblockWindow(3, gText_Dry, 0);
+ PrintOnPokeblockWindow(4, gText_Sweet, 0);
+ PrintOnPokeblockWindow(5, gText_Bitter, 0);
+ PrintOnPokeblockWindow(6, gText_Sour, 0);
+
+ for (i = 0; i < 8; i++)
+ {
+ PutWindowTilemap(i);
+ }
+}
+
+static void HandlePokeblockListMenuItems(void)
+{
+ u16 i;
+
+ for (i = 0; i < sPokeblockMenu->itemsNo - 1; i++)
+ {
+ PutPokeblockListMenuString(sPokeblockMenu->menuItemsStrings[i], i);
+ sPokeblockMenu->items[i].name = sPokeblockMenu->menuItemsStrings[i];
+ sPokeblockMenu->items[i].id = i;
+ }
+
+ StringCopy(sPokeblockMenu->menuItemsStrings[i], gText_StowCase);
+ sPokeblockMenu->items[i].name = sPokeblockMenu->menuItemsStrings[i];
+ sPokeblockMenu->items[i].id = LIST_B_PRESSED;
+
+ gMultiuseListMenuTemplate = sPokeblockListMenuTemplate;
+ gMultiuseListMenuTemplate.fontId = 7;
+ gMultiuseListMenuTemplate.totalItems = sPokeblockMenu->itemsNo;
+ gMultiuseListMenuTemplate.items = sPokeblockMenu->items;
+ gMultiuseListMenuTemplate.maxShowed = sPokeblockMenu->maxShowed;
+}
+
+static void PutPokeblockListMenuString(u8 *dst, u16 pkblId)
+{
+ struct Pokeblock *pkblock = &gSaveBlock1Ptr->pokeblocks[pkblId];
+ u8 *txtPtr = StringCopy(dst, gPokeblockNames[pkblock->color]);
+
+ *(txtPtr++) = EXT_CTRL_CODE_BEGIN;
+ *(txtPtr++) = 0x12;
+ *(txtPtr++) = 0x57;
+
+ ConvertIntToDecimalStringN(gStringVar1, GetHighestPokeblocksFlavorLevel(pkblock), STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringExpandPlaceholders(txtPtr, gText_LvVar1);
+}
+
+static void MovePokeblockMenuCursor(s32 pkblId, bool8 arg1, struct ListMenu *arg2)
+{
+ if (arg1 != TRUE)
+ {
+ PlaySE(SE_SELECT);
+ gSprites[sPokeblockMenu->pokeblockCaseSpriteId].callback = sub_8136470;
+ }
+
+ if (!sPokeblockMenu->isSwapping)
+ sub_8135FCC(pkblId);
+}
+
+static void sub_8135FCC(s32 pkblId)
+{
+ u8 i;
+ struct Pokeblock *pokeblock;
+ u16 rectTilemapSrc[2];
+
+ FillWindowPixelBuffer(7, 0);
+
+ if (pkblId != LIST_B_PRESSED)
+ {
+ pokeblock = &gSaveBlock1Ptr->pokeblocks[pkblId];
+ rectTilemapSrc[0] = 0x17;
+ rectTilemapSrc[1] = 0x18;
+ for (i = 0; i < FLAVOR_COUNT; i++)
+ {
+ if (GetPokeblockData(pokeblock, PBLOCK_SPICY + i) > 0)
+ {
+ rectTilemapSrc[0] = (i << 0xC) + 0x17;
+ rectTilemapSrc[1] = (i << 0xC) + 0x18;
+ }
+ else
+ {
+ rectTilemapSrc[0] = 0xF;
+ rectTilemapSrc[1] = 0xF;
+ }
+ CopyToBgTilemapBufferRect(2, rectTilemapSrc, (i / 3 * 6) + 1, (i % 3 * 2) + 13, 1, 2);
+ }
+ ConvertIntToDecimalStringN(gStringVar1, GetPokeblocksFeel(pokeblock), STR_CONV_MODE_RIGHT_ALIGN, 2);
+ PrintOnPokeblockWindow(7, gStringVar1, 4);
+ }
+ else
+ {
+ rectTilemapSrc[0] = 0xF;
+ rectTilemapSrc[1] = 0xF;
+
+ for (i = 0; i < FLAVOR_COUNT; i++)
+ {
+ CopyToBgTilemapBufferRect(2, rectTilemapSrc, (i / 3 * 6) + 1, (i % 3 * 2) + 13, 1, 2);
+ }
+ CopyWindowToVram(7, 2);
+ }
+
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(2);
+}
+
+static void HandlePokeblockMenuCursor(u16 cursorPos, u16 arg1)
+{
+ FillBgTilemapBufferRect_Palette0(2, arg1, 0xF, (cursorPos * 2) + 1, 0xE, 2);
+ schedule_bg_copy_tilemap_to_vram(2);
+}
+
+static void CompactPokeblockSlots(void)
+{
+ u16 i, j;
+
+ for (i = 0; i < POKEBLOCKS_COUNT - 1; i++)
+ {
+ for (j = i + 1; j < POKEBLOCKS_COUNT; j++)
+ {
+ if (gSaveBlock1Ptr->pokeblocks[i].color == 0)
+ {
+ struct Pokeblock temp = gSaveBlock1Ptr->pokeblocks[i];
+ gSaveBlock1Ptr->pokeblocks[i] = gSaveBlock1Ptr->pokeblocks[j];
+ gSaveBlock1Ptr->pokeblocks[j] = temp;
+ }
+ }
+ }
+}
+
+static void SwapSortPokeblocksInternalData(u32 id1, u32 id2)
+{
+ s16 i, count;
+ struct Pokeblock *pokeblocks = gSaveBlock1Ptr->pokeblocks;
+ struct Pokeblock *copyPokeblock1;
+
+ if (id1 == id2)
+ return;
+
+ copyPokeblock1 = Alloc(sizeof(struct Pokeblock));
+ *copyPokeblock1 = pokeblocks[id1];
+
+ if (id2 > id1)
+ {
+ id2--;
+ for (count = id2, i = id1; i < count; i++)
+ pokeblocks[i] = pokeblocks[i + 1];
+ }
+ else
+ {
+ for (count = id2, i = id1; i > count; i--)
+ pokeblocks[i] = pokeblocks[i - 1];
+ }
+
+ pokeblocks[id2] = *copyPokeblock1;
+ Free(copyPokeblock1);
+}
+
+void ResetPokeblockScrollPositions(void)
+{
+ sSavedPokeblockData.lastItemPos = 0;
+ sSavedPokeblockData.lastItemPage = 0;
+}
+
+static void SetMenuItemsCountAndMaxShowed(void)
+{
+ u16 i;
+
+ CompactPokeblockSlots();
+
+ for (sPokeblockMenu->itemsNo = 0, i = 0; i < POKEBLOCKS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pokeblocks[i].color != 0)
+ sPokeblockMenu->itemsNo++;
+ }
+
+ sPokeblockMenu->itemsNo++; // STOW CASE menu item
+
+ if (sPokeblockMenu->itemsNo > 9)
+ sPokeblockMenu->maxShowed = 9;
+ else
+ sPokeblockMenu->maxShowed = sPokeblockMenu->itemsNo;
+}
+
+static void sub_81362E0(void)
+{
+ if (sSavedPokeblockData.lastItemPage != 0)
+ {
+ if (sSavedPokeblockData.lastItemPage + sPokeblockMenu->maxShowed > sPokeblockMenu->itemsNo)
+ sSavedPokeblockData.lastItemPage = sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed;
+ }
+
+ if (sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos >= sPokeblockMenu->itemsNo)
+ {
+ if (sPokeblockMenu->itemsNo == 0)
+ sSavedPokeblockData.lastItemPos = 0;
+ else
+ sSavedPokeblockData.lastItemPos = sPokeblockMenu->itemsNo - 1;
+ }
+}
+
+static void sub_8136344(void)
+{
+ if (sSavedPokeblockData.lastItemPos > 4)
+ {
+ u8 i;
+
+ for (i = 0;
+ (i < sSavedPokeblockData.lastItemPos - 4) && (sSavedPokeblockData.lastItemPage + sPokeblockMenu->maxShowed != sPokeblockMenu->itemsNo);
+ sSavedPokeblockData.lastItemPos--, sSavedPokeblockData.lastItemPage++, i++);
+ }
+}
+
+static void sub_81363BC(void)
+{
+ if (sPokeblockMenu->unkTaskId == 0xFF)
+ {
+ sPokeblockMenu->unkTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 8, 0x98, sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed,
+ 0x456, 0x456, &sSavedPokeblockData.lastItemPage);
+ }
+}
+
+static void sub_8136418(void)
+{
+ if (sPokeblockMenu->unkTaskId != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sPokeblockMenu->unkTaskId);
+ sPokeblockMenu->unkTaskId = 0xFF;
+ }
+}
+
+u8 CreatePokeblockCaseSprite(s16 x, s16 y, u8 subpriority)
+{
+ return CreateSprite(&sSpriteTemplate_PokeblockCase, x, y, subpriority);
+}
+
+static void sub_8136470(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 1)
+ sprite->data[0] = 0;
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->oam.affineMode = 1;
+ sprite->affineAnims = sSpriteAffineAnimTable_85B26F0;
+ InitSpriteAffineAnim(sprite);
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
+ break;
+ case 1:
+ if (++sprite->data[1] > 11)
+ {
+ sprite->oam.affineMode = 0;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+static void FadePaletteAndSetTaskToClosePokeblockCase(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_FreeDataAndExitPokeblockCase;
+}
+
+static void Task_FreeDataAndExitPokeblockCase(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (!gPaletteFade.active)
+ {
+ if (sPokeblockMenu->caseId == PBLOCK_CASE_FEEDER || sPokeblockMenu->caseId == PBLOCK_CASE_GIVE)
+ gFieldCallback = sub_80AF168;
+
+ DestroyListMenuTask(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos);
+ sub_8136418();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+
+ if (sPokeblockMenu->callbackOnUse != NULL)
+ SetMainCallback2(sPokeblockMenu->callbackOnUse);
+ else
+ SetMainCallback2(sSavedPokeblockData.callback);
+
+ FreeAllWindowBuffers();
+ Free(sPokeblockMenu);
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_HandlePokeblockMenuInput(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (!gPaletteFade.active && sub_81221EC() != TRUE)
+ {
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos);
+ if (sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos != sPokeblockMenu->itemsNo - 1)
+ {
+ PlaySE(SE_SELECT);
+ HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x2005);
+ data[2] = sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos;
+ sPokeblockMenu->isSwapping = TRUE;
+ gTasks[taskId].func = Task_HandlePokeblocksSwapInput;
+ }
+ }
+ else
+ {
+ u16 oldPosition = sSavedPokeblockData.lastItemPos;
+ s32 itemId = ListMenuHandleInputGetItemId(data[0]);
+
+ ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos);
+ if (oldPosition != sSavedPokeblockData.lastItemPos)
+ {
+ HandlePokeblockMenuCursor(oldPosition, 5);
+ HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x1005);
+ }
+
+ switch (itemId)
+ {
+ case LIST_NOTHING_CHOSEN:
+ break;
+ case LIST_B_PRESSED:
+ PlaySE(SE_SELECT);
+ gSpecialVar_Result = 0xFFFF;
+ gSpecialVar_ItemId = 0;
+ FadePaletteAndSetTaskToClosePokeblockCase(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ gSpecialVar_ItemId = itemId;
+ PutPokeblockOptionsWindow(taskId);
+ break;
+ }
+ }
+ }
+}
+
+static void Task_HandlePokeblocksSwapInput(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (sub_81221EC() == TRUE)
+ return;
+
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos);
+ HandlePokeblocksSwap(taskId, FALSE);
+ }
+ else
+ {
+ u16 i = sSavedPokeblockData.lastItemPage;
+ u16 var = sSavedPokeblockData.lastItemPos;
+ s32 itemId = ListMenuHandleInputGetItemId(data[0]);
+
+ ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos);
+ if (i != sSavedPokeblockData.lastItemPage || var != sSavedPokeblockData.lastItemPos)
+ {
+ for (i = 0; i < 9; i++)
+ {
+ var = i + sSavedPokeblockData.lastItemPage;
+ if (var == data[2])
+ HandlePokeblockMenuCursor(i, 0x2005);
+ else
+ HandlePokeblockMenuCursor(i, 5);
+ }
+ }
+
+ sub_81223FC(sPokeblockMenu->field_E75, FIELD_E75_COUNT, 0);
+ sub_8122448(sPokeblockMenu->field_E75, FIELD_E75_COUNT, 0x80, (sSavedPokeblockData.lastItemPos * 16) + 8);
+
+ switch (itemId)
+ {
+ case LIST_NOTHING_CHOSEN:
+ break;
+ case LIST_B_PRESSED: // same id as STOW CASE field
+ PlaySE(SE_SELECT);
+ if (gMain.newKeys & A_BUTTON)
+ HandlePokeblocksSwap(taskId, FALSE);
+ else
+ HandlePokeblocksSwap(taskId, TRUE);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ HandlePokeblocksSwap(taskId, FALSE);
+ break;
+ }
+ }
+}
+
+static void HandlePokeblocksSwap(u8 taskId, bool8 noSwap)
+{
+ u8 i;
+ s16 *data = gTasks[taskId].data;
+ u16 swappedFromId = sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos;
+
+ sPokeblockMenu->isSwapping = FALSE;
+ DestroyListMenuTask(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos);
+
+ if (!noSwap && data[2] != swappedFromId && data[2] != swappedFromId - 1)
+ {
+ SwapSortPokeblocksInternalData(data[2], swappedFromId);
+ HandlePokeblockListMenuItems();
+ }
+
+ if (data[2] < swappedFromId)
+ sSavedPokeblockData.lastItemPos--;
+
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sSavedPokeblockData.lastItemPage, sSavedPokeblockData.lastItemPos);
+ schedule_bg_copy_tilemap_to_vram(0);
+ sub_81223FC(sPokeblockMenu->field_E75, FIELD_E75_COUNT, 1);
+
+ for (i = 0; i < 9; i++)
+ HandlePokeblockMenuCursor(i, 5);
+
+ HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x1005);
+ gTasks[taskId].func = Task_HandlePokeblockMenuInput;
+}
+
+static void PutPokeblockOptionsWindow(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (sPokeblockMenu->optionsNo == 3)
+ data[1] = 8;
+ else
+ data[1] = 9;
+
+ sub_8136418();
+ SetWindowBorderStyle(data[1], 0, 1, 0xE);
+ sub_81995E4(data[1], sPokeblockMenu->optionsNo, sPokeblockMenuActions, sPokeblockMenu->pokeblockOptionsIds);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[1], sPokeblockMenu->optionsNo, 0);
+ PutWindowTilemap(data[1]);
+ schedule_bg_copy_tilemap_to_vram(1);
+
+ gTasks[taskId].func = Task_HandlePokeblockOptionsInput;
+}
+
+static void Task_HandlePokeblockOptionsInput(u8 taskId)
+{
+ s8 itemId;
+
+ if (sub_81221EC() == TRUE)
+ return;
+
+ itemId = ProcessMenuInputNoWrapAround();
+ if (itemId == MENU_NOTHING_CHOSEN)
+ {
+ return;
+ }
+ else if (itemId == MENU_B_PRESSED)
+ {
+ PlaySE(SE_SELECT);
+ PokeblockAction_Cancel(taskId);
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ sPokeblockMenuActions[sPokeblockMenu->pokeblockOptionsIds[itemId]].func.void_u8(taskId);
+ }
+}
+
+static void PokeblockAction_UseOnField(u8 taskId)
+{
+ sPokeblockMenu->callbackOnUse = UsePokeblockOnField;
+ FadePaletteAndSetTaskToClosePokeblockCase(taskId);
+}
+
+static void UsePokeblockOnField(void)
+{
+ ChooseMonToGivePokeblock(&gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId], ReturnToPokeblockCaseOnField);
+}
+
+static void ReturnToPokeblockCaseOnField(void)
+{
+ OpenPokeblockCase(PBLOCK_CASE_FIELD, sSavedPokeblockData.callback);
+}
+
+static void PokeblockAction_Toss(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ sub_8198070(data[1], FALSE);
+ StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId].color]);
+ StringExpandPlaceholders(gStringVar4, gText_ThrowAwayVar1);
+ DisplayMessageAndContinueTask(taskId, 10, 10, 13, 1, GetPlayerTextSpeed(), gStringVar4, CreateTossPokeblockYesNoMenu);
+}
+
+static void CreateTossPokeblockYesNoMenu(u8 taskId)
+{
+ CreateYesNoMenuWithCallbacks(taskId, &sTossPkblockWindowTemplate, 1, 0, 2, 1, 0xE, &sTossYesNoFuncTable);
+}
+
+static void TossPokeblockChoice_Yes(u8 taskId)
+{
+ StringExpandPlaceholders(gStringVar4, gText_Var1ThrownAway);
+ DisplayMessageAndContinueTask(taskId, 10, 10, 13, 1, GetPlayerTextSpeed(), gStringVar4, HandleErasePokeblock);
+}
+
+static void HandleErasePokeblock(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ s16 *data;
+ u16 *lastPage, *lastPos;
+
+ TryClearPokeblock(gSpecialVar_ItemId);
+ PlaySE(SE_SELECT);
+
+ lastPage = &sSavedPokeblockData.lastItemPage;
+ lastPos = &sSavedPokeblockData.lastItemPos;
+ data = gTasks[taskId].data;
+
+ DestroyListMenuTask(data[0], lastPage, lastPos);
+ HandlePokeblockMenuCursor(*lastPos, 5);
+ SetMenuItemsCountAndMaxShowed();
+ sub_81362E0();
+ HandlePokeblockListMenuItems();
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *lastPage, *lastPos);
+ HandlePokeblockMenuCursor(*lastPos, 0x1005);
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ TossPokeblockChoice_No(taskId);
+ }
+}
+
+static void TossPokeblockChoice_No(u8 taskId)
+{
+ sub_8197DF8(10, FALSE);
+ schedule_bg_copy_tilemap_to_vram(1);
+ sub_81363BC();
+ gTasks[taskId].func = Task_HandlePokeblockMenuInput;
+}
+
+static void PokeblockAction_UseInBattle(u8 taskId)
+{
+ u8 nature = GetNature(&gEnemyParty[0]);
+ s16 gain = PokeblockGetGain(nature, &gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId]);
+ StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId].color]);
+ TryClearPokeblock(gSpecialVar_ItemId);
+
+ gSpecialVar_ItemId = gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId].color << 8;
+ if (gain == 0)
+ gSpecialVar_ItemId += 1;
+ else if (gain > 0)
+ gSpecialVar_ItemId += 2;
+ else
+ gSpecialVar_ItemId += 3;
+
+ FadePaletteAndSetTaskToClosePokeblockCase(taskId);
+}
+
+static void PokeblockAction_UseOnPokeblockFeeder(u8 taskId)
+{
+ SafariZoneActivatePokeblockFeeder(gSpecialVar_ItemId);
+ StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId].color]);
+ gSpecialVar_Result = gSpecialVar_ItemId;
+ TryClearPokeblock(gSpecialVar_ItemId);
+ gSpecialVar_ItemId = 0;
+ FadePaletteAndSetTaskToClosePokeblockCase(taskId);
+}
+
+static void PokeblockAction_GiveToContestLady(u8 taskId)
+{
+ gSpecialVar_0x8004 = GivePokeblockToContestLady(&gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId]);
+ gSpecialVar_Result = gSpecialVar_ItemId;
+ TryClearPokeblock(gSpecialVar_ItemId);
+ gSpecialVar_ItemId = 0;
+ FadePaletteAndSetTaskToClosePokeblockCase(taskId);
+}
+
+static void PokeblockAction_Cancel(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ sub_8198070(data[1], FALSE);
+ schedule_bg_copy_tilemap_to_vram(1);
+ sub_81363BC();
+ gTasks[taskId].func = Task_HandlePokeblockMenuInput;
+}
+
+static void ClearPokeblock(u8 pkblId)
+{
+ gSaveBlock1Ptr->pokeblocks[pkblId].color = 0;
+ gSaveBlock1Ptr->pokeblocks[pkblId].spicy = 0;
+ gSaveBlock1Ptr->pokeblocks[pkblId].dry = 0;
+ gSaveBlock1Ptr->pokeblocks[pkblId].sweet = 0;
+ gSaveBlock1Ptr->pokeblocks[pkblId].bitter = 0;
+ gSaveBlock1Ptr->pokeblocks[pkblId].sour = 0;
+ gSaveBlock1Ptr->pokeblocks[pkblId].feel = 0;
+}
+
+void ClearPokeblocks(void)
+{
+ u8 i;
+
+ for (i = 0; i < POKEBLOCKS_COUNT; i++)
+ ClearPokeblock(i);
+}
+
+u8 GetHighestPokeblocksFlavorLevel(const struct Pokeblock *pokeblock)
+{
+ u8 i;
+ u8 maxFlavor = GetPokeblockData(pokeblock, PBLOCK_SPICY);
+
+ for (i = PBLOCK_SPICY; i < FLAVOR_COUNT; i++)
+ {
+ u8 currFlavor = GetPokeblockData(pokeblock, PBLOCK_SPICY + i);
+ if (maxFlavor < currFlavor)
+ maxFlavor = currFlavor;
+ }
+
+ return maxFlavor;
+}
+
+u8 GetPokeblocksFeel(const struct Pokeblock *pokeblock)
+{
+ u8 feel = GetPokeblockData(pokeblock, PBLOCK_FEEL);
+ if (feel > POKEBLOCK_MAX_FEEL)
+ feel = POKEBLOCK_MAX_FEEL;
+
+ return feel;
+}
+
+s8 GetFirstFreePokeblockSlot(void)
+{
+ u8 i;
+
+ for (i = 0; i < POKEBLOCKS_COUNT; i++)
+ {
+ if (gSaveBlock1Ptr->pokeblocks[i].color == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+bool32 AddPokeblock(const struct Pokeblock *pokeblock)
+{
+ s8 slot = GetFirstFreePokeblockSlot();
+
+ if (slot == -1)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSaveBlock1Ptr->pokeblocks[slot] = *pokeblock;
+ return TRUE;
+ }
+}
+
+bool32 TryClearPokeblock(u8 pkblId)
+{
+ if (gSaveBlock1Ptr->pokeblocks[pkblId].color == 0)
+ {
+ return FALSE;
+ }
+ else
+ {
+ ClearPokeblock(pkblId);
+ return TRUE;
+ }
+}
+
+s16 GetPokeblockData(const struct Pokeblock *pokeblock, u8 field)
+{
+ if (field == PBLOCK_COLOR)
+ return pokeblock->color;
+ if (field == PBLOCK_SPICY)
+ return pokeblock->spicy;
+ if (field == PBLOCK_DRY)
+ return pokeblock->dry;
+ if (field == PBLOCK_SWEET)
+ return pokeblock->sweet;
+ if (field == PBLOCK_BITTER)
+ return pokeblock->bitter;
+ if (field == PBLOCK_SOUR)
+ return pokeblock->sour;
+ if (field == PBLOCK_FEEL)
+ return pokeblock->feel;
+
+ return 0;
+}
+
+s16 PokeblockGetGain(u8 nature, const struct Pokeblock *pokeblock)
+{
+ u8 flavor;
+ s16 curGain, totalGain = 0;
+
+ for (flavor = 0; flavor < FLAVOR_COUNT; flavor++)
+ {
+ curGain = GetPokeblockData(pokeblock, flavor + PBLOCK_SPICY);
+ if (curGain > 0)
+ totalGain += curGain * gPokeblockFlavorCompatibilityTable[5 * nature + flavor];
+ }
+
+ return totalGain;
+}
+
+void PokeblockCopyName(const struct Pokeblock *pokeblock, u8 *dest)
+{
+ u8 color = GetPokeblockData(pokeblock, PBLOCK_COLOR);
+ StringCopy(dest, gPokeblockNames[color]);
+}
+
+bool8 CopyMonFavoritePokeblockName(u8 nature, u8 *dest)
+{
+ u8 i;
+
+ for (i = 0; i < FLAVOR_COUNT; i++)
+ {
+ if (PokeblockGetGain(nature, &sFavoritePokeblocksTable[i]) > 0)
+ {
+ StringCopy(dest, gPokeblockNames[i + 1]);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+u8 GetPokeblocksFlavor(const struct Pokeblock *pokeblock)
+{
+ s16 bestFlavor = 0;
+ s16 i;
+
+ for (i = 0; i < FLAVOR_COUNT; i++)
+ {
+ if (GetPokeblockData(pokeblock, bestFlavor + 1) < GetPokeblockData(pokeblock, i + 1))
+ bestFlavor = i;
+ }
+
+ return bestFlavor;
+}
diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c
new file mode 100644
index 000000000..5f06ed7e8
--- /dev/null
+++ b/src/pokeblock_feed.c
@@ -0,0 +1,1105 @@
+#include "global.h"
+#include "pokeblock.h"
+#include "sprite.h"
+#include "task.h"
+#include "palette.h"
+#include "menu.h"
+#include "malloc.h"
+#include "pokemon.h"
+#include "blend_palette.h"
+#include "main.h"
+#include "menu_helpers.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "data2.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "strings.h"
+#include "string_util.h"
+#include "party_menu.h"
+#include "m4a.h"
+#include "sound.h"
+#include "trig.h"
+#include "graphics.h"
+#include "text_window.h"
+#include "battle.h" // to get rid of once gMonSpritesGfxPtr is put elsewhere
+
+struct PokeblockFeedStruct
+{
+ struct Sprite *monSpritePtr;
+ struct Sprite savedMonSprite;
+ u8 tilemapBuffer[0x808];
+ s16 field_850[0x200];
+ s16 field_C50[0x200];
+ u8 field_1050;
+ u8 animId;
+ u8 field_1052;
+ bool8 noMonFlip;
+ u16 species;
+ u16 field_1056;
+ u16 field_1058;
+ u8 nature;
+ u8 monSpriteId_;
+ u8 field_105C;
+ u8 monSpriteId;
+ u8 pokeblockCaseSpriteId;
+ u8 pokeblockSpriteId;
+ s16 field_1060[15];
+ s16 loadGfxState;
+ u8 unused;
+};
+
+extern u16 gSpecialVar_ItemId;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+
+extern const u8 gBattleTerrainPalette_Frontier[];
+extern const u8 gBattleTerrainTiles_Building[];
+extern const u8 gUnknown_08D9BA44[];
+extern const struct CompressedSpriteSheet gMonFrontPicTable[];
+extern const u16 gUnknown_0860F074[];
+
+extern bool8 sub_81221EC(void);
+
+// this file's functions
+static void HandleInitBackgrounds(void);
+static void HandleInitWindows(void);
+static void LaunchPokeblockFeedTask(void);
+static void SetPokeblockSpritePal(u8 pokeblockCaseId);
+static void sub_817A5CC(void);
+static void sub_8148108(u8 spriteId, bool8 a1);
+static void DoPokeblockCaseThrowEffect(u8 spriteId, bool8 arg1);
+static void PrepareMonToMoveToPokeblock(u8 spriteId);
+static void Task_HandleMonAtePokeblock(u8 taskId);
+static void Task_PaletteFadeToReturn(u8 taskId);
+static void sub_817A634(void);
+static void sub_817A468(struct Sprite *sprite);
+static void sub_817AB68(void);
+static void sub_817AA54(void);
+static bool8 sub_817A91C(void);
+static bool8 FreeMonSpriteOamMatrix(void);
+static bool8 sub_817A9E4(void);
+static bool8 LoadMonAndSceneGfx(struct Pokemon *mon);
+static u8 CreatePokeblockSprite(void);
+static u8 CreatePokeblockCaseSpriteForFeeding(void);
+static u8 CreateMonSprite(struct Pokemon *mon);
+static void SpriteCB_ThrownPokeblock(struct Sprite* sprite);
+
+// ram variables
+EWRAM_DATA static struct PokeblockFeedStruct *sPokeblockFeed = NULL;
+EWRAM_DATA static struct CompressedSpritePalette sPokeblockSpritePal = {0};
+
+// const rom data
+static const u8 sNatureToMonPokeblockAnim[][2] =
+{
+ { 0, 0 }, // HARDY
+ { 3, 0 }, // LONELY
+ { 4, 1 }, // BRAVE
+ { 5, 0 }, // ADAMANT
+ { 10, 0 }, // NAUGHTY
+ { 13, 0 }, // BOLD
+ { 15, 0 }, // DOCILE
+ { 16, 2 }, // RELAXED
+ { 18, 0 }, // IMPISH
+ { 19, 0 }, // LAX
+ { 20, 0 }, // TIMID
+ { 25, 0 }, // HASTY
+ { 27, 3 }, // SERIOUS
+ { 28, 0 }, // JOLLY
+ { 29, 0 }, // NAIVE
+ { 33, 4 }, // MODEST
+ { 36, 0 }, // MILD
+ { 37, 0 }, // QUIET
+ { 39, 0 }, // BASHFUL
+ { 42, 0 }, // RASH
+ { 45, 0 }, // CALM
+ { 46, 5 }, // GENTLE
+ { 47, 6 }, // SASSY
+ { 48, 0 }, // CAREFUL
+ { 53, 0 }, // QUIRKY
+};
+
+static const s16 sMonPokeblockAnims[][10] =
+{
+ // HARDY
+ { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0},
+ { 0, 4, 0, 16, 24, 0, 0, 0, 12, 0},
+ { 0, 4, 0, 32, 32, 0, 0, 0, 16, 1},
+
+ // LONELY
+ { 0, 3, 6, 0, 48, 0, 0, 0, 24, 1},
+
+ // BRAVE
+ { 64, 16, -24, 0, 32, 0, 0, 0, 0, 1},
+
+ // ADAMANT
+ { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0},
+ { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0},
+ { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0},
+ { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0},
+ { 0, 4, -16, 0, 4, 0, 16, 0, 0, 1},
+
+ // NAUGHTY
+ { 0, 3, 6, 0, 12, 0, 0, 0, 6, 0},
+ { 0, 3, -6, 0, 12, 0, 0, 0, 6, 0},
+ { 0, 16, 16, 0, 45, 1, 0, 0, 0, 1},
+
+ // BOLD
+ { 0, 16, 0, 24, 32, 0, 0, 0, 16, 0},
+ { 0, 16, 0, 23, 32, 0, 0, 0, 16, 1},
+
+ // DOCILE
+ { 0, 0, 0, 0, 80, 0, 0, 0, 0, 1},
+
+ // RELAXED
+ { 0, 2, 8, 0, 32, 0, 0, 0, 0, 0},
+ { 0, 2, -8, 0, 32, 0, 0, 0, 0, 1},
+
+ // IMPISH
+ { 0, 32, 2, 1, 48, 1, 0, 0, 24, 1},
+
+ // LAX
+ { 0, 2, 16, 16, 128, 0, 0, 0, 0, 1},
+
+ // TIMID
+ { 0, 2, -8, 0, 48, 0, -24, 0, 0, 0},
+ { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0},
+ { 64, 32, 2, 0, 36, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0},
+ { 0, 2, 8, 0, 48, 0, 24, 0, 0, 1},
+
+ // HASTY
+ { 64, 24, 16, 0, 32, 0, 0, 0, 0, 0},
+ { 0, 28, 2, 1, 32, 1, 0, 0, 16, 1},
+
+ // SERIOUS
+ { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1},
+
+ // JOLLY
+ { 64, 16, -16, 2, 48, 0, 0, 0, 32, 1},
+
+ // NAIVE
+ { 0, 12, -8, 4, 24, 0, 8, 0, 12, 0},
+ { 0, 12, 8, 8, 24, 0, -16, 0, 12, 0},
+ { 0, 12, -8, 16, 24, 0, 16, 0, 12, 0},
+ { 0, 12, 8, 28, 24, 0, -8, 0, 12, 1},
+
+ // MODEST
+ { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0},
+ { 64, 16, -4, 0, 32, 0, 0, 0, 0, 0},
+ { 0, 0, 0, 0, 8, 0, 0, 0, 0, 1},
+
+ // MILD
+ { 128, 4, 0, 8, 64, 0, 0, 0, 0, 1},
+
+ // QUIET
+ { 0, 2, 16, 0, 48, 0, 0, 0, 0, 0},
+ { 128, 2, 16, 0, 48, 0, 0, 0, 0, 1},
+
+ // BASHFUL
+ { 0, 2, -4, 0, 48, 0, -48, 0, 0, 0},
+ { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0},
+ { 0, 2, 8, 0, 24, 0, 48, 0, 0, 1},
+
+ // RASH
+ { 64, 4, 64, 58, 52, 0, -88, 0, 0, 0},
+ { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0},
+ { 0, 24, 80, 0, 32, 0, 88, 0, 0, 1},
+
+ // CALM
+ { 0, 2, 16, 4, 64, 0, 0, 0, 0, 1},
+
+ // GENTLE
+ { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1},
+
+ // SASSY
+ { 0, 0, 0, 0, 42, 0, 0, 0, 0, 1},
+
+ // CAREFUL
+ { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0},
+ { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0},
+ { 0, 4, 0, 12, 24, 0, 0, 0, 12, 0},
+ { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0},
+ { 0, 4, 0, 4, 24, 0, 0, 0, 12, 1},
+
+ // QUIRKY
+ { 0, 4, 16, 12, 64, 0, 0, 0, 0, 0},
+ { 0, -4, 16, 12, 64, 0, 0, 0, 0, 1},
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411E90[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411EA0[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 12, 1),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 30),
+ AFFINEANIMCMD_FRAME(0, 0, -12, 1),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411EC0[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 12, 1),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 28),
+ AFFINEANIMCMD_FRAME(0, 0, -4, 3),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411EE8[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411F08[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411F30[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411F50[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411F78[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411F98[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411FC0[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 24),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 4),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8411FE0[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 24),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 4),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8412008[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 2),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8412028[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 2),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F04FC[] =
+{
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411EA0,
+ sSpriteAffineAnim_8411EE8,
+ sSpriteAffineAnim_8411F30,
+ sSpriteAffineAnim_8411F78,
+ sSpriteAffineAnim_8411FC0,
+ sSpriteAffineAnim_8412008,
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411EC0,
+ sSpriteAffineAnim_8411F08,
+ sSpriteAffineAnim_8411F50,
+ sSpriteAffineAnim_8411F98,
+ sSpriteAffineAnim_8411FE0,
+ sSpriteAffineAnim_8412028,
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411E90,
+ sSpriteAffineAnim_8411E90,
+};
+
+static const struct BgTemplate sBackgroundTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const struct WindowTemplate sWindowTemplates[] =
+{
+ {0, 1, 0xF, 0x1C, 4, 0xF, 0xA},
+ DUMMY_WIN_TEMPLATE
+};
+
+static const u8* const sPokeblocksPals[] =
+{
+ gPokeblockRed_Pal,
+ gPokeblockBlue_Pal,
+ gPokeblockPink_Pal,
+ gPokeblockGreen_Pal,
+ gPokeblockYellow_Pal,
+ gPokeblockPurple_Pal,
+ gPokeblockIndigo_Pal,
+ gPokeblockBrown_Pal,
+ gPokeblockLiteBlue_Pal,
+ gPokeblockOlive_Pal,
+ gPokeblockGray_Pal,
+ gPokeblockBlack_Pal,
+ gPokeblockWhite_Pal,
+ gPokeblockGold_Pal
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_84120DC[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_MonNoFlip[] =
+{
+ sSpriteAffineAnim_84120DC
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_84120F0[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1),
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8412148[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1),
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F0664[] =
+{
+ sSpriteAffineAnim_84120DC
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F0668[] =
+{
+ sSpriteAffineAnim_84120F0
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F066C[] =
+{
+ sSpriteAffineAnim_8412148
+};
+
+static const struct OamData sThrownPokeblockOamData =
+{
+ .y = 0,
+ .affineMode = 3,
+ .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 sThrownPokeblockSpriteAnim[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sThrownPokeblockAnimTable[] =
+{
+ sThrownPokeblockSpriteAnim,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_84121C0[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(-8, -8, 0, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+static const union AffineAnimCmd *const sThrownPokeblockAffineAnimTable[] =
+{
+ sSpriteAffineAnim_84121C0
+};
+
+static const struct CompressedSpriteSheet sPokeblock_SpriteSheet =
+{
+ gPokeblock_Gfx, 0x20, GFX_TAG_POKEBLOCK
+};
+
+static const struct SpriteTemplate sThrownPokeblockSpriteTemplate =
+{
+ .tileTag = GFX_TAG_POKEBLOCK,
+ .paletteTag = GFX_TAG_POKEBLOCK,
+ .oam = &sThrownPokeblockOamData,
+ .anims = sThrownPokeblockAnimTable,
+ .images = NULL,
+ .affineAnims = sThrownPokeblockAffineAnimTable,
+ .callback = SpriteCB_ThrownPokeblock
+};
+
+// code
+static void CB2_PokeblockFeed(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB_PokeblockFeed(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static bool8 TransitionToPokeblockFeedScene(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ sPokeblockFeed = AllocZeroed(sizeof(*sPokeblockFeed));
+ SetVBlankHBlankCallbacksToNull();
+ clear_scheduled_bg_copies_to_vram();
+ gMain.state++;
+ break;
+ case 1:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = 1;
+ gMain.state++;
+ break;
+ case 2:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 3:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 4:
+ AllocateMonSpritesGfx();
+ gMain.state++;
+ break;
+ case 5:
+ HandleInitBackgrounds();
+ gMain.state++;
+ break;
+ case 6:
+ HandleInitWindows();
+ gMain.state++;
+ break;
+ case 7:
+ if (LoadMonAndSceneGfx(&gPlayerParty[gPokeblockMonId]))
+ {
+ gMain.state++;
+ }
+ break;
+ case 8:
+ sPokeblockFeed->pokeblockCaseSpriteId = CreatePokeblockCaseSpriteForFeeding();
+ gMain.state++;
+ break;
+ case 9:
+ sPokeblockFeed->monSpriteId = CreateMonSprite(&gPlayerParty[gPokeblockMonId]);
+ gMain.state++;
+ break;
+ case 10:
+ SetWindowBorderStyle(0, 1, 1, 14);
+ gMain.state++;
+ break;
+ case 11:
+ LaunchPokeblockFeedTask();
+ gMain.state++;
+ break;
+ case 12:
+ BlendPalettes(-1, 0x10, 0);
+ gMain.state++;
+ break;
+ case 13:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ gPaletteFade.bufferTransferDisabled = 0;
+ gMain.state++;
+ break;
+ default:
+ SetVBlankCallback(VBlankCB_PokeblockFeed);
+ SetMainCallback2(CB2_PokeblockFeed);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void CB2_PreparePokeblockFeedScene(void)
+{
+ while (1)
+ {
+ if (sub_81221EC() == TRUE)
+ break;
+ if (TransitionToPokeblockFeedScene() == TRUE)
+ break;
+ if (sub_81221AC() == TRUE)
+ break;
+ }
+}
+
+static void HandleInitBackgrounds(void)
+{
+ ResetVramOamAndBgCntRegs();
+
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates));
+ SetBgTilemapBuffer(1, sPokeblockFeed->tilemapBuffer);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(1);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+
+ ShowBg(0);
+ ShowBg(1);
+
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static bool8 LoadMonAndSceneGfx(struct Pokemon *mon)
+{
+ u16 species;
+ u32 personality, trainerId;
+ const struct CompressedSpritePalette *palette;
+
+ switch (sPokeblockFeed->loadGfxState)
+ {
+ case 0:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+ HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
+ sPokeblockFeed->loadGfxState++;
+ break;
+ case 1:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+ trainerId = GetMonData(mon, MON_DATA_OT_ID);
+ palette = GetMonSpritePalStructFromOtIdPersonality(species, trainerId, personality);
+
+ LoadCompressedObjectPalette(palette);
+ SetMultiuseSpriteTemplateToPokemon(palette->tag, 1);
+ sPokeblockFeed->loadGfxState++;
+ break;
+ case 2:
+ LoadCompressedObjectPic(&gPokeblockCase_SpriteSheet);
+ sPokeblockFeed->loadGfxState++;
+ break;
+ case 3:
+ LoadCompressedObjectPalette(&gPokeblockCase_SpritePal);
+ sPokeblockFeed->loadGfxState++;
+ break;
+ case 4:
+ LoadCompressedObjectPic(&sPokeblock_SpriteSheet);
+ sPokeblockFeed->loadGfxState++;
+ break;
+ case 5:
+ SetPokeblockSpritePal(gSpecialVar_ItemId);
+ LoadCompressedObjectPalette(&sPokeblockSpritePal);
+ sPokeblockFeed->loadGfxState++;
+ break;
+ case 6:
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(1, gBattleTerrainTiles_Building, 0, 0, 0);
+ sPokeblockFeed->loadGfxState++;
+ break;
+ case 7:
+ if (free_temp_tile_data_buffers_if_possible() != TRUE)
+ {
+ LZDecompressWram(gUnknown_08D9BA44, sPokeblockFeed->tilemapBuffer);
+ sPokeblockFeed->loadGfxState++;
+ }
+ break;
+ case 8:
+ LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
+ sPokeblockFeed->loadGfxState = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void HandleInitWindows(void)
+{
+ InitWindows(sWindowTemplates);
+ DeactivateAllTextPrinters();
+ LoadUserWindowBorderGfx(0, 1, 0xE0);
+ LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
+ FillWindowPixelBuffer(0, 0);
+ PutWindowTilemap(0);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void SetPokeblockSpritePal(u8 pokeblockCaseId)
+{
+ u8 colorId = GetPokeblockData(&gSaveBlock1Ptr->pokeblocks[pokeblockCaseId], PBLOCK_COLOR);
+ sPokeblockSpritePal.data = sPokeblocksPals[colorId - 1];
+ sPokeblockSpritePal.tag = GFX_TAG_POKEBLOCK;
+}
+
+// defines for task data fields
+
+#define tFrames data[0]
+#define tData1 data[1]
+
+static void Task_HandlePokeblockFeed(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ switch (gTasks[taskId].tFrames)
+ {
+ case 0:
+ sPokeblockFeed->field_1050 = 0;
+ sPokeblockFeed->field_1058 = 0;
+ sub_817A5CC();
+ break;
+ case 255:
+ DoPokeblockCaseThrowEffect(sPokeblockFeed->pokeblockCaseSpriteId, gTasks[taskId].tData1);
+ break;
+ case 269:
+ sPokeblockFeed->pokeblockSpriteId = CreatePokeblockSprite();
+ break;
+ case 281:
+ PrepareMonToMoveToPokeblock(sPokeblockFeed->monSpriteId);
+ break;
+ case 297:
+ gTasks[taskId].func = Task_HandleMonAtePokeblock;
+ return;
+ }
+
+ if (sPokeblockFeed->field_1058 < sPokeblockFeed->field_1056)
+ sub_817A634();
+ else if (sPokeblockFeed->field_1058 == sPokeblockFeed->field_1056)
+ gTasks[taskId].tFrames = 254;
+
+ sPokeblockFeed->field_1058++;
+ gTasks[taskId].tFrames++;
+ }
+}
+
+static void LaunchPokeblockFeedTask(void)
+{
+ u8 taskId = CreateTask(Task_HandlePokeblockFeed, 0);
+ gTasks[taskId].tFrames = 0;
+ gTasks[taskId].tData1 = 1;
+}
+
+static void Task_WaitForAtePokeblockText(u8 taskId)
+{
+ if (RunTextPrintersRetIsActive(0) != TRUE)
+ gTasks[taskId].func = Task_PaletteFadeToReturn;
+}
+
+static void Task_HandleMonAtePokeblock(u8 taskId)
+{
+ struct Pokemon *mon = &gPlayerParty[gPokeblockMonId];
+ struct Pokeblock *pokeblock = &gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId];
+
+ gPokeblockGain = PokeblockGetGain(GetNature(mon), pokeblock);
+ GetMonNickname(mon, gStringVar1);
+ PokeblockCopyName(pokeblock, gStringVar2);
+
+ if (gPokeblockGain == 0)
+ StringExpandPlaceholders(gStringVar4, gText_Var1AteTheVar2);
+ else if (gPokeblockGain > 0)
+ StringExpandPlaceholders(gStringVar4, gText_Var1HappilyAteVar2);
+ else
+ StringExpandPlaceholders(gStringVar4, gText_Var1DisdainfullyAteVar2);
+
+ gTextFlags.flag_0 = 1;
+ AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), NULL, 2, 1, 3);
+ gTasks[taskId].func = Task_WaitForAtePokeblockText;
+}
+
+static void Task_ReturnAfterPaletteFade(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, -1, 0x100);
+ SetMainCallback2(gMain.savedCallback);
+ DestroyTask(taskId);
+ FreeAllWindowBuffers();
+ Free(sPokeblockFeed);
+ FreeMonSpritesGfx();
+ }
+}
+
+static void Task_PaletteFadeToReturn(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_ReturnAfterPaletteFade;
+}
+
+#undef tFrames
+#undef tData1
+
+// defines for mon sprite data fields
+
+#define tDelta data[0]
+#define tDeltaMod data[1]
+#define tSpecies data[2]
+
+static u8 CreateMonSprite(struct Pokemon* mon)
+{
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2);
+ u8 spriteId = CreateSprite(&gMultiuseSpriteTemplate, 48, 80, 2);
+
+ sPokeblockFeed->species = species;
+ sPokeblockFeed->monSpriteId_ = spriteId;
+ sPokeblockFeed->nature = GetNature(mon);
+ gSprites[spriteId].tSpecies = species;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+
+ sPokeblockFeed->noMonFlip = TRUE;
+ if (!IsMonSpriteNotFlipped(species))
+ {
+ gSprites[spriteId].affineAnims = sSpriteAffineAnimTable_MonNoFlip;
+ gSprites[spriteId].oam.affineMode = 3;
+ CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);
+ sPokeblockFeed->noMonFlip = FALSE;
+ }
+
+ return spriteId;
+}
+
+static void PrepareMonToMoveToPokeblock(u8 spriteId)
+{
+ gSprites[spriteId].pos1.x = 48;
+ gSprites[spriteId].pos1.y = 80;
+ gSprites[spriteId].tDelta = -8;
+ gSprites[spriteId].tDeltaMod = 1;
+ gSprites[spriteId].callback = sub_817A468;
+}
+
+static void sub_817A468(struct Sprite* sprite)
+{
+ sprite->pos1.x += 4;
+ sprite->pos1.y += sprite->tDelta;
+ sprite->tDelta += sprite->tDeltaMod;
+
+ if (sprite->tDelta == 0)
+ PlayCry1(sprite->tSpecies, 0);
+ if (sprite->tDelta == 9)
+ sprite->callback = SpriteCallbackDummy;
+}
+
+#undef tDelta
+#undef tDeltaMod
+#undef tSpecies
+
+static u8 CreatePokeblockCaseSpriteForFeeding(void)
+{
+ u8 spriteId = CreatePokeblockCaseSprite(188, 100, 2);
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].affineAnims = sSpriteAffineAnimTable_85F0664;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ return spriteId;
+}
+
+static void DoPokeblockCaseThrowEffect(u8 spriteId, bool8 a1)
+{
+ FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
+ gSprites[spriteId].oam.affineMode = 3;
+
+ if (!a1)
+ gSprites[spriteId].affineAnims = sSpriteAffineAnimTable_85F0668;
+ else
+ gSprites[spriteId].affineAnims = sSpriteAffineAnimTable_85F066C;
+
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+}
+
+// defines for the pokeblock sprite data fields
+#define tDelta data[0]
+#define tDeltaMod data[1]
+
+static u8 CreatePokeblockSprite(void)
+{
+ u8 spriteId = CreateSprite(&sThrownPokeblockSpriteTemplate, 174, 84, 1);
+ gSprites[spriteId].tDelta = -12;
+ gSprites[spriteId].tDeltaMod = 1;
+ return spriteId;
+}
+
+static void SpriteCB_ThrownPokeblock(struct Sprite* sprite)
+{
+ sprite->pos1.x -= 4;
+ sprite->pos1.y += sprite->tDelta;
+ sprite->tDelta += sprite->tDeltaMod;
+ if (sprite->tDelta == 10)
+ DestroySprite(sprite);
+}
+
+#undef tDelta
+#undef tDeltaMod
+
+static void sub_817A5CC(void)
+{
+ u8 animId, i;
+ struct PokeblockFeedStruct *pokeblockFeed;
+
+ pokeblockFeed = sPokeblockFeed;
+ pokeblockFeed->field_1056 = 1;
+ animId = sNatureToMonPokeblockAnim[pokeblockFeed->nature][0];
+ for (i = 0; i < 8; i++, animId++)
+ {
+ pokeblockFeed->field_1056 += sMonPokeblockAnims[animId][4];
+ if (sMonPokeblockAnims[animId][9] == 1)
+ break;
+ }
+}
+
+static void sub_817A634(void)
+{
+ struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed;
+
+ switch (pokeblockFeed->field_1050)
+ {
+ case 0:
+ pokeblockFeed->animId = sNatureToMonPokeblockAnim[pokeblockFeed->nature][0];
+ pokeblockFeed->monSpritePtr = &gSprites[pokeblockFeed->monSpriteId_];
+ pokeblockFeed->savedMonSprite = *pokeblockFeed->monSpritePtr;
+ pokeblockFeed->field_1050 = 10;
+ break;
+ case 1 ... 9:
+ break;
+ case 10:
+ sub_817A91C();
+ if (sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] != 0)
+ {
+ pokeblockFeed->monSpritePtr->oam.affineMode = 3;
+ pokeblockFeed->monSpritePtr->oam.matrixNum = 0;
+ pokeblockFeed->monSpritePtr->affineAnims = sSpriteAffineAnimTable_85F04FC;
+ InitSpriteAffineAnim(pokeblockFeed->monSpritePtr);
+ }
+ pokeblockFeed->field_1050 = 50;
+ case 50:
+ if (sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] != 0)
+ {
+ if (!pokeblockFeed->noMonFlip) // double negation, so mon's sprite is flipped
+ StartSpriteAffineAnim(pokeblockFeed->monSpritePtr, sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] + 10);
+ else
+ StartSpriteAffineAnim(pokeblockFeed->monSpritePtr, sNatureToMonPokeblockAnim[pokeblockFeed->nature][1]);
+ }
+ pokeblockFeed->field_1050 = 60;
+ break;
+ case 60:
+ if (sub_817A9E4() == TRUE)
+ {
+ if (pokeblockFeed->field_1060[9] == 0)
+ {
+ pokeblockFeed->animId++;
+ sub_817A91C();
+ pokeblockFeed->field_1050 = 60;
+ }
+ else
+ {
+ FreeOamMatrix(pokeblockFeed->monSpritePtr->oam.matrixNum);
+ pokeblockFeed->field_1050 = 70;
+ }
+ }
+ break;
+ case 70:
+ FreeMonSpriteOamMatrix();
+ pokeblockFeed->animId = 0;
+ pokeblockFeed->field_1050 = 0;
+ break;
+ case 71 ... 90:
+ break;
+ }
+}
+
+static bool8 sub_817A91C(void)
+{
+ struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed;
+ u8 i;
+
+ for (i = 0; i < 10; i++)
+ pokeblockFeed->field_1060[i] = sMonPokeblockAnims[pokeblockFeed->animId][i];
+
+ if (pokeblockFeed->field_1060[4] == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ pokeblockFeed->field_1060[10] = Sin(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[2]);
+ pokeblockFeed->field_1060[11] = Cos(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[3]);
+ pokeblockFeed->field_1060[12] = pokeblockFeed->field_1060[4];
+ pokeblockFeed->field_1060[13] = pokeblockFeed->monSpritePtr->pos2.x;
+ pokeblockFeed->field_1060[14] = pokeblockFeed->monSpritePtr->pos2.y;
+ sub_817AB68();
+ pokeblockFeed->field_1060[4] = pokeblockFeed->field_1060[12];
+ sub_817AA54();
+ pokeblockFeed->field_1060[4] = pokeblockFeed->field_1060[12];
+ return FALSE;
+ }
+}
+
+static bool8 sub_817A9E4(void)
+{
+ u16 var = sPokeblockFeed->field_1060[12] - sPokeblockFeed->field_1060[4];
+
+ sPokeblockFeed->monSpritePtr->pos2.x = sPokeblockFeed->field_850[var];
+ sPokeblockFeed->monSpritePtr->pos2.y = sPokeblockFeed->field_C50[var];
+
+ if (--sPokeblockFeed->field_1060[4] == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 FreeMonSpriteOamMatrix(void)
+{
+ FreeSpriteOamMatrix(sPokeblockFeed->monSpritePtr);
+ return FALSE;
+}
+
+static void sub_817AA54(void)
+{
+ struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed;
+ u16 i;
+ u16 r8 = pokeblockFeed->field_1060[8];
+ u16 r7 = pokeblockFeed->field_1060[12] - r8;
+ s16 var3 = pokeblockFeed->field_1060[13] + pokeblockFeed->field_1060[6];
+ s16 r9 = pokeblockFeed->field_1060[14] + pokeblockFeed->field_1060[7];
+
+ for (i = 0; i < r7 - 1; i++)
+ {
+ s16 r1 = pokeblockFeed->field_850[r8 + i] - (var3);
+ s16 r4 = pokeblockFeed->field_C50[r8 + i] - r9;
+
+ pokeblockFeed->field_850[r8 + i] -= r1 * (i + 1) / r7;
+ pokeblockFeed->field_C50[r8 + i] -= r4 * (i + 1) / r7;
+ }
+
+ pokeblockFeed->field_850[(r8 + r7) - 1] = var3;
+ pokeblockFeed->field_C50[(r8 + r7) - 1] = r9;
+}
+
+static void sub_817AB68(void)
+{
+ struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed;
+ bool8 var_24 = FALSE;
+ s16 r8 = pokeblockFeed->field_1060[13] - pokeblockFeed->field_1060[10];
+ s16 r7 = pokeblockFeed->field_1060[14] - pokeblockFeed->field_1060[11];
+
+ while (1)
+ {
+ u16 r5;
+ u16 r4;
+ u16 var;
+
+ var = abs(pokeblockFeed->field_1060[5]);
+ r5 = var + pokeblockFeed->field_1060[3];
+ pokeblockFeed->field_1060[3] = r5;
+
+ if (pokeblockFeed->field_1060[2] < 0)
+ var_24 = TRUE;
+
+ r4 = pokeblockFeed->field_1060[12] - pokeblockFeed->field_1060[4];
+
+ if (pokeblockFeed->field_1060[4] == 0)
+ break;
+
+ if (!var_24)
+ {
+ pokeblockFeed->field_850[r4] = Sin(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[2] + r5 / 0x100) + r8;
+ pokeblockFeed->field_C50[r4] = Cos(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[3] + r5 / 0x100) + r7;
+ }
+ else
+ {
+ pokeblockFeed->field_850[r4] = Sin(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[2] - r5 / 0x100) + r8;
+ pokeblockFeed->field_C50[r4] = Cos(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[3] - r5 / 0x100) + r7;
+ }
+
+ pokeblockFeed->field_1060[0] += pokeblockFeed->field_1060[1];
+ pokeblockFeed->field_1060[0] &= 0xFF;
+ pokeblockFeed->field_1060[4]--;
+ }
+}
diff --git a/src/pokedex.c b/src/pokedex.c
new file mode 100644
index 000000000..0d73a9fe1
--- /dev/null
+++ b/src/pokedex.c
@@ -0,0 +1,5232 @@
+#include "global.h"
+#include "gba/m4a_internal.h"
+#include "pokedex.h"
+#include "sprite.h"
+#include "graphics.h"
+#include "decompress.h"
+#include "bg.h"
+#include "window.h"
+#include "event_data.h"
+#include "palette.h"
+#include "main.h"
+#include "sound.h"
+#include "task.h"
+#include "battle_dome_cards.h"
+#include "scanline_effect.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "constants/rgb.h"
+#include "overworld.h"
+#include "menu.h"
+#include "text_window.h"
+#include "data2.h"
+#include "string_util.h"
+#include "trig.h"
+#include "pokedex_area_screen.h"
+#include "pokedex_cry_screen.h"
+#include "strings.h"
+#include "m4a.h"
+#include "international_string_util.h"
+
+static EWRAM_DATA struct PokedexView *gUnknown_02039B4C = NULL;
+static EWRAM_DATA u16 gUnknown_02039B50 = 0;
+static EWRAM_DATA u8 gUnknown_02039B52 = 0;
+static EWRAM_DATA struct PokedexListItem *gUnknown_02039B54 = NULL;
+
+u8 gUnknown_030060B0;
+MainCallback gUnknown_030060B4;
+u8 gUnknown_030061EC;
+
+struct PokedexEntry
+{
+ /*0x00*/ u8 categoryName[12];
+ /*0x0C*/ u16 height; //in decimeters
+ /*0x0E*/ u16 weight; //in hectograms
+ /*0x10*/ const u8 *description;
+ /*0x14*/ u16 unused;
+ /*0x16*/ u16 pokemonScale;
+ /*0x18*/ u16 pokemonOffset;
+ /*0x1A*/ u16 trainerScale;
+ /*0x1C*/ u16 trainerOffset;
+}; /*size = 0x20*/
+
+struct UnknownStruct2
+{
+ const u8 *text1;
+ const u8 *text2;
+};
+
+struct UnknownStruct1
+{
+ const struct UnknownStruct2 *unk0;
+ u8 unk4;
+ u8 unk5;
+ u16 unk6;
+};
+
+struct UnknownStruct3
+{
+ const u8 *text;
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+};
+
+struct UnknownStruct4
+{
+ const u8 *text;
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+ u8 unk7;
+ u8 unk8;
+ u8 unk9;
+};
+
+//TO BE CONVERTED TO C
+
+extern const u8 gUnknown_0855D30C[];
+extern struct BgTemplate gUnknown_0856E630[];
+extern struct WindowTemplate gUnknown_0856E640[];
+extern const u16 gUnknown_0856E610[16];
+extern const struct PokedexEntry gPokedexEntries[];
+extern struct BgTemplate gUnknown_0856E668[];
+extern struct WindowTemplate gUnknown_0856E670[];
+extern const u8 *gMonFootprintTable[];
+extern u8 gUnknown_0856ED08[][4];
+extern struct BgTemplate gUnknown_0856EFF8[];
+extern struct WindowTemplate gUnknown_0856F008[];
+extern const u8 gUnknown_0856ED9C[][4];
+extern const u8 gUnknown_0856EDB8[][4];
+extern const u8 gUnknown_0856EDD4[][4];
+extern const u8 gUnknown_0856EDF0[][4];
+extern const struct UnknownStruct1 gUnknown_0856EFC8[];
+extern const struct UnknownStruct3 gUnknown_0856ED30[];
+extern const struct UnknownStruct4 gUnknown_0856ED48[];
+extern const struct UnknownStruct2 gUnknown_0856EE0C[];
+extern const struct UnknownStruct2 gUnknown_0856EE5C[];
+extern const struct UnknownStruct2 gUnknown_0856EEB4[];
+extern const struct UnknownStruct2 gUnknown_0856EF14[];
+extern const struct UnknownStruct2 gUnknown_0856EE24[];
+extern const u8 gUnknown_0856EFAC[];
+extern const u8 gUnknown_0856EFAE[];
+extern const u8 gUnknown_0856EFB4[];
+
+#define HOENN_DEX_COUNT 202
+#define NATIONAL_DEX_COUNT 386
+
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+
+struct PokedexListItem
+{
+ u16 dexNum;
+ u16 seen:1;
+ u16 owned:1;
+};
+
+struct PokedexView
+{
+ struct PokedexListItem unk0[NATIONAL_DEX_COUNT];
+ u16 unk608;
+ u8 unk60A_1:1;
+ u8 unk60A_2:1;
+ u8 unk60B;
+ u16 pokemonListCount;
+ u16 selectedPokemon;
+ u16 unk610;
+ u16 dexMode;
+ u16 unk614;
+ u16 dexOrder;
+ u16 unk618;
+ u16 unk61A;
+ u16 unk61C;
+ u16 unk61E[4];
+ u16 selectedMonSpriteId;
+ u16 unk628;
+ u16 unk62A;
+ u8 unk62C;
+ u8 unk62D;
+ u8 unk62E;
+ u8 unk62F;
+ s16 unk630;
+ s16 unk632;
+ u16 unk634;
+ u16 unk636;
+ u16 unk638;
+ u16 unk63A[4];
+ u8 filler642[8];
+ u8 unk64A;
+ u8 unk64B;
+ u8 unk64C_1:1;
+ u8 selectedScreen;
+ u8 unk64E;
+ u8 menuIsOpen; //menuIsOpen
+ u16 menuCursorPos; //Menu cursor position
+ s16 menuY; //Menu Y position (inverted because we use REG_BG0VOFS for this)
+ u8 unk654[8];
+ u8 unk65C[8];
+};
+
+enum
+{
+ DEX_MODE_HOENN,
+ DEX_MODE_NATIONAL
+};
+
+enum
+{
+ AREA_SCREEN,
+ CRY_SCREEN,
+ SIZE_SCREEN,
+ CANCEL_SCREEN,
+};
+
+// this file's functions
+void sub_80BB774(void);
+void sub_80BB78C(u8);
+void sub_80BB7D4(u8);
+void sub_80BBA28(u8);
+void sub_80BBA78(u8);
+void sub_80BBBF4(u8);
+void sub_80BBC74(u8);
+void sub_80BBD1C(u8);
+void sub_80BBDE8(u8);
+void sub_80BBE70(u8);
+void sub_80BBEB8(u8);
+void sub_80BC0A8(u8);
+void sub_80BC0F8(u8);
+void sub_80BC2D4(u8);
+void sub_80BC360(u8);
+void sub_80BC3DC(u8);
+void sub_80BC47C(u8);
+bool8 sub_80BC514(u8);
+void sub_80BC844(u8);
+void sub_80BC890(void);
+void sub_80BC8D4(u8, u8);
+void sub_80BD154(u16, u8, u8, u16);
+void sub_80BD1F4(u16, u8, u8, u16);
+u8 sub_80BD23C(u16, u8, u8);
+void sub_80BD28C(u8, u8, u16);
+void sub_80BD2B4(u16, u16);
+bool8 sub_80BD404(u8, u8, u8);
+u16 sub_80BD69C(u16, u16);
+void sub_80BD8D0(void);
+bool8 sub_80BD930(void);
+u8 sub_80BDA40(void);
+u16 sub_80BDA8C(u16);
+u32 sub_80BDACC(u16, s16, s16);
+void sub_80BDB7C(u8);
+void sub_80BE470(struct Sprite *sprite);
+void sub_80BE604(struct Sprite *sprite);
+void sub_80BE658(struct Sprite *sprite);
+void sub_80BE758(struct Sprite *sprite);
+void sub_80BE780(struct Sprite *sprite);
+void sub_80BE44C(struct Sprite *sprite);
+void sub_80BE834(struct Sprite *sprite);
+void sub_80BE4E0(struct Sprite *sprite);
+u8 sub_80BE91C(struct PokedexListItem*, u8);
+bool8 sub_80BE9C4(u8);
+u8 sub_80BE9F8(struct PokedexListItem*, u8);
+void sub_80BEA24(u8);
+void sub_80BEDF4(u8);
+void sub_80BEFD0(u8);
+void sub_80BF038(u8);
+void sub_80BF070(u8);
+void sub_80BF0AC(u8);
+void sub_80BF1B4(u8);
+void sub_80BF1EC(u8);
+void sub_80BF250(u8);
+void sub_80BF5CC(u8);
+void sub_80BF790(u8);
+void sub_80BF7FC(u8);
+void sub_80BF82C(u8);
+void sub_80BFBB0(u8);
+void sub_80BFC78(u8);
+void sub_80BFCDC(u16);
+void sub_80BFCF4(u16);
+void sub_80BFD0C(u8, u16);
+void sub_80BFD7C(u8, u16);
+void sub_80BFE38(u8);
+void sub_80C0088(u8);
+void blockset_load_palette_to_gpu(u8);
+void sub_80C01CC(struct Sprite *sprite);
+void sub_80C020C(u32, u32, u32, u32);
+void sub_80C0354(u16, u8, u8);
+void sub_80C0460(u16, u8, u8);
+void sub_80C09B0(u16);
+u8 sub_80C0B44(u8, u16, u8, u8);
+void sub_80C0D30(u8, u16);
+u16 sub_80C0EF8(u16, s16, s16, s8);
+u16 sub_80C0E0C(u8, u16, u16, u16);
+u8 sub_80C1258();
+void sub_80C12E0(u8);
+void sub_80C1570(u8);
+void sub_80C15B0(u8);
+void sub_80C16CC(u8);
+void sub_80C170C(u8);
+void sub_80C19A4(u8);
+void sub_80C1A4C(u8);
+void sub_80C1AB8(u8);
+void sub_80C1B64(u8);
+void sub_80C1BCC(u8);
+void sub_80C1D38(u8);
+void sub_80C1D70(u8);
+void sub_80C2040(u8);
+void sub_80C2064(u8, u8);
+void sub_80C20F8(u8);
+void sub_80C21D4(u8);
+void sub_80C2294(u8);
+u8 sub_80C2318(u8, u8);
+void sub_80C23B8(u8);
+void sub_80C2594(u8);
+void sub_80C2618(const u8*);
+void sub_80C2638(u32);
+void sub_80C2650(u32);
+void sub_80C2668(u32, const u8*);
+void sub_80C267C(void);
+
+// const rom data
+#include "data/pokedex_orders.h"
+
+static const struct OamData sOamData_855CFE4 =
+{
+ .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 struct OamData sOamData_855CFEC =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_855CFF4 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_855CFFC =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 2,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_855D004 =
+{
+ .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 struct OamData sOamData_855D00C =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_855D014[] =
+{
+ ANIMCMD_FRAME(3, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D01C[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D024[] =
+{
+ ANIMCMD_FRAME(16, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D02C[] =
+{
+ ANIMCMD_FRAME(48, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D034[] =
+{
+ ANIMCMD_FRAME(40, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D03C[] =
+{
+ ANIMCMD_FRAME(32, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D044[] =
+{
+ ANIMCMD_FRAME(56, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D04C[] =
+{
+ ANIMCMD_FRAME(64, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D054[] =
+{
+ ANIMCMD_FRAME(96, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D05C[] =
+{
+ ANIMCMD_FRAME(160, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D064[] =
+{
+ ANIMCMD_FRAME(168, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D06C[] =
+{
+ ANIMCMD_FRAME(128, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D074[] =
+{
+ ANIMCMD_FRAME(130, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D07C[] =
+{
+ ANIMCMD_FRAME(132, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D084[] =
+{
+ ANIMCMD_FRAME(134, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D08C[] =
+{
+ ANIMCMD_FRAME(136, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D094[] =
+{
+ ANIMCMD_FRAME(138, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D09C[] =
+{
+ ANIMCMD_FRAME(140, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0A4[] =
+{
+ ANIMCMD_FRAME(142, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0AC[] =
+{
+ ANIMCMD_FRAME(144, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0B4[] =
+{
+ ANIMCMD_FRAME(146, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0BC[] =
+{
+ ANIMCMD_FRAME(176, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0C4[] =
+{
+ ANIMCMD_FRAME(178, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0CC[] =
+{
+ ANIMCMD_FRAME(180, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0D4[] =
+{
+ ANIMCMD_FRAME(182, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0DC[] =
+{
+ ANIMCMD_FRAME(184, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0E4[] =
+{
+ ANIMCMD_FRAME(186, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0EC[] =
+{
+ ANIMCMD_FRAME(188, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0F4[] =
+{
+ ANIMCMD_FRAME(190, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D0FC[] =
+{
+ ANIMCMD_FRAME(192, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D104[] =
+{
+ ANIMCMD_FRAME(194, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_855D10C[] =
+{
+ ANIMCMD_FRAME(4, 30),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D114[] =
+{
+ sSpriteAnim_855D014
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D118[] =
+{
+ sSpriteAnim_855D01C
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D11C[] =
+{
+ sSpriteAnim_855D024
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D120[] =
+{
+ sSpriteAnim_855D02C,
+ sSpriteAnim_855D034,
+ sSpriteAnim_855D03C,
+ sSpriteAnim_855D044
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D130[] =
+{
+ sSpriteAnim_855D04C,
+ sSpriteAnim_855D054
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D138[] =
+{
+ sSpriteAnim_855D05C,
+ sSpriteAnim_855D064
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D140[] =
+{
+ sSpriteAnim_855D06C,
+ sSpriteAnim_855D074,
+ sSpriteAnim_855D07C,
+ sSpriteAnim_855D084,
+ sSpriteAnim_855D08C,
+ sSpriteAnim_855D094,
+ sSpriteAnim_855D09C,
+ sSpriteAnim_855D0A4,
+ sSpriteAnim_855D0AC,
+ sSpriteAnim_855D0B4
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D168[] =
+{
+ sSpriteAnim_855D0BC,
+ sSpriteAnim_855D0C4,
+ sSpriteAnim_855D0CC,
+ sSpriteAnim_855D0D4,
+ sSpriteAnim_855D0DC,
+ sSpriteAnim_855D0E4,
+ sSpriteAnim_855D0EC,
+ sSpriteAnim_855D0F4,
+ sSpriteAnim_855D0FC,
+ sSpriteAnim_855D104
+};
+
+static const union AnimCmd *const sSpriteAnimTable_855D190[] =
+{
+ sSpriteAnim_855D10C
+};
+
+const struct SpriteTemplate gUnknown_0855D194 =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855CFE4,
+ .anims = sSpriteAnimTable_855D114,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE604,
+};
+
+const struct SpriteTemplate gUnknown_0855D1AC =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855CFEC,
+ .anims = sSpriteAnimTable_855D118,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE658,
+};
+
+const struct SpriteTemplate gUnknown_0855D1C4 =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855CFF4,
+ .anims = sSpriteAnimTable_855D120,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE758,
+};
+
+const struct SpriteTemplate gUnknown_0855D1DC =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855CFFC,
+ .anims = sSpriteAnimTable_855D11C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE780,
+};
+
+const struct SpriteTemplate gUnknown_0855D1F4 =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855D004,
+ .anims = sSpriteAnimTable_855D130,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE44C,
+};
+
+const struct SpriteTemplate gUnknown_0855D20C =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855CFF4,
+ .anims = sSpriteAnimTable_855D138,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE44C,
+};
+
+const struct SpriteTemplate gUnknown_0855D224 =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855D00C,
+ .anims = sSpriteAnimTable_855D140,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE44C,
+};
+
+const struct SpriteTemplate gUnknown_0855D23C =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855D00C,
+ .anims = sSpriteAnimTable_855D168,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE44C,
+};
+
+const struct SpriteTemplate gUnknown_0855D254 =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &sOamData_855D00C,
+ .anims = sSpriteAnimTable_855D190,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80BE834,
+};
+
+const struct CompressedSpriteSheet gSpriteSheets_0855D26C[] =
+{
+ {gPokedexMenu2_Gfx, 0x2000, 4096},
+ {0}
+};
+
+const struct SpritePalette gSpritePalettes_0855D26C[] =
+{
+ {gPokedexText_Pal, 4096},
+ {0}
+};
+
+const u8 gUnknown_0855D28C[] = {0x4, 0x8, 0x10, 0x20, 0x20};
+const u8 gUnknown_0855D291[] = {0x8, 0x4, 0x2, 0x1, 0x1};
+
+const struct BgTemplate gBgTemplates_0855D298[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 12,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 13,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 14,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 15,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+const struct WindowTemplate sWindowTemplates_0855D2A8[] =
+{
+ {2, 0, 0, 0x20, 0x20, 0, 1},
+ DUMMY_WIN_TEMPLATE
+};
+
+const u8 gUnknown_0855D2B8[] = _("{NO}000");
+const u8 gUnknown_0855D2BE[] = INCBIN_U8("graphics/pokedex/caught_ball.4bpp");
+const u8 sText_TenDashes[] = _("----------");
+
+// .text
+
+void ResetPokedex(void)
+{
+ u16 i;
+
+ gUnknown_02039B50 = 0;
+ gUnknown_02039B52 = 64;
+ gUnknown_030060B0 = 0;
+ gSaveBlock2Ptr->pokedex.unknown1 = 0;
+ gSaveBlock2Ptr->pokedex.order = 0;
+ gSaveBlock2Ptr->pokedex.nationalMagic = 0;
+ gSaveBlock2Ptr->pokedex.unknown2 = 0;
+ gSaveBlock2Ptr->pokedex.unownPersonality = 0;
+ gSaveBlock2Ptr->pokedex.spindaPersonality = 0;
+ gSaveBlock2Ptr->pokedex.unknown3 = 0;
+ DisableNationalPokedex();
+ for (i = 0; i < DEX_FLAGS_NO; i++)
+ {
+ gSaveBlock2Ptr->pokedex.owned[i] = 0;
+ gSaveBlock2Ptr->pokedex.seen[i] = 0;
+ gSaveBlock1Ptr->seen1[i] = 0;
+ gSaveBlock1Ptr->seen2[i] = 0;
+ }
+}
+
+void sub_80BB358(void)
+{
+ gUnknown_02039B50 = 0;
+ gUnknown_02039B52 = 64;
+}
+
+void sub_80BB370(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_80BB384(struct PokedexView *pokedexView)
+{
+ u16 i;
+
+ for (i = 0; i < NATIONAL_DEX_COUNT; i++)
+ {
+ pokedexView->unk0[i].dexNum |= 0xFFFF;
+ pokedexView->unk0[i].seen = 0;
+ pokedexView->unk0[i].owned = 0;
+ }
+ pokedexView->unk608 = 0;
+ pokedexView->unk60A_1 = 0;
+ pokedexView->unk60A_2 = 0;
+ pokedexView->pokemonListCount = 0;
+ pokedexView->selectedPokemon = 0;
+ pokedexView->unk610 = 0;
+ pokedexView->dexMode = 0;
+ pokedexView->unk614 = 0;
+ pokedexView->dexOrder = 0;
+ pokedexView->unk618 = 0;
+ pokedexView->unk61A = 0;
+ pokedexView->unk61C = 0;
+ for (i = 0; i <= 3; i++)
+ pokedexView->unk61E[i] |= 0xFFFF;
+ pokedexView->unk628 = 0;
+ pokedexView->unk62A = 0;
+ pokedexView->unk62C = 0;
+ pokedexView->unk62D = 0;
+ pokedexView->unk62E = 0;
+ pokedexView->unk62F = 0;
+ pokedexView->unk630 = 0;
+ pokedexView->unk632 = 0;
+ pokedexView->unk634 = 0;
+ pokedexView->unk636 = 0;
+ pokedexView->unk638 = 0;
+ for (i = 0; i <= 3; i++)
+ pokedexView->unk63A[i] = 0;
+ pokedexView->unk64A = 0;
+ pokedexView->unk64B = 0;
+ pokedexView->unk64C_1 = 0;
+ pokedexView->selectedScreen = 0;
+ pokedexView->unk64E = 0;
+ pokedexView->menuIsOpen = 0;
+ pokedexView->menuCursorPos = 0;
+ pokedexView->menuY = 0;
+ for (i = 0; i <= 7; i++)
+ pokedexView->unk654[i] = 0;
+ for (i = 0; i <= 7; i++)
+ pokedexView->unk65C[i] = 0;
+}
+
+void sub_80BB534(void)
+{
+ u8 *addr;
+ u32 size;
+
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ SetVBlankCallback(NULL);
+ sub_80C09B0(0);
+ DmaFillLarge16(3, 0, (u8 *)VRAM, VRAM_SIZE, 0x1000)
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ gMain.state = 1;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ dp13_810BB8C();
+ gMain.state++;
+ break;
+ case 2:
+ gUnknown_02039B4C = AllocZeroed(sizeof(struct PokedexView));
+ sub_80BB384(gUnknown_02039B4C);
+ CreateTask(sub_80BB78C, 0);
+ gUnknown_02039B4C->dexMode = gSaveBlock2Ptr->pokedex.unknown1;
+ if (!IsNationalPokedexEnabled())
+ gUnknown_02039B4C->dexMode = DEX_MODE_HOENN;
+ gUnknown_02039B4C->dexOrder = gSaveBlock2Ptr->pokedex.order;
+ gUnknown_02039B4C->selectedPokemon = gUnknown_02039B50;
+ gUnknown_02039B4C->unk62C = gUnknown_02039B52;
+ gUnknown_02039B4C->selectedScreen = 0;
+ if (!IsNationalPokedexEnabled())
+ {
+ gUnknown_02039B4C->unk61A = GetHoennPokedexCount(0);
+ gUnknown_02039B4C->unk61C = GetHoennPokedexCount(1);
+ }
+ else
+ {
+ gUnknown_02039B4C->unk61A = GetNationalPokedexCount(0);
+ gUnknown_02039B4C->unk61C = GetNationalPokedexCount(1);
+ }
+ gUnknown_02039B4C->unk62D = 8;
+ gMain.state++;
+ break;
+ case 3:
+ EnableInterrupts(1);
+ SetVBlankCallback(sub_80BB370);
+ SetMainCallback2(sub_80BB774);
+ sub_80BC8D4(gUnknown_02039B4C->dexMode, gUnknown_02039B4C->dexOrder);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x80);
+ break;
+ }
+}
+
+void sub_80BB774(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_80BB78C(u8 taskId)
+{
+ gUnknown_02039B4C->unk64C_1 = FALSE;
+ if (sub_80BC514(0))
+ gTasks[taskId].func = sub_80BB7D4;
+}
+
+void sub_80BB7D4(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY);
+
+ if (gUnknown_02039B4C->menuY)
+ {
+ gUnknown_02039B4C->menuY -= 8;
+ }
+ else
+ {
+ if ((gMain.newKeys & A_BUTTON) && gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon].seen)
+ {
+ sub_80BD8D0();
+ BeginNormalPaletteFade(~(1 << (gSprites[gUnknown_02039B4C->selectedMonSpriteId].oam.paletteNum + 16)), 0, 0, 0x10, RGB_BLACK);
+ gSprites[gUnknown_02039B4C->selectedMonSpriteId].callback = sub_80BE470;
+ gTasks[taskId].func = sub_80BBBF4;
+ PlaySE(SE_PIN);
+ sub_80BC890();
+ }
+ else if (gMain.newKeys & START_BUTTON)
+ {
+ //Open menu
+ gUnknown_02039B4C->menuY = 0;
+ gUnknown_02039B4C->menuIsOpen = 1;
+ gUnknown_02039B4C->menuCursorPos = 0;
+ gTasks[taskId].func = sub_80BBA78;
+ PlaySE(SE_SELECT);
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].data[0] = sub_80C1258();
+ gUnknown_02039B4C->unk64E = 0;
+ gUnknown_02039B4C->unk62A = gUnknown_02039B4C->unk62C;
+ gUnknown_02039B4C->unk610 = gUnknown_02039B4C->selectedPokemon;
+ gUnknown_02039B4C->unk614 = gUnknown_02039B4C->dexMode;
+ gUnknown_02039B4C->unk618 = gUnknown_02039B4C->dexOrder;
+ gTasks[taskId].func = sub_80BBD1C;
+ PlaySE(SE_PC_LOGIN);
+ sub_80BC890();
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = sub_80BBDE8;
+ PlaySE(SE_PC_OFF);
+ }
+ else
+ {
+ //Handle D-pad
+ gUnknown_02039B4C->selectedPokemon = sub_80BD69C(gUnknown_02039B4C->selectedPokemon, 0xE);
+ if (gUnknown_02039B4C->unk62E)
+ gTasks[taskId].func = sub_80BBA28;
+ }
+ }
+}
+
+void sub_80BBA28(u8 taskId)
+{
+ if (sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636))
+ gTasks[taskId].func = sub_80BB7D4;
+}
+
+void sub_80BBA78(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY);
+
+ //If menu is not open, slide it up, on screen
+ if (gUnknown_02039B4C->menuY != 80)
+ {
+ gUnknown_02039B4C->menuY += 8;
+ }
+ else
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ switch (gUnknown_02039B4C->menuCursorPos)
+ {
+ case 0: //BACK TO LIST
+ default:
+ gMain.newKeys |= START_BUTTON; //Exit menu
+ break;
+ case 1: //LIST TOP
+ gUnknown_02039B4C->selectedPokemon = 0;
+ gUnknown_02039B4C->unk62C = 0x40;
+ sub_80BDA40();
+ sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON; //Exit menu
+ break;
+ case 2: //LIST BOTTOM
+ gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->pokemonListCount - 1;
+ gUnknown_02039B4C->unk62C = gUnknown_02039B4C->pokemonListCount * 16 + 0x30;
+ sub_80BDA40();
+ sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON; //Exit menu
+ break;
+ case 3: //CLOSE POKEDEX
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = sub_80BBDE8;
+ PlaySE(SE_PC_OFF);
+ break;
+ }
+ }
+
+ //Exit menu when Start or B is pressed
+ if (gMain.newKeys & (START_BUTTON | B_BUTTON))
+ {
+ gUnknown_02039B4C->menuIsOpen = 0;
+ gTasks[taskId].func = sub_80BB7D4;
+ PlaySE(SE_SELECT);
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_02039B4C->menuCursorPos != 0)
+ {
+ gUnknown_02039B4C->menuCursorPos--;
+ PlaySE(SE_SELECT);
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_02039B4C->menuCursorPos <= 2)
+ {
+ gUnknown_02039B4C->menuCursorPos++;
+ PlaySE(SE_SELECT);
+ }
+ }
+}
+
+void sub_80BBBF4(u8 taskId)
+{
+ if (gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.x == 48 && gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.y == 56)
+ {
+ gUnknown_02039B4C->unk64B = gUnknown_02039B4C->unk64A;
+ gTasks[taskId].data[0] = sub_80BE91C(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gUnknown_02039B4C->selectedMonSpriteId);
+ gTasks[taskId].func = sub_80BBC74;
+ }
+}
+
+void sub_80BBC74(u8 taskId)
+{
+ if (gTasks[gTasks[taskId].data[0]].isActive)
+ {
+ if (gUnknown_02039B4C->unk64A == 1 && !sub_80BE9C4(gTasks[taskId].data[0]) && sub_80BD930())
+ sub_80BE9F8(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gTasks[taskId].data[0]);
+ }
+ else
+ {
+ gUnknown_02039B50 = gUnknown_02039B4C->selectedPokemon;
+ gUnknown_02039B52 = gUnknown_02039B4C->unk62C;
+ gTasks[taskId].func = sub_80BB78C;
+ }
+}
+
+void sub_80BBD1C(u8 taskId)
+{
+ if (!gTasks[gTasks[taskId].data[0]].isActive)
+ {
+ sub_80BDA40();
+ if (gUnknown_02039B4C->unk64E != 0)
+ {
+ gUnknown_02039B4C->selectedPokemon = 0;
+ gUnknown_02039B4C->unk62C = 0x40;
+ gTasks[taskId].func = sub_80BBE70;
+ }
+ else
+ {
+ gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A;
+ gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610;
+ gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614;
+ if (!IsNationalPokedexEnabled())
+ gUnknown_02039B4C->dexMode = DEX_MODE_HOENN;
+ gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618;
+ gTasks[taskId].func = sub_80BB78C;
+ }
+ }
+}
+
+void sub_80BBDE8(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ gSaveBlock2Ptr->pokedex.unknown1 = gUnknown_02039B4C->dexMode;
+ if (!IsNationalPokedexEnabled())
+ gSaveBlock2Ptr->pokedex.unknown1 = DEX_MODE_HOENN;
+ gSaveBlock2Ptr->pokedex.order = gUnknown_02039B4C->dexOrder;
+ sub_80BDA40();
+ sub_80BC890();
+ DestroyTask(taskId);
+ SetMainCallback2(CB2_ReturnToFieldWithOpenMenu);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
+ Free(gUnknown_02039B4C);
+ }
+}
+
+void sub_80BBE70(u8 taskId)
+{
+ gUnknown_02039B4C->unk64C_1 = TRUE;
+ if (sub_80BC514(3))
+ gTasks[taskId].func = sub_80BBEB8;
+}
+
+void sub_80BBEB8(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY);
+
+ if (gUnknown_02039B4C->menuY)
+ {
+ gUnknown_02039B4C->menuY -= 8;
+ }
+ else
+ {
+ if ((gMain.newKeys & A_BUTTON) && gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon].seen)
+ {
+ u32 a;
+
+ sub_80BD8D0();
+ a = (1 << (gSprites[gUnknown_02039B4C->selectedMonSpriteId].oam.paletteNum + 16));
+ gSprites[gUnknown_02039B4C->selectedMonSpriteId].callback = sub_80BE470;
+ BeginNormalPaletteFade(~a, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = sub_80BC2D4;
+ PlaySE(SE_PIN);
+ sub_80BC890();
+ }
+ else if (gMain.newKeys & START_BUTTON)
+ {
+ gUnknown_02039B4C->menuY = 0;
+ gUnknown_02039B4C->menuIsOpen = 1;
+ gUnknown_02039B4C->menuCursorPos = 0;
+ gTasks[taskId].func = sub_80BC0F8;
+ PlaySE(SE_SELECT);
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].data[0] = sub_80C1258();
+ gUnknown_02039B4C->unk64E = 0;
+ gTasks[taskId].func = sub_80BBD1C;
+ PlaySE(SE_PC_LOGIN);
+ sub_80BC890();
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = sub_80BC3DC;
+ PlaySE(SE_PC_OFF);
+ }
+ else
+ {
+ //Handle D-pad
+ gUnknown_02039B4C->selectedPokemon = sub_80BD69C(gUnknown_02039B4C->selectedPokemon, 0xE);
+ if (gUnknown_02039B4C->unk62E)
+ gTasks[taskId].func = sub_80BC0A8;
+ }
+ }
+}
+
+void sub_80BC0A8(u8 taskId)
+{
+ if (sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636))
+ gTasks[taskId].func = sub_80BBEB8;
+}
+
+void sub_80BC0F8(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY);
+
+ if (gUnknown_02039B4C->menuY != 96)
+ {
+ gUnknown_02039B4C->menuY += 8;
+ }
+ else
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ switch (gUnknown_02039B4C->menuCursorPos)
+ {
+ case 0: //BACK TO LIST
+ default:
+ gMain.newKeys |= START_BUTTON;
+ break;
+ case 1: //LIST TOP
+ gUnknown_02039B4C->selectedPokemon = 0;
+ gUnknown_02039B4C->unk62C = 0x40;
+ sub_80BDA40();
+ sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON;
+ break;
+ case 2: //LIST BOTTOM
+ gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->pokemonListCount - 1;
+ gUnknown_02039B4C->unk62C = gUnknown_02039B4C->pokemonListCount * 16 + 0x30;
+ sub_80BDA40();
+ sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON;
+ break;
+ case 3: //BACK TO POKEDEX
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = sub_80BC3DC;
+ PlaySE(SE_TRACK_DOOR);
+ break;
+ case 4: //CLOSE POKEDEX
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = sub_80BC47C;
+ PlaySE(SE_PC_OFF);
+ break;
+ }
+ }
+
+ //Exit menu when Start or B is pressed
+ if (gMain.newKeys & (START_BUTTON | B_BUTTON))
+ {
+ gUnknown_02039B4C->menuIsOpen = 0;
+ gTasks[taskId].func = sub_80BBEB8;
+ PlaySE(SE_SELECT);
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_02039B4C->menuCursorPos)
+ {
+ gUnknown_02039B4C->menuCursorPos--;
+ PlaySE(SE_SELECT);
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_02039B4C->menuCursorPos <= 3)
+ {
+ gUnknown_02039B4C->menuCursorPos++;
+ PlaySE(SE_SELECT);
+ }
+ }
+}
+
+void sub_80BC2D4(u8 taskId)
+{
+ if (gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.x == 48 && gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.y == 56)
+ {
+ gUnknown_02039B4C->unk64B = gUnknown_02039B4C->unk64A;
+ gTasks[taskId].data[0] = sub_80BE91C(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gUnknown_02039B4C->selectedMonSpriteId);
+ gUnknown_02039B4C->selectedMonSpriteId = -1;
+ gTasks[taskId].func = sub_80BC360;
+ }
+}
+
+void sub_80BC360(u8 taskId)
+{
+ if (gTasks[gTasks[taskId].data[0]].isActive)
+ {
+ if (gUnknown_02039B4C->unk64A == 1 && !sub_80BE9C4(gTasks[taskId].data[0]) && sub_80BD930())
+ sub_80BE9F8(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gTasks[taskId].data[0]);
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80BBE70;
+ }
+}
+
+void sub_80BC3DC(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A;
+ gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610;
+ gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614;
+ if (!IsNationalPokedexEnabled())
+ gUnknown_02039B4C->dexMode = DEX_MODE_HOENN;
+ gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618;
+ gTasks[taskId].func = sub_80BB78C;
+ sub_80BDA40();
+ sub_80BC890();
+ }
+}
+
+void sub_80BC47C(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A;
+ gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610;
+ gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614;
+ if (!IsNationalPokedexEnabled())
+ gUnknown_02039B4C->dexMode = DEX_MODE_HOENN;
+ gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618;
+ gTasks[taskId].func = sub_80BBDE8;
+ }
+}
+
+bool8 sub_80BC514(u8 a)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ if (gPaletteFade.active)
+ return 0;
+ SetVBlankCallback(NULL);
+ gUnknown_02039B4C->unk64A = a;
+ sub_80C09B0(0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gBgTemplates_0855D298, 4);
+ SetBgTilemapBuffer(3, AllocZeroed(0x800));
+ SetBgTilemapBuffer(2, AllocZeroed(0x800));
+ SetBgTilemapBuffer(1, AllocZeroed(0x800));
+ SetBgTilemapBuffer(0, AllocZeroed(0x800));
+ copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0);
+ CopyToBgTilemapBuffer(1, gUnknown_08DC2C5C, 0, 0);
+ CopyToBgTilemapBuffer(3, gUnknown_08DC2DAC, 0, 0);
+ if (a == 0)
+ CopyToBgTilemapBuffer(0, gUnknown_08DC2A08, 0, 0x280);
+ else
+ CopyToBgTilemapBuffer(0, gUnknown_08DC2B1C, 0, 0x280);
+ ResetPaletteFade();
+ if (a == 0)
+ gUnknown_02039B4C->unk64C_1 = FALSE;
+ else
+ gUnknown_02039B4C->unk64C_1 = TRUE;
+ sub_80BC844(gUnknown_02039B4C->unk64C_1);
+ InitWindows(sWindowTemplates_0855D2A8);
+ DeactivateAllTextPrinters();
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ gMain.state = 1;
+ break;
+ case 1:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ LoadCompressedObjectPic(&gSpriteSheets_0855D26C[0]);
+ LoadSpritePalettes(gSpritePalettes_0855D26C);
+ sub_80BDB7C(a);
+ gMain.state++;
+ break;
+ case 2:
+ gMain.state++;
+ break;
+ case 3:
+ if (a == 0)
+ sub_80BC8D4(gUnknown_02039B4C->dexMode, gUnknown_02039B4C->dexOrder);
+ sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE);
+ gUnknown_02039B4C->menuIsOpen = 0;
+ gUnknown_02039B4C->menuY = 0;
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 4:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ SetVBlankCallback(sub_80BB370);
+ gMain.state++;
+ break;
+ case 5:
+ SetGpuReg(REG_OFFSET_WININ, 0x3F3F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x1D3F);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, 0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ gMain.state++;
+ break;
+ case 6:
+ if (!gPaletteFade.active)
+ {
+ gMain.state = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+void sub_80BC844(u8 a)
+{
+ if (a == 1)
+ LoadPalette(gPokedexHoennBg_Pal + 1, 1, 0xBE);
+ else if (!IsNationalPokedexEnabled())
+ LoadPalette(gPokedexText_Pal + 1, 1, 0xBE);
+ else
+ LoadPalette(gPokedexNationalBg_Pal + 1, 1, 0xBE);
+ LoadPalette(GetOverworldTextboxPalettePtr(), 0xF0, 32);
+}
+
+void sub_80BC890(void)
+{
+ void* tilemapBuffer;
+
+ FreeAllWindowBuffers();
+ tilemapBuffer = GetBgTilemapBuffer(0);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+ tilemapBuffer = GetBgTilemapBuffer(1);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+ tilemapBuffer = GetBgTilemapBuffer(2);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+ tilemapBuffer = GetBgTilemapBuffer(3);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+}
+
+void sub_80BC8D4(u8 dexMode, u8 sortMode)
+{
+ u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever.
+ s16 i;
+
+ gUnknown_02039B4C->pokemonListCount = 0;
+
+ switch (dexMode)
+ {
+ default:
+ case DEX_MODE_HOENN:
+ vars[0] = HOENN_DEX_COUNT;
+ vars[1] = 1;
+ break;
+ case DEX_MODE_NATIONAL:
+ if (IsNationalPokedexEnabled())
+ {
+ vars[0] = NATIONAL_DEX_COUNT;
+ vars[1] = 0;
+ }
+ else
+ {
+ vars[0] = HOENN_DEX_COUNT;
+ vars[1] = 1;
+ }
+ break;
+ }
+
+ switch (sortMode)
+ {
+ case 0:
+ if (vars[1])
+ {
+ for (i = 0; i < vars[0]; i++)
+ {
+ vars[2] = HoennToNationalOrder(i + 1);
+ gUnknown_02039B4C->unk0[i].dexNum = vars[2];
+ gUnknown_02039B4C->unk0[i].seen = GetSetPokedexFlag(vars[2], 0);
+ gUnknown_02039B4C->unk0[i].owned = GetSetPokedexFlag(vars[2], 1);
+ if (gUnknown_02039B4C->unk0[i].seen)
+ gUnknown_02039B4C->pokemonListCount = i + 1;
+ }
+ }
+ else
+ {
+ bool32 r10;
+ s16 r5;
+
+ r10 = r5 = i = 0;
+ for (i = 0; i < vars[0]; i++)
+ {
+ vars[2] = i + 1;
+ if (GetSetPokedexFlag(vars[2], 0))
+ r10 = 1;
+ if (r10)
+ {
+ asm(""); //Needed to match for some reason
+ gUnknown_02039B4C->unk0[r5].dexNum = vars[2];
+ gUnknown_02039B4C->unk0[r5].seen = GetSetPokedexFlag(vars[2], 0);
+ gUnknown_02039B4C->unk0[r5].owned = GetSetPokedexFlag(vars[2], 1);
+ if (gUnknown_02039B4C->unk0[r5].seen)
+ gUnknown_02039B4C->pokemonListCount = r5 + 1;
+ r5++;
+ }
+ }
+ }
+ break;
+ case 1:
+ for (i = 0; i < POKEMON_SLOTS_NUMBER - 1; i++)
+ {
+ vars[2] = gPokedexOrder_Alphabetical[i];
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 0))
+ {
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2];
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1;
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = GetSetPokedexFlag(vars[2], 1);
+ gUnknown_02039B4C->pokemonListCount++;
+ }
+ }
+ break;
+ case 2:
+ for (i = NATIONAL_DEX_COUNT - 1; i >= 0; i--)
+ {
+ vars[2] = gPokedexOrder_Weight[i];
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1))
+ {
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2];
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1;
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1;
+ gUnknown_02039B4C->pokemonListCount++;
+ }
+ }
+ break;
+ case 3:
+ for (i = 0; i < NATIONAL_DEX_COUNT; i++)
+ {
+ vars[2] = gPokedexOrder_Weight[i];
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1))
+ {
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2];
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1;
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1;
+ gUnknown_02039B4C->pokemonListCount++;
+ }
+ }
+ break;
+ case 4:
+ for (i = NATIONAL_DEX_COUNT - 1; i >=0; i--)
+ {
+ vars[2] = gPokedexOrder_Height[i];
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1))
+ {
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2];
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1;
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1;
+ gUnknown_02039B4C->pokemonListCount++;
+ }
+ }
+ break;
+ case 5:
+ for (i = 0; i < NATIONAL_DEX_COUNT; i++)
+ {
+ vars[2] = gPokedexOrder_Height[i];
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1))
+ {
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2];
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1;
+ gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1;
+ gUnknown_02039B4C->pokemonListCount++;
+ }
+ }
+ break;
+ }
+
+ for (i = gUnknown_02039B4C->pokemonListCount; i < NATIONAL_DEX_COUNT; i++)
+ {
+ gUnknown_02039B4C->unk0[i].dexNum |= 0xFFFF;
+ gUnknown_02039B4C->unk0[i].seen = 0;
+ gUnknown_02039B4C->unk0[i].owned = 0;
+ }
+}
+
+void sub_80BCE2C(u8 windowId, u8 fontId, const u8* str, u8 left, u8 top)
+{
+ u8 color[3];
+
+ color[0] = 0;
+ color[1] = 15;
+ color[2] = 3;
+ AddTextPrinterParameterized2(windowId, fontId, left * 8, (top * 8) + 1, 0, 0, color, -1, str);
+}
+
+void sub_80BCE84(u8 a, u16 b, u16 c)
+{
+ s16 _b;
+ u16 i;
+ u16 r2;
+
+ switch (a)
+ {
+ case 0:
+ default:
+ _b = b - 5;
+ for (i = 0; i <= 10; i++)
+ {
+ if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF)
+ {
+ sub_80BD28C(0x11, i * 2, c);
+ }
+ else
+ {
+ sub_80BD28C(0x11, i * 2, c);
+ if (gUnknown_02039B4C->unk0[_b].seen)
+ {
+ sub_80BD154(_b, 0x12, i * 2, c);
+ sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, i * 2, c);
+ sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, i * 2);
+ }
+ else
+ {
+ sub_80BD154(_b, 0x12, i * 2, c);
+ sub_80BD1F4(0, 0x11, i * 2, c);
+ sub_80BD23C(0, 0x16, i * 2);
+ }
+ }
+ _b++;
+ }
+ break;
+ case 1:
+ _b = b - 5;
+ if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF)
+ {
+ sub_80BD28C(0x11, gUnknown_02039B4C->unk630 * 2, c);
+ }
+ else
+ {
+ sub_80BD28C(0x11, gUnknown_02039B4C->unk630 * 2, c);
+ if (gUnknown_02039B4C->unk0[_b].seen)
+ {
+ sub_80BD154(_b, 0x12, gUnknown_02039B4C->unk630 * 2, c);
+ sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, gUnknown_02039B4C->unk630 * 2, c);
+ sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, gUnknown_02039B4C->unk630 * 2);
+ }
+ else
+ {
+ sub_80BD154(_b, 0x12, gUnknown_02039B4C->unk630 * 2, c);
+ sub_80BD1F4(0, 0x11, gUnknown_02039B4C->unk630 * 2, c);
+ sub_80BD23C(0, 0x16, gUnknown_02039B4C->unk630 * 2);
+ }
+ }
+ break;
+ case 2:
+ _b = b + 5;
+ r2 = gUnknown_02039B4C->unk630 + 10;
+ if (r2 > 15)
+ r2 -= 16;
+ if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF)
+ sub_80BD28C(0x11, r2 * 2, c);
+ else
+ {
+ sub_80BD28C(0x11, r2 * 2, c);
+ if (gUnknown_02039B4C->unk0[_b].seen)
+ {
+ sub_80BD154(_b, 0x12, r2 * 2, c);
+ sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, r2 * 2, c);
+ sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, r2 * 2);
+ }
+ else
+ {
+ sub_80BD154(_b, 0x12, r2 * 2, c);
+ sub_80BD1F4(0, 0x11, r2 * 2, c);
+ sub_80BD23C(0, 0x16, r2 * 2);
+ }
+ }
+ break;
+ }
+ CopyWindowToVram(0, 2);
+}
+
+void sub_80BD154(u16 a, u8 left, u8 top, u16 unused)
+{
+ u8 text[6];
+ u16 r6;
+
+ memcpy(text, gUnknown_0855D2B8, 6);
+ r6 = gUnknown_02039B4C->unk0[a].dexNum;
+ if (gUnknown_02039B4C->dexMode == DEX_MODE_HOENN)
+ r6 = NationalToHoennOrder(r6);
+ text[2] = CHAR_0 + r6 / 100;
+ text[3] = CHAR_0 + (r6 % 100) / 10;
+ text[4] = CHAR_0 + (r6 % 100) % 10;
+ sub_80BCE2C(0, 7, text, left, top);
+}
+
+void sub_80BD1F4(u16 a, u8 x, u8 y, u16 unused)
+{
+ if (a)
+ BlitBitmapToWindow(0, gUnknown_0855D2BE, x * 8, y * 8, 8, 16);
+ else
+ FillWindowPixelRect(0, 0, x * 8, y * 8, 8, 16);
+}
+
+u8 sub_80BD23C(u16 num, u8 left, u8 top)
+{
+ const u8* str;
+
+ num = NationalPokedexNumToSpecies(num);
+ if (num)
+ str = gSpeciesNames[num];
+ else
+ str = sText_TenDashes;
+ sub_80BCE2C(0, 7, str, left, top);
+ return StringLength(str);
+}
+
+void sub_80BD28C(u8 x, u8 y, u16 unused)
+{
+ FillWindowPixelRect(0, 0, x * 8, y * 8, 0x60, 16);
+}
+
+void sub_80BD2B4(u16 a, u16 b)
+{
+ u8 i;
+ u16 unk;
+ u8 spriteId;
+
+ gPaletteFade.bufferTransferDisabled = TRUE;
+
+ for (i = 0; i < 4; i++)
+ gUnknown_02039B4C->unk61E[i] = 0xFFFF;
+ gUnknown_02039B4C->selectedMonSpriteId = 0xFFFF;
+
+ unk = sub_80BDA8C(a - 1);
+ if (unk != 0xFFFF)
+ {
+ spriteId = sub_80BDACC(unk, 0x60, 0x50);
+ gSprites[spriteId].callback = sub_80BE4E0;
+ gSprites[spriteId].data[5] = -32;
+ }
+
+ unk = sub_80BDA8C(a);
+ if (unk != 0xFFFF)
+ {
+ spriteId = sub_80BDACC(unk, 0x60, 0x50);
+ gSprites[spriteId].callback = sub_80BE4E0;
+ gSprites[spriteId].data[5] = 0;
+ }
+
+ unk = sub_80BDA8C(a + 1);
+ if (unk != 0xFFFF)
+ {
+ spriteId = sub_80BDACC(unk, 0x60, 0x50);
+ gSprites[spriteId].callback = sub_80BE4E0;
+ gSprites[spriteId].data[5] = 32;
+ }
+
+ sub_80BCE84(0, a, b);
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D);
+
+ gUnknown_02039B4C->unk630 = 0;
+ gUnknown_02039B4C->unk632 = 0;
+
+ gPaletteFade.bufferTransferDisabled = FALSE;
+}
+
+bool8 sub_80BD404(u8 a, u8 b, u8 c)
+{
+ u16 i;
+ u8 foo;
+
+ if (gUnknown_02039B4C->unk62E)
+ {
+ gUnknown_02039B4C->unk62E--;
+ switch (a)
+ {
+ case 1:
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_02039B4C->unk61E[i] != 0xFFFF)
+ gSprites[gUnknown_02039B4C->unk61E[i]].data[5] += b;
+ }
+ foo = 16 * (c - gUnknown_02039B4C->unk62E) / c;
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk632 * 16 - foo);
+ gUnknown_02039B4C->unk62C -= gUnknown_02039B4C->unk628;
+ break;
+ case 2:
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_02039B4C->unk61E[i] != 0xFFFF)
+ gSprites[gUnknown_02039B4C->unk61E[i]].data[5] -= b;
+ }
+ foo = 16 * (c - gUnknown_02039B4C->unk62E) / c;
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk632 * 16 + foo);
+ gUnknown_02039B4C->unk62C += gUnknown_02039B4C->unk628;
+ break;
+ }
+ return FALSE;
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk630 * 16);
+ return TRUE;
+ }
+}
+
+void sub_80BD5A8(u8 a, u16 b)
+{
+ u16 unk;
+ u8 spriteId;
+
+ gUnknown_02039B4C->unk632 = gUnknown_02039B4C->unk630;
+ switch (a)
+ {
+ case 1:
+ unk = sub_80BDA8C(b - 1);
+ if (unk != 0xFFFF)
+ {
+ spriteId = sub_80BDACC(unk, 0x60, 0x50);
+ gSprites[spriteId].callback = sub_80BE4E0;
+ gSprites[spriteId].data[5] = -64;
+ }
+ if (gUnknown_02039B4C->unk630 > 0)
+ gUnknown_02039B4C->unk630--;
+ else
+ gUnknown_02039B4C->unk630 = 15;
+ break;
+ case 2:
+ unk = sub_80BDA8C(b + 1);
+ if (unk != 0xFFFF)
+ {
+ spriteId = sub_80BDACC(unk, 0x60, 0x50);
+ gSprites[spriteId].callback = sub_80BE4E0;
+ gSprites[spriteId].data[5] = 0x40;
+ }
+ if (gUnknown_02039B4C->unk630 <= 0xE)
+ gUnknown_02039B4C->unk630++;
+ else
+ gUnknown_02039B4C->unk630 = 0;
+ break;
+ }
+}
+
+u16 sub_80BD69C(u16 a, u16 b)
+{
+ u8 r3;
+ u8 r5;
+ u8 i;
+ u16 r6;
+ u8 r10 = 0;
+
+ if ((gMain.heldKeys & DPAD_UP) && (a > 0))
+ {
+ r10 = 1;
+ a = sub_80C0E0C(1, a, 0, gUnknown_02039B4C->pokemonListCount - 1);
+ sub_80BD5A8(1, a);
+ sub_80BCE84(1, a, b);
+ PlaySE(SE_Z_SCROLL);
+ }
+ else if ((gMain.heldKeys & DPAD_DOWN) && (a < gUnknown_02039B4C->pokemonListCount - 1))
+ {
+ r10 = 2;
+ a = sub_80C0E0C(0, a, 0, gUnknown_02039B4C->pokemonListCount - 1);
+ sub_80BD5A8(2, a);
+ sub_80BCE84(2, a, b);
+ PlaySE(SE_Z_SCROLL);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) && (a > 0))
+ {
+ r6 = a;
+
+ for (i = 0; i < 7; i++)
+ a = sub_80C0E0C(1, a, 0, gUnknown_02039B4C->pokemonListCount - 1);
+ gUnknown_02039B4C->unk62C += 16 * (a - r6);
+ sub_80BDA40();
+ sub_80BD2B4(a, 0xE);
+ PlaySE(SE_Z_PAGE);
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) && (a < gUnknown_02039B4C->pokemonListCount - 1))
+ {
+ r6 = a;
+ for (i = 0; i < 7; i++)
+ a = sub_80C0E0C(0, a, 0, gUnknown_02039B4C->pokemonListCount - 1);
+ gUnknown_02039B4C->unk62C += (a - r6) * 16;
+ sub_80BDA40();
+ sub_80BD2B4(a, 0xE);
+ PlaySE(SE_Z_PAGE);
+ }
+
+ if (r10 == 0)
+ {
+ gUnknown_02039B4C->unk638 = 0;
+ return a;
+ }
+
+ r5 = gUnknown_0855D28C[gUnknown_02039B4C->unk638 / 4];
+ r3 = gUnknown_0855D291[gUnknown_02039B4C->unk638 / 4];
+ gUnknown_02039B4C->unk62E = r3;
+ gUnknown_02039B4C->unk636 = r3;
+ gUnknown_02039B4C->unk634 = r5;
+ gUnknown_02039B4C->unk62F = r10;
+ gUnknown_02039B4C->unk628 = r5 / 2;
+ sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636);
+ if (gUnknown_02039B4C->unk638 <= 0xB)
+ gUnknown_02039B4C->unk638++;
+ return a;
+}
+
+void sub_80BD8D0(void)
+{
+ u16 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ u16 spriteId = gUnknown_02039B4C->unk61E[i];
+
+ if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF)
+ gUnknown_02039B4C->selectedMonSpriteId = spriteId;
+ }
+}
+
+u8 sub_80BD930(void)
+{
+ u16 r2;
+ u16 r4 = gUnknown_02039B4C->selectedPokemon;
+
+ if ((gMain.newKeys & DPAD_UP) && r4)
+ {
+ r2 = r4;
+ while (r2 != 0)
+ {
+ r2 = sub_80C0E0C(1, r2, 0, gUnknown_02039B4C->pokemonListCount - 1);
+
+ if (gUnknown_02039B4C->unk0[r2].seen)
+ {
+ r4 = r2;
+ break;
+ }
+ }
+
+ if (gUnknown_02039B4C->selectedPokemon == r4)
+ return FALSE;
+ else
+ {
+ gUnknown_02039B4C->selectedPokemon = r4;
+ gUnknown_02039B4C->unk62C -= 16;
+ return TRUE;
+ }
+ }
+ else if ((gMain.newKeys & DPAD_DOWN) && r4 < gUnknown_02039B4C->pokemonListCount - 1)
+ {
+ r2 = r4;
+ while (r2 < gUnknown_02039B4C->pokemonListCount - 1)
+ {
+ r2 = sub_80C0E0C(0, r2, 0, gUnknown_02039B4C->pokemonListCount - 1);
+
+ if (gUnknown_02039B4C->unk0[r2].seen)
+ {
+ r4 = r2;
+ break;
+ }
+ }
+
+ if (gUnknown_02039B4C->selectedPokemon == r4)
+ return FALSE;
+ else
+ {
+ gUnknown_02039B4C->selectedPokemon = r4;
+ gUnknown_02039B4C->unk62C += 16;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+u8 sub_80BDA40(void)
+{
+ u16 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_02039B4C->unk61E[i] != 0xFFFF)
+ {
+ sub_818D820(gUnknown_02039B4C->unk61E[i]);
+ gUnknown_02039B4C->unk61E[i] |= 0xFFFF;
+ }
+ }
+ return FALSE;
+}
+
+u16 sub_80BDA8C(u16 a1)
+{
+ if (a1 >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[a1].dexNum == 0xFFFF)
+ return 0xFFFF;
+ else if (gUnknown_02039B4C->unk0[a1].seen)
+ return gUnknown_02039B4C->unk0[a1].dexNum;
+ else
+ return 0;
+}
+
+u32 sub_80BDACC(u16 num, s16 x, s16 y)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_02039B4C->unk61E[i] == 0xFFFF)
+ {
+ u8 spriteId = sub_80C0E9C(num, x, y, i);
+
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = i;
+ gSprites[spriteId].data[2] = NationalPokedexNumToSpecies(num);
+ gUnknown_02039B4C->unk61E[i] = spriteId;
+ return spriteId;
+ }
+ }
+ return 0xFFFF;
+}
+
+void sub_80BDB7C(u8 a)
+{
+ u8 spriteId;
+ u16 r5;
+
+ spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 4, 0);
+ gSprites[spriteId].data[1] = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 156, 0);
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].vFlip = TRUE;
+
+ CreateSprite(&gUnknown_0855D194, 230, 20, 0);
+ CreateSprite(&gUnknown_0855D1C4, 16, 120, 0);
+
+ spriteId = CreateSprite(&gUnknown_0855D1C4, 48, 120, 0);
+ StartSpriteAnim(&gSprites[spriteId], 3);
+
+ spriteId = CreateSprite(&gUnknown_0855D1C4, 16, 144, 0);
+ StartSpriteAnim(&gSprites[spriteId], 2);
+ gSprites[spriteId].data[2] = 0x80;
+
+ spriteId = CreateSprite(&gUnknown_0855D1C4, 48, 144, 0);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+
+ spriteId = CreateSprite(&gUnknown_0855D1DC, 0, 80, 2);
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].oam.matrixNum = 30;
+ gSprites[spriteId].data[0] = 0x1E;
+ gSprites[spriteId].data[1] = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D1DC, 0, 80, 2);
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].oam.matrixNum = 31;
+ gSprites[spriteId].data[0] = 0x1F;
+ gSprites[spriteId].data[1] = 0x80;
+
+ if (a == 0)
+ {
+ u32 _a;
+
+ if (!IsNationalPokedexEnabled())
+ {
+ CreateSprite(&gUnknown_0855D1F4, 32, 40, 1);
+
+ spriteId = CreateSprite(&gUnknown_0855D1F4, 32, 72, 1);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ _a = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D224, 24, 48, 1);
+ r5 = gUnknown_02039B4C->unk61A / 100;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ if (r5 != 0)
+ _a = 1;
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D224, 32, 48, 1);
+ r5 = (gUnknown_02039B4C->unk61A % 100) / 10;
+ if (r5 != 0 || _a != 0)
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D224, 40, 48, 1);
+ r5 = (gUnknown_02039B4C->unk61A % 100) % 10;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ _a = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D224, 24, 80, 1);
+ r5 = gUnknown_02039B4C->unk61C / 100;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ if (r5 != 0)
+ _a = 1;
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D224, 32, 80, 1);
+ r5 = (gUnknown_02039B4C->unk61C % 100) / 10;
+ if (r5 != 0 || _a != 0)
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D224, 40, 80, 1);
+ r5 = (gUnknown_02039B4C->unk61C % 100) % 10;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ }
+ else
+ {
+ u16 r6;
+
+ CreateSprite(&gUnknown_0855D1F4, 32, 40, 1);
+
+ spriteId = CreateSprite(&gUnknown_0855D1F4, 32, 76, 1);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+
+ CreateSprite(&gUnknown_0855D20C, 17, 45, 1);
+
+ spriteId = CreateSprite(&gUnknown_0855D20C, 17, 55, 1);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+
+ CreateSprite(&gUnknown_0855D20C, 17, 81, 1);
+
+ spriteId = CreateSprite(&gUnknown_0855D20C, 17, 91, 1);
+ StartSpriteAnim(&gSprites[spriteId], 1);
+
+ r6 = GetHoennPokedexCount(0);
+ _a = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 40, 45, 1);
+ r5 = r6 / 100;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ if (r5 != 0)
+ _a = 1;
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 48, 45, 1);
+ r5 = (r6 % 100) / 10;
+ if (r5 != 0 || _a != 0)
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 56, 45, 1);
+ r5 = (r6 % 100) % 10;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+
+ _a = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 40, 55, 1);
+ r5 = gUnknown_02039B4C->unk61A / 100;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ if (r5 != 0)
+ _a = 1;
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 48, 55, 1);
+ r5 = (gUnknown_02039B4C->unk61A % 100) / 10;
+ if (r5 != 0 || _a != 0)
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 56, 55, 1);
+ r5 = (gUnknown_02039B4C->unk61A % 100) % 10;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+
+ r6 = GetHoennPokedexCount(1);
+ _a = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 40, 81, 1);
+ r5 = r6 / 100;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ if (r5 != 0)
+ _a = 1;
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 48, 81, 1);
+ r5 = (r6 % 100) / 10;
+ if (r5 != 0 || _a != 0)
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 56, 81, 1);
+ r5 = (r6 % 100) % 10;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+
+ _a = 0;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 40, 91, 1);
+ r5 = gUnknown_02039B4C->unk61C / 100;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ if (r5 != 0)
+ _a = 1;
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 48, 91, 1);
+ r5 = (gUnknown_02039B4C->unk61C % 100) / 10;
+ if (r5 != 0 || _a != 0)
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ else
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0855D23C, 56, 91, 1);
+ r5 = (gUnknown_02039B4C->unk61C % 100) % 10;
+ StartSpriteAnim(&gSprites[spriteId], r5);
+ }
+ spriteId = CreateSprite(&gUnknown_0855D254, 136, 96, 1);
+ gSprites[spriteId].invisible = TRUE;
+ }
+ else
+ {
+ spriteId = CreateSprite(&gUnknown_0855D254, 136, 80, 1);
+ gSprites[spriteId].invisible = TRUE;
+ }
+}
+
+void nullsub_38(struct Sprite *sprite)
+{
+}
+
+void sub_80BE44C(struct Sprite *sprite)
+{
+ if (gUnknown_02039B4C->unk64A != 0)
+ DestroySprite(sprite);
+}
+
+//Move Pokemon into position for description page
+void sub_80BE470(struct Sprite *sprite)
+{
+ sprite->oam.priority = 0;
+ sprite->oam.affineMode = 0;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ if (sprite->pos1.x != 48 || sprite->pos1.y != 56)
+ {
+ if (sprite->pos1.x > 48)
+ sprite->pos1.x--;
+ if (sprite->pos1.x < 48)
+ sprite->pos1.x++;
+
+ if (sprite->pos1.y > 56)
+ sprite->pos1.y--;
+ if (sprite->pos1.y < 56)
+ sprite->pos1.y++;
+ }
+ else
+ {
+ sprite->callback = nullsub_38;
+ }
+}
+
+void sub_80BE4E0(struct Sprite *sprite)
+{
+ u8 data1 = sprite->data[1];
+
+ if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3)
+ {
+ sub_818D820(gUnknown_02039B4C->unk61E[data1]);
+ gUnknown_02039B4C->unk61E[data1] = 0xFFFF;
+ }
+ else
+ {
+ u32 var;
+
+ sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256;
+ var = 0x10000 / gSineTable[sprite->data[5] + 0x40];
+ if (var > 0xFFFF)
+ var = 0xFFFF;
+ SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var);
+ sprite->oam.matrixNum = data1 + 1;
+
+ if (sprite->data[5] > -64 && sprite->data[5] < 64)
+ {
+ sprite->invisible = FALSE;
+ sprite->data[0] = 1;
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ }
+
+ if ((sprite->data[5] <= -64 || sprite->data[5] >= 64) && sprite->data[0] != 0)
+ {
+ sub_818D820(gUnknown_02039B4C->unk61E[data1]);
+ gUnknown_02039B4C->unk61E[data1] = 0xFFFF;
+ }
+ }
+}
+
+void sub_80BE604(struct Sprite *sprite)
+{
+ if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3)
+ DestroySprite(sprite);
+ else
+ sprite->pos2.y = gUnknown_02039B4C->selectedPokemon * 120 / (gUnknown_02039B4C->pokemonListCount - 1);
+}
+
+void sub_80BE658(struct Sprite *sprite)
+{
+ if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3)
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ u8 r0;
+
+ if (sprite->data[1] != 0)
+ {
+ if (gUnknown_02039B4C->selectedPokemon == gUnknown_02039B4C->pokemonListCount - 1)
+ sprite->invisible = TRUE;
+ else
+ sprite->invisible = FALSE;
+ r0 = sprite->data[2];
+ }
+ else
+ {
+ if (gUnknown_02039B4C->selectedPokemon == 0)
+ sprite->invisible = TRUE;
+ else
+ sprite->invisible = FALSE;
+ r0 = sprite->data[2] - 128;
+ }
+ sprite->pos2.y = gSineTable[r0] / 64;
+ sprite->data[2] = sprite->data[2] + 8;
+ if (gUnknown_02039B4C->menuIsOpen == 0 && gUnknown_02039B4C->menuY == 0 && sprite->invisible == 0)
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+ }
+}
+
+void sub_80BE758(struct Sprite *sprite)
+{
+ if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3)
+ DestroySprite(sprite);
+}
+
+void sub_80BE780(struct Sprite *sprite)
+{
+ if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3)
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ u8 val;
+ s16 r3;
+ s16 r0;
+
+ val = gUnknown_02039B4C->unk62C + sprite->data[1];
+ r3 = gSineTable[val];
+ r0 = gSineTable[val + 0x40];
+ SetOamMatrix(sprite->data[0], r0, r3, -r3, r0);
+
+ val = gUnknown_02039B4C->unk62C + (sprite->data[1] + 0x40);
+ r3 = gSineTable[val];
+ r0 = gSineTable[val + 0x40];
+ sprite->pos2.x = r0 * 40 / 256;
+ sprite->pos2.y = r3 * 40 / 256;
+ }
+}
+
+void sub_80BE834(struct Sprite *sprite)
+{
+ if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3)
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ u16 r1 = gUnknown_02039B4C->unk64A == 0 ? 80 : 96;
+
+ if (gUnknown_02039B4C->menuIsOpen != 0 && gUnknown_02039B4C->menuY == r1)
+ {
+ sprite->invisible = FALSE;
+ sprite->pos2.y = gUnknown_02039B4C->menuCursorPos * 16;
+ sprite->pos2.x = gSineTable[(u8)sprite->data[2]] / 64;
+ sprite->data[2] += 8;
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ }
+ }
+}
+
+void sub_80BE8DC(const u8* str, u8 left, u8 top)
+{
+ u8 color[3];
+ color[0] = 0;
+ color[1] = 15;
+ color[2] = 3;
+
+ AddTextPrinterParameterized2(0, 1, left, top, 0, 0, color, -1, str);
+}
+
+u8 sub_80BE91C(struct PokedexListItem* item, u8 b)
+{
+ u8 taskId;
+
+ gUnknown_02039B54 = item;
+ taskId = CreateTask(sub_80BEA24, 0);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 1;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = b;
+ gTasks[taskId].data[5] = 255;
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_0856E630, 4);
+ SetBgTilemapBuffer(3, AllocZeroed(0x800));
+ SetBgTilemapBuffer(2, AllocZeroed(0x800));
+ SetBgTilemapBuffer(1, AllocZeroed(0x800));
+ SetBgTilemapBuffer(0, AllocZeroed(0x800));
+ InitWindows(gUnknown_0856E640);
+ DeactivateAllTextPrinters();
+
+ return taskId;
+}
+
+bool8 sub_80BE9C4(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == sub_80BEDF4)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+u8 sub_80BE9F8(struct PokedexListItem *item, u8 b)
+{
+ gUnknown_02039B54 = item;
+ gTasks[b].data[0] = 1;
+ gTasks[b].data[1] = 0;
+ gTasks[b].data[2] = 0;
+ gTasks[b].data[3] = 0;
+ return b;
+}
+
+void sub_80BEA24(u8 taskId)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ if (!gPaletteFade.active)
+ {
+ u16 r2;
+
+ gUnknown_02039B4C->unk64A = 1;
+ gUnknown_030060B4 = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ r2 = 0;
+ if (gTasks[taskId].data[1] != 0)
+ r2 += 0x1000;
+ if (gTasks[taskId].data[2] != 0)
+ r2 |= 0x200;
+ sub_80C09B0(r2);
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0);
+ CopyToBgTilemapBuffer(3, gUnknown_08DC3080, 0, 0);
+ FillWindowPixelBuffer(0, 0);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ sub_80C0D30(1, gUnknown_02039B54->dexNum);
+ CopyWindowToVram(1, 2);
+ gMain.state++;
+ break;
+ case 2:
+ sub_80BFCDC(0xD);
+ sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD);
+ sub_80BC844(gUnknown_02039B4C->unk64C_1);
+ gMain.state++;
+ break;
+ case 3:
+ gMain.state++;
+ break;
+ case 4:
+ sub_80C020C(gUnknown_02039B54->dexNum, gUnknown_02039B4C->dexMode == 0 ? 0 : 1, gUnknown_02039B54->owned, 0);
+ if (!gUnknown_02039B54->owned)
+ LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E);
+ CopyWindowToVram(0, 3);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 5:
+ if (gTasks[taskId].data[1] == 0)
+ {
+ gTasks[taskId].data[4] = (u16)sub_80C0E9C(gUnknown_02039B54->dexNum, 0x30, 0x38, 0);
+ gSprites[gTasks[taskId].data[4]].oam.priority = 0;
+ }
+ gMain.state++;
+ break;
+ case 6:
+ {
+ u32 r3 = 0;
+
+ if (gTasks[taskId].data[2] != 0)
+ r3 = 0x14;
+ if (gTasks[taskId].data[1] != 0)
+ r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 16));
+ BeginNormalPaletteFade(~r3, 0, 16, 0, 0);
+ SetVBlankCallback(gUnknown_030060B4);
+ gMain.state++;
+ }
+ break;
+ case 7:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ HideBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ gMain.state++;
+ break;
+ case 8:
+ if (!gPaletteFade.active)
+ {
+ gMain.state++;
+ if (gTasks[taskId].data[3] == 0)
+ {
+ StopCryAndClearCrySongs();
+ PlayCry2(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), 0, 0x7D, 0xA);
+ }
+ else
+ {
+ gMain.state++;
+ }
+ }
+ break;
+ case 9:
+ if (!IsCryPlayingOrClearCrySongs())
+ gMain.state++;
+ break;
+ case 10:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 1;
+ gTasks[taskId].data[3] = 1;
+ gTasks[taskId].func = sub_80BEDF4;
+ gMain.state = 0;
+ break;
+ }
+}
+
+void sub_80BEDB0(void)
+{
+ void *r0;
+ FreeAllWindowBuffers();
+ r0 = GetBgTilemapBuffer(0);
+ if (r0)
+ Free(r0);
+ r0 = GetBgTilemapBuffer(1);
+ if (r0)
+ Free(r0);
+ r0 = GetBgTilemapBuffer(2);
+ if (r0)
+ Free(r0);
+ r0 = GetBgTilemapBuffer(3);
+ if (r0)
+ Free(r0);
+}
+
+void sub_80BEDF4(u8 taskId)
+{
+ if (gTasks[taskId].data[0] != 0)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = sub_80BF038;
+ PlaySE(SE_Z_SCROLL);
+ return;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = sub_80BF070;
+ PlaySE(SE_PC_OFF);
+ return;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ switch (gUnknown_02039B4C->selectedScreen)
+ {
+ case AREA_SCREEN:
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 16, RGB_BLACK);
+ gUnknown_02039B4C->unk64E = 1;
+ gTasks[taskId].func = sub_80BEFD0;
+ PlaySE(SE_PIN);
+ break;
+ case CRY_SCREEN:
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK);
+ gUnknown_02039B4C->unk64E = 2;
+ gTasks[taskId].func = sub_80BEFD0;
+ PlaySE(SE_PIN);
+ break;
+ case SIZE_SCREEN:
+ if (!gUnknown_02039B54->owned)
+ {
+ PlaySE(SE_HAZURE);
+ }
+ else
+ {
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK);
+ gUnknown_02039B4C->unk64E = 3;
+ gTasks[taskId].func = sub_80BEFD0;
+ PlaySE(SE_PIN);
+ }
+ break;
+ case CANCEL_SCREEN:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ gTasks[taskId].func = sub_80BF070;
+ PlaySE(SE_PC_OFF);
+ break;
+ }
+ return;
+ }
+ if (((gMain.newKeys & DPAD_LEFT)
+ || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))
+ && gUnknown_02039B4C->selectedScreen > 0)
+ {
+ gUnknown_02039B4C->selectedScreen--;
+ sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD);
+ PlaySE(SE_Z_PAGE);
+ return;
+ }
+ if (((gMain.newKeys & DPAD_RIGHT)
+ || ((gMain.newKeys & R_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))
+ && gUnknown_02039B4C->selectedScreen < 3)
+ {
+ gUnknown_02039B4C->selectedScreen++;
+ sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD);
+ PlaySE(SE_Z_PAGE);
+ return;
+ }
+}
+
+void sub_80BEFD0(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_818D820(gTasks[taskId].data[4]);
+ switch (gUnknown_02039B4C->unk64E)
+ {
+ case 1:
+ default:
+ gTasks[taskId].func = sub_80BF0AC;
+ break;
+ case 2:
+ gTasks[taskId].func = sub_80BF250;
+ break;
+ case 3:
+ gTasks[taskId].func = sub_80BF82C;
+ break;
+ }
+ }
+}
+
+void sub_80BF038(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_818D820(gTasks[taskId].data[4]);
+ gTasks[taskId].func = sub_80BEA24;
+ }
+}
+
+void sub_80BF070(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_818D820(gTasks[taskId].data[4]);
+ sub_80BEDB0();
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80BF0AC(u8 taskId)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02039B4C->unk64A = 5;
+ gUnknown_030060B4 = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ sub_80C09B0(0x200);
+ gUnknown_02039B4C->selectedScreen = AREA_SCREEN;
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ sub_80BFCF4(0xD);
+ sub_80BFD7C(0, 0xD);
+ sub_80BC844(gUnknown_02039B4C->unk64C_1);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256);
+ gMain.state++;
+ break;
+ case 2:
+ sub_813D3D8(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), &gUnknown_02039B4C->unk64E);
+ SetVBlankCallback(gUnknown_030060B4);
+ gUnknown_02039B4C->unk64E = 0;
+ gMain.state = 0;
+ gTasks[taskId].func = sub_80BF1B4;
+ break;
+ }
+}
+
+void sub_80BF1B4(u8 taskId)
+{
+ if (gUnknown_02039B4C->unk64E != 0)
+ gTasks[taskId].func = sub_80BF1EC;
+}
+
+void sub_80BF1EC(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ switch (gUnknown_02039B4C->unk64E)
+ {
+ case 1:
+ default:
+ gTasks[taskId].func = sub_80BEA24;
+ break;
+ case 2:
+ gTasks[taskId].func = sub_80BF250;
+ break;
+ }
+ }
+}
+
+void sub_80BF250(u8 taskId)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ if (!gPaletteFade.active)
+ {
+ m4aMPlayStop(&gMPlayInfo_BGM);
+ gUnknown_02039B4C->unk64A = 6;
+ gUnknown_030060B4 = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ sub_80C09B0(0x200);
+ gUnknown_02039B4C->selectedScreen = CRY_SCREEN;
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ copy_decompressed_tile_data_to_vram_autofree(3, &gPokedexMenu_Gfx, 0x2000, 0, 0);
+ CopyToBgTilemapBuffer(3, &gUnknown_08DC3198, 0, 0);
+ FillWindowPixelBuffer(0, 0);
+ PutWindowTilemap(0);
+ PutWindowTilemap(3);
+ PutWindowTilemap(2);
+ gMain.state++;
+ break;
+ case 2:
+ sub_80BFCF4(0xD);
+ sub_80BFD7C(1, 0xD);
+ sub_80BC844(gUnknown_02039B4C->unk64C_1);
+ gMain.state++;
+ break;
+ case 3:
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 4:
+ sub_80BE8DC(gText_CryOf, 0x52, 33);
+ sub_80C0B44(0, gUnknown_02039B54->dexNum, 0x52, 49);
+ gMain.state++;
+ break;
+ case 5:
+ gTasks[taskId].data[4] = sub_80C0E9C(gUnknown_02039B54->dexNum, 48, 56, 0);
+ gSprites[gTasks[taskId].data[4]].oam.priority = 0;
+ gUnknown_030061EC = 0;
+ gMain.state++;
+ break;
+ case 6:
+ {
+ struct CryRelatedStruct sp4;
+
+ sp4.unk0 = 0x4020;
+ sp4.unk2 = 0x1F;
+ sp4.paletteNo = 8;
+ sp4.yPos = 0x1E;
+ sp4.xPos = 0xC;
+ if (sub_8145354(&sp4, 2) != 0)
+ {
+ gMain.state++;
+ gUnknown_030061EC = 0;
+ }
+ }
+ break;
+ case 7:
+ {
+ struct CryRelatedStruct spC;
+
+ spC.paletteNo = 9;
+ spC.xPos = 0x12;
+ spC.yPos = 3;
+ if (sub_8145850(&spC, 3) != 0)
+ gMain.state++;
+ CopyWindowToVram(3, 2);
+ CopyWindowToVram(0, 3);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ }
+ break;
+ case 8:
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0x10, 0, RGB_BLACK);
+ SetVBlankCallback(gUnknown_030060B4);
+ gMain.state++;
+ break;
+ case 9:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ gMain.state++;
+ break;
+ case 10:
+ gUnknown_02039B4C->unk64E = 0;
+ gMain.state = 0;
+ gTasks[taskId].func = sub_80BF5CC;
+ break;
+ }
+}
+
+void sub_80BF5CC(u8 taskId)
+{
+ sub_814545C(2);
+
+ if (IsCryPlaying())
+ sub_80BF7FC(1);
+ else
+ sub_80BF7FC(0);
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_80BF7FC(1);
+ sub_8145534(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum));
+ return;
+ }
+ else if (!gPaletteFade.active)
+ {
+ if (gMain.newKeys & B_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK);
+ m4aMPlayContinue(&gMPlayInfo_BGM);
+ gUnknown_02039B4C->unk64E = 1;
+ gTasks[taskId].func = sub_80BF790;
+ PlaySE(SE_PC_OFF);
+ return;
+ }
+ if ((gMain.newKeys & DPAD_LEFT)
+ || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))
+ {
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK);
+ m4aMPlayContinue(&gMPlayInfo_BGM);
+ gUnknown_02039B4C->unk64E = 2;
+ gTasks[taskId].func = sub_80BF790;
+ PlaySE(SE_Z_PAGE);
+ return;
+ }
+ if ((gMain.newKeys & DPAD_RIGHT)
+ || ((gMain.newKeys & R_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))
+ {
+ if (!gUnknown_02039B54->owned)
+ {
+ PlaySE(SE_HAZURE);
+ }
+ else
+ {
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK);
+ m4aMPlayContinue(&gMPlayInfo_BGM);
+ gUnknown_02039B4C->unk64E = 3;
+ gTasks[taskId].func = sub_80BF790;
+ PlaySE(SE_Z_PAGE);
+ }
+ return;
+ }
+ }
+}
+
+void sub_80BF790(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_8145914();
+ sub_818D820(gTasks[taskId].data[4]);
+ switch (gUnknown_02039B4C->unk64E)
+ {
+ default:
+ case 1:
+ gTasks[taskId].func = sub_80BEA24;
+ break;
+ case 2:
+ gTasks[taskId].func = sub_80BF0AC;
+ break;
+ case 3:
+ gTasks[taskId].func = sub_80BF82C;
+ break;
+ }
+ }
+}
+
+void sub_80BF7FC(u8 a)
+{
+ u16 unk;
+
+ if (a != 0)
+ unk = RGB(18, 28, 0);
+ else
+ unk = RGB(15, 21, 0);
+ LoadPalette(&unk, 0x5D, 2);
+}
+
+void sub_80BF82C(u8 taskId)
+{
+ u8 spriteId;
+
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02039B4C->unk64A = 7;
+ gUnknown_030060B4 = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ sub_80C09B0(0x200);
+ gUnknown_02039B4C->selectedScreen = SIZE_SCREEN;
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0);
+ CopyToBgTilemapBuffer(3, gUnknown_08DC2E6C, 0, 0);
+ FillWindowPixelBuffer(0, 0);
+ PutWindowTilemap(0);
+ gMain.state++;
+ break;
+ case 2:
+ sub_80BFCF4(0xD);
+ sub_80BFD7C(2, 0xD);
+ sub_80BC844(gUnknown_02039B4C->unk64C_1);
+ gMain.state++;
+ break;
+ case 3:
+ {
+ u8 string[0x40]; //I hope this is the correct size
+
+ StringCopy(string, gText_SizeComparedTo);
+ StringAppend(string, gSaveBlock2Ptr->playerName);
+ sub_80BE8DC(string, GetStringCenterAlignXOffset(1, string, 0xF0), 0x79);
+ gMain.state++;
+ }
+ break;
+ case 4:
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 5:
+ spriteId = sub_80C0EF8(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), 152, 56, 0);
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].oam.matrixNum = 1;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_02039B54->dexNum].trainerOffset;
+ SetOamMatrix(1, gPokedexEntries[gUnknown_02039B54->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_02039B54->dexNum].trainerScale);
+ LoadPalette(gUnknown_0856E610, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20);
+ gTasks[taskId].data[5] = spriteId;
+ gMain.state++;
+ break;
+ case 6:
+ spriteId = sub_80C0E9C(gUnknown_02039B54->dexNum, 88, 56, 1);
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].oam.matrixNum = 2;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_02039B54->dexNum].pokemonOffset;
+ SetOamMatrix(2, gPokedexEntries[gUnknown_02039B54->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_02039B54->dexNum].pokemonScale);
+ LoadPalette(gUnknown_0856E610, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20);
+ gTasks[taskId].data[4] = spriteId;
+ CopyWindowToVram(0, 3);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 7:
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0x10, 0, RGB_BLACK);
+ SetVBlankCallback(gUnknown_030060B4);
+ gMain.state++;
+ break;
+ case 8:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ HideBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ gMain.state++;
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02039B4C->unk64E = 0;
+ gMain.state = 0;
+ gTasks[taskId].func = sub_80BFBB0;
+ }
+ break;
+ }
+}
+
+void sub_80BFBB0(u8 taskId)
+{
+ if (gMain.newKeys & B_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK);
+ gUnknown_02039B4C->unk64E = 1;
+ gTasks[taskId].func = sub_80BFC78;
+ PlaySE(SE_PC_OFF);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT)
+ || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))
+ {
+ BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK);
+ gUnknown_02039B4C->unk64E = 2;
+ gTasks[taskId].func = sub_80BFC78;
+ PlaySE(SE_Z_PAGE);
+ }
+}
+
+void sub_80BFC78(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_818D820(gTasks[taskId].data[4]);
+ sub_818D8F0(gTasks[taskId].data[5]);
+ switch (gUnknown_02039B4C->unk64E)
+ {
+ default:
+ case 1:
+ gTasks[taskId].func = sub_80BEA24;
+ break;
+ case 2:
+ gTasks[taskId].func = sub_80BF250;
+ break;
+ }
+ }
+}
+
+void sub_80BFCDC(u16 a)
+{
+ CopyToBgTilemapBuffer(1, gUnknown_08DC2F5C, 0, 0);
+}
+
+void sub_80BFCF4(u16 a)
+{
+ CopyToBgTilemapBuffer(1, gUnknown_08DC2FEC, 0, 0);
+}
+
+#ifdef NONMATCHING
+void sub_80BFD0C(u8 a, u16 unused)
+{
+ u8 i;
+ u8 j;
+ u16* ptr = GetBgTilemapBuffer(1);
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 row = (i * 7) + 1;
+ u16 newPalette = 0x4000;
+
+ if (i == a)
+ newPalette = 0x2000;
+
+ for (j = 0; j < 7; j++)
+ {
+ ptr[row + j] = (ptr[row + j] % 0x1000) | newPalette;
+ ptr[row + j + 0x20] = (ptr[row + j + 0x20] % 0x1000) | newPalette;
+ }
+ }
+ CopyBgTilemapBufferToVram(1);
+}
+#else
+__attribute__((naked))
+void sub_80BFD0C(u8 a, u16 unused)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ movs r0, 0x1\n\
+ bl GetBgTilemapBuffer\n\
+ adds r7, r0, 0\n\
+ movs r1, 0\n\
+_080BFD22:\n\
+ lsls r0, r1, 3\n\
+ subs r0, r1\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r3, 0x80\n\
+ lsls r3, 7\n\
+ cmp r1, r8\n\
+ bne _080BFD38\n\
+ movs r3, 0x80\n\
+ lsls r3, 6\n\
+_080BFD38:\n\
+ movs r2, 0\n\
+ adds r6, r1, 0x1\n\
+ ldr r4, =0x00000fff\n\
+_080BFD3E:\n\
+ adds r1, r5, r2\n\
+ lsls r1, 1\n\
+ adds r1, r7\n\
+ ldrh r0, [r1]\n\
+ ands r0, r4\n\
+ orrs r0, r3\n\
+ strh r0, [r1]\n\
+ adds r1, 0x40\n\
+ ldrh r0, [r1]\n\
+ ands r0, r4\n\
+ orrs r0, r3\n\
+ strh r0, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0x6\n\
+ bls _080BFD3E\n\
+ lsls r0, r6, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r1, 0x3\n\
+ bls _080BFD22\n\
+ movs r0, 0x1\n\
+ bl CopyBgTilemapBufferToVram\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n\
+ .syntax divided\n");
+}
+#endif
+
+#ifdef NONMATCHING
+void sub_80BFD7C(u8 a, u16 b)
+{
+ u8 i;
+ u8 j;
+ u16* ptr = GetBgTilemapBuffer(1);
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 row = i * 7 + 1;
+ u32 newPalette;
+
+ if (i == a || i == 3)
+ newPalette = 0x2000;
+ else
+ newPalette = 0x4000;
+
+ for (j = 0; j < 7; j++)
+ {
+ ptr[row + j] = (ptr[row + j] % 0x1000) | newPalette;
+ ptr[row + j + 0x20] = (ptr[row + j + 0x20] % 0x1000) | newPalette;
+ }
+ }
+ CopyBgTilemapBufferToVram(1);
+}
+#else
+__attribute__((naked))
+void sub_80BFD7C(u8 a, u16 b)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ movs r0, 0x1\n\
+ bl GetBgTilemapBuffer\n\
+ adds r7, r0, 0\n\
+ movs r1, 0\n\
+_080BFD92:\n\
+ lsls r0, r1, 3\n\
+ subs r0, r1\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r1, r8\n\
+ beq _080BFDA4\n\
+ cmp r1, 0x3\n\
+ bne _080BFDAA\n\
+_080BFDA4:\n\
+ movs r3, 0x80\n\
+ lsls r3, 6\n\
+ b _080BFDAE\n\
+_080BFDAA:\n\
+ movs r3, 0x80\n\
+ lsls r3, 7\n\
+_080BFDAE:\n\
+ movs r2, 0\n\
+ adds r5, r1, 0x1\n\
+ ldr r4, =0x00000fff\n\
+_080BFDB4:\n\
+ adds r1, r6, r2\n\
+ lsls r1, 1\n\
+ adds r1, r7\n\
+ ldrh r0, [r1]\n\
+ ands r0, r4\n\
+ orrs r0, r3\n\
+ strh r0, [r1]\n\
+ adds r1, 0x40\n\
+ ldrh r0, [r1]\n\
+ ands r0, r4\n\
+ orrs r0, r3\n\
+ strh r0, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0x6\n\
+ bls _080BFDB4\n\
+ lsls r0, r5, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r1, 0x3\n\
+ bls _080BFD92\n\
+ movs r0, 0x1\n\
+ bl CopyBgTilemapBufferToVram\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n\
+ .syntax divided\n");
+}
+#endif
+
+u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 b, u32 c)
+{
+ u8 taskId = CreateTask(sub_80BFE38, 0);
+
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = dexNum;
+ gTasks[taskId].data[12] = b;
+ gTasks[taskId].data[13] = b >> 16;
+ gTasks[taskId].data[14] = c;
+ gTasks[taskId].data[15] = c >> 16;
+ return taskId;
+}
+
+void sub_80BFE38(u8 taskId)
+{
+ u8 spriteId;
+ u16 dexNum = gTasks[taskId].data[1];
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ default:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_030060B4 = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ sub_80C09B0(0x100);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_0856E668, 2);
+ SetBgTilemapBuffer(3, AllocZeroed(0x800));
+ SetBgTilemapBuffer(2, AllocZeroed(0x800));
+ InitWindows(gUnknown_0856E670);
+ DeactivateAllTextPrinters();
+ gTasks[taskId].data[0] = 1;
+ }
+ break;
+ case 1:
+ copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0);
+ CopyToBgTilemapBuffer(3, gUnknown_08DC3080, 0, 0);
+ FillWindowPixelBuffer(0, 0);
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ sub_80C0D30(1, gTasks[taskId].data[1]);
+ CopyWindowToVram(1, 2);
+ ResetPaletteFade();
+ sub_80BC844(0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ sub_80C020C(dexNum, IsNationalPokedexEnabled(), 1, 1);
+ CopyWindowToVram(0, 3);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ spriteId = sub_80C0E9C(dexNum, 0x30, 0x38, 0);
+ gSprites[spriteId].oam.priority = 0;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ SetVBlankCallback(gUnknown_030060B4);
+ gTasks[taskId].data[3] = spriteId;
+ gTasks[taskId].data[0]++;
+ break;
+ case 5:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ ShowBg(2);
+ ShowBg(3);
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ if (!gPaletteFade.active)
+ {
+ PlayCry1(NationalPokedexNumToSpecies(dexNum), 0);
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_80C0088;
+ }
+ break;
+ }
+}
+
+void sub_80C0088(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ BeginNormalPaletteFade(0x0000FFFF, 0, 0, 16, RGB_BLACK);
+ gSprites[gTasks[taskId].data[3]].callback = sub_80C01CC;
+ gTasks[taskId].func = blockset_load_palette_to_gpu;
+ }
+ else if (++gTasks[taskId].data[2] & 0x10)
+ {
+ LoadPalette(gPokedexText_Pal + 1, 0x31, 14);
+ }
+ else
+ {
+ LoadPalette(gPokedexCaughtScreenFade_Pal + 1, 0x31, 14);
+ }
+}
+
+void blockset_load_palette_to_gpu(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ u16 species;
+ u32 otId;
+ u32 personality;
+ u8 paletteNum;
+ const u8 *lzPaletteData;
+ void *buffer;
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ FreeAllWindowBuffers();
+ buffer = GetBgTilemapBuffer(2);
+ if (buffer)
+ Free(buffer);
+ buffer = GetBgTilemapBuffer(3);
+ if (buffer)
+ Free(buffer);
+
+ species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]);
+ otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12];
+ personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14];
+ paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum;
+ lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
+ LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32);
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80C01CC(struct Sprite *sprite)
+{
+ if (sprite->pos1.x < 0x78)
+ sprite->pos1.x += 2;
+ if (sprite->pos1.x > 0x78)
+ sprite->pos1.x -= 2;
+
+ if (sprite->pos1.y < 0x50)
+ sprite->pos1.y += 1;
+ if (sprite->pos1.y > 0x50)
+ sprite->pos1.y -= 1;
+}
+
+void sub_80C020C(u32 num, u32 value, u32 c, u32 d)
+{
+ u8 str[0x10];
+ u8 str2[0x20];
+ u16 natNum;
+ const u8 *text;
+ const u8 *text2;
+ const u8 *text3;
+
+ if (d)
+ sub_80BE8DC(gText_PokedexRegistration, GetStringCenterAlignXOffset(1, gText_PokedexRegistration, 0xF0), 0);
+ if (value == 0)
+ value = NationalToHoennOrder(num);
+ else
+ value = num;
+ ConvertIntToDecimalStringN(StringCopy(str, gText_UnkCtrlF908Clear01), value, 2, 3);
+ sub_80BE8DC(str, 0x60, 0x19);
+ natNum = NationalPokedexNumToSpecies(num);
+ if (natNum)
+ text = gSpeciesNames[natNum];
+ else
+ text = sText_TenDashes2;
+ sub_80BE8DC(text, 0x84, 0x19);
+ if (c)
+ {
+ CopyMonCategoryText(num, str2);
+ text2 = str2;
+ }
+ else
+ {
+ text2 = gText_5MarksPokemon;
+ }
+ sub_80BE8DC(text2, 0x64, 0x29);
+ sub_80BE8DC(gText_HTHeight, 0x60, 0x39);
+ sub_80BE8DC(gText_WTWeight, 0x60, 0x49);
+ if (c)
+ {
+ sub_80C0354(gPokedexEntries[num].height, 0x81, 0x39);
+ sub_80C0460(gPokedexEntries[num].weight, 0x81, 0x49);
+ }
+ else
+ {
+ sub_80BE8DC(gText_UnkHeight, 0x81, 0x39);
+ sub_80BE8DC(gText_UnkWeight, 0x81, 0x49);
+ }
+ if (c)
+ text3 = gPokedexEntries[num].description;
+ else
+ text3 = gUnknown_0855D30C;
+ sub_80BE8DC(text3, GetStringCenterAlignXOffset(1, text3, 0xF0), 0x5F);
+}
+
+#define CHAR_PRIME (0xB4)
+#define CHAR_DOUBLE_PRIME (0xB2)
+
+void sub_80C0354(u16 height, u8 left, u8 top)
+{
+ u8 buffer[16];
+ u32 inches, feet;
+ u8 i = 0;
+
+ inches = (height * 10000) / 254;
+ if (inches % 10 >= 5)
+ inches += 10;
+ feet = inches / 120;
+ inches = (inches - (feet * 120)) / 10;
+
+ buffer[i++] = EXT_CTRL_CODE_BEGIN;
+ buffer[i++] = 0x13;
+ if (feet / 10 == 0)
+ {
+ buffer[i++] = 18;
+ buffer[i++] = feet + CHAR_0;
+ }
+ else
+ {
+ buffer[i++] = 12;
+ buffer[i++] = feet / 10 + CHAR_0;
+ buffer[i++] = (feet % 10) + CHAR_0;
+ }
+ buffer[i++] = CHAR_PRIME;
+ buffer[i++] = (inches / 10) + CHAR_0;
+ buffer[i++] = (inches % 10) + CHAR_0;
+ buffer[i++] = CHAR_DOUBLE_PRIME;
+ buffer[i++] = EOS;
+ sub_80BE8DC(buffer, left, top);
+}
+
+#ifdef NONMATCHING
+void sub_80C0460(u16 weight, u8 left, u8 top)
+{
+ u8 buffer[16];
+ u32 lbs;
+ u8 i = 0;
+ bool8 output;
+
+ lbs = (weight * 100000) / 4536;
+ if (lbs % 10 >= 5)
+ lbs += 10;
+ output = FALSE;
+
+ buffer[i] = (lbs / 100000) + CHAR_0;
+ if (buffer[i] == CHAR_0)
+ {
+ buffer[i++] = 0x77;
+ }
+ else
+ {
+ output = TRUE;
+ i++;
+ }
+
+ lbs = (lbs % 100000);
+ buffer[i] = (lbs / 10000) + CHAR_0;
+ if (buffer[i] == CHAR_0 && output == FALSE)
+ {
+ buffer[i++] = 0x77;
+ }
+ else
+ {
+ output = TRUE;
+ i++;
+ }
+
+ lbs = (lbs % 10000);
+ buffer[i] = (lbs / 1000) + CHAR_0;
+ if (buffer[i] == CHAR_0 && output == FALSE)
+ {
+ buffer[i++] = 0x77;
+ }
+ else
+ {
+ i++;
+ }
+ lbs = (lbs % 1000);
+ buffer[i++] = (lbs / 100) + CHAR_0;
+ lbs = (lbs % 100);
+ buffer[i++] = CHAR_PERIOD;
+ buffer[i++] = (lbs / 10) + CHAR_0;
+ buffer[i++] = CHAR_SPACE;
+ buffer[i++] = CHAR_l;
+ buffer[i++] = CHAR_b;
+ buffer[i++] = CHAR_s;
+ buffer[i++] = CHAR_PERIOD;
+ buffer[i++] = EOS;
+ sub_80BE8DC(buffer, left, top);
+}
+#else
+__attribute__((naked))
+void sub_80C0460(u16 weight, u8 left, u8 top)
+{
+ 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 r0, 16\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r10, r1\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r2, [sp, 0x10]\n\
+ ldr r5, =0x000186a0\n\
+ muls r0, r5\n\
+ ldr r1, =0x000011b8\n\
+ bl __divsi3\n\
+ adds r7, r0, 0\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ cmp r0, 0x4\n\
+ bls _080C0494\n\
+ adds r7, 0xA\n\
+_080C0494:\n\
+ movs r0, 0\n\
+ mov r8, r0\n\
+ mov r4, sp\n\
+ adds r0, r7, 0\n\
+ adds r1, r5, 0\n\
+ bl __udivsi3\n\
+ adds r0, 0xA1\n\
+ strb r0, [r4]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xA1\n\
+ bne _080C04C0\n\
+ movs r6, 0x1\n\
+ mov r1, sp\n\
+ movs r0, 0x77\n\
+ strb r0, [r1]\n\
+ b _080C04C6\n\
+ .pool\n\
+_080C04C0:\n\
+ movs r1, 0x1\n\
+ mov r8, r1\n\
+ movs r6, 0x1\n\
+_080C04C6:\n\
+ ldr r1, =0x000186a0\n\
+ adds r0, r7, 0\n\
+ bl __umodsi3\n\
+ adds r7, r0, 0\n\
+ mov r4, sp\n\
+ adds r4, 0x1\n\
+ ldr r1, =0x00002710\n\
+ bl __udivsi3\n\
+ adds r0, 0xA1\n\
+ strb r0, [r4]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xA1\n\
+ bne _080C0504\n\
+ mov r2, r8\n\
+ cmp r2, 0\n\
+ bne _080C0504\n\
+ adds r1, r6, 0\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ add r1, sp\n\
+ movs r0, 0x77\n\
+ strb r0, [r1]\n\
+ b _080C050E\n\
+ .pool\n\
+_080C0504:\n\
+ movs r3, 0x1\n\
+ mov r8, r3\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+_080C050E:\n\
+ ldr r1, =0x00002710\n\
+ adds r0, r7, 0\n\
+ bl __umodsi3\n\
+ adds r7, r0, 0\n\
+ mov r0, sp\n\
+ adds r4, r0, r6\n\
+ movs r1, 0xFA\n\
+ lsls r1, 2\n\
+ adds r0, r7, 0\n\
+ bl __udivsi3\n\
+ adds r0, 0xA1\n\
+ strb r0, [r4]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xA1\n\
+ bne _080C054C\n\
+ mov r1, r8\n\
+ cmp r1, 0\n\
+ bne _080C054C\n\
+ adds r1, r6, 0\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ add r1, sp\n\
+ movs r0, 0x77\n\
+ strb r0, [r1]\n\
+ b _080C0552\n\
+ .pool\n\
+_080C054C:\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+_080C0552:\n\
+ movs r1, 0xFA\n\
+ lsls r1, 2\n\
+ adds r0, r7, 0\n\
+ bl __umodsi3\n\
+ adds r7, r0, 0\n\
+ adds r1, r6, 0\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r5, r6, 0\n\
+ mov r2, sp\n\
+ adds r4, r2, r1\n\
+ adds r0, r7, 0\n\
+ movs r1, 0x64\n\
+ bl __udivsi3\n\
+ adds r0, 0xA1\n\
+ movs r3, 0\n\
+ mov r9, r3\n\
+ strb r0, [r4]\n\
+ adds r0, r7, 0\n\
+ movs r1, 0x64\n\
+ bl __umodsi3\n\
+ adds r7, r0, 0\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r1, r6, 0\n\
+ mov r2, sp\n\
+ adds r0, r2, r5\n\
+ movs r3, 0xAD\n\
+ mov r8, r3\n\
+ mov r2, r8\n\
+ strb r2, [r0]\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r5, r6, 0\n\
+ mov r3, sp\n\
+ adds r4, r3, r1\n\
+ adds r0, r7, 0\n\
+ movs r1, 0xA\n\
+ bl __udivsi3\n\
+ adds r0, 0xA1\n\
+ strb r0, [r4]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r1, r6, 0\n\
+ mov r2, sp\n\
+ adds r0, r2, r5\n\
+ mov r3, r9\n\
+ strb r3, [r0]\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r2, r6, 0\n\
+ add r1, sp\n\
+ movs r0, 0xE0\n\
+ strb r0, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r3, r6, 0\n\
+ mov r0, sp\n\
+ adds r1, r0, r2\n\
+ movs r0, 0xD6\n\
+ strb r0, [r1]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r2, r6, 0\n\
+ mov r0, sp\n\
+ adds r1, r0, r3\n\
+ movs r0, 0xE7\n\
+ strb r0, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r3, sp\n\
+ adds r1, r3, r2\n\
+ mov r2, r8\n\
+ strb r2, [r1]\n\
+ adds r1, r3, r0\n\
+ movs r0, 0xFF\n\
+ strb r0, [r1]\n\
+ mov r0, sp\n\
+ mov r1, r10\n\
+ ldr r2, [sp, 0x10]\n\
+ bl sub_80BE8DC\n\
+ add sp, 0x14\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+#endif
+
+const u8 *sub_80C0620(u16 dexNum)
+{
+ return gPokedexEntries[dexNum].categoryName;
+}
+
+u16 GetPokedexHeightWeight(u16 dexNum, u8 data)
+{
+ switch (data)
+ {
+ case 0: // height
+ return gPokedexEntries[dexNum].height;
+ case 1: // weight
+ return gPokedexEntries[dexNum].weight;
+ default:
+ return 1;
+ }
+}
+
+s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID)
+{
+ u8 index;
+ u8 bit;
+ u8 mask;
+ s8 retVal;
+
+ nationalDexNo--;
+ index = nationalDexNo / 8;
+ bit = nationalDexNo % 8;
+ mask = 1 << bit;
+ retVal = 0;
+ switch (caseID)
+ {
+ case FLAG_GET_SEEN:
+ if (gSaveBlock2Ptr->pokedex.seen[index] & mask)
+ {
+ if ((gSaveBlock2Ptr->pokedex.seen[index] & mask) == (gSaveBlock1Ptr->seen1[index] & mask)
+ && (gSaveBlock2Ptr->pokedex.seen[index] & mask) == (gSaveBlock1Ptr->seen2[index] & mask))
+ retVal = 1;
+ else
+ {
+ gSaveBlock2Ptr->pokedex.seen[index] &= ~mask;
+ gSaveBlock1Ptr->seen1[index] &= ~mask;
+ gSaveBlock1Ptr->seen2[index] &= ~mask;
+ retVal = 0;
+ }
+ }
+ break;
+ case FLAG_GET_CAUGHT:
+ if (gSaveBlock2Ptr->pokedex.owned[index] & mask)
+ {
+ if ((gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock2Ptr->pokedex.seen[index] & mask)
+ && (gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock1Ptr->seen1[index] & mask)
+ && (gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock1Ptr->seen2[index] & mask))
+ retVal = 1;
+ else
+ {
+ gSaveBlock2Ptr->pokedex.owned[index] &= ~mask;
+ gSaveBlock2Ptr->pokedex.seen[index] &= ~mask;
+ gSaveBlock1Ptr->seen1[index] &= ~mask;
+ gSaveBlock1Ptr->seen2[index] &= ~mask;
+ retVal = 0;
+ }
+ }
+ break;
+ case FLAG_SET_SEEN:
+ gSaveBlock2Ptr->pokedex.seen[index] |= mask;
+ gSaveBlock1Ptr->seen1[index] |= mask;
+ gSaveBlock1Ptr->seen2[index] |= mask;
+ break;
+ case FLAG_SET_CAUGHT:
+ gSaveBlock2Ptr->pokedex.owned[index] |= mask;
+ break;
+ }
+ return retVal;
+}
+
+u16 GetNationalPokedexCount(u8 caseID)
+{
+ u16 count = 0;
+ u16 i;
+
+ for (i = 0; i < NATIONAL_DEX_COUNT; i++)
+ {
+ switch (caseID)
+ {
+ case FLAG_GET_SEEN:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
+ count++;
+ break;
+ case FLAG_GET_CAUGHT:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
+ count++;
+ break;
+ }
+ }
+ return count;
+}
+
+u16 GetHoennPokedexCount(u8 caseID)
+{
+ u16 count = 0;
+ u16 i;
+
+ for (i = 0; i < 202; i++)
+ {
+ switch (caseID)
+ {
+ case FLAG_GET_SEEN:
+ if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN))
+ count++;
+ break;
+ case FLAG_GET_CAUGHT:
+ if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT))
+ count++;
+ break;
+ }
+ }
+ return count;
+}
+
+u16 sub_80C089C(u8 caseID)
+{
+ u16 count = 0;
+ u16 i;
+
+ for (i = 0; i < 151; i++)
+ {
+ switch (caseID)
+ {
+ case FLAG_GET_SEEN:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
+ count++;
+ break;
+ case FLAG_GET_CAUGHT:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
+ count++;
+ break;
+ }
+ }
+ return count;
+}
+
+bool8 sub_80C08E4(void)
+{
+ u16 i;
+
+ for (i = 0; i < 200; i++)
+ {
+ if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_80C0918(void)
+{
+ u16 i;
+
+ for (i = 0; i < 150; i++)
+ {
+ if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+u16 sub_80C0944(void)
+{
+ u16 i;
+
+ for (i = 0; i < 150; i++)
+ {
+ if (GetSetPokedexFlag(i + 1, 1) == 0)
+ return 0;
+ }
+ for (i = 151; i < 248; i++)
+ {
+ if (GetSetPokedexFlag(i + 1, 1) == 0)
+ return 0;
+ }
+ for (i = 251; i < 384; i++)
+ {
+ if (GetSetPokedexFlag(i + 1, 1) == 0)
+ return 0;
+ }
+ return 1;
+}
+
+void sub_80C09B0(u16 a)
+{
+ if (!(a & DISPCNT_BG0_ON))
+ {
+ ClearGpuRegBits(0, DISPCNT_BG0_ON);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ }
+ if (!(a & DISPCNT_BG1_ON))
+ {
+ ClearGpuRegBits(0, DISPCNT_BG1_ON);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ }
+ if (!(a & DISPCNT_BG2_ON))
+ {
+ ClearGpuRegBits(0, DISPCNT_BG2_ON);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ }
+ if (!(a & DISPCNT_BG3_ON))
+ {
+ ClearGpuRegBits(0, DISPCNT_BG3_ON);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ }
+ if (!(a & DISPCNT_OBJ_ON))
+ {
+ ClearGpuRegBits(0, DISPCNT_OBJ_ON);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ }
+}
+
+void sub_80C0A88(u8 windowId, const u8 *str, u8 left, u8 top)
+{
+ u8 color[3];
+ color[0] = 0;
+ color[1] = 15;
+ color[2] = 3;
+
+ AddTextPrinterParameterized2(windowId, 1, left, top, 0, 0, color, -1, str);
+}
+
+void sub_80C0AC4(u8 windowId, u16 order, u8 left, u8 top)
+{
+ u8 str[4];
+
+ str[0] = CHAR_0 + order / 100;
+ str[1] = CHAR_0 + (order % 100) / 10;
+ str[2] = CHAR_0 + (order % 100) % 10;
+ str[3] = EOS;
+ sub_80C0A88(windowId, str, left, top);
+}
+
+u8 sub_80C0B44(u8 windowId, u16 num, u8 left, u8 top)
+{
+ u8 str[11];
+ u8 i;
+
+ for (i = 0; i < 11; i++)
+ str[i] = EOS;
+ num = NationalPokedexNumToSpecies(num);
+ switch (num)
+ {
+ default:
+ for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++)
+ str[i] = gSpeciesNames[num][i];
+ break;
+ case 0:
+ for (i = 0; i < 5; i++)
+ str[i] = CHAR_HYPHEN;
+ break;
+ }
+ sub_80C0A88(windowId, str, left, top);
+ return i;
+}
+
+void sub_80C0BF0(u8 windowId, const u8* str, u8 left, u8 top)
+{
+ u8 str2[11];
+ u8 i;
+ u8 count;
+
+ for (i = 0; i < 11; i++)
+ str2[i] = CHAR_SPACE;
+ for (count = 0; str[count] != CHAR_SPACE && count < 11; count++)
+ ;
+ for (i = 0; i < count; i++)
+ str2[11 - count + i] = str[i];
+ str2[11] = EOS;
+ sub_80C0A88(windowId, str2, left, top);
+}
+
+void sub_80C0C6C(u8 windowId, u16 b, u8 left, u8 top)
+{
+ u8 str[6];
+ bool8 outputted = FALSE;
+ u8 result;
+
+ result = b / 1000;
+ if (result == 0)
+ {
+ str[0] = 0x77;
+ outputted = FALSE;
+ }
+ else
+ {
+ str[0] = CHAR_0 + result;
+ outputted = TRUE;
+ }
+
+ result = (b % 1000) / 100;
+ if (result == 0 && !outputted)
+ {
+ str[1] = 0x77;
+ outputted = FALSE;
+ }
+ else
+ {
+ str[1] = CHAR_0 + result;
+ outputted = TRUE;
+ }
+
+ str[2] = CHAR_0 + ((b % 1000) % 100) / 10;
+ str[3] = CHAR_PERIOD;
+ str[4] = CHAR_0 + ((b % 1000) % 100) % 10;
+ str[5] = EOS;
+ sub_80C0A88(windowId, str, left, top);
+}
+
+void sub_80C0D30(u8 windowId, u16 a1)
+{
+ u8 image[32 * 4];
+ const u8 * r12 = gMonFootprintTable[NationalPokedexNumToSpecies(a1)];
+ u16 r5 = 0;
+ u16 i;
+ u16 j;
+
+ for (i = 0; i < 32; i++)
+ {
+ u8 r3 = r12[i];
+ for (j = 0; j < 4; j++)
+ {
+ u8 value = ((r3 >> (2 * j)) & 1 ? 2 : 0);
+ if ((2 << (2 * j)) & r3)
+ value |= 0x20;
+ image[r5] = value;
+ r5++;
+ }
+ }
+ CopyToWindowPixelBuffer(windowId, image, sizeof(image), 0);
+}
+
+void sub_80C0DC0(u16 a, u16 b)
+{
+ *(u16 *)(VRAM + a * 0x800 + 0x232) = 0xF000 + b + 0;
+ *(u16 *)(VRAM + a * 0x800 + 0x234) = 0xF000 + b + 1;
+ *(u16 *)(VRAM + a * 0x800 + 0x272) = 0xF000 + b + 2;
+ *(u16 *)(VRAM + a * 0x800 + 0x274) = 0xF000 + b + 3;
+}
+
+u16 sub_80C0E0C(u8 a, u16 b, u16 c, u16 d)
+{
+ switch (a)
+ {
+ case 1:
+ if (b > c)
+ b--;
+ break;
+ case 0:
+ if (b < d)
+ b++;
+ break;
+ case 3:
+ if (b > c)
+ b--;
+ else
+ b = d;
+ break;
+ case 2:
+ if (b < d)
+ b++;
+ else
+ b = c;
+ break;
+ }
+ return b;
+}
+
+u32 sub_80C0E68(u16 a)
+{
+ if (a == SPECIES_UNOWN || a == SPECIES_SPINDA)
+ {
+ if (a == SPECIES_UNOWN)
+ return gSaveBlock2Ptr->pokedex.unownPersonality;
+ else
+ return gSaveBlock2Ptr->pokedex.spindaPersonality;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+u16 sub_80C0E9C(u16 num, s16 x, s16 y, u16 paletteSlot)
+{
+ num = NationalPokedexNumToSpecies(num);
+ return sub_818D7D8(num, 8, sub_80C0E68(num), TRUE, x, y, paletteSlot, 0xFFFF);
+}
+
+u16 sub_80C0EF8(u16 species, s16 x, s16 y, s8 paletteSlot)
+{
+ return sub_818D8AC(species, TRUE, x, y, paletteSlot, 0xFFFF);
+}
+
+int sub_80C0F30(u8 dexMode, u8 sortMode, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2)
+{
+ u16 species;
+ u16 i;
+ u16 resultsCount;
+ u8 types[2];
+
+ sub_80BC8D4(dexMode, sortMode);
+
+ for (i = 0, resultsCount = 0; i < NATIONAL_DEX_COUNT; i++)
+ {
+ if (gUnknown_02039B4C->unk0[i].seen)
+ {
+ gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i];
+ resultsCount++;
+ }
+ }
+ gUnknown_02039B4C->pokemonListCount = resultsCount;
+
+ // Search by name
+ if (abcGroup != 0xFF)
+ {
+ for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++)
+ {
+ u8 r3;
+
+ species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum);
+ r3 = gSpeciesNames[species][0];
+ if ((r3 >= gUnknown_0856ED08[abcGroup][0] && r3 < gUnknown_0856ED08[abcGroup][0] + gUnknown_0856ED08[abcGroup][1])
+ || (r3 >= gUnknown_0856ED08[abcGroup][2] && r3 < gUnknown_0856ED08[abcGroup][2] + gUnknown_0856ED08[abcGroup][3]))
+ {
+ gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i];
+ resultsCount++;
+ }
+ }
+ gUnknown_02039B4C->pokemonListCount = resultsCount;
+ }
+
+ // Search by body color
+ if (bodyColor != 0xFF)
+ {
+ for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++)
+ {
+ species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum);
+
+ if (bodyColor == gBaseStats[species].bodyColor)
+ {
+ gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i];
+ resultsCount++;
+ }
+ }
+ gUnknown_02039B4C->pokemonListCount = resultsCount;
+ }
+
+ // Search by type
+ if (type1 != 0xFF || type2 != 0xFF)
+ {
+ if (type1 == 0xFF)
+ {
+ type1 = type2;
+ type2 = 0xFF;
+ }
+
+ if (type2 == 0xFF)
+ {
+ for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++)
+ {
+ if (gUnknown_02039B4C->unk0[i].owned)
+ {
+ species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum);
+
+ types[0] = gBaseStats[species].type1;
+ types[1] = gBaseStats[species].type2;
+ if (types[0] == type1 || types[1] == type1)
+ {
+ gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i];
+ resultsCount++;
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++)
+ {
+ if (gUnknown_02039B4C->unk0[i].owned)
+ {
+ species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum);
+
+ types[0] = gBaseStats[species].type1;
+ types[1] = gBaseStats[species].type2;
+ if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1))
+ {
+ gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i];
+ resultsCount++;
+ }
+ }
+ }
+ }
+ gUnknown_02039B4C->pokemonListCount = resultsCount;
+ }
+
+ if (gUnknown_02039B4C->pokemonListCount != 0)
+ {
+ for (i = gUnknown_02039B4C->pokemonListCount; i < NATIONAL_DEX_COUNT; i++)
+ {
+ gUnknown_02039B4C->unk0[i].dexNum = 0xFFFF;
+ gUnknown_02039B4C->unk0[i].seen = FALSE;
+ gUnknown_02039B4C->unk0[i].owned = FALSE;
+
+ }
+ }
+
+ return resultsCount;
+}
+
+u8 sub_80C1258(void)
+{
+ return CreateTask(sub_80C12E0, 0);
+}
+
+void sub_80C1270(const u8 *str, u32 left, u32 top)
+{
+ u8 color[3];
+
+ color[0] = 0;
+ color[1] = 15;
+ color[2] = 2;
+ AddTextPrinterParameterized2(0, 1, left, top, 0, 0, color, -1, str);
+}
+
+void sub_80C12B0(u32 x, u32 y, u32 width, u32 height)
+{
+ FillWindowPixelRect(0, 0, x, y, width, height);
+}
+
+void sub_80C12E0(u8 taskId)
+{
+ u16 i;
+
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02039B4C->unk64A = 2;
+ sub_80C09B0(0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_0856EFF8, 4);
+ SetBgTilemapBuffer(3, AllocZeroed(0x800));
+ SetBgTilemapBuffer(2, AllocZeroed(0x800));
+ SetBgTilemapBuffer(1, AllocZeroed(0x800));
+ SetBgTilemapBuffer(0, AllocZeroed(0x800));
+ InitWindows(gUnknown_0856F008);
+ DeactivateAllTextPrinters();
+ PutWindowTilemap(0);
+ copy_decompressed_tile_data_to_vram_autofree(3, gPokedexSearchMenu_Gfx, 0x2000, 0, 0);
+
+ if (!IsNationalPokedexEnabled())
+ CopyToBgTilemapBuffer(3, gPokedexSearch2_Tilemap, 0, 0);
+ else
+ CopyToBgTilemapBuffer(3, gPokedexSearch1_Tilemap, 0, 0);
+ LoadPalette(gPokedexSearchMenu_Pal + 1, 1, 0x7E);
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ LoadCompressedObjectPic(gSpriteSheets_0855D26C);
+ LoadSpritePalettes(gSpritePalettes_0855D26C);
+ sub_80C2594(taskId);
+ for (i = 0; i < 16; i++)
+ gTasks[taskId].data[i] = 0;
+ sub_80C23B8(taskId);
+ sub_80C2040(0);
+ sub_80C20F8(taskId);
+ CopyWindowToVram(0, 3);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gMain.state++;
+ break;
+ case 3:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ HideBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ gMain.state++;
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].func = sub_80C1570;
+ gMain.state = 0;
+ }
+ break;
+ }
+}
+
+void sub_80C152C(void)
+{
+ void* tilemapBuffer;
+
+ FreeAllWindowBuffers();
+ tilemapBuffer = GetBgTilemapBuffer(0);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+ tilemapBuffer = GetBgTilemapBuffer(1);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+ tilemapBuffer = GetBgTilemapBuffer(2);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+ tilemapBuffer = GetBgTilemapBuffer(3);
+ if (tilemapBuffer)
+ Free(tilemapBuffer);
+}
+
+void sub_80C1570(u8 taskId)
+{
+ sub_80C2040(gTasks[taskId].data[0]);
+ sub_80C20F8(taskId);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ gTasks[taskId].func = sub_80C15B0;
+}
+
+void sub_80C15B0(u8 taskId)
+{
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_PC_OFF);
+ gTasks[taskId].func = sub_80C1D38;
+ return;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ PlaySE(SE_PIN);
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].func = sub_80C16CC;
+ break;
+ case 1:
+ PlaySE(SE_PIN);
+ gTasks[taskId].data[1] = 4;
+ gTasks[taskId].func = sub_80C16CC;
+ break;
+ case 2:
+ PlaySE(SE_PC_OFF);
+ gTasks[taskId].func = sub_80C1D38;
+ break;
+ }
+ return;
+ }
+ if ((gMain.newKeys & DPAD_LEFT) && gTasks[taskId].data[0] > 0)
+ {
+ PlaySE(SE_Z_PAGE);
+ gTasks[taskId].data[0]--;
+ sub_80C2040(gTasks[taskId].data[0]);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ }
+ if ((gMain.newKeys & DPAD_RIGHT) && gTasks[taskId].data[0] < 2)
+ {
+ PlaySE(SE_Z_PAGE);
+ gTasks[taskId].data[0]++;
+ sub_80C2040(gTasks[taskId].data[0]);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ }
+}
+
+void sub_80C16CC(u8 taskId)
+{
+ sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ sub_80C20F8(taskId);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ gTasks[taskId].func = sub_80C170C;
+}
+
+void sub_80C170C(u8 taskId)
+{
+ const u8 (*r6)[4];
+
+ if (gTasks[taskId].data[0] != 0)
+ {
+ if (!IsNationalPokedexEnabled())
+ r6 = gUnknown_0856EDF0;
+ else
+ r6 = gUnknown_0856EDB8;
+ }
+ else
+ {
+ if (!IsNationalPokedexEnabled())
+ r6 = gUnknown_0856EDD4;
+ else
+ r6 = gUnknown_0856ED9C;
+ }
+
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_BOWA);
+ sub_80C23B8(taskId);
+ gTasks[taskId].func = sub_80C1570;
+ return;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (gTasks[taskId].data[1] == 6)
+ {
+ if (gTasks[taskId].data[0] != 0)
+ {
+ gUnknown_02039B52 = 0x40;
+ gUnknown_02039B4C->unk62A = 0x40;
+ gUnknown_02039B50 = 0;
+ gUnknown_02039B4C->unk610 = 0;
+ gSaveBlock2Ptr->pokedex.unknown1 = sub_80C2318(taskId, 5);
+ if (!IsNationalPokedexEnabled())
+ gSaveBlock2Ptr->pokedex.unknown1 = 0;
+ gUnknown_02039B4C->unk614 = gSaveBlock2Ptr->pokedex.unknown1;
+ gSaveBlock2Ptr->pokedex.order = sub_80C2318(taskId, 4);
+ gUnknown_02039B4C->unk618 = gSaveBlock2Ptr->pokedex.order;
+ PlaySE(SE_PC_OFF);
+ gTasks[taskId].func = sub_80C1D38;
+ }
+ else
+ {
+ sub_80C2618(gText_SearchingPleaseWait);
+ gTasks[taskId].func = sub_80C19A4;
+ PlaySE(SE_Z_SEARCH);
+ CopyWindowToVram(0, 2);
+ }
+ }
+ else
+ {
+ PlaySE(SE_PIN);
+ gTasks[taskId].func = sub_80C1B64;
+ }
+ return;
+ }
+
+ if ((gMain.newKeys & DPAD_LEFT) && r6[gTasks[taskId].data[1]][0] != 0xFF)
+ {
+ PlaySE(SE_SELECT);
+ gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][0];
+ sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ }
+ if ((gMain.newKeys & DPAD_RIGHT) && r6[gTasks[taskId].data[1]][1] != 0xFF)
+ {
+ PlaySE(SE_SELECT);
+ gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][1];
+ sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ }
+ if ((gMain.newKeys & DPAD_UP) && r6[gTasks[taskId].data[1]][2] != 0xFF)
+ {
+ PlaySE(SE_SELECT);
+ gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][2];
+ sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ }
+ if ((gMain.newKeys & DPAD_DOWN) && r6[gTasks[taskId].data[1]][3] != 0xFF)
+ {
+ PlaySE(SE_SELECT);
+ gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][3];
+ sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ }
+}
+
+void sub_80C19A4(u8 taskId)
+{
+ u8 r10 = sub_80C2318(taskId, 5);
+ u8 r9 = sub_80C2318(taskId, 4);
+ u8 r8 = sub_80C2318(taskId, 0);
+ u8 r6 = sub_80C2318(taskId, 1);
+ u8 r4 = sub_80C2318(taskId, 2);
+ u8 r0 = sub_80C2318(taskId, 3);
+
+ sub_80C0F30(r10, r9, r8, r6, r4, r0);
+ gTasks[taskId].func = sub_80C1A4C;
+}
+
+void sub_80C1A4C(u8 taskId)
+{
+ if (!IsSEPlaying())
+ {
+ if (gUnknown_02039B4C->pokemonListCount != 0)
+ {
+ PlaySE(SE_SEIKAI);
+ sub_80C2618(gText_SearchCompleted);
+ }
+ else
+ {
+ PlaySE(SE_HAZURE);
+ sub_80C2618(gUnknown_085E8785);
+ }
+ gTasks[taskId].func = sub_80C1AB8;
+ CopyWindowToVram(0, 2);
+ }
+}
+
+void sub_80C1AB8(u8 taskId)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (gUnknown_02039B4C->pokemonListCount != 0)
+ {
+ gUnknown_02039B4C->unk64E = 1;
+ gUnknown_02039B4C->dexMode = sub_80C2318(taskId, 5);
+ gUnknown_02039B4C->dexOrder = sub_80C2318(taskId, 4);
+ gTasks[taskId].func = sub_80C1D38;
+ PlaySE(SE_PC_OFF);
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80C16CC;
+ PlaySE(SE_BOWA);
+ }
+ }
+}
+
+void sub_80C1B64(u8 taskId)
+{
+ u8 r0;
+ u16 *p1;
+ u16 *p2;
+
+ sub_80C21D4(0);
+ r0 = gTasks[taskId].data[1];
+ p1 = &gTasks[taskId].data[gUnknown_0856EFC8[r0].unk4];
+ p2 = &gTasks[taskId].data[gUnknown_0856EFC8[r0].unk5];
+ gTasks[taskId].data[14] = *p1;
+ gTasks[taskId].data[15] = *p2;
+ sub_80C2294(taskId);
+ sub_80C2650(*p1);
+ gTasks[taskId].func = sub_80C1BCC;
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+}
+
+void sub_80C1BCC(u8 taskId)
+{
+ u8 r1;
+ const struct UnknownStruct2 *r8;
+ u16 *p1;
+ u16 *p2;
+ u16 r2;
+ bool8 r3;
+
+ r1 = gTasks[taskId].data[1];
+ r8 = gUnknown_0856EFC8[r1].unk0;
+ p1 = &gTasks[taskId].data[gUnknown_0856EFC8[r1].unk4];
+ p2 = &gTasks[taskId].data[gUnknown_0856EFC8[r1].unk5];
+ r2 = gUnknown_0856EFC8[r1].unk6 - 1;
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_PIN);
+ sub_80C267C();
+ sub_80C21D4(1);
+ gTasks[taskId].func = sub_80C16CC;
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ return;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_BOWA);
+ sub_80C267C();
+ sub_80C21D4(1);
+ *p1 = gTasks[taskId].data[14];
+ *p2 = gTasks[taskId].data[15];
+ gTasks[taskId].func = sub_80C16CC;
+ CopyWindowToVram(0, 2);
+ CopyBgTilemapBufferToVram(3);
+ return;
+ }
+ r3 = FALSE;
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (*p1 != 0)
+ {
+ sub_80C2638(*p1);
+ (*p1)--;
+ sub_80C2650(*p1);
+ r3 = TRUE;
+ }
+ else if (*p2 != 0)
+ {
+ (*p2)--;
+ sub_80C2294(taskId);
+ sub_80C2650(*p1);
+ r3 = TRUE;
+ }
+ if (r3)
+ {
+ PlaySE(SE_SELECT);
+ sub_80C2618(r8[*p1 + *p2].text1);
+ CopyWindowToVram(0, 2);
+ }
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (*p1 < 5 && *p1 < r2)
+ {
+ sub_80C2638(*p1);
+ (*p1)++;
+ sub_80C2650(*p1);
+ r3 = TRUE;
+ }
+ else if (r2 > 5 && *p2 < r2 - 5)
+ {
+ (*p2)++;
+ sub_80C2294(taskId);
+ sub_80C2650(5);
+ r3 = TRUE;
+ }
+ if (r3)
+ {
+ PlaySE(SE_SELECT);
+ sub_80C2618(r8[*p1 + *p2].text1);
+ CopyWindowToVram(0, 2);
+ }
+ return;
+ }
+}
+
+void sub_80C1D38(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = sub_80C1D70;
+}
+
+void sub_80C1D70(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_80C152C();
+ DestroyTask(taskId);
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80C1D98(u8 a, u8 b, u8 c, u8 d)
+{
+ u16 i;
+ u16* ptr = GetBgTilemapBuffer(3);
+
+ for (i = 0; i < d; i++)
+ {
+ ptr[b + i + (c << 6)] %= 0x1000;
+ ptr[b + i + (c << 6)] |= a * 4096;
+
+ ptr[b + i + (c << 6) + 32] %= 0x1000;
+ ptr[b + i + (c << 6) + 32] |= a * 4096;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80C1D98(u8 a, u8 b, u8 c, u8 d)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ adds r4, r3, 0\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r8, r1\n\
+ lsls r2, 24\n\
+ lsrs r5, r2, 24\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ movs r0, 0x3\n\
+ bl GetBgTilemapBuffer\n\
+ adds r2, r0, 0\n\
+ movs r3, 0\n\
+ cmp r3, r4\n\
+ bcs _080C1DEC\n\
+ lsls r0, r5, 6\n\
+ adds r7, r0, r2\n\
+ ldr r5, =0x00000fff\n\
+ lsls r2, r6, 12\n\
+_080C1DC8:\n\
+ mov r0, r8\n\
+ adds r1, r0, r3\n\
+ lsls r1, 1\n\
+ adds r1, r7\n\
+ ldrh r0, [r1]\n\
+ ands r0, r5\n\
+ orrs r0, r2\n\
+ strh r0, [r1]\n\
+ adds r1, 0x40\n\
+ ldrh r0, [r1]\n\
+ ands r0, r5\n\
+ orrs r0, r2\n\
+ strh r0, [r1]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, r4\n\
+ bcc _080C1DC8\n\
+_080C1DEC:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_80C1DFC(u8 a, u8 b, u8 c)
+{
+ u8 r5 = (b & 1) | ((c & 1) << 1);
+
+ switch (a)
+ {
+ case 0:
+ case 1:
+ case 2:
+ sub_80C1D98(r5, gUnknown_0856ED30[a].unk4, gUnknown_0856ED30[a].unk5, gUnknown_0856ED30[a].unk6);
+ break;
+ case 3:
+ case 4:
+ case 7:
+ case 8:
+ sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk4, gUnknown_0856ED48[a - 3].unk5, gUnknown_0856ED48[a - 3].unk6);
+ // fall through
+ case 5:
+ case 6:
+ sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk7, gUnknown_0856ED48[a - 3].unk8, gUnknown_0856ED48[a - 3].unk9);
+ break;
+ case 10:
+ sub_80C1D98(r5, gUnknown_0856ED48[2].unk4, gUnknown_0856ED48[2].unk5, gUnknown_0856ED48[2].unk6);
+ break;
+ case 9:
+ if (!IsNationalPokedexEnabled())
+ sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk4, gUnknown_0856ED48[a - 3].unk5 - 2, gUnknown_0856ED48[a - 3].unk6);
+ else
+ sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk4, gUnknown_0856ED48[a - 3].unk5, gUnknown_0856ED48[a - 3].unk6);
+ break;
+ }
+}
+
+void sub_80C1EF4(u8 a)
+{
+ switch (a)
+ {
+ case 0:
+ sub_80C1DFC(0, 0, 0);
+ sub_80C1DFC(1, 1, 0);
+ sub_80C1DFC(2, 1, 0);
+ sub_80C1DFC(3, 1, 0);
+ sub_80C1DFC(4, 1, 0);
+ sub_80C1DFC(10, 1, 0);
+ sub_80C1DFC(5, 1, 0);
+ sub_80C1DFC(6, 1, 0);
+ sub_80C1DFC(7, 1, 0);
+ sub_80C1DFC(8, 1, 0);
+ sub_80C1DFC(9, 1, 0);
+ break;
+ case 1:
+ sub_80C1DFC(0, 1, 0);
+ sub_80C1DFC(1, 0, 0);
+ sub_80C1DFC(2, 1, 0);
+ sub_80C1DFC(3, 1, 1);
+ sub_80C1DFC(4, 1, 1);
+ sub_80C1DFC(10, 1, 1);
+ sub_80C1DFC(5, 1, 1);
+ sub_80C1DFC(6, 1, 1);
+ sub_80C1DFC(7, 1, 0);
+ sub_80C1DFC(8, 1, 0);
+ sub_80C1DFC(9, 1, 0);
+ break;
+ case 2:
+ sub_80C1DFC(0, 1, 0);
+ sub_80C1DFC(1, 1, 0);
+ sub_80C1DFC(2, 0, 0);
+ sub_80C1DFC(3, 1, 1);
+ sub_80C1DFC(4, 1, 1);
+ sub_80C1DFC(10, 1, 1);
+ sub_80C1DFC(5, 1, 1);
+ sub_80C1DFC(6, 1, 1);
+ sub_80C1DFC(7, 1, 1);
+ sub_80C1DFC(8, 1, 1);
+ sub_80C1DFC(9, 1, 1);
+ break;
+ }
+}
+
+void sub_80C2040(u8 a)
+{
+ sub_80C1EF4(a);
+ sub_80C2618(gUnknown_0856ED30[a].text);
+}
+
+void sub_80C2064(u8 a, u8 b)
+{
+ sub_80C1EF4(a);
+ switch (b)
+ {
+ case 0:
+ sub_80C1DFC(3, 0, 0);
+ break;
+ case 1:
+ sub_80C1DFC(4, 0, 0);
+ break;
+ case 2:
+ sub_80C1DFC(10, 0, 0);
+ sub_80C1DFC(5, 0, 0);
+ break;
+ case 3:
+ sub_80C1DFC(10, 0, 0);
+ sub_80C1DFC(6, 0, 0);
+ break;
+ case 4:
+ sub_80C1DFC(7, 0, 0);
+ break;
+ case 5:
+ sub_80C1DFC(8, 0, 0);
+ break;
+ case 6:
+ sub_80C1DFC(9, 0, 0);
+ break;
+ }
+ sub_80C2618(gUnknown_0856ED48[b].text);
+}
+
+void sub_80C20F8(u8 taskId)
+{
+ u16 var;
+
+ sub_80C12B0(0x28, 0x10, 0x60, 0x50);
+
+ var = gTasks[taskId].data[6] + gTasks[taskId].data[7];
+ sub_80C1270(gUnknown_0856EE5C[var].text2, 0x2D, 0x11);
+
+ var = gTasks[taskId].data[8] + gTasks[taskId].data[9];
+ sub_80C1270(gUnknown_0856EEB4[var].text2, 0x2D, 0x21);
+
+ var = gTasks[taskId].data[10] + gTasks[taskId].data[11];
+ sub_80C1270(gUnknown_0856EF14[var].text2, 0x2D, 0x31);
+
+ var = gTasks[taskId].data[12] + gTasks[taskId].data[13];
+ sub_80C1270(gUnknown_0856EF14[var].text2, 0x5D, 0x31);
+
+ var = gTasks[taskId].data[4] + gTasks[taskId].data[5];
+ sub_80C1270(gUnknown_0856EE24[var].text2, 0x2D, 0x41);
+
+ if (IsNationalPokedexEnabled())
+ {
+ var = gTasks[taskId].data[2] + gTasks[taskId].data[3];
+ sub_80C1270(gUnknown_0856EE0C[var].text2, 0x2D, 0x51);
+ }
+}
+
+void sub_80C21D4(u8 a)
+{
+ u16 i;
+ u16 j;
+ u16* ptr = GetBgTilemapBuffer(3);
+
+ if (a == 0)
+ {
+ *(ptr + 0x11) = 0xC0B;
+ for (i = 0x12; i < 0x1F; i++)
+ *(ptr + i) = 0x80D;
+ for (j = 1; j < 13; j++)
+ {
+ *(ptr + 0x11 + j * 32) = 0x40A;
+ for (i = 0x12; i < 0x1F; i++)
+ *(ptr + j * 32 + i) = 2;
+ }
+ *(ptr + 0x1B1) = 0x40B;
+ for (i = 0x12; i < 0x1F; i++)
+ *(ptr + 0x1A0 + i) = 0xD;
+ }
+ else
+ {
+ for (j = 0; j < 14; j++)
+ {
+ for (i = 0x11; i < 0x1E; i++)
+ {
+ *(ptr + j * 32 + i) = 0x4F;
+ }
+ }
+ }
+}
+
+void sub_80C2294(u8 taskId)
+{
+ const struct UnknownStruct2 *r6 = gUnknown_0856EFC8[gTasks[taskId].data[1]].unk0;
+ const u16 *r8 = &gTasks[taskId].data[gUnknown_0856EFC8[gTasks[taskId].data[1]].unk4];
+ const u16 *r7 = &gTasks[taskId].data[gUnknown_0856EFC8[gTasks[taskId].data[1]].unk5];
+ u16 i;
+ u16 j;
+
+ sub_80C267C();
+ for (i = 0, j = *r7; i < 6 && r6[j].text2 != NULL; i++, j++)
+ sub_80C2668(i, r6[j].text2);
+ sub_80C2618(r6[*r8 + *r7].text1);
+}
+
+u8 sub_80C2318(u8 taskId, u8 b)
+{
+ const u16 *ptr1 = &gTasks[taskId].data[gUnknown_0856EFC8[b].unk4];
+ const u16 *ptr2 = &gTasks[taskId].data[gUnknown_0856EFC8[b].unk5];
+ u16 r2 = *ptr1 + *ptr2;
+
+ switch (b)
+ {
+ default:
+ return 0;
+ case 5:
+ return gUnknown_0856EFAC[r2];
+ case 4:
+ return gUnknown_0856EFAE[r2];
+ case 0:
+ if (r2 == 0)
+ return 0xFF;
+ else
+ return r2;
+ case 1:
+ if (r2 == 0)
+ return 0xFF;
+ else
+ return r2 - 1;
+ case 2:
+ case 3:
+ return gUnknown_0856EFB4[r2];
+ }
+}
+
+void sub_80C23B8(u8 taskId)
+{
+ u16 r3;
+
+ switch (gUnknown_02039B4C->unk614)
+ {
+ default:
+ case 0:
+ r3 = 0;
+ break;
+ case 1:
+ r3 = 1;
+ break;
+ }
+ gTasks[taskId].data[2] = r3;
+
+ switch (gUnknown_02039B4C->unk618)
+ {
+ default:
+ case 0:
+ r3 = 0;
+ break;
+ case 1:
+ r3 = 1;
+ break;
+ case 2:
+ r3 = 2;
+ break;
+ case 3:
+ r3 = 3;
+ break;
+ case 4:
+ r3 = 4;
+ break;
+ case 5:
+ r3 = 5;
+ break;
+ }
+ gTasks[taskId].data[4] = r3;
+}
+
+bool8 sub_80C244C(u8 taskId)
+{
+ u8 val1 = gTasks[taskId].data[1];
+ const u16 *ptr = &gTasks[taskId].data[gUnknown_0856EFC8[val1].unk5];
+ u16 val2 = gUnknown_0856EFC8[val1].unk6 - 1;
+
+ if (val2 > 5 && *ptr != 0)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 sub_80C2494(u8 taskId)
+{
+ u8 val1 = gTasks[taskId].data[1];
+ const u16 *ptr = &gTasks[taskId].data[gUnknown_0856EFC8[val1].unk5];
+ u16 val2 = gUnknown_0856EFC8[val1].unk6 - 1;
+
+ if (val2 > 5 && *ptr < val2 - 5)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_80C24E0(struct Sprite *sprite)
+{
+ if (gTasks[sprite->data[0]].func == sub_80C1BCC)
+ {
+ u8 val;
+
+ if (sprite->data[1] != 0)
+ {
+ if (sub_80C2494(sprite->data[0]))
+ sprite->invisible = TRUE;
+ else
+ sprite->invisible = FALSE;
+ }
+ else
+ {
+ if (sub_80C244C(sprite->data[0]))
+ sprite->invisible = TRUE;
+ else
+ sprite->invisible = FALSE;
+ }
+ val = sprite->data[2] + sprite->data[1] * 128;
+ sprite->pos2.y = gSineTable[val] / 128;
+ sprite->data[2] += 8;
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ }
+}
+
+void sub_80C2594(u8 taskId)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 4, 0);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].callback = sub_80C24E0;
+
+ spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 108, 0);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].vFlip = TRUE;
+ gSprites[spriteId].callback = sub_80C24E0;
+}
+
+void sub_80C2618(const u8* str)
+{
+ sub_80C12B0(8, 0x78, 0xE0, 0x20);
+ sub_80C1270(str, 8, 0x79);
+}
+
+void sub_80C2638(u32 y)
+{
+ sub_80C12B0(0x90, y * 16 + 8, 8, 16);
+}
+
+void sub_80C2650(u32 left)
+{
+ sub_80C1270(gText_SelectorArrow, 0x90, left * 16 + 9);
+}
+
+void sub_80C2668(u32 left, const u8* str)
+{
+ sub_80C1270(str, 0x98, left * 16 + 9);
+}
+
+void sub_80C267C(void)
+{
+ sub_80C12B0(0x90, 8, 0x60, 0x60);
+}
diff --git a/src/pokemon.c b/src/pokemon.c
new file mode 100644
index 000000000..cd7e45758
--- /dev/null
+++ b/src/pokemon.c
@@ -0,0 +1,6099 @@
+#include "global.h"
+#include "pokemon.h"
+#include "battle.h"
+#include "battle_setup.h"
+#include "battle_message.h"
+#include "random.h"
+#include "main.h"
+#include "constants/species.h"
+#include "constants/abilities.h"
+#include "constants/items.h"
+#include "constants/trainers.h"
+#include "constants/moves.h"
+#include "constants/hold_effects.h"
+#include "constants/battle_move_effects.h"
+#include "constants/songs.h"
+#include "string_util.h"
+#include "text.h"
+#include "link.h"
+#include "event_data.h"
+#include "item.h"
+#include "battle_controllers.h"
+#include "battle_message.h"
+#include "evolution_scene.h"
+#include "pokemon_animation.h"
+#include "pokedex.h"
+#include "pokeblock.h"
+#include "sound.h"
+#include "task.h"
+#include "rtc.h"
+#include "m4a.h"
+#include "malloc.h"
+#include "util.h"
+#include "strings.h"
+#include "pokenav.h"
+#include "pokemon_storage_system.h"
+#include "recorded_battle.h"
+
+struct SpeciesItem
+{
+ u16 species;
+ u16 item;
+};
+
+// Extracts the upper 16 bits of a 32-bit number
+#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
+
+// Extracts the lower 16 bits of a 32-bit number
+#define LOHALF(n) ((n) & 0xFFFF)
+
+extern const struct OamData gUnknown_0831ACB0;
+extern const struct OamData gUnknown_0831ACA8;
+extern const struct SpriteFrameImage gUnknown_082FF3A8[];
+extern const struct SpriteFrameImage gUnknown_082FF3C8[];
+extern const struct SpriteFrameImage gUnknown_082FF3E8[];
+extern const struct SpriteFrameImage gUnknown_082FF408[];
+extern const struct SpriteFrameImage gUnknown_082FF428[];
+extern const struct SpriteFrameImage gUnknown_082FF448[];
+extern const struct SpriteFrameImage gUnknown_082FF468[];
+extern const struct SpriteFrameImage gUnknown_082FF490[];
+extern const struct SpriteFrameImage gUnknown_082FF4B8[];
+extern const struct SpriteFrameImage gUnknown_082FF4D8[];
+extern const struct SpriteFrameImage gUnknown_082FF4F8[];
+extern const struct SpriteFrameImage gUnknown_082FF518[];
+extern const union AffineAnimCmd *const gUnknown_082FF618[];
+extern const union AffineAnimCmd *const gUnknown_082FF694[];
+extern const union AnimCmd *gPlayerMonSpriteAnimsTable[];
+extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[];
+extern const union AnimCmd *const *const gUnknown_08305D0C[];
+extern const union AnimCmd *const *const gUnknown_0830536C[];
+extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
+extern const struct UnknownPokemonStruct3 gUnknown_08610970[];
+extern const struct CompressedSpritePalette gMonPaletteTable[];
+extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
+extern const u8 gTrainerClassNames[][13];
+
+extern u8 pokemon_order_func(u8);
+extern u16 get_unknown_box_id(void);
+extern u8 StorageGetCurrentBox(void);
+extern void set_unknown_box_id(u8);
+extern void sub_803FA70(u8 battlerId);
+extern u8 sav1_map_get_name(void);
+extern const u8 *sub_81A1650(u8, u8 language);
+extern u8 BattleFrontierGetOpponentLvl(u8);
+extern u16 FacilityClassToPicIndex(u16);
+extern bool8 InBattlePyramid(void);
+extern bool8 InBattlePike(void);
+extern bool8 sub_806F104(void);
+extern u8 GetTrainerEncounterMusicIdInBattlePyramind(u16 trainerOpponentId);
+extern u8 sub_81D63C8(u16 trainerOpponentId);
+extern u8 GetFrontierOpponentClass(u16 trainerId);
+extern void GetFrontierTrainerName(u8* dest, u16 trainerId);
+extern void sub_81C488C(u8);
+
+// this file's functions
+static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);
+static void EncryptBoxMon(struct BoxPokemon *boxMon);
+static void DecryptBoxMon(struct BoxPokemon *boxMon);
+static void sub_806E6CC(u8 taskId);
+static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId);
+
+// EWRAM vars
+EWRAM_DATA static u8 sLearningMoveTableID = 0;
+EWRAM_DATA u8 gPlayerPartyCount = 0;
+EWRAM_DATA u8 gEnemyPartyCount = 0;
+EWRAM_DATA struct Pokemon gPlayerParty[PARTY_SIZE] = {0};
+EWRAM_DATA struct Pokemon gEnemyParty[PARTY_SIZE] = {0};
+EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0};
+EWRAM_DATA struct Unknown_806F160_Struct *gUnknown_020249B4[2] = {NULL};
+
+// const rom data
+#include "data/battle_moves.h"
+static const u8 sUnreferencedData[] = {0x34, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00};
+
+const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151};
+const u16 gSpeciesToNationalPokedexNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358};
+const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411};
+
+const struct SpindaSpot gSpindaSpotGraphics[] =
+{
+ {16, 7, INCBIN_U16("graphics/spinda_spots/spot_0.bin")},
+ {40, 8, INCBIN_U16("graphics/spinda_spots/spot_1.bin")},
+ {22, 25, INCBIN_U16("graphics/spinda_spots/spot_2.bin")},
+ {34, 26, INCBIN_U16("graphics/spinda_spots/spot_3.bin")}
+};
+
+#include "data/pokemon/item_effects.h"
+
+const s8 gNatureStatTable[][5] =
+{
+ // Atk Def Spd Sp.Atk Sp.Def
+ { 0, 0, 0, 0, 0}, // Hardy
+ { +1, -1, 0, 0, 0}, // Lonely
+ { +1, 0, -1, 0, 0}, // Brave
+ { +1, 0, 0, -1, 0}, // Adamant
+ { +1, 0, 0, 0, -1}, // Naughty
+ { -1, +1, 0, 0, 0}, // Bold
+ { 0, 0, 0, 0, 0}, // Docile
+ { 0, +1, -1, 0, 0}, // Relaxed
+ { 0, +1, 0, -1, 0}, // Impish
+ { 0, +1, 0, 0, -1}, // Lax
+ { -1, 0, +1, 0, 0}, // Timid
+ { 0, -1, +1, 0, 0}, // Hasty
+ { 0, 0, 0, 0, 0}, // Serious
+ { 0, 0, +1, -1, 0}, // Jolly
+ { 0, 0, +1, 0, -1}, // Naive
+ { -1, 0, 0, +1, 0}, // Modest
+ { 0, -1, 0, +1, 0}, // Mild
+ { 0, 0, -1, +1, 0}, // Quiet
+ { 0, 0, 0, 0, 0}, // Bashful
+ { 0, 0, 0, +1, -1}, // Rash
+ { -1, 0, 0, 0, +1}, // Calm
+ { 0, -1, 0, 0, +1}, // Gentle
+ { 0, 0, -1, 0, +1}, // Sassy
+ { 0, 0, 0, -1, +1}, // Careful
+ { 0, 0, 0, 0, 0}, // Quirky
+};
+
+#include "data/pokemon/tmhm_learnsets.h"
+#include "data/pokemon/trainer_class_lookups.h"
+#include "data/pokemon/cry_ids.h"
+#include "data/pokemon/experience_tables.h"
+#include "data/pokemon/base_stats.h"
+#include "data/pokemon/level_up_learnsets.h"
+#include "data/pokemon/evolution.h"
+#include "data/pokemon/level_up_learnset_pointers.h"
+
+static const u8 sMonFrontAnimIdsTable[] =
+{
+ 0x06, // SPECIES_BULBASAUR
+ 0x17, // SPECIES_IVYSAUR
+ 0x2f, // SPECIES_VENUSAUR
+ 0x52, // SPECIES_CHARMANDER
+ 0x25, // SPECIES_CHARMELEON
+ 0x10, // SPECIES_CHARIZARD
+ 0x0b, // SPECIES_SQUIRTLE
+ 0x13, // SPECIES_WARTORTLE
+ 0x19, // SPECIES_BLASTOISE
+ 0x0b, // SPECIES_CATERPIE
+ 0x0b, // SPECIES_METAPOD
+ 0x1d, // SPECIES_BUTTERFREE
+ 0x46, // SPECIES_WEEDLE
+ 0x20, // SPECIES_KAKUNA
+ 0x02, // SPECIES_BEEDRILL
+ 0x47, // SPECIES_PIDGEY
+ 0x17, // SPECIES_PIDGEOTTO
+ 0x29, // SPECIES_PIDGEOT
+ 0x43, // SPECIES_RATTATA
+ 0x2b, // SPECIES_RATICATE
+ 0x18, // SPECIES_SPEAROW
+ 0x2b, // SPECIES_FEAROW
+ 0x16, // SPECIES_EKANS
+ 0x17, // SPECIES_ARBOK
+ 0x2c, // SPECIES_PIKACHU
+ 0x17, // SPECIES_RAICHU
+ 0x2d, // SPECIES_SANDSHREW
+ 0x17, // SPECIES_SANDSLASH
+ 0x00, // SPECIES_NIDORAN_F
+ 0x17, // SPECIES_NIDORINA
+ 0x0f, // SPECIES_NIDOQUEEN
+ 0x09, // SPECIES_NIDORAN_M
+ 0x13, // SPECIES_NIDORINO
+ 0x0f, // SPECIES_NIDOKING
+ 0x00, // SPECIES_CLEFAIRY
+ 0x4a, // SPECIES_CLEFABLE
+ 0x17, // SPECIES_VULPIX
+ 0x10, // SPECIES_NINETALES
+ 0x48, // SPECIES_JIGGLYPUFF
+ 0x31, // SPECIES_WIGGLYTUFF
+ 0x00, // SPECIES_ZUBAT
+ 0x1d, // SPECIES_GOLBAT
+ 0x00, // SPECIES_ODDISH
+ 0x45, // SPECIES_GLOOM
+ 0x49, // SPECIES_VILEPLUME
+ 0x46, // SPECIES_PARAS
+ 0x0f, // SPECIES_PARASECT
+ 0x06, // SPECIES_VENONAT
+ 0x4b, // SPECIES_VENOMOTH
+ 0x10, // SPECIES_DIGLETT
+ 0x4c, // SPECIES_DUGTRIO
+ 0x52, // SPECIES_MEOWTH
+ 0x17, // SPECIES_PERSIAN
+ 0x06, // SPECIES_PSYDUCK
+ 0x4c, // SPECIES_GOLDUCK
+ 0x32, // SPECIES_MANKEY
+ 0x48, // SPECIES_PRIMEAPE
+ 0x25, // SPECIES_GROWLITHE
+ 0x02, // SPECIES_ARCANINE
+ 0x00, // SPECIES_POLIWAG
+ 0x32, // SPECIES_POLIWHIRL
+ 0x19, // SPECIES_POLIWRATH
+ 0x31, // SPECIES_ABRA
+ 0x09, // SPECIES_KADABRA
+ 0x17, // SPECIES_ALAKAZAM
+ 0x00, // SPECIES_MACHOP
+ 0x10, // SPECIES_MACHOKE
+ 0x31, // SPECIES_MACHAMP
+ 0x17, // SPECIES_BELLSPROUT
+ 0x0d, // SPECIES_WEEPINBELL
+ 0x32, // SPECIES_VICTREEBEL
+ 0x00, // SPECIES_TENTACOOL
+ 0x00, // SPECIES_TENTACRUEL
+ 0x48, // SPECIES_GEODUDE
+ 0x48, // SPECIES_GRAVELER
+ 0x2f, // SPECIES_GOLEM
+ 0x20, // SPECIES_PONYTA
+ 0x11, // SPECIES_RAPIDASH
+ 0x45, // SPECIES_SLOWPOKE
+ 0x0b, // SPECIES_SLOWBRO
+ 0x54, // SPECIES_MAGNEMITE
+ 0x2c, // SPECIES_MAGNETON
+ 0x48, // SPECIES_FARFETCHD
+ 0x4c, // SPECIES_DODUO
+ 0x41, // SPECIES_DODRIO
+ 0x0b, // SPECIES_SEEL
+ 0x45, // SPECIES_DEWGONG
+ 0x46, // SPECIES_GRIMER
+ 0x30, // SPECIES_MUK
+ 0x12, // SPECIES_SHELLDER
+ 0x1d, // SPECIES_CLOYSTER
+ 0x15, // SPECIES_GASTLY
+ 0x35, // SPECIES_HAUNTER
+ 0x3a, // SPECIES_GENGAR
+ 0x43, // SPECIES_ONIX
+ 0x4f, // SPECIES_DROWZEE
+ 0x09, // SPECIES_HYPNO
+ 0x03, // SPECIES_KRABBY
+ 0x4b, // SPECIES_KINGLER
+ 0x00, // SPECIES_VOLTORB
+ 0x00, // SPECIES_ELECTRODE
+ 0x46, // SPECIES_EXEGGCUTE
+ 0x32, // SPECIES_EXEGGUTOR
+ 0x48, // SPECIES_CUBONE
+ 0x05, // SPECIES_MAROWAK
+ 0x16, // SPECIES_HITMONLEE
+ 0x09, // SPECIES_HITMONCHAN
+ 0x45, // SPECIES_LICKITUNG
+ 0x13, // SPECIES_KOFFING
+ 0x04, // SPECIES_WEEZING
+ 0x10, // SPECIES_RHYHORN
+ 0x13, // SPECIES_RHYDON
+ 0x45, // SPECIES_CHANSEY
+ 0x48, // SPECIES_TANGELA
+ 0x17, // SPECIES_KANGASKHAN
+ 0x12, // SPECIES_HORSEA
+ 0x04, // SPECIES_SEADRA
+ 0x0d, // SPECIES_GOLDEEN
+ 0x1c, // SPECIES_SEAKING
+ 0x4e, // SPECIES_STARYU
+ 0x12, // SPECIES_STARMIE
+ 0x46, // SPECIES_MR_MIME
+ 0x02, // SPECIES_SCYTHER
+ 0x17, // SPECIES_JYNX
+ 0x2c, // SPECIES_ELECTABUZZ
+ 0x0f, // SPECIES_MAGMAR
+ 0x09, // SPECIES_PINSIR
+ 0x19, // SPECIES_TAUROS
+ 0x05, // SPECIES_MAGIKARP
+ 0x48, // SPECIES_GYARADOS
+ 0x17, // SPECIES_LAPRAS
+ 0x01, // SPECIES_DITTO
+ 0x17, // SPECIES_EEVEE
+ 0x17, // SPECIES_VAPOREON
+ 0x00, // SPECIES_JOLTEON
+ 0x17, // SPECIES_FLAREON
+ 0x52, // SPECIES_PORYGON
+ 0x51, // SPECIES_OMANYTE
+ 0x09, // SPECIES_OMASTAR
+ 0x1d, // SPECIES_KABUTO
+ 0x0f, // SPECIES_KABUTOPS
+ 0x47, // SPECIES_AERODACTYL
+ 0x0b, // SPECIES_SNORLAX
+ 0x09, // SPECIES_ARTICUNO
+ 0x2c, // SPECIES_ZAPDOS
+ 0x45, // SPECIES_MOLTRES
+ 0x00, // SPECIES_DRATINI
+ 0x10, // SPECIES_DRAGONAIR
+ 0x47, // SPECIES_DRAGONITE
+ 0x09, // SPECIES_MEWTWO
+ 0x0d, // SPECIES_MEW
+ 0x00, // SPECIES_CHIKORITA
+ 0x00, // SPECIES_BAYLEEF
+ 0x17, // SPECIES_MEGANIUM
+ 0x52, // SPECIES_CYNDAQUIL
+ 0x17, // SPECIES_QUILAVA
+ 0x10, // SPECIES_TYPHLOSION
+ 0x31, // SPECIES_TOTODILE
+ 0x0f, // SPECIES_CROCONAW
+ 0x0f, // SPECIES_FERALIGATR
+ 0x00, // SPECIES_SENTRET
+ 0x32, // SPECIES_FURRET
+ 0x47, // SPECIES_HOOTHOOT
+ 0x17, // SPECIES_NOCTOWL
+ 0x52, // SPECIES_LEDYBA
+ 0x47, // SPECIES_LEDIAN
+ 0x4f, // SPECIES_SPINARAK
+ 0x0f, // SPECIES_ARIADOS
+ 0x00, // SPECIES_CROBAT
+ 0x45, // SPECIES_CHINCHOU
+ 0x51, // SPECIES_LANTURN
+ 0x1e, // SPECIES_PICHU
+ 0x52, // SPECIES_CLEFFA
+ 0x0c, // SPECIES_IGGLYBUFF
+ 0x0b, // SPECIES_TOGEPI
+ 0x00, // SPECIES_TOGETIC
+ 0x31, // SPECIES_NATU
+ 0x09, // SPECIES_XATU
+ 0x00, // SPECIES_MAREEP
+ 0x1e, // SPECIES_FLAAFFY
+ 0x2c, // SPECIES_AMPHAROS
+ 0x0b, // SPECIES_BELLOSSOM
+ 0x00, // SPECIES_MARILL
+ 0x4a, // SPECIES_AZUMARILL
+ 0x46, // SPECIES_SUDOWOODO
+ 0x32, // SPECIES_POLITOED
+ 0x1c, // SPECIES_HOPPIP
+ 0x18, // SPECIES_SKIPLOOM
+ 0x51, // SPECIES_JUMPLUFF
+ 0x32, // SPECIES_AIPOM
+ 0x52, // SPECIES_SUNKERN
+ 0x00, // SPECIES_SUNFLORA
+ 0x2b, // SPECIES_YANMA
+ 0x00, // SPECIES_WOOPER
+ 0x16, // SPECIES_QUAGSIRE
+ 0x09, // SPECIES_ESPEON
+ 0x10, // SPECIES_UMBREON
+ 0x00, // SPECIES_MURKROW
+ 0x13, // SPECIES_SLOWKING
+ 0x1c, // SPECIES_MISDREAVUS
+ 0x0a, // SPECIES_UNOWN
+ 0x30, // SPECIES_WOBBUFFET
+ 0x1e, // SPECIES_GIRAFARIG
+ 0x0b, // SPECIES_PINECO
+ 0x10, // SPECIES_FORRETRESS
+ 0x00, // SPECIES_DUNSPARCE
+ 0x13, // SPECIES_GLIGAR
+ 0x0f, // SPECIES_STEELIX
+ 0x17, // SPECIES_SNUBBULL
+ 0x10, // SPECIES_GRANBULL
+ 0x3a, // SPECIES_QWILFISH
+ 0x02, // SPECIES_SCIZOR
+ 0x0b, // SPECIES_SHUCKLE
+ 0x41, // SPECIES_HERACROSS
+ 0x16, // SPECIES_SNEASEL
+ 0x17, // SPECIES_TEDDIURSA
+ 0x10, // SPECIES_URSARING
+ 0x17, // SPECIES_SLUGMA
+ 0x17, // SPECIES_MAGCARGO
+ 0x00, // SPECIES_SWINUB
+ 0x0f, // SPECIES_PILOSWINE
+ 0x03, // SPECIES_CORSOLA
+ 0x52, // SPECIES_REMORAID
+ 0x17, // SPECIES_OCTILLERY
+ 0x52, // SPECIES_DELIBIRD
+ 0x0d, // SPECIES_MANTINE
+ 0x17, // SPECIES_SKARMORY
+ 0x17, // SPECIES_HOUNDOUR
+ 0x10, // SPECIES_HOUNDOOM
+ 0x42, // SPECIES_KINGDRA
+ 0x32, // SPECIES_PHANPY
+ 0x19, // SPECIES_DONPHAN
+ 0x00, // SPECIES_PORYGON2
+ 0x00, // SPECIES_STANTLER
+ 0x31, // SPECIES_SMEARGLE
+ 0x16, // SPECIES_TYROGUE
+ 0x02, // SPECIES_HITMONTOP
+ 0x09, // SPECIES_SMOOCHUM
+ 0x2c, // SPECIES_ELEKID
+ 0x00, // SPECIES_MAGBY
+ 0x45, // SPECIES_MILTANK
+ 0x00, // SPECIES_BLISSEY
+ 0x2c, // SPECIES_RAIKOU
+ 0x09, // SPECIES_ENTEI
+ 0x10, // SPECIES_SUICUNE
+ 0x52, // SPECIES_LARVITAR
+ 0x10, // SPECIES_PUPITAR
+ 0x0f, // SPECIES_TYRANITAR
+ 0x3a, // SPECIES_LUGIA
+ 0x09, // SPECIES_HO_OH
+ 0x18, // SPECIES_CELEBI
+ 0x00, // 252
+ 0x00, // 253
+ 0x00, // 254
+ 0x00, // 255
+ 0x00, // 256
+ 0x00, // 257
+ 0x00, // 258
+ 0x00, // 259
+ 0x00, // 260
+ 0x00, // 261
+ 0x00, // 262
+ 0x00, // 263
+ 0x00, // 264
+ 0x00, // 265
+ 0x00, // 266
+ 0x00, // 267
+ 0x00, // 268
+ 0x00, // 269
+ 0x00, // 270
+ 0x00, // 271
+ 0x00, // 272
+ 0x00, // 273
+ 0x00, // 274
+ 0x00, // 275
+ 0x00, // 276
+ 0x00, // SPECIES_TREECKO
+ 0x17, // SPECIES_GROVYLE
+ 0x10, // SPECIES_SCEPTILE
+ 0x16, // SPECIES_TORCHIC
+ 0x06, // SPECIES_COMBUSKEN
+ 0x0f, // SPECIES_BLAZIKEN
+ 0x01, // SPECIES_MUDKIP
+ 0x04, // SPECIES_MARSHTOMP
+ 0x1e, // SPECIES_SWAMPERT
+ 0x10, // SPECIES_POOCHYENA
+ 0x10, // SPECIES_MIGHTYENA
+ 0x03, // SPECIES_ZIGZAGOON
+ 0x09, // SPECIES_LINOONE
+ 0x00, // SPECIES_WURMPLE
+ 0x00, // SPECIES_SILCOON
+ 0x04, // SPECIES_BEAUTIFLY
+ 0x04, // SPECIES_CASCOON
+ 0x06, // SPECIES_DUSTOX
+ 0x00, // SPECIES_LOTAD
+ 0x00, // SPECIES_LOMBRE
+ 0x49, // SPECIES_LUDICOLO
+ 0x05, // SPECIES_SEEDOT
+ 0x00, // SPECIES_NUZLEAF
+ 0x02, // SPECIES_SHIFTRY
+ 0x00, // SPECIES_NINCADA
+ 0x46, // SPECIES_NINJASK
+ 0x1c, // SPECIES_SHEDINJA
+ 0x1e, // SPECIES_TAILLOW
+ 0x01, // SPECIES_SWELLOW
+ 0x00, // SPECIES_SHROOMISH
+ 0x00, // SPECIES_BRELOOM
+ 0x31, // SPECIES_SPINDA
+ 0x1b, // SPECIES_WINGULL
+ 0x1c, // SPECIES_PELIPPER
+ 0x00, // SPECIES_SURSKIT
+ 0x00, // SPECIES_MASQUERAIN
+ 0x01, // SPECIES_WAILMER
+ 0x1c, // SPECIES_WAILORD
+ 0x00, // SPECIES_SKITTY
+ 0x17, // SPECIES_DELCATTY
+ 0x35, // SPECIES_KECLEON
+ 0x1d, // SPECIES_BALTOY
+ 0x51, // SPECIES_CLAYDOL
+ 0x49, // SPECIES_NOSEPASS
+ 0x17, // SPECIES_TORKOAL
+ 0x15, // SPECIES_SABLEYE
+ 0x49, // SPECIES_BARBOACH
+ 0x49, // SPECIES_WHISCASH
+ 0x1d, // SPECIES_LUVDISC
+ 0x10, // SPECIES_CORPHISH
+ 0x09, // SPECIES_CRAWDAUNT
+ 0x49, // SPECIES_FEEBAS
+ 0x22, // SPECIES_MILOTIC
+ 0x49, // SPECIES_CARVANHA
+ 0x56, // SPECIES_SHARPEDO
+ 0x10, // SPECIES_TRAPINCH
+ 0x0f, // SPECIES_VIBRAVA
+ 0x4b, // SPECIES_FLYGON
+ 0x0b, // SPECIES_MAKUHITA
+ 0x34, // SPECIES_HARIYAMA
+ 0x00, // SPECIES_ELECTRIKE
+ 0x00, // SPECIES_MANECTRIC
+ 0x04, // SPECIES_NUMEL
+ 0x10, // SPECIES_CAMERUPT
+ 0x53, // SPECIES_SPHEAL
+ 0x17, // SPECIES_SEALEO
+ 0x0f, // SPECIES_WALREIN
+ 0x49, // SPECIES_CACNEA
+ 0x04, // SPECIES_CACTURNE
+ 0x45, // SPECIES_SNORUNT
+ 0x0a, // SPECIES_GLALIE
+ 0x0e, // SPECIES_LUNATONE
+ 0x08, // SPECIES_SOLROCK
+ 0x00, // SPECIES_AZURILL
+ 0x56, // SPECIES_SPOINK
+ 0x32, // SPECIES_GRUMPIG
+ 0x00, // SPECIES_PLUSLE
+ 0x01, // SPECIES_MINUN
+ 0x00, // SPECIES_MAWILE
+ 0x05, // SPECIES_MEDITITE
+ 0x45, // SPECIES_MEDICHAM
+ 0x04, // SPECIES_SWABLU
+ 0x16, // SPECIES_ALTARIA
+ 0x32, // SPECIES_WYNAUT
+ 0x0a, // SPECIES_DUSKULL
+ 0x02, // SPECIES_DUSCLOPS
+ 0x45, // SPECIES_ROSELIA
+ 0x45, // SPECIES_SLAKOTH
+ 0x31, // SPECIES_VIGOROTH
+ 0x45, // SPECIES_SLAKING
+ 0x00, // SPECIES_GULPIN
+ 0x45, // SPECIES_SWALOT
+ 0x10, // SPECIES_TROPIUS
+ 0x03, // SPECIES_WHISMUR
+ 0x49, // SPECIES_LOUDRED
+ 0x19, // SPECIES_EXPLOUD
+ 0x12, // SPECIES_CLAMPERL
+ 0x09, // SPECIES_HUNTAIL
+ 0x1c, // SPECIES_GOREBYSS
+ 0x11, // SPECIES_ABSOL
+ 0x1c, // SPECIES_SHUPPET
+ 0x0d, // SPECIES_BANETTE
+ 0x17, // SPECIES_SEVIPER
+ 0x09, // SPECIES_ZANGOOSE
+ 0x1a, // SPECIES_RELICANTH
+ 0x45, // SPECIES_ARON
+ 0x00, // SPECIES_LAIRON
+ 0x19, // SPECIES_AGGRON
+ 0x1d, // SPECIES_CASTFORM
+ 0x00, // SPECIES_VOLBEAT
+ 0x05, // SPECIES_ILLUMISE
+ 0x17, // SPECIES_LILEEP
+ 0x19, // SPECIES_CRADILY
+ 0x12, // SPECIES_ANORITH
+ 0x10, // SPECIES_ARMALDO
+ 0x45, // SPECIES_RALTS
+ 0x00, // SPECIES_KIRLIA
+ 0x00, // SPECIES_GARDEVOIR
+ 0x19, // SPECIES_BAGON
+ 0x04, // SPECIES_SHELGON
+ 0x0f, // SPECIES_SALAMENCE
+ 0x0f, // SPECIES_BELDUM
+ 0x04, // SPECIES_METANG
+ 0x10, // SPECIES_METAGROSS
+ 0x01, // SPECIES_REGIROCK
+ 0x44, // SPECIES_REGICE
+ 0x09, // SPECIES_REGISTEEL
+ 0x2d, // SPECIES_KYOGRE
+ 0x10, // SPECIES_GROUDON
+ 0x0f, // SPECIES_RAYQUAZA
+ 0x2d, // SPECIES_LATIAS
+ 0x10, // SPECIES_LATIOS
+ 0x0d, // SPECIES_JIRACHI
+ 0x1b, // SPECIES_DEOXYS
+ 0x1d, // SPECIES_CHIMECHO
+};
+
+static const u8 sMonAnimationDelayTable[] =
+{
+ 0x00, // SPECIES_BULBASAUR
+ 0x00, // SPECIES_IVYSAUR
+ 0x00, // SPECIES_VENUSAUR
+ 0x00, // SPECIES_CHARMANDER
+ 0x00, // SPECIES_CHARMELEON
+ 0x00, // SPECIES_CHARIZARD
+ 0x00, // SPECIES_SQUIRTLE
+ 0x00, // SPECIES_WARTORTLE
+ 0x32, // SPECIES_BLASTOISE
+ 0x00, // SPECIES_CATERPIE
+ 0x00, // SPECIES_METAPOD
+ 0x00, // SPECIES_BUTTERFREE
+ 0x0a, // SPECIES_WEEDLE
+ 0x14, // SPECIES_KAKUNA
+ 0x23, // SPECIES_BEEDRILL
+ 0x00, // SPECIES_PIDGEY
+ 0x19, // SPECIES_PIDGEOTTO
+ 0x00, // SPECIES_PIDGEOT
+ 0x00, // SPECIES_RATTATA
+ 0x00, // SPECIES_RATICATE
+ 0x00, // SPECIES_SPEAROW
+ 0x02, // SPECIES_FEAROW
+ 0x1e, // SPECIES_EKANS
+ 0x00, // SPECIES_ARBOK
+ 0x00, // SPECIES_PIKACHU
+ 0x00, // SPECIES_RAICHU
+ 0x00, // SPECIES_SANDSHREW
+ 0x00, // SPECIES_SANDSLASH
+ 0x1c, // SPECIES_NIDORAN_F
+ 0x00, // SPECIES_NIDORINA
+ 0x00, // SPECIES_NIDOQUEEN
+ 0x00, // SPECIES_NIDORAN_M
+ 0x00, // SPECIES_NIDORINO
+ 0x19, // SPECIES_NIDOKING
+ 0x00, // SPECIES_CLEFAIRY
+ 0x00, // SPECIES_CLEFABLE
+ 0x00, // SPECIES_VULPIX
+ 0x00, // SPECIES_NINETALES
+ 0x00, // SPECIES_JIGGLYPUFF
+ 0x00, // SPECIES_WIGGLYTUFF
+ 0x00, // SPECIES_ZUBAT
+ 0x00, // SPECIES_GOLBAT
+ 0x00, // SPECIES_ODDISH
+ 0x00, // SPECIES_GLOOM
+ 0x00, // SPECIES_VILEPLUME
+ 0x0a, // SPECIES_PARAS
+ 0x2d, // SPECIES_PARASECT
+ 0x14, // SPECIES_VENONAT
+ 0x00, // SPECIES_VENOMOTH
+ 0x19, // SPECIES_DIGLETT
+ 0x23, // SPECIES_DUGTRIO
+ 0x28, // SPECIES_MEOWTH
+ 0x14, // SPECIES_PERSIAN
+ 0x00, // SPECIES_PSYDUCK
+ 0x00, // SPECIES_GOLDUCK
+ 0x14, // SPECIES_MANKEY
+ 0x00, // SPECIES_PRIMEAPE
+ 0x1e, // SPECIES_GROWLITHE
+ 0x28, // SPECIES_ARCANINE
+ 0x00, // SPECIES_POLIWAG
+ 0x05, // SPECIES_POLIWHIRL
+ 0x00, // SPECIES_POLIWRATH
+ 0x00, // SPECIES_ABRA
+ 0x00, // SPECIES_KADABRA
+ 0x00, // SPECIES_ALAKAZAM
+ 0x00, // SPECIES_MACHOP
+ 0x00, // SPECIES_MACHOKE
+ 0x00, // SPECIES_MACHAMP
+ 0x00, // SPECIES_BELLSPROUT
+ 0x03, // SPECIES_WEEPINBELL
+ 0x00, // SPECIES_VICTREEBEL
+ 0x00, // SPECIES_TENTACOOL
+ 0x00, // SPECIES_TENTACRUEL
+ 0x00, // SPECIES_GEODUDE
+ 0x00, // SPECIES_GRAVELER
+ 0x00, // SPECIES_GOLEM
+ 0x00, // SPECIES_PONYTA
+ 0x00, // SPECIES_RAPIDASH
+ 0x00, // SPECIES_SLOWPOKE
+ 0x00, // SPECIES_SLOWBRO
+ 0x00, // SPECIES_MAGNEMITE
+ 0x00, // SPECIES_MAGNETON
+ 0x00, // SPECIES_FARFETCHD
+ 0x00, // SPECIES_DODUO
+ 0x00, // SPECIES_DODRIO
+ 0x00, // SPECIES_SEEL
+ 0x00, // SPECIES_DEWGONG
+ 0x00, // SPECIES_GRIMER
+ 0x2d, // SPECIES_MUK
+ 0x14, // SPECIES_SHELLDER
+ 0x00, // SPECIES_CLOYSTER
+ 0x00, // SPECIES_GASTLY
+ 0x17, // SPECIES_HAUNTER
+ 0x00, // SPECIES_GENGAR
+ 0x00, // SPECIES_ONIX
+ 0x30, // SPECIES_DROWZEE
+ 0x28, // SPECIES_HYPNO
+ 0x00, // SPECIES_KRABBY
+ 0x00, // SPECIES_KINGLER
+ 0x00, // SPECIES_VOLTORB
+ 0x00, // SPECIES_ELECTRODE
+ 0x00, // SPECIES_EXEGGCUTE
+ 0x00, // SPECIES_EXEGGUTOR
+ 0x00, // SPECIES_CUBONE
+ 0x00, // SPECIES_MAROWAK
+ 0x00, // SPECIES_HITMONLEE
+ 0x19, // SPECIES_HITMONCHAN
+ 0x00, // SPECIES_LICKITUNG
+ 0x00, // SPECIES_KOFFING
+ 0x00, // SPECIES_WEEZING
+ 0x00, // SPECIES_RHYHORN
+ 0x00, // SPECIES_RHYDON
+ 0x00, // SPECIES_CHANSEY
+ 0x00, // SPECIES_TANGELA
+ 0x00, // SPECIES_KANGASKHAN
+ 0x00, // SPECIES_HORSEA
+ 0x00, // SPECIES_SEADRA
+ 0x00, // SPECIES_GOLDEEN
+ 0x00, // SPECIES_SEAKING
+ 0x00, // SPECIES_STARYU
+ 0x00, // SPECIES_STARMIE
+ 0x00, // SPECIES_MR_MIME
+ 0x0a, // SPECIES_SCYTHER
+ 0x00, // SPECIES_JYNX
+ 0x00, // SPECIES_ELECTABUZZ
+ 0x00, // SPECIES_MAGMAR
+ 0x00, // SPECIES_PINSIR
+ 0x0a, // SPECIES_TAUROS
+ 0x00, // SPECIES_MAGIKARP
+ 0x00, // SPECIES_GYARADOS
+ 0x00, // SPECIES_LAPRAS
+ 0x00, // SPECIES_DITTO
+ 0x00, // SPECIES_EEVEE
+ 0x00, // SPECIES_VAPOREON
+ 0x00, // SPECIES_JOLTEON
+ 0x00, // SPECIES_FLAREON
+ 0x00, // SPECIES_PORYGON
+ 0x00, // SPECIES_OMANYTE
+ 0x00, // SPECIES_OMASTAR
+ 0x00, // SPECIES_KABUTO
+ 0x00, // SPECIES_KABUTOPS
+ 0x00, // SPECIES_AERODACTYL
+ 0x00, // SPECIES_SNORLAX
+ 0x00, // SPECIES_ARTICUNO
+ 0x00, // SPECIES_ZAPDOS
+ 0x00, // SPECIES_MOLTRES
+ 0x00, // SPECIES_DRATINI
+ 0x00, // SPECIES_DRAGONAIR
+ 0x00, // SPECIES_DRAGONITE
+ 0x00, // SPECIES_MEWTWO
+ 0x00, // SPECIES_MEW
+ 0x00, // SPECIES_CHIKORITA
+ 0x00, // SPECIES_BAYLEEF
+ 0x00, // SPECIES_MEGANIUM
+ 0x00, // SPECIES_CYNDAQUIL
+ 0x00, // SPECIES_QUILAVA
+ 0x14, // SPECIES_TYPHLOSION
+ 0x00, // SPECIES_TOTODILE
+ 0x00, // SPECIES_CROCONAW
+ 0x05, // SPECIES_FERALIGATR
+ 0x00, // SPECIES_SENTRET
+ 0x00, // SPECIES_FURRET
+ 0x00, // SPECIES_HOOTHOOT
+ 0x00, // SPECIES_NOCTOWL
+ 0x00, // SPECIES_LEDYBA
+ 0x00, // SPECIES_LEDIAN
+ 0x00, // SPECIES_SPINARAK
+ 0x00, // SPECIES_ARIADOS
+ 0x00, // SPECIES_CROBAT
+ 0x00, // SPECIES_CHINCHOU
+ 0x00, // SPECIES_LANTURN
+ 0x00, // SPECIES_PICHU
+ 0x00, // SPECIES_CLEFFA
+ 0x00, // SPECIES_IGGLYBUFF
+ 0x00, // SPECIES_TOGEPI
+ 0x00, // SPECIES_TOGETIC
+ 0x1e, // SPECIES_NATU
+ 0x00, // SPECIES_XATU
+ 0x32, // SPECIES_MAREEP
+ 0x00, // SPECIES_FLAAFFY
+ 0x0a, // SPECIES_AMPHAROS
+ 0x00, // SPECIES_BELLOSSOM
+ 0x00, // SPECIES_MARILL
+ 0x00, // SPECIES_AZUMARILL
+ 0x00, // SPECIES_SUDOWOODO
+ 0x28, // SPECIES_POLITOED
+ 0x00, // SPECIES_HOPPIP
+ 0x00, // SPECIES_SKIPLOOM
+ 0x00, // SPECIES_JUMPLUFF
+ 0x00, // SPECIES_AIPOM
+ 0x00, // SPECIES_SUNKERN
+ 0x00, // SPECIES_SUNFLORA
+ 0x00, // SPECIES_YANMA
+ 0x00, // SPECIES_WOOPER
+ 0x00, // SPECIES_QUAGSIRE
+ 0x00, // SPECIES_ESPEON
+ 0x00, // SPECIES_UMBREON
+ 0x00, // SPECIES_MURKROW
+ 0x00, // SPECIES_SLOWKING
+ 0x00, // SPECIES_MISDREAVUS
+ 0x00, // SPECIES_UNOWN
+ 0x00, // SPECIES_WOBBUFFET
+ 0x00, // SPECIES_GIRAFARIG
+ 0x00, // SPECIES_PINECO
+ 0x00, // SPECIES_FORRETRESS
+ 0x0a, // SPECIES_DUNSPARCE
+ 0x00, // SPECIES_GLIGAR
+ 0x2d, // SPECIES_STEELIX
+ 0x00, // SPECIES_SNUBBULL
+ 0x00, // SPECIES_GRANBULL
+ 0x27, // SPECIES_QWILFISH
+ 0x13, // SPECIES_SCIZOR
+ 0x00, // SPECIES_SHUCKLE
+ 0x00, // SPECIES_HERACROSS
+ 0x00, // SPECIES_SNEASEL
+ 0x00, // SPECIES_TEDDIURSA
+ 0x00, // SPECIES_URSARING
+ 0x00, // SPECIES_SLUGMA
+ 0x00, // SPECIES_MAGCARGO
+ 0x00, // SPECIES_SWINUB
+ 0x00, // SPECIES_PILOSWINE
+ 0x00, // SPECIES_CORSOLA
+ 0x00, // SPECIES_REMORAID
+ 0x14, // SPECIES_OCTILLERY
+ 0x00, // SPECIES_DELIBIRD
+ 0x00, // SPECIES_MANTINE
+ 0x00, // SPECIES_SKARMORY
+ 0x00, // SPECIES_HOUNDOUR
+ 0x00, // SPECIES_HOUNDOOM
+ 0x00, // SPECIES_KINGDRA
+ 0x00, // SPECIES_PHANPY
+ 0x00, // SPECIES_DONPHAN
+ 0x00, // SPECIES_PORYGON2
+ 0x00, // SPECIES_STANTLER
+ 0x00, // SPECIES_SMEARGLE
+ 0x00, // SPECIES_TYROGUE
+ 0x00, // SPECIES_HITMONTOP
+ 0x28, // SPECIES_SMOOCHUM
+ 0x00, // SPECIES_ELEKID
+ 0x00, // SPECIES_MAGBY
+ 0x00, // SPECIES_MILTANK
+ 0x00, // SPECIES_BLISSEY
+ 0x00, // SPECIES_RAIKOU
+ 0x00, // SPECIES_ENTEI
+ 0x00, // SPECIES_SUICUNE
+ 0x00, // SPECIES_LARVITAR
+ 0x00, // SPECIES_PUPITAR
+ 0x0a, // SPECIES_TYRANITAR
+ 0x14, // SPECIES_LUGIA
+ 0x00, // SPECIES_HO_OH
+ 0x00, // SPECIES_CELEBI
+ 0x00, // 252
+ 0x00, // 253
+ 0x00, // 254
+ 0x00, // 255
+ 0x00, // 256
+ 0x00, // 257
+ 0x00, // 258
+ 0x00, // 259
+ 0x00, // 260
+ 0x00, // 261
+ 0x00, // 262
+ 0x00, // 263
+ 0x00, // 264
+ 0x00, // 265
+ 0x00, // 266
+ 0x00, // 267
+ 0x00, // 268
+ 0x00, // 269
+ 0x00, // 270
+ 0x00, // 271
+ 0x00, // 272
+ 0x00, // 273
+ 0x00, // 274
+ 0x00, // 275
+ 0x00, // 276
+ 0x00, // SPECIES_TREECKO
+ 0x00, // SPECIES_GROVYLE
+ 0x00, // SPECIES_SCEPTILE
+ 0x00, // SPECIES_TORCHIC
+ 0x00, // SPECIES_COMBUSKEN
+ 0x00, // SPECIES_BLAZIKEN
+ 0x00, // SPECIES_MUDKIP
+ 0x00, // SPECIES_MARSHTOMP
+ 0x00, // SPECIES_SWAMPERT
+ 0x00, // SPECIES_POOCHYENA
+ 0x00, // SPECIES_MIGHTYENA
+ 0x00, // SPECIES_ZIGZAGOON
+ 0x00, // SPECIES_LINOONE
+ 0x00, // SPECIES_WURMPLE
+ 0x00, // SPECIES_SILCOON
+ 0x00, // SPECIES_BEAUTIFLY
+ 0x00, // SPECIES_CASCOON
+ 0x00, // SPECIES_DUSTOX
+ 0x00, // SPECIES_LOTAD
+ 0x00, // SPECIES_LOMBRE
+ 0x00, // SPECIES_LUDICOLO
+ 0x00, // SPECIES_SEEDOT
+ 0x00, // SPECIES_NUZLEAF
+ 0x00, // SPECIES_SHIFTRY
+ 0x00, // SPECIES_NINCADA
+ 0x00, // SPECIES_NINJASK
+ 0x00, // SPECIES_SHEDINJA
+ 0x00, // SPECIES_TAILLOW
+ 0x00, // SPECIES_SWELLOW
+ 0x00, // SPECIES_SHROOMISH
+ 0x00, // SPECIES_BRELOOM
+ 0x00, // SPECIES_SPINDA
+ 0x00, // SPECIES_WINGULL
+ 0x00, // SPECIES_PELIPPER
+ 0x00, // SPECIES_SURSKIT
+ 0x00, // SPECIES_MASQUERAIN
+ 0x00, // SPECIES_WAILMER
+ 0x0a, // SPECIES_WAILORD
+ 0x00, // SPECIES_SKITTY
+ 0x00, // SPECIES_DELCATTY
+ 0x1e, // SPECIES_KECLEON
+ 0x00, // SPECIES_BALTOY
+ 0x00, // SPECIES_CLAYDOL
+ 0x00, // SPECIES_NOSEPASS
+ 0x00, // SPECIES_TORKOAL
+ 0x00, // SPECIES_SABLEYE
+ 0x00, // SPECIES_BARBOACH
+ 0x00, // SPECIES_WHISCASH
+ 0x00, // SPECIES_LUVDISC
+ 0x00, // SPECIES_CORPHISH
+ 0x00, // SPECIES_CRAWDAUNT
+ 0x00, // SPECIES_FEEBAS
+ 0x2d, // SPECIES_MILOTIC
+ 0x00, // SPECIES_CARVANHA
+ 0x00, // SPECIES_SHARPEDO
+ 0x00, // SPECIES_TRAPINCH
+ 0x00, // SPECIES_VIBRAVA
+ 0x00, // SPECIES_FLYGON
+ 0x00, // SPECIES_MAKUHITA
+ 0x00, // SPECIES_HARIYAMA
+ 0x00, // SPECIES_ELECTRIKE
+ 0x00, // SPECIES_MANECTRIC
+ 0x00, // SPECIES_NUMEL
+ 0x00, // SPECIES_CAMERUPT
+ 0x0f, // SPECIES_SPHEAL
+ 0x00, // SPECIES_SEALEO
+ 0x00, // SPECIES_WALREIN
+ 0x00, // SPECIES_CACNEA
+ 0x00, // SPECIES_CACTURNE
+ 0x14, // SPECIES_SNORUNT
+ 0x00, // SPECIES_GLALIE
+ 0x00, // SPECIES_LUNATONE
+ 0x00, // SPECIES_SOLROCK
+ 0x00, // SPECIES_AZURILL
+ 0x00, // SPECIES_SPOINK
+ 0x0f, // SPECIES_GRUMPIG
+ 0x00, // SPECIES_PLUSLE
+ 0x00, // SPECIES_MINUN
+ 0x00, // SPECIES_MAWILE
+ 0x00, // SPECIES_MEDITITE
+ 0x00, // SPECIES_MEDICHAM
+ 0x00, // SPECIES_SWABLU
+ 0x00, // SPECIES_ALTARIA
+ 0x0f, // SPECIES_WYNAUT
+ 0x00, // SPECIES_DUSKULL
+ 0x1e, // SPECIES_DUSCLOPS
+ 0x00, // SPECIES_ROSELIA
+ 0x00, // SPECIES_SLAKOTH
+ 0x00, // SPECIES_VIGOROTH
+ 0x00, // SPECIES_SLAKING
+ 0x00, // SPECIES_GULPIN
+ 0x00, // SPECIES_SWALOT
+ 0x00, // SPECIES_TROPIUS
+ 0x00, // SPECIES_WHISMUR
+ 0x00, // SPECIES_LOUDRED
+ 0x00, // SPECIES_EXPLOUD
+ 0x00, // SPECIES_CLAMPERL
+ 0x00, // SPECIES_HUNTAIL
+ 0x00, // SPECIES_GOREBYSS
+ 0x2d, // SPECIES_ABSOL
+ 0x00, // SPECIES_SHUPPET
+ 0x00, // SPECIES_BANETTE
+ 0x00, // SPECIES_SEVIPER
+ 0x00, // SPECIES_ZANGOOSE
+ 0x00, // SPECIES_RELICANTH
+ 0x00, // SPECIES_ARON
+ 0x00, // SPECIES_LAIRON
+ 0x00, // SPECIES_AGGRON
+ 0x00, // SPECIES_CASTFORM
+ 0x00, // SPECIES_VOLBEAT
+ 0x00, // SPECIES_ILLUMISE
+ 0x00, // SPECIES_LILEEP
+ 0x00, // SPECIES_CRADILY
+ 0x00, // SPECIES_ANORITH
+ 0x00, // SPECIES_ARMALDO
+ 0x00, // SPECIES_RALTS
+ 0x00, // SPECIES_KIRLIA
+ 0x00, // SPECIES_GARDEVOIR
+ 0x00, // SPECIES_BAGON
+ 0x00, // SPECIES_SHELGON
+ 0x46, // SPECIES_SALAMENCE
+ 0x00, // SPECIES_BELDUM
+ 0x00, // SPECIES_METANG
+ 0x00, // SPECIES_METAGROSS
+ 0x00, // SPECIES_REGIROCK
+ 0x00, // SPECIES_REGICE
+ 0x00, // SPECIES_REGISTEEL
+ 0x3c, // SPECIES_KYOGRE
+ 0x00, // SPECIES_GROUDON
+ 0x3c, // SPECIES_RAYQUAZA
+ 0x00, // SPECIES_LATIAS
+ 0x00, // SPECIES_LATIOS
+ 0x00, // SPECIES_JIRACHI
+ 0x00, // SPECIES_DEOXYS
+ 0x00, // SPECIES_CHIMECHO
+};
+
+const u8 gUnknown_08329D22[] = {0x03, 0x0c, 0x30, 0xc0}; // Masks for getting PP Up count, also PP Max values
+const u8 gUnknown_08329D26[] = {0xfc, 0xf3, 0xcf, 0x3f}; // Masks for setting PP Up count
+const u8 gUnknown_08329D2A[] = {0x01, 0x04, 0x10, 0x40}; // Values added to PP Up count
+
+const u8 gStatStageRatios[][2] =
+{
+ {10, 40}, // -6
+ {10, 35}, // -5
+ {10, 30}, // -4
+ {10, 25}, // -3
+ {10, 20}, // -2
+ {10, 15}, // -1
+ {10, 10}, // 0
+ {15, 10}, // +1
+ {20, 10}, // +2
+ {25, 10}, // +3
+ {30, 10}, // +4
+ {35, 10}, // +5
+ {40, 10}, // +6
+};
+
+static const u16 sDeoxysBaseStats[] =
+{
+ 50, // Hp
+ 95, // Attack
+ 90, // Defense
+ 180, // Speed
+ 95, // Sp.Attack
+ 90, // Sp.Defense
+};
+
+const u16 gUnknown_08329D54[] =
+{
+ FACILITY_CLASS_COOLTRAINER_M, FACILITY_CLASS_BLACK_BELT, FACILITY_CLASS_CAMPER,
+ FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_PSYCHIC_M, FACILITY_CLASS_BUG_CATCHER,
+ FACILITY_CLASS_PKMN_BREEDER_2, FACILITY_CLASS_GUITARIST, FACILITY_CLASS_COOLTRAINER_F,
+ FACILITY_CLASS_HEX_MANIAC, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_LASS,
+ FACILITY_CLASS_PSYCHIC_F, FACILITY_CLASS_BATTLE_GIRL, FACILITY_CLASS_PKMN_BREEDER_1,
+ FACILITY_CLASS_BEAUTY
+};
+
+static const u8 sHoldEffectToType[][2] =
+{
+ {HOLD_EFFECT_BUG_POWER, TYPE_BUG},
+ {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL},
+ {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND},
+ {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK},
+ {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS},
+ {HOLD_EFFECT_DARK_POWER, TYPE_DARK},
+ {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING},
+ {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC},
+ {HOLD_EFFECT_WATER_POWER, TYPE_WATER},
+ {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING},
+ {HOLD_EFFECT_POISON_POWER, TYPE_POISON},
+ {HOLD_EFFECT_ICE_POWER, TYPE_ICE},
+ {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST},
+ {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC},
+ {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE},
+ {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON},
+ {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL},
+};
+
+const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] =
+{
+ { // B_POSITION_PLAYER_LEFT
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF3A8,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ { // B_POSITION_OPPONENT_LEFT
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACA8,
+ .anims = NULL,
+ .images = gUnknown_082FF3C8,
+ .affineAnims = gUnknown_082FF694,
+ .callback = oac_poke_opponent,
+ },
+ { // B_POSITION_PLAYER_RIGHT
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF3E8,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ { // B_POSITION_OPPONENT_RIGHT
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACA8,
+ .anims = NULL,
+ .images = gUnknown_082FF408,
+ .affineAnims = gUnknown_082FF694,
+ .callback = oac_poke_opponent
+ },
+};
+
+static const struct SpriteTemplate gUnknown_08329DF8[] =
+{
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF428,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF448,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF468,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF490,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF4B8,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF4D8,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF4F8,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = 0,
+ .oam = &gUnknown_0831ACB0,
+ .anims = NULL,
+ .images = gUnknown_082FF518,
+ .affineAnims = gUnknown_082FF618,
+ .callback = sub_8039BB4,
+ },
+};
+
+static const u8 sSecretBaseFacilityClasses[2][5] =
+{
+ {FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_RICH_BOY, FACILITY_CLASS_CAMPER, FACILITY_CLASS_COOLTRAINER_M},
+ {FACILITY_CLASS_LASS, FACILITY_CLASS_SCHOOL_KID_F, FACILITY_CLASS_LADY, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_COOLTRAINER_F}
+};
+
+static const u8 sGetMonDataEVConstants[] =
+{
+ MON_DATA_HP_EV,
+ MON_DATA_ATK_EV,
+ MON_DATA_DEF_EV,
+ MON_DATA_SPEED_EV,
+ MON_DATA_SPDEF_EV,
+ MON_DATA_SPATK_EV
+};
+
+static const u8 gUnknown_08329EC8[] =
+{
+ STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC
+};
+
+static const s8 gUnknown_08329ECE[][3] =
+{
+ { 5, 3, 2},
+ { 5, 3, 2},
+ { 1, 1, 0},
+ { 3, 2, 1},
+ { 1, 1, 0},
+ { 1, 1, 1},
+ {-1, -1, -1},
+ {-5, -5, -10},
+ {-5, -5, -10},
+};
+
+static const u16 sHMMoves[] =
+{
+ MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH,
+ MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, 0xFFFF
+};
+
+static const struct SpeciesItem sAlteringCaveWildMonHeldItems[] =
+{
+ {SPECIES_NONE, ITEM_NONE},
+ {SPECIES_MAREEP, ITEM_GANLON_BERRY},
+ {SPECIES_PINECO, ITEM_APICOT_BERRY},
+ {SPECIES_HOUNDOUR, ITEM_BIG_MUSHROOM},
+ {SPECIES_TEDDIURSA, ITEM_PETAYA_BERRY},
+ {SPECIES_AIPOM, ITEM_BERRY_JUICE},
+ {SPECIES_SHUCKLE, ITEM_BERRY_JUICE},
+ {SPECIES_STANTLER, ITEM_PETAYA_BERRY},
+ {SPECIES_SMEARGLE, ITEM_SALAC_BERRY},
+};
+
+static const struct OamData sOamData_8329F20 =
+{
+ .y = 0,
+ .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 struct SpriteTemplate gUnknown_08329F28 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0xFFFF,
+ .oam = &sOamData_8329F20,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+// code
+void ZeroBoxMonData(struct BoxPokemon *boxMon)
+{
+ u8 *raw = (u8 *)boxMon;
+ u32 i;
+ for (i = 0; i < sizeof(struct BoxPokemon); i++)
+ raw[i] = 0;
+}
+
+void ZeroMonData(struct Pokemon *mon)
+{
+ u32 arg;
+ ZeroBoxMonData(&mon->box);
+ arg = 0;
+ SetMonData(mon, MON_DATA_STATUS, &arg);
+ SetMonData(mon, MON_DATA_LEVEL, &arg);
+ SetMonData(mon, MON_DATA_HP, &arg);
+ SetMonData(mon, MON_DATA_MAX_HP, &arg);
+ SetMonData(mon, MON_DATA_ATK, &arg);
+ SetMonData(mon, MON_DATA_DEF, &arg);
+ SetMonData(mon, MON_DATA_SPEED, &arg);
+ SetMonData(mon, MON_DATA_SPATK, &arg);
+ SetMonData(mon, MON_DATA_SPDEF, &arg);
+ arg = 255;
+ SetMonData(mon, MON_DATA_MAIL, &arg);
+}
+
+void ZeroPlayerPartyMons(void)
+{
+ s32 i;
+ for (i = 0; i < PARTY_SIZE; i++)
+ ZeroMonData(&gPlayerParty[i]);
+}
+
+void ZeroEnemyPartyMons(void)
+{
+ s32 i;
+ for (i = 0; i < PARTY_SIZE; i++)
+ ZeroMonData(&gEnemyParty[i]);
+}
+
+void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
+{
+ u32 arg;
+ ZeroMonData(mon);
+ CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId);
+ SetMonData(mon, MON_DATA_LEVEL, &level);
+ arg = 255;
+ SetMonData(mon, MON_DATA_MAIL, &arg);
+ CalculateMonStats(mon);
+}
+
+void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
+{
+ u8 speciesName[POKEMON_NAME_LENGTH + 1];
+ u32 personality;
+ u32 value;
+ u16 checksum;
+
+ ZeroBoxMonData(boxMon);
+
+ if (hasFixedPersonality)
+ personality = fixedPersonality;
+ else
+ personality = Random32();
+
+ SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality);
+
+ //Determine original trainer ID
+ if (otIdType == OT_ID_RANDOM_NO_SHINY) //Pokemon cannot be shiny
+ {
+ u32 shinyValue;
+ do
+ {
+ value = Random32();
+ shinyValue = HIHALF(value) ^ LOHALF(value) ^ HIHALF(personality) ^ LOHALF(personality);
+ } while (shinyValue < 8);
+ }
+ else if (otIdType == OT_ID_PRESET) //Pokemon has a preset OT ID
+ {
+ value = fixedOtId;
+ }
+ else //Player is the OT
+ {
+ value = gSaveBlock2Ptr->playerTrainerId[0]
+ | (gSaveBlock2Ptr->playerTrainerId[1] << 8)
+ | (gSaveBlock2Ptr->playerTrainerId[2] << 16)
+ | (gSaveBlock2Ptr->playerTrainerId[3] << 24);
+ }
+
+ SetBoxMonData(boxMon, MON_DATA_OT_ID, &value);
+
+ checksum = CalculateBoxMonChecksum(boxMon);
+ SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum);
+ EncryptBoxMon(boxMon);
+ GetSpeciesName(speciesName, species);
+ SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName);
+ SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage);
+ SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName);
+ SetBoxMonData(boxMon, MON_DATA_SPECIES, &species);
+ SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gBaseStats[species].growthRate][level]);
+ SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship);
+ value = sav1_map_get_name();
+ SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value);
+ SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level);
+ SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion);
+ value = ITEM_POKE_BALL;
+ SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value);
+ SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender);
+
+ if (fixedIV < 32)
+ {
+ SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV);
+ SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV);
+ SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV);
+ SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV);
+ SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV);
+ SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV);
+ }
+ else
+ {
+ u32 iv;
+ value = Random();
+
+ iv = value & 0x1F;
+ SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv);
+ iv = (value & 0x3E0) >> 5;
+ SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv);
+ iv = (value & 0x7C00) >> 10;
+ SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv);
+
+ value = Random();
+
+ iv = value & 0x1F;
+ SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv);
+ iv = (value & 0x3E0) >> 5;
+ SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv);
+ iv = (value & 0x7C00) >> 10;
+ SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);
+ }
+
+ if (gBaseStats[species].ability2)
+ {
+ value = personality & 1;
+ SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, &value);
+ }
+
+ GiveBoxMonInitialMoveset(boxMon);
+}
+
+void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature)
+{
+ u32 personality;
+
+ do
+ {
+ personality = Random32();
+ }
+ while (nature != GetNatureFromPersonality(personality));
+
+ CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_PLAYER_ID, 0);
+}
+
+void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter)
+{
+ u32 personality;
+
+ if ((u8)(unownLetter - 1) < 28)
+ {
+ u16 actualLetter;
+
+ do
+ {
+ personality = Random32();
+ actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 28);
+ }
+ while (nature != GetNatureFromPersonality(personality)
+ || gender != GetGenderFromSpeciesAndPersonality(species, personality)
+ || actualLetter != unownLetter - 1);
+ }
+ else
+ {
+ do
+ {
+ personality = Random32();
+ }
+ while (nature != GetNatureFromPersonality(personality)
+ || gender != GetGenderFromSpeciesAndPersonality(species, personality));
+ }
+
+ CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_PLAYER_ID, 0);
+}
+
+// This is only used to create Wally's Ralts.
+void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level)
+{
+ u32 personality;
+ u32 otId;
+
+ do
+ {
+ otId = Random32();
+ personality = Random32();
+ }
+ while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE);
+ CreateMon(mon, species, level, 32, 1, personality, OT_ID_PRESET, otId);
+}
+
+void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality)
+{
+ CreateMon(mon, species, level, 0, 1, personality, OT_ID_PLAYER_ID, 0);
+ SetMonData(mon, MON_DATA_IVS, &ivs);
+ CalculateMonStats(mon);
+}
+
+void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)
+{
+ CreateMon(mon, species, level, 0, 0, 0, OT_ID_PRESET, otId);
+ SetMonData(mon, MON_DATA_HP_IV, &ivs[0]);
+ SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]);
+ SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]);
+ SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]);
+ SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]);
+ SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]);
+ CalculateMonStats(mon);
+}
+
+void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread)
+{
+ s32 i;
+ s32 statCount = 0;
+ u16 evAmount;
+ u8 evsBits;
+
+ CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0);
+
+ evsBits = evSpread;
+
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ if (evsBits & 1)
+ statCount++;
+ evsBits >>= 1;
+ }
+
+ evAmount = MAX_TOTAL_EVS / statCount;
+
+ evsBits = 1;
+
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ if (evSpread & evsBits)
+ SetMonData(mon, MON_DATA_HP_EV + i, &evAmount);
+ evsBits <<= 1;
+ }
+
+ CalculateMonStats(mon);
+}
+
+void sub_806819C(struct Pokemon *mon, struct UnknownPokemonStruct *src)
+{
+ s32 i;
+ u8 nickname[30];
+ u8 language;
+ u8 value;
+
+ CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId);
+
+ for (i = 0; i < 4; i++)
+ SetMonMoveSlot(mon, src->moves[i], i);
+
+ SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses);
+ SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem);
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship);
+
+ StringCopy(nickname, src->nickname);
+
+ if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN)
+ {
+ language = LANGUAGE_JAPANESE;
+ StripExtCtrlCodes(nickname);
+ }
+ else
+ {
+ language = GAME_LANGUAGE;
+ }
+
+ SetMonData(mon, MON_DATA_LANGUAGE, &language);
+ SetMonData(mon, MON_DATA_NICKNAME, nickname);
+ SetMonData(mon, MON_DATA_HP_EV, &src->hpEV);
+ SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV);
+ SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV);
+ SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV);
+ SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV);
+ SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV);
+ value = src->altAbility;
+ SetMonData(mon, MON_DATA_ALT_ABILITY, &value);
+ value = src->hpIV;
+ SetMonData(mon, MON_DATA_HP_IV, &value);
+ value = src->attackIV;
+ SetMonData(mon, MON_DATA_ATK_IV, &value);
+ value = src->defenseIV;
+ SetMonData(mon, MON_DATA_DEF_IV, &value);
+ value = src->speedIV;
+ SetMonData(mon, MON_DATA_SPEED_IV, &value);
+ value = src->spAttackIV;
+ SetMonData(mon, MON_DATA_SPATK_IV, &value);
+ value = src->spDefenseIV;
+ SetMonData(mon, MON_DATA_SPDEF_IV, &value);
+ MonRestorePP(mon);
+ CalculateMonStats(mon);
+}
+
+void sub_8068338(struct Pokemon *mon, struct UnknownPokemonStruct *src, bool8 lvl50)
+{
+ s32 i;
+ u8 nickname[30];
+ u8 level;
+ u8 language;
+ u8 value;
+
+ if (gSaveBlock2Ptr->frontier.chosenLvl != 0)
+ level = BattleFrontierGetOpponentLvl(gSaveBlock2Ptr->frontier.chosenLvl);
+ else if (lvl50)
+ level = 50;
+ else
+ level = src->level;
+
+ CreateMon(mon, src->species, level, 0, 1, src->personality, 1, src->otId);
+
+ for (i = 0; i < 4; i++)
+ SetMonMoveSlot(mon, src->moves[i], i);
+
+ SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses);
+ SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem);
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship);
+
+ StringCopy(nickname, src->nickname);
+
+ if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN)
+ {
+ language = LANGUAGE_JAPANESE;
+ StripExtCtrlCodes(nickname);
+ }
+ else
+ {
+ language = GAME_LANGUAGE;
+ }
+
+ SetMonData(mon, MON_DATA_LANGUAGE, &language);
+ SetMonData(mon, MON_DATA_NICKNAME, nickname);
+ SetMonData(mon, MON_DATA_HP_EV, &src->hpEV);
+ SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV);
+ SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV);
+ SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV);
+ SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV);
+ SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV);
+ value = src->altAbility;
+ SetMonData(mon, MON_DATA_ALT_ABILITY, &value);
+ value = src->hpIV;
+ SetMonData(mon, MON_DATA_HP_IV, &value);
+ value = src->attackIV;
+ SetMonData(mon, MON_DATA_ATK_IV, &value);
+ value = src->defenseIV;
+ SetMonData(mon, MON_DATA_DEF_IV, &value);
+ value = src->speedIV;
+ SetMonData(mon, MON_DATA_SPEED_IV, &value);
+ value = src->spAttackIV;
+ SetMonData(mon, MON_DATA_SPATK_IV, &value);
+ value = src->spDefenseIV;
+ SetMonData(mon, MON_DATA_SPDEF_IV, &value);
+ MonRestorePP(mon);
+ CalculateMonStats(mon);
+}
+
+void sub_8068528(struct Pokemon *mon, const struct UnknownPokemonStruct2 *src, u8 monId)
+{
+ s32 i;
+ u16 evAmount;
+ u8 language;
+ u32 otId = gUnknown_08610970[src->field_0_0].field_30;
+ u32 personality = ((gUnknown_08610970[src->field_0_0].field_30 >> 8) | ((gUnknown_08610970[src->field_0_0].field_30 & 0xFF) << 8))
+ + src->mons[monId].species + src->field_2;
+
+ CreateMon(mon,
+ src->mons[monId].species,
+ BattleFrontierGetOpponentLvl(src->field_0_1 - 1),
+ 0x1F,
+ TRUE,
+ personality,
+ TRUE,
+ otId);
+
+ SetMonData(mon, MON_DATA_HELD_ITEM, &src->mons[monId].item);
+ for (i = 0; i < 4; i++)
+ SetMonMoveSlot(mon, src->mons[monId].moves[i], i);
+
+ evAmount = MAX_TOTAL_EVS / NUM_STATS;
+ for (i = 0; i < NUM_STATS; i++)
+ SetMonData(mon, MON_DATA_HP_EV + i, &evAmount);
+
+ language = src->language;
+ SetMonData(mon, MON_DATA_LANGUAGE, &language);
+ SetMonData(mon, MON_DATA_OT_NAME, sub_81A1650(src->field_0_0, language));
+ CalculateMonStats(mon);
+}
+
+void CreateMonWithEVSpreadPersonalityOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId)
+{
+ s32 i;
+ s32 statCount = 0;
+ u8 evsBits;
+ u16 evAmount;
+
+ // i is reused as personality value
+ do
+ {
+ i = Random32();
+ } while (nature != GetNatureFromPersonality(i));
+
+ CreateMon(mon, species, level, fixedIV, TRUE, i, TRUE, otId);
+ evsBits = evSpread;
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ if (evsBits & 1)
+ statCount++;
+ evsBits >>= 1;
+ }
+
+ evAmount = MAX_TOTAL_EVS / statCount;
+ evsBits = 1;
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ if (evSpread & evsBits)
+ SetMonData(mon, MON_DATA_HP_EV + i, &evAmount);
+ evsBits <<= 1;
+ }
+
+ CalculateMonStats(mon);
+}
+
+void sub_80686FC(struct Pokemon *mon, struct UnknownPokemonStruct *dest)
+{
+ s32 i;
+ u16 heldItem;
+
+ dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);
+
+ if (heldItem == ITEM_ENIGMA_BERRY)
+ heldItem = 0;
+
+ dest->heldItem = heldItem;
+
+ for (i = 0; i < 4; i++)
+ dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL);
+
+ dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL);
+ dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
+ dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+ dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL);
+ dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL);
+ dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL);
+ dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL);
+ dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL);
+ dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL);
+ dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);
+ dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL);
+ dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL);
+ dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL);
+ dest->speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL);
+ dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL);
+ dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL);
+ dest->altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL);
+ dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ GetMonData(mon, MON_DATA_NICKNAME, dest->nickname);
+}
+
+void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
+{
+ bool32 obedient = TRUE;
+
+ CreateMon(mon, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId);
+ SetMonData(mon, MON_DATA_OBEDIENCE, &obedient);
+}
+
+bool8 sub_80688F8(u8 caseId, u8 battlerId)
+{
+ switch (caseId)
+ {
+ case 0:
+ default:
+ return FALSE;
+ case 1:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ break;
+ case 2:
+ break;
+ case 3:
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ return FALSE;
+ if (!gMain.inBattle)
+ return FALSE;
+ if (battlerId == 1 || battlerId == 4 || battlerId == 5)
+ return TRUE;
+ return FALSE;
+ case 4:
+ break;
+ case 5:
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ return FALSE;
+ }
+ else
+ {
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!gMain.inBattle)
+ return FALSE;
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static s32 GetDeoxysStat(struct Pokemon *mon, s32 statId)
+{
+ s32 ivVal, evVal;
+ s32 statValue;
+ u8 nature, statId_;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_20)
+ return 0;
+ if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ return 0;
+
+ ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL);
+ evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL);
+ statValue = (u16)(((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5);
+
+ nature = GetNature(mon);
+ statId_ = statId; // needed to match
+ statValue = ModifyStatByNature(nature, statValue, statId_);
+
+ return statValue;
+}
+
+void SetDeoxysStats(void)
+{
+ s32 i, value;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon *mon = &gPlayerParty[i];
+
+ if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ continue;
+
+ value = GetMonData(mon, MON_DATA_ATK, NULL);
+ SetMonData(mon, MON_DATA_ATK, &value);
+
+ value = GetMonData(mon, MON_DATA_DEF, NULL);
+ SetMonData(mon, MON_DATA_DEF, &value);
+
+ value = GetMonData(mon, MON_DATA_SPEED, NULL);
+ SetMonData(mon, MON_DATA_SPEED, &value);
+
+ value = GetMonData(mon, MON_DATA_SPATK, NULL);
+ SetMonData(mon, MON_DATA_SPATK, &value);
+
+ value = GetMonData(mon, MON_DATA_SPDEF, NULL);
+ SetMonData(mon, MON_DATA_SPDEF, &value);
+ }
+}
+
+u16 sub_8068B48(void)
+{
+ u8 linkId;
+ u32 arrId;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ linkId = gUnknown_0203C7B4 ^ 1;
+ else
+ linkId = GetMultiplayerId() ^ 1;
+
+ arrId = gLinkPlayers[linkId].trainerId & 7;
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return FacilityClassToPicIndex(gUnknown_08329D54[arrId]);
+}
+
+u16 sub_8068BB0(void)
+{
+ u8 linkId;
+ u32 arrId;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ linkId = gUnknown_0203C7B4 ^ 1;
+ else
+ linkId = GetMultiplayerId() ^ 1;
+
+ arrId = gLinkPlayers[linkId].trainerId & 7;
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return gFacilityClassToTrainerClass[gUnknown_08329D54[arrId]];
+}
+
+void CreateObedientEnemyMon(void)
+{
+ s32 species = gSpecialVar_0x8004;
+ s32 level = gSpecialVar_0x8005;
+ s32 itemId = gSpecialVar_0x8006;
+
+ ZeroEnemyPartyMons();
+ CreateObedientMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0);
+ if (itemId)
+ {
+ u8 heldItem[2];
+ heldItem[0] = itemId;
+ heldItem[1] = itemId >> 8;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
+ }
+}
+
+static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
+{
+ u16 checksum = 0;
+ union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0);
+ union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1);
+ union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2);
+ union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3);
+ s32 i;
+
+ for (i = 0; i < 6; i++)
+ checksum += substruct0->raw[i];
+
+ for (i = 0; i < 6; i++)
+ checksum += substruct1->raw[i];
+
+ for (i = 0; i < 6; i++)
+ checksum += substruct2->raw[i];
+
+ for (i = 0; i < 6; i++)
+ checksum += substruct3->raw[i];
+
+ return checksum;
+}
+
+#define CALC_STAT(base, iv, ev, statIndex, field) \
+{ \
+ u8 baseStat = gBaseStats[species].base; \
+ s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \
+ u8 nature = GetNature(mon); \
+ n = ModifyStatByNature(nature, n, statIndex); \
+ SetMonData(mon, field, &n); \
+}
+
+void CalculateMonStats(struct Pokemon *mon)
+{
+ s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL);
+ s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL);
+ s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL);
+ s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL);
+ s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL);
+ s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL);
+ s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL);
+ s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL);
+ s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL);
+ s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL);
+ s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL);
+ s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL);
+ s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL);
+ s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL);
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ s32 level = GetLevelFromMonExp(mon);
+ s32 newMaxHP;
+
+ SetMonData(mon, MON_DATA_LEVEL, &level);
+
+ if (species == SPECIES_SHEDINJA)
+ {
+ newMaxHP = 1;
+ }
+ else
+ {
+ s32 n = 2 * gBaseStats[species].baseHP + hpIV;
+ newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10;
+ }
+
+ gBattleScripting.field_23 = newMaxHP - oldMaxHP;
+ if (gBattleScripting.field_23 == 0)
+ gBattleScripting.field_23 = 1;
+
+ SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP);
+
+ CALC_STAT(baseAttack, attackIV, attackEV, STAT_ATK, MON_DATA_ATK)
+ CALC_STAT(baseDefense, defenseIV, defenseEV, STAT_DEF, MON_DATA_DEF)
+ CALC_STAT(baseSpeed, speedIV, speedEV, STAT_SPEED, MON_DATA_SPEED)
+ CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, STAT_SPATK, MON_DATA_SPATK)
+ CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, STAT_SPDEF, MON_DATA_SPDEF)
+
+ if (species == SPECIES_SHEDINJA)
+ {
+ if (currentHP != 0 || oldMaxHP == 0)
+ currentHP = 1;
+ else
+ return;
+ }
+ else
+ {
+ if (currentHP == 0 && oldMaxHP == 0)
+ currentHP = newMaxHP;
+ else if (currentHP != 0)
+ currentHP += newMaxHP - oldMaxHP;
+ else
+ return;
+ }
+
+ SetMonData(mon, MON_DATA_HP, &currentHP);
+}
+
+void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest)
+{
+ u32 value = 0;
+ dest->box = *src;
+ SetMonData(dest, MON_DATA_STATUS, &value);
+ SetMonData(dest, MON_DATA_HP, &value);
+ SetMonData(dest, MON_DATA_MAX_HP, &value);
+ value = 255;
+ SetMonData(dest, MON_DATA_MAIL, &value);
+ CalculateMonStats(dest);
+}
+
+u8 GetLevelFromMonExp(struct Pokemon *mon)
+{
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
+ s32 level = 1;
+
+ while (level <= MAX_MON_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
+ level++;
+
+ return level - 1;
+}
+
+u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon)
+{
+ u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
+ u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL);
+ s32 level = 1;
+
+ while (level <= MAX_MON_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
+ level++;
+
+ return level - 1;
+}
+
+u16 GiveMoveToMon(struct Pokemon *mon, u16 move)
+{
+ return GiveMoveToBoxMon(&mon->box, move);
+}
+
+u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ {
+ u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL);
+ if (!existingMove)
+ {
+ SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &move);
+ SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp);
+ return move;
+ }
+ if (existingMove == move)
+ return -2;
+ }
+ return -1;
+}
+
+u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!mon->moves[i])
+ {
+ mon->moves[i] = move;
+ mon->pp[i] = gBattleMoves[move].pp;
+ return move;
+ }
+ }
+
+ return -1;
+}
+
+void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot)
+{
+ SetMonData(mon, MON_DATA_MOVE1 + slot, &move);
+ SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp);
+}
+
+void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot)
+{
+ mon->moves[slot] = move;
+ mon->pp[slot] = gBattleMoves[move].pp;
+}
+
+void GiveMonInitialMoveset(struct Pokemon *mon)
+{
+ GiveBoxMonInitialMoveset(&mon->box);
+}
+
+void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
+{
+ u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
+ s32 level = GetLevelFromBoxMonExp(boxMon);
+ s32 i;
+
+ for (i = 0; gLevelUpLearnsets[species][i] != (u16)-1; i++)
+ {
+ u16 moveLevel;
+ u16 move;
+
+ moveLevel = (gLevelUpLearnsets[species][i] & 0xFE00);
+
+ if (moveLevel > (level << 9))
+ break;
+
+ move = (gLevelUpLearnsets[species][i] & 0x1FF);
+
+ if (GiveMoveToBoxMon(boxMon, move) == (u16)-1)
+ DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move);
+ }
+}
+
+u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove)
+{
+ u32 retVal = 0;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL);
+
+ // since you can learn more than one move per level
+ // the game needs to know whether you decided to
+ // learn it or keep the old set to avoid asking
+ // you to learn the same move over and over again
+ if (firstMove)
+ {
+ sLearningMoveTableID = 0;
+
+ while ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) != (level << 9))
+ {
+ sLearningMoveTableID++;
+ if (gLevelUpLearnsets[species][sLearningMoveTableID] == 0xFFFF)
+ return 0;
+ }
+ }
+
+ if ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) == (level << 9))
+ {
+ gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & 0x1FF);
+ sLearningMoveTableID++;
+ retVal = GiveMoveToMon(mon, gMoveToLearn);
+ }
+
+ return retVal;
+}
+
+void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move)
+{
+ s32 i;
+ u16 moves[4];
+ u8 pp[4];
+ u8 ppBonuses;
+
+ for (i = 0; i < 3; i++)
+ {
+ moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL);
+ pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL);
+ }
+
+ ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
+ ppBonuses >>= 2;
+ moves[3] = move;
+ pp[3] = gBattleMoves[move].pp;
+
+ for (i = 0; i < 4; i++)
+ {
+ SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]);
+ SetMonData(mon, MON_DATA_PP1 + i, &pp[i]);
+ }
+
+ SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
+}
+
+void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+{
+ s32 i;
+ u16 moves[4];
+ u8 pp[4];
+ u8 ppBonuses;
+
+ for (i = 0; i < 3; i++)
+ {
+ moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL);
+ pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL);
+ }
+
+ ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL);
+ ppBonuses >>= 2;
+ moves[3] = move;
+ pp[3] = gBattleMoves[move].pp;
+
+ for (i = 0; i < 4; i++)
+ {
+ SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]);
+ SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]);
+ }
+
+ SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses);
+}
+
+#define APPLY_STAT_MOD(var, mon, stat, statIndex) \
+{ \
+ (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)]][0]; \
+ (var) /= (gStatStageRatios)[(mon)->statStages[(statIndex)]][1]; \
+}
+
+s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef)
+{
+ u32 i;
+ s32 damage = 0;
+ s32 damageHelper;
+ u8 type;
+ u16 attack, defense;
+ u16 spAttack, spDefense;
+ u8 defenderHoldEffect;
+ u8 defenderHoldEffectParam;
+ u8 attackerHoldEffect;
+ u8 attackerHoldEffectParam;
+
+ if (!powerOverride)
+ gBattleMovePower = gBattleMoves[move].power;
+ else
+ gBattleMovePower = powerOverride;
+
+ if (!typeOverride)
+ type = gBattleMoves[move].type;
+ else
+ type = typeOverride & 0x3F;
+
+ attack = attacker->attack;
+ defense = defender->defense;
+ spAttack = attacker->spAttack;
+ spDefense = defender->spDefense;
+
+ if (attacker->item == ITEM_ENIGMA_BERRY)
+ {
+ attackerHoldEffect = gEnigmaBerries[battlerIdAtk].holdEffect;
+ attackerHoldEffectParam = gEnigmaBerries[battlerIdAtk].holdEffectParam;
+ }
+ else
+ {
+ attackerHoldEffect = ItemId_GetHoldEffect(attacker->item);
+ attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item);
+ }
+
+ if (defender->item == ITEM_ENIGMA_BERRY)
+ {
+ defenderHoldEffect = gEnigmaBerries[battlerIdDef].holdEffect;
+ defenderHoldEffectParam = gEnigmaBerries[battlerIdDef].holdEffectParam;
+ }
+ else
+ {
+ defenderHoldEffect = ItemId_GetHoldEffect(defender->item);
+ defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item);
+ }
+
+ if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER)
+ attack *= 2;
+
+ if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerIdAtk))
+ attack = (110 * attack) / 100;
+ if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerIdDef))
+ defense = (110 * defense) / 100;
+ if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdAtk))
+ spAttack = (110 * spAttack) / 100;
+ if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdDef))
+ spDefense = (110 * spDefense) / 100;
+
+ for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++)
+ {
+ if (attackerHoldEffect == sHoldEffectToType[i][0]
+ && type == sHoldEffectToType[i][1])
+ {
+ if (IS_TYPE_PHYSICAL(type))
+ attack = (attack * (attackerHoldEffectParam + 100)) / 100;
+ else
+ spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100;
+ break;
+ }
+ }
+
+ if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND)
+ attack = (150 * attack) / 100;
+ if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS))
+ spAttack = (150 * spAttack) / 100;
+ if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS))
+ spDefense = (150 * spDefense) / 100;
+ if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL)
+ spAttack *= 2;
+ if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL)
+ spDefense *= 2;
+ if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU)
+ spAttack *= 2;
+ if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO)
+ defense *= 2;
+ if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK))
+ attack *= 2;
+ if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE))
+ spAttack /= 2;
+ if (attacker->ability == ABILITY_HUSTLE)
+ attack = (150 * attack) / 100;
+ if (attacker->ability == ABILITY_PLUS && ABILITY_ON_FIELD2(ABILITY_MINUS))
+ spAttack = (150 * spAttack) / 100;
+ if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD2(ABILITY_PLUS))
+ spAttack = (150 * spAttack) / 100;
+ if (attacker->ability == ABILITY_GUTS && attacker->status1)
+ attack = (150 * attack) / 100;
+ if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1)
+ defense = (150 * defense) / 100;
+ if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFD, 0))
+ gBattleMovePower /= 2;
+ if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFE, 0))
+ gBattleMovePower /= 2;
+ if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3))
+ gBattleMovePower = (150 * gBattleMovePower) / 100;
+ if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3))
+ gBattleMovePower = (150 * gBattleMovePower) / 100;
+ if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3))
+ gBattleMovePower = (150 * gBattleMovePower) / 100;
+ if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3))
+ gBattleMovePower = (150 * gBattleMovePower) / 100;
+ if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION)
+ defense /= 2;
+
+ if (IS_TYPE_PHYSICAL(type))
+ {
+ if (gCritMultiplier == 2)
+ {
+ if (attacker->statStages[STAT_ATK] > 6)
+ APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)
+ else
+ damage = attack;
+ }
+ else
+ APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)
+
+ damage = damage * gBattleMovePower;
+ damage *= (2 * attacker->level / 5 + 2);
+
+ if (gCritMultiplier == 2)
+ {
+ if (defender->statStages[STAT_DEF] < 6)
+ APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)
+ else
+ damageHelper = defense;
+ }
+ else
+ APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)
+
+ damage = damage / damageHelper;
+ damage /= 50;
+
+ if ((attacker->status1 & STATUS1_BURN) && attacker->ability != ABILITY_GUTS)
+ damage /= 2;
+
+ if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
+ {
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(2) == 2)
+ damage = 2 * (damage / 3);
+ else
+ damage /= 2;
+ }
+
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(2) == 2)
+ damage /= 2;
+
+ // moves always do at least 1 damage.
+ if (damage == 0)
+ damage = 1;
+ }
+
+ if (type == TYPE_MYSTERY)
+ damage = 0; // is ??? type. does 0 damage.
+
+ if (IS_TYPE_SPECIAL(type))
+ {
+ if (gCritMultiplier == 2)
+ {
+ if (attacker->statStages[STAT_SPATK] > 6)
+ APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)
+ else
+ damage = spAttack;
+ }
+ else
+ APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)
+
+ damage = damage * gBattleMovePower;
+ damage *= (2 * attacker->level / 5 + 2);
+
+ if (gCritMultiplier == 2)
+ {
+ if (defender->statStages[STAT_SPDEF] < 6)
+ APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)
+ else
+ damageHelper = spDefense;
+ }
+ else
+ APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)
+
+ damage = (damage / damageHelper);
+ damage /= 50;
+
+ if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1)
+ {
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(2) == 2)
+ damage = 2 * (damage / 3);
+ else
+ damage /= 2;
+ }
+
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(2) == 2)
+ damage /= 2;
+
+ // are effects of weather negated with cloud nine or air lock
+ if (WEATHER_HAS_EFFECT2)
+ {
+ if (gBattleWeather & WEATHER_RAIN_TEMPORARY)
+ {
+ switch (type)
+ {
+ case TYPE_FIRE:
+ damage /= 2;
+ break;
+ case TYPE_WATER:
+ damage = (15 * damage) / 10;
+ break;
+ }
+ }
+
+ // any weather except sun weakens solar beam
+ if ((gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_HAIL)) && gCurrentMove == MOVE_SOLAR_BEAM)
+ damage /= 2;
+
+ // sunny
+ if (gBattleWeather & WEATHER_SUN_ANY)
+ {
+ switch (type)
+ {
+ case TYPE_FIRE:
+ damage = (15 * damage) / 10;
+ break;
+ case TYPE_WATER:
+ damage /= 2;
+ break;
+ }
+ }
+ }
+
+ // flash fire triggered
+ if ((gBattleResources->flags->flags[battlerIdAtk] & UNKNOWN_FLAG_FLASH_FIRE) && type == TYPE_FIRE)
+ damage = (15 * damage) / 10;
+ }
+
+ return damage + 2;
+}
+
+u8 CountAliveMonsInBattle(u8 caseId)
+{
+ s32 i;
+ u8 retVal = 0;
+
+ switch (caseId)
+ {
+ case BATTLE_ALIVE_EXCEPT_ACTIVE:
+ for (i = 0; i < 4; i++)
+ {
+ if (i != gActiveBattler && !(gAbsentBattlerFlags & gBitTable[i]))
+ retVal++;
+ }
+ break;
+ case BATTLE_ALIVE_ATK_SIDE:
+ for (i = 0; i < 4; i++)
+ {
+ if (GetBattlerSide(i) == GetBattlerSide(gBattlerAttacker) && !(gAbsentBattlerFlags & gBitTable[i]))
+ retVal++;
+ }
+ break;
+ case BATTLE_ALIVE_DEF_SIDE:
+ for (i = 0; i < 4; i++)
+ {
+ if (GetBattlerSide(i) == GetBattlerSide(gBattlerTarget) && !(gAbsentBattlerFlags & gBitTable[i]))
+ retVal++;
+ }
+ break;
+ }
+
+ return retVal;
+}
+
+static bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId)
+{
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
+ return FALSE;
+ else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
+ return FALSE;
+ else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == TRAINER_SECRET_BASE)
+ return FALSE;
+ else if (FlagGet(badgeFlag))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 GetDefaultMoveTarget(u8 battlerId)
+{
+ u8 opposing = BATTLE_OPPOSITE(GetBattlerPosition(battlerId) & BIT_SIDE);
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ return GetBattlerAtPosition(opposing);
+ if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1)
+ {
+ u8 position;
+
+ if ((Random() & 1) == 0)
+ position = BATTLE_PARTNER(opposing);
+ else
+ position = opposing;
+
+ return GetBattlerAtPosition(position);
+ }
+ else
+ {
+ if ((gAbsentBattlerFlags & gBitTable[opposing]))
+ return GetBattlerAtPosition(BATTLE_PARTNER(opposing));
+ else
+ return GetBattlerAtPosition(opposing);
+ }
+}
+
+u8 GetMonGender(struct Pokemon *mon)
+{
+ return GetBoxMonGender(&mon->box);
+}
+
+u8 GetBoxMonGender(struct BoxPokemon *boxMon)
+{
+ u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL);
+
+ switch (gBaseStats[species].genderRatio)
+ {
+ case MON_MALE:
+ case MON_FEMALE:
+ case MON_GENDERLESS:
+ return gBaseStats[species].genderRatio;
+ }
+
+ if (gBaseStats[species].genderRatio > (personality & 0xFF))
+ return MON_FEMALE;
+ else
+ return MON_MALE;
+}
+
+u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality)
+{
+ switch (gBaseStats[species].genderRatio)
+ {
+ case MON_MALE:
+ case MON_FEMALE:
+ case MON_GENDERLESS:
+ return gBaseStats[species].genderRatio;
+ }
+
+ if (gBaseStats[species].genderRatio > (personality & 0xFF))
+ return MON_FEMALE;
+ else
+ return MON_MALE;
+}
+
+void SetMultiuseSpriteTemplateToPokemon(u16 species, u8 battlerPosition)
+{
+ if (gMonSpritesGfxPtr != NULL)
+ gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];
+ else if (gUnknown_020249B4[0])
+ gMultiuseSpriteTemplate = gUnknown_020249B4[0]->templates[battlerPosition];
+ else if (gUnknown_020249B4[1])
+ gMultiuseSpriteTemplate = gUnknown_020249B4[1]->templates[battlerPosition];
+ else
+ gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition];
+
+ gMultiuseSpriteTemplate.paletteTag = species;
+ if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
+ gMultiuseSpriteTemplate.anims = gPlayerMonSpriteAnimsTable;
+ else if (species > 500)
+ gMultiuseSpriteTemplate.anims = gMonAnimationsSpriteAnimsPtrTable[species - 500];
+ else
+ gMultiuseSpriteTemplate.anims = gMonAnimationsSpriteAnimsPtrTable[species];
+}
+
+void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition)
+{
+ gMultiuseSpriteTemplate.paletteTag = trainerSpriteId;
+ if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
+ {
+ gMultiuseSpriteTemplate = gUnknown_08329DF8[trainerSpriteId];
+ gMultiuseSpriteTemplate.anims = gUnknown_08305D0C[trainerSpriteId];
+ }
+ else
+ {
+ if (gMonSpritesGfxPtr != NULL)
+ gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];
+ else
+ gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition];
+ gMultiuseSpriteTemplate.anims = gUnknown_0830536C[trainerSpriteId];
+ }
+}
+
+void SetMultiuseSpriteTemplateToTrainerFront(u16 arg0, u8 battlerPosition)
+{
+ if (gMonSpritesGfxPtr != NULL)
+ gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];
+ else
+ gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition];
+
+ gMultiuseSpriteTemplate.paletteTag = arg0;
+ gMultiuseSpriteTemplate.anims = gUnknown_0830536C[arg0];
+}
+
+static void EncryptBoxMon(struct BoxPokemon *boxMon)
+{
+ u32 i;
+ for (i = 0; i < 12; i++)
+ {
+ boxMon->secure.raw[i] ^= boxMon->personality;
+ boxMon->secure.raw[i] ^= boxMon->otId;
+ }
+}
+
+static void DecryptBoxMon(struct BoxPokemon *boxMon)
+{
+ u32 i;
+ for (i = 0; i < 12; i++)
+ {
+ boxMon->secure.raw[i] ^= boxMon->otId;
+ boxMon->secure.raw[i] ^= boxMon->personality;
+ }
+}
+
+#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \
+case n: \
+ { \
+ union PokemonSubstruct *substructs0 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs1 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs2 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs3 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs4 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs5 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs6 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs7 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs8 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs9 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs10 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs11 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs12 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs13 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs14 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs15 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs16 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs17 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs18 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs19 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs20 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs21 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs22 = boxMon->secure.substructs; \
+ union PokemonSubstruct *substructs23 = boxMon->secure.substructs; \
+ \
+ switch (substructType) \
+ { \
+ case 0: \
+ substruct = &substructs ## n [v1]; \
+ break; \
+ case 1: \
+ substruct = &substructs ## n [v2]; \
+ break; \
+ case 2: \
+ substruct = &substructs ## n [v3]; \
+ break; \
+ case 3: \
+ substruct = &substructs ## n [v4]; \
+ break; \
+ } \
+ break; \
+ } \
+
+
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
+{
+ union PokemonSubstruct *substruct = NULL;
+
+ switch (personality % 24)
+ {
+ SUBSTRUCT_CASE( 0,0,1,2,3)
+ SUBSTRUCT_CASE( 1,0,1,3,2)
+ SUBSTRUCT_CASE( 2,0,2,1,3)
+ SUBSTRUCT_CASE( 3,0,3,1,2)
+ SUBSTRUCT_CASE( 4,0,2,3,1)
+ SUBSTRUCT_CASE( 5,0,3,2,1)
+ SUBSTRUCT_CASE( 6,1,0,2,3)
+ SUBSTRUCT_CASE( 7,1,0,3,2)
+ SUBSTRUCT_CASE( 8,2,0,1,3)
+ SUBSTRUCT_CASE( 9,3,0,1,2)
+ SUBSTRUCT_CASE(10,2,0,3,1)
+ SUBSTRUCT_CASE(11,3,0,2,1)
+ SUBSTRUCT_CASE(12,1,2,0,3)
+ SUBSTRUCT_CASE(13,1,3,0,2)
+ SUBSTRUCT_CASE(14,2,1,0,3)
+ SUBSTRUCT_CASE(15,3,1,0,2)
+ SUBSTRUCT_CASE(16,2,3,0,1)
+ SUBSTRUCT_CASE(17,3,2,0,1)
+ SUBSTRUCT_CASE(18,1,2,3,0)
+ SUBSTRUCT_CASE(19,1,3,2,0)
+ SUBSTRUCT_CASE(20,2,1,3,0)
+ SUBSTRUCT_CASE(21,3,1,2,0)
+ SUBSTRUCT_CASE(22,2,3,1,0)
+ SUBSTRUCT_CASE(23,3,2,1,0)
+ }
+
+ return substruct;
+}
+
+u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
+{
+ u32 ret;
+
+ switch (field)
+ {
+ case MON_DATA_STATUS:
+ ret = mon->status;
+ break;
+ case MON_DATA_LEVEL:
+ ret = mon->level;
+ break;
+ case MON_DATA_HP:
+ ret = mon->hp;
+ break;
+ case MON_DATA_MAX_HP:
+ ret = mon->maxHP;
+ break;
+ case MON_DATA_ATK:
+ ret = (u16)GetDeoxysStat(mon, STAT_ATK);
+ if (!ret)
+ ret = mon->attack;
+ break;
+ case MON_DATA_DEF:
+ ret = (u16)GetDeoxysStat(mon, STAT_DEF);
+ if (!ret)
+ ret = mon->defense;
+ break;
+ case MON_DATA_SPEED:
+ ret = (u16)GetDeoxysStat(mon, STAT_SPEED);
+ if (!ret)
+ ret = mon->speed;
+ break;
+ case MON_DATA_SPATK:
+ ret = (u16)GetDeoxysStat(mon, STAT_SPATK);
+ if (!ret)
+ ret = mon->spAttack;
+ break;
+ case MON_DATA_SPDEF:
+ ret = (u16)GetDeoxysStat(mon, STAT_SPDEF);
+ if (!ret)
+ ret = mon->spDefense;
+ break;
+ case MON_DATA_ATK2:
+ ret = mon->attack;
+ break;
+ case MON_DATA_DEF2:
+ ret = mon->defense;
+ break;
+ case MON_DATA_SPEED2:
+ ret = mon->speed;
+ break;
+ case MON_DATA_SPATK2:
+ ret = mon->spAttack;
+ break;
+ case MON_DATA_SPDEF2:
+ ret = mon->spDefense;
+ break;
+ case MON_DATA_MAIL:
+ ret = mon->mail;
+ break;
+ default:
+ ret = GetBoxMonData(&mon->box, field, data);
+ break;
+ }
+ return ret;
+}
+
+u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
+{
+ s32 i;
+ u32 retVal = 0;
+ struct PokemonSubstruct0 *substruct0 = NULL;
+ struct PokemonSubstruct1 *substruct1 = NULL;
+ struct PokemonSubstruct2 *substruct2 = NULL;
+ struct PokemonSubstruct3 *substruct3 = NULL;
+
+ if (field > MON_DATA_10)
+ {
+ substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0);
+ substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1);
+ substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2);
+ substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3);
+
+ DecryptBoxMon(boxMon);
+
+ if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum)
+ {
+ boxMon->isBadEgg = 1;
+ boxMon->isEgg = 1;
+ substruct3->isEgg = 1;
+ }
+ }
+
+ switch (field)
+ {
+ case MON_DATA_PERSONALITY:
+ retVal = boxMon->personality;
+ break;
+ case MON_DATA_OT_ID:
+ retVal = boxMon->otId;
+ break;
+ case MON_DATA_NICKNAME:
+ {
+ if (boxMon->isBadEgg)
+ {
+ for (retVal = 0;
+ retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS;
+ data[retVal] = gText_BadEgg[retVal], retVal++) {}
+
+ data[retVal] = EOS;
+ }
+ else if (boxMon->isEgg)
+ {
+ StringCopy(data, gText_EggNickname);
+ retVal = StringLength(data);
+ }
+ else if (boxMon->language == LANGUAGE_JAPANESE)
+ {
+ data[0] = EXT_CTRL_CODE_BEGIN;
+ data[1] = EXT_CTRL_CODE_JPN;
+
+ for (retVal = 2, i = 0;
+ i < 5 && boxMon->nickname[i] != EOS;
+ data[retVal] = boxMon->nickname[i], retVal++, i++) {}
+
+ data[retVal++] = EXT_CTRL_CODE_BEGIN;
+ data[retVal++] = EXT_CTRL_CODE_ENG;
+ data[retVal] = EOS;
+ }
+ else
+ {
+ for (retVal = 0;
+ retVal < POKEMON_NAME_LENGTH;
+ data[retVal] = boxMon->nickname[retVal], retVal++){}
+
+ data[retVal] = EOS;
+ }
+ break;
+ }
+ case MON_DATA_LANGUAGE:
+ retVal = boxMon->language;
+ break;
+ case MON_DATA_SANITY_BIT1:
+ retVal = boxMon->isBadEgg;
+ break;
+ case MON_DATA_SANITY_BIT2:
+ retVal = boxMon->hasSpecies;
+ break;
+ case MON_DATA_SANITY_BIT3:
+ retVal = boxMon->isEgg;
+ break;
+ case MON_DATA_OT_NAME:
+ {
+ retVal = 0;
+
+ while (retVal < OT_NAME_LENGTH)
+ {
+ data[retVal] = boxMon->otName[retVal];
+ retVal++;
+ }
+
+ data[retVal] = EOS;
+ break;
+ }
+ case MON_DATA_MARKINGS:
+ retVal = boxMon->markings;
+ break;
+ case MON_DATA_CHECKSUM:
+ retVal = boxMon->checksum;
+ break;
+ case MON_DATA_10:
+ retVal = boxMon->unknown;
+ break;
+ case MON_DATA_SPECIES:
+ retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species;
+ break;
+ case MON_DATA_HELD_ITEM:
+ retVal = substruct0->heldItem;
+ break;
+ case MON_DATA_EXP:
+ retVal = substruct0->experience;
+ break;
+ case MON_DATA_PP_BONUSES:
+ retVal = substruct0->ppBonuses;
+ break;
+ case MON_DATA_FRIENDSHIP:
+ retVal = substruct0->friendship;
+ break;
+ case MON_DATA_MOVE1:
+ case MON_DATA_MOVE2:
+ case MON_DATA_MOVE3:
+ case MON_DATA_MOVE4:
+ retVal = substruct1->moves[field - MON_DATA_MOVE1];
+ break;
+ case MON_DATA_PP1:
+ case MON_DATA_PP2:
+ case MON_DATA_PP3:
+ case MON_DATA_PP4:
+ retVal = substruct1->pp[field - MON_DATA_PP1];
+ break;
+ case MON_DATA_HP_EV:
+ retVal = substruct2->hpEV;
+ break;
+ case MON_DATA_ATK_EV:
+ retVal = substruct2->attackEV;
+ break;
+ case MON_DATA_DEF_EV:
+ retVal = substruct2->defenseEV;
+ break;
+ case MON_DATA_SPEED_EV:
+ retVal = substruct2->speedEV;
+ break;
+ case MON_DATA_SPATK_EV:
+ retVal = substruct2->spAttackEV;
+ break;
+ case MON_DATA_SPDEF_EV:
+ retVal = substruct2->spDefenseEV;
+ break;
+ case MON_DATA_COOL:
+ retVal = substruct2->cool;
+ break;
+ case MON_DATA_BEAUTY:
+ retVal = substruct2->beauty;
+ break;
+ case MON_DATA_CUTE:
+ retVal = substruct2->cute;
+ break;
+ case MON_DATA_SMART:
+ retVal = substruct2->smart;
+ break;
+ case MON_DATA_TOUGH:
+ retVal = substruct2->tough;
+ break;
+ case MON_DATA_SHEEN:
+ retVal = substruct2->sheen;
+ break;
+ case MON_DATA_POKERUS:
+ retVal = substruct3->pokerus;
+ break;
+ case MON_DATA_MET_LOCATION:
+ retVal = substruct3->metLocation;
+ break;
+ case MON_DATA_MET_LEVEL:
+ retVal = substruct3->metLevel;
+ break;
+ case MON_DATA_MET_GAME:
+ retVal = substruct3->metGame;
+ break;
+ case MON_DATA_POKEBALL:
+ retVal = substruct3->pokeball;
+ break;
+ case MON_DATA_OT_GENDER:
+ retVal = substruct3->otGender;
+ break;
+ case MON_DATA_HP_IV:
+ retVal = substruct3->hpIV;
+ break;
+ case MON_DATA_ATK_IV:
+ retVal = substruct3->attackIV;
+ break;
+ case MON_DATA_DEF_IV:
+ retVal = substruct3->defenseIV;
+ break;
+ case MON_DATA_SPEED_IV:
+ retVal = substruct3->speedIV;
+ break;
+ case MON_DATA_SPATK_IV:
+ retVal = substruct3->spAttackIV;
+ break;
+ case MON_DATA_SPDEF_IV:
+ retVal = substruct3->spDefenseIV;
+ break;
+ case MON_DATA_IS_EGG:
+ retVal = substruct3->isEgg;
+ break;
+ case MON_DATA_ALT_ABILITY:
+ retVal = substruct3->altAbility;
+ break;
+ case MON_DATA_COOL_RIBBON:
+ retVal = substruct3->coolRibbon;
+ break;
+ case MON_DATA_BEAUTY_RIBBON:
+ retVal = substruct3->beautyRibbon;
+ break;
+ case MON_DATA_CUTE_RIBBON:
+ retVal = substruct3->cuteRibbon;
+ break;
+ case MON_DATA_SMART_RIBBON:
+ retVal = substruct3->smartRibbon;
+ break;
+ case MON_DATA_TOUGH_RIBBON:
+ retVal = substruct3->toughRibbon;
+ break;
+ case MON_DATA_CHAMPION_RIBBON:
+ retVal = substruct3->championRibbon;
+ break;
+ case MON_DATA_WINNING_RIBBON:
+ retVal = substruct3->winningRibbon;
+ break;
+ case MON_DATA_VICTORY_RIBBON:
+ retVal = substruct3->victoryRibbon;
+ break;
+ case MON_DATA_ARTIST_RIBBON:
+ retVal = substruct3->artistRibbon;
+ break;
+ case MON_DATA_EFFORT_RIBBON:
+ retVal = substruct3->effortRibbon;
+ break;
+ case MON_DATA_GIFT_RIBBON_1:
+ retVal = substruct3->giftRibbon1;
+ break;
+ case MON_DATA_GIFT_RIBBON_2:
+ retVal = substruct3->giftRibbon2;
+ break;
+ case MON_DATA_GIFT_RIBBON_3:
+ retVal = substruct3->giftRibbon3;
+ break;
+ case MON_DATA_GIFT_RIBBON_4:
+ retVal = substruct3->giftRibbon4;
+ break;
+ case MON_DATA_GIFT_RIBBON_5:
+ retVal = substruct3->giftRibbon5;
+ break;
+ case MON_DATA_GIFT_RIBBON_6:
+ retVal = substruct3->giftRibbon6;
+ break;
+ case MON_DATA_GIFT_RIBBON_7:
+ retVal = substruct3->giftRibbon7;
+ break;
+ case MON_DATA_FATEFUL_ENCOUNTER:
+ retVal = substruct3->fatefulEncounter;
+ break;
+ case MON_DATA_OBEDIENCE:
+ retVal = substruct3->obedient;
+ break;
+ case MON_DATA_SPECIES2:
+ retVal = substruct0->species;
+ if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg))
+ retVal = SPECIES_EGG;
+ break;
+ case MON_DATA_IVS:
+ retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25);
+ break;
+ case MON_DATA_KNOWN_MOVES:
+ if (substruct0->species && !substruct3->isEgg)
+ {
+ u16 *moves = (u16 *)data;
+ s32 i = 0;
+
+ while (moves[i] != 355)
+ {
+ u16 move = moves[i];
+ if (substruct1->moves[0] == move
+ || substruct1->moves[1] == move
+ || substruct1->moves[2] == move
+ || substruct1->moves[3] == move)
+ retVal |= gBitTable[i];
+ i++;
+ }
+ }
+ break;
+ case MON_DATA_RIBBON_COUNT:
+ retVal = 0;
+ if (substruct0->species && !substruct3->isEgg)
+ {
+ retVal += substruct3->coolRibbon;
+ retVal += substruct3->beautyRibbon;
+ retVal += substruct3->cuteRibbon;
+ retVal += substruct3->smartRibbon;
+ retVal += substruct3->toughRibbon;
+ retVal += substruct3->championRibbon;
+ retVal += substruct3->winningRibbon;
+ retVal += substruct3->victoryRibbon;
+ retVal += substruct3->artistRibbon;
+ retVal += substruct3->effortRibbon;
+ retVal += substruct3->giftRibbon1;
+ retVal += substruct3->giftRibbon2;
+ retVal += substruct3->giftRibbon3;
+ retVal += substruct3->giftRibbon4;
+ retVal += substruct3->giftRibbon5;
+ retVal += substruct3->giftRibbon6;
+ retVal += substruct3->giftRibbon7;
+ }
+ break;
+ case MON_DATA_RIBBONS:
+ retVal = 0;
+ if (substruct0->species && !substruct3->isEgg)
+ {
+ retVal = substruct3->championRibbon
+ | (substruct3->coolRibbon << 1)
+ | (substruct3->beautyRibbon << 4)
+ | (substruct3->cuteRibbon << 7)
+ | (substruct3->smartRibbon << 10)
+ | (substruct3->toughRibbon << 13)
+ | (substruct3->winningRibbon << 16)
+ | (substruct3->victoryRibbon << 17)
+ | (substruct3->artistRibbon << 18)
+ | (substruct3->effortRibbon << 19)
+ | (substruct3->giftRibbon1 << 20)
+ | (substruct3->giftRibbon2 << 21)
+ | (substruct3->giftRibbon3 << 22)
+ | (substruct3->giftRibbon4 << 23)
+ | (substruct3->giftRibbon5 << 24)
+ | (substruct3->giftRibbon6 << 25)
+ | (substruct3->giftRibbon7 << 26);
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (field > MON_DATA_10)
+ EncryptBoxMon(boxMon);
+
+ return retVal;
+}
+
+#define SET8(lhs) (lhs) = *data
+#define SET16(lhs) (lhs) = data[0] + (data[1] << 8)
+#define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24)
+
+void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg)
+{
+ const u8 *data = dataArg;
+
+ switch (field)
+ {
+ case MON_DATA_STATUS:
+ SET32(mon->status);
+ break;
+ case MON_DATA_LEVEL:
+ SET8(mon->level);
+ break;
+ case MON_DATA_HP:
+ SET16(mon->hp);
+ break;
+ case MON_DATA_MAX_HP:
+ SET16(mon->maxHP);
+ break;
+ case MON_DATA_ATK:
+ SET16(mon->attack);
+ break;
+ case MON_DATA_DEF:
+ SET16(mon->defense);
+ break;
+ case MON_DATA_SPEED:
+ SET16(mon->speed);
+ break;
+ case MON_DATA_SPATK:
+ SET16(mon->spAttack);
+ break;
+ case MON_DATA_SPDEF:
+ SET16(mon->spDefense);
+ break;
+ case MON_DATA_MAIL:
+ SET8(mon->mail);
+ break;
+ case MON_DATA_SPECIES2:
+ break;
+ default:
+ SetBoxMonData(&mon->box, field, data);
+ break;
+ }
+}
+
+void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg)
+{
+ const u8 *data = dataArg;
+
+ struct PokemonSubstruct0 *substruct0 = NULL;
+ struct PokemonSubstruct1 *substruct1 = NULL;
+ struct PokemonSubstruct2 *substruct2 = NULL;
+ struct PokemonSubstruct3 *substruct3 = NULL;
+
+ if (field > MON_DATA_10)
+ {
+ substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0);
+ substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1);
+ substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2);
+ substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3);
+
+ DecryptBoxMon(boxMon);
+
+ if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum)
+ {
+ boxMon->isBadEgg = 1;
+ boxMon->isEgg = 1;
+ substruct3->isEgg = 1;
+ EncryptBoxMon(boxMon);
+ return;
+ }
+ }
+
+ switch (field)
+ {
+ case MON_DATA_PERSONALITY:
+ SET32(boxMon->personality);
+ break;
+ case MON_DATA_OT_ID:
+ SET32(boxMon->otId);
+ break;
+ case MON_DATA_NICKNAME:
+ {
+ s32 i;
+ for (i = 0; i < POKEMON_NAME_LENGTH; i++)
+ boxMon->nickname[i] = data[i];
+ break;
+ }
+ case MON_DATA_LANGUAGE:
+ SET8(boxMon->language);
+ break;
+ case MON_DATA_SANITY_BIT1:
+ SET8(boxMon->isBadEgg);
+ break;
+ case MON_DATA_SANITY_BIT2:
+ SET8(boxMon->hasSpecies);
+ break;
+ case MON_DATA_SANITY_BIT3:
+ SET8(boxMon->isEgg);
+ break;
+ case MON_DATA_OT_NAME:
+ {
+ s32 i;
+ for (i = 0; i < OT_NAME_LENGTH; i++)
+ boxMon->otName[i] = data[i];
+ break;
+ }
+ case MON_DATA_MARKINGS:
+ SET8(boxMon->markings);
+ break;
+ case MON_DATA_CHECKSUM:
+ SET16(boxMon->checksum);
+ break;
+ case MON_DATA_10:
+ SET16(boxMon->unknown);
+ break;
+ case MON_DATA_SPECIES:
+ {
+ SET16(substruct0->species);
+ if (substruct0->species)
+ boxMon->hasSpecies = 1;
+ else
+ boxMon->hasSpecies = 0;
+ break;
+ }
+ case MON_DATA_HELD_ITEM:
+ SET16(substruct0->heldItem);
+ break;
+ case MON_DATA_EXP:
+ SET32(substruct0->experience);
+ break;
+ case MON_DATA_PP_BONUSES:
+ SET8(substruct0->ppBonuses);
+ break;
+ case MON_DATA_FRIENDSHIP:
+ SET8(substruct0->friendship);
+ break;
+ case MON_DATA_MOVE1:
+ case MON_DATA_MOVE2:
+ case MON_DATA_MOVE3:
+ case MON_DATA_MOVE4:
+ SET16(substruct1->moves[field - MON_DATA_MOVE1]);
+ break;
+ case MON_DATA_PP1:
+ case MON_DATA_PP2:
+ case MON_DATA_PP3:
+ case MON_DATA_PP4:
+ SET8(substruct1->pp[field - MON_DATA_PP1]);
+ break;
+ case MON_DATA_HP_EV:
+ SET8(substruct2->hpEV);
+ break;
+ case MON_DATA_ATK_EV:
+ SET8(substruct2->attackEV);
+ break;
+ case MON_DATA_DEF_EV:
+ SET8(substruct2->defenseEV);
+ break;
+ case MON_DATA_SPEED_EV:
+ SET8(substruct2->speedEV);
+ break;
+ case MON_DATA_SPATK_EV:
+ SET8(substruct2->spAttackEV);
+ break;
+ case MON_DATA_SPDEF_EV:
+ SET8(substruct2->spDefenseEV);
+ break;
+ case MON_DATA_COOL:
+ SET8(substruct2->cool);
+ break;
+ case MON_DATA_BEAUTY:
+ SET8(substruct2->beauty);
+ break;
+ case MON_DATA_CUTE:
+ SET8(substruct2->cute);
+ break;
+ case MON_DATA_SMART:
+ SET8(substruct2->smart);
+ break;
+ case MON_DATA_TOUGH:
+ SET8(substruct2->tough);
+ break;
+ case MON_DATA_SHEEN:
+ SET8(substruct2->sheen);
+ break;
+ case MON_DATA_POKERUS:
+ SET8(substruct3->pokerus);
+ break;
+ case MON_DATA_MET_LOCATION:
+ SET8(substruct3->metLocation);
+ break;
+ case MON_DATA_MET_LEVEL:
+ {
+ u8 metLevel = *data;
+ substruct3->metLevel = metLevel;
+ break;
+ }
+ case MON_DATA_MET_GAME:
+ SET8(substruct3->metGame);
+ break;
+ case MON_DATA_POKEBALL:
+ {
+ u8 pokeball = *data;
+ substruct3->pokeball = pokeball;
+ break;
+ }
+ case MON_DATA_OT_GENDER:
+ SET8(substruct3->otGender);
+ break;
+ case MON_DATA_HP_IV:
+ SET8(substruct3->hpIV);
+ break;
+ case MON_DATA_ATK_IV:
+ SET8(substruct3->attackIV);
+ break;
+ case MON_DATA_DEF_IV:
+ SET8(substruct3->defenseIV);
+ break;
+ case MON_DATA_SPEED_IV:
+ SET8(substruct3->speedIV);
+ break;
+ case MON_DATA_SPATK_IV:
+ SET8(substruct3->spAttackIV);
+ break;
+ case MON_DATA_SPDEF_IV:
+ SET8(substruct3->spDefenseIV);
+ break;
+ case MON_DATA_IS_EGG:
+ SET8(substruct3->isEgg);
+ if (substruct3->isEgg)
+ boxMon->isEgg = 1;
+ else
+ boxMon->isEgg = 0;
+ break;
+ case MON_DATA_ALT_ABILITY:
+ SET8(substruct3->altAbility);
+ break;
+ case MON_DATA_COOL_RIBBON:
+ SET8(substruct3->coolRibbon);
+ break;
+ case MON_DATA_BEAUTY_RIBBON:
+ SET8(substruct3->beautyRibbon);
+ break;
+ case MON_DATA_CUTE_RIBBON:
+ SET8(substruct3->cuteRibbon);
+ break;
+ case MON_DATA_SMART_RIBBON:
+ SET8(substruct3->smartRibbon);
+ break;
+ case MON_DATA_TOUGH_RIBBON:
+ SET8(substruct3->toughRibbon);
+ break;
+ case MON_DATA_CHAMPION_RIBBON:
+ SET8(substruct3->championRibbon);
+ break;
+ case MON_DATA_WINNING_RIBBON:
+ SET8(substruct3->winningRibbon);
+ break;
+ case MON_DATA_VICTORY_RIBBON:
+ SET8(substruct3->victoryRibbon);
+ break;
+ case MON_DATA_ARTIST_RIBBON:
+ SET8(substruct3->artistRibbon);
+ break;
+ case MON_DATA_EFFORT_RIBBON:
+ SET8(substruct3->effortRibbon);
+ break;
+ case MON_DATA_GIFT_RIBBON_1:
+ SET8(substruct3->giftRibbon1);
+ break;
+ case MON_DATA_GIFT_RIBBON_2:
+ SET8(substruct3->giftRibbon2);
+ break;
+ case MON_DATA_GIFT_RIBBON_3:
+ SET8(substruct3->giftRibbon3);
+ break;
+ case MON_DATA_GIFT_RIBBON_4:
+ SET8(substruct3->giftRibbon4);
+ break;
+ case MON_DATA_GIFT_RIBBON_5:
+ SET8(substruct3->giftRibbon5);
+ break;
+ case MON_DATA_GIFT_RIBBON_6:
+ SET8(substruct3->giftRibbon6);
+ break;
+ case MON_DATA_GIFT_RIBBON_7:
+ SET8(substruct3->giftRibbon7);
+ break;
+ case MON_DATA_FATEFUL_ENCOUNTER:
+ SET8(substruct3->fatefulEncounter);
+ break;
+ case MON_DATA_OBEDIENCE:
+ SET8(substruct3->obedient);
+ break;
+ case MON_DATA_IVS:
+ {
+ u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
+ substruct3->hpIV = ivs & 0x1F;
+ substruct3->attackIV = (ivs >> 5) & 0x1F;
+ substruct3->defenseIV = (ivs >> 10) & 0x1F;
+ substruct3->speedIV = (ivs >> 15) & 0x1F;
+ substruct3->spAttackIV = (ivs >> 20) & 0x1F;
+ substruct3->spDefenseIV = (ivs >> 25) & 0x1F;
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (field > MON_DATA_10)
+ {
+ boxMon->checksum = CalculateBoxMonChecksum(boxMon);
+ EncryptBoxMon(boxMon);
+ }
+}
+
+void CopyMon(void *dest, void *src, size_t size)
+{
+ memcpy(dest, src, size);
+}
+
+u8 GiveMonToPlayer(struct Pokemon *mon)
+{
+ s32 i;
+
+ SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName);
+ SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender);
+ SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2Ptr->playerTrainerId);
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE)
+ break;
+ }
+
+ if (i >= PARTY_SIZE)
+ return SendMonToPC(mon);
+
+ CopyMon(&gPlayerParty[i], mon, sizeof(*mon));
+ gPlayerPartyCount = i + 1;
+ return MON_GIVEN_TO_PARTY;
+}
+
+u8 SendMonToPC(struct Pokemon* mon)
+{
+ s32 boxNo, boxPos;
+
+ set_unknown_box_id(VarGet(VAR_STORAGE_UNKNOWN));
+
+ boxNo = StorageGetCurrentBox();
+
+ do
+ {
+ for (boxPos = 0; boxPos < 30; boxPos++)
+ {
+ struct BoxPokemon* checkingMon = GetBoxedMonPtr(boxNo, boxPos);
+ if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE)
+ {
+ MonRestorePP(mon);
+ CopyMon(checkingMon, &mon->box, sizeof(mon->box));
+ gSpecialVar_MonBoxId = boxNo;
+ gSpecialVar_MonBoxPos = boxPos;
+ if (get_unknown_box_id() != boxNo)
+ FlagClear(FLAG_SYS_STORAGE_UNKNOWN_FLAG);
+ VarSet(VAR_STORAGE_UNKNOWN, boxNo);
+ return MON_GIVEN_TO_PC;
+ }
+ }
+
+ boxNo++;
+ if (boxNo == 14)
+ boxNo = 0;
+ } while (boxNo != StorageGetCurrentBox());
+
+ return MON_CANT_GIVE;
+}
+
+u8 CalculatePlayerPartyCount(void)
+{
+ gPlayerPartyCount = 0;
+
+ while (gPlayerPartyCount < 6
+ && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE)
+ {
+ gPlayerPartyCount++;
+ }
+
+ return gPlayerPartyCount;
+}
+
+u8 CalculateEnemyPartyCount(void)
+{
+ gEnemyPartyCount = 0;
+
+ while (gEnemyPartyCount < 6
+ && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE)
+ {
+ gEnemyPartyCount++;
+ }
+
+ return gEnemyPartyCount;
+}
+
+u8 GetMonsStateToDoubles(void)
+{
+ s32 aliveCount = 0;
+ s32 i;
+ CalculatePlayerPartyCount();
+
+ if (gPlayerPartyCount == 1)
+ return gPlayerPartyCount; // PLAYER_HAS_ONE_MON
+
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG
+ && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0
+ && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_NONE)
+ aliveCount++;
+ }
+
+ return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
+}
+
+u8 GetMonsStateToDoubles_2(void)
+{
+ s32 aliveCount = 0;
+ s32 i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL);
+ if (species != SPECIES_EGG && species != SPECIES_NONE
+ && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0)
+ aliveCount++;
+ }
+
+ if (aliveCount == 1)
+ return PLAYER_HAS_ONE_MON; // may have more than one, but only one is alive
+
+ return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
+}
+
+u8 GetAbilityBySpecies(u16 species, bool8 altAbility)
+{
+ if (altAbility)
+ gLastUsedAbility = gBaseStats[species].ability2;
+ else
+ gLastUsedAbility = gBaseStats[species].ability1;
+
+ return gLastUsedAbility;
+}
+
+u8 GetMonAbility(struct Pokemon *mon)
+{
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u8 altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL);
+ return GetAbilityBySpecies(species, altAbility);
+}
+
+void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
+{
+ s32 i, j;
+
+ ZeroEnemyPartyMons();
+ *gBattleResources->secretBase = *secretBaseRecord;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (gBattleResources->secretBase->party.species[i])
+ {
+ CreateMon(&gEnemyParty[i],
+ gBattleResources->secretBase->party.species[i],
+ gBattleResources->secretBase->party.levels[i],
+ 15,
+ 1,
+ gBattleResources->secretBase->party.personality[i],
+ 2,
+ 0);
+
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]);
+
+ for (j = 0; j < 6; j++)
+ SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]);
+
+ for (j = 0; j < 4; j++)
+ {
+ SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * 4 + j]);
+ SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * 4 + j]].pp);
+ }
+ }
+ }
+}
+
+u8 GetSecretBaseTrainerPicIndex(void)
+{
+ u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
+ return gFacilityClassToPicIndex[facilityClass];
+}
+
+u8 GetSecretBaseTrainerClass(void)
+{
+ u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
+ return gFacilityClassToTrainerClass[facilityClass];
+}
+
+bool8 IsPlayerPartyAndPokemonStorageFull(void)
+{
+ s32 i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE)
+ return FALSE;
+
+ return IsPokemonStorageFull();
+}
+
+bool8 IsPokemonStorageFull(void)
+{
+ s32 i, j;
+
+ for (i = 0; i < 14; i++)
+ for (j = 0; j < 30; j++)
+ if (GetBoxMonDataFromAnyBox(i, j, MON_DATA_SPECIES) == SPECIES_NONE)
+ return FALSE;
+
+ return TRUE;
+}
+
+void GetSpeciesName(u8 *name, u16 species)
+{
+ s32 i;
+
+ for (i = 0; i <= POKEMON_NAME_LENGTH; i++)
+ {
+ if (species > NUM_SPECIES)
+ name[i] = gSpeciesNames[0][i];
+ else
+ name[i] = gSpeciesNames[species][i];
+
+ if (name[i] == EOS)
+ break;
+ }
+
+ name[i] = EOS;
+}
+
+u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex)
+{
+ u8 basePP = gBattleMoves[move].pp;
+ return basePP + ((basePP * 20 * ((gUnknown_08329D22[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
+}
+
+void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex)
+{
+ u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
+ ppBonuses &= gUnknown_08329D26[moveIndex];
+ SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
+}
+
+void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex)
+{
+ mon->ppBonuses &= gUnknown_08329D26[moveIndex];
+}
+
+void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
+{
+ u16* hpSwitchout;
+ s32 i;
+ u8 nickname[POKEMON_NAME_LENGTH * 2];
+
+ gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);
+ gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL);
+
+ for (i = 0; i < 4; i++)
+ {
+ gBattleMons[battlerId].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL);
+ gBattleMons[battlerId].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL);
+ }
+
+ gBattleMons[battlerId].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL);
+ gBattleMons[battlerId].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL);
+ gBattleMons[battlerId].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL);
+ gBattleMons[battlerId].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL);
+ gBattleMons[battlerId].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL);
+ gBattleMons[battlerId].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL);
+ gBattleMons[battlerId].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL);
+ gBattleMons[battlerId].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL);
+ gBattleMons[battlerId].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL);
+ gBattleMons[battlerId].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL);
+ gBattleMons[battlerId].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL);
+ gBattleMons[battlerId].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL);
+ gBattleMons[battlerId].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL);
+ gBattleMons[battlerId].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL);
+ gBattleMons[battlerId].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL);
+ gBattleMons[battlerId].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL);
+ gBattleMons[battlerId].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL);
+ gBattleMons[battlerId].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL);
+ gBattleMons[battlerId].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL);
+ gBattleMons[battlerId].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL);
+ gBattleMons[battlerId].altAbility = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ALT_ABILITY, NULL);
+ gBattleMons[battlerId].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL);
+ gBattleMons[battlerId].type1 = gBaseStats[gBattleMons[battlerId].species].type1;
+ gBattleMons[battlerId].type2 = gBaseStats[gBattleMons[battlerId].species].type2;
+ gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].altAbility);
+ GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname);
+ StringCopy10(gBattleMons[battlerId].nickname, nickname);
+ GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName);
+
+ hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)];
+ *hpSwitchout = gBattleMons[battlerId].hp;
+
+ for (i = 0; i < 8; i++)
+ gBattleMons[battlerId].statStages[i] = 6;
+
+ gBattleMons[battlerId].status2 = 0;
+ sub_803FA70(battlerId);
+ ClearTemporarySpeciesSpriteData(battlerId, FALSE);
+}
+
+bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex)
+{
+ return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0);
+}
+
+bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e)
+{
+ u32 dataUnsigned;
+ s32 dataSigned;
+ s32 friendship;
+ s32 cmdIndex;
+ bool8 retVal = TRUE;
+ const u8 *itemEffect;
+ u8 var_3C = 6;
+ u32 var_38;
+ s8 var_34 = 0;
+ u8 holdEffect;
+ u8 battlerId = 4;
+ u32 var_28 = 0;
+ u16 heldItem;
+ u8 r10;
+ u32 r4;
+ u32 r5;
+ s8 r2;
+ u16 evCount;
+
+ heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL);
+ if (heldItem == ITEM_ENIGMA_BERRY)
+ {
+ if (gMain.inBattle)
+ holdEffect = gEnigmaBerries[gBattlerInMenuId].holdEffect;
+ else
+ holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
+ }
+ else
+ {
+ holdEffect = ItemId_GetHoldEffect(heldItem);
+ }
+
+ gPotentialItemEffectBattler = gBattlerInMenuId;
+ if (gMain.inBattle)
+ {
+ gActiveBattler = gBattlerInMenuId;
+ cmdIndex = (GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER);
+ while (cmdIndex < gBattlersCount)
+ {
+ if (gBattlerPartyIndexes[cmdIndex] == partyIndex)
+ {
+ battlerId = cmdIndex;
+ break;
+ }
+ cmdIndex += 2;
+ }
+ }
+ else
+ {
+ gActiveBattler = 0;
+ battlerId = MAX_BATTLERS_COUNT;
+ }
+
+ if (!IS_POKEMON_ITEM(item))
+ return TRUE;
+ if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY)
+ return TRUE;
+
+ if (item == ITEM_ENIGMA_BERRY)
+ {
+ if (gMain.inBattle)
+ itemEffect = gEnigmaBerries[gActiveBattler].itemEffect;
+ else
+ itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
+ }
+ else
+ {
+ itemEffect = gItemEffectTable[item - 13];
+ }
+
+ for (cmdIndex = 0; cmdIndex < 6; cmdIndex++)
+ {
+ switch (cmdIndex)
+ {
+ // status healing effects
+ case 0:
+ if ((itemEffect[cmdIndex] & 0x80)
+ && gMain.inBattle && battlerId != 4 && (gBattleMons[battlerId].status2 & STATUS2_INFATUATION))
+ {
+ gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x30)
+ && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY))
+ {
+ gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0xF)
+ && gBattleMons[gActiveBattler].statStages[STAT_ATK] < 12)
+ {
+ gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[cmdIndex] & 0xF;
+ if (gBattleMons[gActiveBattler].statStages[STAT_ATK] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_ATK] = 12;
+ retVal = FALSE;
+ }
+ break;
+ // in-battle stat boosting effects?
+ case 1:
+ if ((itemEffect[cmdIndex] & 0xF0)
+ && gBattleMons[gActiveBattler].statStages[STAT_DEF] < 12)
+ {
+ gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ if (gBattleMons[gActiveBattler].statStages[STAT_DEF] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_DEF] = 12;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0xF)
+ && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < 12)
+ {
+ gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[cmdIndex] & 0xF;
+ if (gBattleMons[gActiveBattler].statStages[STAT_SPEED] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_SPEED] = 12;
+ retVal = FALSE;
+ }
+ break;
+ // more stat boosting effects?
+ case 2:
+ if ((itemEffect[cmdIndex] & 0xF0)
+ && gBattleMons[gActiveBattler].statStages[STAT_ACC] < 12)
+ {
+ gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4;
+ if (gBattleMons[gActiveBattler].statStages[STAT_ACC] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_ACC] = 12;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0xF)
+ && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < 12)
+ {
+ gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[cmdIndex] & 0xF;
+ if (gBattleMons[gActiveBattler].statStages[STAT_SPATK] > 12)
+ gBattleMons[gActiveBattler].statStages[STAT_SPATK] = 12;
+ retVal = FALSE;
+ }
+ break;
+ case 3:
+ if ((itemEffect[cmdIndex] & 0x80)
+ && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0)
+ {
+ gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x40) // raise level
+ && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_MON_LEVEL)
+ {
+ dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1];
+ SetMonData(mon, MON_DATA_EXP, &dataUnsigned);
+ CalculateMonStats(mon);
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x20)
+ && HealStatusConditions(mon, partyIndex, 7, battlerId) == 0)
+ {
+ if (battlerId != 4)
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
+ retVal = FALSE;
+ }
+ if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battlerId) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battlerId) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battlerId) == 0)
+ retVal = FALSE;
+ if ((itemEffect[cmdIndex] & 1) // heal confusion
+ && gMain.inBattle && battlerId != 4 && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION))
+ {
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
+ retVal = FALSE;
+ }
+ break;
+ // EV, HP, and PP raising effects
+ case 4:
+ r10 = itemEffect[cmdIndex];
+ if (r10 & 0x20)
+ {
+ r10 &= ~0x20;
+ dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gUnknown_08329D22[moveIndex]) >> (moveIndex * 2);
+ var_38 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
+ if (dataUnsigned <= 2 && var_38 > 4)
+ {
+ dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL) + gUnknown_08329D2A[moveIndex];
+ SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned);
+
+ dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - var_38;
+ dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + dataUnsigned;
+ SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned);
+ retVal = FALSE;
+ }
+ }
+ var_38 = 0;
+ while (r10 != 0)
+ {
+ if (r10 & 1)
+ {
+ switch (var_38)
+ {
+ case 0:
+ case 1:
+ evCount = GetMonEVCount(mon);
+ r5 = itemEffect[var_3C];
+ dataSigned = GetMonData(mon, sGetMonDataEVConstants[var_38], NULL);
+ r2 = r5;
+ if (r2 > 0)
+ {
+ if (evCount >= MAX_TOTAL_EVS)
+ return TRUE;
+ if (dataSigned >= 100)
+ break;
+
+ if (dataSigned + r2 > 100)
+ r5 = 100 - (dataSigned + r2) + r2;
+ else
+ r5 = r2;
+
+ if (evCount + r5 > MAX_TOTAL_EVS)
+ r5 += MAX_TOTAL_EVS - (evCount + r5);
+ dataSigned += r5;
+ }
+ else
+ {
+ if (dataSigned == 0)
+ {
+ var_28 = 1;
+ var_3C++;
+ break;
+ }
+ dataSigned += r2;
+ if (dataSigned < 0)
+ dataSigned = 0;
+ }
+ SetMonData(mon, sGetMonDataEVConstants[var_38], &dataSigned);
+ CalculateMonStats(mon);
+ var_3C++;
+ retVal = FALSE;
+ break;
+ case 2:
+ // revive?
+ if (r10 & 0x10)
+ {
+ if (GetMonData(mon, MON_DATA_HP, NULL) != 0)
+ {
+ var_3C++;
+ break;
+ }
+ if (gMain.inBattle)
+ {
+ if (battlerId != 4)
+ {
+ gAbsentBattlerFlags &= ~gBitTable[battlerId];
+ CopyPlayerPartyMonToBattleData(battlerId, pokemon_order_func(gBattlerPartyIndexes[battlerId]));
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.unk4 < 255)
+ gBattleResults.unk4++;
+ }
+ else
+ {
+ gAbsentBattlerFlags &= ~gBitTable[gActiveBattler ^ 2];
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.unk4 < 255)
+ gBattleResults.unk4++;
+ }
+ }
+ }
+ else
+ {
+ if (GetMonData(mon, MON_DATA_HP, NULL) == 0)
+ {
+ var_3C++;
+ break;
+ }
+ }
+ dataUnsigned = itemEffect[var_3C++];
+ switch (dataUnsigned)
+ {
+ case 0xFF:
+ dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL);
+ break;
+ case 0xFE:
+ dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2;
+ if (dataUnsigned == 0)
+ dataUnsigned = 1;
+ break;
+ case 0xFD:
+ dataUnsigned = gBattleScripting.field_23;
+ break;
+ }
+ if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL))
+ {
+ if (e == 0)
+ {
+ dataUnsigned = GetMonData(mon, MON_DATA_HP, NULL) + dataUnsigned;
+ if (dataUnsigned > GetMonData(mon, MON_DATA_MAX_HP, NULL))
+ dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL);
+ SetMonData(mon, MON_DATA_HP, &dataUnsigned);
+ if (gMain.inBattle && battlerId != 4)
+ {
+ gBattleMons[battlerId].hp = dataUnsigned;
+ if (!(r10 & 0x10) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
+ {
+ if (gBattleResults.unk3 < 255)
+ gBattleResults.unk3++;
+ // I have to re-use this variable to match.
+ r5 = gActiveBattler;
+ gActiveBattler = battlerId;
+ BtlController_EmitGetMonData(0, 0, 0);
+ MarkBattlerForControllerExec(gActiveBattler);
+ gActiveBattler = r5;
+ }
+ }
+ }
+ else
+ {
+ gBattleMoveDamage = -dataUnsigned;
+ }
+ retVal = FALSE;
+ }
+ r10 &= 0xEF;
+ break;
+ case 3:
+ if (!(r10 & 2))
+ {
+ for (r5 = 0; (signed)(r5) < (signed)(4); r5++)
+ {
+ u16 moveId;
+
+ dataUnsigned = GetMonData(mon, MON_DATA_PP1 + r5, NULL);
+ moveId = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL);
+ if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5))
+ {
+ dataUnsigned += itemEffect[var_3C];
+ moveId = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL);
+ if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5))
+ {
+ moveId = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL);
+ dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5);
+ }
+ SetMonData(mon, MON_DATA_PP1 + r5, &dataUnsigned);
+ if (gMain.inBattle
+ && battlerId != 4 && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[battlerId].unk18_b & gBitTable[r5]))
+ gBattleMons[battlerId].pp[r5] = dataUnsigned;
+ retVal = FALSE;
+ }
+ }
+ var_3C++;
+ }
+ else
+ {
+ u16 moveId;
+
+ dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL);
+ moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);
+ if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))
+ {
+ dataUnsigned += itemEffect[var_3C++];
+ moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);
+ if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex))
+ {
+ moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL);
+ dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
+ }
+ SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned);
+ if (gMain.inBattle
+ && battlerId != 4 && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[battlerId].unk18_b & gBitTable[moveIndex]))
+ gBattleMons[battlerId].pp[moveIndex] = dataUnsigned;
+ retVal = FALSE;
+ }
+ }
+ break;
+ case 7:
+ {
+ u16 targetSpecies = GetEvolutionTargetSpecies(mon, 2, item);
+
+ if (targetSpecies != SPECIES_NONE)
+ {
+ BeginEvolutionScene(mon, targetSpecies, 0, partyIndex);
+ return FALSE;
+ }
+ }
+ break;
+ }
+ }
+ var_38++;
+ r10 >>= 1;
+ }
+ break;
+ case 5:
+ r10 = itemEffect[cmdIndex];
+ var_38 = 0;
+ while (r10 != 0)
+ {
+ if (r10 & 1)
+ {
+ switch (var_38)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ evCount = GetMonEVCount(mon);
+ r5 = itemEffect[var_3C];
+ dataSigned = GetMonData(mon, sGetMonDataEVConstants[var_38 + 2], NULL);
+ r2 = r5;
+ if (r2 > 0)
+ {
+ if (evCount >= MAX_TOTAL_EVS)
+ return TRUE;
+ if (dataSigned >= 100)
+ break;
+
+ if (dataSigned + r2 > 100)
+ r5 = 100 - (dataSigned + r2) + r2;
+ else
+ r5 = r2;
+
+ if (evCount + r5 > MAX_TOTAL_EVS)
+ r5 += MAX_TOTAL_EVS - (evCount + r5);
+ dataSigned += r5;
+ }
+ else
+ {
+ if (dataSigned == 0)
+ {
+ var_28 = 1;
+ var_3C++;
+ break;
+ }
+ dataSigned += r2;
+ if (dataSigned < 0)
+ dataSigned = 0;
+ }
+ SetMonData(mon, sGetMonDataEVConstants[var_38 + 2], &dataSigned);
+ CalculateMonStats(mon);
+ retVal = FALSE;
+ var_3C++;
+ break;
+ case 4:
+ dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gUnknown_08329D22[moveIndex]) >> (moveIndex * 2);
+ r5 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex);
+ if (dataUnsigned < 3 && r5 > 4)
+ {
+ dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
+ dataUnsigned &= gUnknown_08329D26[moveIndex];
+ dataUnsigned += gUnknown_08329D2A[moveIndex] * 3;
+
+ SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned);
+ dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - r5;
+ dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + dataUnsigned;
+ SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned);
+ retVal = FALSE;
+ }
+ break;
+ case 5:
+ if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0)
+ {
+ var_34 = itemEffect[var_3C];
+ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);
+ if (var_34 > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
+ friendship += 150 * var_34 / 100;
+ else
+ friendship += var_34;
+ if (var_34 > 0)
+ {
+ if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11)
+ friendship++;
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ friendship++;
+ }
+ if (friendship < 0)
+ friendship = 0;
+ if (friendship > 255)
+ friendship = 255;
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
+ retVal = FALSE;
+ }
+ var_3C++;
+ break;
+ case 6:
+ if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200
+ && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0)
+ {
+ var_34 = itemEffect[var_3C];
+ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);
+ if ((s8)(var_34) > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
+ friendship += 150 * var_34 / 100;
+ else
+ friendship += var_34;
+ if (var_34 > 0)
+ {
+ if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11)
+ friendship++;
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ friendship++;
+ }
+ if (friendship < 0)
+ friendship = 0;
+ if (friendship > 255)
+ friendship = 255;
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
+ retVal = FALSE;
+ }
+ var_3C++;
+ break;
+ case 7:
+ if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !sub_806F104() && var_34 == 0)
+ {
+ var_34 = itemEffect[var_3C];
+ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL);
+ if ((s8)(var_34) > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
+ friendship += 150 * var_34 / 100;
+ else
+ friendship += var_34;
+ if (var_34 > 0)
+ {
+ if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11)
+ friendship++;
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ friendship++;
+ }
+ if (friendship < 0)
+ friendship = 0;
+ if (friendship > 255)
+ friendship = 255;
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
+ retVal = FALSE;
+ }
+ var_3C++;
+ break;
+ }
+ }
+ var_38++;
+ r10 >>= 1;
+ }
+ break;
+ }
+ }
+ return retVal;
+}
+
+bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId)
+{
+ u32 status = GetMonData(mon, MON_DATA_STATUS, 0);
+
+ if (status & healMask)
+ {
+ status &= ~healMask;
+ SetMonData(mon, MON_DATA_STATUS, &status);
+ if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT)
+ gBattleMons[battlerId].status1 &= ~healMask;
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
+{
+ const u8 *temp;
+ const u8 *itemEffect;
+ u8 offset;
+ int i;
+ u8 j;
+ u8 val;
+
+ offset = 6;
+
+ temp = gItemEffectTable[itemId - 13];
+
+ if (!temp && itemId != ITEM_ENIGMA_BERRY)
+ return 0;
+
+ if (itemId == ITEM_ENIGMA_BERRY)
+ {
+ temp = gEnigmaBerries[gActiveBattler].itemEffect;
+ }
+
+ itemEffect = temp;
+
+ for (i = 0; i < 6; i++)
+ {
+ switch (i)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ if (i == effectByte)
+ return 0;
+ break;
+ case 4:
+ val = itemEffect[4];
+ if (val & 0x20)
+ val &= 0xDF;
+ j = 0;
+ while (val)
+ {
+ if (val & 1)
+ {
+ switch (j)
+ {
+ case 2:
+ if (val & 0x10)
+ val &= 0xEF;
+ case 0:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 1:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 3:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 7:
+ if (i == effectByte)
+ return 0;
+ break;
+ }
+ }
+ j++;
+ val >>= 1;
+ if (i == effectByte)
+ effectBit >>= 1;
+ }
+ break;
+ case 5:
+ val = itemEffect[5];
+ j = 0;
+ while (val)
+ {
+ if (val & 1)
+ {
+ switch (j)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 7:
+ if (i == effectByte)
+ return 0;
+ break;
+ }
+ }
+ j++;
+ val >>= 1;
+ if (i == effectByte)
+ effectBit >>= 1;
+ }
+ break;
+ }
+ }
+
+ return offset;
+}
+
+static void sub_806CF24(s32 arg0)
+{
+ gBattlerTarget = gBattlerInMenuId;
+ StringCopy(gBattleTextBuff1, gStatNamesTable[gUnknown_08329EC8[arg0]]);
+ StringCopy(gBattleTextBuff2, gText_StatRose);
+ BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnsStatChanged2);
+}
+
+u8 *sub_806CF78(u16 itemId)
+{
+ int i;
+ const u8 *itemEffect;
+
+ if (itemId == ITEM_ENIGMA_BERRY)
+ {
+ if (gMain.inBattle)
+ itemEffect = gEnigmaBerries[gBattlerInMenuId].itemEffect;
+ else
+ itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
+ }
+ else
+ {
+ itemEffect = gItemEffectTable[itemId - 13];
+ }
+
+ gPotentialItemEffectBattler = gBattlerInMenuId;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (itemEffect[i] & 0xF)
+ sub_806CF24(i * 2);
+ if (itemEffect[i] & 0xF0)
+ {
+ if (i)
+ {
+ sub_806CF24(i * 2 + 1);
+ }
+ else
+ {
+ gBattlerAttacker = gBattlerInMenuId;
+ BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnGettingPumped);
+ }
+ }
+ }
+
+ if (itemEffect[3] & 0x80)
+ {
+ gBattlerAttacker = gBattlerInMenuId;
+ BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnShroudedInMist);
+ }
+
+ return gDisplayedStringBattle;
+}
+
+u8 GetNature(struct Pokemon *mon)
+{
+ return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25;
+}
+
+u8 GetNatureFromPersonality(u32 personality)
+{
+ return personality % 25;
+}
+
+u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
+{
+ int i;
+ u16 targetSpecies = 0;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
+ u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
+ u8 level;
+ u16 friendship;
+ u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0);
+ u16 upperPersonality = personality >> 16;
+ u8 holdEffect;
+
+ if (heldItem == ITEM_ENIGMA_BERRY)
+ holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
+ else
+ holdEffect = ItemId_GetHoldEffect(heldItem);
+
+ if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3)
+ return SPECIES_NONE;
+
+ switch (type)
+ {
+ case 0:
+ level = GetMonData(mon, MON_DATA_LEVEL, 0);
+ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);
+
+ for (i = 0; i < EVOS_PER_MON; i++)
+ {
+ switch (gEvolutionTable[species][i].method)
+ {
+ case EVO_FRIENDSHIP:
+ if (friendship >= 220)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_FRIENDSHIP_DAY:
+ RtcCalcLocalTime();
+ if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_FRIENDSHIP_NIGHT:
+ RtcCalcLocalTime();
+ if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_LEVEL:
+ if (gEvolutionTable[species][i].param <= level)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_LEVEL_ATK_GT_DEF:
+ if (gEvolutionTable[species][i].param <= level)
+ if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0))
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_LEVEL_ATK_EQ_DEF:
+ if (gEvolutionTable[species][i].param <= level)
+ if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0))
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_LEVEL_ATK_LT_DEF:
+ if (gEvolutionTable[species][i].param <= level)
+ if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0))
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_LEVEL_SILCOON:
+ if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_LEVEL_CASCOON:
+ if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_LEVEL_NINJASK:
+ if (gEvolutionTable[species][i].param <= level)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_BEAUTY:
+ if (gEvolutionTable[species][i].param <= beauty)
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ }
+ }
+ break;
+ case 1:
+ for (i = 0; i < EVOS_PER_MON; i++)
+ {
+ switch (gEvolutionTable[species][i].method)
+ {
+ case EVO_TRADE:
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ case EVO_TRADE_ITEM:
+ if (gEvolutionTable[species][i].param == heldItem)
+ {
+ heldItem = 0;
+ SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&heldItem);
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ }
+ break;
+ }
+ }
+ break;
+ case 2:
+ case 3:
+ for (i = 0; i < EVOS_PER_MON; i++)
+ {
+ if (gEvolutionTable[species][i].method == EVO_ITEM
+ && gEvolutionTable[species][i].param == evolutionItem)
+ {
+ targetSpecies = gEvolutionTable[species][i].targetSpecies;
+ break;
+ }
+ }
+ break;
+ }
+
+ return targetSpecies;
+}
+
+u16 HoennPokedexNumToSpecies(u16 hoennNum)
+{
+ u16 species;
+
+ if (!hoennNum)
+ return 0;
+
+ species = 0;
+
+ while (species < 411 && gSpeciesToHoennPokedexNum[species] != hoennNum)
+ species++;
+
+ if (species == 411)
+ return 0;
+
+ return species + 1;
+}
+
+u16 NationalPokedexNumToSpecies(u16 nationalNum)
+{
+ u16 species;
+
+ if (!nationalNum)
+ return 0;
+
+ species = 0;
+
+ while (species < 411 && gSpeciesToNationalPokedexNum[species] != nationalNum)
+ species++;
+
+ if (species == 411)
+ return 0;
+
+ return species + 1;
+}
+
+u16 NationalToHoennOrder(u16 nationalNum)
+{
+ u16 hoennNum;
+
+ if (!nationalNum)
+ return 0;
+
+ hoennNum = 0;
+
+ while (hoennNum < 411 && gHoennToNationalOrder[hoennNum] != nationalNum)
+ hoennNum++;
+
+ if (hoennNum == 411)
+ return 0;
+
+ return hoennNum + 1;
+}
+
+u16 SpeciesToNationalPokedexNum(u16 species)
+{
+ if (!species)
+ return 0;
+
+ return gSpeciesToNationalPokedexNum[species - 1];
+}
+
+u16 SpeciesToHoennPokedexNum(u16 species)
+{
+ if (!species)
+ return 0;
+
+ return gSpeciesToHoennPokedexNum[species - 1];
+}
+
+u16 HoennToNationalOrder(u16 hoennNum)
+{
+ if (!hoennNum)
+ return 0;
+
+ return gHoennToNationalOrder[hoennNum - 1];
+}
+
+u16 SpeciesToCryId(u16 species)
+{
+ if (species <= 250)
+ return species;
+
+ if (species < 276)
+ return 200;
+
+ return gSpeciesIdToCryId[species - 276];
+}
+
+void sub_806D544(u16 species, u32 personality, u8 *dest)
+{
+ if (species == SPECIES_SPINDA
+ && dest != gMonSpritesGfxPtr->sprites[0]
+ && dest != gMonSpritesGfxPtr->sprites[2])
+ {
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ int j;
+ u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
+ u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
+
+ for (j = 0; j < 16; j++)
+ {
+ int k;
+ s32 row = gSpindaSpotGraphics[i].image[j];
+
+ for (k = x; k < x + 16; k++)
+ {
+ u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2);
+
+ if (row & 1)
+ {
+ if (k & 1)
+ {
+ if ((u8)((*val & 0xF0) - 0x10) <= 0x20)
+ *val += 0x40;
+ }
+ else
+ {
+ if ((u8)((*val & 0xF) - 0x01) <= 0x02)
+ *val += 0x04;
+ }
+ }
+
+ row >>= 1;
+ }
+
+ y++;
+ }
+
+ personality >>= 8;
+ }
+ }
+}
+
+void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4)
+{
+ if (species == SPECIES_SPINDA && a4)
+ {
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ int j;
+ u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
+ u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
+
+ for (j = 0; j < 16; j++)
+ {
+ int k;
+ s32 row = gSpindaSpotGraphics[i].image[j];
+
+ for (k = x; k < x + 16; k++)
+ {
+ u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2);
+
+ if (row & 1)
+ {
+ if (k & 1)
+ {
+ if ((u8)((*val & 0xF0) - 0x10) <= 0x20)
+ *val += 0x40;
+ }
+ else
+ {
+ if ((u8)((*val & 0xF) - 0x01) <= 0x02)
+ *val += 0x04;
+ }
+ }
+
+ row >>= 1;
+ }
+
+ y++;
+ }
+
+ personality >>= 8;
+ }
+ }
+}
+
+void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies)
+{
+ u8 language;
+ GetMonData(mon, MON_DATA_NICKNAME, gStringVar1);
+ language = GetMonData(mon, MON_DATA_LANGUAGE, &language);
+ if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[oldSpecies], gStringVar1))
+ SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]);
+}
+
+bool8 sub_806D7EC(void)
+{
+ bool8 retVal = FALSE;
+ switch (gLinkPlayers[GetMultiplayerId()].id)
+ {
+ case 0:
+ case 3:
+ retVal = FALSE;
+ break;
+ case 1:
+ case 2:
+ retVal = TRUE;
+ break;
+ }
+ return retVal;
+}
+
+u16 GetLinkTrainerFlankId(u8 linkPlayerId)
+{
+ u16 flankId = 0;
+ switch (gLinkPlayers[linkPlayerId].id)
+ {
+ case 0:
+ case 3:
+ flankId = 0;
+ break;
+ case 1:
+ case 2:
+ flankId = 1;
+ break;
+ }
+ return flankId;
+}
+
+s32 GetBattlerMultiplayerId(u16 a1)
+{
+ s32 id;
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ if (gLinkPlayers[id].id == a1)
+ break;
+ return id;
+}
+
+u8 GetTrainerEncounterMusicId(u16 trainerOpponentId)
+{
+ if (InBattlePyramid())
+ return GetTrainerEncounterMusicIdInBattlePyramind(trainerOpponentId);
+ else if (sub_81D5C18())
+ return sub_81D63C8(trainerOpponentId);
+ else
+ return TRAINER_ENCOUNTER_MUSIC(trainerOpponentId);
+}
+
+u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
+{
+ if (statIndex < 1 || statIndex > 5)
+ {
+ // Should just be "return n", but it wouldn't match without this.
+ u16 retVal = n;
+ retVal++;
+ retVal--;
+ return retVal;
+ }
+
+ switch (gNatureStatTable[nature][statIndex - 1])
+ {
+ case 1:
+ return (u16)(n * 110) / 100;
+ case -1:
+ return (u16)(n * 90) / 100;
+ }
+
+ return n;
+}
+
+void AdjustFriendship(struct Pokemon *mon, u8 event)
+{
+ u16 species, heldItem;
+ u8 holdEffect;
+
+ if (sub_806F104())
+ return;
+
+ species = GetMonData(mon, MON_DATA_SPECIES2, 0);
+ heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
+
+ if (heldItem == ITEM_ENIGMA_BERRY)
+ {
+ if (gMain.inBattle)
+ holdEffect = gEnigmaBerries[0].holdEffect;
+ else
+ holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
+ }
+ else
+ {
+ holdEffect = ItemId_GetHoldEffect(heldItem);
+ }
+
+ if (species && species != SPECIES_EGG)
+ {
+ u8 friendshipLevel = 0;
+ s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);
+ if (friendship > 99)
+ friendshipLevel++;
+ if (friendship > 199)
+ friendshipLevel++;
+ if ((event != 5 || !(Random() & 1))
+ && (event != 3
+ || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR
+ || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER
+ || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION))))
+ {
+ s8 mod = gUnknown_08329ECE[event][friendshipLevel];
+ if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
+ mod = (150 * mod) / 100;
+ friendship += mod;
+ if (mod > 0)
+ {
+ if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL)
+ friendship++;
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name())
+ friendship++;
+ }
+ if (friendship < 0)
+ friendship = 0;
+ if (friendship > 255)
+ friendship = 255;
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
+ }
+ }
+}
+
+void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies)
+{
+ u8 evs[NUM_STATS];
+ u16 evIncrease = 0;
+ u16 totalEVs = 0;
+ u16 heldItem;
+ u8 holdEffect;
+ int i;
+
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0);
+ totalEVs += evs[i];
+ }
+
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ u8 hasHadPokerus;
+ int multiplier;
+
+ if (totalEVs >= MAX_TOTAL_EVS)
+ break;
+
+ hasHadPokerus = CheckPartyHasHadPokerus(mon, 0);
+
+ if (hasHadPokerus)
+ multiplier = 2;
+ else
+ multiplier = 1;
+
+ switch (i)
+ {
+ case 0:
+ evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier;
+ break;
+ case 1:
+ evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier;
+ break;
+ case 2:
+ evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier;
+ break;
+ case 3:
+ evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier;
+ break;
+ case 4:
+ evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier;
+ break;
+ case 5:
+ evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier;
+ break;
+ }
+
+ heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
+
+ if (heldItem == ITEM_ENIGMA_BERRY)
+ {
+ if (gMain.inBattle)
+ holdEffect = gEnigmaBerries[0].holdEffect;
+ else
+ holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
+ }
+ else
+ {
+ holdEffect = ItemId_GetHoldEffect(heldItem);
+ }
+
+ if (holdEffect == HOLD_EFFECT_MACHO_BRACE)
+ evIncrease *= 2;
+
+ if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS)
+ evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease);
+
+ if (evs[i] + (s16)evIncrease > 255)
+ {
+ int val1 = (s16)evIncrease + 255;
+ int val2 = evs[i] + evIncrease;
+ evIncrease = val1 - val2;
+ }
+
+ evs[i] += evIncrease;
+ totalEVs += evIncrease;
+ SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]);
+ }
+}
+
+u16 GetMonEVCount(struct Pokemon *mon)
+{
+ int i;
+ u16 count = 0;
+
+ for (i = 0; i < NUM_STATS; i++)
+ count += GetMonData(mon, MON_DATA_HP_EV + i, 0);
+
+ return count;
+}
+
+void RandomlyGivePartyPokerus(struct Pokemon *party)
+{
+ u16 rnd = Random();
+ if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000)
+ {
+ struct Pokemon *mon;
+
+ do
+ {
+ do
+ {
+ rnd = Random() % PARTY_SIZE;
+ mon = &party[rnd];
+ }
+ while (!GetMonData(mon, MON_DATA_SPECIES, 0));
+ }
+ while (GetMonData(mon, MON_DATA_IS_EGG, 0));
+
+ if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd])))
+ {
+ u8 rnd2;
+
+ do
+ {
+ rnd2 = Random();
+ }
+ while ((rnd2 & 0x7) == 0);
+
+ if (rnd2 & 0xF0)
+ rnd2 &= 0x7;
+
+ rnd2 |= (rnd2 << 4);
+ rnd2 &= 0xF3;
+ rnd2++;
+
+ SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2);
+ }
+ }
+}
+
+u8 CheckPartyPokerus(struct Pokemon *party, u8 selection)
+{
+ u8 retVal;
+
+ int partyIndex = 0;
+ unsigned curBit = 1;
+ retVal = 0;
+
+ if (selection)
+ {
+ do
+ {
+ if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF))
+ retVal |= curBit;
+ partyIndex++;
+ curBit <<= 1;
+ selection >>= 1;
+ }
+ while (selection);
+ }
+ else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF)
+ {
+ retVal = 1;
+ }
+
+ return retVal;
+}
+
+u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection)
+{
+ u8 retVal;
+
+ int partyIndex = 0;
+ unsigned curBit = 1;
+ retVal = 0;
+
+ if (selection)
+ {
+ do
+ {
+ if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0))
+ retVal |= curBit;
+ partyIndex++;
+ curBit <<= 1;
+ selection >>= 1;
+ }
+ while (selection);
+ }
+ else if (GetMonData(&party[0], MON_DATA_POKERUS, 0))
+ {
+ retVal = 1;
+ }
+
+ return retVal;
+}
+
+void UpdatePartyPokerusTime(u16 days)
+{
+ int i;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0))
+ {
+ u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0);
+ if (pokerus & 0xF)
+ {
+ if ((pokerus & 0xF) < days || days > 4)
+ pokerus &= 0xF0;
+ else
+ pokerus -= days;
+
+ if (pokerus == 0)
+ pokerus = 0x10;
+
+ SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus);
+ }
+ }
+ }
+}
+
+void PartySpreadPokerus(struct Pokemon *party)
+{
+ if ((Random() % 3) == 0)
+ {
+ int i;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&party[i], MON_DATA_SPECIES, 0))
+ {
+ u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0);
+ u8 curPokerus = pokerus;
+ if (pokerus)
+ {
+ if (pokerus & 0xF)
+ {
+ // Spread to adjacent party members.
+ if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0))
+ SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus);
+ if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0))
+ {
+ SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus);
+ i++;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+bool8 TryIncrementMonLevel(struct Pokemon *mon)
+{
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
+ u8 nextLevel = GetMonData(mon, MON_DATA_LEVEL, 0) + 1;
+ u32 expPoints = GetMonData(mon, MON_DATA_EXP, 0);
+ if (expPoints > gExperienceTables[gBaseStats[species].growthRate][MAX_MON_LEVEL])
+ {
+ expPoints = gExperienceTables[gBaseStats[species].growthRate][MAX_MON_LEVEL];
+ SetMonData(mon, MON_DATA_EXP, &expPoints);
+ }
+ if (nextLevel > MAX_MON_LEVEL || expPoints < gExperienceTables[gBaseStats[species].growthRate][nextLevel])
+ {
+ return FALSE;
+ }
+ else
+ {
+ SetMonData(mon, MON_DATA_LEVEL, &nextLevel);
+ return TRUE;
+ }
+}
+
+u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm)
+{
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
+ if (species == SPECIES_EGG)
+ {
+ return 0;
+ }
+ else if (tm < 32)
+ {
+ u32 mask = 1 << tm;
+ return gTMHMLearnsets[species][0] & mask;
+ }
+ else
+ {
+ u32 mask = 1 << (tm - 32);
+ return gTMHMLearnsets[species][1] & mask;
+ }
+}
+
+u32 CanSpeciesLearnTMHM(u16 species, u8 tm)
+{
+ if (species == SPECIES_EGG)
+ {
+ return 0;
+ }
+ else if (tm < 32)
+ {
+ u32 mask = 1 << tm;
+ return gTMHMLearnsets[species][0] & mask;
+ }
+ else
+ {
+ u32 mask = 1 << (tm - 32);
+ return gTMHMLearnsets[species][1] & mask;
+ }
+}
+
+u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves)
+{
+ u16 learnedMoves[4];
+ u8 numMoves = 0;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
+ u8 level = GetMonData(mon, MON_DATA_LEVEL, 0);
+ int i, j, k;
+
+ for (i = 0; i < 4; i++)
+ learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0);
+
+ for (i = 0; i < 20; i++)
+ {
+ u16 moveLevel;
+
+ if (gLevelUpLearnsets[species][i] == 0xFFFF)
+ break;
+
+ moveLevel = gLevelUpLearnsets[species][i] & 0xFE00;
+
+ if (moveLevel <= (level << 9))
+ {
+ for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
+ ;
+
+ if (j == 4)
+ {
+ for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++)
+ ;
+
+ if (k == numMoves)
+ moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF;
+ }
+ }
+ }
+
+ return numMoves;
+}
+
+u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves)
+{
+ u8 numMoves = 0;
+ int i;
+
+ for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++)
+ moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF;
+
+ return numMoves;
+}
+
+u8 GetNumberOfRelearnableMoves(struct Pokemon *mon)
+{
+ u16 learnedMoves[4];
+ u16 moves[20];
+ u8 numMoves = 0;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
+ u8 level = GetMonData(mon, MON_DATA_LEVEL, 0);
+ int i, j, k;
+
+ if (species == SPECIES_EGG)
+ return 0;
+
+ for (i = 0; i < 4; i++)
+ learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0);
+
+ for (i = 0; i < 20; i++)
+ {
+ u16 moveLevel;
+
+ if (gLevelUpLearnsets[species][i] == 0xFFFF)
+ break;
+
+ moveLevel = gLevelUpLearnsets[species][i] & 0xFE00;
+
+ if (moveLevel <= (level << 9))
+ {
+ for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
+ ;
+
+ if (j == 4)
+ {
+ for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++)
+ ;
+
+ if (k == numMoves)
+ moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF;
+ }
+ }
+ }
+
+ return numMoves;
+}
+
+u16 SpeciesToPokedexNum(u16 species)
+{
+ if (IsNationalPokedexEnabled())
+ {
+ return SpeciesToNationalPokedexNum(species);
+ }
+ else
+ {
+ species = SpeciesToHoennPokedexNum(species);
+ if (species <= 202)
+ return species;
+ return 0xFFFF;
+ }
+}
+
+bool32 sub_806E3F8(u16 species)
+{
+ if (SpeciesToHoennPokedexNum(species) > 202)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void ClearBattleMonForms(void)
+{
+ int i;
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
+ gBattleMonForms[i] = 0;
+}
+
+u16 GetBattleBGM(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
+ return MUS_BATTLE34;
+ else if (gBattleTypeFlags & BATTLE_TYPE_REGI)
+ return MUS_BATTLE36;
+ else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ return MUS_BATTLE20;
+ else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ trainerClass = GetFrontierOpponentClass(gTrainerBattleOpponent_A);
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ trainerClass = TRAINER_CLASS_EXPERT;
+ else
+ trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
+
+ switch (trainerClass)
+ {
+ case TRAINER_CLASS_AQUA_LEADER:
+ case TRAINER_CLASS_MAGMA_LEADER:
+ return MUS_BATTLE30;
+ case TRAINER_CLASS_TEAM_AQUA:
+ case TRAINER_CLASS_TEAM_MAGMA:
+ case TRAINER_CLASS_AQUA_ADMIN:
+ case TRAINER_CLASS_MAGMA_ADMIN:
+ return MUS_BATTLE31;
+ case TRAINER_CLASS_LEADER:
+ return MUS_BATTLE32;
+ case TRAINER_CLASS_CHAMPION:
+ return MUS_BATTLE33;
+ case TRAINER_CLASS_PKMN_TRAINER_3:
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ return MUS_BATTLE35;
+ if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, gText_BattleWallyName))
+ return MUS_BATTLE20;
+ return MUS_BATTLE35;
+ case TRAINER_CLASS_ELITE_FOUR:
+ return MUS_BATTLE38;
+ case TRAINER_CLASS_SALON_MAIDEN:
+ case TRAINER_CLASS_DOME_ACE:
+ case TRAINER_CLASS_PALACE_MAVEN:
+ case TRAINER_CLASS_ARENA_TYCOON:
+ case TRAINER_CLASS_FACTORY_HEAD:
+ case TRAINER_CLASS_PIKE_QUEEN:
+ case TRAINER_CLASS_PYRAMID_KING:
+ return MUS_VS_FRONT;
+ default:
+ return MUS_BATTLE20;
+ }
+ }
+ else
+ return MUS_BATTLE27;
+}
+
+void PlayBattleBGM(void)
+{
+ ResetMapMusic();
+ m4aMPlayAllStop();
+ PlayBGM(GetBattleBGM());
+}
+
+void PlayMapChosenOrBattleBGM(u16 songId)
+{
+ ResetMapMusic();
+ m4aMPlayAllStop();
+ if (songId)
+ PlayNewMapMusic(songId);
+ else
+ PlayNewMapMusic(GetBattleBGM());
+}
+
+void sub_806E694(u16 songId)
+{
+ u8 taskId;
+
+ ResetMapMusic();
+ m4aMPlayAllStop();
+
+ taskId = CreateTask(sub_806E6CC, 0);
+ gTasks[taskId].data[0] = songId;
+}
+
+static void sub_806E6CC(u8 taskId)
+{
+ if (gTasks[taskId].data[0])
+ PlayNewMapMusic(gTasks[taskId].data[0]);
+ else
+ PlayNewMapMusic(GetBattleBGM());
+ DestroyTask(taskId);
+}
+
+const u8 *GetMonFrontSpritePal(struct Pokemon *mon)
+{
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
+ u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
+ return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
+}
+
+// Extracts the upper 16 bits of a 32-bit number
+#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
+
+// Extracts the lower 16 bits of a 32-bit number
+#define LOHALF(n) ((n) & 0xFFFF)
+
+const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
+{
+ u32 shinyValue;
+
+ if (species > SPECIES_EGG)
+ return gMonPaletteTable[0].data;
+
+ shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
+ if (shinyValue < 8)
+ return gMonShinyPaletteTable[species].data;
+ else
+ return gMonPaletteTable[species].data;
+}
+
+const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon)
+{
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
+ u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
+ return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
+}
+
+const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality)
+{
+ u32 shinyValue;
+
+ shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
+ if (shinyValue < 8)
+ return &gMonShinyPaletteTable[species];
+ else
+ return &gMonPaletteTable[species];
+}
+
+bool32 IsHMMove2(u16 move)
+{
+ int i = 0;
+ while (sHMMoves[i] != 0xFFFF)
+ {
+ if (sHMMoves[i++] == move)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 IsMonSpriteNotFlipped(u16 species)
+{
+ return gBaseStats[species].noFlip;
+}
+
+s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
+{
+ u8 nature = GetNature(mon);
+ return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+}
+
+s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)
+{
+ u8 nature = GetNatureFromPersonality(personality);
+ return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+}
+
+bool8 IsTradedMon(struct Pokemon *mon)
+{
+ u8 otName[OT_NAME_LENGTH + 1];
+ u32 otId;
+ GetMonData(mon, MON_DATA_OT_NAME, otName);
+ otId = GetMonData(mon, MON_DATA_OT_ID, 0);
+ return IsOtherTrainer(otId, otName);
+}
+
+bool8 IsOtherTrainer(u32 otId, u8 *otName)
+{
+ if (otId ==
+ (gSaveBlock2Ptr->playerTrainerId[0]
+ | (gSaveBlock2Ptr->playerTrainerId[1] << 8)
+ | (gSaveBlock2Ptr->playerTrainerId[2] << 16)
+ | (gSaveBlock2Ptr->playerTrainerId[3] << 24)))
+ {
+ int i;
+
+ for (i = 0; otName[i] != EOS; i++)
+ if (otName[i] != gSaveBlock2Ptr->playerName[i])
+ return TRUE;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void MonRestorePP(struct Pokemon *mon)
+{
+ BoxMonRestorePP(&mon->box);
+}
+
+void BoxMonRestorePP(struct BoxPokemon *boxMon)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0))
+ {
+ u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0);
+ u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0);
+ u8 pp = CalculatePPWithBonus(move, bonus, i);
+ SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp);
+ }
+ }
+}
+
+void SetMonPreventsSwitchingString(void)
+{
+ gLastUsedAbility = gBattleStruct->abilityPreventingSwitchout;
+
+ gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;
+ gBattleTextBuff1[1] = B_BUFF_MON_NICK_WITH_PREFIX;
+ gBattleTextBuff1[2] = gBattleStruct->battlerPreventingSwitchout;
+ gBattleTextBuff1[4] = B_BUFF_EOS;
+
+ if (GetBattlerSide(gBattleStruct->battlerPreventingSwitchout) == B_SIDE_PLAYER)
+ gBattleTextBuff1[3] = pokemon_order_func(gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout]);
+ else
+ gBattleTextBuff1[3] = gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout];
+
+ PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBattlerInMenuId, pokemon_order_func(gBattlerPartyIndexes[gBattlerInMenuId]))
+
+ BattleStringExpandPlaceholders(gText_PkmnsXPreventsSwitching, gStringVar4);
+}
+
+static s32 GetWildMonTableIdInAlteringCave(u16 species)
+{
+ s32 i;
+ for (i = 0; i < (s32) ARRAY_COUNT(sAlteringCaveWildMonHeldItems); i++)
+ if (sAlteringCaveWildMonHeldItems[i].species == species)
+ return i;
+ return 0;
+}
+
+void SetWildMonHeldItem(void)
+{
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_PIKE)))
+ {
+ u16 rnd = Random() % 100;
+ u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);
+ u16 var1 = 45;
+ u16 var2 = 95;
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3, 0)
+ && GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES)
+ {
+ var1 = 20;
+ var2 = 80;
+ }
+ if (gMapHeader.mapLayoutId == 0x1A4)
+ {
+ s32 alteringCaveId = GetWildMonTableIdInAlteringCave(species);
+ if (alteringCaveId != 0)
+ {
+ if (rnd < var2)
+ return;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &sAlteringCaveWildMonHeldItems[alteringCaveId].item);
+ }
+ else
+ {
+ if (rnd < var1)
+ return;
+ if (rnd < var2)
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1);
+ else
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2);
+ }
+ }
+ else
+ {
+ if (gBaseStats[species].item1 == gBaseStats[species].item2 && gBaseStats[species].item1 != 0)
+ {
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1);
+ }
+ else
+ {
+ if (rnd < var1)
+ return;
+ if (rnd < var2)
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1);
+ else
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2);
+ }
+ }
+ }
+}
+
+bool8 IsMonShiny(struct Pokemon *mon)
+{
+ u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
+ return IsShinyOtIdPersonality(otId, personality);
+}
+
+bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
+{
+ bool8 retVal = FALSE;
+ u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
+ if (shinyValue < 8)
+ retVal = TRUE;
+ return retVal;
+}
+
+const u8 *GetTrainerPartnerName(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
+ {
+ if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER)
+ {
+ return gTrainers[TRAINER_STEVEN].trainerName;
+ }
+ else
+ {
+ GetFrontierTrainerName(gStringVar1, gPartnerTrainerId);
+ return gStringVar1;
+ }
+ }
+ else
+ {
+ u8 id = GetMultiplayerId();
+ return gLinkPlayers[GetBattlerMultiplayerId(gLinkPlayers[id].id ^ 2)].name;
+ }
+}
+
+#define READ_PTR_FROM_TASK(taskId, dataId) \
+ (void*)( \
+ ((u16)(gTasks[taskId].data[dataId]) | \
+ ((u16)(gTasks[taskId].data[dataId + 1]) << 0x10)))
+
+#define STORE_PTR_IN_TASK(ptr, taskId, dataId) \
+{ \
+ gTasks[taskId].data[dataId] = (u32)(ptr); \
+ gTasks[taskId].data[dataId + 1] = (u32)(ptr) >> 0x10; \
+}
+
+static void Task_AnimateAfterDelay(u8 taskId)
+{
+ if (--gTasks[taskId].data[3] == 0)
+ {
+ LaunchAnimationTaskForFrontSprite(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_PokemonSummaryAnimateAfterDelay(u8 taskId)
+{
+ if (--gTasks[taskId].data[3] == 0)
+ {
+ StartMonSummaryAnimation(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
+ sub_81C488C(0xFF);
+ DestroyTask(taskId);
+ }
+}
+
+void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3)
+{
+ if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
+ DoMonFrontSpriteAnimation(sprite, species, noCry, arg3 | 0x80);
+ else
+ DoMonFrontSpriteAnimation(sprite, species, noCry, arg3);
+}
+
+void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3)
+{
+ s8 pan;
+ switch (arg3 & 0x7F)
+ {
+ case 0:
+ pan = -25;
+ break;
+ case 1:
+ pan = 25;
+ break;
+ default:
+ pan = 0;
+ break;
+ }
+ if (arg3 & 0x80)
+ {
+ if (!noCry)
+ PlayCry1(species, pan);
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else
+ {
+ if (!noCry)
+ {
+ PlayCry1(species, pan);
+ if (HasTwoFramesAnimation(species))
+ StartSpriteAnim(sprite, 1);
+ }
+ if (sMonAnimationDelayTable[species - 1] != 0)
+ {
+ u8 taskId = CreateTask(Task_AnimateAfterDelay, 0);
+ STORE_PTR_IN_TASK(sprite, taskId, 0);
+ gTasks[taskId].data[2] = sMonFrontAnimIdsTable[species - 1];
+ gTasks[taskId].data[3] = sMonAnimationDelayTable[species - 1];
+ }
+ else
+ {
+ LaunchAnimationTaskForFrontSprite(sprite, sMonFrontAnimIdsTable[species - 1]);
+ }
+ sprite->callback = SpriteCallbackDummy_2;
+ }
+}
+
+void PokemonSummaryDoMonAnimation(struct Sprite* sprite, u16 species, bool8 oneFrame)
+{
+ if (!oneFrame && HasTwoFramesAnimation(species))
+ StartSpriteAnim(sprite, 1);
+ if (sMonAnimationDelayTable[species - 1] != 0)
+ {
+ u8 taskId = CreateTask(Task_PokemonSummaryAnimateAfterDelay, 0);
+ STORE_PTR_IN_TASK(sprite, taskId, 0);
+ gTasks[taskId].data[2] = sMonFrontAnimIdsTable[species - 1];
+ gTasks[taskId].data[3] = sMonAnimationDelayTable[species - 1];
+ sub_81C488C(taskId);
+ SetSpriteCB_MonAnimDummy(sprite);
+ }
+ else
+ {
+ StartMonSummaryAnimation(sprite, sMonFrontAnimIdsTable[species - 1]);
+ }
+}
+
+void sub_806EE98(void)
+{
+ u8 delayTaskId = FindTaskIdByFunc(Task_PokemonSummaryAnimateAfterDelay);
+ if (delayTaskId != 0xFF)
+ DestroyTask(delayTaskId);
+}
+
+void BattleAnimateBackSprite(struct Sprite* sprite, u16 species)
+{
+ if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
+ {
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else
+ {
+ LaunchAnimationTaskForBackSprite(sprite, GetSpeciesBackAnimSet(species));
+ sprite->callback = SpriteCallbackDummy_2;
+ }
+}
+
+u8 sub_806EF08(u8 arg0)
+{
+ s32 i;
+ s32 var = 0;
+ u8 multiplayerId = GetMultiplayerId();
+ switch (gLinkPlayers[multiplayerId].id)
+ {
+ case 0:
+ case 2:
+ var = (arg0 != 0) ? 1 : 3;
+ break;
+ case 1:
+ case 3:
+ var = (arg0 != 0) ? 2 : 0;
+ break;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (gLinkPlayers[i].id == (s16)(var))
+ break;
+ }
+ return i;
+}
+
+u8 sub_806EF84(u8 arg0, u8 arg1)
+{
+ s32 i;
+ s32 var = 0;
+ switch (gLinkPlayers[arg1].id)
+ {
+ case 0:
+ case 2:
+ var = (arg0 != 0) ? 1 : 3;
+ break;
+ case 1:
+ case 3:
+ var = (arg0 != 0) ? 2 : 0;
+ break;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (gLinkPlayers[i].id == (s16)(var))
+ break;
+ }
+ return i;
+}
+
+u16 FacilityClassToPicIndex(u16 facilityClass)
+{
+ return gFacilityClassToPicIndex[facilityClass];
+}
+
+u16 PlayerGenderToFrontTrainerPicId(u8 playerGender)
+{
+ if (playerGender != MALE)
+ return FacilityClassToPicIndex(FACILITY_CLASS_PKMN_TRAINER_BRENDAN);
+ else
+ return FacilityClassToPicIndex(FACILITY_CLASS_PKMN_TRAINER_MAY);
+}
+
+void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
+{
+ u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT;
+ if (!GetSetPokedexFlag(nationalNum, getFlagCaseId)) // don't set if it's already set
+ {
+ GetSetPokedexFlag(nationalNum, caseId);
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN)
+ gSaveBlock2Ptr->pokedex.unownPersonality = personality;
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA)
+ gSaveBlock2Ptr->pokedex.spindaPersonality = personality;
+ }
+}
+
+const u8 *GetTrainerClassNameFromId(u16 trainerId)
+{
+ if (trainerId >= TRAINERS_COUNT)
+ trainerId = TRAINER_NONE;
+ return gTrainerClassNames[gTrainers[trainerId].trainerClass];
+}
+
+const u8 *GetTrainerNameFromId(u16 trainerId)
+{
+ if (trainerId >= TRAINERS_COUNT)
+ trainerId = TRAINER_NONE;
+ return gTrainers[trainerId].trainerName;
+}
+
+bool8 HasTwoFramesAnimation(u16 species)
+{
+ return (species != SPECIES_CASTFORM
+ && species != SPECIES_DEOXYS
+ && species != SPECIES_SPINDA
+ && species != SPECIES_UNOWN);
+}
+
+bool8 sub_806F104(void)
+{
+ if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER))
+ return TRUE;
+ if (!gMain.inBattle && (InBattlePike() || InBattlePyramid()))
+ return TRUE;
+ return FALSE;
+}
+
+#define FORCE_SIGNED(x)(-(x * (-1)))
+
+static void sub_806F160(struct Unknown_806F160_Struct* structPtr)
+{
+ u16 i, j;
+ for (i = 0; i < FORCE_SIGNED(structPtr->field_0_0); i++)
+ {
+ structPtr->templates[i] = gUnknown_08329D98[i];
+ for (j = 0; j < structPtr->field_1; j++)
+ {
+ asm("");
+ structPtr->frameImages[i * structPtr->field_1 + j].data = &structPtr->byteArrays[i][j * 0x800];
+ }
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->field_1];
+ }
+}
+
+static void sub_806F1FC(struct Unknown_806F160_Struct* structPtr)
+{
+ u16 i, j;
+ for (i = 0; i < FORCE_SIGNED(structPtr->field_0_0); i++)
+ {
+ structPtr->templates[i] = gUnknown_08329F28;
+ for (j = 0; j < structPtr->field_1; j++)
+ {
+ structPtr->frameImages[i * structPtr->field_0_0 + j].data = &structPtr->byteArrays[i][j * 0x800];
+ }
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->field_0_0];
+ structPtr->templates[i].anims = gPlayerMonSpriteAnimsTable;
+ structPtr->templates[i].paletteTag = i;
+ }
+}
+
+struct Unknown_806F160_Struct *sub_806F2AC(u8 id, u8 arg1)
+{
+ u8 i;
+ u8 flags;
+ struct Unknown_806F160_Struct *structPtr;
+
+ flags = 0;
+ id %= 2;
+ structPtr = AllocZeroed(sizeof(*structPtr));
+ if (structPtr == NULL)
+ return NULL;
+
+ switch (arg1)
+ {
+ case 2:
+ structPtr->field_0_0 = 7;
+ structPtr->field_0_1 = 7;
+ structPtr->field_1 = 4;
+ structPtr->field_3_0 = 1;
+ structPtr->field_3_1 = 2;
+ break;
+ case 0:
+ default:
+ structPtr->field_0_0 = 4;
+ structPtr->field_0_1 = 4;
+ structPtr->field_1 = 4;
+ structPtr->field_3_0 = 1;
+ structPtr->field_3_1 = 0;
+ break;
+ }
+
+ structPtr->bytes = AllocZeroed(structPtr->field_3_0 * 0x800 * 4 * structPtr->field_0_0);
+ structPtr->byteArrays = AllocZeroed(structPtr->field_0_0 * 32);
+ if (structPtr->bytes == NULL || structPtr->byteArrays == NULL)
+ {
+ flags |= 1;
+ }
+ else
+ {
+ for (i = 0; i < FORCE_SIGNED(structPtr->field_0_0); i++)
+ structPtr->byteArrays[i] = structPtr->bytes + (structPtr->field_3_0 * (i << 0xD));
+ }
+
+ structPtr->templates = AllocZeroed(sizeof(struct SpriteTemplate) * structPtr->field_0_0);
+ structPtr->frameImages = AllocZeroed(sizeof(struct SpriteFrameImage) * structPtr->field_0_0 * structPtr->field_1);
+ if (structPtr->templates == NULL || structPtr->frameImages == NULL)
+ {
+ flags |= 2;
+ }
+ else
+ {
+ for (i = 0; i < structPtr->field_1 * structPtr->field_0_0; i++)
+ structPtr->frameImages[i].size = 0x800;
+
+ switch (structPtr->field_3_1)
+ {
+ case 2:
+ sub_806F1FC(structPtr);
+ break;
+ case 0:
+ case 1:
+ default:
+ sub_806F160(structPtr);
+ break;
+ }
+ }
+
+ if (flags & 2)
+ {
+ if (structPtr->frameImages != NULL)
+ FREE_AND_SET_NULL(structPtr->frameImages);
+ if (structPtr->templates != NULL)
+ FREE_AND_SET_NULL(structPtr->templates);
+ }
+ if (flags & 1)
+ {
+ if (structPtr->byteArrays != NULL)
+ FREE_AND_SET_NULL(structPtr->byteArrays);
+ if (structPtr->bytes != NULL)
+ FREE_AND_SET_NULL(structPtr->bytes);
+ }
+
+ if (flags)
+ {
+ memset(structPtr, 0, sizeof(*structPtr));
+ Free(structPtr);
+ }
+ else
+ {
+ structPtr->magic = 0xA3;
+ gUnknown_020249B4[id] = structPtr;
+ }
+
+ return gUnknown_020249B4[id];
+}
+
+void sub_806F47C(u8 id)
+{
+ struct Unknown_806F160_Struct *structPtr;
+
+ id %= 2;
+ structPtr = gUnknown_020249B4[id];
+ if (structPtr == NULL)
+ return;
+
+ if (structPtr->magic != 0xA3)
+ {
+ memset(structPtr, 0, sizeof(struct Unknown_806F160_Struct));
+ }
+ else
+ {
+
+ if (structPtr->frameImages != NULL)
+ FREE_AND_SET_NULL(structPtr->frameImages);
+ if (structPtr->templates != NULL)
+ FREE_AND_SET_NULL(structPtr->templates);
+ if (structPtr->byteArrays != NULL)
+ FREE_AND_SET_NULL(structPtr->byteArrays);
+ if (structPtr->bytes != NULL)
+ FREE_AND_SET_NULL(structPtr->bytes);
+
+ memset(structPtr, 0, sizeof(struct Unknown_806F160_Struct));
+ Free(structPtr);
+ }
+}
+
+u8 *sub_806F4F8(u8 id, u8 arg1)
+{
+ struct Unknown_806F160_Struct *structPtr = gUnknown_020249B4[id % 2];
+ if (structPtr->magic != 0xA3)
+ {
+ return NULL;
+ }
+ else
+ {
+ if (arg1 >= FORCE_SIGNED(structPtr->field_0_0))
+ arg1 = 0;
+
+ return structPtr->byteArrays[arg1];
+ }
+}
diff --git a/src/pokemon_1.c b/src/pokemon_1.c
deleted file mode 100644
index f56ade967..000000000
--- a/src/pokemon_1.c
+++ /dev/null
@@ -1,391 +0,0 @@
-#include "global.h"
-#include "pokemon.h"
-#include "rng.h"
-#include "main.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)
-
-//Extracts the lower 16 bits of a 32-bit number
-#define LOHALF(n) ((n) & 0xFFFF)
-
-extern u8 sav1_map_get_name(void);
-
-void ZeroBoxMonData(struct BoxPokemon *boxMon)
-{
- u8 *raw = (u8 *)boxMon;
- u32 i;
- for (i = 0; i < sizeof(struct BoxPokemon); i++)
- raw[i] = 0;
-}
-
-void ZeroMonData(struct Pokemon *mon)
-{
- u32 arg;
- ZeroBoxMonData(&mon->box);
- arg = 0;
- SetMonData(mon, MON_DATA_STATUS, &arg);
- SetMonData(mon, MON_DATA_LEVEL, &arg);
- SetMonData(mon, MON_DATA_HP, &arg);
- SetMonData(mon, MON_DATA_MAX_HP, &arg);
- SetMonData(mon, MON_DATA_ATK, &arg);
- SetMonData(mon, MON_DATA_DEF, &arg);
- SetMonData(mon, MON_DATA_SPEED, &arg);
- SetMonData(mon, MON_DATA_SPATK, &arg);
- SetMonData(mon, MON_DATA_SPDEF, &arg);
- arg = 255;
- SetMonData(mon, MON_DATA_MAIL, &arg);
-}
-
-void ZeroPlayerPartyMons(void)
-{
- s32 i;
- for (i = 0; i < 6; i++)
- ZeroMonData(&gPlayerParty[i]);
-}
-
-void ZeroEnemyPartyMons(void)
-{
- s32 i;
- for (i = 0; i < 6; i++)
- ZeroMonData(&gEnemyParty[i]);
-}
-
-void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
-{
- u32 arg;
- ZeroMonData(mon);
- CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId);
- SetMonData(mon, MON_DATA_LEVEL, &level);
- arg = 255;
- SetMonData(mon, MON_DATA_MAIL, &arg);
- CalculateMonStats(mon);
-}
-
-void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
-{
- u8 speciesName[POKEMON_NAME_LENGTH + 1];
- u32 personality;
- u32 value;
- u16 checksum;
-
- ZeroBoxMonData(boxMon);
-
- if (hasFixedPersonality)
- personality = fixedPersonality;
- else
- personality = Random32();
-
- SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality);
-
- //Determine original trainer ID
- if (otIdType == OT_ID_RANDOM_NO_SHINY) //Pokemon cannot be shiny
- {
- u32 shinyValue;
- do
- {
- value = Random32();
- shinyValue = HIHALF(value) ^ LOHALF(value) ^ HIHALF(personality) ^ LOHALF(personality);
- } while (shinyValue < 8);
- }
- else if (otIdType == OT_ID_PRESET) //Pokemon has a preset OT ID
- {
- value = fixedOtId;
- }
- else //Player is the OT
- {
- value = gSaveBlock2Ptr->playerTrainerId[0]
- | (gSaveBlock2Ptr->playerTrainerId[1] << 8)
- | (gSaveBlock2Ptr->playerTrainerId[2] << 16)
- | (gSaveBlock2Ptr->playerTrainerId[3] << 24);
- }
-
- SetBoxMonData(boxMon, MON_DATA_OT_ID, &value);
-
- checksum = CalculateBoxMonChecksum(boxMon);
- SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum);
- EncryptBoxMon(boxMon);
- GetSpeciesName(speciesName, species);
- SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName);
- SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage);
- SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName);
- SetBoxMonData(boxMon, MON_DATA_SPECIES, &species);
- SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gBaseStats[species].growthRate][level]);
- SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship);
- value = sav1_map_get_name();
- SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value);
- SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level);
- SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion);
- value = ITEM_POKE_BALL;
- SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value);
- SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender);
-
- if (fixedIV < 32)
- {
- SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV);
- SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV);
- SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV);
- SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV);
- SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV);
- SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV);
- }
- else
- {
- u32 iv;
- value = Random();
-
- iv = value & 0x1F;
- SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv);
- iv = (value & 0x3E0) >> 5;
- SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv);
- iv = (value & 0x7C00) >> 10;
- SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv);
-
- value = Random();
-
- iv = value & 0x1F;
- SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv);
- iv = (value & 0x3E0) >> 5;
- SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv);
- iv = (value & 0x7C00) >> 10;
- SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);
- }
-
- if (gBaseStats[species].ability2)
- {
- value = personality & 1;
- SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, &value);
- }
-
- GiveBoxMonInitialMoveset(boxMon);
-}
-
-void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature)
-{
- u32 personality;
-
- do
- {
- personality = Random32();
- }
- while (nature != GetNatureFromPersonality(personality));
-
- CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_PLAYER_ID, 0);
-}
-
-void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter)
-{
- u32 personality;
-
- if ((u8)(unownLetter - 1) < 28)
- {
- u16 actualLetter;
-
- do
- {
- personality = Random32();
- actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 28);
- }
- while (nature != GetNatureFromPersonality(personality)
- || gender != GetGenderFromSpeciesAndPersonality(species, personality)
- || actualLetter != unownLetter - 1);
- }
- else
- {
- do
- {
- personality = Random32();
- }
- while (nature != GetNatureFromPersonality(personality)
- || gender != GetGenderFromSpeciesAndPersonality(species, personality));
- }
-
- CreateMon(mon, species, level, fixedIV, 1, personality, OT_ID_PLAYER_ID, 0);
-}
-
-// This is only used to create Wally's Ralts.
-void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level)
-{
- u32 personality;
- u32 otId;
-
- do
- {
- otId = Random32();
- personality = Random32();
- }
- while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE);
- CreateMon(mon, species, level, 32, 1, personality, OT_ID_PRESET, otId);
-}
-
-void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality)
-{
- CreateMon(mon, species, level, 0, 1, personality, OT_ID_PLAYER_ID, 0);
- SetMonData(mon, MON_DATA_IVS, &ivs);
- CalculateMonStats(mon);
-}
-
-void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)
-{
- CreateMon(mon, species, level, 0, 0, 0, OT_ID_PRESET, otId);
- SetMonData(mon, MON_DATA_HP_IV, &ivs[0]);
- SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]);
- SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]);
- SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]);
- SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]);
- SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]);
- CalculateMonStats(mon);
-}
-
-void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread)
-{
- s32 i;
- s32 statCount = 0;
- u16 evAmount;
- u8 temp;
-
- CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0);
-
- temp = evSpread;
-
- for (i = 0; i < 6; i++)
- {
- if (temp & 1)
- statCount++;
- temp >>= 1;
- }
-
- evAmount = 510 / statCount;
-
- temp = 1;
-
- for (i = 0; i < 6; i++)
- {
- if (evSpread & temp)
- SetMonData(mon, MON_DATA_HP_EV + i, &evAmount);
- temp <<= 1;
- }
-
- CalculateMonStats(mon);
-}
-
-void sub_806819C(struct Pokemon *mon, struct UnknownPokemonStruct *src)
-{
- s32 i;
- u8 nickname[30];
- u8 language;
- u8 value;
-
- CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId);
-
- for (i = 0; i < 4; i++)
- SetMonMoveSlot(mon, src->moves[i], i);
-
- SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses);
- SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem);
- SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship);
-
- StringCopy(nickname, src->nickname);
-
- if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN)
- {
- language = LANGUAGE_JAPANESE;
- StripExtCtrlCodes(nickname);
- }
- else
- {
- language = GAME_LANGUAGE;
- }
-
- SetMonData(mon, MON_DATA_LANGUAGE, &language);
- SetMonData(mon, MON_DATA_NICKNAME, nickname);
- SetMonData(mon, MON_DATA_HP_EV, &src->hpEV);
- SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV);
- SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV);
- SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV);
- SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV);
- SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV);
- value = src->altAbility;
- SetMonData(mon, MON_DATA_ALT_ABILITY, &value);
- value = src->hpIV;
- SetMonData(mon, MON_DATA_HP_IV, &value);
- value = src->attackIV;
- SetMonData(mon, MON_DATA_ATK_IV, &value);
- value = src->defenseIV;
- SetMonData(mon, MON_DATA_DEF_IV, &value);
- value = src->speedIV;
- SetMonData(mon, MON_DATA_SPEED_IV, &value);
- value = src->spAttackIV;
- SetMonData(mon, MON_DATA_SPATK_IV, &value);
- value = src->spDefenseIV;
- SetMonData(mon, MON_DATA_SPDEF_IV, &value);
- MonRestorePP(mon);
- CalculateMonStats(mon);
-}
-
-u8 BattleFrontierGetOpponentLvl(u8);
-
-void sub_8068338(struct Pokemon *mon, struct UnknownPokemonStruct *src, bool8 lvl50)
-{
- s32 i;
- u8 nickname[30];
- u8 level;
- u8 language;
- u8 value;
-
- if (gSaveBlock2Ptr->frontierChosenLvl != 0)
- level = BattleFrontierGetOpponentLvl(gSaveBlock2Ptr->frontierChosenLvl);
- else if (lvl50)
- level = 50;
- else
- level = src->level;
-
- CreateMon(mon, src->species, level, 0, 1, src->personality, 1, src->otId);
-
- for (i = 0; i < 4; i++)
- SetMonMoveSlot(mon, src->moves[i], i);
-
- SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses);
- SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem);
- SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship);
-
- StringCopy(nickname, src->nickname);
-
- if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN)
- {
- language = LANGUAGE_JAPANESE;
- StripExtCtrlCodes(nickname);
- }
- else
- {
- language = GAME_LANGUAGE;
- }
-
- SetMonData(mon, MON_DATA_LANGUAGE, &language);
- SetMonData(mon, MON_DATA_NICKNAME, nickname);
- SetMonData(mon, MON_DATA_HP_EV, &src->hpEV);
- SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV);
- SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV);
- SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV);
- SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV);
- SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV);
- value = src->altAbility;
- SetMonData(mon, MON_DATA_ALT_ABILITY, &value);
- value = src->hpIV;
- SetMonData(mon, MON_DATA_HP_IV, &value);
- value = src->attackIV;
- SetMonData(mon, MON_DATA_ATK_IV, &value);
- value = src->defenseIV;
- SetMonData(mon, MON_DATA_DEF_IV, &value);
- value = src->speedIV;
- SetMonData(mon, MON_DATA_SPEED_IV, &value);
- value = src->spAttackIV;
- SetMonData(mon, MON_DATA_SPATK_IV, &value);
- value = src->spDefenseIV;
- SetMonData(mon, MON_DATA_SPDEF_IV, &value);
- MonRestorePP(mon);
- CalculateMonStats(mon);
-}
diff --git a/src/pokemon_2.c b/src/pokemon_2.c
deleted file mode 100644
index 7014be492..000000000
--- a/src/pokemon_2.c
+++ /dev/null
@@ -1,1365 +0,0 @@
-#include "global.h"
-#include "pokemon.h"
-#include "battle.h"
-#include "event_data.h"
-#include "rng.h"
-#include "sprite.h"
-#include "species.h"
-#include "text.h"
-#include "string_util.h"
-
-struct Unknown_020249B4
-{
- u8 unk0[0xC];
- struct SpriteTemplate* templates;
-};
-
-extern u8 gAbsentBankFlags;
-extern u8 gActiveBank;
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-extern u8 gLastUsedAbility;
-extern u16 gTrainerBattleOpponent_A;
-extern u32 gBattleTypeFlags;
-extern struct SpriteTemplate gUnknown_0202499C;
-extern struct Unknown_020249B4* gUnknown_020249B4[2];
-
-extern const u32 gBitTable[];
-extern const struct SpriteTemplate gUnknown_08329D98[];
-extern const struct SpriteTemplate gUnknown_08329DF8[];
-extern const union AnimCmd* gUnknown_082FF70C[];
-extern const union AnimCmd* const * const gMonAnimationsSpriteAnimsPtrTable[];
-extern const union AnimCmd* const * const gUnknown_08305D0C[];
-extern const union AnimCmd* const * const gUnknown_0830536C[];
-extern const u8 gText_BadEgg[];
-extern const u8 gText_EggNickname[];
-
-extern u8 GetBankSide(u8 bank);
-extern u8 GetBankByIdentity(u8 bank);
-extern u8 GetBankIdentity(u8 bank);
-
-u8 CountAliveMonsInBattle(u8 caseId)
-{
- s32 i;
- u8 retVal = 0;
-
- switch (caseId)
- {
- case BATTLE_ALIVE_EXCEPT_ACTIVE:
- for (i = 0; i < 4; i++)
- {
- if (i != gActiveBank && !(gAbsentBankFlags & gBitTable[i]))
- retVal++;
- }
- break;
- case BATTLE_ALIVE_ATK_SIDE:
- for (i = 0; i < 4; i++)
- {
- if (GetBankSide(i) == GetBankSide(gBankAttacker) && !(gAbsentBankFlags & gBitTable[i]))
- retVal++;
- }
- break;
- case BATTLE_ALIVE_DEF_SIDE:
- for (i = 0; i < 4; i++)
- {
- if (GetBankSide(i) == GetBankSide(gBankTarget) && !(gAbsentBankFlags & gBitTable[i]))
- retVal++;
- }
- break;
- }
-
- return retVal;
-}
-
-bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 bank)
-{
- if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
- return FALSE;
- if (GetBankSide(bank) != SIDE_PLAYER)
- return FALSE;
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT)
- return FALSE;
- if (FlagGet(badgeFlag))
- return TRUE;
- return FALSE;
-}
-
-u8 GetDefaultMoveTarget(u8 bank)
-{
- u8 status = GetBankIdentity(bank) & 1;
-
- status ^= 1;
- if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
- return GetBankByIdentity(status);
- if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1)
- {
- u8 val;
-
- if ((Random() & 1) == 0)
- val = status ^ 2;
- else
- val = status;
- return GetBankByIdentity(val);
- }
- else
- {
- if ((gAbsentBankFlags & gBitTable[status]))
- return GetBankByIdentity(status ^ 2);
- else
- return GetBankByIdentity(status);
- }
-}
-
-u8 GetMonGender(struct Pokemon *mon)
-{
- return GetBoxMonGender(&mon->box);
-}
-
-u8 GetBoxMonGender(struct BoxPokemon *boxMon)
-{
- u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
- u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL);
-
- switch (gBaseStats[species].genderRatio)
- {
- case MON_MALE:
- case MON_FEMALE:
- case MON_GENDERLESS:
- return gBaseStats[species].genderRatio;
- }
-
- if (gBaseStats[species].genderRatio > (personality & 0xFF))
- return MON_FEMALE;
- else
- return MON_MALE;
-}
-
-u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality)
-{
- switch (gBaseStats[species].genderRatio)
- {
- case MON_MALE:
- case MON_FEMALE:
- case MON_GENDERLESS:
- return gBaseStats[species].genderRatio;
- }
-
- if (gBaseStats[species].genderRatio > (personality & 0xFF))
- return MON_FEMALE;
- else
- return MON_MALE;
-}
-
-void sub_806A068(u16 species, u8 bankIdentity)
-{
- if (gMonSpritesGfxPtr != NULL)
- gUnknown_0202499C = gMonSpritesGfxPtr->templates[bankIdentity];
- else if (gUnknown_020249B4[0])
- gUnknown_0202499C = gUnknown_020249B4[0]->templates[bankIdentity];
- else if (gUnknown_020249B4[1])
- gUnknown_0202499C = gUnknown_020249B4[1]->templates[bankIdentity];
- else
- gUnknown_0202499C = gUnknown_08329D98[bankIdentity];
-
- gUnknown_0202499C.paletteTag = species;
- if (bankIdentity == 0 || bankIdentity == 2)
- gUnknown_0202499C.anims = gUnknown_082FF70C;
- else if (species > 500)
- gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species - 500];
- else
- gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species];
-}
-
-void sub_806A12C(u16 trainerSpriteId, u8 bankIdentity)
-{
- gUnknown_0202499C.paletteTag = trainerSpriteId;
- if (bankIdentity == 0 || bankIdentity == 2)
- {
- gUnknown_0202499C = gUnknown_08329DF8[trainerSpriteId];
- gUnknown_0202499C.anims = gUnknown_08305D0C[trainerSpriteId];
- }
- else
- {
- if (gMonSpritesGfxPtr != NULL)
- gUnknown_0202499C = gMonSpritesGfxPtr->templates[bankIdentity];
- else
- gUnknown_0202499C = gUnknown_08329D98[bankIdentity];
- gUnknown_0202499C.anims = gUnknown_0830536C[trainerSpriteId];
- }
-}
-
-void sub_806A1C0(u16 arg0, u8 bankIdentity)
-{
- if (gMonSpritesGfxPtr != NULL)
- gUnknown_0202499C = gMonSpritesGfxPtr->templates[bankIdentity];
- else
- gUnknown_0202499C = gUnknown_08329D98[bankIdentity];
-
- gUnknown_0202499C.paletteTag = arg0;
- gUnknown_0202499C.anims = gUnknown_0830536C[arg0];
-}
-
-void EncryptBoxMon(struct BoxPokemon *boxMon)
-{
- u32 i;
- for (i = 0; i < 12; i++)
- {
- boxMon->secure.raw[i] ^= boxMon->personality;
- boxMon->secure.raw[i] ^= boxMon->otId;
- }
-}
-
-void DecryptBoxMon(struct BoxPokemon *boxMon)
-{
- u32 i;
- for (i = 0; i < 12; i++)
- {
- boxMon->secure.raw[i] ^= boxMon->otId;
- boxMon->secure.raw[i] ^= boxMon->personality;
- }
-}
-
-#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \
-case n: \
- { \
- union PokemonSubstruct *substructs0 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs1 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs2 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs3 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs4 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs5 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs6 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs7 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs8 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs9 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs10 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs11 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs12 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs13 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs14 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs15 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs16 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs17 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs18 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs19 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs20 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs21 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs22 = boxMon->secure.substructs; \
- union PokemonSubstruct *substructs23 = boxMon->secure.substructs; \
- \
- switch (substructType) \
- { \
- case 0: \
- substruct = &substructs ## n [v1]; \
- break; \
- case 1: \
- substruct = &substructs ## n [v2]; \
- break; \
- case 2: \
- substruct = &substructs ## n [v3]; \
- break; \
- case 3: \
- substruct = &substructs ## n [v4]; \
- break; \
- } \
- break; \
- } \
-
-
-union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
-{
- union PokemonSubstruct *substruct = NULL;
-
- switch (personality % 24)
- {
- SUBSTRUCT_CASE( 0,0,1,2,3)
- SUBSTRUCT_CASE( 1,0,1,3,2)
- SUBSTRUCT_CASE( 2,0,2,1,3)
- SUBSTRUCT_CASE( 3,0,3,1,2)
- SUBSTRUCT_CASE( 4,0,2,3,1)
- SUBSTRUCT_CASE( 5,0,3,2,1)
- SUBSTRUCT_CASE( 6,1,0,2,3)
- SUBSTRUCT_CASE( 7,1,0,3,2)
- SUBSTRUCT_CASE( 8,2,0,1,3)
- SUBSTRUCT_CASE( 9,3,0,1,2)
- SUBSTRUCT_CASE(10,2,0,3,1)
- SUBSTRUCT_CASE(11,3,0,2,1)
- SUBSTRUCT_CASE(12,1,2,0,3)
- SUBSTRUCT_CASE(13,1,3,0,2)
- SUBSTRUCT_CASE(14,2,1,0,3)
- SUBSTRUCT_CASE(15,3,1,0,2)
- SUBSTRUCT_CASE(16,2,3,0,1)
- SUBSTRUCT_CASE(17,3,2,0,1)
- SUBSTRUCT_CASE(18,1,2,3,0)
- SUBSTRUCT_CASE(19,1,3,2,0)
- SUBSTRUCT_CASE(20,2,1,3,0)
- SUBSTRUCT_CASE(21,3,1,2,0)
- SUBSTRUCT_CASE(22,2,3,1,0)
- SUBSTRUCT_CASE(23,3,2,1,0)
- }
-
- return substruct;
-}
-
-extern u16 GetDeoxysStat(struct Pokemon *mon, s32 statId);
-
-u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
-{
- u32 ret;
-
- switch (field)
- {
- case MON_DATA_STATUS:
- ret = mon->status;
- break;
- case MON_DATA_LEVEL:
- ret = mon->level;
- break;
- case MON_DATA_HP:
- ret = mon->hp;
- break;
- case MON_DATA_MAX_HP:
- ret = mon->maxHP;
- break;
- case MON_DATA_ATK:
- ret = GetDeoxysStat(mon, STAT_ATK);
- if (!ret)
- ret = mon->attack;
- break;
- case MON_DATA_DEF:
- ret = GetDeoxysStat(mon, STAT_DEF);
- if (!ret)
- ret = mon->defense;
- break;
- case MON_DATA_SPEED:
- ret = GetDeoxysStat(mon, STAT_SPD);
- if (!ret)
- ret = mon->speed;
- break;
- case MON_DATA_SPATK:
- ret = GetDeoxysStat(mon, STAT_SPATK);
- if (!ret)
- ret = mon->spAttack;
- break;
- case MON_DATA_SPDEF:
- ret = GetDeoxysStat(mon, STAT_SPDEF);
- if (!ret)
- ret = mon->spDefense;
- break;
- case MON_DATA_ATK2:
- ret = mon->attack;
- break;
- case MON_DATA_DEF2:
- ret = mon->defense;
- break;
- case MON_DATA_SPEED2:
- ret = mon->speed;
- break;
- case MON_DATA_SPATK2:
- ret = mon->spAttack;
- break;
- case MON_DATA_SPDEF2:
- ret = mon->spDefense;
- break;
- case MON_DATA_MAIL:
- ret = mon->mail;
- break;
- default:
- ret = GetBoxMonData(&mon->box, field, data);
- break;
- }
- return ret;
-}
-
-u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
-{
- s32 i;
- u32 retVal = 0;
- struct PokemonSubstruct0 *substruct0 = NULL;
- struct PokemonSubstruct1 *substruct1 = NULL;
- struct PokemonSubstruct2 *substruct2 = NULL;
- struct PokemonSubstruct3 *substruct3 = NULL;
-
- if (field > MON_DATA_10)
- {
- substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0);
- substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1);
- substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2);
- substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3);
-
- DecryptBoxMon(boxMon);
-
- if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum)
- {
- boxMon->isBadEgg = 1;
- boxMon->isEgg = 1;
- substruct3->isEgg = 1;
- }
- }
-
- switch (field)
- {
- case MON_DATA_PERSONALITY:
- retVal = boxMon->personality;
- break;
- case MON_DATA_OT_ID:
- retVal = boxMon->otId;
- break;
- case MON_DATA_NICKNAME:
- {
- if (boxMon->isBadEgg)
- {
- for (retVal = 0;
- retVal < POKEMON_NAME_LENGTH && gText_BadEgg[retVal] != EOS;
- data[retVal] = gText_BadEgg[retVal], retVal++) {}
-
- data[retVal] = EOS;
- }
- else if (boxMon->isEgg)
- {
- StringCopy(data, gText_EggNickname);
- retVal = StringLength(data);
- }
- else if (boxMon->language == LANGUAGE_JAPANESE)
- {
- data[0] = EXT_CTRL_CODE_BEGIN;
- data[1] = EXT_CTRL_CODE_JPN;
-
- for (retVal = 2, i = 0;
- i < 5 && boxMon->nickname[i] != EOS;
- data[retVal] = boxMon->nickname[i], retVal++, i++) {}
-
- data[retVal++] = EXT_CTRL_CODE_BEGIN;
- data[retVal++] = EXT_CTRL_CODE_ENG;
- data[retVal] = EOS;
- }
- else
- {
- for (retVal = 0;
- retVal < POKEMON_NAME_LENGTH;
- data[retVal] = boxMon->nickname[retVal], retVal++){}
-
- data[retVal] = EOS;
- }
- break;
- }
- case MON_DATA_LANGUAGE:
- retVal = boxMon->language;
- break;
- case MON_DATA_SANITY_BIT1:
- retVal = boxMon->isBadEgg;
- break;
- case MON_DATA_SANITY_BIT2:
- retVal = boxMon->hasSpecies;
- break;
- case MON_DATA_SANITY_BIT3:
- retVal = boxMon->isEgg;
- break;
- case MON_DATA_OT_NAME:
- {
- retVal = 0;
-
- while (retVal < OT_NAME_LENGTH)
- {
- data[retVal] = boxMon->otName[retVal];
- retVal++;
- }
-
- data[retVal] = EOS;
- break;
- }
- case MON_DATA_MARKINGS:
- retVal = boxMon->markings;
- break;
- case MON_DATA_CHECKSUM:
- retVal = boxMon->checksum;
- break;
- case MON_DATA_10:
- retVal = boxMon->unknown;
- break;
- case MON_DATA_SPECIES:
- retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species;
- break;
- case MON_DATA_HELD_ITEM:
- retVal = substruct0->heldItem;
- break;
- case MON_DATA_EXP:
- retVal = substruct0->experience;
- break;
- case MON_DATA_PP_BONUSES:
- retVal = substruct0->ppBonuses;
- break;
- case MON_DATA_FRIENDSHIP:
- retVal = substruct0->friendship;
- break;
- case MON_DATA_MOVE1:
- case MON_DATA_MOVE2:
- case MON_DATA_MOVE3:
- case MON_DATA_MOVE4:
- retVal = substruct1->moves[field - MON_DATA_MOVE1];
- break;
- case MON_DATA_PP1:
- case MON_DATA_PP2:
- case MON_DATA_PP3:
- case MON_DATA_PP4:
- retVal = substruct1->pp[field - MON_DATA_PP1];
- break;
- case MON_DATA_HP_EV:
- retVal = substruct2->hpEV;
- break;
- case MON_DATA_ATK_EV:
- retVal = substruct2->attackEV;
- break;
- case MON_DATA_DEF_EV:
- retVal = substruct2->defenseEV;
- break;
- case MON_DATA_SPEED_EV:
- retVal = substruct2->speedEV;
- break;
- case MON_DATA_SPATK_EV:
- retVal = substruct2->spAttackEV;
- break;
- case MON_DATA_SPDEF_EV:
- retVal = substruct2->spDefenseEV;
- break;
- case MON_DATA_COOL:
- retVal = substruct2->cool;
- break;
- case MON_DATA_BEAUTY:
- retVal = substruct2->beauty;
- break;
- case MON_DATA_CUTE:
- retVal = substruct2->cute;
- break;
- case MON_DATA_SMART:
- retVal = substruct2->smart;
- break;
- case MON_DATA_TOUGH:
- retVal = substruct2->tough;
- break;
- case MON_DATA_SHEEN:
- retVal = substruct2->sheen;
- break;
- case MON_DATA_POKERUS:
- retVal = substruct3->pokerus;
- break;
- case MON_DATA_MET_LOCATION:
- retVal = substruct3->metLocation;
- break;
- case MON_DATA_MET_LEVEL:
- retVal = substruct3->metLevel;
- break;
- case MON_DATA_MET_GAME:
- retVal = substruct3->metGame;
- break;
- case MON_DATA_POKEBALL:
- retVal = substruct3->pokeball;
- break;
- case MON_DATA_OT_GENDER:
- retVal = substruct3->otGender;
- break;
- case MON_DATA_HP_IV:
- retVal = substruct3->hpIV;
- break;
- case MON_DATA_ATK_IV:
- retVal = substruct3->attackIV;
- break;
- case MON_DATA_DEF_IV:
- retVal = substruct3->defenseIV;
- break;
- case MON_DATA_SPEED_IV:
- retVal = substruct3->speedIV;
- break;
- case MON_DATA_SPATK_IV:
- retVal = substruct3->spAttackIV;
- break;
- case MON_DATA_SPDEF_IV:
- retVal = substruct3->spDefenseIV;
- break;
- case MON_DATA_IS_EGG:
- retVal = substruct3->isEgg;
- break;
- case MON_DATA_ALT_ABILITY:
- retVal = substruct3->altAbility;
- break;
- case MON_DATA_COOL_RIBBON:
- retVal = substruct3->coolRibbon;
- break;
- case MON_DATA_BEAUTY_RIBBON:
- retVal = substruct3->beautyRibbon;
- break;
- case MON_DATA_CUTE_RIBBON:
- retVal = substruct3->cuteRibbon;
- break;
- case MON_DATA_SMART_RIBBON:
- retVal = substruct3->smartRibbon;
- break;
- case MON_DATA_TOUGH_RIBBON:
- retVal = substruct3->toughRibbon;
- break;
- case MON_DATA_CHAMPION_RIBBON:
- retVal = substruct3->championRibbon;
- break;
- case MON_DATA_WINNING_RIBBON:
- retVal = substruct3->winningRibbon;
- break;
- case MON_DATA_VICTORY_RIBBON:
- retVal = substruct3->victoryRibbon;
- break;
- case MON_DATA_ARTIST_RIBBON:
- retVal = substruct3->artistRibbon;
- break;
- case MON_DATA_EFFORT_RIBBON:
- retVal = substruct3->effortRibbon;
- break;
- case MON_DATA_GIFT_RIBBON_1:
- retVal = substruct3->giftRibbon1;
- break;
- case MON_DATA_GIFT_RIBBON_2:
- retVal = substruct3->giftRibbon2;
- break;
- case MON_DATA_GIFT_RIBBON_3:
- retVal = substruct3->giftRibbon3;
- break;
- case MON_DATA_GIFT_RIBBON_4:
- retVal = substruct3->giftRibbon4;
- break;
- case MON_DATA_GIFT_RIBBON_5:
- retVal = substruct3->giftRibbon5;
- break;
- case MON_DATA_GIFT_RIBBON_6:
- retVal = substruct3->giftRibbon6;
- break;
- case MON_DATA_GIFT_RIBBON_7:
- retVal = substruct3->giftRibbon7;
- break;
- case MON_DATA_FATEFUL_ENCOUNTER:
- retVal = substruct3->fatefulEncounter;
- break;
- case MON_DATA_OBEDIENCE:
- retVal = substruct3->obedient;
- break;
- case MON_DATA_SPECIES2:
- retVal = substruct0->species;
- if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg))
- retVal = SPECIES_EGG;
- break;
- case MON_DATA_IVS:
- retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25);
- break;
- case MON_DATA_KNOWN_MOVES:
- if (substruct0->species && !substruct3->isEgg)
- {
- u16 *moves = (u16 *)data;
- s32 i = 0;
-
- while (moves[i] != 355)
- {
- u16 move = moves[i];
- if (substruct1->moves[0] == move
- || substruct1->moves[1] == move
- || substruct1->moves[2] == move
- || substruct1->moves[3] == move)
- retVal |= gBitTable[i];
- i++;
- }
- }
- break;
- case MON_DATA_RIBBON_COUNT:
- retVal = 0;
- if (substruct0->species && !substruct3->isEgg)
- {
- retVal += substruct3->coolRibbon;
- retVal += substruct3->beautyRibbon;
- retVal += substruct3->cuteRibbon;
- retVal += substruct3->smartRibbon;
- retVal += substruct3->toughRibbon;
- retVal += substruct3->championRibbon;
- retVal += substruct3->winningRibbon;
- retVal += substruct3->victoryRibbon;
- retVal += substruct3->artistRibbon;
- retVal += substruct3->effortRibbon;
- retVal += substruct3->giftRibbon1;
- retVal += substruct3->giftRibbon2;
- retVal += substruct3->giftRibbon3;
- retVal += substruct3->giftRibbon4;
- retVal += substruct3->giftRibbon5;
- retVal += substruct3->giftRibbon6;
- retVal += substruct3->giftRibbon7;
- }
- break;
- case MON_DATA_RIBBONS:
- retVal = 0;
- if (substruct0->species && !substruct3->isEgg)
- {
- retVal = substruct3->championRibbon
- | (substruct3->coolRibbon << 1)
- | (substruct3->beautyRibbon << 4)
- | (substruct3->cuteRibbon << 7)
- | (substruct3->smartRibbon << 10)
- | (substruct3->toughRibbon << 13)
- | (substruct3->winningRibbon << 16)
- | (substruct3->victoryRibbon << 17)
- | (substruct3->artistRibbon << 18)
- | (substruct3->effortRibbon << 19)
- | (substruct3->giftRibbon1 << 20)
- | (substruct3->giftRibbon2 << 21)
- | (substruct3->giftRibbon3 << 22)
- | (substruct3->giftRibbon4 << 23)
- | (substruct3->giftRibbon5 << 24)
- | (substruct3->giftRibbon6 << 25)
- | (substruct3->giftRibbon7 << 26);
- }
- break;
- default:
- break;
- }
-
- if (field > MON_DATA_10)
- EncryptBoxMon(boxMon);
-
- return retVal;
-}
-
-#define SET8(lhs) (lhs) = *data
-#define SET16(lhs) (lhs) = data[0] + (data[1] << 8)
-#define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24)
-
-void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg)
-{
- const u8* data = dataArg;
- switch (field)
- {
- case MON_DATA_STATUS:
- SET32(mon->status);
- break;
- case MON_DATA_LEVEL:
- SET8(mon->level);
- break;
- case MON_DATA_HP:
- SET16(mon->hp);
- break;
- case MON_DATA_MAX_HP:
- SET16(mon->maxHP);
- break;
- case MON_DATA_ATK:
- SET16(mon->attack);
- break;
- case MON_DATA_DEF:
- SET16(mon->defense);
- break;
- case MON_DATA_SPEED:
- SET16(mon->speed);
- break;
- case MON_DATA_SPATK:
- SET16(mon->spAttack);
- break;
- case MON_DATA_SPDEF:
- SET16(mon->spDefense);
- break;
- case MON_DATA_MAIL:
- SET8(mon->mail);
- break;
- case MON_DATA_SPECIES2:
- break;
- default:
- SetBoxMonData(&mon->box, field, data);
- break;
- }
-}
-
-void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg)
-{
- const u8* data = dataArg;
-
- struct PokemonSubstruct0 *substruct0 = NULL;
- struct PokemonSubstruct1 *substruct1 = NULL;
- struct PokemonSubstruct2 *substruct2 = NULL;
- struct PokemonSubstruct3 *substruct3 = NULL;
-
- if (field > MON_DATA_10)
- {
- substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0);
- substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1);
- substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2);
- substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3);
-
- DecryptBoxMon(boxMon);
-
- if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum)
- {
- boxMon->isBadEgg = 1;
- boxMon->isEgg = 1;
- substruct3->isEgg = 1;
- EncryptBoxMon(boxMon);
- return;
- }
- }
-
- switch (field)
- {
- case MON_DATA_PERSONALITY:
- SET32(boxMon->personality);
- break;
- case MON_DATA_OT_ID:
- SET32(boxMon->otId);
- break;
- case MON_DATA_NICKNAME:
- {
- s32 i;
- for (i = 0; i < POKEMON_NAME_LENGTH; i++)
- boxMon->nickname[i] = data[i];
- break;
- }
- case MON_DATA_LANGUAGE:
- SET8(boxMon->language);
- break;
- case MON_DATA_SANITY_BIT1:
- SET8(boxMon->isBadEgg);
- break;
- case MON_DATA_SANITY_BIT2:
- SET8(boxMon->hasSpecies);
- break;
- case MON_DATA_SANITY_BIT3:
- SET8(boxMon->isEgg);
- break;
- case MON_DATA_OT_NAME:
- {
- s32 i;
- for (i = 0; i < OT_NAME_LENGTH; i++)
- boxMon->otName[i] = data[i];
- break;
- }
- case MON_DATA_MARKINGS:
- SET8(boxMon->markings);
- break;
- case MON_DATA_CHECKSUM:
- SET16(boxMon->checksum);
- break;
- case MON_DATA_10:
- SET16(boxMon->unknown);
- break;
- case MON_DATA_SPECIES:
- {
- SET16(substruct0->species);
- if (substruct0->species)
- boxMon->hasSpecies = 1;
- else
- boxMon->hasSpecies = 0;
- break;
- }
- case MON_DATA_HELD_ITEM:
- SET16(substruct0->heldItem);
- break;
- case MON_DATA_EXP:
- SET32(substruct0->experience);
- break;
- case MON_DATA_PP_BONUSES:
- SET8(substruct0->ppBonuses);
- break;
- case MON_DATA_FRIENDSHIP:
- SET8(substruct0->friendship);
- break;
- case MON_DATA_MOVE1:
- case MON_DATA_MOVE2:
- case MON_DATA_MOVE3:
- case MON_DATA_MOVE4:
- SET16(substruct1->moves[field - MON_DATA_MOVE1]);
- break;
- case MON_DATA_PP1:
- case MON_DATA_PP2:
- case MON_DATA_PP3:
- case MON_DATA_PP4:
- SET8(substruct1->pp[field - MON_DATA_PP1]);
- break;
- case MON_DATA_HP_EV:
- SET8(substruct2->hpEV);
- break;
- case MON_DATA_ATK_EV:
- SET8(substruct2->attackEV);
- break;
- case MON_DATA_DEF_EV:
- SET8(substruct2->defenseEV);
- break;
- case MON_DATA_SPEED_EV:
- SET8(substruct2->speedEV);
- break;
- case MON_DATA_SPATK_EV:
- SET8(substruct2->spAttackEV);
- break;
- case MON_DATA_SPDEF_EV:
- SET8(substruct2->spDefenseEV);
- break;
- case MON_DATA_COOL:
- SET8(substruct2->cool);
- break;
- case MON_DATA_BEAUTY:
- SET8(substruct2->beauty);
- break;
- case MON_DATA_CUTE:
- SET8(substruct2->cute);
- break;
- case MON_DATA_SMART:
- SET8(substruct2->smart);
- break;
- case MON_DATA_TOUGH:
- SET8(substruct2->tough);
- break;
- case MON_DATA_SHEEN:
- SET8(substruct2->sheen);
- break;
- case MON_DATA_POKERUS:
- SET8(substruct3->pokerus);
- break;
- case MON_DATA_MET_LOCATION:
- SET8(substruct3->metLocation);
- break;
- case MON_DATA_MET_LEVEL:
- {
- u8 metLevel = *data;
- substruct3->metLevel = metLevel;
- break;
- }
- case MON_DATA_MET_GAME:
- SET8(substruct3->metGame);
- break;
- case MON_DATA_POKEBALL:
- {
- u8 pokeball = *data;
- substruct3->pokeball = pokeball;
- break;
- }
- case MON_DATA_OT_GENDER:
- SET8(substruct3->otGender);
- break;
- case MON_DATA_HP_IV:
- SET8(substruct3->hpIV);
- break;
- case MON_DATA_ATK_IV:
- SET8(substruct3->attackIV);
- break;
- case MON_DATA_DEF_IV:
- SET8(substruct3->defenseIV);
- break;
- case MON_DATA_SPEED_IV:
- SET8(substruct3->speedIV);
- break;
- case MON_DATA_SPATK_IV:
- SET8(substruct3->spAttackIV);
- break;
- case MON_DATA_SPDEF_IV:
- SET8(substruct3->spDefenseIV);
- break;
- case MON_DATA_IS_EGG:
- SET8(substruct3->isEgg);
- if (substruct3->isEgg)
- boxMon->isEgg = 1;
- else
- boxMon->isEgg = 0;
- break;
- case MON_DATA_ALT_ABILITY:
- SET8(substruct3->altAbility);
- break;
- case MON_DATA_COOL_RIBBON:
- SET8(substruct3->coolRibbon);
- break;
- case MON_DATA_BEAUTY_RIBBON:
- SET8(substruct3->beautyRibbon);
- break;
- case MON_DATA_CUTE_RIBBON:
- SET8(substruct3->cuteRibbon);
- break;
- case MON_DATA_SMART_RIBBON:
- SET8(substruct3->smartRibbon);
- break;
- case MON_DATA_TOUGH_RIBBON:
- SET8(substruct3->toughRibbon);
- break;
- case MON_DATA_CHAMPION_RIBBON:
- SET8(substruct3->championRibbon);
- break;
- case MON_DATA_WINNING_RIBBON:
- SET8(substruct3->winningRibbon);
- break;
- case MON_DATA_VICTORY_RIBBON:
- SET8(substruct3->victoryRibbon);
- break;
- case MON_DATA_ARTIST_RIBBON:
- SET8(substruct3->artistRibbon);
- break;
- case MON_DATA_EFFORT_RIBBON:
- SET8(substruct3->effortRibbon);
- break;
- case MON_DATA_GIFT_RIBBON_1:
- SET8(substruct3->giftRibbon1);
- break;
- case MON_DATA_GIFT_RIBBON_2:
- SET8(substruct3->giftRibbon2);
- break;
- case MON_DATA_GIFT_RIBBON_3:
- SET8(substruct3->giftRibbon3);
- break;
- case MON_DATA_GIFT_RIBBON_4:
- SET8(substruct3->giftRibbon4);
- break;
- case MON_DATA_GIFT_RIBBON_5:
- SET8(substruct3->giftRibbon5);
- break;
- case MON_DATA_GIFT_RIBBON_6:
- SET8(substruct3->giftRibbon6);
- break;
- case MON_DATA_GIFT_RIBBON_7:
- SET8(substruct3->giftRibbon7);
- break;
- case MON_DATA_FATEFUL_ENCOUNTER:
- SET8(substruct3->fatefulEncounter);
- break;
- case MON_DATA_OBEDIENCE:
- SET8(substruct3->obedient);
- break;
- case MON_DATA_IVS:
- {
- u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
- substruct3->hpIV = ivs & 0x1F;
- substruct3->attackIV = (ivs >> 5) & 0x1F;
- substruct3->defenseIV = (ivs >> 10) & 0x1F;
- substruct3->speedIV = (ivs >> 15) & 0x1F;
- substruct3->spAttackIV = (ivs >> 20) & 0x1F;
- substruct3->spDefenseIV = (ivs >> 25) & 0x1F;
- break;
- }
- default:
- break;
- }
-
- if (field > MON_DATA_10)
- {
- boxMon->checksum = CalculateBoxMonChecksum(boxMon);
- EncryptBoxMon(boxMon);
- }
-}
-
-void CopyMon(void *dest, void *src, size_t size)
-{
- memcpy(dest, src, size);
-}
-
-u8 GiveMonToPlayer(struct Pokemon *mon)
-{
- s32 i;
-
- SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName);
- SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender);
- SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2Ptr->playerTrainerId);
-
- i = 0;
-
- while (i < 6 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE)
- i++;
-
- if (i >= 6)
- return SendMonToPC(mon);
-
- CopyMon(&gPlayerParty[i], mon, sizeof(*mon));
- gPlayerPartyCount = i + 1;
- return MON_GIVEN_TO_PARTY;
-}
-
-extern u16 get_unknown_box_id(void);
-extern u8 StorageGetCurrentBox(void);
-extern void set_unknown_box_id(u8);
-extern struct BoxPokemon* GetBoxedMonPtr(u8 boxNumber, u8 boxPosition);
-
-u8 SendMonToPC(struct Pokemon* mon)
-{
- s32 boxNo, boxPos;
-
- set_unknown_box_id(VarGet(VAR_STORAGE_UNKNOWN));
-
- boxNo = StorageGetCurrentBox();
-
- do
- {
- for (boxPos = 0; boxPos < 30; boxPos++)
- {
- struct BoxPokemon* checkingMon = GetBoxedMonPtr(boxNo, boxPos);
- if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE)
- {
- MonRestorePP(mon);
- CopyMon(checkingMon, &mon->box, sizeof(mon->box));
- gSpecialVar_MonBoxId = boxNo;
- gSpecialVar_MonBoxPos = boxPos;
- if (get_unknown_box_id() != boxNo)
- FlagClear(FLAG_SYS_STORAGE_UNKNOWN_FLAG);
- VarSet(VAR_STORAGE_UNKNOWN, boxNo);
- return MON_GIVEN_TO_PC;
- }
- }
-
- boxNo++;
- if (boxNo == 14)
- boxNo = 0;
- } while (boxNo != StorageGetCurrentBox());
-
- return MON_CANT_GIVE;
-}
-
-u8 CalculatePlayerPartyCount(void)
-{
- gPlayerPartyCount = 0;
-
- while (gPlayerPartyCount < 6
- && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE)
- {
- gPlayerPartyCount++;
- }
-
- return gPlayerPartyCount;
-}
-
-u8 CalculateEnemyPartyCount(void)
-{
- gEnemyPartyCount = 0;
-
- while (gEnemyPartyCount < 6
- && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE)
- {
- gEnemyPartyCount++;
- }
-
- return gEnemyPartyCount;
-}
-
-u8 GetMonsStateToDoubles(void)
-{
- s32 aliveCount = 0;
- s32 i;
- CalculatePlayerPartyCount();
-
- if (gPlayerPartyCount == 1)
- return gPlayerPartyCount; // PLAYER_HAS_ONE_MON
-
- for (i = 0; i < gPlayerPartyCount; i++)
- {
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG
- && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0
- && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_NONE)
- aliveCount++;
- }
-
- return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
-}
-
-u8 GetMonsStateToDoubles_2(void)
-{
- s32 aliveCount = 0;
- s32 i;
-
- for (i = 0; i < 6; i++)
- {
- u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL);
- if (species != SPECIES_EGG && species != SPECIES_NONE
- && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0)
- aliveCount++;
- }
-
- if (aliveCount == 1)
- return PLAYER_HAS_ONE_MON; // may have more than one, but only one is alive
-
- return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
-}
-
-u8 GetAbilityBySpecies(u16 species, bool8 altAbility)
-{
- if (altAbility)
- gLastUsedAbility = gBaseStats[species].ability2;
- else
- gLastUsedAbility = gBaseStats[species].ability1;
-
- return gLastUsedAbility;
-}
-
-u8 GetMonAbility(struct Pokemon *mon)
-{
- u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- u8 altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL);
- return GetAbilityBySpecies(species, altAbility);
-}
-
-extern const struct BattleMove gBattleMoves[];
-
-void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
-{
- s32 i, j;
-
- ZeroEnemyPartyMons();
- *gBattleResources->secretBase = *secretBaseRecord;
-
- for (i = 0; i < PARTY_SIZE; i++)
- {
- if (gBattleResources->secretBase->partySpecies[i])
- {
- CreateMon(&gEnemyParty[i],
- gBattleResources->secretBase->partySpecies[i],
- gBattleResources->secretBase->partyLevels[i],
- 15,
- 1,
- gBattleResources->secretBase->partyPersonality[i],
- 2,
- 0);
-
- SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->partyHeldItems[i]);
-
- for (j = 0; j < 6; j++)
- SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->partyEVs[i]);
-
- for (j = 0; j < 4; j++)
- {
- SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->partyMoves[i * 4 + j]);
- SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->partyMoves[i * 4 + j]].pp);
- }
- }
- }
-}
-
-extern const u8 gUnknown_0831F578[];
-extern const u8 gTrainerClassToNameIndex[];
-extern const u8 gSecretBaseTrainerClasses[][5];
-
-u8 GetSecretBaseTrainerPicIndex(void)
-{
- u8 trainerClass = gSecretBaseTrainerClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
- return gUnknown_0831F578[trainerClass];
-}
-
-u8 GetSecretBaseTrainerNameIndex(void)
-{
- u8 trainerClass = gSecretBaseTrainerClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
- return gTrainerClassToNameIndex[trainerClass];
-}
-
-bool8 IsPlayerPartyAndPokemonStorageFull(void)
-{
- s32 i;
-
- for (i = 0; i < 6; i++)
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE)
- return FALSE;
-
- return IsPokemonStorageFull();
-}
-
-extern u32 GetBoxMonDataFromAnyBox(u8 boxNo, u8 boxPos, s32 field);
-
-bool8 IsPokemonStorageFull(void)
-{
- s32 i, j;
-
- for (i = 0; i < 14; i++)
- for (j = 0; j < 30; j++)
- if (GetBoxMonDataFromAnyBox(i, j, MON_DATA_SPECIES) == SPECIES_NONE)
- return FALSE;
-
- return TRUE;
-}
-
-extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
-
-void GetSpeciesName(u8 *name, u16 species)
-{
- s32 i;
-
- for (i = 0; i <= POKEMON_NAME_LENGTH; i++)
- {
- if (species > NUM_SPECIES)
- name[i] = gSpeciesNames[0][i];
- else
- name[i] = gSpeciesNames[species][i];
-
- if (name[i] == EOS)
- break;
- }
-
- name[i] = EOS;
-}
-
-extern const u8 gUnknown_08329D22[];
-extern const u8 gUnknown_08329D26[];
-
-u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex)
-{
- u8 basePP = gBattleMoves[move].pp;
- return basePP + ((basePP * 20 * ((gUnknown_08329D22[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
-}
-
-void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex)
-{
- u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
- ppBonuses &= gUnknown_08329D26[moveIndex];
- SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
-}
-
-void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex)
-{
- mon->ppBonuses &= gUnknown_08329D26[moveIndex];
-}
-
-void sub_803FA70(u8 bank);
-void ClearTemporarySpeciesSpriteData(u8 bank, bool8);
-
-extern struct BattlePokemon gBattleMons[4];
-
-void CopyPlayerPartyMonToBattleData(u8 bank, u8 partyIndex)
-{
- u16* hpSwitchout;
- s32 i;
- u8 nickname[POKEMON_NAME_LENGTH * 2];
-
- gBattleMons[bank].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);
- gBattleMons[bank].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL);
-
- for (i = 0; i < 4; i++)
- {
- gBattleMons[bank].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL);
- gBattleMons[bank].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL);
- }
-
- gBattleMons[bank].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL);
- gBattleMons[bank].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL);
- gBattleMons[bank].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL);
- gBattleMons[bank].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL);
- gBattleMons[bank].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL);
- gBattleMons[bank].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL);
- gBattleMons[bank].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL);
- gBattleMons[bank].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL);
- gBattleMons[bank].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL);
- gBattleMons[bank].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL);
- gBattleMons[bank].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL);
- gBattleMons[bank].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL);
- gBattleMons[bank].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL);
- gBattleMons[bank].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL);
- gBattleMons[bank].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL);
- gBattleMons[bank].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL);
- gBattleMons[bank].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL);
- gBattleMons[bank].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL);
- gBattleMons[bank].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL);
- gBattleMons[bank].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL);
- gBattleMons[bank].altAbility = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ALT_ABILITY, NULL);
- gBattleMons[bank].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL);
- gBattleMons[bank].type1 = gBaseStats[gBattleMons[bank].species].type1;
- gBattleMons[bank].type2 = gBaseStats[gBattleMons[bank].species].type2;
- gBattleMons[bank].ability = GetAbilityBySpecies(gBattleMons[bank].species, gBattleMons[bank].altAbility);
- GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname);
- StringCopy10(gBattleMons[bank].nickname, nickname);
- GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[bank].otName);
-
- hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBankSide(bank)];
- *hpSwitchout = gBattleMons[bank].hp;
-
- for (i = 0; i < 8; i++)
- gBattleMons[bank].statStages[i] = 6;
-
- gBattleMons[bank].status2 = 0;
- sub_803FA70(bank);
- ClearTemporarySpeciesSpriteData(bank, FALSE);
-}
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
deleted file mode 100644
index 01dfc954a..000000000
--- a/src/pokemon_3.c
+++ /dev/null
@@ -1,1749 +0,0 @@
-#include "global.h"
-#include "pokemon.h"
-#include "main.h"
-#include "items.h"
-#include "string_util.h"
-#include "battle_message.h"
-#include "rtc.h"
-#include "item.h"
-#include "battle.h"
-#include "species.h"
-#include "link.h"
-#include "hold_effects.h"
-#include "rng.h"
-#include "trainer_classes.h"
-#include "trainer_ids.h"
-#include "songs.h"
-#include "sound.h"
-#include "m4a.h"
-#include "task.h"
-#include "sprite.h"
-#include "text.h"
-#include "abilities.h"
-#include "pokemon_animation.h"
-#include "pokedex.h"
-
-extern struct BattlePokemon gBattleMons[4];
-extern struct BattleEnigmaBerry gEnigmaBerries[4];
-extern u8 gActiveBank;
-extern u8 gBankInMenu;
-extern u8 gBankTarget;
-extern u8 gBankAttacker;
-extern u8 gStringBank;
-extern u16 gTrainerBattleOpponent_A;
-extern u32 gBattleTypeFlags;
-extern u8 gBattleMonForms[4];
-extern u16 gBattlePartyID[4];
-extern u8 gLastUsedAbility;
-extern u16 gPartnerTrainerId;
-extern u32 gHitMarker;
-
-extern const u16 gSpeciesToHoennPokedexNum[];
-extern const u16 gSpeciesToNationalPokedexNum[];
-extern const u16 gHoennToNationalOrder[];
-extern const u16 gSpeciesIdToCryId[];
-extern const struct SpindaSpot gSpindaSpotGraphics[];
-extern const u8* const gStatNamesTable[];
-extern const u8 gSpeciesNames[][11];
-extern const u8 gUnknown_08329EC8[];
-extern const u8 gText_StatRose[];
-extern const u8 gText_PkmnsStatChanged2[];
-extern const u8 gText_PkmnGettingPumped[];
-extern const u8 gText_PkmnShroudedInMist[];
-extern const s8 gNatureStatTable[][5];
-extern const s8 gUnknown_08329ECE[][3];
-extern const u32 gBitTable[];
-extern const u32 gTMHMLearnsets[][2];
-extern const u8 gText_BattleWallyName[];
-extern const u8 gText_PkmnsXPreventsSwitching[];
-extern const struct CompressedSpritePalette gMonPaletteTable[];
-extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
-extern const u16 gHMMoves[];
-extern const s8 gPokeblockFlavorCompatibilityTable[];
-extern const u8 gMonAnimationDelayTable[];
-extern const u8 gMonFrontAnimIdsTable[];
-
-extern bool8 InBattlePyramid(void);
-extern bool8 InBattlePike(void);
-extern bool8 sub_81D5C18(void);
-extern bool8 sub_806F104(void);
-extern bool32 IsNationalPokedexEnabled(void);
-extern u8 GetTrainerEncounterMusicIdInBattlePyramind(u16 trainerOpponentId);
-extern u8 sub_81D63C8(u16 trainerOpponentId);
-extern u8 sav1_map_get_name(void);
-extern u8 GetFrontierOpponentClass(u16 trainerId);
-extern u8 pokemon_order_func(u8 bankPartyId);
-extern void GetFrontierTrainerName(u8* dest, u16 trainerId);
-extern void sub_81C488C(u8);
-extern void sub_817F578(struct Sprite*, u8 frontAnimId);
-extern u8 GetSpeciesBackAnimId(u16 species);
-
-static void sub_806E6CC(u8 taskId);
-
-bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battleBank)
-{
- u32 status = GetMonData(mon, MON_DATA_STATUS, 0);
-
- if (status & healMask)
- {
- status &= ~healMask;
- SetMonData(mon, MON_DATA_STATUS, (u8 *)&status);
- if (gMain.inBattle && battleBank != 4)
- gBattleMons[battleBank].status1 &= ~healMask;
- return FALSE;
- }
- else
- {
- return TRUE;
- }
-}
-
-u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
-{
- const u8 *temp;
- const u8 *itemEffect;
- u8 offset;
- int i;
- u8 j;
- u8 val;
-
- offset = 6;
-
- temp = gItemEffectTable[itemId - 13];
-
- if (!temp && itemId != ITEM_ENIGMA_BERRY)
- return 0;
-
- if (itemId == ITEM_ENIGMA_BERRY)
- {
- temp = gEnigmaBerries[gActiveBank].itemEffect;
- }
-
- itemEffect = temp;
-
- for (i = 0; i < 6; i++)
- {
- switch (i)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- if (i == effectByte)
- return 0;
- break;
- case 4:
- val = itemEffect[4];
- if (val & 0x20)
- val &= 0xDF;
- j = 0;
- while (val)
- {
- if (val & 1)
- {
- switch (j)
- {
- case 2:
- if (val & 0x10)
- val &= 0xEF;
- case 0:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 1:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 3:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 7:
- if (i == effectByte)
- return 0;
- break;
- }
- }
- j++;
- val >>= 1;
- if (i == effectByte)
- effectBit >>= 1;
- }
- break;
- case 5:
- val = itemEffect[5];
- j = 0;
- while (val)
- {
- if (val & 1)
- {
- switch (j)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 7:
- if (i == effectByte)
- return 0;
- break;
- }
- }
- j++;
- val >>= 1;
- if (i == effectByte)
- effectBit >>= 1;
- }
- break;
- }
- }
-
- return offset;
-}
-
-void sub_806CF24(s32 stat)
-{
- gBankTarget = gBankInMenu;
- StringCopy(gBattleTextBuff1, gStatNamesTable[gUnknown_08329EC8[stat]]);
- StringCopy(gBattleTextBuff2, gText_StatRose);
- BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnsStatChanged2);
-}
-
-u8 *sub_806CF78(u16 itemId)
-{
- int i;
- const u8 *itemEffect;
-
- if (itemId == ITEM_ENIGMA_BERRY)
- {
- if (gMain.inBattle)
- itemEffect = gEnigmaBerries[gBankInMenu].itemEffect;
- else
- itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
- }
- else
- {
- itemEffect = gItemEffectTable[itemId - 13];
- }
-
- gStringBank = gBankInMenu;
-
- for (i = 0; i < 3; i++)
- {
- if (itemEffect[i] & 0xF)
- sub_806CF24(i * 2);
- if (itemEffect[i] & 0xF0)
- {
- if (i)
- {
- sub_806CF24(i * 2 + 1);
- }
- else
- {
- gBankAttacker = gBankInMenu;
- BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnGettingPumped);
- }
- }
- }
-
- if (itemEffect[3] & 0x80)
- {
- gBankAttacker = gBankInMenu;
- BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnShroudedInMist);
- }
-
- return gDisplayedStringBattle;
-}
-
-u8 GetNature(struct Pokemon *mon)
-{
- return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25;
-}
-
-u8 GetNatureFromPersonality(u32 personality)
-{
- return personality % 25;
-}
-
-u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
-{
- int i;
- u16 targetSpecies = 0;
- u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
- u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
- u8 level;
- u16 friendship;
- u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0);
- u16 upperPersonality = personality >> 16;
- u8 holdEffect;
-
- if (heldItem == ITEM_ENIGMA_BERRY)
- holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
- else
- holdEffect = ItemId_GetHoldEffect(heldItem);
-
- if (holdEffect == 38 && type != 3)
- return 0;
-
- switch (type)
- {
- case 0:
- level = GetMonData(mon, MON_DATA_LEVEL, 0);
- friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);
-
- for (i = 0; i < 5; i++)
- {
- switch (gEvolutionTable[species].evolutions[i].method)
- {
- case EVO_FRIENDSHIP:
- if (friendship >= 220)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_FRIENDSHIP_DAY:
- RtcCalcLocalTime();
- if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_FRIENDSHIP_NIGHT:
- RtcCalcLocalTime();
- if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_LEVEL:
- if (gEvolutionTable[species].evolutions[i].param <= level)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_LEVEL_ATK_GT_DEF:
- if (gEvolutionTable[species].evolutions[i].param <= level)
- if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0))
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_LEVEL_ATK_EQ_DEF:
- if (gEvolutionTable[species].evolutions[i].param <= level)
- if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0))
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_LEVEL_ATK_LT_DEF:
- if (gEvolutionTable[species].evolutions[i].param <= level)
- if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0))
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_LEVEL_SILCOON:
- if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) <= 4)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_LEVEL_CASCOON:
- if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) > 4)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_LEVEL_NINJASK:
- if (gEvolutionTable[species].evolutions[i].param <= level)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_BEAUTY:
- if (gEvolutionTable[species].evolutions[i].param <= beauty)
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- }
- }
- break;
- case 1:
- for (i = 0; i < 5; i++)
- {
- switch (gEvolutionTable[species].evolutions[i].method)
- {
- case EVO_TRADE:
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- case EVO_TRADE_ITEM:
- if (gEvolutionTable[species].evolutions[i].param == heldItem)
- {
- heldItem = 0;
- SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&heldItem);
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- }
- break;
- }
- }
- break;
- case 2:
- case 3:
- for (i = 0; i < 5; i++)
- {
- if (gEvolutionTable[species].evolutions[i].method == EVO_ITEM
- && gEvolutionTable[species].evolutions[i].param == evolutionItem)
- {
- targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
- break;
- }
- }
- break;
- }
-
- return targetSpecies;
-}
-
-u16 HoennPokedexNumToSpecies(u16 hoennNum)
-{
- u16 species;
-
- if (!hoennNum)
- return 0;
-
- species = 0;
-
- while (species < 411 && gSpeciesToHoennPokedexNum[species] != hoennNum)
- species++;
-
- if (species == 411)
- return 0;
-
- return species + 1;
-}
-
-u16 NationalPokedexNumToSpecies(u16 nationalNum)
-{
- u16 species;
-
- if (!nationalNum)
- return 0;
-
- species = 0;
-
- while (species < 411 && gSpeciesToNationalPokedexNum[species] != nationalNum)
- species++;
-
- if (species == 411)
- return 0;
-
- return species + 1;
-}
-
-u16 NationalToHoennOrder(u16 nationalNum)
-{
- u16 hoennNum;
-
- if (!nationalNum)
- return 0;
-
- hoennNum = 0;
-
- while (hoennNum < 411 && gHoennToNationalOrder[hoennNum] != nationalNum)
- hoennNum++;
-
- if (hoennNum == 411)
- return 0;
-
- return hoennNum + 1;
-}
-
-u16 SpeciesToNationalPokedexNum(u16 species)
-{
- if (!species)
- return 0;
-
- return gSpeciesToNationalPokedexNum[species - 1];
-}
-
-u16 SpeciesToHoennPokedexNum(u16 species)
-{
- if (!species)
- return 0;
-
- return gSpeciesToHoennPokedexNum[species - 1];
-}
-
-u16 HoennToNationalOrder(u16 hoennNum)
-{
- if (!hoennNum)
- return 0;
-
- return gHoennToNationalOrder[hoennNum - 1];
-}
-
-u16 SpeciesToCryId(u16 species)
-{
- if (species <= 250)
- return species;
-
- if (species < 276)
- return 200;
-
- return gSpeciesIdToCryId[species - 276];
-}
-
-void sub_806D544(u16 species, u32 personality, u8 *dest)
-{
- if (species == SPECIES_SPINDA
- && dest != gMonSpritesGfxPtr->sprites[0]
- && dest != gMonSpritesGfxPtr->sprites[2])
- {
- int i;
- for (i = 0; i < 4; i++)
- {
- int j;
- u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
- u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
-
- for (j = 0; j < 16; j++)
- {
- int k;
- s32 row = gSpindaSpotGraphics[i].image[j];
-
- for (k = x; k < x + 16; k++)
- {
- u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2);
-
- if (row & 1)
- {
- if (k & 1)
- {
- if ((u8)((*val & 0xF0) - 0x10) <= 0x20)
- *val += 0x40;
- }
- else
- {
- if ((u8)((*val & 0xF) - 0x01) <= 0x02)
- *val += 0x04;
- }
- }
-
- row >>= 1;
- }
-
- y++;
- }
-
- personality >>= 8;
- }
- }
-}
-
-void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4)
-{
- if (species == SPECIES_SPINDA && a4)
- {
- int i;
- for (i = 0; i < 4; i++)
- {
- int j;
- u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
- u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
-
- for (j = 0; j < 16; j++)
- {
- int k;
- s32 row = gSpindaSpotGraphics[i].image[j];
-
- for (k = x; k < x + 16; k++)
- {
- u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2);
-
- if (row & 1)
- {
- if (k & 1)
- {
- if ((u8)((*val & 0xF0) - 0x10) <= 0x20)
- *val += 0x40;
- }
- else
- {
- if ((u8)((*val & 0xF) - 0x01) <= 0x02)
- *val += 0x04;
- }
- }
-
- row >>= 1;
- }
-
- y++;
- }
-
- personality >>= 8;
- }
- }
-}
-
-void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies)
-{
- u8 language;
- GetMonData(mon, MON_DATA_NICKNAME, gStringVar1);
- language = GetMonData(mon, MON_DATA_LANGUAGE, &language);
- if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[oldSpecies], gStringVar1))
- SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]);
-}
-
-bool8 sub_806D7EC(void)
-{
- bool8 retVal = FALSE;
- switch (gLinkPlayers[GetMultiplayerId()].lp_field_18)
- {
- case 0:
- case 3:
- retVal = FALSE;
- break;
- case 1:
- case 2:
- retVal = TRUE;
- break;
- }
- return retVal;
-}
-
-bool16 sub_806D82C(u8 id)
-{
- bool16 retVal = FALSE;
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- retVal = FALSE;
- break;
- case 1:
- case 2:
- retVal = TRUE;
- break;
- }
- return retVal;
-}
-
-s32 GetBankMultiplayerId(u16 a1)
-{
- s32 id;
- for (id = 0; id < MAX_LINK_PLAYERS; id++)
- if (gLinkPlayers[id].lp_field_18 == a1)
- break;
- return id;
-}
-
-u8 GetTrainerEncounterMusicId(u16 trainerOpponentId)
-{
- if (InBattlePyramid())
- return GetTrainerEncounterMusicIdInBattlePyramind(trainerOpponentId);
- if (sub_81D5C18())
- return sub_81D63C8(trainerOpponentId);
- return TRAINER_ENCOUNTER_MUSIC(trainerOpponentId);
-}
-
-u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
-{
- if (statIndex < 1 || statIndex > 5)
- {
- // should just be "return n", but it wouldn't match without this
- u16 retVal = n;
- retVal++;
- retVal--;
- return retVal;
- }
-
- switch (gNatureStatTable[nature][statIndex - 1])
- {
- case 1:
- return (u16)(n * 110) / 100;
- case -1:
- return (u16)(n * 90) / 100;
- }
-
- return n;
-}
-
-void AdjustFriendship(struct Pokemon *mon, u8 event)
-{
- u16 species, heldItem;
- u8 holdEffect;
-
- if (sub_806F104())
- return;
-
- species = GetMonData(mon, MON_DATA_SPECIES2, 0);
- heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
-
- if (heldItem == ITEM_ENIGMA_BERRY)
- {
- if (gMain.inBattle)
- holdEffect = gEnigmaBerries[0].holdEffect;
- else
- holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
- }
- else
- {
- holdEffect = ItemId_GetHoldEffect(heldItem);
- }
-
- if (species && species != SPECIES_EGG)
- {
- u8 friendshipLevel = 0;
- s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0);
- if (friendship > 99)
- friendshipLevel++;
- if (friendship > 199)
- friendshipLevel++;
- if ((event != 5 || !(Random() & 1))
- && (event != 3
- || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- && (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_ELITE_FOUR
- || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER
- || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION))))
- {
- s8 mod = gUnknown_08329ECE[event][friendshipLevel];
- if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
- mod = (150 * mod) / 100;
- friendship += mod;
- if (mod > 0)
- {
- if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL)
- friendship++;
- if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name())
- friendship++;
- }
- if (friendship < 0)
- friendship = 0;
- if (friendship > 255)
- friendship = 255;
- SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
- }
- }
-}
-
-void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies)
-{
- u8 evs[NUM_STATS];
- u16 evIncrease = 0;
- u16 totalEVs = 0;
- u16 heldItem;
- u8 holdEffect;
- int i;
-
- for (i = 0; i < NUM_STATS; i++)
- {
- evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0);
- totalEVs += evs[i];
- }
-
- for (i = 0; i < NUM_STATS; i++)
- {
- u8 hasHadPokerus;
- int multiplier;
-
- if (totalEVs >= MAX_TOTAL_EVS)
- break;
-
- hasHadPokerus = CheckPartyHasHadPokerus(mon, 0);
-
- if (hasHadPokerus)
- multiplier = 2;
- else
- multiplier = 1;
-
- switch (i)
- {
- case 0:
- evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier;
- break;
- case 1:
- evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier;
- break;
- case 2:
- evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier;
- break;
- case 3:
- evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier;
- break;
- case 4:
- evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier;
- break;
- case 5:
- evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier;
- break;
- }
-
- heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
-
- if (heldItem == ITEM_ENIGMA_BERRY)
- {
- if (gMain.inBattle)
- holdEffect = gEnigmaBerries[0].holdEffect;
- else
- holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect;
- }
- else
- {
- holdEffect = ItemId_GetHoldEffect(heldItem);
- }
-
- if (holdEffect == HOLD_EFFECT_MACHO_BRACE)
- evIncrease *= 2;
-
- if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS)
- evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease);
-
- if (evs[i] + (s16)evIncrease > 255)
- {
- int val1 = (s16)evIncrease + 255;
- int val2 = evs[i] + evIncrease;
- evIncrease = val1 - val2;
- }
-
- evs[i] += evIncrease;
- totalEVs += evIncrease;
- SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]);
- }
-}
-
-u16 GetMonEVCount(struct Pokemon *mon)
-{
- int i;
- u16 count = 0;
-
- for (i = 0; i < NUM_STATS; i++)
- count += GetMonData(mon, MON_DATA_HP_EV + i, 0);
-
- return count;
-}
-
-void RandomlyGivePartyPokerus(struct Pokemon *party)
-{
- u16 rnd = Random();
- if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000)
- {
- struct Pokemon *mon;
-
- do
- {
- do
- {
- rnd = Random() % PARTY_SIZE;
- mon = &party[rnd];
- }
- while (!GetMonData(mon, MON_DATA_SPECIES, 0));
- }
- while (GetMonData(mon, MON_DATA_IS_EGG, 0));
-
- if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd])))
- {
- u8 rnd2;
-
- do
- {
- rnd2 = Random();
- }
- while ((rnd2 & 0x7) == 0);
-
- if (rnd2 & 0xF0)
- rnd2 &= 0x7;
-
- rnd2 |= (rnd2 << 4);
- rnd2 &= 0xF3;
- rnd2++;
-
- SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2);
- }
- }
-}
-
-u8 CheckPartyPokerus(struct Pokemon *party, u8 selection)
-{
- u8 retVal;
-
- int partyIndex = 0;
- unsigned curBit = 1;
- retVal = 0;
-
- if (selection)
- {
- do
- {
- if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF))
- retVal |= curBit;
- partyIndex++;
- curBit <<= 1;
- selection >>= 1;
- }
- while (selection);
- }
- else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF)
- {
- retVal = 1;
- }
-
- return retVal;
-}
-
-u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection)
-{
- u8 retVal;
-
- int partyIndex = 0;
- unsigned curBit = 1;
- retVal = 0;
-
- if (selection)
- {
- do
- {
- if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0))
- retVal |= curBit;
- partyIndex++;
- curBit <<= 1;
- selection >>= 1;
- }
- while (selection);
- }
- else if (GetMonData(&party[0], MON_DATA_POKERUS, 0))
- {
- retVal = 1;
- }
-
- return retVal;
-}
-
-void UpdatePartyPokerusTime(u16 days)
-{
- int i;
- for (i = 0; i < PARTY_SIZE; i++)
- {
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0))
- {
- u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0);
- if (pokerus & 0xF)
- {
- if ((pokerus & 0xF) < days || days > 4)
- pokerus &= 0xF0;
- else
- pokerus -= days;
-
- if (pokerus == 0)
- pokerus = 0x10;
-
- SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus);
- }
- }
- }
-}
-
-void PartySpreadPokerus(struct Pokemon *party)
-{
- if ((Random() % 3) == 0)
- {
- int i;
- for (i = 0; i < PARTY_SIZE; i++)
- {
- if (GetMonData(&party[i], MON_DATA_SPECIES, 0))
- {
- u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0);
- u8 curPokerus = pokerus;
- if (pokerus)
- {
- if (pokerus & 0xF)
- {
- // spread to adjacent party members
- if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0))
- SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus);
- if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0))
- {
- SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus);
- i++;
- }
- }
- }
- }
- }
- }
-}
-
-bool8 TryIncrementMonLevel(struct Pokemon *mon)
-{
- u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
- u8 nextLevel = GetMonData(mon, MON_DATA_LEVEL, 0) + 1;
- u32 expPoints = GetMonData(mon, MON_DATA_EXP, 0);
- if (expPoints > gExperienceTables[gBaseStats[species].growthRate][MAX_MON_LEVEL])
- {
- expPoints = gExperienceTables[gBaseStats[species].growthRate][MAX_MON_LEVEL];
- SetMonData(mon, MON_DATA_EXP, &expPoints);
- }
- if (nextLevel > MAX_MON_LEVEL || expPoints < gExperienceTables[gBaseStats[species].growthRate][nextLevel])
- {
- return FALSE;
- }
- else
- {
- SetMonData(mon, MON_DATA_LEVEL, &nextLevel);
- return TRUE;
- }
-}
-
-u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm)
-{
- u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
- if (species == SPECIES_EGG)
- {
- return 0;
- }
- else if (tm < 32)
- {
- u32 mask = 1 << tm;
- return gTMHMLearnsets[species][0] & mask;
- }
- else
- {
- u32 mask = 1 << (tm - 32);
- return gTMHMLearnsets[species][1] & mask;
- }
-}
-
-u32 CanSpeciesLearnTMHM(u16 species, u8 tm)
-{
- if (species == SPECIES_EGG)
- {
- return 0;
- }
- else if (tm < 32)
- {
- u32 mask = 1 << tm;
- return gTMHMLearnsets[species][0] & mask;
- }
- else
- {
- u32 mask = 1 << (tm - 32);
- return gTMHMLearnsets[species][1] & mask;
- }
-}
-
-u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves)
-{
- u16 learnedMoves[4];
- u8 numMoves = 0;
- u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
- u8 level = GetMonData(mon, MON_DATA_LEVEL, 0);
- int i, j, k;
-
- for (i = 0; i < 4; i++)
- learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0);
-
- for (i = 0; i < 20; i++)
- {
- u16 moveLevel;
-
- if (gLevelUpLearnsets[species][i] == 0xFFFF)
- break;
-
- moveLevel = gLevelUpLearnsets[species][i] & 0xFE00;
-
- if (moveLevel <= (level << 9))
- {
- for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
- ;
-
- if (j == 4)
- {
- for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++)
- ;
-
- if (k == numMoves)
- moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF;
- }
- }
- }
-
- return numMoves;
-}
-
-u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves)
-{
- u8 numMoves = 0;
- int i;
-
- for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++)
- moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF;
-
- return numMoves;
-}
-
-u8 GetNumberOfRelearnableMoves(struct Pokemon *mon)
-{
- u16 learnedMoves[4];
- u16 moves[20];
- u8 numMoves = 0;
- u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
- u8 level = GetMonData(mon, MON_DATA_LEVEL, 0);
- int i, j, k;
-
- if (species == SPECIES_EGG)
- return 0;
-
- for (i = 0; i < 4; i++)
- learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0);
-
- for (i = 0; i < 20; i++)
- {
- u16 moveLevel;
-
- if (gLevelUpLearnsets[species][i] == 0xFFFF)
- break;
-
- moveLevel = gLevelUpLearnsets[species][i] & 0xFE00;
-
- if (moveLevel <= (level << 9))
- {
- for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
- ;
-
- if (j == 4)
- {
- for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++)
- ;
-
- if (k == numMoves)
- moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF;
- }
- }
- }
-
- return numMoves;
-}
-
-u16 SpeciesToPokedexNum(u16 species)
-{
- if (IsNationalPokedexEnabled())
- {
- return SpeciesToNationalPokedexNum(species);
- }
- else
- {
- species = SpeciesToHoennPokedexNum(species);
- if (species <= 202)
- return species;
- return 0xFFFF;
- }
-}
-
-bool32 sub_806E3F8(u16 species)
-{
- if (SpeciesToHoennPokedexNum(species) > 202)
- return FALSE;
- else
- return TRUE;
-}
-
-void ClearBattleMonForms(void)
-{
- int i;
- for (i = 0; i < 4; i++)
- gBattleMonForms[i] = 0;
-}
-
-u16 GetBattleBGM(void)
-{
- if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
- return 0x1E0;
- if (gBattleTypeFlags & BATTLE_TYPE_REGI)
- return 0x1DF;
- if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
- return 0x1DC;
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- {
- u8 trainerClass;
- if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
- trainerClass = GetFrontierOpponentClass(gTrainerBattleOpponent_A);
- else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
- trainerClass = CLASS_EXPERT;
- else
- trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
- switch (trainerClass)
- {
- case CLASS_AQUA_LEADER:
- case CLASS_MAGMA_LEADER:
- return 0x1E3;
- case CLASS_TEAM_AQUA:
- case CLASS_TEAM_MAGMA:
- case CLASS_AQUA_ADMIN:
- case CLASS_MAGMA_ADMIN:
- return 0x1DB;
- case CLASS_LEADER:
- return 0x1DD;
- case CLASS_CHAMPION:
- return 0x1DE;
- case CLASS_PKMN_TRAINER_RIVAL:
- if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
- return 0x1E1;
- if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, gText_BattleWallyName))
- return 0x1DC;
- return 0x1E1;
- case CLASS_ELITE_FOUR:
- return 0x1E2;
- case CLASS_SALON_MAIDEN:
- case CLASS_DOME_ACE:
- case CLASS_PALACE_MAVEN:
- case CLASS_ARENA_TYCOON:
- case CLASS_FACTORY_HEAD:
- case CLASS_PIKE_QUEEN:
- case CLASS_PYRAMID_KING:
- return 0x1D7;
- default:
- return 0x1DC;
- }
- }
- return 0x1DA;
-}
-
-void PlayBattleBGM(void)
-{
- ResetMapMusic();
- m4aMPlayAllStop();
- PlayBGM(GetBattleBGM());
-}
-
-void PlayMapChosenOrBattleBGM(u16 songId)
-{
- ResetMapMusic();
- m4aMPlayAllStop();
- if (songId)
- PlayNewMapMusic(songId);
- else
- PlayNewMapMusic(GetBattleBGM());
-}
-
-void sub_806E694(u16 songId)
-{
- u8 taskId;
-
- ResetMapMusic();
- m4aMPlayAllStop();
-
- taskId = CreateTask(sub_806E6CC, 0);
- gTasks[taskId].data[0] = songId;
-}
-
-static void sub_806E6CC(u8 taskId)
-{
- if (gTasks[taskId].data[0])
- PlayNewMapMusic(gTasks[taskId].data[0]);
- else
- PlayNewMapMusic(GetBattleBGM());
- DestroyTask(taskId);
-}
-
-const u8 *GetMonFrontSpritePal(struct Pokemon *mon)
-{
- u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
- u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
- return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
-}
-
-// Extracts the upper 16 bits of a 32-bit number
-#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
-
-// Extracts the lower 16 bits of a 32-bit number
-#define LOHALF(n) ((n) & 0xFFFF)
-
-const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
-{
- u32 shinyValue;
-
- if (species > SPECIES_EGG)
- return gMonPaletteTable[0].data;
-
- shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
- if (shinyValue < 8)
- return gMonShinyPaletteTable[species].data;
- else
- return gMonPaletteTable[species].data;
-}
-
-const struct CompressedSpritePalette *sub_806E794(struct Pokemon *mon)
-{
- u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
- u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
- return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
-}
-
-const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality)
-{
- u32 shinyValue;
-
- shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
- if (shinyValue < 8)
- return &gMonShinyPaletteTable[species];
- else
- return &gMonPaletteTable[species];
-}
-
-bool32 IsHMMove2(u16 move)
-{
- int i = 0;
- while (gHMMoves[i] != 0xFFFF)
- {
- if (gHMMoves[i++] == move)
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 IsPokeSpriteNotFlipped(u16 species)
-{
- return gBaseStats[species].noFlip;
-}
-
-s8 GetMonFlavourRelation(struct Pokemon *mon, u8 a2)
-{
- u8 nature = GetNature(mon);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + a2];
-}
-
-s8 GetFlavourRelationByPersonality(u32 personality, u8 a2)
-{
- u8 nature = GetNatureFromPersonality(personality);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + a2];
-}
-
-bool8 IsTradedMon(struct Pokemon *mon)
-{
- u8 otName[8];
- u32 otId;
- GetMonData(mon, MON_DATA_OT_NAME, otName);
- otId = GetMonData(mon, MON_DATA_OT_ID, 0);
- return IsOtherTrainer(otId, otName);
-}
-
-bool8 IsOtherTrainer(u32 otId, u8 *otName)
-{
- if (otId ==
- (gSaveBlock2Ptr->playerTrainerId[0]
- | (gSaveBlock2Ptr->playerTrainerId[1] << 8)
- | (gSaveBlock2Ptr->playerTrainerId[2] << 16)
- | (gSaveBlock2Ptr->playerTrainerId[3] << 24)))
- {
- int i;
-
- for (i = 0; otName[i] != EOS; i++)
- if (otName[i] != gSaveBlock2Ptr->playerName[i])
- return TRUE;
- return FALSE;
- }
-
- return TRUE;
-}
-
-void MonRestorePP(struct Pokemon *mon)
-{
- BoxMonRestorePP(&mon->box);
-}
-
-void BoxMonRestorePP(struct BoxPokemon *boxMon)
-{
- int i;
-
- for (i = 0; i < 4; i++)
- {
- if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0))
- {
- u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0);
- u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0);
- u8 pp = CalculatePPWithBonus(move, bonus, i);
- SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp);
- }
- }
-}
-
-void sub_806E994(void)
-{
- gLastUsedAbility = gBattleStruct->field_B0;
-
- gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN;
- gBattleTextBuff1[1] = B_BUFF_MON_NICK_WITH_PREFIX;
- gBattleTextBuff1[2] = gBattleStruct->field_49;
- gBattleTextBuff1[4] = B_BUFF_EOS;
-
- if (!GetBankSide(gBattleStruct->field_49))
- gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[gBattleStruct->field_49]);
- else
- gBattleTextBuff1[3] = gBattlePartyID[gBattleStruct->field_49];
-
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBankInMenu, pokemon_order_func(gBattlePartyID[gBankInMenu]))
-
- BattleStringExpandPlaceholders(gText_PkmnsXPreventsSwitching, gStringVar4);
-}
-
-struct PokeItem
-{
- u16 species;
- u16 item;
-};
-
-extern const struct PokeItem gAlteringCaveWildMonHeldItems[9];
-
-static s32 GetWildMonTableIdInAlteringCave(u16 species)
-{
- s32 i;
- for (i = 0; i < (s32) ARRAY_COUNT(gAlteringCaveWildMonHeldItems); i++)
- if (gAlteringCaveWildMonHeldItems[i].species == species)
- return i;
- return 0;
-}
-
-void SetWildMonHeldItem(void)
-{
- if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_x100000)))
- {
- u16 rnd = Random() % 100;
- u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);
- u16 var1 = 45;
- u16 var2 = 95;
- if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3, 0)
- && GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES)
- {
- var1 = 20;
- var2 = 80;
- }
- if (gMapHeader.mapDataId == 0x1A4)
- {
- s32 alteringCaveId = GetWildMonTableIdInAlteringCave(species);
- if (alteringCaveId != 0)
- {
- if (rnd < var2)
- return;
- SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gAlteringCaveWildMonHeldItems[alteringCaveId].item);
- }
- else
- {
- if (rnd < var1)
- return;
- if (rnd < var2)
- SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1);
- else
- SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2);
- }
- }
- else
- {
- if (gBaseStats[species].item1 == gBaseStats[species].item2 && gBaseStats[species].item1 != 0)
- {
- SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1);
- }
- else
- {
- if (rnd < var1)
- return;
- if (rnd < var2)
- SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1);
- else
- SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2);
- }
- }
- }
-}
-
-bool8 IsMonShiny(struct Pokemon *mon)
-{
- u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
- return IsShinyOtIdPersonality(otId, personality);
-}
-
-bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
-{
- bool8 retVal = FALSE;
- u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
- if (shinyValue < 8)
- retVal = TRUE;
- return retVal;
-}
-
-const u8* GetTrainerPartnerName(void)
-{
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
- {
- if (gPartnerTrainerId == STEVEN_PARTNER_ID)
- return gTrainers[TRAINER_ID_STEVEN].trainerName;
- else
- {
- GetFrontierTrainerName(gStringVar1, gPartnerTrainerId);
- return gStringVar1;
- }
- }
- else
- {
- u8 id = GetMultiplayerId();
- return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].lp_field_18 ^ 2)].name;
- }
-}
-
-#define READ_PTR_FROM_TASK(taskId, dataId) \
- (void*)( \
- ((u16)(gTasks[taskId].data[dataId]) | \
- ((u16)(gTasks[taskId].data[dataId + 1]) << 0x10)))
-
-#define STORE_PTR_IN_TASK(ptr, taskId, dataId) \
-{ \
- gTasks[taskId].data[dataId] = (u32)(ptr); \
- gTasks[taskId].data[dataId + 1] = (u32)(ptr) >> 0x10; \
-}
-
-static void Task_AnimateAfterDelay(u8 taskId)
-{
- if (--gTasks[taskId].data[3] == 0)
- {
- LaunchAnimationTaskForFrontSprite(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
- DestroyTask(taskId);
- }
-}
-
-static void Task_PokemonSummaryAnimateAfterDelay(u8 taskId)
-{
- if (--gTasks[taskId].data[3] == 0)
- {
- sub_817F578(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
- sub_81C488C(0xFF);
- DestroyTask(taskId);
- }
-}
-
-void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3)
-{
- if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
- DoMonFrontSpriteAnimation(sprite, species, noCry, arg3 | 0x80);
- else
- DoMonFrontSpriteAnimation(sprite, species, noCry, arg3);
-}
-
-extern void SpriteCallbackDummy_2(struct Sprite*);
-extern void sub_817F60C(struct Sprite*);
-
-void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3)
-{
- s8 pan;
- switch (arg3 & 0x7F)
- {
- case 0:
- pan = -25;
- break;
- case 1:
- pan = 25;
- break;
- default:
- pan = 0;
- break;
- }
- if (arg3 & 0x80)
- {
- if (!noCry)
- PlayCry1(species, pan);
- sprite->callback = SpriteCallbackDummy;
- }
- else
- {
- if (!noCry)
- {
- PlayCry1(species, pan);
- if (HasTwoFramesAnimation(species))
- StartSpriteAnim(sprite, 1);
- }
- if (gMonAnimationDelayTable[species - 1] != 0)
- {
- u8 taskId = CreateTask(Task_AnimateAfterDelay, 0);
- STORE_PTR_IN_TASK(sprite, taskId, 0);
- gTasks[taskId].data[2] = gMonFrontAnimIdsTable[species - 1];
- gTasks[taskId].data[3] = gMonAnimationDelayTable[species - 1];
- }
- else
- {
- LaunchAnimationTaskForFrontSprite(sprite, gMonFrontAnimIdsTable[species - 1]);
- }
- sprite->callback = SpriteCallbackDummy_2;
- }
-}
-
-void PokemonSummaryDoMonAnimation(struct Sprite* sprite, u16 species, bool8 oneFrame)
-{
- if (!oneFrame && HasTwoFramesAnimation(species))
- StartSpriteAnim(sprite, 1);
- if (gMonAnimationDelayTable[species - 1] != 0)
- {
- u8 taskId = CreateTask(Task_PokemonSummaryAnimateAfterDelay, 0);
- STORE_PTR_IN_TASK(sprite, taskId, 0);
- gTasks[taskId].data[2] = gMonFrontAnimIdsTable[species - 1];
- gTasks[taskId].data[3] = gMonAnimationDelayTable[species - 1];
- sub_81C488C(taskId);
- sub_817F60C(sprite);
- }
- else
- {
- sub_817F578(sprite, gMonFrontAnimIdsTable[species - 1]);
- }
-}
-
-void sub_806EE98(void)
-{
- u8 delayTaskId = FindTaskIdByFunc(Task_PokemonSummaryAnimateAfterDelay);
- if (delayTaskId != 0xFF)
- DestroyTask(delayTaskId);
-}
-
-void BattleAnimateBackSprite(struct Sprite* sprite, u16 species)
-{
- if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
- {
- sprite->callback = SpriteCallbackDummy;
- }
- else
- {
- LaunchAnimationTaskForBackSprite(sprite, GetSpeciesBackAnimId(species));
- sprite->callback = SpriteCallbackDummy_2;
- }
-}
-
-u8 sub_806EF08(u8 arg0)
-{
- s32 i;
- s32 var = 0;
- u8 multiplayerId = GetMultiplayerId();
- switch (gLinkPlayers[multiplayerId].lp_field_18)
- {
- case 0:
- case 2:
- var = (arg0 != 0) ? 1 : 3;
- break;
- case 1:
- case 3:
- var = (arg0 != 0) ? 2 : 0;
- break;
- }
- for (i = 0; i < 4; i++)
- {
- if (gLinkPlayers[i].lp_field_18 == (s16)(var))
- break;
- }
- return i;
-}
-
-u8 sub_806EF84(u8 arg0, u8 arg1)
-{
- s32 i;
- s32 var = 0;
- switch (gLinkPlayers[arg1].lp_field_18)
- {
- case 0:
- case 2:
- var = (arg0 != 0) ? 1 : 3;
- break;
- case 1:
- case 3:
- var = (arg0 != 0) ? 2 : 0;
- break;
- }
- for (i = 0; i < 4; i++)
- {
- if (gLinkPlayers[i].lp_field_18 == (s16)(var))
- break;
- }
- return i;
-}
-
-extern const u8 gUnknown_0831F578[];
-
-u16 sub_806EFF0(u16 arg0)
-{
- return gUnknown_0831F578[arg0];
-}
-
-u16 PlayerGenderToFrontTrainerPicId(u8 playerGender)
-{
- if (playerGender)
- return sub_806EFF0(0x3F);
- else
- return sub_806EFF0(0x3C);
-}
-
-extern const u8 gTrainerClassNames[][13];
-
-void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
-{
- u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT;
- if (!GetSetPokedexFlag(nationalNum, getFlagCaseId)) // don't set if it's already set
- {
- GetSetPokedexFlag(nationalNum, caseId);
- if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN)
- gSaveBlock2Ptr->pokedex.unownPersonality = personality;
- if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA)
- gSaveBlock2Ptr->pokedex.spindaPersonality = personality;
- }
-}
-
-const u8* GetTrainerClassNameFromId(u16 trainerId)
-{
- if (trainerId > NO_OF_TRAINERS)
- trainerId = 0;
- return gTrainerClassNames[gTrainers[trainerId].trainerClass];
-}
-
-const u8* GetTrainerNameFromId(u16 trainerId)
-{
- if (trainerId > NO_OF_TRAINERS)
- trainerId = 0;
- return gTrainers[trainerId].trainerName;
-}
-
-bool8 HasTwoFramesAnimation(u16 species)
-{
- return (species != SPECIES_CASTFORM
- && species != SPECIES_DEOXYS
- && species != SPECIES_SPINDA
- && species != SPECIES_UNOWN);
-}
-
-bool8 sub_806F104(void)
-{
- if (gMain.inBattle && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER))
- return TRUE;
- if (!gMain.inBattle && (InBattlePike() || InBattlePyramid()))
- return TRUE;
- return FALSE;
-}
-
-/*
-
-extern const struct SpriteTemplate gUnknown_08329D98[];
-
-struct Unknown_806F160_Struct
-{
- u8 field_0;
- u8 field_1;
- u8 field_2;
- u8 field_3;
- u8 field_4;
- u8 field_5;
- u8 field_6;
- u8 field_7;
- u8 field_8;
- u8 field_9;
- u8 field_A;
- u8 field_B;
- struct SpriteTemplate* templates;
-};
-
-void sub_806F160(struct Unknown_806F160_Struct* structPtr)
-{
- u16 i, j;
- for (i = 0; i < structPtr->field_0; i++)
- {
- structPtr->templates[i] = gUnknown_08329D98[i];
- for (j = 0; j < structPtr->field_1)
- {
- // no clue what the pointer in the struct point to :/
- }
- }
-} */
-
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
new file mode 100644
index 000000000..c50aa4a75
--- /dev/null
+++ b/src/pokemon_animation.c
@@ -0,0 +1,5658 @@
+#include "global.h"
+#include "pokemon.h"
+#include "sprite.h"
+#include "pokemon_animation.h"
+#include "trig.h"
+#include "task.h"
+#include "blend_palette.h"
+#include "constants/rgb.h"
+
+struct UnkAnimStruct
+{
+ u16 field_0;
+ s16 field_2;
+ s16 field_4;
+ s16 field_6;
+ s16 field_8;
+};
+
+extern u16 gBattlerPartyIndexes[];
+
+// this file's functions
+static void pokemonanimfunc_00(struct Sprite *sprite);
+static void pokemonanimfunc_01(struct Sprite *sprite);
+static void pokemonanimfunc_02(struct Sprite *sprite);
+static void pokemonanimfunc_03(struct Sprite *sprite);
+static void pokemonanimfunc_04(struct Sprite *sprite);
+static void pokemonanimfunc_05(struct Sprite *sprite);
+static void pokemonanimfunc_06(struct Sprite *sprite);
+static void pokemonanimfunc_07(struct Sprite *sprite);
+static void pokemonanimfunc_08(struct Sprite *sprite);
+static void pokemonanimfunc_09(struct Sprite *sprite);
+static void pokemonanimfunc_0A(struct Sprite *sprite);
+static void pokemonanimfunc_0B(struct Sprite *sprite);
+static void pokemonanimfunc_0C(struct Sprite *sprite);
+static void pokemonanimfunc_0D(struct Sprite *sprite);
+static void pokemonanimfunc_0E(struct Sprite *sprite);
+static void pokemonanimfunc_0F(struct Sprite *sprite);
+static void pokemonanimfunc_10(struct Sprite *sprite);
+static void pokemonanimfunc_11(struct Sprite *sprite);
+static void pokemonanimfunc_12(struct Sprite *sprite);
+static void pokemonanimfunc_13(struct Sprite *sprite);
+static void pokemonanimfunc_14(struct Sprite *sprite);
+static void pokemonanimfunc_15(struct Sprite *sprite);
+static void pokemonanimfunc_16(struct Sprite *sprite);
+static void pokemonanimfunc_17(struct Sprite *sprite);
+static void pokemonanimfunc_18(struct Sprite *sprite);
+static void pokemonanimfunc_19(struct Sprite *sprite);
+static void pokemonanimfunc_1A(struct Sprite *sprite);
+static void pokemonanimfunc_1B(struct Sprite *sprite);
+static void pokemonanimfunc_1C(struct Sprite *sprite);
+static void pokemonanimfunc_1D(struct Sprite *sprite);
+static void pokemonanimfunc_1E(struct Sprite *sprite);
+static void pokemonanimfunc_1F(struct Sprite *sprite);
+static void pokemonanimfunc_20(struct Sprite *sprite);
+static void pokemonanimfunc_21(struct Sprite *sprite);
+static void pokemonanimfunc_22(struct Sprite *sprite);
+static void pokemonanimfunc_23(struct Sprite *sprite);
+static void pokemonanimfunc_24(struct Sprite *sprite);
+static void pokemonanimfunc_25(struct Sprite *sprite);
+static void pokemonanimfunc_26(struct Sprite *sprite);
+static void pokemonanimfunc_27(struct Sprite *sprite);
+static void pokemonanimfunc_28(struct Sprite *sprite);
+static void pokemonanimfunc_29(struct Sprite *sprite);
+static void pokemonanimfunc_2A(struct Sprite *sprite);
+static void pokemonanimfunc_2B(struct Sprite *sprite);
+static void pokemonanimfunc_2C(struct Sprite *sprite);
+static void pokemonanimfunc_2D(struct Sprite *sprite);
+static void pokemonanimfunc_2E(struct Sprite *sprite);
+static void pokemonanimfunc_2F(struct Sprite *sprite);
+static void pokemonanimfunc_30(struct Sprite *sprite);
+static void pokemonanimfunc_31(struct Sprite *sprite);
+static void pokemonanimfunc_32(struct Sprite *sprite);
+static void pokemonanimfunc_33(struct Sprite *sprite);
+static void pokemonanimfunc_34(struct Sprite *sprite);
+static void pokemonanimfunc_35(struct Sprite *sprite);
+static void pokemonanimfunc_36(struct Sprite *sprite);
+static void pokemonanimfunc_37(struct Sprite *sprite);
+static void pokemonanimfunc_38(struct Sprite *sprite);
+static void pokemonanimfunc_39(struct Sprite *sprite);
+static void pokemonanimfunc_3A(struct Sprite *sprite);
+static void pokemonanimfunc_3B(struct Sprite *sprite);
+static void pokemonanimfunc_3C(struct Sprite *sprite);
+static void pokemonanimfunc_3D(struct Sprite *sprite);
+static void pokemonanimfunc_3E(struct Sprite *sprite);
+static void pokemonanimfunc_3F(struct Sprite *sprite);
+static void pokemonanimfunc_40(struct Sprite *sprite);
+static void pokemonanimfunc_41(struct Sprite *sprite);
+static void pokemonanimfunc_42(struct Sprite *sprite);
+static void pokemonanimfunc_43(struct Sprite *sprite);
+static void pokemonanimfunc_44(struct Sprite *sprite);
+static void pokemonanimfunc_45(struct Sprite *sprite);
+static void pokemonanimfunc_46(struct Sprite *sprite);
+static void pokemonanimfunc_47(struct Sprite *sprite);
+static void pokemonanimfunc_48(struct Sprite *sprite);
+static void pokemonanimfunc_49(struct Sprite *sprite);
+static void pokemonanimfunc_4A(struct Sprite *sprite);
+static void pokemonanimfunc_4B(struct Sprite *sprite);
+static void pokemonanimfunc_4C(struct Sprite *sprite);
+static void pokemonanimfunc_4D(struct Sprite *sprite);
+static void pokemonanimfunc_4E(struct Sprite *sprite);
+static void pokemonanimfunc_4F(struct Sprite *sprite);
+static void pokemonanimfunc_50(struct Sprite *sprite);
+static void pokemonanimfunc_51(struct Sprite *sprite);
+static void pokemonanimfunc_52(struct Sprite *sprite);
+static void pokemonanimfunc_53(struct Sprite *sprite);
+static void pokemonanimfunc_54(struct Sprite *sprite);
+static void pokemonanimfunc_55(struct Sprite *sprite);
+static void pokemonanimfunc_56(struct Sprite *sprite);
+static void pokemonanimfunc_57(struct Sprite *sprite);
+static void pokemonanimfunc_58(struct Sprite *sprite);
+static void pokemonanimfunc_59(struct Sprite *sprite);
+static void pokemonanimfunc_5A(struct Sprite *sprite);
+static void pokemonanimfunc_5B(struct Sprite *sprite);
+static void pokemonanimfunc_5C(struct Sprite *sprite);
+static void pokemonanimfunc_5D(struct Sprite *sprite);
+static void pokemonanimfunc_5E(struct Sprite *sprite);
+static void pokemonanimfunc_5F(struct Sprite *sprite);
+static void pokemonanimfunc_60(struct Sprite *sprite);
+static void pokemonanimfunc_61(struct Sprite *sprite);
+static void pokemonanimfunc_62(struct Sprite *sprite);
+static void pokemonanimfunc_63(struct Sprite *sprite);
+static void pokemonanimfunc_64(struct Sprite *sprite);
+static void pokemonanimfunc_65(struct Sprite *sprite);
+static void pokemonanimfunc_66(struct Sprite *sprite);
+static void pokemonanimfunc_67(struct Sprite *sprite);
+static void pokemonanimfunc_68(struct Sprite *sprite);
+static void pokemonanimfunc_69(struct Sprite *sprite);
+static void pokemonanimfunc_6A(struct Sprite *sprite);
+static void pokemonanimfunc_6B(struct Sprite *sprite);
+static void pokemonanimfunc_6C(struct Sprite *sprite);
+static void pokemonanimfunc_6D(struct Sprite *sprite);
+static void pokemonanimfunc_6E(struct Sprite *sprite);
+static void pokemonanimfunc_6F(struct Sprite *sprite);
+static void pokemonanimfunc_70(struct Sprite *sprite);
+static void pokemonanimfunc_71(struct Sprite *sprite);
+static void pokemonanimfunc_72(struct Sprite *sprite);
+static void pokemonanimfunc_73(struct Sprite *sprite);
+static void pokemonanimfunc_74(struct Sprite *sprite);
+static void pokemonanimfunc_75(struct Sprite *sprite);
+static void pokemonanimfunc_76(struct Sprite *sprite);
+static void pokemonanimfunc_77(struct Sprite *sprite);
+static void pokemonanimfunc_78(struct Sprite *sprite);
+static void pokemonanimfunc_79(struct Sprite *sprite);
+static void pokemonanimfunc_7A(struct Sprite *sprite);
+static void pokemonanimfunc_7B(struct Sprite *sprite);
+static void pokemonanimfunc_7C(struct Sprite *sprite);
+static void pokemonanimfunc_7D(struct Sprite *sprite);
+static void pokemonanimfunc_7E(struct Sprite *sprite);
+static void pokemonanimfunc_7F(struct Sprite *sprite);
+static void pokemonanimfunc_80(struct Sprite *sprite);
+static void pokemonanimfunc_81(struct Sprite *sprite);
+static void pokemonanimfunc_82(struct Sprite *sprite);
+static void pokemonanimfunc_83(struct Sprite *sprite);
+static void pokemonanimfunc_84(struct Sprite *sprite);
+static void pokemonanimfunc_85(struct Sprite *sprite);
+static void pokemonanimfunc_86(struct Sprite *sprite);
+static void pokemonanimfunc_87(struct Sprite *sprite);
+static void pokemonanimfunc_88(struct Sprite *sprite);
+static void pokemonanimfunc_89(struct Sprite *sprite);
+static void pokemonanimfunc_8A(struct Sprite *sprite);
+static void pokemonanimfunc_8B(struct Sprite *sprite);
+static void pokemonanimfunc_8C(struct Sprite *sprite);
+static void pokemonanimfunc_8D(struct Sprite *sprite);
+static void pokemonanimfunc_8E(struct Sprite *sprite);
+static void pokemonanimfunc_8F(struct Sprite *sprite);
+static void pokemonanimfunc_90(struct Sprite *sprite);
+static void pokemonanimfunc_91(struct Sprite *sprite);
+static void pokemonanimfunc_92(struct Sprite *sprite);
+static void pokemonanimfunc_93(struct Sprite *sprite);
+static void pokemonanimfunc_94(struct Sprite *sprite);
+static void pokemonanimfunc_95(struct Sprite *sprite);
+static void pokemonanimfunc_96(struct Sprite *sprite);
+
+static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite);
+
+#define STRUCT_COUNT 4
+
+// IWRAM bss
+static IWRAM_DATA struct UnkAnimStruct sUnknown_03001240[STRUCT_COUNT];
+static IWRAM_DATA u8 sUnknown_03001270;
+static IWRAM_DATA bool32 sUnknown_03001274;
+
+// const rom data
+static const u8 sSpeciesToBackAnimSet[] =
+{
+ 0x00, // SPECIES_NONE
+ 0x13, // SPECIES_BULBASAUR
+ 0x02, // SPECIES_IVYSAUR
+ 0x08, // SPECIES_VENUSAUR
+ 0x12, // SPECIES_CHARMANDER
+ 0x15, // SPECIES_CHARMELEON
+ 0x17, // SPECIES_CHARIZARD
+ 0x12, // SPECIES_SQUIRTLE
+ 0x12, // SPECIES_WARTORTLE
+ 0x19, // SPECIES_BLASTOISE
+ 0x02, // SPECIES_CATERPIE
+ 0x13, // SPECIES_METAPOD
+ 0x11, // SPECIES_BUTTERFREE
+ 0x02, // SPECIES_WEEDLE
+ 0x13, // SPECIES_KAKUNA
+ 0x01, // SPECIES_BEEDRILL
+ 0x0f, // SPECIES_PIDGEY
+ 0x15, // SPECIES_PIDGEOTTO
+ 0x0f, // SPECIES_PIDGEOT
+ 0x0a, // SPECIES_RATTATA
+ 0x0a, // SPECIES_RATICATE
+ 0x0f, // SPECIES_SPEAROW
+ 0x15, // SPECIES_FEAROW
+ 0x0f, // SPECIES_EKANS
+ 0x09, // SPECIES_ARBOK
+ 0x16, // SPECIES_PIKACHU
+ 0x16, // SPECIES_RAICHU
+ 0x12, // SPECIES_SANDSHREW
+ 0x10, // SPECIES_SANDSLASH
+ 0x12, // SPECIES_NIDORAN_F
+ 0x15, // SPECIES_NIDORINA
+ 0x09, // SPECIES_NIDOQUEEN
+ 0x12, // SPECIES_NIDORAN_M
+ 0x15, // SPECIES_NIDORINO
+ 0x09, // SPECIES_NIDOKING
+ 0x13, // SPECIES_CLEFAIRY
+ 0x13, // SPECIES_CLEFABLE
+ 0x10, // SPECIES_VULPIX
+ 0x01, // SPECIES_NINETALES
+ 0x13, // SPECIES_JIGGLYPUFF
+ 0x06, // SPECIES_WIGGLYTUFF
+ 0x11, // SPECIES_ZUBAT
+ 0x09, // SPECIES_GOLBAT
+ 0x02, // SPECIES_ODDISH
+ 0x02, // SPECIES_GLOOM
+ 0x14, // SPECIES_VILEPLUME
+ 0x02, // SPECIES_PARAS
+ 0x08, // SPECIES_PARASECT
+ 0x0a, // SPECIES_VENONAT
+ 0x11, // SPECIES_VENOMOTH
+ 0x09, // SPECIES_DIGLETT
+ 0x09, // SPECIES_DUGTRIO
+ 0x10, // SPECIES_MEOWTH
+ 0x0f, // SPECIES_PERSIAN
+ 0x02, // SPECIES_PSYDUCK
+ 0x14, // SPECIES_GOLDUCK
+ 0x10, // SPECIES_MANKEY
+ 0x10, // SPECIES_PRIMEAPE
+ 0x15, // SPECIES_GROWLITHE
+ 0x15, // SPECIES_ARCANINE
+ 0x12, // SPECIES_POLIWAG
+ 0x09, // SPECIES_POLIWHIRL
+ 0x0e, // SPECIES_POLIWRATH
+ 0x14, // SPECIES_ABRA
+ 0x14, // SPECIES_KADABRA
+ 0x0d, // SPECIES_ALAKAZAM
+ 0x15, // SPECIES_MACHOP
+ 0x09, // SPECIES_MACHOKE
+ 0x09, // SPECIES_MACHAMP
+ 0x0b, // SPECIES_BELLSPROUT
+ 0x0b, // SPECIES_WEEPINBELL
+ 0x0b, // SPECIES_VICTREEBEL
+ 0x02, // SPECIES_TENTACOOL
+ 0x02, // SPECIES_TENTACRUEL
+ 0x0e, // SPECIES_GEODUDE
+ 0x08, // SPECIES_GRAVELER
+ 0x08, // SPECIES_GOLEM
+ 0x17, // SPECIES_PONYTA
+ 0x15, // SPECIES_RAPIDASH
+ 0x02, // SPECIES_SLOWPOKE
+ 0x13, // SPECIES_SLOWBRO
+ 0x0f, // SPECIES_MAGNEMITE
+ 0x0f, // SPECIES_MAGNETON
+ 0x02, // SPECIES_FARFETCHD
+ 0x0f, // SPECIES_DODUO
+ 0x15, // SPECIES_DODRIO
+ 0x13, // SPECIES_SEEL
+ 0x02, // SPECIES_DEWGONG
+ 0x0b, // SPECIES_GRIMER
+ 0x0c, // SPECIES_MUK
+ 0x13, // SPECIES_SHELLDER
+ 0x0f, // SPECIES_CLOYSTER
+ 0x01, // SPECIES_GASTLY
+ 0x01, // SPECIES_HAUNTER
+ 0x14, // SPECIES_GENGAR
+ 0x09, // SPECIES_ONIX
+ 0x13, // SPECIES_DROWZEE
+ 0x14, // SPECIES_HYPNO
+ 0x0a, // SPECIES_KRABBY
+ 0x09, // SPECIES_KINGLER
+ 0x15, // SPECIES_VOLTORB
+ 0x15, // SPECIES_ELECTRODE
+ 0x02, // SPECIES_EXEGGCUTE
+ 0x10, // SPECIES_EXEGGUTOR
+ 0x15, // SPECIES_CUBONE
+ 0x10, // SPECIES_MAROWAK
+ 0x02, // SPECIES_HITMONLEE
+ 0x0f, // SPECIES_HITMONCHAN
+ 0x02, // SPECIES_LICKITUNG
+ 0x06, // SPECIES_KOFFING
+ 0x06, // SPECIES_WEEZING
+ 0x0e, // SPECIES_RHYHORN
+ 0x0e, // SPECIES_RHYDON
+ 0x12, // SPECIES_CHANSEY
+ 0x0b, // SPECIES_TANGELA
+ 0x12, // SPECIES_KANGASKHAN
+ 0x13, // SPECIES_HORSEA
+ 0x11, // SPECIES_SEADRA
+ 0x11, // SPECIES_GOLDEEN
+ 0x11, // SPECIES_SEAKING
+ 0x13, // SPECIES_STARYU
+ 0x19, // SPECIES_STARMIE
+ 0x14, // SPECIES_MR_MIME
+ 0x0f, // SPECIES_SCYTHER
+ 0x13, // SPECIES_JYNX
+ 0x16, // SPECIES_ELECTABUZZ
+ 0x17, // SPECIES_MAGMAR
+ 0x0e, // SPECIES_PINSIR
+ 0x0e, // SPECIES_TAUROS
+ 0x10, // SPECIES_MAGIKARP
+ 0x09, // SPECIES_GYARADOS
+ 0x19, // SPECIES_LAPRAS
+ 0x05, // SPECIES_DITTO
+ 0x12, // SPECIES_EEVEE
+ 0x19, // SPECIES_VAPOREON
+ 0x16, // SPECIES_JOLTEON
+ 0x17, // SPECIES_FLAREON
+ 0x01, // SPECIES_PORYGON
+ 0x13, // SPECIES_OMANYTE
+ 0x13, // SPECIES_OMASTAR
+ 0x13, // SPECIES_KABUTO
+ 0x15, // SPECIES_KABUTOPS
+ 0x15, // SPECIES_AERODACTYL
+ 0x13, // SPECIES_SNORLAX
+ 0x19, // SPECIES_ARTICUNO
+ 0x16, // SPECIES_ZAPDOS
+ 0x17, // SPECIES_MOLTRES
+ 0x02, // SPECIES_DRATINI
+ 0x0f, // SPECIES_DRAGONAIR
+ 0x09, // SPECIES_DRAGONITE
+ 0x0d, // SPECIES_MEWTWO
+ 0x12, // SPECIES_MEW
+ 0x12, // SPECIES_CHIKORITA
+ 0x02, // SPECIES_BAYLEEF
+ 0x09, // SPECIES_MEGANIUM
+ 0x12, // SPECIES_CYNDAQUIL
+ 0x15, // SPECIES_QUILAVA
+ 0x17, // SPECIES_TYPHLOSION
+ 0x15, // SPECIES_TOTODILE
+ 0x15, // SPECIES_CROCONAW
+ 0x09, // SPECIES_FERALIGATR
+ 0x12, // SPECIES_SENTRET
+ 0x10, // SPECIES_FURRET
+ 0x11, // SPECIES_HOOTHOOT
+ 0x0f, // SPECIES_NOCTOWL
+ 0x0a, // SPECIES_LEDYBA
+ 0x11, // SPECIES_LEDIAN
+ 0x0a, // SPECIES_SPINARAK
+ 0x02, // SPECIES_ARIADOS
+ 0x0f, // SPECIES_CROBAT
+ 0x0b, // SPECIES_CHINCHOU
+ 0x16, // SPECIES_LANTURN
+ 0x12, // SPECIES_PICHU
+ 0x13, // SPECIES_CLEFFA
+ 0x13, // SPECIES_IGGLYBUFF
+ 0x13, // SPECIES_TOGEPI
+ 0x11, // SPECIES_TOGETIC
+ 0x12, // SPECIES_NATU
+ 0x14, // SPECIES_XATU
+ 0x12, // SPECIES_MAREEP
+ 0x13, // SPECIES_FLAAFFY
+ 0x16, // SPECIES_AMPHAROS
+ 0x11, // SPECIES_BELLOSSOM
+ 0x12, // SPECIES_MARILL
+ 0x13, // SPECIES_AZUMARILL
+ 0x02, // SPECIES_SUDOWOODO
+ 0x10, // SPECIES_POLITOED
+ 0x11, // SPECIES_HOPPIP
+ 0x11, // SPECIES_SKIPLOOM
+ 0x11, // SPECIES_JUMPLUFF
+ 0x10, // SPECIES_AIPOM
+ 0x13, // SPECIES_SUNKERN
+ 0x02, // SPECIES_SUNFLORA
+ 0x11, // SPECIES_YANMA
+ 0x0b, // SPECIES_WOOPER
+ 0x02, // SPECIES_QUAGSIRE
+ 0x14, // SPECIES_ESPEON
+ 0x14, // SPECIES_UMBREON
+ 0x12, // SPECIES_MURKROW
+ 0x13, // SPECIES_SLOWKING
+ 0x01, // SPECIES_MISDREAVUS
+ 0x14, // SPECIES_UNOWN
+ 0x0b, // SPECIES_WOBBUFFET
+ 0x14, // SPECIES_GIRAFARIG
+ 0x08, // SPECIES_PINECO
+ 0x09, // SPECIES_FORRETRESS
+ 0x0f, // SPECIES_DUNSPARCE
+ 0x05, // SPECIES_GLIGAR
+ 0x09, // SPECIES_STEELIX
+ 0x15, // SPECIES_SNUBBULL
+ 0x09, // SPECIES_GRANBULL
+ 0x0d, // SPECIES_QWILFISH
+ 0x15, // SPECIES_SCIZOR
+ 0x13, // SPECIES_SHUCKLE
+ 0x15, // SPECIES_HERACROSS
+ 0x0f, // SPECIES_SNEASEL
+ 0x13, // SPECIES_TEDDIURSA
+ 0x09, // SPECIES_URSARING
+ 0x17, // SPECIES_SLUGMA
+ 0x17, // SPECIES_MAGCARGO
+ 0x0a, // SPECIES_SWINUB
+ 0x08, // SPECIES_PILOSWINE
+ 0x02, // SPECIES_CORSOLA
+ 0x02, // SPECIES_REMORAID
+ 0x05, // SPECIES_OCTILLERY
+ 0x0f, // SPECIES_DELIBIRD
+ 0x02, // SPECIES_MANTINE
+ 0x15, // SPECIES_SKARMORY
+ 0x09, // SPECIES_HOUNDOUR
+ 0x09, // SPECIES_HOUNDOOM
+ 0x19, // SPECIES_KINGDRA
+ 0x15, // SPECIES_PHANPY
+ 0x0e, // SPECIES_DONPHAN
+ 0x01, // SPECIES_PORYGON2
+ 0x13, // SPECIES_STANTLER
+ 0x02, // SPECIES_SMEARGLE
+ 0x0f, // SPECIES_TYROGUE
+ 0x07, // SPECIES_HITMONTOP
+ 0x02, // SPECIES_SMOOCHUM
+ 0x08, // SPECIES_ELEKID
+ 0x17, // SPECIES_MAGBY
+ 0x02, // SPECIES_MILTANK
+ 0x13, // SPECIES_BLISSEY
+ 0x16, // SPECIES_RAIKOU
+ 0x17, // SPECIES_ENTEI
+ 0x19, // SPECIES_SUICUNE
+ 0x0e, // SPECIES_LARVITAR
+ 0x09, // SPECIES_PUPITAR
+ 0x0e, // SPECIES_TYRANITAR
+ 0x19, // SPECIES_LUGIA
+ 0x17, // SPECIES_HO_OH
+ 0x18, // SPECIES_CELEBI
+ 0x00, // SPECIES_OLD_UNOWN_B
+ 0x00, // SPECIES_OLD_UNOWN_C
+ 0x00, // SPECIES_OLD_UNOWN_D
+ 0x00, // SPECIES_OLD_UNOWN_E
+ 0x00, // SPECIES_OLD_UNOWN_F
+ 0x00, // SPECIES_OLD_UNOWN_G
+ 0x00, // SPECIES_OLD_UNOWN_H
+ 0x00, // SPECIES_OLD_UNOWN_I
+ 0x00, // SPECIES_OLD_UNOWN_J
+ 0x00, // SPECIES_OLD_UNOWN_K
+ 0x00, // SPECIES_OLD_UNOWN_L
+ 0x00, // SPECIES_OLD_UNOWN_M
+ 0x00, // SPECIES_OLD_UNOWN_N
+ 0x00, // SPECIES_OLD_UNOWN_O
+ 0x00, // SPECIES_OLD_UNOWN_P
+ 0x00, // SPECIES_OLD_UNOWN_Q
+ 0x00, // SPECIES_OLD_UNOWN_R
+ 0x00, // SPECIES_OLD_UNOWN_S
+ 0x00, // SPECIES_OLD_UNOWN_T
+ 0x00, // SPECIES_OLD_UNOWN_U
+ 0x00, // SPECIES_OLD_UNOWN_V
+ 0x00, // SPECIES_OLD_UNOWN_W
+ 0x00, // SPECIES_OLD_UNOWN_X
+ 0x00, // SPECIES_OLD_UNOWN_Y
+ 0x00, // SPECIES_OLD_UNOWN_Z
+ 0x10, // SPECIES_TREECKO
+ 0x15, // SPECIES_GROVYLE
+ 0x09, // SPECIES_SCEPTILE
+ 0x12, // SPECIES_TORCHIC
+ 0x10, // SPECIES_COMBUSKEN
+ 0x17, // SPECIES_BLAZIKEN
+ 0x02, // SPECIES_MUDKIP
+ 0x12, // SPECIES_MARSHTOMP
+ 0x19, // SPECIES_SWAMPERT
+ 0x12, // SPECIES_POOCHYENA
+ 0x08, // SPECIES_MIGHTYENA
+ 0x0f, // SPECIES_ZIGZAGOON
+ 0x15, // SPECIES_LINOONE
+ 0x0b, // SPECIES_WURMPLE
+ 0x08, // SPECIES_SILCOON
+ 0x11, // SPECIES_BEAUTIFLY
+ 0x08, // SPECIES_CASCOON
+ 0x0f, // SPECIES_DUSTOX
+ 0x02, // SPECIES_LOTAD
+ 0x10, // SPECIES_LOMBRE
+ 0x10, // SPECIES_LUDICOLO
+ 0x13, // SPECIES_SEEDOT
+ 0x09, // SPECIES_NUZLEAF
+ 0x14, // SPECIES_SHIFTRY
+ 0x0a, // SPECIES_NINCADA
+ 0x01, // SPECIES_NINJASK
+ 0x14, // SPECIES_SHEDINJA
+ 0x12, // SPECIES_TAILLOW
+ 0x15, // SPECIES_SWELLOW
+ 0x13, // SPECIES_SHROOMISH
+ 0x15, // SPECIES_BRELOOM
+ 0x07, // SPECIES_SPINDA
+ 0x11, // SPECIES_WINGULL
+ 0x11, // SPECIES_PELIPPER
+ 0x03, // SPECIES_SURSKIT
+ 0x11, // SPECIES_MASQUERAIN
+ 0x19, // SPECIES_WAILMER
+ 0x19, // SPECIES_WAILORD
+ 0x13, // SPECIES_SKITTY
+ 0x12, // SPECIES_DELCATTY
+ 0x01, // SPECIES_KECLEON
+ 0x13, // SPECIES_BALTOY
+ 0x14, // SPECIES_CLAYDOL
+ 0x0e, // SPECIES_NOSEPASS
+ 0x17, // SPECIES_TORKOAL
+ 0x01, // SPECIES_SABLEYE
+ 0x0b, // SPECIES_BARBOACH
+ 0x09, // SPECIES_WHISCASH
+ 0x04, // SPECIES_LUVDISC
+ 0x0f, // SPECIES_CORPHISH
+ 0x15, // SPECIES_CRAWDAUNT
+ 0x03, // SPECIES_FEEBAS
+ 0x19, // SPECIES_MILOTIC
+ 0x04, // SPECIES_CARVANHA
+ 0x15, // SPECIES_SHARPEDO
+ 0x13, // SPECIES_TRAPINCH
+ 0x01, // SPECIES_VIBRAVA
+ 0x0f, // SPECIES_FLYGON
+ 0x0e, // SPECIES_MAKUHITA
+ 0x0e, // SPECIES_HARIYAMA
+ 0x15, // SPECIES_ELECTRIKE
+ 0x09, // SPECIES_MANECTRIC
+ 0x0e, // SPECIES_NUMEL
+ 0x17, // SPECIES_CAMERUPT
+ 0x13, // SPECIES_SPHEAL
+ 0x09, // SPECIES_SEALEO
+ 0x09, // SPECIES_WALREIN
+ 0x0a, // SPECIES_CACNEA
+ 0x08, // SPECIES_CACTURNE
+ 0x0f, // SPECIES_SNORUNT
+ 0x0f, // SPECIES_GLALIE
+ 0x13, // SPECIES_LUNATONE
+ 0x13, // SPECIES_SOLROCK
+ 0x10, // SPECIES_AZURILL
+ 0x10, // SPECIES_SPOINK
+ 0x14, // SPECIES_GRUMPIG
+ 0x12, // SPECIES_PLUSLE
+ 0x12, // SPECIES_MINUN
+ 0x09, // SPECIES_MAWILE
+ 0x14, // SPECIES_MEDITITE
+ 0x14, // SPECIES_MEDICHAM
+ 0x11, // SPECIES_SWABLU
+ 0x11, // SPECIES_ALTARIA
+ 0x12, // SPECIES_WYNAUT
+ 0x01, // SPECIES_DUSKULL
+ 0x01, // SPECIES_DUSCLOPS
+ 0x18, // SPECIES_ROSELIA
+ 0x02, // SPECIES_SLAKOTH
+ 0x10, // SPECIES_VIGOROTH
+ 0x08, // SPECIES_SLAKING
+ 0x0b, // SPECIES_GULPIN
+ 0x0b, // SPECIES_SWALOT
+ 0x0e, // SPECIES_TROPIUS
+ 0x13, // SPECIES_WHISMUR
+ 0x09, // SPECIES_LOUDRED
+ 0x0d, // SPECIES_EXPLOUD
+ 0x13, // SPECIES_CLAMPERL
+ 0x11, // SPECIES_HUNTAIL
+ 0x11, // SPECIES_GOREBYSS
+ 0x14, // SPECIES_ABSOL
+ 0x01, // SPECIES_SHUPPET
+ 0x01, // SPECIES_BANETTE
+ 0x0b, // SPECIES_SEVIPER
+ 0x15, // SPECIES_ZANGOOSE
+ 0x02, // SPECIES_RELICANTH
+ 0x15, // SPECIES_ARON
+ 0x09, // SPECIES_LAIRON
+ 0x0e, // SPECIES_AGGRON
+ 0x11, // SPECIES_CASTFORM
+ 0x11, // SPECIES_VOLBEAT
+ 0x11, // SPECIES_ILLUMISE
+ 0x0c, // SPECIES_LILEEP
+ 0x0b, // SPECIES_CRADILY
+ 0x0f, // SPECIES_ANORITH
+ 0x09, // SPECIES_ARMALDO
+ 0x14, // SPECIES_RALTS
+ 0x14, // SPECIES_KIRLIA
+ 0x14, // SPECIES_GARDEVOIR
+ 0x09, // SPECIES_BAGON
+ 0x09, // SPECIES_SHELGON
+ 0x08, // SPECIES_SALAMENCE
+ 0x0f, // SPECIES_BELDUM
+ 0x15, // SPECIES_METANG
+ 0x09, // SPECIES_METAGROSS
+ 0x09, // SPECIES_REGIROCK
+ 0x09, // SPECIES_REGICE
+ 0x09, // SPECIES_REGISTEEL
+ 0x19, // SPECIES_KYOGRE
+ 0x17, // SPECIES_GROUDON
+ 0x0d, // SPECIES_RAYQUAZA
+ 0x01, // SPECIES_LATIAS
+ 0x01, // SPECIES_LATIOS
+ 0x11, // SPECIES_JIRACHI
+ 0x14, // SPECIES_DEOXYS
+ 0x11, // SPECIES_CHIMECHO
+};
+
+static const u8 sUnknown_0860AA64[][2] =
+{
+ {0, 5},
+ {1, 1},
+ {0, 15},
+ {1, 4},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {0, 0xFF}
+};
+
+static const u8 sUnknown_0860AA80[][2] =
+{
+ {6, 30},
+ {0xFE, 15},
+ {6, 30},
+ {0xFF, 0}
+};
+
+static void (* const sMonAnimFunctions[])(struct Sprite *sprite) =
+{
+ pokemonanimfunc_00,
+ pokemonanimfunc_01,
+ pokemonanimfunc_02,
+ pokemonanimfunc_03,
+ pokemonanimfunc_04,
+ pokemonanimfunc_05,
+ pokemonanimfunc_06,
+ pokemonanimfunc_07,
+ pokemonanimfunc_08,
+ pokemonanimfunc_09,
+ pokemonanimfunc_0A,
+ pokemonanimfunc_0B,
+ pokemonanimfunc_0C,
+ pokemonanimfunc_0D,
+ pokemonanimfunc_0E,
+ pokemonanimfunc_0F,
+ pokemonanimfunc_10,
+ pokemonanimfunc_11,
+ pokemonanimfunc_12,
+ pokemonanimfunc_13,
+ pokemonanimfunc_14,
+ pokemonanimfunc_15,
+ pokemonanimfunc_16,
+ pokemonanimfunc_17,
+ pokemonanimfunc_18,
+ pokemonanimfunc_19,
+ pokemonanimfunc_1A,
+ pokemonanimfunc_1B,
+ pokemonanimfunc_1C,
+ pokemonanimfunc_1D,
+ pokemonanimfunc_1E,
+ pokemonanimfunc_1F,
+ pokemonanimfunc_20,
+ pokemonanimfunc_21,
+ pokemonanimfunc_22,
+ pokemonanimfunc_23,
+ pokemonanimfunc_24,
+ pokemonanimfunc_25,
+ pokemonanimfunc_26,
+ pokemonanimfunc_27,
+ pokemonanimfunc_28,
+ pokemonanimfunc_29,
+ pokemonanimfunc_2A,
+ pokemonanimfunc_2B,
+ pokemonanimfunc_2C,
+ pokemonanimfunc_2D,
+ pokemonanimfunc_2E,
+ pokemonanimfunc_2F,
+ pokemonanimfunc_30,
+ pokemonanimfunc_31,
+ pokemonanimfunc_32,
+ pokemonanimfunc_33,
+ pokemonanimfunc_34,
+ pokemonanimfunc_35,
+ pokemonanimfunc_36,
+ pokemonanimfunc_37,
+ pokemonanimfunc_38,
+ pokemonanimfunc_39,
+ pokemonanimfunc_3A,
+ pokemonanimfunc_3B,
+ pokemonanimfunc_3C,
+ pokemonanimfunc_3D,
+ pokemonanimfunc_3E,
+ pokemonanimfunc_3F,
+ pokemonanimfunc_40,
+ pokemonanimfunc_41,
+ pokemonanimfunc_42,
+ pokemonanimfunc_43,
+ pokemonanimfunc_44,
+ pokemonanimfunc_45,
+ pokemonanimfunc_46,
+ pokemonanimfunc_47,
+ pokemonanimfunc_48,
+ pokemonanimfunc_49,
+ pokemonanimfunc_4A,
+ pokemonanimfunc_4B,
+ pokemonanimfunc_4C,
+ pokemonanimfunc_4D,
+ pokemonanimfunc_4E,
+ pokemonanimfunc_4F,
+ pokemonanimfunc_50,
+ pokemonanimfunc_51,
+ pokemonanimfunc_52,
+ pokemonanimfunc_53,
+ pokemonanimfunc_54,
+ pokemonanimfunc_55,
+ pokemonanimfunc_56,
+ pokemonanimfunc_57,
+ pokemonanimfunc_58,
+ pokemonanimfunc_59,
+ pokemonanimfunc_5A,
+ pokemonanimfunc_5B,
+ pokemonanimfunc_5C,
+ pokemonanimfunc_5D,
+ pokemonanimfunc_5E,
+ pokemonanimfunc_5F,
+ pokemonanimfunc_60,
+ pokemonanimfunc_61,
+ pokemonanimfunc_62,
+ pokemonanimfunc_63,
+ pokemonanimfunc_64,
+ pokemonanimfunc_65,
+ pokemonanimfunc_66,
+ pokemonanimfunc_67,
+ pokemonanimfunc_68,
+ pokemonanimfunc_69,
+ pokemonanimfunc_6A,
+ pokemonanimfunc_6B,
+ pokemonanimfunc_6C,
+ pokemonanimfunc_6D,
+ pokemonanimfunc_6E,
+ pokemonanimfunc_6F,
+ pokemonanimfunc_70,
+ pokemonanimfunc_71,
+ pokemonanimfunc_72,
+ pokemonanimfunc_73,
+ pokemonanimfunc_74,
+ pokemonanimfunc_75,
+ pokemonanimfunc_76,
+ pokemonanimfunc_77,
+ pokemonanimfunc_78,
+ pokemonanimfunc_79,
+ pokemonanimfunc_7A,
+ pokemonanimfunc_7B,
+ pokemonanimfunc_7C,
+ pokemonanimfunc_7D,
+ pokemonanimfunc_7E,
+ pokemonanimfunc_7F,
+ pokemonanimfunc_80,
+ pokemonanimfunc_81,
+ pokemonanimfunc_82,
+ pokemonanimfunc_83,
+ pokemonanimfunc_84,
+ pokemonanimfunc_85,
+ pokemonanimfunc_86,
+ pokemonanimfunc_87,
+ pokemonanimfunc_88,
+ pokemonanimfunc_89,
+ pokemonanimfunc_8A,
+ pokemonanimfunc_8B,
+ pokemonanimfunc_8C,
+ pokemonanimfunc_8D,
+ pokemonanimfunc_8E,
+ pokemonanimfunc_8F,
+ pokemonanimfunc_90,
+ pokemonanimfunc_91,
+ pokemonanimfunc_92,
+ pokemonanimfunc_93,
+ pokemonanimfunc_94,
+ pokemonanimfunc_95,
+ pokemonanimfunc_96
+};
+
+// counting from Id 1, because 0 in sSpeciesToBackAnimSet is used for mons with no back animation
+static const u8 sBackAnimationIds[] =
+{
+ 0x60, 0x5f, 0x02, // 1
+ 0x5e, 0x03, 0x46, // 2
+ 0x6d, 0x3e, 0x6e, // 3
+ 0x6f, 0x70, 0x3f, // 4
+ 0x71, 0x13, 0x72, // 5
+ 0x6c, 0x6b, 0x3a, // 6
+ 0x64, 0x14, 0x4f, // 7
+ 0x5d, 0x0f, 0x4c, // 8
+ 0x61, 0x57, 0x58, // 9
+ 0x67, 0x66, 0x59, // 0xA
+ 0x74, 0x73, 0x5a, // 0xB
+ 0x75, 0x76, 0x5b, // 0xC
+ 0x77, 0x78, 0x65, // 0xD
+ 0x63, 0x5c, 0x62, // 0xE
+ 0x6a, 0x69, 0x68, // 0xF
+ 0x7b, 0x7a, 0x79, // 0x10
+ 0x7e, 0x7d, 0x7c, // 0x11
+ 0x81, 0x80, 0x7f, // 0x12
+ 0x84, 0x82, 0x83, // 0x13
+ 0x85, 0x86, 0x87, // 0x14
+ 0x88, 0x89, 0x8a, // 0x15
+ 0x8b, 0x8c, 0x8d, // 0x16
+ 0x8e, 0x8f, 0x90, // 0x17
+ 0x91, 0x92, 0x93, // 0x18
+ 0x94, 0x95, 0x96, // 0x19
+};
+
+static const u8 sBackAnimNatureModTable[] =
+{
+ 0x00, // NATURE_HARDY
+ 0x02, // NATURE_LONELY
+ 0x00, // NATURE_BRAVE
+ 0x00, // NATURE_ADAMANT
+ 0x00, // NATURE_NAUGHTY
+ 0x01, // NATURE_BOLD
+ 0x01, // NATURE_DOCILE
+ 0x01, // NATURE_RELAXED
+ 0x00, // NATURE_IMPISH
+ 0x01, // NATURE_LAX
+ 0x02, // NATURE_TIMID
+ 0x00, // NATURE_HASTY
+ 0x01, // NATURE_SERIOUS
+ 0x00, // NATURE_JOLLY
+ 0x00, // NATURE_NAIVE
+ 0x02, // NATURE_MODEST
+ 0x02, // NATURE_MILD
+ 0x02, // NATURE_QUIET
+ 0x02, // NATURE_BASHFUL
+ 0x01, // NATURE_RASH
+ 0x01, // NATURE_CALM
+ 0x02, // NATURE_GENTLE
+ 0x01, // NATURE_SASSY
+ 0x02, // NATURE_CAREFUL
+ 0x01, // NATURE_QUIRKY
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_860AD48[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMDTYPE_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_860AD58[] =
+{
+ AFFINEANIMCMD_FRAME(-256, 256, 0, 0),
+ AFFINEANIMCMDTYPE_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_860AD68[] =
+{
+ sSpriteAffineAnim_860AD48,
+ sSpriteAffineAnim_860AD58
+};
+
+// code
+static void MonAnimDummySpriteCallback(struct Sprite *sprite)
+{
+}
+
+static void sub_817F3F0(struct Sprite *sprite, u16 index, s16 amplitudeX, s16 amplitudeY)
+{
+ s16 xAdder, yAdder;
+
+ amplitudeX *= -1;
+ amplitudeY *= -1;
+
+ xAdder = Cos(index, amplitudeX) - Sin(index, amplitudeY);
+ yAdder = Cos(index, amplitudeY) + Sin(index, amplitudeX);
+
+ amplitudeX *= -1;
+ amplitudeY *= -1;
+
+ sprite->pos2.x = xAdder + amplitudeX;
+ sprite->pos2.y = yAdder + amplitudeY;
+}
+
+u8 GetSpeciesBackAnimSet(u16 species)
+{
+ if (sSpeciesToBackAnimSet[species] != 0)
+ return sSpeciesToBackAnimSet[species] - 1;
+ else
+ return 0;
+}
+
+#define tState data[0]
+#define tPtrLO data[1]
+#define tPtrHI data[2]
+#define tAnimId data[3]
+#define tSaved0 data[4]
+#define tSaved2 data[5]
+
+static void Task_HandleMonAnimation(u8 taskId)
+{
+ u32 i;
+ struct Sprite *sprite = (struct Sprite*)(u32)((gTasks[taskId].tPtrLO << 0x10) | (gTasks[taskId].tPtrHI));
+
+ if (gTasks[taskId].tState == 0)
+ {
+ gTasks[taskId].tSaved0 = sprite->data[0];
+ gTasks[taskId].tSaved2 = sprite->data[2];
+ sprite->data[1] = 1;
+ sprite->data[0] = 0;
+
+ for (i = 2; i < ARRAY_COUNT(sprite->data); i++)
+ sprite->data[i] = 0;
+
+ sprite->callback = sMonAnimFunctions[gTasks[taskId].tAnimId];
+ sUnknown_03001274 = FALSE;
+
+ gTasks[taskId].tState++;
+ }
+ if (sprite->callback == SpriteCallbackDummy)
+ {
+ sprite->data[0] = gTasks[taskId].tSaved0;
+ sprite->data[2] = gTasks[taskId].tSaved2;
+ sprite->data[1] = 0;
+
+ DestroyTask(taskId);
+ }
+}
+
+void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId)
+{
+ u8 taskId = CreateTask(Task_HandleMonAnimation, 128);
+ gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrHI = (u32)(sprite);
+ gTasks[taskId].tAnimId = frontAnimId;
+}
+
+void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId)
+{
+ sUnknown_03001274 = TRUE;
+ sprite->callback = sMonAnimFunctions[frontAnimId];
+}
+
+void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet)
+{
+ u8 nature, taskId, animId, bank;
+
+ taskId = CreateTask(Task_HandleMonAnimation, 128);
+ gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrHI = (u32)(sprite);
+
+ bank = sprite->data[0];
+ nature = GetNature(&gPlayerParty[gBattlerPartyIndexes[bank]]);
+
+ animId = 3 * backAnimSet + sBackAnimNatureModTable[nature];
+ gTasks[taskId].tAnimId = sBackAnimationIds[animId];
+}
+
+#undef tState
+#undef tPtrLO
+#undef tPtrHI
+#undef tAnimId
+#undef tSaved0
+#undef tSaved2
+
+void SetSpriteCB_MonAnimDummy(struct Sprite *sprite)
+{
+ sprite->callback = MonAnimDummySpriteCallback;
+}
+
+static void SetAffineData(struct Sprite *sprite, s16 xScale, s16 yScale, u16 rotation)
+{
+ u8 matrixNum;
+ struct ObjAffineSrcData affineSrcData;
+ struct OamMatrix dest;
+
+ affineSrcData.xScale = xScale;
+ affineSrcData.yScale = yScale;
+ affineSrcData.rotation = rotation;
+
+ matrixNum = sprite->oam.matrixNum;
+
+ ObjAffineSet(&affineSrcData, &dest, 1, 2);
+ gOamMatrices[matrixNum].a = dest.a;
+ gOamMatrices[matrixNum].b = dest.b;
+ gOamMatrices[matrixNum].c = dest.c;
+ gOamMatrices[matrixNum].d = dest.d;
+}
+
+static void HandleStartAffineAnim(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 3;
+ sprite->affineAnims = sSpriteAffineAnimTable_860AD68;
+
+ if (sUnknown_03001274 == TRUE)
+ InitSpriteAffineAnim(sprite);
+
+ if (!sprite->data[1])
+ StartSpriteAffineAnim(sprite, 1);
+ else
+ StartSpriteAffineAnim(sprite, 0);
+
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
+ sprite->affineAnimPaused = 1;
+}
+
+static void HandleSetAffineData(struct Sprite *sprite, s16 xScale, s16 yScale, u16 rotation)
+{
+ if (!sprite->data[1])
+ {
+ xScale *= -1;
+ rotation *= -1;
+ }
+
+ SetAffineData(sprite, xScale, yScale, rotation);
+}
+
+static void sub_817F70C(struct Sprite *sprite)
+{
+ if (!sprite->data[1])
+ sprite->pos2.x *= -1;
+}
+
+static bool32 sub_817F724(u8 id)
+{
+ if (id >= STRUCT_COUNT)
+ {
+ return FALSE;
+ }
+ else
+ {
+ sUnknown_03001240[id].field_6 = 0;
+ sUnknown_03001240[id].field_0 = 0;
+ sUnknown_03001240[id].field_4 = 1;
+ sUnknown_03001240[id].field_2 = 0;
+ sUnknown_03001240[id].field_8 = 0;
+ return TRUE;
+ }
+}
+
+static u8 sub_817F758(void)
+{
+ sUnknown_03001270 = (sUnknown_03001270 + 1) % STRUCT_COUNT;
+ sub_817F724(sUnknown_03001270);
+ return sUnknown_03001270;
+}
+
+static void sub_817F77C(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 1;
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
+
+ if (sUnknown_03001274 == TRUE)
+ {
+ if (!sprite->data[1])
+ sprite->hFlip = 1;
+ else
+ sprite->hFlip = 0;
+
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.matrixNum |= (sprite->hFlip << 3);
+ sprite->oam.affineMode = 0;
+ }
+}
+
+static void pokemonanimfunc_01(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 var = (sprite->data[2] * 512 / 40) % 256;
+
+ sprite->data[4] = Sin(var, 32) + 256;
+ sprite->data[5] = Cos(var, 32) + 256;
+ HandleSetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_02(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 6) * sign;
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_817F8FC(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sprite->data[0])
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ sprite->pos2.x = Sin((sprite->data[2] * 384 / sprite->data[0]) % 256, 6);
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_03(struct Sprite *sprite)
+{
+ sprite->data[0] = 40;
+ sub_817F8FC(sprite);
+ sprite->callback = sub_817F8FC;
+}
+
+static void sub_817F978(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sprite->data[0])
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = -(Sin((sprite->data[2] * 384 / sprite->data[0]) % 256, 6));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_04(struct Sprite *sprite)
+{
+ sprite->data[0] = 40;
+ sub_817F978(sprite);
+ sprite->callback = sub_817F978;
+}
+
+#ifdef NONMATCHING
+static void sub_817F9F4(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 384)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s32 divCounter = counter / 128;
+
+ switch (divCounter)
+ {
+ case 0:
+ case 1:
+ sprite->pos2.y = -(Sin(counter % 128, sprite->data[0] * 2));
+ break;
+ case 2:
+ case 3:
+ sprite->pos2.y = -(Sin(counter - 256, sprite->data[0] * 3));
+ break;
+ }
+ }
+
+ sprite->data[2] += 12;
+}
+
+#else
+NAKED
+static void sub_817F9F4(struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ adds r4, r0, 0\n\
+ movs r0, 0x32\n\
+ ldrsh r1, [r4, r0]\n\
+ movs r0, 0xC0\n\
+ lsls r0, 1\n\
+ cmp r1, r0\n\
+ ble _0817FA14\n\
+ ldr r0, =SpriteCB_SetDummyOnAnimEnd\n\
+ str r0, [r4, 0x1C]\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x24]\n\
+ b _0817FA5E\n\
+ .pool\n\
+_0817FA14:\n\
+ adds r0, r1, 0\n\
+ cmp r1, 0\n\
+ bge _0817FA1C\n\
+ adds r0, 0x7F\n\
+_0817FA1C:\n\
+ asrs r2, r0, 7\n\
+ lsls r0, r2, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0\n\
+ blt _0817FA60\n\
+ cmp r0, 0x1\n\
+ ble _0817FA48\n\
+ cmp r0, 0x3\n\
+ bgt _0817FA60\n\
+ ldr r2, =0xffffff00\n\
+ adds r1, r2\n\
+ lsls r0, r1, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x2E\n\
+ ldrsh r2, [r4, r1]\n\
+ lsls r1, r2, 1\n\
+ adds r1, r2\n\
+ lsls r1, 16\n\
+ b _0817FA56\n\
+ .pool\n\
+_0817FA48:\n\
+ lsls r0, r2, 7\n\
+ subs r0, r1, r0\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r2, 0x2E\n\
+ ldrsh r1, [r4, r2]\n\
+ lsls r1, 17\n\
+_0817FA56:\n\
+ asrs r1, 16\n\
+ bl Sin\n\
+ negs r0, r0\n\
+_0817FA5E:\n\
+ strh r0, [r4, 0x26]\n\
+_0817FA60:\n\
+ ldrh r0, [r4, 0x32]\n\
+ adds r0, 0xC\n\
+ strh r0, [r4, 0x32]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided");
+}
+
+#endif // NONMATCHING
+
+static void pokemonanimfunc_1E(struct Sprite *sprite)
+{
+ sprite->data[0] = 4;
+ sub_817F9F4(sprite);
+ sprite->callback = sub_817F9F4;
+}
+
+static void pokemonanimfunc_06(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 768)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s16 divCounter = counter / 128;
+
+ switch (divCounter)
+ {
+ case 0:
+ case 1:
+ sprite->pos2.x = 0;
+ break;
+ case 2:
+ counter = 0;
+ break;
+ case 3:
+ sprite->pos2.x = -(counter % 128 * 8) / 128;
+ break;
+ case 4:
+ sprite->pos2.x = (counter % 128) / 8 - 8;
+ break;
+ case 5:
+ sprite->pos2.x = -(counter % 128 * 8) / 128 + 8;
+ break;
+ }
+
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ }
+
+ sprite->data[2] += 12;
+}
+
+static void pokemonanimfunc_09(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256 / 40) % 256;
+
+ if (sprite->data[2] % 2 == 0)
+ {
+ sprite->data[4] = Sin(index, 32) + 256;
+ sprite->data[5] = Sin(index, 32) + 256;
+ }
+ else
+ {
+ sprite->data[4] = Sin(index, 8) + 256;
+ sprite->data[5] = Sin(index, 8) + 256;
+ }
+
+ HandleSetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static const s8 sUnknown_0860AD70[][3] =
+{
+ {-1, -1, 6},
+ {2, 0, 6},
+ {-2, 2, 6},
+ {2, 0, 6},
+ {-2, -2, 6},
+ {2, 0, 6},
+ {-2, 2, 6},
+ {2, 0, 6},
+ {-1, -1, 6},
+ {0, 0, 0},
+};
+
+static void sub_817FC20(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] == 0)
+ sprite->data[3] = 0;
+
+ if (sUnknown_0860AD70[sprite->data[3]][2] == sprite->data[2])
+ {
+ if (sUnknown_0860AD70[sprite->data[3]][2] == 0)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[3]++;
+ sprite->data[2] = 0;
+ }
+ }
+
+ if (sUnknown_0860AD70[sprite->data[3]][2] == 0)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->pos2.x += sUnknown_0860AD70[sprite->data[3]][0];
+ sprite->pos2.y += sUnknown_0860AD70[sprite->data[3]][1];
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_0A(struct Sprite *sprite)
+{
+ sub_817FC20(sprite);
+ sprite->callback = sub_817FC20;
+}
+
+static void sub_817FCDC(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 2304)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ sprite->pos2.x = Sin(counter % 256, sprite->data[7]);
+ }
+
+ sprite->data[2] += sprite->data[0];
+}
+
+static void pokemonanimfunc_0F(struct Sprite *sprite)
+{
+ sprite->data[0] = 60;
+ sprite->data[7] = 3;
+ sub_817FCDC(sprite);
+ sprite->callback = sub_817FCDC;
+}
+
+static void sub_817FD44(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 2304)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin(counter % 256, 3);
+ }
+
+ sprite->data[2] += sprite->data[0];
+}
+
+static void pokemonanimfunc_10(struct Sprite *sprite)
+{
+ sprite->data[0] = 60;
+ sub_817FD44(sprite);
+ sprite->callback = sub_817FD44;
+}
+
+static void pokemonanimfunc_11(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 512)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s8 sign;
+ s32 index, amplitude;
+
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ amplitude = Sin(sprite->data[2] / 4, 8);
+ index = sprite->data[2] % 256;
+
+ sprite->pos2.y = Sin(index, amplitude) * sign;
+ sprite->pos2.x = Cos(index, amplitude) * sign;
+ }
+
+ sprite->data[2] += 9;
+}
+
+static void sub_817FE30(struct Sprite *sprite)
+{
+ s16 id = sprite->data[0];
+
+ if (sUnknown_03001240[id].field_0 != 0)
+ {
+ sUnknown_03001240[id].field_0--;
+ }
+ else
+ {
+ if (sprite->data[2] == 0 && sUnknown_03001240[id].field_8 == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sUnknown_03001240[id].field_8++;
+ }
+
+ if (sprite->data[2] > sUnknown_03001240[id].field_6)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+
+ if (sUnknown_03001240[id].field_4 > 1)
+ {
+ sUnknown_03001240[id].field_4--;
+ sUnknown_03001240[id].field_0 = 10;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2] % 256, 4096);
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6]);
+ }
+
+ sprite->data[2] += 16;
+ }
+}
+
+static void pokemonanimfunc_12(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 512;
+ sUnknown_03001240[id].field_0 = 0;
+ sub_817FE30(sprite);
+ sprite->callback = sub_817FE30;
+}
+
+static void sub_817FF3C(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0];
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > sUnknown_03001240[id].field_0)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = (65536 / sUnknown_03001240[id].field_8) * sprite->data[2];
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6]);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_1F(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_0 = 60;
+ sUnknown_03001240[id].field_8 = 20;
+ sub_817FF3C(sprite);
+ sprite->callback = sub_817FF3C;
+}
+
+static void sub_817FFF0(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0];
+
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sUnknown_03001240[id].field_6)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 index = (sprite->data[2] + 192) % 256;
+
+ sprite->pos2.x = -(Cos(index, sUnknown_03001240[id].field_8 * 2));
+ sprite->pos2.y = Sin(index, sUnknown_03001240[id].field_8) + sUnknown_03001240[id].field_8;
+ }
+
+ sprite->data[2] += sUnknown_03001240[id].field_2;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_14(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 512;
+ sUnknown_03001240[id].field_8 = 6;
+ sUnknown_03001240[id].field_2 = 24;
+ sub_817FFF0(sprite);
+ sprite->callback = sub_817FFF0;
+}
+
+static void pokemonanimfunc_15(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_BLACK);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 16);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_BLACK);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_16(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2 = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ index2 = (sprite->data[2] * 128) / 40;
+
+ if (sprite->data[2] >= 10 && sprite->data[2] <= 29)
+ {
+ sprite->data[7] += 51;
+ index1 = 0xFF & sprite->data[7];
+ }
+
+ if (sprite->data[1] == 0)
+ sprite->data[4] = (Sin(index2, 40) - 256) + Sin(index1, 16);
+ else
+ sprite->data[4] = (256 - Sin(index2, 40)) - Sin(index1, 16);
+
+ sprite->data[5] = Sin(index2, 16) + 256;
+ SetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_17(struct Sprite *sprite)
+{
+ s16 posY = 0, index1 = 0, index2 = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = posY;
+ }
+ else
+ {
+ index2 = (sprite->data[2] * 128) / 40;
+
+ if (sprite->data[2] >= 10 && sprite->data[2] <= 29)
+ {
+ sprite->data[7] += 51;
+ index1 = 0xFF & sprite->data[7];
+ }
+
+ if (sprite->data[1] == 0)
+ sprite->data[4] = -(Sin(index2, 16)) - 256;
+ else
+ sprite->data[4] = Sin(index2, 16) + 256;
+
+ sprite->data[5] = (256 - Sin(index2, 40)) - Sin(index1, 8);
+
+ if (sprite->data[5] != 256)
+ posY = (256 - sprite->data[5]) / 8;
+
+ sprite->pos2.y = -(posY);
+ SetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_818031C(struct Sprite *sprite)
+{
+ u8 index = sprite->data[2];
+ u8 var7 = sprite->data[6];
+ u8 var5 = sUnknown_0860AA80[sprite->data[5]][0];
+ u8 var6 = sUnknown_0860AA80[sprite->data[5]][1];
+ u8 amplitude = 0;
+
+ if (var5 != 0xFE)
+ amplitude = (var6 - var7) * var5 / var6;
+ else
+ amplitude = 0;
+
+ if (var5 == 0xFF)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin(index, amplitude);
+
+ if (var7 == var6)
+ {
+ sprite->data[5]++;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[2] += sprite->data[0];
+ sprite->data[6]++;
+ }
+ }
+}
+
+static void pokemonanimfunc_19(struct Sprite *sprite)
+{
+ sprite->data[0] = 48;
+ sub_818031C(sprite);
+ sprite->callback = sub_818031C;
+}
+
+static void pokemonanimfunc_1A(struct Sprite *sprite)
+{
+ u8 counter = 0;
+
+ sub_817F70C(sprite);
+ counter = sprite->data[2];
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 35)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s16 index = ((counter - 10) * 128) / 20;
+
+ if (counter < 10)
+ HandleSetAffineData(sprite, 256, 256, counter / 2 * 512);
+ else if (counter >= 10 && counter <= 29)
+ sprite->pos2.x = -(Sin(index, 5));
+ else
+ HandleSetAffineData(sprite, 256, 256, (35 - counter) / 2 * 1024);
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_1B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256) / 100;
+ sprite->pos2.y = Sin(index, 10);
+ HandleSetAffineData(sprite, 256, 256, Sin(index, 3276));
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_81804F8(struct Sprite *sprite)
+{
+ s32 var = 0;
+ s16 index = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ index = (sprite->data[2] * 256) / 100;
+ var = (sprite->data[2] * 512) / 100;
+ var &= 0xFF;
+ sprite->pos2.y = Sin(index, sprite->data[0]);
+ HandleSetAffineData(sprite, 256, 256, Sin(var, 3276));
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_1C(struct Sprite *sprite)
+{
+ sprite->data[0] = 10;
+ sub_81804F8(sprite);
+ sprite->callback = sub_81804F8;
+}
+
+static void sub_81805B0(struct Sprite *sprite)
+{
+ s32 var = 0;
+ s16 index = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ index = (sprite->data[2] * 256) / 100;
+ var = (sprite->data[2] * 512) / 100;
+ var &= 0xFF;
+ sprite->pos2.y = -(Sin(index / 2, sprite->data[0] * 2));
+ HandleSetAffineData(sprite, 256, 256, Sin(var, 3276));
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_18(struct Sprite *sprite)
+{
+ sprite->data[0] = 5;
+ sub_81805B0(sprite);
+ sprite->callback = sub_81805B0;
+}
+
+static void pokemonanimfunc_1D(struct Sprite *sprite)
+{
+ s32 var;
+ s16 index = 0;
+
+ sub_817F70C(sprite);
+ var = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 toDiv = 100;
+
+ index = (sprite->data[2] * 256) / toDiv;
+ var = (sprite->data[2] * 512) / toDiv;
+ var &= 0xFF;
+ sprite->pos2.x = Sin(index, 8);
+ HandleSetAffineData(sprite, 256, 256, Sin(var, 3276));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void sub_8180714(struct Sprite *sprite)
+{
+ s16 posY = 0;
+
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ }
+
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sprite->data[0] * 3)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale = Sin(sprite->data[4], 32) + 256;
+
+ if (sprite->data[2] > sprite->data[0] && sprite->data[2] < sprite->data[0] * 2)
+ sprite->data[3] += (128 / sprite->data[0]);
+ if (yScale > 256)
+ posY = (256 - yScale) / 8;
+
+ sprite->pos2.y = -(Sin(sprite->data[3], 10)) - posY;
+ HandleSetAffineData(sprite, 256 - Sin(sprite->data[4], 32), yScale, 0);
+ sprite->data[2]++;
+ sprite->data[4] = (sprite->data[4] + 128 / sprite->data[0]) & 0xFF;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_00(struct Sprite *sprite)
+{
+ sprite->data[0] = 16;
+ sub_8180714(sprite);
+ sprite->callback = sub_8180714;
+}
+
+static void sub_8180828(struct Sprite *sprite)
+{
+ s16 posY = 0;
+
+ if (sprite->data[2] > (128 / sprite->data[6]) * sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale = Sin(sprite->data[4], 32) + 256;
+
+ if (yScale > 256)
+ posY = (256 - yScale) / 8;
+
+ sprite->pos2.y = -(posY);
+ HandleSetAffineData(sprite, Sin(sprite->data[4], 48) + 256, yScale, 0);
+ sprite->data[2]++;
+ sprite->data[4] = (sprite->data[4] + sprite->data[6]) & 0xFF;
+ }
+}
+
+static void pokemonanimfunc_13(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 3;
+ sprite->data[6] = 8;
+ }
+
+ sub_8180828(sprite);
+}
+
+static const s8 sUnknown_0860AD8E[][8][3] =
+{
+ {
+ {0, 8, 8},
+ {8, -8, 12},
+ {-8, 8, 12},
+ {8, -8, 12},
+ {-8, 8, 12},
+ {8, -8, 12},
+ {-8, 0, 12},
+ {0, 0, 0}
+ },
+ {
+ {0, 8, 16},
+ {8, -8, 24},
+ {-8, 8, 24},
+ {8, -8, 24},
+ {-8, 8, 24},
+ {8, -8, 24},
+ {-8, 0, 24},
+ {0, 0, 0}
+ },
+};
+
+static void sub_8180900(struct Sprite *sprite)
+{
+ s16 var;
+ u8 structId;
+ s8 r9;
+ s16 r10;
+ s16 r7;
+ u32 arrId;
+
+ sub_817F70C(sprite);
+ structId = sprite->data[0];
+ var = sUnknown_03001240[structId].field_6;
+ r9 = sUnknown_0860AD8E[sUnknown_03001240[structId].field_8][sprite->data[4]][0];
+ r10 = sUnknown_0860AD8E[sUnknown_03001240[structId].field_8][sprite->data[4]][1] - r9;
+ arrId = sUnknown_03001240[structId].field_8;
+ r7 = sprite->data[3];
+
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ }
+
+ if (sUnknown_0860AD8E[arrId][sprite->data[4]][2] == 0)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ u16 rotation;
+
+ sprite->pos2.y = -(Sin(r7 * 128 / sUnknown_0860AD8E[arrId][sprite->data[4]][2], 10));
+ sprite->pos2.x = (r10 * r7 / sUnknown_0860AD8E[arrId][sprite->data[4]][2]) + r9;
+
+ rotation = -(var * sprite->pos2.x) / 8;
+ HandleSetAffineData(sprite, 256, 256, rotation);
+
+ if (r7 == sUnknown_0860AD8E[arrId][sprite->data[4]][2])
+ {
+ sprite->data[4]++;
+ sprite->data[3] = 0;
+ }
+ else
+ {
+ sprite->data[3]++;
+ }
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_05(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_6 = 4096;
+ sUnknown_03001240[id].field_8 = sprite->data[6];
+ sub_8180900(sprite);
+ sprite->callback = sub_8180900;
+}
+
+static void pokemonanimfunc_20(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB(31, 22, 0));
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB(31, 22, 0));
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_21(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_RED);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_RED);
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_22(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_BLUE);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_BLUE);
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_23(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_YELLOW);
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_24(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB(24, 0, 24));
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB(24, 0, 24));
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void sub_8180CB4(struct Sprite *sprite);
+static void sub_8180CE8(struct Sprite *sprite);
+static void sub_8180D44(struct Sprite *sprite);
+static void sub_8180DC0(struct Sprite *sprite);
+static void sub_8180E28(struct Sprite *sprite);
+
+static void pokemonanimfunc_25(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_8180CB4;
+}
+
+static void sub_8180CB4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (++sprite->pos2.x > 7)
+ {
+ sprite->pos2.x = 8;
+ sprite->data[7] = 2;
+ sprite->callback = sub_8180CE8;
+ }
+ sub_817F70C(sprite);
+}
+
+static void sub_8180CE8(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ sprite->pos2.x -= sprite->data[7];
+ sprite->data[7]++;
+ if (sprite->pos2.x <= 0)
+ {
+ s16 subResult;
+ u8 var = sprite->data[7];
+ sprite->data[6] = 0;
+ subResult = sprite->pos2.x;
+
+ do
+ {
+ subResult -= var;
+ sprite->data[6]++;
+ var++;
+ }
+ while (subResult > -8);
+
+ sprite->data[5] = 1;
+ sprite->callback = sub_8180D44;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180D44(struct Sprite *sprite)
+{
+ u8 rotation;
+
+ sub_817F70C(sprite);
+ sprite->pos2.x -= sprite->data[7];
+ sprite->data[7]++;
+ rotation = (sprite->data[5] * 6) / sprite->data[6];
+
+ if (++sprite->data[5] > sprite->data[6])
+ sprite->data[5] = sprite->data[6];
+
+ HandleSetAffineData(sprite, 256, 256, rotation * 256);
+
+ if (sprite->pos2.x < -8)
+ {
+ sprite->pos2.x = -8;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[2] = rotation;
+ sprite->callback = sub_8180DC0;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180DC0(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[3] > 11)
+ {
+ sprite->data[2] -= 2;
+ if (sprite->data[2] < 0)
+ sprite->data[2] = 0;
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[2] << 8);
+ if (sprite->data[2] == 0)
+ sprite->callback = sub_8180E28;
+ }
+ else
+ {
+ sprite->pos2.x += sprite->data[4];
+ sprite->data[4] *= -1;
+ sprite->data[3]++;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180E28(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ sprite->pos2.x += 2;
+ if (sprite->pos2.x > 0)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180E78(struct Sprite *sprite);
+static void sub_8180ED0(struct Sprite *sprite);
+static void sub_8180F2C(struct Sprite *sprite);
+
+static void pokemonanimfunc_26(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ sprite->callback = sub_8180E78;
+}
+
+static void sub_8180E78(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x++;
+ sprite->pos2.y--;
+
+ if (sprite->pos2.x % 2 == 0 && sprite->data[3] <= 0)
+ sprite->data[3] = 10;
+ if (sprite->pos2.x > 7)
+ {
+ sprite->pos2.x = 8;
+ sprite->pos2.y = -8;
+ sprite->data[4] = 0;
+ sprite->callback = sub_8180ED0;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180ED0(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x = Cos(sprite->data[4], 16) - 8;
+ sprite->pos2.y = Sin(sprite->data[4], 16) - 8;
+
+ if (sprite->data[4] > 63)
+ {
+ sprite->data[2] = 160;
+ sprite->data[3] = 10;
+ sprite->callback = sub_8180F2C;
+ }
+ sprite->data[4] += 8;
+ if (sprite->data[4] > 64)
+ sprite->data[4] = 64;
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180F2C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[3] > 0)
+ {
+ sprite->data[3]--;
+ }
+ else
+ {
+ u32 rotation;
+
+ sprite->pos2.x = Cos(sprite->data[2], 5) - 4;
+ sprite->pos2.y = -(Sin(sprite->data[2], 5)) + 4;
+ sprite->data[2] -= 4;
+ rotation = sprite->data[2] - 32;
+ HandleSetAffineData(sprite, 256, 256, rotation * 512);
+
+ if (sprite->data[2] <= 32)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_27(struct Sprite *sprite)
+{
+ if (sprite->data[3] > 0)
+ {
+ sprite->data[3]--;
+ }
+ else
+ {
+ sprite->data[4] = (sprite->data[4] == 0) ? 1 : 0;
+ sprite->invisible = sprite->data[4];
+ if (++sprite->data[2] > 19)
+ {
+ sprite->invisible = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ sprite->data[3] = 2;
+ }
+}
+
+static void sub_8181024(struct Sprite *sprite);
+static void sub_8181068(struct Sprite *sprite);
+static void sub_81810C4(struct Sprite *sprite);
+
+static void pokemonanimfunc_28(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_8181024;
+}
+
+static void sub_8181024(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x--;
+ sprite->pos2.y++;
+
+ if (sprite->pos2.x <= -16)
+ {
+ sprite->pos2.x = -16;
+ sprite->pos2.y = 16;
+ sprite->callback = sub_8181068;
+ sprite->data[2] = 160;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181068(struct Sprite *sprite)
+{
+ u32 rotation;
+
+ sub_817F70C(sprite);
+ sprite->data[2] -= 4;
+ sprite->pos2.x = Cos(sprite->data[2], 22);
+ sprite->pos2.y = -(Sin(sprite->data[2], 22));
+ rotation = sprite->data[2] - 32;
+ HandleSetAffineData(sprite, 256, 256, rotation * 512);
+
+ if (sprite->data[2] <= 32)
+ sprite->callback = sub_81810C4;
+
+ sub_817F70C(sprite);
+}
+
+static void sub_81810C4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x--;
+ sprite->pos2.y++;
+
+ if (sprite->pos2.x <= 0)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181110(struct Sprite *sprite);
+static void sub_8181144(struct Sprite *sprite);
+static void sub_81811A4(struct Sprite *sprite);
+
+static void pokemonanimfunc_29(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_8181110;
+}
+
+static void sub_8181110(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x++;
+ sprite->pos2.y--;
+
+ if (sprite->pos2.x > 15)
+ {
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181144;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181144(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[2] += 16;
+
+ if (sprite->pos2.x <= -16)
+ {
+ sprite->pos2.x = -16;
+ sprite->pos2.y = 16;
+ sprite->data[2] = 0;
+ sprite->callback = sub_81811A4;
+ }
+ else
+ {
+ sprite->pos2.x -= 2;
+ sprite->pos2.y += 2;
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[2] << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_81811A4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x++;
+ sprite->pos2.y--;;
+
+ if (sprite->pos2.x >= 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181214(struct Sprite *sprite);
+
+static void pokemonanimfunc_2A(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_2 = 2;
+ sub_8181214(sprite);
+ sprite->callback = sub_8181214;
+}
+
+static void sub_8181214(struct Sprite *sprite)
+{
+ if (sUnknown_03001240[sprite->data[0]].field_0 != 0)
+ {
+ sUnknown_03001240[sprite->data[0]].field_0--;
+ }
+ else
+ {
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2]++;
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = sUnknown_03001240[sprite->data[0]].field_2;
+ sprite->data[3] = -1;
+ sprite->data[4] = -1;
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ }
+
+ sprite->pos2.x += (sprite->data[7] * 2 * sprite->data[3]);
+ sprite->pos2.y += (sprite->data[7] * sprite->data[4]);
+ sprite->data[6] += 8;
+ if (sprite->pos2.x <= -16 || sprite->pos2.x >= 16)
+ {
+ sprite->pos2.x = sprite->data[3] * 16;
+ sprite->data[3] *= -1;
+ sprite->data[5]++;
+ }
+ else if (sprite->pos2.y <= -16 || sprite->pos2.y >= 16)
+ {
+ sprite->pos2.y = sprite->data[4] * 16;
+ sprite->data[4] *= -1;
+ sprite->data[5]++;
+ }
+
+ if (sprite->data[5] > 5 && sprite->pos2.x <= 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ sUnknown_03001240[sprite->data[0]].field_0 = 10;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6] << 8);
+ sub_817F70C(sprite);
+ }
+}
+
+static void sub_8181370(struct Sprite *sprite);
+
+static void pokemonanimfunc_2B(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
+ sprite->callback = sub_8181370;
+}
+
+static void sub_8181370(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[6] += 4;
+ sprite->pos2.x = -(Sin(sprite->data[6], 16));
+ sprite->pos2.y = -(Sin((sprite->data[6] * 2) & 0xFF, 8));
+ if (sprite->data[6] > 192 && sprite->data[7] == 1)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->data[7]++;
+ }
+ else if (sprite->data[6] > 64 && sprite->data[7] == 0)
+ {
+ HandleSetAffineData(sprite, -256, 256, 0);
+ sprite->data[7]++;
+ }
+
+ if (sprite->data[6] > 255)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_2C(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ }
+
+ if (sUnknown_0860AA64[sprite->data[6]][1] == 0xFF)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ if (sprite->data[4] == 1)
+ {
+ if (sUnknown_0860AA64[sprite->data[6]][0] != 0)
+ BlendPalette(sprite->data[7], 0x10, 0x10, RGB_YELLOW);
+ else
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW);
+
+ sprite->data[4] = 0;
+ }
+
+ if (sUnknown_0860AA64[sprite->data[6]][1] == sprite->data[5])
+ {
+ sprite->data[4] = 1;
+ sprite->data[5] = 0;
+ sprite->data[6]++;
+ }
+ else
+ {
+ sprite->data[5]++;
+ }
+ }
+}
+
+static void sub_81814D4(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ sub_817F70C(sprite);
+ if (sprite->data[2] > sUnknown_03001240[sprite->data[0]].field_8)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256) / sUnknown_03001240[sprite->data[0]].field_8;
+ sprite->pos2.x = -(Sin(index, 10));
+ HandleSetAffineData(sprite, 256, 256, Sin(index, 3276));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_2D(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_8 = 50;
+ sub_81814D4(sprite);
+ sprite->callback = sub_81814D4;
+}
+
+static void sub_81815D4(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ sub_817F70C(sprite);
+ if (sprite->data[2] > sUnknown_03001240[sprite->data[0]].field_8)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256) / sUnknown_03001240[sprite->data[0]].field_8;
+ sprite->pos2.x = -(Sin(index, 10));
+ HandleSetAffineData(sprite, 256, 256, -(Sin(index, 3276)));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_2E(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_8 = 50;
+ sub_81815D4(sprite);
+ sprite->callback = sub_81815D4;
+}
+
+static void sub_8181708(struct Sprite *sprite);
+static void sub_8181770(struct Sprite *sprite);
+static void sub_8181794(struct Sprite *sprite);
+
+static void pokemonanimfunc_2F(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[6] = -(14 * sprite->centerToCornerVecX / 10);
+ sprite->data[7] = 128;
+ sprite->callback = sub_8181708;
+}
+
+static void sub_8181708(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7]--;
+ sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
+
+ sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
+
+ HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
+ if (sprite->data[7] <= 120)
+ {
+ sprite->data[7] = 120;
+ sprite->data[3] = 0;
+ sprite->callback = sub_8181770;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181770(struct Sprite *sprite)
+{
+ if (sprite->data[3] == 20)
+ {
+ sprite->callback = sub_8181794;
+ sprite->data[3] = 0;
+ }
+
+ sprite->data[3]++;
+}
+
+static void sub_8181794(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7] += 2;
+ sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
+
+ sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
+
+ HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
+ if (sprite->data[7] >= 128)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->data[2] = 0;
+ sub_817F77C(sprite);
+ sprite->callback = pokemonanimfunc_10;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181810(struct Sprite *sprite)
+{
+ if (sUnknown_03001240[sprite->data[0]].field_0 != 0)
+ {
+ sUnknown_03001240[sprite->data[0]].field_0--;
+ }
+ else
+ {
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+ sprite->data[2] = 1;
+ }
+
+ if (sprite->data[5] == 0)
+ {
+ sprite->data[7] = Sin(sprite->data[4], 256);
+ sprite->pos2.y = Sin(sprite->data[4], 16);
+ sprite->data[6] = Sin(sprite->data[4], 32);
+ HandleSetAffineData(sprite, 256 - sprite->data[6], 256 + sprite->data[7], 0);
+ if (sprite->data[4] == 128)
+ {
+ sprite->data[4] = 0;
+ sprite->data[5] = 1;
+ }
+ }
+ else if (sprite->data[5] == 1)
+ {
+ sprite->data[7] = Sin(sprite->data[4], 32);
+ sprite->pos2.y = -(Sin(sprite->data[4], 8));
+ sprite->data[6] = Sin(sprite->data[4], 128);
+ HandleSetAffineData(sprite, 256 + sprite->data[6], 256 - sprite->data[7], 0);
+ if (sprite->data[4] == 128)
+ {
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sUnknown_03001240[sprite->data[0]].field_0 = 10;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+ }
+ else
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ }
+
+ sprite->data[4] += sUnknown_03001240[sprite->data[0]].field_6;
+ }
+}
+
+static void pokemonanimfunc_30(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_6 = 4;
+ sub_8181810(sprite);
+ sprite->callback = sub_8181810;
+}
+
+static void pokemonanimfunc_31(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+ sub_817F70C(sprite);
+ if (counter > 512)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ switch (sprite->data[2] / 128)
+ {
+ case 0:
+ sprite->pos2.x = -(counter % 128 * 8) / 128;
+ break;
+ case 1:
+ sprite->pos2.x = (counter % 128 / 16) - 8;
+ break;
+ case 2:
+ sprite->pos2.x = (counter % 128 / 16);
+ break;
+ case 3:
+ sprite->pos2.x = -(counter % 128 * 8) / 128 + 8;
+ break;
+ }
+
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ }
+
+ sprite->data[2] += 12;
+ sub_817F70C(sprite);
+}
+
+static void sub_8181ABC(struct Sprite *sprite);
+static void sub_8181B4C(struct Sprite *sprite);
+static void sub_8181C2C(struct Sprite *sprite);
+
+static void pokemonanimfunc_32(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_8 = -1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ sub_8181ABC(sprite);
+ sprite->callback = sub_8181ABC;
+}
+
+static void sub_8181ABC(struct Sprite *sprite)
+{
+ if (sUnknown_03001240[sprite->data[0]].field_0 != 0)
+ {
+ sUnknown_03001240[sprite->data[0]].field_0--;
+ }
+ else
+ {
+ s32 counter;
+
+ sub_817F70C(sprite);
+ counter = sprite->data[2];
+ if (sprite->data[2] > 128)
+ {
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181B4C;
+ }
+ else
+ {
+ s32 var = 8 * sUnknown_03001240[sprite->data[0]].field_8;
+ sprite->pos2.x = var * (counter % 128) / 128;
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ sprite->data[2] += 12;
+ }
+
+ sub_817F70C(sprite);
+ }
+}
+
+static void sub_8181B4C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 48)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181C2C;
+ }
+ else
+ {
+ s16 yDelta;
+ s16 yScale = Sin(sprite->data[4], 64) + 256;
+ if (sprite->data[2] >= 16 && sprite->data[2] <= 31)
+ {
+ sprite->data[3] += 8;
+ sprite->pos2.x -= sUnknown_03001240[sprite->data[0]].field_8;
+ }
+
+ yDelta = 0;
+ if (yScale > 256)
+ yDelta = (256 - yScale) / 8;
+
+ sprite->pos2.y = -(Sin(sprite->data[3], 20)) - yDelta;
+ HandleSetAffineData(sprite, 256 - Sin(sprite->data[4], 32), yScale, 0);
+ sprite->data[2]++;
+ sprite->data[4] += 8;
+ sprite->data[4] &= 0xFF;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181C2C(struct Sprite *sprite)
+{
+ s32 counter;
+
+ sub_817F70C(sprite);
+ counter = sprite->data[2];
+ if (counter > 128)
+ {
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sUnknown_03001240[sprite->data[0]].field_0 = 10;
+ sprite->data[3] = 0;
+ sprite->data[2] = 0;
+ sprite->data[4] = 0;
+ sprite->callback = sub_8181ABC;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ register s32 var asm("r4") = sUnknown_03001240[sprite->data[0]].field_8;
+
+ sprite->pos2.x = (var << 3) * (counter % 128) / 128 - (sUnknown_03001240[sprite->data[0]].field_8 * 8);
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ }
+
+ sprite->data[2] += 12;
+ sub_817F70C(sprite);
+}
+
+static void sub_8181CE8(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ }
+
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 254)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[2] = 0;
+ sprite->data[7] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+ }
+ else
+ {
+ u16 rotation;
+
+ sprite->pos2.x = -(Sin(sprite->data[7], 16));
+ rotation = Sin(sprite->data[7], 32);
+ HandleSetAffineData(sprite, 256, 256, rotation << 8);
+ sprite->data[7] += sUnknown_03001240[sprite->data[0]].field_6;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_33(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_6 = 4;
+ sub_8181CE8(sprite);
+ sprite->callback = sub_8181CE8;
+}
+
+static void pokemonanimfunc_34(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ }
+
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 254)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sub_817F70C(sprite);
+ }
+ else
+ {
+ u16 rotation;
+
+ sprite->pos2.x = -(Sin(sprite->data[7], 16));
+ sprite->pos2.y = -(Sin(sprite->data[7] % 128, 16));
+ rotation = Sin(sprite->data[7], 32);
+ HandleSetAffineData(sprite, 256, 256, rotation << 8);
+ sprite->data[7] += 8;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_35(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = 0;
+
+ if (sprite->data[2] == sprite->data[7])
+ {
+ sprite->data[7] = 0;
+ sprite->data[2]++;
+ sprite->invisible = 0;
+ }
+ else
+ {
+ sprite->data[7]++;
+ sprite->invisible = 1;
+ }
+
+ if (sprite->data[2] > 10)
+ {
+ sprite->invisible = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+}
+
+static void sub_8181F14(struct Sprite *sprite);
+static void sub_8181F50(struct Sprite *sprite);
+static void sub_8181FC0(struct Sprite *sprite);
+
+static void pokemonanimfunc_36(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 0;
+ sprite->callback = sub_8181F14;
+}
+
+static void sub_8181F14(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 31)
+ {
+ sprite->data[7] = 32;
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181F50;
+ }
+ else
+ {
+ sprite->data[7] += 4;
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[7] << 8);
+}
+
+static void sub_8181F50(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 512)
+ {
+ sprite->callback = sub_8181FC0;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->pos2.x = -(sprite->data[2] * 16) / 512;
+ sprite->pos2.y = -(Sin(sprite->data[2] % 128, 4));
+ sprite->data[2] += 12;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181FC0(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7] -= 2;
+ if (sprite->data[7] < 0)
+ {
+ sprite->data[7] = 0;
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->pos2.x = -(Sin(sprite->data[7] * 2, 16));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[7] << 8);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_37(struct Sprite *sprite)
+{
+ u16 rotation;
+
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 255)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[7] = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[7] += 16;
+ sprite->pos2.x = -(Sin(sprite->data[7] % 128, 8));
+ sprite->pos2.y = -(Sin(sprite->data[7] % 128, 8));
+ }
+
+ rotation = Sin(sprite->data[7] % 128, 16);
+ HandleSetAffineData(sprite, 256, 256, rotation << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_81820FC(struct Sprite *sprite);
+static void sub_818216C(struct Sprite *sprite);
+static void sub_81821CC(struct Sprite *sprite);
+static void sub_8182248(struct Sprite *sprite);
+
+static void pokemonanimfunc_38(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 0;
+ sprite->data[4] = 0;
+ sprite->callback = sub_81820FC;
+}
+
+static void sub_81820FC(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 24)
+ {
+ if (++sprite->data[4] > 4)
+ {
+ sprite->data[4] = 0;
+ sprite->callback = sub_818216C;
+ }
+ }
+ else
+ {
+ sprite->data[7] += 2;
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_818216C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 32)
+ {
+ sprite->data[6] = 1;
+ sprite->callback = sub_81821CC;
+ }
+ else
+ {
+ sprite->data[7] += 2;
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_81821CC(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7] += (sprite->data[6] * 4);
+ if (sprite->data[5] > 9)
+ {
+ sprite->data[7] = 32;
+ sprite->callback = sub_8182248;
+ }
+
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ if (sprite->data[7] <= 28 || sprite->data[7] >= 36)
+ {
+ sprite->data[6] *= -1;
+ sprite->data[5]++;
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_8182248(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[7] <= 0)
+ {
+ sprite->data[7] = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[7] -= 2;
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_39(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ if ((sprite->data[2] % 4) / 2 == 0)
+ {
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 16) * sign;
+ sprite->pos2.y = -(sprite->pos2.x);
+ }
+ else
+ {
+ sprite->pos2.x = -(Sin((sprite->data[2] * 128 / 40) % 256, 16)) * sign;
+ sprite->pos2.y = sprite->pos2.x;
+ }
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_3A(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
+ sprite->data[2]++;
+ }
+
+ if (sprite->data[6] > 0)
+ {
+ sprite->data[6]--;
+ if (sprite->data[5] != 3)
+ {
+ s16 scale = (8 * sprite->data[6]) / 20;
+ scale = Sin(sprite->data[7] - scale, 64);
+ HandleSetAffineData(sprite, 256 - scale, 256 - scale, 0);
+ }
+ }
+ else
+ {
+ s16 var;
+
+ if (sprite->data[5] == 3)
+ {
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[7] = 64;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ var = Cos(sprite->data[7], 64);
+ }
+ else
+ {
+ var = Sin(sprite->data[7], 64);
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[5] = 3;
+ sprite->data[6] = 10;
+ sprite->data[7] = 0;
+ }
+ else
+ {
+ if (var > 48 && sprite->data[5] == 1)
+ {
+ sprite->data[5] = 2;
+ sprite->data[6] = 20;
+ }
+ else if (var > 16 && sprite->data[5] == 0)
+ {
+ sprite->data[5] = 1;
+ sprite->data[6] = 20;
+ }
+ }
+ }
+
+ sprite->data[7] += 2;
+ HandleSetAffineData(sprite, 256 - var, 256 - var, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_3B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale;
+
+ sprite->pos2.y = Sin(sprite->data[7] % 256, 8);
+ sprite->data[7] += 8;
+ yScale = Sin(sprite->data[7] % 128, 96);
+ HandleSetAffineData(sprite, 256, yScale + 256, 0);
+ }
+}
+
+static void pokemonanimfunc_3C(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 256)
+ {
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale;
+
+ sprite->pos2.y = Sin(sprite->data[7], 16);
+ sprite->data[7] += 4;
+ yScale = Sin((sprite->data[7] % 64) * 2, 128);
+ HandleSetAffineData(sprite, 256, yScale + 256, 0);
+ }
+}
+
+static void sub_81825F8(struct Sprite *sprite);
+static void sub_8182648(struct Sprite *sprite);
+static void sub_81826F8(struct Sprite *sprite);
+
+static void pokemonanimfunc_3D(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_81825F8;
+ sprite->data[7] = 0;
+}
+
+static void sub_81825F8(struct Sprite *sprite)
+{
+ s16 yScale;
+
+ sprite->data[7] += 8;
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[7] = 0;
+ sprite->data[6] = 0;
+ sprite->callback = sub_8182648;
+ yScale = Sin(64, 128); // 128 * 1 = 128
+ }
+ else
+ {
+ yScale = Sin(sprite->data[7], 128);
+ }
+
+ HandleSetAffineData(sprite, 256, 256 + yScale, 0);
+}
+
+static void sub_8182648(struct Sprite *sprite)
+{
+ s16 yScale;
+
+ sprite->data[7] += 4;
+ if (sprite->data[7] > 95)
+ {
+ yScale = Cos(0, 128); // 128 * (-1) = -128
+ sprite->data[7] = 0;
+ sprite->data[6]++;
+ }
+ else
+ {
+ s16 sign, index;
+
+ sprite->pos2.y = -(sprite->data[6] * 4) - Sin(sprite->data[7], 8);
+ if (sprite->data[7] > 63)
+ {
+ sign = -1;
+ index = sprite->data[7] - 64;
+ }
+ else
+ {
+ sign = 1;
+ index = 0;
+ }
+
+ yScale = Cos((index * 2) + sprite->data[7], 128) * sign;
+ }
+
+ HandleSetAffineData(sprite, 256, 256 + yScale, 0);
+ if (sprite->data[6] == 3)
+ {
+ sprite->data[7] = 0;
+ sprite->callback = sub_81826F8;
+ }
+}
+
+static void sub_81826F8(struct Sprite *sprite)
+{
+ s16 yScale;
+
+ sprite->data[7] += 8;
+ yScale = Cos(sprite->data[7], 128);
+ sprite->pos2.y = -(Cos(sprite->data[7], 12));
+ if (sprite->data[7] > 63)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+
+ HandleSetAffineData(sprite, 256, 256 + yScale, 0);
+}
+
+static void sub_8182764(struct Sprite *sprite)
+{
+ if (sprite->data[7] > sprite->data[5])
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+ else
+ {
+ s16 xScale;
+
+ sprite->pos2.x = Sin(sprite->data[7] % 256, sprite->data[4]);
+ sprite->data[7] += sprite->data[6];
+ xScale = Sin(sprite->data[7] % 128, 96);
+ HandleSetAffineData(sprite, 256 + xScale, 256, 0);
+ }
+}
+
+static void pokemonanimfunc_3E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 8;
+ }
+
+ sub_8182764(sprite);
+}
+
+static void sub_8182830(struct Sprite *sprite)
+{
+ if (sprite->data[7] > sprite->data[5])
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+ else
+ {
+ s16 xScale;
+
+ sprite->pos2.x = Sin(sprite->data[7] % 256, sprite->data[4]);
+ sprite->data[7] += sprite->data[6];
+ xScale = Sin((sprite->data[7] % 64) * 2, 128);
+ HandleSetAffineData(sprite, 256 + xScale, 256, 0);
+ }
+}
+
+static void pokemonanimfunc_3F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 4;
+ sprite->data[5] = 256;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182830(sprite);
+}
+
+static void pokemonanimfunc_40(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->pos2.x = Sin(sprite->data[7] % 256, 8);
+ sprite->data[7] += 8;
+ scale = Sin(sprite->data[7] % 128, 96);
+ HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_41(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->pos2.x = -(Sin((sprite->data[7] % 256) / 2, 16));
+ sprite->data[7] += 8;
+ scale = -(Sin((sprite->data[7] % 256) / 2, 64));
+ HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_42(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->pos2.x = -(Sin(sprite->data[7] % 256 , 8));
+ sprite->data[7] += 8;
+ scale = Sin((sprite->data[7] % 256) / 2, 96);
+ HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_43(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 caseVar = (sprite->data[2] / 512) % 4;
+ switch (caseVar)
+ {
+ case 0:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = (sprite->data[2] % 512 / 32) - 16;
+ break;
+ case 2:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 3:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ }
+
+ sprite->pos2.y = -(Sin(sprite->data[2] % 128, 4));
+ sprite->data[2] += 24;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_44(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = 64;
+ sprite->data[2]++;
+ }
+
+ sprite->data[7] += 8;
+ if (sprite->data[6] == 4)
+ {
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[7] = 0;
+ sprite->data[6]++;
+ }
+ }
+ else
+ {
+ if (sprite->data[7] > 127)
+ {
+ sprite->data[7] = 0;
+ sprite->data[6]++;
+ }
+ }
+
+ switch (sprite->data[6])
+ {
+ case 1:
+ sprite->pos2.x = -(Cos(sprite->data[7], 8));
+ sprite->pos2.y = Sin(sprite->data[7], 8) - 8;
+ break;
+ case 2:
+ sprite->pos2.x = Sin(sprite->data[7] + 128, 8) + 8;
+ sprite->pos2.y = -(Cos(sprite->data[7], 8));
+ break;
+ case 3:
+ sprite->pos2.x = Cos(sprite->data[7], 8);
+ sprite->pos2.y = Sin(sprite->data[7] + 128, 8) + 8;
+ break;
+ case 0:
+ case 4:
+ sprite->pos2.x = Sin(sprite->data[7], 8) - 8;
+ sprite->pos2.y = Cos(sprite->data[7], 8);
+ break;
+ default:
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ break;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_45(struct Sprite *sprite)
+{
+ sprite->data[0] = 32;
+ sub_8180714(sprite);
+ sprite->callback = sub_8180714;
+}
+
+static void pokemonanimfunc_46(struct Sprite *sprite)
+{
+ sprite->data[0] = 80;
+ sub_817F8FC(sprite);
+ sprite->callback = sub_817F8FC;
+}
+
+static void pokemonanimfunc_47(struct Sprite *sprite)
+{
+ sprite->data[0] = 80;
+ sub_817F978(sprite);
+ sprite->callback = sub_817F978;
+}
+
+static void pokemonanimfunc_48(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 2048;
+ sUnknown_03001240[id].field_8 = sprite->data[6];
+ sub_8180900(sprite);
+ sprite->callback = sub_8180900;
+}
+
+static void pokemonanimfunc_49(struct Sprite *sprite)
+{
+ sprite->data[6] = 1;
+ pokemonanimfunc_05(sprite);
+}
+
+static void pokemonanimfunc_4A(struct Sprite *sprite)
+{
+ sprite->data[6] = 1;
+ pokemonanimfunc_48(sprite);
+}
+
+static void pokemonanimfunc_4B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[0] = 0;
+
+ if (sprite->data[0] <= 0)
+ {
+ sub_817FC20(sprite);
+ sprite->data[0] = 1;
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+static void pokemonanimfunc_4C(struct Sprite *sprite)
+{
+ sprite->data[0] = 30;
+ sprite->data[7] = 3;
+ sub_817FCDC(sprite);
+ sprite->callback = sub_817FCDC;
+}
+
+static void pokemonanimfunc_4D(struct Sprite *sprite)
+{
+ sprite->data[0] = 30;
+ sub_817FD44(sprite);
+ sprite->callback = sub_817FD44;
+}
+
+static void pokemonanimfunc_4E(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 1024;
+ sUnknown_03001240[id].field_0 = 0;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_817FE30(sprite);
+ sprite->callback = sub_817FE30;
+}
+
+static void pokemonanimfunc_4F(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 512;
+ sUnknown_03001240[id].field_8 = 3;
+ sUnknown_03001240[id].field_2 = 12;
+ sub_817FFF0(sprite);
+ sprite->callback = sub_817FFF0;
+}
+
+static void pokemonanimfunc_50(struct Sprite *sprite)
+{
+ sprite->data[0] = 24;
+ sub_818031C(sprite);
+ sprite->callback = sub_818031C;
+}
+
+static void pokemonanimfunc_51(struct Sprite *sprite)
+{
+ sprite->data[0] = 5;
+ sub_81804F8(sprite);
+ sprite->callback = sub_81804F8;
+}
+
+static void pokemonanimfunc_52(struct Sprite *sprite)
+{
+ sprite->data[0] = 3;
+ sub_817F9F4(sprite);
+ sprite->callback = sub_817F9F4;
+}
+
+static void pokemonanimfunc_53(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_0 = 60;
+ sUnknown_03001240[id].field_8 = 30;
+ sub_817FF3C(sprite);
+ sprite->callback = sub_817FF3C;
+}
+
+static void pokemonanimfunc_54(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_2 = 1;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_8181214(sprite);
+ sprite->callback = sub_8181214;
+}
+
+static void pokemonanimfunc_55(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 4;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_8181810(sprite);
+ sprite->callback = sub_8181810;
+}
+
+static void pokemonanimfunc_56(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 1;
+ sUnknown_03001240[id].field_4 = 2;
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ sub_8181ABC(sprite);
+ sprite->callback = sub_8181ABC;
+}
+
+static void pokemonanimfunc_07(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 2;
+ sub_8181CE8(sprite);
+ sprite->callback = sub_8181CE8;
+}
+
+static void pokemonanimfunc_08(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 4;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_8181CE8(sprite);
+ sprite->callback = sub_8181CE8;
+}
+
+static void pokemonanimfunc_0B(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 100;
+ sub_81814D4(sprite);
+ sprite->callback = sub_81814D4;
+}
+
+static void pokemonanimfunc_0C(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 50;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_81814D4(sprite);
+ sprite->callback = sub_81814D4;
+}
+
+static void pokemonanimfunc_0D(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 100;
+ sub_81815D4(sprite);
+ sprite->callback = sub_81815D4;
+}
+
+static void pokemonanimfunc_0E(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 50;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_81815D4(sprite);
+ sprite->callback = sub_81815D4;
+}
+
+static void sub_8183140(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+ if (counter > 2304)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin((counter + 192) % 256, sprite->data[7]) + sprite->data[7];
+ }
+
+ sprite->data[2] += sprite->data[0];
+}
+
+static void pokemonanimfunc_57(struct Sprite *sprite)
+{
+ sprite->data[0] = 60;
+ sprite->data[7] = 3;
+ sub_8183140(sprite);
+ sprite->callback = sub_8183140;
+}
+
+static void pokemonanimfunc_58(struct Sprite *sprite)
+{
+ sprite->data[0] = 30;
+ sprite->data[7] = 3;
+ sub_8183140(sprite);
+ sprite->callback = sub_8183140;
+}
+
+static void pokemonanimfunc_59(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 divCase = (sprite->data[2] / 512) % 4;
+ switch (divCase)
+ {
+ case 0:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 2:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ case 3:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32 - 16;
+ break;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[2] % 128, 4);
+ sprite->data[2] += 24;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_81832C8(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2 = 0;
+
+ if (sprite->data[5] > sprite->data[6])
+ {
+ sprite->pos2.y = 0;
+ sprite->data[5] = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sprite->data[4] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ u8 amplitude, cmpVal1, cmpVal2;
+ s16 xScale, yScale;
+
+ index2 = (sprite->data[5] * 128) / sprite->data[6];
+ cmpVal1 = sprite->data[6] / 4;
+ cmpVal2 = cmpVal1 * 3;
+ if (sprite->data[5] >= cmpVal1 && sprite->data[5] < cmpVal2)
+ {
+ sprite->data[7] += 51;
+ index1 = sprite->data[7] & 0xFF;
+ }
+
+ if (sprite->data[1] == 0)
+ xScale = -256 - Sin(index2, 16);
+ else
+ xScale = 256 + Sin(index2, 16);
+
+ amplitude = sprite->data[3];
+ yScale = 256 - Sin(index2, amplitude) - Sin(index1, amplitude / 5);
+ SetAffineData(sprite, xScale, yScale, 0);
+ sprite->data[5]++;
+ }
+}
+
+static void pokemonanimfunc_5A(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 40;
+ sprite->data[3] = 40;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81832C8(sprite);
+}
+
+static void sub_8183418(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2;
+
+ if (sprite->data[5] > sprite->data[6])
+ {
+ sprite->data[5] = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sprite->data[4] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ u8 amplitude, cmpVal1, cmpVal2;
+ s16 xScale;
+
+ index2 = (sprite->data[5] * 128) / sprite->data[6];
+ cmpVal1 = sprite->data[6] / 4;
+ cmpVal2 = cmpVal1 * 3;
+ if (sprite->data[5] >= cmpVal1 && sprite->data[5] < cmpVal2)
+ {
+ sprite->data[7] += 51;
+ index1 = sprite->data[7] & 0xFF;
+ }
+
+ amplitude = sprite->data[3];
+
+ if (sprite->data[1] == 0)
+ xScale = -256 + Sin(index2, amplitude) + Sin(index1, amplitude / 5 * 2);
+ else
+ xScale = 256 - Sin(index2, amplitude) - Sin(index1, amplitude / 5 * 2);
+
+ SetAffineData(sprite, xScale, 256, 0);
+ sprite->data[5]++;
+ }
+}
+
+static void pokemonanimfunc_5B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 40;
+ sprite->data[3] = 40;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_8183418(sprite);
+}
+
+static void sub_8183574(struct Sprite *sprite)
+{
+ u8 var6, var7;
+ u8 var8 = sprite->data[2];
+ u8 var9 = sprite->data[6];
+ u8 var5 = sUnknown_0860AA80[sprite->data[5]][0];
+ u8 var2 = var5;
+ if (var5 != 0xFF)
+ var5 = sprite->data[7];
+ else
+ var5 = 0xFF; // needed to match
+
+ var6 = sUnknown_0860AA80[sprite->data[5]][1];
+ var7 = 0;
+ if (var2 != 0xFE)
+ var7 = (var6 - var9) * var5 / var6;
+
+ if (var5 == 0xFF)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin((var8 + 192) % 256, var7) + var7;
+ if (var9 == var6)
+ {
+ sprite->data[5]++;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[2] += sprite->data[0];
+ sprite->data[6]++;
+ }
+ }
+}
+
+static void pokemonanimfunc_5C(struct Sprite *sprite)
+{
+ sprite->data[0] = 40;
+ sprite->data[7] = 6;
+ sub_8183574(sprite);
+ sprite->callback = sub_8183574;
+}
+
+static void pokemonanimfunc_5D(struct Sprite *sprite)
+{
+ sprite->data[0] = 70;
+ sprite->data[7] = 6;
+ sub_817FCDC(sprite);
+ sprite->callback = sub_817FCDC;
+}
+
+static void pokemonanimfunc_5E(struct Sprite *sprite)
+{
+ sprite->data[0] = 20;
+ sub_817F8FC(sprite);
+ sprite->callback = sub_817F8FC;
+}
+
+static void pokemonanimfunc_5F(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 9) * sign;
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_60(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 12) * sign;
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_61(struct Sprite *sprite)
+{
+ sprite->data[0] = 70;
+ sprite->data[7] = 6;
+ sub_8183140(sprite);
+ sprite->callback = sub_8183140;
+}
+
+static void pokemonanimfunc_62(struct Sprite *sprite)
+{
+ sprite->data[0] = 24;
+ sprite->data[7] = 6;
+ sub_8183574(sprite);
+ sprite->callback = sub_8183574;
+}
+
+static void pokemonanimfunc_63(struct Sprite *sprite)
+{
+ sprite->data[0] = 56;
+ sprite->data[7] = 9;
+ sub_8183574(sprite);
+ sprite->callback = sub_8183574;
+}
+
+static void pokemonanimfunc_64(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 1024;
+ sUnknown_03001240[id].field_8 = 6;
+ sUnknown_03001240[id].field_2 = 24;
+ sub_817FFF0(sprite);
+ sprite->callback = sub_817FFF0;
+}
+
+static void sub_81837DC(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2 = 0;
+ if (sprite->data[5] > sprite->data[6])
+ {
+ sprite->pos2.y = 0;
+ sprite->data[5] = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sprite->data[4] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ u8 amplitude, cmpVal1, cmpVal2;
+ s16 xScale, yScale;
+
+ index2 = (sprite->data[5] * 128) / sprite->data[6];
+ cmpVal1 = sprite->data[6] / 4;
+ cmpVal2 = cmpVal1 * 3;
+ if (sprite->data[5] >= cmpVal1 && sprite->data[5] < cmpVal2)
+ {
+ sprite->data[7] += 51;
+ index1 = sprite->data[7] & 0xFF;
+ }
+
+ amplitude = sprite->data[3];
+
+ if (sprite->data[1] == 0)
+ xScale = Sin(index2, amplitude) + (Sin(index1, amplitude / 5 * 2) - 256);
+ else
+ xScale = 256 - Sin(index1, amplitude / 5 * 2) - Sin(index2, amplitude);
+
+ yScale = 256 - Sin(index1, amplitude / 5) - Sin(index2, amplitude);
+ SetAffineData(sprite, xScale, yScale, 0);
+ sprite->data[5]++;
+ }
+}
+
+static void pokemonanimfunc_65(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 40;
+ sprite->data[3] = 40;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81837DC(sprite);
+}
+
+static void pokemonanimfunc_66(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 divCase = (sprite->data[2] / 512) % 4;
+ switch (divCase)
+ {
+ case 0:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 2:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ case 3:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32 - 16;
+ break;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[2] % 128, 4);
+ sprite->data[2] += 48;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_67(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 divCase = (sprite->data[2] / 512) % 4;
+ switch (divCase)
+ {
+ case 0:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 2:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ case 3:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32 - 16;
+ break;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[2] % 96, 4);
+ sprite->data[2] += 64;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static const s8 sUnknown_0860ADBE[][3] =
+{
+// x y timer
+ {1, 1, 12},
+ {-2, 0, 12},
+ {1, -1, 12},
+ {0, 0, 0}
+};
+
+static void sub_8183B4C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ sprite->data[3] = 0;
+
+ if (sUnknown_0860ADBE[sprite->data[3]][2] / sprite->data[5] == sprite->data[2])
+ {
+ sprite->data[3]++;
+ sprite->data[2] = 0;
+ }
+
+ if (sUnknown_0860ADBE[sprite->data[3]][2] / sprite->data[5] == 0)
+ {
+ if (--sprite->data[6] == 0)
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ else
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ s32 amplitude = sprite->data[5];
+ sprite->pos2.x += (sUnknown_0860ADBE[sprite->data[3]][0] * amplitude);
+ sprite->pos2.y += (sUnknown_0860ADBE[sprite->data[3]][1] * sprite->data[5]); // what's the point of the var if you're not reusing it?
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_68(struct Sprite *sprite)
+{
+ sprite->data[5] = 1;
+ sprite->data[6] = 1;
+ sub_8183B4C(sprite);
+ sprite->callback = sub_8183B4C;
+}
+
+static void pokemonanimfunc_69(struct Sprite *sprite)
+{
+ sprite->data[5] = 2;
+ sprite->data[6] = 1;
+ sub_8183B4C(sprite);
+ sprite->callback = sub_8183B4C;
+}
+
+static void pokemonanimfunc_6A(struct Sprite *sprite)
+{
+ sprite->data[5] = 2;
+ sprite->data[6] = 2;
+ sub_8183B4C(sprite);
+ sprite->callback = sub_8183B4C;
+}
+
+static void sub_8183C6C(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 255)
+ {
+ if (sprite->data[5] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+ else
+ {
+ sprite->data[5]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->data[7] += sprite->data[6];
+ if (sprite->data[7] > 256)
+ sprite->data[7] = 256;
+
+ scale = Sin(sprite->data[7] / 2, 64);
+ HandleSetAffineData(sprite, 256 - scale, 256 - scale, 0);
+ }
+}
+
+static void pokemonanimfunc_6B(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 4;
+ sprite->data[5] = 1;
+ }
+
+ sub_8183C6C(sprite);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_6C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 2;
+ }
+
+ sub_8183C6C(sprite);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_6D(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182764(sprite);
+}
+
+static void pokemonanimfunc_6E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 4;
+ sprite->data[5] = 256;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182764(sprite);
+}
+
+static void pokemonanimfunc_6F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182830(sprite);
+}
+
+static void pokemonanimfunc_70(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 8;
+ }
+
+ sub_8182830(sprite);
+}
+
+static void pokemonanimfunc_71(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 5;
+ sprite->data[6] = 8;
+ }
+
+ sub_8180828(sprite);
+}
+
+static void pokemonanimfunc_72(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 3;
+ sprite->data[6] = 4;
+ }
+
+ sub_8180828(sprite);
+}
+
+static void pokemonanimfunc_73(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 30;
+ sprite->data[3] = 60;
+ sprite->data[7] = 0;
+ }
+
+ sub_81832C8(sprite);
+}
+
+static void pokemonanimfunc_74(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 2;
+ sprite->data[6] = 20;
+ sprite->data[3] = 70;
+ sprite->data[7] = 0;
+ }
+
+ sub_81832C8(sprite);
+}
+
+static void pokemonanimfunc_75(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 2;
+ sprite->data[6] = 20;
+ sprite->data[3] = 70;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_8183418(sprite);
+}
+
+static void pokemonanimfunc_76(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 30;
+ sprite->data[3] = 60;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_8183418(sprite);
+}
+
+static void pokemonanimfunc_77(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 2;
+ sprite->data[6] = 20;
+ sprite->data[3] = 70;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81837DC(sprite);
+}
+
+static void pokemonanimfunc_78(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 30;
+ sprite->data[3] = 60;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81837DC(sprite);
+}
+
+static void sub_8183FA8(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 255)
+ {
+ if (sprite->data[6] <= 1)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->data[7] %= 256;
+ sprite->data[6]--;
+ }
+ }
+ else
+ {
+ sprite->pos2.x = -(Sin(sprite->data[7], sprite->data[5]));
+ sprite->pos2.y = Sin((sprite->data[7] + 192) % 256, sprite->data[4]);
+ if (sprite->pos2.y > 0)
+ sprite->pos2.y *= -1;
+
+ sprite->pos2.y += sprite->data[4];
+ sprite->data[7] += sprite->data[3];
+ }
+}
+
+static void pokemonanimfunc_79(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 12;
+ sprite->data[4] = 12;
+ sprite->data[3] = 4;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_7A(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 12;
+ sprite->data[4] = 12;
+ sprite->data[3] = 6;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_7B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 12;
+ sprite->data[4] = 12;
+ sprite->data[3] = 8;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void sub_81840C4(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 256)
+ {
+ if (sprite->data[6] <= sprite->data[4])
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]++;
+ sprite->data[7] = 0;
+ }
+
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s16 posX;
+
+ if (sprite->data[7] > 159)
+ {
+ if (sprite->data[7] > 256)
+ sprite->data[7] = 256;
+
+ sprite->pos2.y = -(Sin(sprite->data[7] % 256, 8));
+ }
+ else if (sprite->data[7] > 95)
+ {
+ sprite->pos2.y = Sin(96, 6) - Sin((sprite->data[7] - 96) * 2, 4);
+ }
+ else
+ {
+ sprite->pos2.y = Sin(sprite->data[7], 6);
+ }
+
+ posX = -(Sin(sprite->data[7] / 2, sprite->data[5]));
+ if (sprite->data[4] % 2 == 0)
+ posX *= -1;
+
+ sprite->pos2.x = posX;
+ sprite->data[7] += sprite->data[3];
+ }
+}
+
+static void pokemonanimfunc_7C(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 16;
+ sprite->data[4] = 1;
+ sprite->data[3] = 4;
+ }
+
+ sub_81840C4(sprite);
+}
+
+static void pokemonanimfunc_7D(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 16;
+ sprite->data[4] = 1;
+ sprite->data[3] = 6;
+ }
+
+ sub_81840C4(sprite);
+}
+
+static void pokemonanimfunc_7E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 3;
+ sprite->data[7] = 0;
+ sprite->data[5] = 16;
+ sprite->data[4] = 1;
+ sprite->data[3] = 8;
+ }
+
+ sub_81840C4(sprite);
+}
+
+static void pokemonanimfunc_7F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 4;
+ sprite->data[4] = 6;
+ sprite->data[3] = 4;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_80(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 4;
+ sprite->data[4] = 6;
+ sprite->data[3] = 6;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_81(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 4;
+ sprite->data[4] = 6;
+ sprite->data[3] = 8;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void sub_8184290(struct Sprite *sprite)
+{
+ u16 index = Sin((sprite->data[2] * 128) / sprite->data[7], sprite->data[5]);
+ sprite->data[6] = -(index << 8);
+ sub_817F3F0(sprite, index, sprite->data[4], 0);
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6]);
+}
+
+static void pokemonanimfunc_82(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 60;
+ sprite->data[5] = 8;
+ sprite->data[4] = -32;
+ sprite->data[3] = 1;
+ sprite->data[0] = 0;
+ }
+
+ if (sprite->data[2] > sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ if (sprite->data[3] <= sprite->data[0])
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ return;
+ }
+ else
+ {
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sub_8184290(sprite);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_83(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 90;
+ sprite->data[5] = 8;
+ sprite->data[4] = -32;
+ sprite->data[3] = 1;
+ sprite->data[0] = 0;
+ }
+
+ if (sprite->data[2] > sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ if (sprite->data[3] <= sprite->data[0])
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ return;
+ }
+ else
+ {
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sub_8184290(sprite);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_84(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 30;
+ sprite->data[5] = 8;
+ sprite->data[4] = -32;
+ sprite->data[3] = 2;
+ sprite->data[0] = 0;
+ }
+
+ if (sprite->data[2] > sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ if (sprite->data[3] <= sprite->data[0])
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ return;
+ }
+ else
+ {
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sub_8184290(sprite);
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_8184468(struct Sprite *sprite)
+{
+ if (sprite->data[2] > sprite->data[7])
+ {
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ u8 posY_unsigned;
+ s8 posY_signed;
+ s32 posY;
+ s16 index = (u16)(sprite->data[2] % sprite->data[6] * 256) / sprite->data[6] % 256;
+ if (sprite->data[2] % 2 == 0)
+ {
+ sprite->data[4] = Sin(index, 32) + 256;
+ sprite->data[5] = Sin(index, 32) + 256;
+ posY_unsigned = Sin(index, 32);
+ posY_signed = posY_unsigned;
+ }
+ else
+ {
+ sprite->data[4] = Sin(index, 8) + 256;
+ sprite->data[5] = Sin(index, 8) + 256;
+ posY_unsigned = Sin(index, 8);
+ posY_signed = posY_unsigned;
+ }
+
+ posY = posY_signed;
+ if (posY < 0)
+ posY += 7;
+ sprite->pos2.y = (u32)(posY) >> 3;
+ HandleSetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_85(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->pos2.y += 2;
+ sprite->data[6] = 40;
+ sprite->data[7] = 80;
+ }
+
+ sub_8184468(sprite);
+}
+
+static void pokemonanimfunc_86(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->pos2.y += 2;
+ sprite->data[6] = 40;
+ sprite->data[7] = 40;
+ }
+
+ sub_8184468(sprite);
+}
+
+static void pokemonanimfunc_87(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->pos2.y += 2;
+ sprite->data[6] = 80;
+ sprite->data[7] = 80;
+ }
+
+ sub_8184468(sprite);
+}
+
+static void sub_8184610(struct Sprite *sprite);
+static void sub_8184640(struct Sprite *sprite);
+static void sub_8184678(struct Sprite *sprite);
+static void sub_81846B8(struct Sprite *sprite);
+
+static void sub_81845D4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x -= sprite->data[2];
+ if (sprite->pos2.x <= -sprite->data[6])
+ {
+ sprite->pos2.x = -sprite->data[6];
+ sprite->data[7] = 2;
+ sprite->callback = sub_8184610;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8184610(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x += sprite->data[7];
+ sprite->data[7]++;
+ if (sprite->pos2.x >= 0)
+ sprite->callback = sub_8184640;
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8184640(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x += sprite->data[7];
+ sprite->data[7]++;
+ if (sprite->pos2.x > sprite->data[6])
+ {
+ sprite->pos2.x = sprite->data[6];
+ sprite->callback = sub_8184678;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8184678(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[3] >= sprite->data[5])
+ {
+ sprite->callback = sub_81846B8;
+ }
+ else
+ {
+ sprite->pos2.x += sprite->data[4];
+ sprite->data[4] *= -1;
+ sprite->data[3]++;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_81846B8(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x -= 2;
+ if (sprite->pos2.x <= 0)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_88(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 4;
+ sprite->data[6] = 12;
+ sprite->data[5] = 16;
+ sprite->data[4] = 4;
+ sprite->data[3] = 0;
+ sprite->data[2] = 2;
+ sprite->callback = sub_81845D4;
+}
+
+static void pokemonanimfunc_89(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 2;
+ sprite->data[6] = 8;
+ sprite->data[5] = 12;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[2] = 1;
+ sprite->callback = sub_81845D4;
+}
+
+static void pokemonanimfunc_8A(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 0;
+ sprite->data[6] = 6;
+ sprite->data[5] = 6;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[2] = 1;
+ sprite->callback = sub_81845D4;
+}
+
+static void sub_8184770(struct Sprite *sprite)
+{
+ sprite->pos2.x = sprite->data[1];
+ if (sprite->data[0] > 1)
+ {
+ sprite->data[1] *= -1;
+ sprite->data[0] = 0;
+ }
+ else
+ {
+ sprite->data[0]++;
+ }
+}
+
+struct YellowBlendStruct
+{
+ u8 field_0;
+ u8 field_1;
+};
+
+static const struct YellowBlendStruct sUnknown_0860ADCC[] =
+{
+ {0, 1},
+ {1, 2},
+ {0, 15},
+ {1, 1},
+ {0, 15},
+ {1, 1},
+ {0, 15},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {0, 0xFF}
+};
+
+static const struct YellowBlendStruct sUnknown_0860AE1C[] =
+{
+ {0, 5},
+ {1, 1},
+ {0, 15},
+ {1, 4},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {0, 0xFF}
+};
+
+static const struct YellowBlendStruct sUnknown_0860AE54[] =
+{
+ {0, 1},
+ {1, 1},
+ {0, 20},
+ {1, 1},
+ {0, 20},
+ {1, 1},
+ {0, 20},
+ {1, 1},
+ {0, 1},
+ {0, 0xFF}
+};
+
+static const struct YellowBlendStruct *const sUnknown_0860AE7C[] =
+{
+ sUnknown_0860ADCC,
+ sUnknown_0860AE1C,
+ sUnknown_0860AE54
+};
+
+static void BackAnimBlendYellow(struct Sprite *sprite)
+{
+ const struct YellowBlendStruct *array = sUnknown_0860AE7C[sprite->data[3]];
+ sub_8184770(sprite);
+ if (array[sprite->data[6]].field_1 == 0xFF)
+ {
+ sprite->pos2.x = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ if (sprite->data[4] == 1)
+ {
+ if (array[sprite->data[6]].field_0 != 0)
+ BlendPalette(sprite->data[7], 0x10, 0x10, RGB_YELLOW);
+ else
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW);
+
+ sprite->data[4] = 0;
+ }
+
+ if (array[sprite->data[6]].field_1 == sprite->data[5])
+ {
+ sprite->data[4] = 1;
+ sprite->data[5] = 0;
+ sprite->data[6]++;
+ }
+ else
+ {
+ sprite->data[5]++;
+ }
+ }
+}
+
+static void pokemonanimfunc_8B(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ }
+
+ BackAnimBlendYellow(sprite);
+}
+
+static void pokemonanimfunc_8C(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 1;
+ }
+
+ BackAnimBlendYellow(sprite);
+}
+
+static void pokemonanimfunc_8D(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 2;
+ }
+
+ BackAnimBlendYellow(sprite);
+}
+
+static void BackAnimBlend(struct Sprite *sprite)
+{
+ static const u16 sColors[] =
+ {
+ RGB_RED, RGB_GREEN, RGB_BLUE, RGB_BLACK
+ };
+
+ if (sprite->data[2] > 127)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_RED);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], sColors[sprite->data[1]]);
+ }
+}
+
+static void sub_8184934(struct Sprite *sprite)
+{
+ if (sprite->data[3] < sprite->data[4])
+ {
+ sub_817F70C(sprite);
+ if (sprite->data[5] > sprite->data[0])
+ {
+ if (++sprite->data[3] < sprite->data[4])
+ sprite->data[5] = 0;
+
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign = 1 - (sprite->data[3] % 2 * 2);
+ sprite->pos2.x = sign * Sin((sprite->data[5] * 384 / sprite->data[0]) % 256, 6);
+ sprite->data[5]++;
+ }
+
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_8E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 10;
+ sprite->data[5] = 0;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_8F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 20;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_90(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 80;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_91(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 10;
+ sprite->data[5] = 0;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[1] = 1;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_92(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 20;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 1;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_93(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 80;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 1;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_94(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 10;
+ sprite->data[5] = 0;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[1] = 2;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_95(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 20;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 2;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_96(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 80;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 2;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ sprite->callback = SpriteCallbackDummy;
+}
diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c
new file mode 100644
index 000000000..253ab2cb4
--- /dev/null
+++ b/src/pokemon_icon.c
@@ -0,0 +1,1318 @@
+#include "global.h"
+#include "sprite.h"
+#include "mail.h"
+#include "graphics.h"
+#include "constants/species.h"
+#include "palette.h"
+#include "pokemon_icon.h"
+
+#define POKE_ICON_BASE_PAL_TAG 56000
+
+struct MonIconSpriteTemplate
+{
+ const struct OamData *oam;
+ const u8 *image;
+ const union AnimCmd *const *anims;
+ const union AffineAnimCmd *const *affineAnims;
+ void (*callback)(struct Sprite *);
+ u16 paletteTag;
+};
+
+// static functions
+static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8);
+
+// .rodata
+
+const u8 * const gMonIconTable[] =
+{
+ gMonIcon_Bulbasaur,
+ gMonIcon_Bulbasaur,
+ gMonIcon_Ivysaur,
+ gMonIcon_Venusaur,
+ gMonIcon_Charmander,
+ gMonIcon_Charmeleon,
+ gMonIcon_Charizard,
+ gMonIcon_Squirtle,
+ gMonIcon_Wartortle,
+ gMonIcon_Blastoise,
+ gMonIcon_Caterpie,
+ gMonIcon_Metapod,
+ gMonIcon_Butterfree,
+ gMonIcon_Weedle,
+ gMonIcon_Kakuna,
+ gMonIcon_Beedrill,
+ gMonIcon_Pidgey,
+ gMonIcon_Pidgeotto,
+ gMonIcon_Pidgeot,
+ gMonIcon_Rattata,
+ gMonIcon_Raticate,
+ gMonIcon_Spearow,
+ gMonIcon_Fearow,
+ gMonIcon_Ekans,
+ gMonIcon_Arbok,
+ gMonIcon_Pikachu,
+ gMonIcon_Raichu,
+ gMonIcon_Sandshrew,
+ gMonIcon_Sandslash,
+ gMonIcon_NidoranF,
+ gMonIcon_Nidorina,
+ gMonIcon_Nidoqueen,
+ gMonIcon_NidoranM,
+ gMonIcon_Nidorino,
+ gMonIcon_Nidoking,
+ gMonIcon_Clefairy,
+ gMonIcon_Clefable,
+ gMonIcon_Vulpix,
+ gMonIcon_Ninetales,
+ gMonIcon_Jigglypuff,
+ gMonIcon_Wigglytuff,
+ gMonIcon_Zubat,
+ gMonIcon_Golbat,
+ gMonIcon_Oddish,
+ gMonIcon_Gloom,
+ gMonIcon_Vileplume,
+ gMonIcon_Paras,
+ gMonIcon_Parasect,
+ gMonIcon_Venonat,
+ gMonIcon_Venomoth,
+ gMonIcon_Diglett,
+ gMonIcon_Dugtrio,
+ gMonIcon_Meowth,
+ gMonIcon_Persian,
+ gMonIcon_Psyduck,
+ gMonIcon_Golduck,
+ gMonIcon_Mankey,
+ gMonIcon_Primeape,
+ gMonIcon_Growlithe,
+ gMonIcon_Arcanine,
+ gMonIcon_Poliwag,
+ gMonIcon_Poliwhirl,
+ gMonIcon_Poliwrath,
+ gMonIcon_Abra,
+ gMonIcon_Kadabra,
+ gMonIcon_Alakazam,
+ gMonIcon_Machop,
+ gMonIcon_Machoke,
+ gMonIcon_Machamp,
+ gMonIcon_Bellsprout,
+ gMonIcon_Weepinbell,
+ gMonIcon_Victreebel,
+ gMonIcon_Tentacool,
+ gMonIcon_Tentacruel,
+ gMonIcon_Geodude,
+ gMonIcon_Graveler,
+ gMonIcon_Golem,
+ gMonIcon_Ponyta,
+ gMonIcon_Rapidash,
+ gMonIcon_Slowpoke,
+ gMonIcon_Slowbro,
+ gMonIcon_Magnemite,
+ gMonIcon_Magneton,
+ gMonIcon_Farfetchd,
+ gMonIcon_Doduo,
+ gMonIcon_Dodrio,
+ gMonIcon_Seel,
+ gMonIcon_Dewgong,
+ gMonIcon_Grimer,
+ gMonIcon_Muk,
+ gMonIcon_Shellder,
+ gMonIcon_Cloyster,
+ gMonIcon_Gastly,
+ gMonIcon_Haunter,
+ gMonIcon_Gengar,
+ gMonIcon_Onix,
+ gMonIcon_Drowzee,
+ gMonIcon_Hypno,
+ gMonIcon_Krabby,
+ gMonIcon_Kingler,
+ gMonIcon_Voltorb,
+ gMonIcon_Electrode,
+ gMonIcon_Exeggcute,
+ gMonIcon_Exeggutor,
+ gMonIcon_Cubone,
+ gMonIcon_Marowak,
+ gMonIcon_Hitmonlee,
+ gMonIcon_Hitmonchan,
+ gMonIcon_Lickitung,
+ gMonIcon_Koffing,
+ gMonIcon_Weezing,
+ gMonIcon_Rhyhorn,
+ gMonIcon_Rhydon,
+ gMonIcon_Chansey,
+ gMonIcon_Tangela,
+ gMonIcon_Kangaskhan,
+ gMonIcon_Horsea,
+ gMonIcon_Seadra,
+ gMonIcon_Goldeen,
+ gMonIcon_Seaking,
+ gMonIcon_Staryu,
+ gMonIcon_Starmie,
+ gMonIcon_Mrmime,
+ gMonIcon_Scyther,
+ gMonIcon_Jynx,
+ gMonIcon_Electabuzz,
+ gMonIcon_Magmar,
+ gMonIcon_Pinsir,
+ gMonIcon_Tauros,
+ gMonIcon_Magikarp,
+ gMonIcon_Gyarados,
+ gMonIcon_Lapras,
+ gMonIcon_Ditto,
+ gMonIcon_Eevee,
+ gMonIcon_Vaporeon,
+ gMonIcon_Jolteon,
+ gMonIcon_Flareon,
+ gMonIcon_Porygon,
+ gMonIcon_Omanyte,
+ gMonIcon_Omastar,
+ gMonIcon_Kabuto,
+ gMonIcon_Kabutops,
+ gMonIcon_Aerodactyl,
+ gMonIcon_Snorlax,
+ gMonIcon_Articuno,
+ gMonIcon_Zapdos,
+ gMonIcon_Moltres,
+ gMonIcon_Dratini,
+ gMonIcon_Dragonair,
+ gMonIcon_Dragonite,
+ gMonIcon_Mewtwo,
+ gMonIcon_Mew,
+ gMonIcon_Chikorita,
+ gMonIcon_Bayleef,
+ gMonIcon_Meganium,
+ gMonIcon_Cyndaquil,
+ gMonIcon_Quilava,
+ gMonIcon_Typhlosion,
+ gMonIcon_Totodile,
+ gMonIcon_Croconaw,
+ gMonIcon_Feraligatr,
+ gMonIcon_Sentret,
+ gMonIcon_Furret,
+ gMonIcon_Hoothoot,
+ gMonIcon_Noctowl,
+ gMonIcon_Ledyba,
+ gMonIcon_Ledian,
+ gMonIcon_Spinarak,
+ gMonIcon_Ariados,
+ gMonIcon_Crobat,
+ gMonIcon_Chinchou,
+ gMonIcon_Lanturn,
+ gMonIcon_Pichu,
+ gMonIcon_Cleffa,
+ gMonIcon_Igglybuff,
+ gMonIcon_Togepi,
+ gMonIcon_Togetic,
+ gMonIcon_Natu,
+ gMonIcon_Xatu,
+ gMonIcon_Mareep,
+ gMonIcon_Flaaffy,
+ gMonIcon_Ampharos,
+ gMonIcon_Bellossom,
+ gMonIcon_Marill,
+ gMonIcon_Azumarill,
+ gMonIcon_Sudowoodo,
+ gMonIcon_Politoed,
+ gMonIcon_Hoppip,
+ gMonIcon_Skiploom,
+ gMonIcon_Jumpluff,
+ gMonIcon_Aipom,
+ gMonIcon_Sunkern,
+ gMonIcon_Sunflora,
+ gMonIcon_Yanma,
+ gMonIcon_Wooper,
+ gMonIcon_Quagsire,
+ gMonIcon_Espeon,
+ gMonIcon_Umbreon,
+ gMonIcon_Murkrow,
+ gMonIcon_Slowking,
+ gMonIcon_Misdreavus,
+ gMonIcon_UnownA,
+ gMonIcon_Wobbuffet,
+ gMonIcon_Girafarig,
+ gMonIcon_Pineco,
+ gMonIcon_Forretress,
+ gMonIcon_Dunsparce,
+ gMonIcon_Gligar,
+ gMonIcon_Steelix,
+ gMonIcon_Snubbull,
+ gMonIcon_Granbull,
+ gMonIcon_Qwilfish,
+ gMonIcon_Scizor,
+ gMonIcon_Shuckle,
+ gMonIcon_Heracross,
+ gMonIcon_Sneasel,
+ gMonIcon_Teddiursa,
+ gMonIcon_Ursaring,
+ gMonIcon_Slugma,
+ gMonIcon_Magcargo,
+ gMonIcon_Swinub,
+ gMonIcon_Piloswine,
+ gMonIcon_Corsola,
+ gMonIcon_Remoraid,
+ gMonIcon_Octillery,
+ gMonIcon_Delibird,
+ gMonIcon_Mantine,
+ gMonIcon_Skarmory,
+ gMonIcon_Houndour,
+ gMonIcon_Houndoom,
+ gMonIcon_Kingdra,
+ gMonIcon_Phanpy,
+ gMonIcon_Donphan,
+ gMonIcon_Porygon2,
+ gMonIcon_Stantler,
+ gMonIcon_Smeargle,
+ gMonIcon_Tyrogue,
+ gMonIcon_Hitmontop,
+ gMonIcon_Smoochum,
+ gMonIcon_Elekid,
+ gMonIcon_Magby,
+ gMonIcon_Miltank,
+ gMonIcon_Blissey,
+ gMonIcon_Raikou,
+ gMonIcon_Entei,
+ gMonIcon_Suicune,
+ gMonIcon_Larvitar,
+ gMonIcon_Pupitar,
+ gMonIcon_Tyranitar,
+ gMonIcon_Lugia,
+ gMonIcon_HoOh,
+ gMonIcon_Celebi,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_QuestionMark,
+ gMonIcon_Treecko,
+ gMonIcon_Grovyle,
+ gMonIcon_Sceptile,
+ gMonIcon_Torchic,
+ gMonIcon_Combusken,
+ gMonIcon_Blaziken,
+ gMonIcon_Mudkip,
+ gMonIcon_Marshtomp,
+ gMonIcon_Swampert,
+ gMonIcon_Poochyena,
+ gMonIcon_Mightyena,
+ gMonIcon_Zigzagoon,
+ gMonIcon_Linoone,
+ gMonIcon_Wurmple,
+ gMonIcon_Silcoon,
+ gMonIcon_Beautifly,
+ gMonIcon_Cascoon,
+ gMonIcon_Dustox,
+ gMonIcon_Lotad,
+ gMonIcon_Lombre,
+ gMonIcon_Ludicolo,
+ gMonIcon_Seedot,
+ gMonIcon_Nuzleaf,
+ gMonIcon_Shiftry,
+ gMonIcon_Nincada,
+ gMonIcon_Ninjask,
+ gMonIcon_Shedinja,
+ gMonIcon_Taillow,
+ gMonIcon_Swellow,
+ gMonIcon_Shroomish,
+ gMonIcon_Breloom,
+ gMonIcon_Spinda,
+ gMonIcon_Wingull,
+ gMonIcon_Pelipper,
+ gMonIcon_Surskit,
+ gMonIcon_Masquerain,
+ gMonIcon_Wailmer,
+ gMonIcon_Wailord,
+ gMonIcon_Skitty,
+ gMonIcon_Delcatty,
+ gMonIcon_Kecleon,
+ gMonIcon_Baltoy,
+ gMonIcon_Claydol,
+ gMonIcon_Nosepass,
+ gMonIcon_Torkoal,
+ gMonIcon_Sableye,
+ gMonIcon_Barboach,
+ gMonIcon_Whiscash,
+ gMonIcon_Luvdisc,
+ gMonIcon_Corphish,
+ gMonIcon_Crawdaunt,
+ gMonIcon_Feebas,
+ gMonIcon_Milotic,
+ gMonIcon_Carvanha,
+ gMonIcon_Sharpedo,
+ gMonIcon_Trapinch,
+ gMonIcon_Vibrava,
+ gMonIcon_Flygon,
+ gMonIcon_Makuhita,
+ gMonIcon_Hariyama,
+ gMonIcon_Electrike,
+ gMonIcon_Manectric,
+ gMonIcon_Numel,
+ gMonIcon_Camerupt,
+ gMonIcon_Spheal,
+ gMonIcon_Sealeo,
+ gMonIcon_Walrein,
+ gMonIcon_Cacnea,
+ gMonIcon_Cacturne,
+ gMonIcon_Snorunt,
+ gMonIcon_Glalie,
+ gMonIcon_Lunatone,
+ gMonIcon_Solrock,
+ gMonIcon_Azurill,
+ gMonIcon_Spoink,
+ gMonIcon_Grumpig,
+ gMonIcon_Plusle,
+ gMonIcon_Minun,
+ gMonIcon_Mawile,
+ gMonIcon_Meditite,
+ gMonIcon_Medicham,
+ gMonIcon_Swablu,
+ gMonIcon_Altaria,
+ gMonIcon_Wynaut,
+ gMonIcon_Duskull,
+ gMonIcon_Dusclops,
+ gMonIcon_Roselia,
+ gMonIcon_Slakoth,
+ gMonIcon_Vigoroth,
+ gMonIcon_Slaking,
+ gMonIcon_Gulpin,
+ gMonIcon_Swalot,
+ gMonIcon_Tropius,
+ gMonIcon_Whismur,
+ gMonIcon_Loudred,
+ gMonIcon_Exploud,
+ gMonIcon_Clamperl,
+ gMonIcon_Huntail,
+ gMonIcon_Gorebyss,
+ gMonIcon_Absol,
+ gMonIcon_Shuppet,
+ gMonIcon_Banette,
+ gMonIcon_Seviper,
+ gMonIcon_Zangoose,
+ gMonIcon_Relicanth,
+ gMonIcon_Aron,
+ gMonIcon_Lairon,
+ gMonIcon_Aggron,
+ gMonIcon_Castform,
+ gMonIcon_Volbeat,
+ gMonIcon_Illumise,
+ gMonIcon_Lileep,
+ gMonIcon_Cradily,
+ gMonIcon_Anorith,
+ gMonIcon_Armaldo,
+ gMonIcon_Ralts,
+ gMonIcon_Kirlia,
+ gMonIcon_Gardevoir,
+ gMonIcon_Bagon,
+ gMonIcon_Shelgon,
+ gMonIcon_Salamence,
+ gMonIcon_Beldum,
+ gMonIcon_Metang,
+ gMonIcon_Metagross,
+ gMonIcon_Regirock,
+ gMonIcon_Regice,
+ gMonIcon_Registeel,
+ gMonIcon_Kyogre,
+ gMonIcon_Groudon,
+ gMonIcon_Rayquaza,
+ gMonIcon_Latias,
+ gMonIcon_Latios,
+ gMonIcon_Jirachi,
+ gMonIcon_Deoxys,
+ gMonIcon_Chimecho,
+ gMonIcon_Egg,
+ gMonIcon_UnownB,
+ gMonIcon_UnownC,
+ gMonIcon_UnownD,
+ gMonIcon_UnownE,
+ gMonIcon_UnownF,
+ gMonIcon_UnownG,
+ gMonIcon_UnownH,
+ gMonIcon_UnownI,
+ gMonIcon_UnownJ,
+ gMonIcon_UnownK,
+ gMonIcon_UnownL,
+ gMonIcon_UnownM,
+ gMonIcon_UnownN,
+ gMonIcon_UnownO,
+ gMonIcon_UnownP,
+ gMonIcon_UnownQ,
+ gMonIcon_UnownR,
+ gMonIcon_UnownS,
+ gMonIcon_UnownT,
+ gMonIcon_UnownU,
+ gMonIcon_UnownV,
+ gMonIcon_UnownW,
+ gMonIcon_UnownX,
+ gMonIcon_UnownY,
+ gMonIcon_UnownZ,
+ gMonIcon_UnownExclamationMark,
+ gMonIcon_UnownQuestionMark,
+};
+
+const u8 gMonIconPaletteIndices[] =
+{
+ 0, // ??????????
+ 1, // Bulbasaur
+ 1, // Ivysaur
+ 1, // Venusaur
+ 0, // Charmander
+ 0, // Charmeleon
+ 0, // Charizard
+ 0, // Squirtle
+ 2, // Wartortle
+ 2, // Blastoise
+ 1, // Caterpie
+ 1, // Metapod
+ 0, // Butterfree
+ 1, // Weedle
+ 2, // Kakuna
+ 2, // Beedrill
+ 0, // Pidgey
+ 0, // Pidgeotto
+ 0, // Pidgeot
+ 2, // Rattata
+ 1, // Raticate
+ 0, // Spearow
+ 0, // Fearow
+ 2, // Ekans
+ 2, // Arbok
+ 2, // Pikachu
+ 0, // Raichu
+ 2, // Sandshrew
+ 2, // Sandslash
+ 2, // Nidoran♀
+ 2, // Nidorina
+ 2, // Nidoqueen
+ 2, // Nidoran♂
+ 2, // Nidorino
+ 2, // Nidoking
+ 0, // Clefairy
+ 0, // Clefable
+ 2, // Vulpix
+ 1, // Ninetales
+ 0, // Jigglypuff
+ 0, // Wigglytuff
+ 2, // Zubat
+ 2, // Golbat
+ 1, // Oddish
+ 0, // Gloom
+ 0, // Vileplume
+ 0, // Paras
+ 0, // Parasect
+ 0, // Venonat
+ 2, // Venomoth
+ 2, // Diglett
+ 2, // Dugtrio
+ 1, // Meowth
+ 1, // Persian
+ 1, // Psyduck
+ 2, // Golduck
+ 1, // Mankey
+ 2, // Primeape
+ 0, // Growlithe
+ 0, // Arcanine
+ 0, // Poliwag
+ 0, // Poliwhirl
+ 0, // Poliwrath
+ 2, // Abra
+ 2, // Kadabra
+ 2, // Alakazam
+ 0, // Machop
+ 2, // Machoke
+ 0, // Machamp
+ 1, // Bellsprout
+ 1, // Weepinbell
+ 1, // Victreebel
+ 2, // Tentacool
+ 2, // Tentacruel
+ 1, // Geodude
+ 1, // Graveler
+ 1, // Golem
+ 0, // Ponyta
+ 0, // Rapidash
+ 0, // Slowpoke
+ 0, // Slowbro
+ 0, // Magnemite
+ 0, // Magneton
+ 1, // Farfetch'd
+ 2, // Doduo
+ 2, // Dodrio
+ 2, // Seel
+ 2, // Dewgong
+ 2, // Grimer
+ 2, // Muk
+ 2, // Shellder
+ 2, // Cloyster
+ 2, // Gastly
+ 2, // Haunter
+ 2, // Gengar
+ 2, // Onix
+ 2, // Drowzee
+ 1, // Hypno
+ 2, // Krabby
+ 2, // Kingler
+ 0, // Voltorb
+ 0, // Electrode
+ 0, // Exeggcute
+ 1, // Exeggutor
+ 1, // Cubone
+ 1, // Marowak
+ 2, // Hitmonlee
+ 2, // Hitmonchan
+ 1, // Lickitung
+ 2, // Koffing
+ 2, // Weezing
+ 1, // Rhyhorn
+ 1, // Rhydon
+ 0, // Chansey
+ 0, // Tangela
+ 1, // Kangaskhan
+ 0, // Horsea
+ 0, // Seadra
+ 0, // Goldeen
+ 0, // Seaking
+ 2, // Staryu
+ 2, // Starmie
+ 0, // Mr. mime
+ 1, // Scyther
+ 2, // Jynx
+ 1, // Electabuzz
+ 0, // Magmar
+ 2, // Pinsir
+ 2, // Tauros
+ 0, // Magikarp
+ 0, // Gyarados
+ 2, // Lapras
+ 2, // Ditto
+ 2, // Eevee
+ 0, // Vaporeon
+ 0, // Jolteon
+ 0, // Flareon
+ 0, // Porygon
+ 0, // Omanyte
+ 0, // Omastar
+ 2, // Kabuto
+ 2, // Kabutops
+ 0, // Aerodactyl
+ 1, // Snorlax
+ 0, // Articuno
+ 0, // Zapdos
+ 0, // Moltres
+ 0, // Dratini
+ 0, // Dragonair
+ 2, // Dragonite
+ 2, // Mewtwo
+ 0, // Mew
+ 1, // Chikorita
+ 1, // Bayleef
+ 1, // Meganium
+ 1, // Cyndaquil
+ 1, // Quilava
+ 1, // Typhlosion
+ 2, // Totodile
+ 2, // Croconaw
+ 2, // Feraligatr
+ 2, // Sentret
+ 2, // Furret
+ 2, // Hoothoot
+ 2, // Noctowl
+ 0, // Ledyba
+ 0, // Ledian
+ 1, // Spinarak
+ 0, // Ariados
+ 2, // Crobat
+ 2, // Chinchou
+ 0, // Lanturn
+ 0, // Pichu
+ 0, // Cleffa
+ 1, // Igglybuff
+ 2, // Togepi
+ 2, // Togetic
+ 0, // Natu
+ 0, // Xatu
+ 2, // Mareep
+ 0, // Flaaffy
+ 0, // Ampharos
+ 1, // Bellossom
+ 2, // Marill
+ 2, // Azumarill
+ 1, // Sudowoodo
+ 1, // Politoed
+ 1, // Hoppip
+ 1, // Skiploom
+ 2, // Jumpluff
+ 2, // Aipom
+ 1, // Sunkern
+ 1, // Sunflora
+ 1, // Yanma
+ 0, // Wooper
+ 0, // Quagsire
+ 2, // Espeon
+ 2, // Umbreon
+ 2, // Murkrow
+ 0, // Slowking
+ 0, // Misdreavus
+ 0, // Unown A
+ 0, // Wobbuffet
+ 1, // Girafarig
+ 0, // Pineco
+ 2, // Forretress
+ 2, // Dunsparce
+ 2, // Gligar
+ 0, // Steelix
+ 0, // Snubbull
+ 2, // Granbull
+ 0, // Qwilfish
+ 0, // Scizor
+ 1, // Shuckle
+ 2, // Heracross
+ 0, // Sneasel
+ 0, // Teddiursa
+ 2, // Ursaring
+ 0, // Slugma
+ 0, // Magcargo
+ 2, // Swinub
+ 2, // Piloswine
+ 0, // Corsola
+ 0, // Remoraid
+ 0, // Octillery
+ 0, // Delibird
+ 2, // Mantine
+ 0, // Skarmory
+ 0, // Houndour
+ 0, // Houndoom
+ 0, // Kingdra
+ 0, // Phanpy
+ 0, // Donphan
+ 0, // Porygon2
+ 2, // Stantler
+ 1, // Smeargle
+ 2, // Tyrogue
+ 2, // Hitmontop
+ 1, // Smoochum
+ 1, // Elekid
+ 1, // Magby
+ 1, // Miltank
+ 1, // Blissey
+ 0, // Raikou
+ 2, // Entei
+ 0, // Suicune
+ 1, // Larvitar
+ 0, // Pupitar
+ 1, // Tyranitar
+ 0, // Lugia
+ 1, // Ho-Oh
+ 1, // Celebi
+ 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, // ?
+ 1, // Treecko
+ 0, // Grovyle
+ 1, // Sceptile
+ 0, // Torchic
+ 0, // Combusken
+ 0, // Blaziken
+ 0, // Mudkip
+ 0, // Marshtomp
+ 0, // Swampert
+ 2, // Poochyena
+ 2, // Mightyena
+ 2, // Zigzagoon
+ 2, // Linoone
+ 0, // Wurmple
+ 2, // Silcoon
+ 0, // Beautifly
+ 2, // Cascoon
+ 1, // Dustox
+ 1, // Lotad
+ 1, // Lombre
+ 1, // Ludicolo
+ 1, // Seedot
+ 1, // Nuzleaf
+ 0, // Shiftry
+ 1, // Nincada
+ 1, // Ninjask
+ 1, // Shedinja
+ 2, // Taillow
+ 2, // Swellow
+ 1, // Shroomish
+ 1, // Breloom
+ 1, // Spinda
+ 0, // Wingull
+ 0, // Pelipper
+ 2, // Surskit
+ 0, // Masquerain
+ 2, // Wailmer
+ 0, // Wailord
+ 0, // Skitty
+ 2, // Delcatty
+ 1, // Kecleon
+ 1, // Baltoy
+ 0, // Claydol
+ 0, // Nosepass
+ 1, // Torkoal
+ 2, // Sableye
+ 0, // Barboach
+ 0, // Whiscash
+ 0, // Luvdisc
+ 0, // Corphish
+ 0, // Crawdaunt
+ 2, // Feebas
+ 0, // Milotic
+ 0, // Carvanha
+ 0, // Sharpedo
+ 1, // Trapinch
+ 1, // Vibrava
+ 1, // Flygon
+ 2, // Makuhita
+ 1, // Hariyama
+ 1, // Electrike
+ 0, // Manectric
+ 1, // Numel
+ 0, // Camerupt
+ 2, // Spheal
+ 2, // Sealeo
+ 0, // Walrein
+ 1, // Cacnea
+ 1, // Cacturne
+ 2, // Snorunt
+ 0, // Glalie
+ 1, // Lunatone
+ 0, // Solrock
+ 2, // Azurill
+ 0, // Spoink
+ 2, // Grumpig
+ 0, // Plusle
+ 0, // Minun
+ 2, // Mawile
+ 0, // Meditite
+ 0, // Medicham
+ 0, // Swablu
+ 0, // Altaria
+ 0, // Wynaut
+ 0, // Duskull
+ 0, // Dusclops
+ 0, // Roselia
+ 2, // Slakoth
+ 2, // Vigoroth
+ 1, // Slaking
+ 1, // Gulpin
+ 2, // Swalot
+ 1, // Tropius
+ 0, // Whismur
+ 2, // Loudred
+ 2, // Exploud
+ 0, // Clamperl
+ 0, // Huntail
+ 0, // Gorebyss
+ 0, // Absol
+ 0, // Shuppet
+ 0, // Banette
+ 2, // Seviper
+ 0, // Zangoose
+ 1, // Relicanth
+ 2, // Aron
+ 2, // Lairon
+ 2, // Aggron
+ 0, // Castform
+ 0, // Volbeat
+ 2, // Illumise
+ 2, // Lileep
+ 0, // Cradily
+ 0, // Anorith
+ 0, // Armaldo
+ 1, // Ralts
+ 1, // Kirlia
+ 1, // Gardevoir
+ 2, // Bagon
+ 2, // Shelgon
+ 0, // Salamence
+ 0, // Beldum
+ 0, // Metang
+ 0, // Metagross
+ 2, // Regirock
+ 2, // Regice
+ 2, // Registeel
+ 2, // Kyogre
+ 0, // Groudon
+ 1, // Rayquaza
+ 0, // Latias
+ 2, // Latios
+ 0, // Jirachi
+ 0, // Deoxys
+ 0, // Chimecho
+ 1, // Egg
+ 0, // Unown B
+ 0, // Unown C
+ 0, // Unown D
+ 0, // Unown E
+ 0, // Unown F
+ 0, // Unown G
+ 0, // Unown H
+ 0, // Unown I
+ 0, // Unown J
+ 0, // Unown K
+ 0, // Unown L
+ 0, // Unown M
+ 0, // Unown N
+ 0, // Unown O
+ 0, // Unown P
+ 0, // Unown Q
+ 0, // Unown R
+ 0, // Unown S
+ 0, // Unown T
+ 0, // Unown U
+ 0, // Unown V
+ 0, // Unown W
+ 0, // Unown X
+ 0, // Unown Y
+ 0, // Unown Z
+ 0, // Unown Exclamation Mark
+ 0, // Unown Question Mark
+};
+
+const struct SpritePalette gMonIconPaletteTable[] =
+{
+ { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 },
+ { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 },
+ { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 },
+
+// There are only 3 actual palettes. The following are unused
+// and don't point to valid data.
+ { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 },
+ { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 },
+ { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 },
+};
+
+const struct OamData sMonIconOamData =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+// fastest to slowest
+
+static const union AnimCmd sAnim_0[] =
+{
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(1, 6),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sAnim_1[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sAnim_2[] =
+{
+ ANIMCMD_FRAME(0, 14),
+ ANIMCMD_FRAME(1, 14),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sAnim_3[] =
+{
+ ANIMCMD_FRAME(0, 22),
+ ANIMCMD_FRAME(1, 22),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sAnim_4[] =
+{
+ ANIMCMD_FRAME(0, 29),
+ ANIMCMD_FRAME(0, 29), // frame 0 is repeated
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const sMonIconAnims[] =
+{
+ sAnim_0,
+ sAnim_1,
+ sAnim_2,
+ sAnim_3,
+ sAnim_4,
+};
+
+static const union AffineAnimCmd sAffineAnim_0[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 0, 10),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sAffineAnim_1[] =
+{
+ AFFINEANIMCMD_FRAME(-2, -2, 0, 122),
+ AFFINEANIMCMD_END,
+};
+
+const union AffineAnimCmd *const sMonIconAffineAnims[] =
+{
+ sAffineAnim_0,
+ sAffineAnim_1,
+};
+
+const u16 sSpriteImageSizes[3][4] =
+{
+ // square
+ {
+ 0x20, // 1×1
+ 0x80, // 2×2
+ 0x200, // 4×4
+ 0x800, // 8×8
+ },
+
+ // horizontal rectangle
+ {
+ 0x40, // 2×1
+ 0x80, // 4×1
+ 0x100, // 4×2
+ 0x400, // 8×4
+ },
+
+ // vertical rectangle
+ {
+ 0x40, // 1×2
+ 0x80, // 1×4
+ 0x100, // 2×4
+ 0x400, // 4×8
+ },
+};
+
+u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra)
+{
+ u8 spriteId;
+ struct MonIconSpriteTemplate iconTemplate =
+ {
+ .oam = &sMonIconOamData,
+ .image = GetMonIconPtr(species, personality, extra),
+ .anims = sMonIconAnims,
+ .affineAnims = sMonIconAffineAnims,
+ .callback = callback,
+ .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],
+ };
+
+ if (species > SPECIES_EGG)
+ iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG;
+
+ spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);
+
+ UpdateMonIconFrame(&gSprites[spriteId]);
+
+ return spriteId;
+}
+
+u8 sub_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, bool32 extra)
+{
+ u8 spriteId;
+ struct MonIconSpriteTemplate iconTemplate =
+ {
+ .oam = &sMonIconOamData,
+ .image = NULL,
+ .anims = sMonIconAnims,
+ .affineAnims = sMonIconAffineAnims,
+ .callback = callback,
+ .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],
+ };
+
+ iconTemplate.image = GetMonIconTiles(species, extra);
+ spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);
+
+ UpdateMonIconFrame(&gSprites[spriteId]);
+
+ return spriteId;
+}
+
+u16 mon_icon_convert_unown_species_id(u16 species, u32 personality)
+{
+ u16 result;
+
+ if (species == SPECIES_UNOWN)
+ {
+ u16 letter = GetUnownLetterByPersonality(personality);
+ if (letter == 0)
+ letter = SPECIES_UNOWN;
+ else
+ letter += (SPECIES_UNOWN_B - 1);
+ result = letter;
+ }
+ else
+ {
+ if (species > SPECIES_EGG)
+ result = 260;
+ else
+ result = species;
+ }
+
+ return result;
+}
+
+u16 GetUnownLetterByPersonality(u32 personality)
+{
+ if (!personality)
+ return 0;
+ return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;
+}
+
+u16 sub_80D2E84(u16 species)
+{
+ u16 value;
+
+ if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN)
+ {
+ if (value == 0)
+ value += SPECIES_UNOWN;
+ else
+ value += (SPECIES_UNOWN_B - 1);
+ return value;
+ }
+ else
+ {
+ if(species > (SPECIES_UNOWN_B - 1))
+ species = 260;
+ return mon_icon_convert_unown_species_id(species, 0);
+ }
+}
+
+const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra)
+{
+ return GetMonIconTiles(mon_icon_convert_unown_species_id(species, personality), extra);
+}
+
+
+
+void sub_80D2EF8(struct Sprite *sprite)
+{
+ sub_80D328C(sprite);
+}
+
+void LoadMonIconPalettes(void)
+{
+ u8 i;
+ for (i = 0; i < 6; i++)
+ LoadSpritePalette(&gMonIconPaletteTable[i]);
+}
+
+// unused
+void SafeLoadMonIconPalette(u16 species)
+{
+ u8 palIndex;
+ if (species > SPECIES_EGG)
+ species = 260;
+ palIndex = gMonIconPaletteIndices[species];
+ if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)
+ LoadSpritePalette(&gMonIconPaletteTable[palIndex]);
+}
+
+void LoadMonIconPalette(u16 species)
+{
+ u8 palIndex = gMonIconPaletteIndices[species];
+ if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)
+ LoadSpritePalette(&gMonIconPaletteTable[palIndex]);
+}
+
+void FreeMonIconPalettes(void)
+{
+ u8 i;
+ for (i = 0; i < 6; i++)
+ FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag);
+}
+
+// unused
+void SafeFreeMonIconPalette(u16 species)
+{
+ u8 palIndex;
+ if (species > SPECIES_EGG)
+ species = 260;
+ palIndex = gMonIconPaletteIndices[species];
+ FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);
+}
+
+void FreeMonIconPalette(u16 species)
+{
+ u8 palIndex;
+ palIndex = gMonIconPaletteIndices[species];
+ FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);
+}
+
+void sub_80D3014(struct Sprite *sprite)
+{
+ UpdateMonIconFrame(sprite);
+}
+
+const u8* GetMonIconTiles(u16 species, bool32 extra)
+{
+ const u8* iconSprite = gMonIconTable[species];
+ if(species == SPECIES_DEOXYS && extra == TRUE)
+ {
+ iconSprite = (const u8*)(0x400 + (u32)iconSprite); //WTF?
+ }
+ return iconSprite;
+}
+
+void sub_80D304C(u16 offset)
+{
+ s32 i;
+ const struct SpritePalette* monIconPalettePtr;
+
+ if(offset <= 0xA0)
+ {
+ monIconPalettePtr = gMonIconPaletteTable;
+ for(i = 5; i >= 0 ; i--)
+ {
+ LoadPalette(monIconPalettePtr->data, offset, 0x20);
+ offset += 0x10;
+ monIconPalettePtr++;
+ }
+ }
+}
+
+u8 sub_80D3080(u16 species)
+{
+ if (species > SPECIES_EGG)
+ species = 260;
+ return gMonIconPaletteIndices[species];
+}
+
+u8 sub_80D30A0(u16 species)
+{
+ return gMonIconPaletteIndices[species];
+}
+
+const u16* GetValidMonIconPalettePtr(u16 species)
+{
+ if (species > SPECIES_EGG)
+ species = 260;
+ return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data;
+}
+
+// TODO: try to find a way to avoid using asm statement
+u8 UpdateMonIconFrame(struct Sprite *sprite)
+{
+ u8 result = 0;
+
+ if (sprite->animDelayCounter == 0)
+ {
+ s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;
+
+ switch (frame)
+ {
+ case -1:
+ break;
+ case -2:
+ sprite->animCmdIndex = 0;
+ break;
+ default:
+ RequestSpriteCopy(
+ // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on.
+ // because sprite->images is a struct def, it has to be casted to (u8 *) before any
+ // arithmetic can be performed.
+ (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame),
+ (u8 *)(OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP),
+ sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]);
+ {
+ register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration;
+ sprite->animDelayCounter = duration;
+ }
+ sprite->animCmdIndex++;
+ result = sprite->animCmdIndex;
+ break;
+ }
+ }
+ else
+ {
+ sprite->animDelayCounter--;
+ }
+ return result;
+}
+
+static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority)
+{
+ u8 spriteId;
+
+ struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] };
+
+ struct SpriteTemplate spriteTemplate =
+ {
+ .tileTag = 0xFFFF,
+ .paletteTag = iconTemplate->paletteTag,
+ .oam = iconTemplate->oam,
+ .anims = iconTemplate->anims,
+ .images = &image,
+ .affineAnims = iconTemplate->affineAnims,
+ .callback = iconTemplate->callback,
+ };
+
+ spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);
+ gSprites[spriteId].animPaused = TRUE;
+ gSprites[spriteId].animBeginning = FALSE;
+ gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image;
+ return spriteId;
+}
+
+void sub_80D328C(struct Sprite *sprite)
+{
+ struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] };
+ sprite->images = &image;
+ DestroySprite(sprite);
+}
+
+void sub_80D32C8(struct Sprite *sprite, u8 animNum)
+{
+ sprite->animNum = animNum;
+ sprite->animDelayCounter = 0;
+ sprite->animCmdIndex = 0;
+}
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index ec0103bc7..fe3b3e8dd 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "pokemon_size_record.h"
#include "event_data.h"
-#include "species.h"
+#include "constants/species.h"
#include "string_util.h"
#include "text.h"
#include "pokemon.h"
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index f82a52d38..7f8c24ab7 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -1,13 +1,80 @@
#include "global.h"
#include "pokemon_storage_system.h"
#include "pokemon.h"
-#include "species.h"
+#include "constants/species.h"
#include "event_data.h"
#include "string_util.h"
#include "text.h"
+#include "strings.h"
+#include "window.h"
IWRAM_DATA u8 gUnknown_03000F78[0x188];
+struct OptionAndDescription
+{
+ const u8 *optionTxt;
+ const u8 *descriptionTxt;
+};
+
+// const rom data
+const struct OptionAndDescription gUnknown_085716C0[] =
+{
+ {gText_WithdrawPokemon, gText_WithdrawMonDescription},
+ {gText_DepositPokemon, gText_DepositMonDescription},
+ {gText_MovePokemon, gText_MoveMonDescription},
+ {gText_MoveItems, gText_MoveItemsDescription},
+ {gText_SeeYa, gText_SeeYaDescription}
+};
+
+const struct WindowTemplate gUnknown_085716E8 = {0, 1, 1, 0x11, 0xA, 0xF, 1};
+
+static const union AnimCmd sSpriteAnim_85716F0[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_85716F8[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8571700[] =
+{
+ ANIMCMD_FRAME(6, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8571708[] =
+{
+ ANIMCMD_FRAME(10, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const sSpriteAnimTable_8571710[] =
+{
+ sSpriteAnim_85716F0,
+ sSpriteAnim_85716F8,
+ sSpriteAnim_8571700,
+ sSpriteAnim_8571708
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_8571720[] =
+{
+ AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] =
+{
+ sSpriteAffineAnim_8571720
+};
+
+const u8 gUnknown_08571734[] = {4, 0xF, 0xE};
+const u8 gUnknown_08571737[] = _("/30");
+
+// code
u8 CountMonsInBox(u8 boxId)
{
u16 i, count;
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index d09cbc407..32d2bde4f 100755..100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -3,57 +3,48 @@
#include "bg.h"
#include "decompress.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "link.h"
#include "m4a.h"
#include "main.h"
#include "malloc.h"
-#include "moves.h"
+#include "constants/moves.h"
#include "palette.h"
#include "pokemon.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "sprite.h"
+#include "dynamic_placeholder_text_util.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "window.h"
-
-struct ContestMove
-{
- u8 effect;
- u8 type;
- u8 comboID;
- u8 combo[4];
-};
-
-struct ContestEffect
-{
- u8 type;
- u8 appeal;
- u8 jam;
-};
-
-
+#include "event_data.h"
+#include "gpu_regs.h"
+#include "menu.h"
+#include "international_string_util.h"
+#include "scanline_effect.h"
+#include "menu_helpers.h"
+#include "daycare.h"
+#include "data2.h"
+#include "contest.h"
extern struct UnkSummaryStruct* gUnknown_0203CF1C;
extern struct BgTemplate gUnknown_0861CBB4;
extern u8 gUnknown_0203CF20;
-extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern s8 gUnknown_0861CC1C[];
-extern u8 gUnknown_08329D22[];
extern u8 gUnknown_0203CF21;
-extern u16 gSpecialVar_0x8005;
extern struct UnkStruct_61CC04 gUnknown_0861CC04;
extern struct UnkStruct_61CC04 gUnknown_0861CC10;
extern struct UnkStruct_61CC04 gUnknown_0861CBEC;
extern struct UnkStruct_61CC04 gUnknown_0861CBF8;
-extern u16 gUnknown_08DC3CD4[];
+extern u16 gSummaryScreenWindow_Tilemap[];
extern struct ContestMove gContestMoves[];
extern struct ContestEffect gContestEffects[];
extern struct WindowTemplate gUnknown_0861CC24;
-extern struct TextColor gUnknown_0861CD2C[];
+extern u8 gUnknown_0861CD2C[][3];
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern u8 gText_MaleSymbol[];
extern u8 gText_FemaleSymbol[];
@@ -65,21 +56,12 @@ extern u8 gUnknown_0861CE74[];
extern u8 gUnknown_0861CE7B[];
extern struct WindowTemplate gUnknown_0861CCEC;
extern struct WindowTemplate gUnknown_0861CD14;
+extern const u8 *const gContestEffectDescriptionPointers[];
+extern const u8 *const gMoveDescriptionPointers[];
-extern void sub_806F2AC(u8 a, u8 b);
void sub_81C488C(u8 a);
-extern void do_scheduled_bg_tilemap_copies_to_vram(void);
extern u8 sub_81221EC();
extern u8 sub_81221AC();
-extern void SetVBlankHBlankCallbacksToNull();
-extern void sub_8121DA0();
-extern void clear_scheduled_bg_copies_to_vram();
-extern void remove_some_task();
-extern void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable);
-extern void ShowBg(u8 a);
-extern void SetGpuReg(u8 regOffset, u16 value);
-extern void schedule_bg_copy_tilemap_to_vram(u8 a);
-extern void SetBgTilemapBuffer(u8 bg, void *tilemap);
extern u8 gUnknown_08D9862C;
extern u8 gUnknown_08D98CC8;
extern u8 gUnknown_08D987FC;
@@ -92,11 +74,8 @@ extern struct CompressedSpriteSheet gUnknown_0861D074;
extern struct CompressedSpriteSheet gUnknown_0861D0F8;
extern struct CompressedSpritePalette gUnknown_0861D100;
extern struct CompressedSpritePalette gUnknown_0861D07C;
-extern u8 gUnknown_08D97B84;
+extern u8 gMoveTypes_Pal;
extern u8 gUnknown_08D97D0C;
-extern void reset_temp_tile_data_buffers();
-extern void decompress_and_copy_tile_data_to_vram(u8 a, void* tiledata, u8 b, u8 c, u8 d);
-extern u8 free_temp_tile_data_buffers_if_possible();
extern void sub_81C1E20(u8 taskId);
extern u8 *GetMonNickname(struct Pokemon *mon, u8 *dest);
extern u16 SpeciesToPokedexNum(u16 species);
@@ -106,6 +85,7 @@ extern u8 gText_PkmnInfo[];
extern u8 gText_PkmnSkills[];
extern u8 gText_BattleMoves[];
extern u8 gText_ContestMoves[];
+extern u8 gText_HMMovesCantBeForgotten2[];
extern u8 gText_Cancel2[];
extern u8 gText_Info[];
extern u8 gText_Switch[];
@@ -126,8 +106,6 @@ extern u8 gText_Appeal[];
extern u8 gText_Jam[];
extern u8 gText_OTSlash[];
extern u8 gText_UnkCtrlF907F908[];
-extern u8 gAbilityNames[][13];
-extern u8 *gAbilityDescriptionPointers[];
extern u8 gText_XNature[];
extern u8 gText_XNatureHatchedAtYZ[];
extern u8 gText_XNatureHatchedSomewhereAt[];
@@ -156,19 +134,14 @@ extern u8 gUnknown_0861CE8E[];
extern u8 gText_OneDash[];
extern u8 gText_TwoDashes[];
extern u8 gText_ThreeDashes[];
+extern u8 gText_Cancel[];
extern u8 gUnknown_0861CE97[];
-extern struct BattleMove gBattleMoves[];
+extern const struct SpriteTemplate gUnknown_0861CFC4;
-extern u32 ChangeBgX(u8 bg, u32 value, u8 op);
extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f);
-extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str);
-extern s32 GetStringCenterAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
-extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
extern bool8 sub_81A6BF4();
extern bool8 sub_81B9E94();
-extern void sub_81AFBF0();
-extern u8 sub_81AFC0C(u8 a, u8 *b);
-extern void sub_81AFC28(u8 *a, u8 *b);
+extern void DynamicPlaceholderTextUtil_Reset();
extern void sub_8124610(u8 *a, u8 b);
extern int GetPlayerIDAsU32();
extern u8 GetCurrentPpToMaxPpState(u8 a, u8 b);
@@ -192,9 +165,12 @@ void sub_81C4984();
void sub_81C4A08();
void sub_81C4A88();
void sub_81C4280();
+void sub_81C43A0();
+void sub_81C4484();
+void sub_81C4420();
void sub_81C0510(u8 taskId);
void sub_81C171C(u8 taskId);
-void sub_8121E10();
+void ResetAllBgsCoordinates();
u8 sub_81B205C(struct Pokemon* a);
void sub_81C1DA4(u16 a, s16 b);
void sub_81C1EFC(u16 a, s16 b, u16 c);
@@ -360,10 +336,7 @@ struct UnkSummaryStruct
u8 unk40C9;
u8 unk40CA;
u8 unk40CB[8];
- u8 unk40D3;
- u8 unk40D4;
- u8 unk40D5;
- u8 unk_filler5[0x19];
+ u8 unk40D3[0x1C];
u8 unk40EF;
s16 unk40F0;
u8 unk_filler4[6];
@@ -451,12 +424,12 @@ bool8 sub_81BFB10(void)
{
case 0:
SetVBlankHBlankCallbacksToNull();
- sub_8121DA0();
+ ResetVramOamAndBgCntRegs();
clear_scheduled_bg_copies_to_vram();
gMain.state++;
break;
case 1:
- remove_some_task();
+ ScanlineEffect_Stop();
gMain.state++;
break;
case 2:
@@ -525,8 +498,8 @@ bool8 sub_81BFB10(void)
gMain.state++;
break;
case 17:
- gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &gUnknown_0203CF1C->unk40F0);
- if (gUnknown_0203CF1C->unk40D3 != 0xFF)
+ gUnknown_0203CF1C->unk40D3[0] = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &gUnknown_0203CF1C->unk40F0);
+ if (gUnknown_0203CF1C->unk40D3[0] != 0xFF)
{
gUnknown_0203CF1C->unk40F0 = 0;
gMain.state++;
@@ -560,7 +533,7 @@ bool8 sub_81BFB10(void)
gMain.state++;
break;
case 24:
- BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
gPaletteFade.bufferTransferDisabled = 0;
gMain.state++;
break;
@@ -579,7 +552,7 @@ void sub_81BFE24()
SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap2);
SetBgTilemapBuffer(2, &gUnknown_0203CF1C->unkTilemap1);
SetBgTilemapBuffer(3, &gUnknown_0203CF1C->unkTilemap0);
- sub_8121E10();
+ ResetAllBgsCoordinates();
schedule_bg_copy_tilemap_to_vram(1);
schedule_bg_copy_tilemap_to_vram(2);
schedule_bg_copy_tilemap_to_vram(3);
@@ -649,7 +622,7 @@ u8 sub_81BFEB0()
gUnknown_0203CF1C->unk40F0++;
break;
case 12:
- LoadCompressedPalette(&gUnknown_08D97B84, 0x1D0, 0x60);
+ LoadCompressedPalette(&gMoveTypes_Pal, 0x1D0, 0x60);
gUnknown_0203CF1C->unk40F0 = 0;
return 1;
}
@@ -780,7 +753,7 @@ void sub_81C0434()
void sub_81C044C(u8 taskId)
{
- BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
gTasks[taskId].func = sub_81C0484;
}
@@ -794,7 +767,7 @@ void sub_81C0484(u8 taskId)
ResetSpriteData();
FreeAllSpritePalettes();
StopCryAndClearCrySongs();
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
if (gMonSpritesGfxPtr == 0)
sub_806F47C(0);
sub_81C0434();
@@ -909,10 +882,10 @@ void sub_81C0704(u8 taskId)
break;
case 1:
sub_81C4898();
- DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3]);
+ DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3[0]]);
break;
case 2:
- DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D4]);
+ DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3[1]]);
break;
case 3:
sub_81C0098(&gUnknown_0203CF1C->currentMon);
@@ -935,10 +908,10 @@ void sub_81C0704(u8 taskId)
data[1] = 0;
break;
case 8:
- gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]);
- if (gUnknown_0203CF1C->unk40D3 == 0xFF)
+ gUnknown_0203CF1C->unk40D3[0] = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]);
+ if (gUnknown_0203CF1C->unk40D3[0] == 0xFF)
return;
- gSprites[gUnknown_0203CF1C->unk40D3].data2 = 1;
+ gSprites[gUnknown_0203CF1C->unk40D3[0]].data[2] = 1;
sub_81C0E24();
data[1] = 0;
break;
@@ -953,7 +926,7 @@ void sub_81C0704(u8 taskId)
sub_81C2524();
break;
case 12:
- gSprites[gUnknown_0203CF1C->unk40D3].data2 = 0;
+ gSprites[gUnknown_0203CF1C->unk40D3[0]].data[2] = 0;
break;
default:
if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0)
@@ -1158,7 +1131,7 @@ void sub_81C0E48(u8 taskId)
gUnknown_0203CF1C->unk40C6 = 0;
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
ClearWindowTilemap(0x13);
- if (gSprites[gUnknown_0203CF1C->unk40D5].invisible == 0)
+ if (gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible == 0)
ClearWindowTilemap(0xD);
sub_81C1DA4(9, -3);
sub_81C1EFC(9, -3, move);
@@ -1264,7 +1237,7 @@ void sub_81C1070(s16 *a, s8 b, u8 *c)
if ((*c == 4 && gUnknown_0203CF1C->unk40C4 == 0) || a[1] == 1)
{
ClearWindowTilemap(19);
- if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
+ if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
schedule_bg_copy_tilemap_to_vram(0);
sub_81C1DA4(9, -3);
@@ -1436,7 +1409,7 @@ void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId)
*ppBonusesPtr = localPpBonuses;
}
#else
-__attribute__((naked))
+NAKED
void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId)
{
asm(".syntax unified\n\
@@ -1647,7 +1620,7 @@ void sub_81C15EC(struct BoxPokemon *mon, u8 swappingFromId, u8 swappingToId)
*ppBonusesPtr = localPpBonuses;
}
#else
-__attribute__((naked))
+NAKED
void sub_81C15EC(struct BoxPokemon *mon, u8 swappingFromId, u8 swappingToId)
{
asm(".syntax unified\n\
@@ -1844,7 +1817,7 @@ void sub_81C174C(u8 taskId)
}
else
{
- PlaySE(0x20);
+ PlaySE(SE_HAZURE);
sub_81C18F4(taskId);
}
}
@@ -1908,7 +1881,7 @@ void sub_81C1940(u8 taskId)
{
ClearWindowTilemap(19);
- if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
+ if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
gTasks[taskId].func = sub_81C174C;
@@ -1922,7 +1895,7 @@ void sub_81C1940(u8 taskId)
if (gUnknown_0203CF1C->unk40C0 != 3)
{
ClearWindowTilemap(19);
- if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
+ if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
gTasks[taskId].func = sub_81C174C;
@@ -1934,7 +1907,7 @@ void sub_81C1940(u8 taskId)
else if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
ClearWindowTilemap(19);
- if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
+ if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
ClearWindowTilemap(13);
move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6];
sub_81C3E9C(move);
@@ -2058,7 +2031,7 @@ void sub_81C1CB0(struct UnkStruct_61CC04 *a, u16 *b, u8 c, u8 d)
Free(alloced);
}
#else
-__attribute__((naked))
+NAKED
void sub_81C1CB0(struct UnkStruct_61CC04 *a, u16 *b, u8 c, u8 d)
{
asm(".syntax unified\n\
@@ -2227,7 +2200,7 @@ void sub_81C1E20(u8 taskId)
}
else
{
- if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
+ if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
PutWindowTilemap(13);
PutWindowTilemap(19);
}
@@ -2278,7 +2251,7 @@ void sub_81C1F80(u8 taskId)
}
else
{
- if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
+ if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible)
{
PutWindowTilemap(13);
}
@@ -2344,23 +2317,23 @@ void sub_81C2194(u16 *a, u16 b, u8 c)
{
for (i = 0; i < 20; i++)
{
- a[(i + var) << 1] = gUnknown_08DC3CD4[i] + b;
- a[((i + var) << 1) + 0x40] = gUnknown_08DC3CD4[i] + b;
- a[((i + var) << 1) + 0x80] = gUnknown_08DC3CD4[i + 20] + b;
+ a[(i + var) << 1] = gSummaryScreenWindow_Tilemap[i] + b;
+ a[((i + var) << 1) + 0x40] = gSummaryScreenWindow_Tilemap[i] + b;
+ a[((i + var) << 1) + 0x80] = gSummaryScreenWindow_Tilemap[i + 20] + b;
}
}
else
{
for (i = 0; i < 20; i++)
{
- a[(i + var)] = gUnknown_08DC3CD4[i + 20] + b;
- a[((i + var)) + 0x40] = gUnknown_08DC3CD4[i + 40] + b;
- a[((i + var)) + 0x80] = gUnknown_08DC3CD4[i + 40] + b;
+ a[(i + var)] = gSummaryScreenWindow_Tilemap[i + 20] + b;
+ a[((i + var)) + 0x40] = gSummaryScreenWindow_Tilemap[i + 40] + b;
+ a[((i + var)) + 0x80] = gSummaryScreenWindow_Tilemap[i + 40] + b;
}
}
}
#else
-__attribute__((naked))
+NAKED
void sub_81C2194(u16 *a, u16 b, u8 c)
{
asm(".syntax unified\n\
@@ -2373,7 +2346,7 @@ void sub_81C2194(u16 *a, u16 b, u8 c)
cmp r2, 0\n\
bne _081C21E4\n\
movs r3, 0\n\
- ldr r5, =gUnknown_08DC3CD4\n\
+ ldr r5, =gSummaryScreenWindow_Tilemap\n\
_081C21A8:\n\
adds r2, r7, r3\n\
lsls r2, 1\n\
@@ -2403,7 +2376,7 @@ _081C21A8:\n\
.pool\n\
_081C21E4:\n\
movs r3, 0\n\
- ldr r5, =gUnknown_08DC3CD4\n\
+ ldr r5, =gSummaryScreenWindow_Tilemap\n\
_081C21E8:\n\
adds r1, r7, r3\n\
lsls r1, 1\n\
@@ -2556,9 +2529,9 @@ void sub_81C2554()
gUnknown_0203CF1C->unk40CB[i] |= 0xFF;
}
-void sub_81C25A4(u8 a, u8 *b, u8 c, u8 d, u8 e, u8 f)
+void sub_81C25A4(u8 a, const u8 *b, u8 c, u8 d, u8 e, u8 f)
{
- AddTextPrinterParametrized2(a, 1, c, d, 0, e, &gUnknown_0861CD2C[f], 0, b);
+ AddTextPrinterParameterized2(a, 1, c, d, 0, e, gUnknown_0861CD2C[f], 0, b);
}
void sub_81C25E8()
@@ -2795,93 +2768,27 @@ void sub_81C2C38(u8 a)
schedule_bg_copy_tilemap_to_vram(0);
}
-
-
-#ifdef NONMATCHING
u8 sub_81C2D2C(struct WindowTemplate *template, u8 a)
{
- u8 *r4 = gUnknown_0203CF1C->unk40CB;
- if (r4[a] == 0xFF)
+ u8 *windowIdPtr = &(gUnknown_0203CF1C->unk40CB[a]);
+ if (*windowIdPtr == 0xFF)
{
- r4[a] = AddWindow(&template[a]);
- FillWindowPixelBuffer(r4[a], 0);
+ *windowIdPtr = AddWindow(&template[a]);
+ FillWindowPixelBuffer(*windowIdPtr, 0);
}
- return r4[a];
-}
-#else
-__attribute__((naked))
-u8 sub_81C2D2C(struct WindowTemplate *template, u8 a)
-{
- asm(".syntax unified\n\
- push {r4,lr}\n\
- adds r3, r0, 0\n\
- lsls r1, 24\n\
- lsrs r2, r1, 24\n\
- ldr r0, =gUnknown_0203CF1C\n\
- ldr r4, =0x000040cb\n\
- adds r1, r2, r4\n\
- ldr r0, [r0]\n\
- adds r4, r0, r1\n\
- ldrb r0, [r4]\n\
- cmp r0, 0xFF\n\
- bne _081C2D56\n\
- lsls r0, r2, 3\n\
- adds r0, r3, r0\n\
- bl AddWindow\n\
- strb r0, [r4]\n\
- ldrb r0, [r4]\n\
- movs r1, 0\n\
- bl FillWindowPixelBuffer\n\
-_081C2D56:\n\
- ldrb r0, [r4]\n\
- pop {r4}\n\
- pop {r1}\n\
- bx r1\n\
- .pool\n\
- .syntax divided\n");
+ return *windowIdPtr;
}
-#endif
-#ifdef NONMATCHING
void sub_81C2D68(u8 a)
{
- u8 *r4 = gUnknown_0203CF1C->unk40CB;
- if (r4[a] != 0xFF)
+ u8 *windowIdPtr = &(gUnknown_0203CF1C->unk40CB[a]);
+ if (*windowIdPtr != 0xFF)
{
- ClearWindowTilemap(r4[a]);
- RemoveWindow(r4[a]);
- r4[a] = 0xFF;
+ ClearWindowTilemap(*windowIdPtr);
+ RemoveWindow(*windowIdPtr);
+ *windowIdPtr = 0xFF;
}
}
-#else
-__attribute__((naked))
-void sub_81C2D68(u8 a)
-{
- asm(".syntax unified\n\
- push {r4,lr}\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- ldr r1, =gUnknown_0203CF1C\n\
- ldr r2, =0x000040cb\n\
- adds r0, r2\n\
- ldr r1, [r1]\n\
- adds r4, r1, r0\n\
- ldrb r0, [r4]\n\
- cmp r0, 0xFF\n\
- beq _081C2D8C\n\
- bl ClearWindowTilemap\n\
- ldrb r0, [r4]\n\
- bl RemoveWindow\n\
- movs r0, 0xFF\n\
- strb r0, [r4]\n\
-_081C2D8C:\n\
- pop {r4}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- .syntax divided\n");
-}
-#endif
void sub_81C2D9C(u8 a)
{
@@ -2993,12 +2900,12 @@ void sub_81C307C()
{
struct PokeSummary *sum = &gUnknown_0203CF1C->summary;
u8 *text;
- sub_81AFBF0();
- sub_81AFC0C(0, gUnknown_0861CE74);
- sub_81AFC0C(1, gUnknown_0861CE7B);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_0861CE74);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_0861CE7B);
sub_81C31C0();
if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE || sub_81C3304() == TRUE)
- sub_81AFC28(gStringVar4, gText_XNature);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_XNature);
else
{
u8 *alloced1 = Alloc(32);
@@ -3007,7 +2914,7 @@ void sub_81C307C()
if (sum->metLocation <= 0xD4)
{
sub_8124610(alloced2, sum->metLocation);
- sub_81AFC0C(4, alloced2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, alloced2);
}
if (sub_81C3220() == 1)
{
@@ -3022,7 +2929,7 @@ void sub_81C307C()
text = (sum->metLocation > 0xD4) ? gText_XNatureObtainedInTrade : gText_XNatureProbablyMetAt;
else
text = gText_XNatureObtainedInTrade;
- sub_81AFC28(gStringVar4, text);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, text);
Free(alloced1);
Free(alloced2);
}
@@ -3036,17 +2943,17 @@ void sub_81C3194()
void sub_81C31C0()
{
struct UnkSummaryStruct *sumStruct = gUnknown_0203CF1C;
- sub_81AFC0C(2, gNatureNamePointers[sumStruct->summary.nature]);
- sub_81AFC0C(5, gText_EmptyString5);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gNatureNamePointers[sumStruct->summary.nature]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gText_EmptyString5);
}
void sub_81C31F0(u8 *a)
{
u8 level = gUnknown_0203CF1C->summary.metLevel;
if (level == 0)
- level = 5;
+ level = EGG_HATCH_LEVEL;
ConvertIntToDecimalStringN(a, level, 0, 3);
- sub_81AFC0C(3, a);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, a);
}
u8 sub_81C3220()
@@ -3111,7 +3018,7 @@ void sub_81C335C()
sub_81C25A4(r4, gText_FiveMarks, r5, 1, 0, 1);
}
#else
-__attribute__((naked))
+NAKED
void sub_81C335C()
{
asm(".syntax unified\n\
@@ -3258,11 +3165,11 @@ void sub_81C3554(u8 taskId)
void sub_81C35E4()
{
- u8 *text;
+ const u8 *text;
int offset;
if (gUnknown_0203CF1C->summary.item == ITEM_ENIGMA_BERRY && sub_81B1250() == 1 && (gUnknown_0203CF1C->unk40BE == 1 || gUnknown_0203CF1C->unk40BE == 4 || gUnknown_0203CF1C->unk40BE == 5))
{
- text = (u8*)ItemId_GetItem(ITEM_ENIGMA_BERRY);
+ text = ItemId_GetName(ITEM_ENIGMA_BERRY);
}
else if (gUnknown_0203CF1C->summary.item == ITEM_NONE)
text = gText_None;
@@ -3301,12 +3208,12 @@ void sub_81C3710()
ConvertIntToDecimalStringN(alloced2, gUnknown_0203CF1C->summary.maxHP, 1, 3);
ConvertIntToDecimalStringN(alloced3, gUnknown_0203CF1C->summary.atk, 1, 7);
ConvertIntToDecimalStringN(alloced4, gUnknown_0203CF1C->summary.def, 1, 7);
- sub_81AFBF0();
- sub_81AFC0C(0, alloced1);
- sub_81AFC0C(1, alloced2);
- sub_81AFC0C(2, alloced3);
- sub_81AFC0C(3, alloced4);
- sub_81AFC28(gStringVar4, gUnknown_0861CE82);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, alloced1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, alloced2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, alloced3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, alloced4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE82);
Free(alloced1);
Free(alloced2);
Free(alloced3);
@@ -3323,11 +3230,11 @@ void sub_81C3808()
ConvertIntToDecimalStringN(gStringVar1, gUnknown_0203CF1C->summary.spatk, 1, 3);
ConvertIntToDecimalStringN(gStringVar2, gUnknown_0203CF1C->summary.spdef, 1, 3);
ConvertIntToDecimalStringN(gStringVar3, gUnknown_0203CF1C->summary.speed, 1, 3);
- sub_81AFBF0();
- sub_81AFC0C(0, gStringVar1);
- sub_81AFC0C(1, gStringVar2);
- sub_81AFC0C(2, gStringVar3);
- sub_81AFC28(gStringVar4, gUnknown_0861CE8E);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar3);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE8E);
}
void sub_81C3890()
@@ -3436,10 +3343,10 @@ void sub_81C3B08(u8 a)
sub_81C25A4(r8, gMoveNames[move], 0, (a<<4) + 1, 0, 1);
ConvertIntToDecimalStringN(gStringVar1, r10->summary.pp[a], 1, 2);
ConvertIntToDecimalStringN(gStringVar2, r6, 1, 2);
- sub_81AFBF0();
- sub_81AFC0C(0, gStringVar1);
- sub_81AFC0C(1, gStringVar2);
- sub_81AFC28(gStringVar4, gUnknown_0861CE97);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar2);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE97);
text = gStringVar4;
r5 = GetCurrentPpToMaxPpState(r10->summary.pp[a], r6) + 9;
offset = GetStringRightAlignXOffset(1, text, 0x2C);
@@ -3454,7 +3361,7 @@ void sub_81C3B08(u8 a)
sub_81C25A4(sp, text, offset, (a<<4), 0, r5);
}
#else
-__attribute__((naked))
+NAKED
void sub_81C3B08(u8 a)
{
asm(".syntax unified\n\
@@ -3531,17 +3438,17 @@ void sub_81C3B08(u8 a)
movs r2, 0x1\n\
movs r3, 0x2\n\
bl ConvertIntToDecimalStringN\n\
- bl sub_81AFBF0\n\
+ bl DynamicPlaceholderTextUtil_Reset\n\
movs r0, 0\n\
mov r1, r8\n\
- bl sub_81AFC0C\n\
+ bl DynamicPlaceholderTextUtil_SetPlaceholderPtr\n\
movs r0, 0x1\n\
adds r1, r4, 0\n\
- bl sub_81AFC0C\n\
+ bl DynamicPlaceholderTextUtil_SetPlaceholderPtr\n\
ldr r4, =gStringVar4\n\
ldr r1, =gUnknown_0861CE97\n\
adds r0, r4, 0\n\
- bl sub_81AFC28\n\
+ bl DynamicPlaceholderTextUtil_ExpandPlaceholders\n\
adds r7, r4, 0\n\
ldrb r0, [r5]\n\
adds r1, r6, 0\n\
@@ -3676,3 +3583,238 @@ void sub_81C3D54(u8 taskId)
}
data[0]++;
}
+
+void sub_81C3E2C(u8 moveSlot)
+{
+ u16 move;
+
+ if (moveSlot == 4)
+ move = gUnknown_0203CF1C->unk40C4;
+ else
+ move = gUnknown_0203CF1C->summary.moves[moveSlot];
+
+ if (move != MOVE_NONE)
+ {
+ u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2);
+ sub_81C25A4(windowId, gContestEffectDescriptionPointers[gContestMoves[move].effect], 6, 1, 0, 0);
+ }
+}
+
+void sub_81C3E9C(u16 move)
+{
+ u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2);
+ FillWindowPixelBuffer(windowId, 0);
+ if (move != MOVE_NONE)
+ {
+ if (gUnknown_0203CF1C->unk40C0 == 2)
+ {
+ sub_81C3C5C(move);
+ sub_81C25A4(windowId, gMoveDescriptionPointers[move - 1], 6, 1, 0, 0);
+ }
+ else
+ {
+ sub_81C25A4(windowId, gContestEffectDescriptionPointers[gContestMoves[move].effect], 6, 1, 0, 0);
+ }
+ PutWindowTilemap(windowId);
+ }
+ else
+ {
+ ClearWindowTilemap(windowId);
+ }
+
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+void sub_81C3F44(void)
+{
+ u8 windowId1 = sub_81C2D2C(&gUnknown_0861CD14, 0);
+ u8 windowId2 = sub_81C2D2C(&gUnknown_0861CD14, 1);
+ if (gUnknown_0203CF1C->unk40C4 == MOVE_NONE)
+ {
+ sub_81C25A4(windowId1, gText_Cancel, 0, 0x41, 0, 1);
+ }
+ else
+ {
+ u16 move = gUnknown_0203CF1C->unk40C4;
+ if (gUnknown_0203CF1C->unk40C0 == 2)
+ sub_81C25A4(windowId1, gMoveNames[move], 0, 0x41, 0, 6);
+ else
+ sub_81C25A4(windowId1, gMoveNames[move], 0, 0x41, 0, 5);
+
+ ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].pp, 1, 2);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE97);
+ sub_81C25A4(windowId2, gStringVar4, GetStringRightAlignXOffset(1, gStringVar4, 0x2C), 0x41, 0, 12);
+ }
+}
+
+void sub_81C4064(void)
+{
+ u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 0);
+ FillWindowPixelRect(windowId, 0, 0, 0x42, 0x48, 0x10);
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_81C40A0(u8 a, u8 b)
+{
+ u8 windowId1 = sub_81C2D2C(&gUnknown_0861CD14, 0);
+ u8 windowId2 = sub_81C2D2C(&gUnknown_0861CD14, 1);
+
+ FillWindowPixelRect(windowId1, 0, 0, a * 16, 0x48, 0x10);
+ FillWindowPixelRect(windowId1, 0, 0, b * 16, 0x48, 0x10);
+
+ FillWindowPixelRect(windowId2, 0, 0, a * 16, 0x30, 0x10);
+ FillWindowPixelRect(windowId2, 0, 0, b * 16, 0x30, 0x10);
+
+ sub_81C3B08(a);
+ sub_81C3B08(b);
+}
+
+void sub_81C4154(void)
+{
+ u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2);
+ FillWindowPixelBuffer(windowId, 0);
+ sub_81C25A4(windowId, gText_HMMovesCantBeForgotten2, 6, 1, 0, 0);
+}
+
+void sub_81C4190(void)
+{
+ u8 i;
+
+ for (i = 0; i < 28; i++)
+ gUnknown_0203CF1C->unk40D3[i] |= 0xFF;
+}
+
+void sub_81C41C0(u8 spriteArrayId)
+{
+ if (gUnknown_0203CF1C->unk40D3[spriteArrayId] != 0xFF)
+ {
+ DestroySprite(&gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]]);
+ gUnknown_0203CF1C->unk40D3[spriteArrayId] = 0xFF;
+ }
+}
+
+void sub_81C4204(u8 spriteArrayId, bool8 invisible)
+{
+ gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]].invisible = invisible;
+}
+
+void sub_81C424C(void)
+{
+ u8 i;
+
+ for (i = 3; i < 28; i++)
+ {
+ if (gUnknown_0203CF1C->unk40D3[i] != 0xFF)
+ sub_81C4204(i, TRUE);
+ }
+}
+
+void sub_81C4280(void)
+{
+ switch (gUnknown_0203CF1C->unk40C0)
+ {
+ case 0:
+ sub_81C43A0();
+ break;
+ case 2:
+ sub_81C4420();
+ sub_81C44F0();
+ break;
+ case 3:
+ sub_81C4484();
+ sub_81C44F0();
+ break;
+ }
+}
+
+void sub_81C42C8(void)
+{
+ u8 i;
+
+ for (i = 3; i < 8; i++)
+ {
+ if (gUnknown_0203CF1C->unk40D3[i] == 0xFF)
+ gUnknown_0203CF1C->unk40D3[i] = CreateSprite(&gUnknown_0861CFC4, 0, 0, 2);
+
+ sub_81C4204(i, TRUE);
+ }
+}
+
+extern const u8 gUnknown_0861CFDC[];
+
+void sub_81C4318(u8 typeId, u8 x, u8 y, u8 spriteArrayId)
+{
+ struct Sprite *sprite = &gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]];
+ StartSpriteAnim(sprite, typeId);
+ sprite->oam.paletteNum = gUnknown_0861CFDC[typeId];
+ sprite->pos1.x = x + 16;
+ sprite->pos1.y = y + 8;
+ sub_81C4204(spriteArrayId, FALSE);
+}
+
+void sub_81C43A0(void)
+{
+ struct PokeSummary *summary = &gUnknown_0203CF1C->summary;
+ if (summary->isEgg)
+ {
+ sub_81C4318(TYPE_MYSTERY, 0x78, 0x30, 3);
+ sub_81C4204(4, TRUE);
+ }
+ else
+ {
+ sub_81C4318(gBaseStats[summary->species].type1, 0x78, 0x30, 3);
+ if (gBaseStats[summary->species].type1 != gBaseStats[summary->species].type2)
+ {
+ sub_81C4318(gBaseStats[summary->species].type2, 0xA0, 0x30, 4);
+ sub_81C4204(4, FALSE);
+ }
+ else
+ {
+ sub_81C4204(4, TRUE);
+ }
+ }
+}
+
+void sub_81C4420(void)
+{
+ u8 i;
+ struct PokeSummary *summary = &gUnknown_0203CF1C->summary;
+ for (i = 0; i < 4; i++)
+ {
+ if (summary->moves[i] != MOVE_NONE)
+ sub_81C4318(gBattleMoves[summary->moves[i]].type, 0x55, 0x20 + (i * 0x10), i + 3);
+ else
+ sub_81C4204(i + 3, TRUE);
+ }
+}
+
+void sub_81C4484(void)
+{
+ u8 i;
+ struct PokeSummary *summary = &gUnknown_0203CF1C->summary;
+ for (i = 0; i < 4; i++)
+ {
+ if (summary->moves[i] != MOVE_NONE)
+ sub_81C4318(NUMBER_OF_MON_TYPES + gContestMoves[summary->moves[i]].contestCategory, 0x55, 0x20 + (i * 0x10), i + 3);
+ else
+ sub_81C4204(i + 3, TRUE);
+ }
+}
+
+void sub_81C44F0(void)
+{
+ if (gUnknown_0203CF1C->unk40C4 == MOVE_NONE)
+ {
+ sub_81C4204(7, TRUE);
+ }
+ else
+ {
+ if (gUnknown_0203CF1C->unk40C0 == 2)
+ sub_81C4318(gBattleMoves[gUnknown_0203CF1C->unk40C4].type, 0x55, 0x60, 7);
+ else
+ sub_81C4318(NUMBER_OF_MON_TYPES + gContestMoves[gUnknown_0203CF1C->unk40C4].contestCategory, 0x55, 0x60, 7);
+ }
+}
diff --git a/src/rng.c b/src/random.c
index ddd149018..f0b2d9e5f 100644
--- a/src/rng.c
+++ b/src/random.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "rng.h"
+#include "random.h"
// The number 1103515245 comes from the example implementation of rand and srand
// in the ISO C standard.
@@ -7,6 +7,10 @@
EWRAM_DATA static u8 sUnknown = 0;
EWRAM_DATA static u32 sRandCount = 0;
+// IWRAM common
+IWRAM_DATA u32 gRngValue;
+IWRAM_DATA u32 gRng2Value;
+
u16 Random(void)
{
gRngValue = 1103515245 * gRngValue + 24691;
diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c
new file mode 100644
index 000000000..4783f73c0
--- /dev/null
+++ b/src/rayquaza_scene.c
@@ -0,0 +1,2932 @@
+#include "global.h"
+#include "rayquaza_scene.h"
+#include "sprite.h"
+#include "task.h"
+#include "graphics.h"
+#include "bg.h"
+#include "main.h"
+#include "malloc.h"
+#include "palette.h"
+#include "scanline_effect.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "gpu_regs.h"
+#include "decompress.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "constants/rgb.h"
+#include "random.h"
+
+struct RaySceneStruct
+{
+ MainCallback callback;
+ u8 tilemapBuffers[4][0x800];
+ u16 field_2004; // set but unused
+ u8 animId;
+ bool8 onlyOneAnim;
+ s16 field_2008;
+ s16 field_200A;
+ u8 unusedFields[12]; // completely unused
+};
+
+// EWRAM vars
+static EWRAM_DATA struct RaySceneStruct *sRayScene = NULL;
+
+// this file's functions
+static void Task_DuoFightAnim(u8 taskId);
+static void Task_RayTakesFlightAnim(u8 taskId);
+static void Task_RayDescendsAnim(u8 taskId);
+static void Task_RayChargesAnim(u8 taskId);
+static void Task_RayChasesAwayAnim(u8 taskId);
+static void Task_HandleRayDescends(u8 taskId);
+static void Task_RayDescendsEnd(u8 taskId);
+static void Task_HandleRayCharges(u8 taskId);
+static void sub_81D8AD8(u8 taskId);
+static void sub_81D8B2C(u8 taskId);
+static void Task_RayChargesEnd(u8 taskId);
+static void Task_HandleRayChasesAway(u8 taskId);
+static void sub_81D8FB0(u8 taskId);
+static void sub_81D7228(u8 taskId);
+static void Task_HandleDuoFight(u8 taskId);
+static void sub_81D752C(u8 taskId);
+static void Task_DuoFightEnd(u8 taskId);
+static void Task_HandleRayTakesFlight(u8 taskId);
+static void sub_81D81A4(u8 taskId);
+static void Task_RayTakesFlightEnd(u8 taskId);
+static void sub_81D94D4(u8 taskId);
+static void sub_81D93D8(u8 taskId);
+static void Task_RayChasesAwayEnd(u8 taskId);
+static void sub_81D90A8(u8 taskId);
+static void sub_81D98B4(u8 taskId);
+static void Task_EndAfterFadeScreen(u8 taskId);
+static void CB2_InitRayquazaScene(void);
+static void CB2_RayquazaScene(void);
+static void sub_81D750C(void);
+static void sub_81D7438(void);
+static void sub_81D7480(void);
+static void sub_81D74C8(void);
+static void sub_81D8BB4(void);
+static void sub_81D6A20(struct Sprite *sprite);
+static void sub_81D6D20(struct Sprite *sprite);
+static void sub_81D7860(struct Sprite *sprite);
+static void sub_81D7D14(struct Sprite *sprite);
+static void sub_81D7700(struct Sprite *sprite);
+static void sub_81D7A60(struct Sprite *sprite);
+static void sub_81D874C(struct Sprite *sprite);
+static void sub_81D9338(struct Sprite *sprite);
+static void sub_81D9420(struct Sprite *sprite);
+static void sub_81D8260(struct Sprite *sprite);
+static void sub_81D961C(struct Sprite *sprite);
+static void sub_81D97E0(struct Sprite *sprite);
+static void sub_81D9528(struct Sprite *sprite);
+static u8 sub_81D7664(void);
+static u8 sub_81D78BC(void);
+static u8 sub_81D86CC(void);
+static void DuoFightEnd(u8 taskId, s8 palDelay);
+static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y);
+
+// const rom data
+static const TaskFunc sTasksForAnimations[] =
+{
+ Task_DuoFightAnim, // RAY_ANIM_DUO_FIGHT_PRE
+ Task_DuoFightAnim, // RAY_ANIM_DUO_FIGHT
+ Task_RayTakesFlightAnim, // RAY_ANIM_TAKES_FLIGHT
+ Task_RayDescendsAnim, // RAY_ANIM_DESCENDS
+ Task_RayChargesAnim, // RAY_ANIM_CHARGES
+ Task_RayChasesAwayAnim, // RAY_ANIM_CHACES_AWAY
+ Task_EndAfterFadeScreen // RAY_ANIM_END
+};
+
+static const struct OamData sOamData_862A6BC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_862A6C4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_862A6CC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_862A6D4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_862A6DC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_862A6E4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_862A6EC =
+{
+ .y = 0,
+ .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 struct OamData sOamData_862A6F4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_862A6FC[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(64, 30),
+ ANIMCMD_FRAME(128, 30),
+ ANIMCMD_FRAME(64, 30),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_862A710[] =
+{
+ ANIMCMD_FRAME(192, 30),
+ ANIMCMD_FRAME(256, 30),
+ ANIMCMD_FRAME(320, 30),
+ ANIMCMD_FRAME(256, 30),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A724[] =
+{
+ sSpriteAnim_862A6FC,
+ sSpriteAnim_862A710
+};
+
+static const struct SpriteTemplate sUnknown_0862A72C =
+{
+ .tileTag = 30505,
+ .paletteTag = 30505,
+ .oam = &sOamData_862A6BC,
+ .anims = sSpriteAnimTable_862A724,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A744[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A74C[] =
+{
+ sSpriteAnim_862A744
+};
+
+static const struct SpriteTemplate sUnknown_0862A750 =
+{
+ .tileTag = 30506,
+ .paletteTag = 30505,
+ .oam = &sOamData_862A6C4,
+ .anims = sSpriteAnimTable_862A74C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A768[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A770[] =
+{
+ sSpriteAnim_862A768
+};
+
+static const struct SpriteTemplate sUnknown_0862A774 =
+{
+ .tileTag = 30507,
+ .paletteTag = 30505,
+ .oam = &sOamData_862A6CC,
+ .anims = sSpriteAnimTable_862A770,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A78C[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A794[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A79C[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A7A4[] =
+{
+ ANIMCMD_FRAME(24, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A7AC[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A7B4[] =
+{
+ ANIMCMD_FRAME(40, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A7BC[] =
+{
+ ANIMCMD_FRAME(48, 36),
+ ANIMCMD_FRAME(64, 36),
+ ANIMCMD_FRAME(80, 36),
+ ANIMCMD_FRAME(64, 36),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_862A7D0[] =
+{
+ ANIMCMD_FRAME(56, 36),
+ ANIMCMD_FRAME(72, 36),
+ ANIMCMD_FRAME(88, 36),
+ ANIMCMD_FRAME(72, 36),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_862A7E4[] =
+{
+ ANIMCMD_FRAME(96, 36),
+ ANIMCMD_FRAME(104, 36),
+ ANIMCMD_FRAME(112, 36),
+ ANIMCMD_FRAME(104, 36),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A7F8[] =
+{
+ sSpriteAnim_862A78C,
+ sSpriteAnim_862A794,
+ sSpriteAnim_862A79C,
+ sSpriteAnim_862A7A4,
+ sSpriteAnim_862A7AC,
+ sSpriteAnim_862A7B4,
+ sSpriteAnim_862A7BC,
+ sSpriteAnim_862A7D0,
+ sSpriteAnim_862A7E4
+};
+
+static const struct SpriteTemplate sUnknown_0862A81C =
+{
+ .tileTag = 30508,
+ .paletteTag = 30508,
+ .oam = &sOamData_862A6D4,
+ .anims = sSpriteAnimTable_862A7F8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A834[] =
+{
+ ANIMCMD_FRAME(0, 36),
+ ANIMCMD_FRAME(2, 36),
+ ANIMCMD_FRAME(4, 36),
+ ANIMCMD_FRAME(2, 36),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A848[] =
+{
+ sSpriteAnim_862A834
+};
+
+static const struct SpriteTemplate sUnknown_0862A84C =
+{
+ .tileTag = 30509,
+ .paletteTag = 30508,
+ .oam = &sOamData_862A6DC,
+ .anims = sSpriteAnimTable_862A848,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sUnknown_0862A864 =
+{
+ .tileTag = 30510,
+ .paletteTag = 30508,
+ .oam = &sOamData_862A6C4,
+ .anims = sSpriteAnimTable_862A74C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct ScanlineEffectParams sUnknown_0862A87C =
+{
+ .dmaDest = (vu16 *)REG_ADDR_BG1HOFS,
+ .dmaControl = 0xA2600001,
+ .initState = 1
+};
+
+static const struct BgTemplate sUnknown_0862A888[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+};
+
+static const union AnimCmd sSpriteAnim_862A894[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_FRAME(64, 20),
+ ANIMCMD_FRAME(128, 20),
+ ANIMCMD_FRAME(64, 20),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_862A8A8[] =
+{
+ ANIMCMD_FRAME(192, 20),
+ ANIMCMD_FRAME(256, 20),
+ ANIMCMD_FRAME(320, 20),
+ ANIMCMD_FRAME(256, 20),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A8BC[] =
+{
+ sSpriteAnim_862A894,
+ sSpriteAnim_862A8A8
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862A8C4 =
+{
+ gRaySceneGroudon_Gfx, 0x3000, 30505
+};
+
+static const struct CompressedSpritePalette sUnknown_0862A8CC =
+{
+ gRaySceneGroudon_Pal, 30505
+};
+
+static const struct SpriteTemplate sUnknown_0862A8D4 =
+{
+ .tileTag = 30505,
+ .paletteTag = 30505,
+ .oam = &sOamData_862A6BC,
+ .anims = sSpriteAnimTable_862A8BC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A8EC[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A8F4[] =
+{
+ sSpriteAnim_862A8EC
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862A8F8 =
+{
+ gRaySceneGroudon2_Gfx, 0x200, 30506
+};
+
+static const struct SpriteTemplate sUnknown_0862A900 =
+{
+ .tileTag = 30506,
+ .paletteTag = 30505,
+ .oam = &sOamData_862A6C4,
+ .anims = sSpriteAnimTable_862A8F4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A918[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A920[] =
+{
+ sSpriteAnim_862A918
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862A924 =
+{
+ gRaySceneGroudon3_Gfx, 0x400, 30507
+};
+
+static const struct SpriteTemplate sUnknown_0862A92C =
+{
+ .tileTag = 30507,
+ .paletteTag = 30505,
+ .oam = &sOamData_862A6CC,
+ .anims = sSpriteAnimTable_862A920,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A944[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A94C[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A954[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A95C[] =
+{
+ ANIMCMD_FRAME(24, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A964[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A96C[] =
+{
+ ANIMCMD_FRAME(40, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862A974[] =
+{
+ ANIMCMD_FRAME(48, 24),
+ ANIMCMD_FRAME(64, 24),
+ ANIMCMD_FRAME(80, 24),
+ ANIMCMD_FRAME(64, 24),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_862A988[] =
+{
+ ANIMCMD_FRAME(56, 24),
+ ANIMCMD_FRAME(72, 24),
+ ANIMCMD_FRAME(88, 24),
+ ANIMCMD_FRAME(72, 24),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_862A99C[] =
+{
+ ANIMCMD_FRAME(96, 24),
+ ANIMCMD_FRAME(104, 24),
+ ANIMCMD_FRAME(112, 24),
+ ANIMCMD_FRAME(104, 24),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862A9B0[] =
+{
+ sSpriteAnim_862A944,
+ sSpriteAnim_862A94C,
+ sSpriteAnim_862A954,
+ sSpriteAnim_862A95C,
+ sSpriteAnim_862A964,
+ sSpriteAnim_862A96C,
+ sSpriteAnim_862A974,
+ sSpriteAnim_862A988,
+ sSpriteAnim_862A99C
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862A9D4 =
+{
+ gRaySceneKyogre_Gfx, 0xF00, 30508
+};
+
+static const struct CompressedSpritePalette sUnknown_0862A9DC =
+{
+ gRaySceneKyogre_Pal, 30508
+};
+
+static const struct SpriteTemplate sUnknown_0862A9E4 =
+{
+ .tileTag = 30508,
+ .paletteTag = 30508,
+ .oam = &sOamData_862A6D4,
+ .anims = sSpriteAnimTable_862A9B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AnimCmd sSpriteAnim_862A9FC[] =
+{
+ ANIMCMD_FRAME(0, 24),
+ ANIMCMD_FRAME(2, 24),
+ ANIMCMD_FRAME(4, 24),
+ ANIMCMD_FRAME(2, 24),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AA10[] =
+{
+ sSpriteAnim_862A9FC
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AA14 =
+{
+ gRaySceneKyogre2_Gfx, 0xC0, 30509
+};
+
+static const struct SpriteTemplate sUnknown_0862AA1C =
+{
+ .tileTag = 30509,
+ .paletteTag = 30508,
+ .oam = &sOamData_862A6DC,
+ .anims = sSpriteAnimTable_862AA10,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AA34 =
+{
+ gRaySceneKyogre3_Gfx, 0x200, 30510
+};
+
+static const struct SpriteTemplate sUnknown_0862AA3C =
+{
+ .tileTag = 30510,
+ .paletteTag = 30508,
+ .oam = &sOamData_862A6C4,
+ .anims = sSpriteAnimTable_862A8F4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct BgTemplate sUnknown_0862AA54[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 29,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ }
+};
+
+static const union AnimCmd sSpriteAnim_862AA60[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AA68[] =
+{
+ sSpriteAnim_862AA60
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_862AA6C[] =
+{
+ AFFINEANIMCMD_FRAME(-64, -64, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 32, 0, 14),
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_862AA8C[] =
+{
+ sSpriteAffineAnim_862AA6C
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AA90 =
+{
+ gRaySceneSmoke_Gfx, 0x100, 30555
+};
+
+static const struct CompressedSpritePalette sUnknown_0862AA98 =
+{
+ gRaySceneSmoke_Pal, 30555
+};
+
+static const struct SpriteTemplate sUnknown_0862AAA0 =
+{
+ .tileTag = 30555,
+ .paletteTag = 30555,
+ .oam = &sOamData_862A6D4,
+ .anims = sSpriteAnimTable_862AA68,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_862AA8C,
+ .callback = sub_81D8260,
+};
+
+static const s8 sUnknown_0862AAB8[][2] =
+{
+ {-1, 5},
+ {-3, -4},
+ {5, -3},
+ {-7, 2},
+ {-9, -1},
+ {1, -5},
+ {3, 4},
+ {-5, 3},
+ {7, -2},
+ {9, 1}
+};
+
+static const struct BgTemplate sUnknown_0862AACC[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const union AnimCmd sSpriteAnim_862AADC[] =
+{
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(64, 32),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AAE8[] =
+{
+ sSpriteAnim_862AADC
+};
+
+static const union AnimCmd sSpriteAnim_862AAEC[] =
+{
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(8, 32),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AAF8[] =
+{
+ sSpriteAnim_862AAEC
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AAFC =
+{
+ gRaySceneRayquazaFly1_Gfx, 0x1000, 30556
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AB04 =
+{
+ gRaySceneRayquazaTail_Gfx, 0x200, 30557
+};
+
+static const struct CompressedSpritePalette sUnknown_0862AB0C =
+{
+ gRaySceneRayquaza_Pal, 30556
+};
+
+static const struct SpriteTemplate sUnknown_0862AB14 =
+{
+ .tileTag = 30556,
+ .paletteTag = 30556,
+ .oam = &sOamData_862A6BC,
+ .anims = sSpriteAnimTable_862AAE8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sUnknown_0862AB2C =
+{
+ .tileTag = 30557,
+ .paletteTag = 30556,
+ .oam = &sOamData_862A6E4,
+ .anims = sSpriteAnimTable_862AAF8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct BgTemplate sUnknown_0862AB44[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const union AnimCmd sSpriteAnim_862AB54[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862AB5C[] =
+{
+ ANIMCMD_FRAME(0, 48),
+ ANIMCMD_FRAME(64, 32),
+ ANIMCMD_FRAME(0, 48),
+ ANIMCMD_FRAME(128, 32),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AB70[] =
+{
+ sSpriteAnim_862AB54,
+ sSpriteAnim_862AB5C
+};
+
+static const union AnimCmd sSpriteAnim_862AB78[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AB80[] =
+{
+ sSpriteAnim_862AB78,
+};
+
+static const union AnimCmd sSpriteAnim_862AB84[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862AB8C[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862AB94[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AB9C[] =
+{
+ sSpriteAnim_862AB84,
+ sSpriteAnim_862AB8C,
+ sSpriteAnim_862AB94
+};
+
+static const union AnimCmd sSpriteAnim_862ABA8[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862ABB0[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862ABB8[] =
+{
+ ANIMCMD_FRAME(128, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862ABC0[] =
+{
+ ANIMCMD_FRAME(192, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862ABC8[] =
+{
+ sSpriteAnim_862ABA8,
+ sSpriteAnim_862ABB0,
+ sSpriteAnim_862ABB8,
+ sSpriteAnim_862ABC0
+};
+
+static const union AnimCmd sSpriteAnim_862ABD8[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862ABE0[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862ABE8[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862ABF0[] =
+{
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862ABF8[] =
+{
+ sSpriteAnim_862ABD8,
+ sSpriteAnim_862ABE0,
+ sSpriteAnim_862ABE8,
+ sSpriteAnim_862ABF0
+};
+
+static const union AnimCmd sSpriteAnim_862AC08[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(8, 8),
+ ANIMCMD_FRAME(12, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(20, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862AC24[] =
+{
+ sSpriteAnim_862AC08
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AC28 =
+{
+ gRaySceneGroudonLeft_Gfx, 0x1800, 30565
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AC30 =
+{
+ gRaySceneGroudonTail_Gfx, 0x80, 30566
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AC38 =
+{
+ gRaySceneKyogreRight_Gfx, 0x600, 30568
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AC40 =
+{
+ gRaySceneRayquazaHover_Gfx, 0x2000, 30569
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AC48 =
+{
+ gRaySceneRayquazaFlyIn_Gfx, 0x800, 30570
+};
+
+static const struct CompressedSpriteSheet sUnknown_0862AC50 =
+{
+ gRaySceneSplash_Gfx, 0x300, 30571
+};
+
+static const struct CompressedSpritePalette sUnknown_0862AC58 =
+{
+ gRaySceneGroudonLeft_Pal, 30565
+};
+
+static const struct CompressedSpritePalette sUnknown_0862AC60 =
+{
+ gRaySceneKyogreRight_Pal, 30568
+};
+
+static const struct CompressedSpritePalette sUnknown_0862AC68 =
+{
+ gRaySceneRayquazaHover_Pal, 30569
+};
+
+static const struct CompressedSpritePalette sUnknown_0862AC70 =
+{
+ gRaySceneSplash_Pal, 30571
+};
+
+static const struct SpriteTemplate sUnknown_0862AC78 =
+{
+ .tileTag = 30565,
+ .paletteTag = 30565,
+ .oam = &sOamData_862A6BC,
+ .anims = sSpriteAnimTable_862AB70,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sUnknown_0862AC90 =
+{
+ .tileTag = 30566,
+ .paletteTag = 30565,
+ .oam = &sOamData_862A6EC,
+ .anims = sSpriteAnimTable_862AB80,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sUnknown_0862ACA8 =
+{
+ .tileTag = 30568,
+ .paletteTag = 30568,
+ .oam = &sOamData_862A6C4,
+ .anims = sSpriteAnimTable_862AB9C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sUnknown_0862ACC0 =
+{
+ .tileTag = 30569,
+ .paletteTag = 30569,
+ .oam = &sOamData_862A6BC,
+ .anims = sSpriteAnimTable_862ABC8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_81D961C,
+};
+
+static const struct SpriteTemplate sUnknown_0862ACD8 =
+{
+ .tileTag = 30570,
+ .paletteTag = 30569,
+ .oam = &sOamData_862A6C4,
+ .anims = sSpriteAnimTable_862ABF8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sUnknown_0862ACF0 =
+{
+ .tileTag = 30571,
+ .paletteTag = 30571,
+ .oam = &sOamData_862A6F4,
+ .anims = sSpriteAnimTable_862AC24,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct BgTemplate sUnknown_0862AD08[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ }
+};
+
+// code
+void DoRayquazaScene(u8 animId, bool8 onlyOneAnim, void (*callback)(void))
+{
+ sRayScene = AllocZeroed(sizeof(*sRayScene));
+ sRayScene->animId = animId;
+ sRayScene->callback = callback;
+ sRayScene->onlyOneAnim = onlyOneAnim;
+ SetMainCallback2(CB2_InitRayquazaScene);
+}
+
+static void CB2_InitRayquazaScene(void)
+{
+ SetVBlankHBlankCallbacksToNull();
+ clear_scheduled_bg_copies_to_vram();
+ ScanlineEffect_Stop();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FillPalette(0, 0xF0, 0x20);
+ CreateTask(sTasksForAnimations[sRayScene->animId], 0);
+ SetMainCallback2(CB2_RayquazaScene);
+}
+
+static void CB2_RayquazaScene(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB_RayquazaScene(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void Task_EndAfterFadeScreen(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ SetMainCallback2(sRayScene->callback);
+ Free(sRayScene);
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_SetNextAnim(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (sRayScene->onlyOneAnim == TRUE)
+ {
+ gTasks[taskId].func = Task_EndAfterFadeScreen;
+ }
+ else
+ {
+ sRayScene->animId++;
+ sRayScene->field_2004 = 0;
+ gTasks[taskId].func = sTasksForAnimations[sRayScene->animId];
+ }
+ }
+}
+
+static void sub_81D68C8(void)
+{
+ SetGpuReg(REG_OFFSET_WININ, 0x3F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0x1888);
+ gPlttBufferUnfaded[0] = 0;
+ gPlttBufferFaded[0] = 0;
+}
+
+static void sub_81D6904(void)
+{
+ SetGpuReg(REG_OFFSET_WININ, 0x3F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x3F);
+}
+
+static void Task_HandleDuoFightPre(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D750C();
+ if (!gPaletteFade.active)
+ {
+ s16 counter = data[0];
+ if (counter == 64)
+ {
+ sub_81D7438();
+ }
+ else if (counter == 144)
+ {
+ sub_81D7480();
+ }
+ else
+ {
+ switch (counter)
+ {
+ case 328:
+ DuoFightEnd(taskId, 0);
+ return;
+ case 148:
+ sub_81D74C8();
+ break;
+ }
+ }
+
+ data[0]++;
+ }
+}
+
+static u8 sub_81D6984(void)
+{
+ u8 spriteId;
+ s16 *data;
+
+ spriteId = CreateSprite(&sUnknown_0862A72C, 88, 72, 3);
+ gSprites[spriteId].callback = sub_81D6A20;
+ data = gSprites[spriteId].data;
+ data[0] = CreateSprite(&sUnknown_0862A72C, 56, 104, 3);
+ data[1] = CreateSprite(&sUnknown_0862A750, 75, 101, 0);
+ data[2] = CreateSprite(&sUnknown_0862A774, 109, 114, 1);
+ StartSpriteAnim(&gSprites[data[0]], 1);
+ return spriteId;
+}
+
+static void sub_81D6A20(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+ data[5]++;
+ data[5] &= 0x1F;
+ if (data[5] == 0 && sprite->pos1.x != 72)
+ {
+ sprite->pos1.x--;
+ gSprites[sprite->data[0]].pos1.x--;
+ gSprites[data[1]].pos1.x--;
+ gSprites[data[2]].pos1.x--;
+ }
+
+ switch (sprite->animCmdIndex)
+ {
+ case 0:
+ gSprites[data[1]].pos2.x = 0;
+ gSprites[data[1]].pos2.y = 0;
+ gSprites[data[2]].pos2.x = 0;
+ gSprites[data[2]].pos2.y = 0;
+ break;
+ case 1:
+ case 3:
+ gSprites[data[1]].pos2.x = -1;
+ gSprites[data[1]].pos2.y = 0;
+ gSprites[data[2]].pos2.x = -1;
+ gSprites[data[2]].pos2.y = 0;
+ break;
+ case 2:
+ gSprites[data[1]].pos2.x = -1;
+ gSprites[data[1]].pos2.y = 1;
+ gSprites[data[2]].pos2.x = -2;
+ gSprites[data[2]].pos2.y = 1;
+ break;
+ }
+}
+
+static u8 sub_81D6B7C(void)
+{
+ u8 spriteId;
+ s16 *data;
+
+ spriteId = CreateSprite(&sUnknown_0862A81C, 136, 96, 1);
+ gSprites[spriteId].callback = sub_81D6D20;
+ data = gSprites[spriteId].data;
+
+ data[0] = CreateSprite(&sUnknown_0862A81C, 168, 96, 1) << 8;
+ data[0] |= CreateSprite(&sUnknown_0862A81C, 136, 112, 1);
+ data[1] = CreateSprite(&sUnknown_0862A81C, 168, 112, 1) << 8;
+ data[1] |= CreateSprite(&sUnknown_0862A81C, 136, 128, 1);
+ data[2] = CreateSprite(&sUnknown_0862A81C, 168, 128, 1) << 8;
+ data[2] |= CreateSprite(&sUnknown_0862A81C, 104, 128, 2);
+ data[3] = CreateSprite(&sUnknown_0862A81C, 136, 128, 2) << 8;
+ data[3] |= CreateSprite(&sUnknown_0862A81C, 184, 128, 0);
+ data[4] = CreateSprite(&sUnknown_0862A84C, 208, 132, 0) << 8;
+ data[4] |= CreateSprite(&sUnknown_0862A864, 200, 120, 1);
+
+ StartSpriteAnim(&gSprites[data[0] >> 8], 1);
+ StartSpriteAnim(&gSprites[data[0] & 0xFF], 2);
+ StartSpriteAnim(&gSprites[data[1] >> 8], 3);
+ StartSpriteAnim(&gSprites[data[1] & 0xFF], 4);
+ StartSpriteAnim(&gSprites[data[2] >> 8], 5);
+ StartSpriteAnim(&gSprites[data[2] & 0xFF], 6);
+ StartSpriteAnim(&gSprites[data[3] >> 8], 7);
+ StartSpriteAnim(&gSprites[data[3] & 0xFF], 8);
+
+ return spriteId;
+}
+
+static void sub_81D6D20(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+ data[5]++;
+ data[5] &= 0x1F;
+ if (data[5] == 0 && sprite->pos1.x != 152)
+ {
+ sprite->pos1.x++;
+ gSprites[sprite->data[0] >> 8].pos1.x++;
+ gSprites[sprite->data[0] & 0xFF].pos1.x++;
+ gSprites[data[1] >> 8].pos1.x++;
+ gSprites[data[1] & 0xFF].pos1.x++;
+ gSprites[data[2] >> 8].pos1.x++;
+ gSprites[data[2] & 0xFF].pos1.x++;
+ gSprites[data[3] >> 8].pos1.x++;
+ gSprites[data[3] & 0xFF].pos1.x++;
+ gSprites[data[4] >> 8].pos1.x++;
+ gSprites[data[4] & 0xFF].pos1.x++;
+ }
+
+ switch (gSprites[data[2] & 0xFF].animCmdIndex)
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ gSprites[data[0] >> 8].pos2.y = 0;
+ gSprites[data[0] & 0xFF].pos2.y = 0;
+ gSprites[data[1] >> 8].pos2.y = 0;
+ gSprites[data[1] & 0xFF].pos2.y = 0;
+ gSprites[data[2] >> 8].pos2.y = 0;
+ gSprites[data[2] & 0xFF].pos2.y = 0;
+ gSprites[data[3] >> 8].pos2.y = 0;
+ gSprites[data[3] & 0xFF].pos2.y = 0;
+ gSprites[data[4] >> 8].pos2.y = 0;
+ gSprites[data[4] & 0xFF].pos2.y = 0;
+ break;
+ case 1:
+ case 3:
+ sprite->pos2.y = 1;
+ gSprites[data[0] >> 8].pos2.y = 1;
+ gSprites[data[0] & 0xFF].pos2.y = 1;
+ gSprites[data[1] >> 8].pos2.y = 1;
+ gSprites[data[1] & 0xFF].pos2.y = 1;
+ gSprites[data[2] >> 8].pos2.y = 1;
+ gSprites[data[2] & 0xFF].pos2.y = 1;
+ gSprites[data[3] >> 8].pos2.y = 1;
+ gSprites[data[3] & 0xFF].pos2.y = 1;
+ gSprites[data[4] >> 8].pos2.y = 1;
+ gSprites[data[4] & 0xFF].pos2.y = 1;
+ break;
+ case 2:
+ sprite->pos2.y = 2;
+ gSprites[data[0] >> 8].pos2.y = 2;
+ gSprites[data[0] & 0xFF].pos2.y = 2;
+ gSprites[data[1] >> 8].pos2.y = 2;
+ gSprites[data[1] & 0xFF].pos2.y = 2;
+ gSprites[data[2] >> 8].pos2.y = 2;
+ gSprites[data[4] & 0xFF].pos2.y = 2;
+ break;
+ }
+}
+
+static void VBlankCB_DuoFight(void)
+{
+ VBlankCB_RayquazaScene();
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+static void sub_81D6FE0(void)
+{
+ ResetVramOamAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sUnknown_0862A888, ARRAY_COUNT(sUnknown_0862A888));
+ SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]);
+ SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void sub_81D706C(void)
+{
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(0, gRaySceneClouds_Gfx, 0, 0, 0);
+ while (free_temp_tile_data_buffers_if_possible());
+
+ LZDecompressWram(gRaySceneClouds2_Tilemap, sRayScene->tilemapBuffers[0]);
+ LZDecompressWram(gRaySceneClouds1_Tilemap, sRayScene->tilemapBuffers[1]);
+ LZDecompressWram(gRaySceneClouds3_Tilemap, sRayScene->tilemapBuffers[2]);
+ LoadCompressedPalette(gRaySceneClouds_Pal, 0, 0x40);
+ LoadCompressedObjectPic(&sUnknown_0862A8C4);
+ LoadCompressedObjectPic(&sUnknown_0862A8F8);
+ LoadCompressedObjectPic(&sUnknown_0862A924);
+ LoadCompressedObjectPic(&sUnknown_0862A9D4);
+ LoadCompressedObjectPic(&sUnknown_0862AA14);
+ LoadCompressedObjectPic(&sUnknown_0862AA34);
+ LoadCompressedObjectPalette(&sUnknown_0862A8CC);
+ LoadCompressedObjectPalette(&sUnknown_0862A9DC);
+}
+
+static void Task_DuoFightAnim(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ ScanlineEffect_Clear();
+ sub_81D6FE0();
+ sub_81D706C();
+ CpuFastFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers));
+ ScanlineEffect_SetParams(sUnknown_0862A87C);
+ data[0] = 0;
+ data[1] = CreateTask(sub_81D7228, 0);
+ if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE)
+ {
+ data[2] = sub_81D6984();
+ data[3] = sub_81D6B7C();
+ gTasks[taskId].func = Task_HandleDuoFightPre;
+ }
+ else
+ {
+ data[2] = sub_81D7664();
+ data[3] = sub_81D78BC();
+ gTasks[taskId].func = Task_HandleDuoFight;
+ StopMapMusic();
+ }
+
+ BlendPalettes(-1, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ SetVBlankCallback(VBlankCB_DuoFight);
+ PlaySE(SE_T_OOAME);
+}
+
+static void sub_81D7228(u8 taskId)
+{
+ s16 i;
+ u16 *data = gTasks[taskId].data;
+
+ for (i = 24; i < 92; i++)
+ {
+ if (i <= 47)
+ {
+ gScanlineEffectRegBuffers[0][i] = data[0] >> 8;
+ gScanlineEffectRegBuffers[1][i] = data[0] >> 8;
+ }
+ else if (i <= 63)
+ {
+ gScanlineEffectRegBuffers[0][i] = data[1] >> 8;
+ gScanlineEffectRegBuffers[1][i] = data[1] >> 8;
+ }
+ else if (i <= 75)
+ {
+ gScanlineEffectRegBuffers[0][i] = data[2] >> 8;
+ gScanlineEffectRegBuffers[1][i] = data[2] >> 8;
+ }
+ else if (i <= 83)
+ {
+ gScanlineEffectRegBuffers[0][i] = data[3] >> 8;
+ gScanlineEffectRegBuffers[1][i] = data[3] >> 8;
+ }
+ else if (i <= 87)
+ {
+ gScanlineEffectRegBuffers[0][i] = data[4] >> 8;
+ gScanlineEffectRegBuffers[1][i] = data[4] >> 8;
+ }
+ else
+ {
+ gScanlineEffectRegBuffers[0][i] = data[5] >> 8;
+ gScanlineEffectRegBuffers[1][i] = data[5] >> 8;
+ }
+ }
+
+ if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE)
+ {
+ data[0] += 448;
+ data[1] += 384;
+ data[2] += 320;
+ data[3] += 256;
+ data[4] += 192;
+ data[5] += 128;
+ }
+ else
+ {
+ data[0] += 768;
+ data[1] += 640;
+ data[2] += 512;
+ data[3] += 384;
+ data[4] += 256;
+ data[5] += 128;
+ }
+}
+
+static void Task_HandleDuoFight(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D750C();
+ if (!gPaletteFade.active)
+ {
+ s16 counter = data[0];
+ if (counter == 32 || counter == 112)
+ {
+ sub_81D7438();
+ }
+ else if (counter == 216)
+ {
+ sub_81D7480();
+ }
+ else if (counter == 220)
+ {
+ sub_81D74C8();
+ }
+ else
+ {
+ switch (counter)
+ {
+ case 412:
+ DuoFightEnd(taskId, 2);
+ return;
+ case 380:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
+ gTasks[data[1]].func = sub_81D752C;
+ gTasks[data[1]].data[0] = 0;
+ gTasks[data[1]].data[2] = data[2];
+ gTasks[data[1]].data[3] = data[3];
+ ScanlineEffect_Stop();
+ break;
+ }
+ }
+
+ data[0]++;
+ }
+}
+
+static void sub_81D7438(void)
+{
+ PlaySE(SE_T_KAMI);
+ sub_80A2C44(0x7FFF, 0, 0x10, 0, -1, 0, 0);
+ sub_80A2C44(0xFFFF0000, 0, 0x10, 0, 0, 0, 1);
+}
+
+static void sub_81D7480(void)
+{
+ PlaySE(SE_T_KAMI);
+ sub_80A2C44(0x7FFF, 0, 0x10, 0x10, -1, 0, 0);
+ sub_80A2C44(0xFFFF0000, 0, 0x10, 0x10, 0, 0, 1);
+}
+
+static void sub_81D74C8(void)
+{
+ sub_80A2C44(0x7FFF, 4, 0x10, 0, -1, 0, 0);
+ sub_80A2C44(0xFFFF0000, 4, 0x10, 0, 0, 0, 1);
+}
+
+static void sub_81D750C(void)
+{
+ ChangeBgX(2, 0x400, 1);
+ ChangeBgY(2, 0x800, 2);
+}
+
+static void sub_81D752C(u8 taskId)
+{
+ u16 bgY;
+ s16 *data = gTasks[taskId].data;
+ sub_81D7860(&gSprites[data[2]]);
+ sub_81D7D14(&gSprites[data[3]]);
+
+ bgY = GetBgY(1);
+ if (GetBgY(1) == 0 || bgY > 0x8000)
+ ChangeBgY(1, 0x400, 2);
+
+ if (data[0] != 16)
+ {
+ data[0]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, (data[0] << 8) | (16 - data[0]));
+ }
+}
+
+static void DuoFightEnd(u8 taskId, s8 palDelay)
+{
+ PlaySE(SE_T_OOAME_E);
+ BeginNormalPaletteFade(0xFFFFFFFF, palDelay, 0, 0x10, 0);
+ gTasks[taskId].func = Task_DuoFightEnd;
+}
+
+static void Task_DuoFightEnd(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D750C();
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(data[1]);
+ ChangeBgY(1, 0, 0);
+ SetVBlankCallback(NULL);
+ ScanlineEffect_Stop();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ data[0] = 0;
+ gTasks[taskId].func = Task_SetNextAnim;
+ }
+}
+
+static u8 sub_81D7664(void)
+{
+ u8 spriteId;
+ s16 *data;
+
+ spriteId = CreateSprite(&sUnknown_0862A8D4, 98, 72, 3);
+ gSprites[spriteId].callback = sub_81D7700;
+ data = gSprites[spriteId].data;
+ data[0] = CreateSprite(&sUnknown_0862A8D4, 66, 104, 3);
+ data[1] = CreateSprite(&sUnknown_0862A900, 85, 101, 0);
+ data[2] = CreateSprite(&sUnknown_0862A92C, 119, 114, 1);
+ StartSpriteAnim(&gSprites[data[0]], 1);
+ return spriteId;
+}
+
+static void sub_81D7700(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+ data[5]++;
+ data[5] &= 0xF;
+ if (!(data[5] & 7) && sprite->pos1.x != 72)
+ {
+ sprite->pos1.x--;
+ gSprites[sprite->data[0]].pos1.x--;
+ gSprites[data[1]].pos1.x--;
+ gSprites[data[2]].pos1.x--;
+ }
+
+ switch (sprite->animCmdIndex)
+ {
+ case 0:
+ gSprites[data[1]].pos2.x = 0;
+ gSprites[data[1]].pos2.y = 0;
+ gSprites[data[2]].pos2.x = 0;
+ gSprites[data[2]].pos2.y = 0;
+ break;
+ case 1:
+ case 3:
+ gSprites[data[1]].pos2.x = -1;
+ gSprites[data[1]].pos2.y = 0;
+ gSprites[data[2]].pos2.x = -1;
+ gSprites[data[2]].pos2.y = 0;
+ break;
+ case 2:
+ gSprites[data[1]].pos2.x = -1;
+ gSprites[data[1]].pos2.y = 1;
+ gSprites[data[2]].pos2.x = -2;
+ gSprites[data[2]].pos2.y = 1;
+ break;
+ }
+}
+
+static void sub_81D7860(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+ if (sprite->pos1.y <= 160)
+ {
+ sprite->pos1.y += 8;
+ gSprites[sprite->data[0]].pos1.y += 8;
+ gSprites[data[1]].pos1.y += 8;
+ gSprites[data[2]].pos1.y += 8;
+ }
+}
+
+static u8 sub_81D78BC(void)
+{
+ u8 spriteId;
+ s16 *data;
+
+ spriteId = CreateSprite(&sUnknown_0862A9E4, 126, 96, 1);
+ gSprites[spriteId].callback = sub_81D7A60;
+ data = gSprites[spriteId].data;
+
+ data[0] = CreateSprite(&sUnknown_0862A9E4, 158, 96, 1) << 8;
+ data[0] |= CreateSprite(&sUnknown_0862A9E4, 126, 112, 1);
+ data[1] = CreateSprite(&sUnknown_0862A9E4, 158, 112, 1) << 8;
+ data[1] |= CreateSprite(&sUnknown_0862A9E4, 126, 128, 1);
+ data[2] = CreateSprite(&sUnknown_0862A9E4, 158, 128, 1) << 8;
+ data[2] |= CreateSprite(&sUnknown_0862A9E4, 94, 128, 2);
+ data[3] = CreateSprite(&sUnknown_0862A9E4, 126, 128, 2) << 8;
+ data[3] |= CreateSprite(&sUnknown_0862A9E4, 174, 128, 0);
+ data[4] = CreateSprite(&sUnknown_0862AA1C, 198, 132, 0) << 8;
+ data[4] |= CreateSprite(&sUnknown_0862AA3C, 190, 120, 1);
+
+ StartSpriteAnim(&gSprites[data[0] >> 8], 1);
+ StartSpriteAnim(&gSprites[data[0] & 0xFF], 2);
+ StartSpriteAnim(&gSprites[data[1] >> 8], 3);
+ StartSpriteAnim(&gSprites[data[1] & 0xFF], 4);
+ StartSpriteAnim(&gSprites[data[2] >> 8], 5);
+ StartSpriteAnim(&gSprites[data[2] & 0xFF], 6);
+ StartSpriteAnim(&gSprites[data[3] >> 8], 7);
+ StartSpriteAnim(&gSprites[data[3] & 0xFF], 8);
+
+ return spriteId;
+}
+
+static void sub_81D7A60(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+ data[5]++;
+ data[5] &= 0xF;
+ if (!(data[5] & 7) && sprite->pos1.x != 152)
+ {
+ sprite->pos1.x++;
+ gSprites[sprite->data[0] >> 8].pos1.x++;
+ gSprites[sprite->data[0] & 0xFF].pos1.x++;
+ gSprites[data[1] >> 8].pos1.x++;
+ gSprites[data[1] & 0xFF].pos1.x++;
+ gSprites[data[2] >> 8].pos1.x++;
+ gSprites[data[2] & 0xFF].pos1.x++;
+ gSprites[data[3] >> 8].pos1.x++;
+ gSprites[data[3] & 0xFF].pos1.x++;
+ gSprites[data[4] >> 8].pos1.x++;
+ gSprites[data[4] & 0xFF].pos1.x++;
+ }
+
+ switch (gSprites[data[2] & 0xFF].animCmdIndex)
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ gSprites[data[0] >> 8].pos2.y = 0;
+ gSprites[data[0] & 0xFF].pos2.y = 0;
+ gSprites[data[1] >> 8].pos2.y = 0;
+ gSprites[data[1] & 0xFF].pos2.y = 0;
+ gSprites[data[2] >> 8].pos2.y = 0;
+ gSprites[data[2] & 0xFF].pos2.y = 0;
+ gSprites[data[3] >> 8].pos2.y = 0;
+ gSprites[data[3] & 0xFF].pos2.y = 0;
+ gSprites[data[4] >> 8].pos2.y = 0;
+ gSprites[data[4] & 0xFF].pos2.y = 0;
+ break;
+ case 1:
+ case 3:
+ sprite->pos2.y = 1;
+ gSprites[data[0] >> 8].pos2.y = 1;
+ gSprites[data[0] & 0xFF].pos2.y = 1;
+ gSprites[data[1] >> 8].pos2.y = 1;
+ gSprites[data[1] & 0xFF].pos2.y = 1;
+ gSprites[data[2] >> 8].pos2.y = 1;
+ gSprites[data[2] & 0xFF].pos2.y = 1;
+ gSprites[data[3] >> 8].pos2.y = 1;
+ gSprites[data[3] & 0xFF].pos2.y = 1;
+ gSprites[data[4] >> 8].pos2.y = 1;
+ gSprites[data[4] & 0xFF].pos2.y = 1;
+ break;
+ case 2:
+ sprite->pos2.y = 2;
+ gSprites[data[0] >> 8].pos2.y = 2;
+ gSprites[data[0] & 0xFF].pos2.y = 2;
+ gSprites[data[1] >> 8].pos2.y = 2;
+ gSprites[data[1] & 0xFF].pos2.y = 2;
+ gSprites[data[2] >> 8].pos2.y = 2;
+ gSprites[data[4] & 0xFF].pos2.y = 2;
+ break;
+ }
+}
+
+static void sub_81D7D14(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+ if (sprite->pos1.y <= 160)
+ {
+ sprite->pos1.y += 8;
+ gSprites[sprite->data[0] >> 8].pos1.y += 8;
+ gSprites[sprite->data[0] & 0xFF].pos1.y += 8;
+ gSprites[data[1] >> 8].pos1.y += 8;
+ gSprites[data[1] & 0xFF].pos1.y += 8;
+ gSprites[data[2] >> 8].pos1.y += 8;
+ gSprites[data[2] & 0xFF].pos1.y += 8;
+ gSprites[data[3] >> 8].pos1.y += 8;
+ gSprites[data[3] & 0xFF].pos1.y += 8;
+ gSprites[data[4] >> 8].pos1.y += 8;
+ gSprites[data[4] & 0xFF].pos1.y += 8;
+ }
+}
+
+static void sub_81D7E10(void)
+{
+ ResetVramOamAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(1, sUnknown_0862AA54, ARRAY_COUNT(sUnknown_0862AA54));
+ SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]);
+ SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void sub_81D7E9C(void)
+{
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(0, gRaySceneClouds_Gfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(1, gRaySceneOvercast_Gfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(2, gRaySceneRayquaza_Gfx, 0, 0, 0);
+ while (free_temp_tile_data_buffers_if_possible());
+
+ LZDecompressWram(gRaySceneClouds2_Tilemap, sRayScene->tilemapBuffers[0]);
+ LZDecompressWram(gRaySceneOvercast_Tilemap, sRayScene->tilemapBuffers[1]);
+ LZDecompressWram(gRaySceneRayquaza_Tilemap, sRayScene->tilemapBuffers[2]);
+ LoadCompressedPalette(gRaySceneRayquaza_Pal, 0, 0x40);
+ LoadCompressedObjectPic(&sUnknown_0862AA90);
+ LoadCompressedObjectPalette(&sUnknown_0862AA98);
+}
+
+static void Task_RayTakesFlightAnim(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ PlayNewMapMusic(MUS_REKKUU_KOURIN);
+ sub_81D7E10();
+ sub_81D7E9C();
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x808);
+ BlendPalettes(-1, 0x10, 0);
+ SetVBlankCallback(VBlankCB_RayquazaScene);
+ CreateTask(sub_81D81A4, 0);
+ data[0] = 0;
+ data[1] = 0;
+ gTasks[taskId].func = Task_HandleRayTakesFlight;
+}
+
+static void Task_HandleRayTakesFlight(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ if (data[1] == 8)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ data[2] = 0;
+ data[3] = 30;
+ data[4] = 0;
+ data[5] = 7;
+ data[1] = 0;
+ data[0]++;
+ }
+ else
+ {
+ data[1]++;
+ }
+ break;
+ case 1:
+ data[2] += data[3];
+ data[4] += data[5];
+ if (data[3] > 3)
+ data[3] -= 3;
+ if (data[5] != 0)
+ data[5]--;
+ if (data[2] > 255)
+ {
+ data[2] = 256;
+ data[3] = 0;
+ data[6] = 12;
+ data[7] = -1;
+ data[1] = 0;
+ data[0]++;
+ }
+ SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0);
+ break;
+ case 2:
+ data[1]++;
+ SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32 + (data[6] >> 2), data[2], data[2], 0);
+ data[6] += data[7];
+ if (data[6] == 12 || data[6] == -12)
+ {
+ data[7] *= -1;
+ if (data[1] > 295)
+ {
+ data[0]++;
+ BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, 0);
+ }
+ }
+ break;
+ case 3:
+ data[2] += 16;
+ SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0);
+ Task_RayTakesFlightEnd(taskId);
+ break;
+ }
+}
+
+static void Task_RayTakesFlightEnd(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gTasks[taskId].func = Task_SetNextAnim;
+ }
+}
+
+static void sub_81D81A4(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if ((data[1] & 3) == 0)
+ {
+ u8 spriteId = CreateSprite(&sUnknown_0862AAA0,
+ (sUnknown_0862AAB8[data[0]][0] * 4) + 120,
+ (sUnknown_0862AAB8[data[0]][1] * 4) + 80,
+ 0);
+ gSprites[spriteId].data[0] = (s8)(data[0]);
+ gSprites[spriteId].oam.objMode = 1;
+ gSprites[spriteId].oam.affineMode = 3;
+ gSprites[spriteId].oam.priority = 2;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ if (data[0] == 9)
+ {
+ DestroyTask(taskId);
+ return;
+ }
+ else
+ {
+ data[0]++;
+ }
+ }
+
+ data[1]++;
+}
+
+static void sub_81D8260(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.x += sUnknown_0862AAB8[sprite->data[0]][0];
+ sprite->pos2.y += sUnknown_0862AAB8[sprite->data[0]][1];
+ }
+
+ sprite->data[1]++;
+ sprite->data[1] &= 0xF;
+}
+
+static void sub_81D82B0(void)
+{
+ ResetVramOamAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sUnknown_0862AACC, ARRAY_COUNT(sUnknown_0862AACC));
+ SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]);
+ SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]);
+ SetBgTilemapBuffer(3, sRayScene->tilemapBuffers[3]);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ schedule_bg_copy_tilemap_to_vram(3);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void sub_81D8358(void)
+{
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(0, gRaySceneRayquazaLight_Gfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(1, gRaySceneOvercast2_Gfx, 0, 0, 0);
+ while (free_temp_tile_data_buffers_if_possible());
+
+ LZDecompressWram(gRaySceneRayquazaLight_Tilemap, sRayScene->tilemapBuffers[0]);
+ LZDecompressWram(gRaySceneOvercast2_Tilemap, sRayScene->tilemapBuffers[3]);
+ CpuFastFill16(0, sRayScene->tilemapBuffers[2], 0x800);
+ CpuFastCopy(sRayScene->tilemapBuffers[3], sRayScene->tilemapBuffers[1], 0x800);
+ CpuFastFill16(0, &sRayScene->tilemapBuffers[1][0x100], 0x340);
+
+ LoadCompressedPalette(gRaySceneOvercast2_Pal, 0, 0x40);
+ gPlttBufferUnfaded[0] = RGB_WHITE;
+ gPlttBufferFaded[0] = RGB_WHITE;
+ LoadCompressedObjectPic(&sUnknown_0862AAFC);
+ LoadCompressedObjectPic(&sUnknown_0862AB04);
+ LoadCompressedObjectPalette(&sUnknown_0862AB0C);
+}
+
+static void sub_81D844C(void)
+{
+ u16 VCOUNT = GetGpuReg(REG_OFFSET_VCOUNT);
+ if (VCOUNT >= 24 && VCOUNT <= 135 && VCOUNT - 24 <= sRayScene->field_2008)
+ REG_BLDALPHA = 0xD08;
+ else
+ REG_BLDALPHA = 0x1000;
+
+ if (VCOUNT == 0)
+ {
+ if (sRayScene->field_2008 <= 0x1FFF)
+ {
+ if (sRayScene->field_2008 <= 39)
+ sRayScene->field_2008 += 4;
+ else if (sRayScene->field_2008 <= 79)
+ sRayScene->field_2008 += 2;
+ else
+ sRayScene->field_2008 += 1;
+ }
+
+ sRayScene->field_200A++;
+ }
+}
+
+static void Task_RayDescendsAnim(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D82B0();
+ sub_81D8358();
+ SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000);
+ BlendPalettes(-1, 0x10, 0);
+ SetVBlankCallback(VBlankCB_RayquazaScene);
+ sRayScene->field_2008 = 0;
+ sRayScene->field_200A = 0;
+ data[0] = 0;
+ data[1] = 0;
+ data[2] = 0;
+ data[3] = 0;
+ data[4] = 0x1000;
+ gTasks[taskId].func = Task_HandleRayDescends;
+}
+
+static void Task_HandleRayDescends(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ if (data[1] == 8)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ data[1] = 0;
+ data[0]++;
+ }
+ else
+ {
+ data[1]++;
+ }
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ if (data[1] == 10)
+ {
+ data[1] = 0;
+ data[0]++;
+ SetHBlankCallback(sub_81D844C);
+ EnableInterrupts(INTR_FLAG_HBLANK | INTR_FLAG_VBLANK);
+ }
+ else
+ {
+ data[1]++;
+ }
+ }
+ break;
+ case 2:
+ if (data[1] == 80)
+ {
+ data[1] = 0;
+ data[0]++;
+ sub_81D86CC();
+ }
+ else
+ {
+ data[1]++;
+ }
+ break;
+ case 3:
+ if (++data[1] == 368)
+ {
+ data[1] = 0;
+ data[0]++;
+ }
+ break;
+ case 4:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_RayDescendsEnd;
+ break;
+ }
+}
+
+static void Task_RayDescendsEnd(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gTasks[taskId].func = Task_SetNextAnim;
+ }
+}
+
+static u8 sub_81D86CC(void)
+{
+ u8 spriteId = CreateSprite(&sUnknown_0862AB14, 160, 0, 0);
+ s16 *data = gSprites[spriteId].data;
+ data[0] = CreateSprite(&sUnknown_0862AB2C, 184, -48, 0);
+ gSprites[spriteId].callback = sub_81D874C;
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[data[0]].oam.priority = 3;
+ return spriteId;
+}
+
+static void sub_81D874C(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+ s16 counter = data[2];
+ if (counter == 0)
+ {
+ data[3] = 12;
+ data[4] = 8;
+ }
+ else if (counter == 256)
+ {
+ data[3] = 9;
+ data[4] = 7;
+ }
+ else if (counter == 268)
+ {
+ data[3] = 8;
+ data[4] = 6;
+ }
+ else if (counter == 280)
+ {
+ data[3] = 7;
+ data[4] = 5;
+ }
+ else if (counter == 292)
+ {
+ data[3] = 6;
+ data[4] = 4;
+ }
+ else if (counter == 304)
+ {
+ data[3] = 5;
+ data[4] = 3;
+ }
+ else if (counter == 320)
+ {
+ data[3] = 4;
+ data[4] = 2;
+ }
+
+ if (data[2] % data[3] == 0)
+ {
+ sprite->pos2.x--;
+ gSprites[data[0]].pos2.x--;
+ }
+ if (data[2] % data[4] == 0)
+ {
+ sprite->pos2.y++;
+ gSprites[data[0]].pos2.y++;
+ }
+
+ data[2]++;
+}
+
+static void sub_81D8828(void)
+{
+ ResetVramOamAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sUnknown_0862AB44, ARRAY_COUNT(sUnknown_0862AB44));
+ SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]);
+ SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]);
+ SetBgTilemapBuffer(3, sRayScene->tilemapBuffers[3]);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ schedule_bg_copy_tilemap_to_vram(3);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_WIN0_ON);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void sub_81D88D0(void)
+{
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(1, gRaySceneRayquazaChase_Gfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(2, gRaySceneChaseStreaks_Gfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(3, gRaySceneChaseBg_Gfx, 0, 0, 0);
+ while (free_temp_tile_data_buffers_if_possible());
+
+ LZDecompressWram(gRayChaseRayquazaChase2_Tilemap, sRayScene->tilemapBuffers[0]);
+ LZDecompressWram(gRayChaseRayquazaChase_Tilemap, sRayScene->tilemapBuffers[1]);
+ LZDecompressWram(gRaySceneChaseStreaks_Tilemap, sRayScene->tilemapBuffers[2]);
+ LZDecompressWram(gRaySceneChaseBg_Tilemap, sRayScene->tilemapBuffers[3]);
+ LoadCompressedPalette(gRaySceneChase_Pal, 0, 0x80);
+}
+
+static void Task_RayChargesAnim(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D8828();
+ sub_81D88D0();
+ sub_81D68C8();
+ BlendPalettes(-1, 0x10, 0);
+ SetVBlankCallback(VBlankCB_RayquazaScene);
+ data[0] = 0;
+ data[1] = 0;
+ data[2] = CreateTask(sub_81D8AD8, 0);
+ gTasks[taskId].func = Task_HandleRayCharges;
+}
+
+static void Task_HandleRayCharges(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D8BB4();
+ if ((data[3] & 7) == 0 && data[0] <= 1 && data[1] <= 89)
+ PlaySE(SE_OP_BASYU);
+
+ data[3]++;
+ switch (data[0])
+ {
+ case 0:
+ if (data[1] == 8)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ data[1] = 0;
+ data[0]++;
+ }
+ else
+ {
+ data[1]++;
+ }
+ break;
+ case 1:
+ if (data[1] == 127)
+ {
+ data[1] = 0;
+ data[0]++;
+ gTasks[data[2]].func = sub_81D8B2C;
+ }
+ else
+ {
+ data[1]++;
+ }
+ break;
+ case 2:
+ if (data[1] == 12)
+ {
+ data[1] = 0;
+ data[0]++;
+ }
+ else
+ {
+ data[1]++;
+ }
+ break;
+ case 3:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_RayChargesEnd;
+ break;
+ }
+}
+
+static void sub_81D8AD8(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if ((data[15] & 3) == 0)
+ {
+ ChangeBgX(1, (Random() % 8 - 4) << 8, 0);
+ ChangeBgY(1, (Random() % 8 - 4) << 8, 0);
+ }
+
+ data[15]++;
+}
+
+static void sub_81D8B2C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (data[0] == 0)
+ {
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ data[0]++;
+ data[1] = 10;
+ data[2] = -1;
+ }
+ else if (data[0] == 1)
+ {
+ ChangeBgX(1, data[1] << 8, 2);
+ ChangeBgY(1, data[1] << 8, 1);
+ data[1] += data[2];
+ if (data[1] == -10)
+ data[2] *= -1;
+ }
+}
+
+static void sub_81D8BB4(void)
+{
+ ChangeBgX(2, 0x400, 2);
+ ChangeBgY(2, 0x400, 1);
+ ChangeBgX(0, 0x800, 2);
+ ChangeBgY(0, 0x800, 1);
+}
+
+static void Task_RayChargesEnd(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D8BB4();
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_81D6904();
+ DestroyTask(data[2]);
+ gTasks[taskId].func = Task_SetNextAnim;
+ }
+}
+
+static void sub_81D8C38(void)
+{
+ ResetVramOamAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(1, sUnknown_0862AD08, ARRAY_COUNT(sUnknown_0862AD08));
+ SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]);
+ SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]);
+ ResetAllBgsCoordinates();
+ schedule_bg_copy_tilemap_to_vram(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_WIN0_ON);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void sub_81D8CC4(void)
+{
+ reset_temp_tile_data_buffers();
+ decompress_and_copy_tile_data_to_vram(2, gRaySceneHushRing_Gfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(0, gRaySceneHushBg_Gfx, 0, 0, 0);
+ while (free_temp_tile_data_buffers_if_possible());
+
+ LZDecompressWram(gRaySceneHushRing_Tilemap, sRayScene->tilemapBuffers[1]);
+ LZDecompressWram(gRaySceneHushBg_Tilemap, sRayScene->tilemapBuffers[0]);
+ LZDecompressWram(gRaySceneHushRing_Map, sRayScene->tilemapBuffers[2]);
+ LoadCompressedPalette(gRaySceneHushBg_Pal, 0, 0x60);
+ LoadCompressedObjectPic(&sUnknown_0862AC28);
+ LoadCompressedObjectPic(&sUnknown_0862AC30);
+ LoadCompressedObjectPic(&sUnknown_0862AC38);
+ LoadCompressedObjectPic(&sUnknown_0862AC40);
+ LoadCompressedObjectPic(&sUnknown_0862AC48);
+ LoadCompressedObjectPic(&sUnknown_0862AC50);
+ LoadCompressedObjectPalette(&sUnknown_0862AC58);
+ LoadCompressedObjectPalette(&sUnknown_0862AC60);
+ LoadCompressedObjectPalette(&sUnknown_0862AC68);
+ LoadCompressedObjectPalette(&sUnknown_0862AC70);
+}
+
+static void Task_RayChasesAwayAnim(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ sub_81D8C38();
+ sub_81D8CC4();
+ sub_81D68C8();
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0xE09);
+ BlendPalettes(-1, 0x10, 0);
+ SetVBlankCallback(VBlankCB_RayquazaScene);
+ data[0] = 0;
+ data[1] = 0;
+ gTasks[taskId].func = Task_HandleRayChasesAway;
+ data[2] = CreateTask(sub_81D8FB0, 0);
+ gTasks[data[2]].data[0] = 0;
+ gTasks[data[2]].data[1] = 0;
+ gTasks[data[2]].data[2] = 0;
+ gTasks[data[2]].data[3] = 1;
+ gTasks[data[2]].data[4] = 1;
+}
+
+static void Task_HandleRayChasesAway(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ if (data[1] == 8)
+ {
+ sub_81D90A8(taskId);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ data[1] = 0;
+ data[0]++;
+ }
+ else
+ {
+ data[1]++;
+ }
+ break;
+ case 1:
+ if (gSprites[data[5]].callback == sub_81D97E0)
+ {
+ if (data[1] == 64)
+ {
+ sub_81D94D4(taskId);
+ sub_81D93D8(taskId);
+ data[1] = 0;
+ data[0]++;
+ }
+ else
+ {
+ data[1]++;
+ }
+ }
+ break;
+ case 2:
+ if (data[1] == 448)
+ {
+ data[1] = 0;
+ data[0]++;
+ }
+ else
+ {
+ data[1]++;
+ if (data[1] % 144 == 0)
+ {
+ sub_80A2C44(0xFFFE, 0, 0x10, 0, -1, 0, 0);
+ sub_80A2C44(0xFFFF0000, 0, 0x10, 0, 0, 0, 1);
+ }
+ }
+ break;
+ case 3:
+ BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0);
+ gTasks[taskId].func = Task_RayChasesAwayEnd;
+ break;
+ }
+}
+
+static void sub_81D8FB0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if ((data[0] & 0xF) == 0)
+ {
+ SetGpuReg(REG_OFFSET_BLDALPHA, ((data[1] + 14) << 8 & 0x1F00) | ((data[2] + 9) & 0xF));
+ data[1] -= data[3];
+ data[2] += data[4];
+ if (data[1] == -3 || data[1] == 0)
+ data[3] *= -1;
+ if (data[2] == 3 || data[2] == 0)
+ data[4] *= -1;
+ }
+
+ data[0]++;
+}
+
+static void Task_RayChasesAwayEnd(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active)
+ {
+ StopMapMusic();
+ if (data[1] == 0)
+ {
+ SetVBlankCallback(NULL);
+ sub_81D6904();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ DestroyTask(data[2]);
+ }
+
+ if (data[1] == 32)
+ {
+ data[1] = 0;
+ gTasks[taskId].func = Task_SetNextAnim;
+ }
+ else
+ {
+ data[1]++;
+ }
+ }
+}
+
+static void sub_81D90A8(u8 taskId)
+{
+ s16 *taskData, *spriteData;
+
+ taskData = gTasks[taskId].data;
+
+ taskData[3] = CreateSprite(&sUnknown_0862AC78, 64, 120, 0);
+ spriteData = gSprites[taskData[3]].data;
+ spriteData[0] = CreateSprite(&sUnknown_0862AC90, 16, 130, 0);
+ gSprites[taskData[3]].oam.priority = 1;
+ gSprites[spriteData[0]].oam.priority = 1;
+
+ taskData[4] = CreateSprite(&sUnknown_0862ACA8, 160, 128, 1);
+ spriteData = gSprites[taskData[4]].data;
+ spriteData[0] = CreateSprite(&sUnknown_0862ACA8, 192, 128, 1);
+ spriteData[1] = CreateSprite(&sUnknown_0862ACA8, 224, 128, 1);
+ gSprites[taskData[4]].oam.priority = 1;
+ gSprites[spriteData[0]].oam.priority = 1;
+ gSprites[spriteData[1]].oam.priority = 1;
+ StartSpriteAnim(&gSprites[spriteData[0]], 1);
+ StartSpriteAnim(&gSprites[spriteData[1]], 2);
+
+ taskData[5] = CreateSprite(&sUnknown_0862ACC0, 120, -65, 0);
+ spriteData = gSprites[taskData[5]].data;
+ spriteData[0] = CreateSprite(&sUnknown_0862ACD8, 120, -113, 0);
+ gSprites[taskData[5]].oam.priority = 1;
+ gSprites[spriteData[0]].oam.priority = 1;
+}
+
+static void sub_81D9274(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+
+ gSprites[taskData[3]].callback = sub_81D9338;
+ gSprites[taskData[3]].data[4] = 0;
+ gSprites[taskData[3]].data[5] = 0;
+ gSprites[taskData[3]].data[6] = 4;
+ gSprites[taskData[3]].data[7] = 0;
+
+ gSprites[taskData[4]].callback = sub_81D9338;
+ gSprites[taskData[4]].data[4] = 0;
+ gSprites[taskData[4]].data[5] = 0;
+ gSprites[taskData[4]].data[6] = 4;
+ gSprites[taskData[4]].data[7] = 1;
+}
+
+static void sub_81D9338(struct Sprite *sprite)
+{
+ if ((sprite->data[4] & 7) == 0)
+ {
+ if (sprite->data[7] == 0)
+ {
+ sprite->pos1.x -= sprite->data[6];
+ gSprites[sprite->data[0]].pos1.x -= sprite->data[6];
+ }
+ else
+ {
+ sprite->pos1.x += sprite->data[6];
+ gSprites[sprite->data[0]].pos1.x += sprite->data[6];
+ gSprites[sprite->data[1]].pos1.x += sprite->data[6];
+ }
+
+ sprite->data[5]++;
+ sprite->data[6] -= sprite->data[5];
+ if (sprite->data[5] == 3)
+ {
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ sprite->callback = SpriteCallbackDummy;
+ return;
+ }
+ }
+
+ sprite->data[4]++;
+}
+
+static void sub_81D93D8(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+ gSprites[taskData[3]].callback = sub_81D9420;
+ StartSpriteAnim(&gSprites[taskData[3]], 1);
+}
+
+static void sub_81D9420(struct Sprite *sprite)
+{
+ switch (sprite->animCmdIndex)
+ {
+ case 0:
+ case 2:
+ if (sprite->animDelayCounter % 12 == 0)
+ {
+ sprite->pos1.x -= 2;
+ gSprites[sprite->data[0]].pos1.x -=2;
+ }
+ gSprites[sprite->data[0]].pos2.y = 0;
+ break;
+ case 1:
+ case 3:
+ gSprites[sprite->data[0]].pos2.y = -2;
+ if ((sprite->animDelayCounter & 15) == 0)
+ {
+ sprite->pos1.y++;
+ gSprites[sprite->data[0]].pos1.y++;
+ }
+ break;
+ }
+}
+
+static void sub_81D94D4(u8 taskId)
+{
+ s16 *taskData, *spriteData;
+
+ taskData = gTasks[taskId].data;
+ spriteData = gSprites[taskData[4]].data;
+
+ gSprites[taskData[4]].callback = sub_81D9528;
+ gSprites[spriteData[0]].callback = sub_81D9528;
+ gSprites[spriteData[1]].callback = sub_81D9528;
+}
+
+static void sub_81D9528(struct Sprite *sprite)
+{
+ if ((sprite->data[4] & 3) == 0)
+ {
+ if (sprite->pos2.x == 1)
+ sprite->pos2.x = -1;
+ else
+ sprite->pos2.x = 1;
+ }
+ if (sprite->data[5] == 128)
+ {
+ sprite->data[7] = CreateSprite(&sUnknown_0862ACF0, 152, 132, 0);
+ gSprites[sprite->data[7]].oam.priority = 1;
+ sprite->data[7] = CreateSprite(&sUnknown_0862ACF0, 224, 132, 0);
+ gSprites[sprite->data[7]].oam.priority = 1;
+ gSprites[sprite->data[7]].hFlip = 1;
+ sprite->data[5]++;
+ }
+ if (sprite->data[5] > 127)
+ {
+ if (sprite->pos2.y != 32)
+ {
+ sprite->data[6]++;
+ sprite->pos2.y = sprite->data[6] >> 4;
+ }
+ }
+ else
+ {
+ sprite->data[5]++;
+ }
+
+ if (sprite->data[4] % 64 == 0)
+ PlaySE(SE_W250);
+
+ sprite->data[4]++;
+}
+
+static void sub_81D961C(struct Sprite *sprite)
+{
+ s16 counter = sprite->data[7];
+ if (counter <= 64)
+ {
+ sprite->pos2.y += 2;
+ gSprites[sprite->data[0]].pos2.y += 2;
+ if (sprite->data[7] == 64)
+ {
+ sub_81D9868(sprite, 1, 0, -48);
+ sprite->data[4] = 5;
+ sprite->data[5] = -1;
+ gSprites[sprite->data[0]].data[4] = 3;
+ gSprites[sprite->data[0]].data[5] = 5;
+ }
+ }
+ else if (counter <= 111)
+ {
+ sub_81D97E0(sprite);
+ if (sprite->data[4] == 0)
+ PlaySE(SE_BT_START);
+ if (sprite->data[4] == -3)
+ sub_81D9868(sprite, 2, 48, 16);
+ }
+ else if (counter == 112)
+ {
+ gSprites[sprite->data[0]].data[4] = 7;
+ gSprites[sprite->data[0]].data[5] = 3;
+ sub_81D97E0(sprite);
+ }
+ else if (counter <= 327)
+ {
+ sub_81D97E0(sprite);
+ }
+ else if (counter == 328)
+ {
+ sub_81D97E0(sprite);
+ sub_81D9868(sprite, 3, 48, 16);
+ sprite->pos2.x = 1;
+ gSprites[sprite->data[0]].pos2.x = 1;
+ PlayCry1(SPECIES_RAYQUAZA, 0);
+ CreateTask(sub_81D98B4, 0);
+ }
+ else
+ {
+ switch (counter)
+ {
+ case 376:
+ sprite->pos2.x = 0;
+ gSprites[sprite->data[0]].pos2.x = 0;
+ sub_81D97E0(sprite);
+ sub_81D9868(sprite, 2, 48, 16);
+ sprite->callback = sub_81D97E0;
+ return;
+ case 352:
+ sub_81D9274(FindTaskIdByFunc(Task_HandleRayChasesAway));
+ break;
+ }
+ }
+
+ if (sprite->data[7] > 328 && (sprite->data[7] & 1) == 0)
+ {
+ sprite->pos2.x *= -1;
+ gSprites[sprite->data[0]].pos2.x = sprite->pos2.x;
+ }
+
+ sprite->data[7]++;
+}
+
+static void sub_81D97E0(struct Sprite *sprite)
+{
+ struct Sprite *sprite2 = &gSprites[sprite->data[0]];
+ if (!(sprite->data[6] & sprite2->data[4]))
+ {
+ sprite->pos2.y += sprite->data[4];
+ gSprites[sprite->data[0]].pos2.y += sprite->data[4];
+ sprite->data[4] += sprite->data[5];
+ if (sprite->data[4] >= sprite2->data[5] || sprite->data[4] <= -sprite2->data[5])
+ {
+ if (sprite->data[4] > sprite2->data[5])
+ sprite->data[4] = sprite2->data[5];
+ else if (sprite->data[4] < -sprite2->data[5])
+ sprite->data[4] = -sprite2->data[5];
+
+ sprite->data[5] *= -1;
+ }
+ }
+
+ sprite->data[6]++;
+}
+
+static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y)
+{
+ struct Sprite *sprite2 = &gSprites[sprite->data[0]];
+
+ sprite2->pos1.x = sprite->pos1.x + x;
+ sprite2->pos1.y = sprite->pos1.y + y;
+
+ sprite2->pos2.x = sprite->pos2.x;
+ sprite2->pos2.y = sprite->pos2.y;
+
+ StartSpriteAnim(sprite, animNum);
+ StartSpriteAnim(sprite2, animNum);
+}
+
+static void sub_81D98B4(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ SetBgAffine(2, 0x4000, 0x4000, 0x78, 0x40, 0x100, 0x100, 0);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
+ data[4] = 16;
+ data[0]++;
+ break;
+ case 1:
+ if (data[5] == 8)
+ PlaySE(SE_JIDO_DOA);
+ if (data[2] == 2)
+ {
+ data[0]++;
+ }
+ else
+ {
+ data[1] += data[4];
+ data[5]++;
+ if (data[3] % 3 == 0 && data[4] != 4)
+ data[4] -= 2;
+
+ data[3]++;
+ SetBgAffine(2, 0x4000, 0x4000, 0x78, 0x40, 0x100 - data[1], 0x100 - data[1], 0);
+ if (data[1] > 255)
+ {
+ data[1] = 0;
+ data[3] = 0;
+ data[5] = 0;
+ data[4] = 16;
+ data[2]++;
+ }
+ }
+ break;
+ case 2:
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
+ DestroyTask(taskId);
+ break;
+ }
+}
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 151835e5e..8b21e214f 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -1,28 +1,2282 @@
-
-// Includes
#include "global.h"
+#include "malloc.h"
+#include "random.h"
+#include "constants/items.h"
+#include "text.h"
+#include "item.h"
+#include "task.h"
+#include "constants/species.h"
+#include "save.h"
+#include "load_save.h"
+#include "pokemon.h"
+#include "cable_club.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "tv.h"
+#include "battle_tower.h"
+#include "window.h"
+#include "mystery_event_script.h"
+#include "secret_base.h"
+#include "mauville_old_man.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "menu.h"
+#include "overworld.h"
+#include "field_screen.h"
+#include "fldeff_80F9BCC.h"
+#include "script.h"
+#include "event_data.h"
+#include "lilycove_lady.h"
+#include "strings.h"
+#include "string_util.h"
+#include "record_mixing.h"
+#include "new_game.h"
+#include "daycare.h"
+#include "international_string_util.h"
+
+extern void ReceiveSecretBasesData(struct SecretBaseRecord *, size_t, u8);
+extern void ReceiveEasyChatPairsData(struct EasyChatPair *, size_t, u8);
// Static type declarations
+struct UnknownRecMixingStruct
+{
+ u32 field_0;
+ u16 field_4;
+ u8 field_6[9];
+};
+
+struct UnknownRecMixingStruct2
+{
+ u32 field_0;
+ u16 field_4;
+ u16 field_6;
+ u16 field_8;
+ u8 field_A[16];
+};
+
+struct UnknownRecMixingStruct3
+{
+ u8 field_0[0x810];
+};
+
+struct PlayerRecordsRS
+{
+ struct SecretBaseRecord secretBases[SECRET_BASES_COUNT];
+ TVShow tvShows[TV_SHOWS_COUNT];
+ PokeNews pokeNews[POKE_NEWS_COUNT];
+ OldMan oldMan;
+ struct EasyChatPair easyChatPairs[5];
+ struct RecordMixingDayCareMail dayCareMail;
+ struct RSBattleTowerRecord battleTowerRecord;
+ u16 filler11C8[0x32];
+};
+
+struct PlayerRecordsEmerald
+{
+ /* 0x0000 */ struct SecretBaseRecord secretBases[SECRET_BASES_COUNT];
+ /* 0x0c80 */ TVShow tvShows[TV_SHOWS_COUNT];
+ /* 0x1004 */ PokeNews pokeNews[POKE_NEWS_COUNT];
+ /* 0x1044 */ OldMan oldMan;
+ /* 0x1084 */ struct EasyChatPair easyChatPairs[5];
+ /* 0x10ac */ struct RecordMixingDayCareMail dayCareMail;
+ /* 0x1124 */ struct EmeraldBattleTowerRecord battleTowerRecord;
+ /* 0x1210 */ u16 unk_1210;
+ /* 0x1214 */ LilycoveLady lilycoveLady;
+ /* 0x1254 */ struct UnkRecordMixingStruct unk_1254[2];
+ /* 0x12dc */ struct UnkRecordMixingStruct2 unk_12dc;
+ /* 0x1434 */ u8 field_1434[0x10];
+}; // 0x1444
+
+union PlayerRecords
+{
+ struct PlayerRecordsRS ruby;
+ struct PlayerRecordsEmerald emerald;
+};
+
// Static RAM declarations
-IWRAM_DATA bool8 gUnknown_03001130;
-IWRAM_DATA struct SecretBaseRecord *gUnknown_03001134;
-IWRAM_DATA TVShow *gUnknown_03001138;
-IWRAM_DATA struct UnknownSaveStruct2ABC *gUnknown_0300113C;
-IWRAM_DATA OldMan *gUnknown_03001140;
-IWRAM_DATA struct EasyChatPair *gUnknown_03001144;
-IWRAM_DATA struct DaycareData *gUnknown_03001148;
-IWRAM_DATA void *gUnknown_0300114C; // gSaveBlock2Ptr->field_64C
-IWRAM_DATA LilycoveLady *gUnknown_03001150;
-IWRAM_DATA void *gUnknown_03001154; // gSaveBlock2Ptr->field_0DC;
-IWRAM_DATA void *gUnknown_03001158; // gSaveBlock2Ptr->field_64C
-IWRAM_DATA u32 gUnknown_0300115C;
-IWRAM_DATA u8 gUnknown_03001160[8];
-IWRAM_DATA u32 gUnknown_03001168[3];
+static IWRAM_DATA bool8 gUnknown_03001130;
+static IWRAM_DATA struct SecretBaseRecord *sSecretBasesSave;
+static IWRAM_DATA TVShow *sTvShowsSave;
+static IWRAM_DATA PokeNews *sPokeNewsSave;
+static IWRAM_DATA OldMan *sOldManSave;
+static IWRAM_DATA struct EasyChatPair *sEasyChatPairsSave;
+static IWRAM_DATA struct RecordMixingDayCareMail *gUnknown_03001148;
+static IWRAM_DATA void *sBattleTowerSave;
+static IWRAM_DATA LilycoveLady *sLilycoveLadySave;
+static IWRAM_DATA void *gUnknown_03001154; // gSaveBlock2Ptr->field_0DC;
+static IWRAM_DATA void *sBattleTowerSave_Duplicate;
+static IWRAM_DATA u32 sRecordStructSize;
+static IWRAM_DATA u8 gUnknown_03001160;
+static IWRAM_DATA u32 filler_03001164;
+static IWRAM_DATA u32 gUnknown_03001168[3];
+
+static EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02039F9C = {0};
+static EWRAM_DATA union PlayerRecords *sReceivedRecords = NULL;
+static EWRAM_DATA union PlayerRecords *sSentRecord = NULL;
// Static ROM declarations
+static void Task_RecordMixing_Main(u8 taskId);
+static void sub_80E7324(u8 taskId);
+static void Task_SendPacket(u8 taskId);
+static void Task_CopyReceiveBuffer(u8 taskId);
+static void Task_SendPacket_SwitchToReceive(u8 taskId);
+static void *LoadPtrFromTaskData(const u16 *asShort);
+static void StorePtrInTaskData(void *records, u16 *a1);
+static u8 GetMultiplayerId_(void);
+static void *GetPlayerRecvBuffer(u8);
+static void ReceiveOldManData(OldMan *, size_t, u8);
+static void ReceiveBattleTowerData(void *battleTowerRecord, size_t, u8);
+static void ReceiveLilycoveLadyData(LilycoveLady *, size_t, u8);
+static void sub_80E7B2C(const u8 *);
+static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *, size_t, u8, TVShow *);
+static void sub_80E7F68(u16 *item, u8 which);
+static void sub_80E7FF8(u8 taskId);
+static void sub_80E8110(struct UnkRecordMixingStruct *arg0, struct UnkRecordMixingStruct *arg1);
+static void sub_80E8468(struct UnkRecordMixingStruct *arg0, size_t arg1, u32 arg2);
+static void sub_80E89AC(struct UnkRecordMixingStruct2 *arg0, size_t arg1, u32 arg2);
+static void sub_80E89F8(struct RecordMixingDayCareMail *dst);
+static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src);
+static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *arg0);
+static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src);
+
// .rodata
+static const u8 gUnknown_0858CF8C[] = {1, 0};
+
+static const u8 gUnknown_0858CF8E[][3] =
+{
+ {1, 2, 0},
+ {2, 0, 1},
+};
+
+static const u8 gUnknown_0858CF94[][4] =
+{
+ {1, 0, 3, 2},
+ {3, 0, 1, 2},
+ {2, 0, 3, 1},
+ {1, 3, 0, 2},
+ {2, 3, 0, 1},
+ {3, 2, 0, 1},
+ {1, 2, 3, 0},
+ {2, 3, 1, 0},
+ {3, 2, 1, 0},
+};
+
+static const u8 gUnknown_0858CFB8[3][2] =
+{
+ {0, 1},
+ {1, 2},
+ {2, 0},
+};
+
+static const u8 gUnknown_0858CFBE[3][4] =
+{
+ {0, 1, 2, 3},
+ {0, 2, 1, 3},
+ {0, 3, 2, 1},
+};
+
// .text
+
+#define BUFFER_CHUNK_SIZE 200
+
+void sub_80E6BE8(void)
+{
+ sub_80B37D4(Task_RecordMixing_Main);
+}
+
+// these variables were const in R/S, but had to become changeable because of saveblocks changing RAM position
+static void SetSrcLookupPointers(void)
+{
+ sSecretBasesSave = gSaveBlock1Ptr->secretBases;
+ sTvShowsSave = gSaveBlock1Ptr->tvShows;
+ sPokeNewsSave = gSaveBlock1Ptr->pokeNews;
+ sOldManSave = &gSaveBlock1Ptr->oldMan;
+ sEasyChatPairsSave = gSaveBlock1Ptr->easyChatPairs;
+ gUnknown_03001148 = &gUnknown_02039F9C;
+ sBattleTowerSave = &gSaveBlock2Ptr->frontier.battleTower;
+ sLilycoveLadySave = &gSaveBlock1Ptr->lilycoveLady;
+ gUnknown_03001154 = gSaveBlock2Ptr->field_DC;
+ sBattleTowerSave_Duplicate = &gSaveBlock2Ptr->frontier.battleTower;
+}
+
+static void PrepareUnknownExchangePacket(struct PlayerRecordsRS *dest)
+{
+ memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases));
+ memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows));
+ sub_80F14F8(dest->tvShows);
+ memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews));
+ memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan));
+ memcpy(dest->easyChatPairs, sEasyChatPairsSave, sizeof(dest->easyChatPairs));
+ sub_80E89F8(&dest->dayCareMail);
+ sub_81659DC(sBattleTowerSave, &dest->battleTowerRecord);
+
+ if (GetMultiplayerId() == 0)
+ dest->battleTowerRecord.unk_11c8 = GetRecordMixingGift();
+}
+
+static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest)
+{
+ memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases));
+ sub_80EB18C(dest->secretBases);
+ memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows));
+ sub_80F1208(dest->tvShows);
+ memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews));
+ memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan));
+ sub_8120B70(&dest->oldMan);
+ memcpy(dest->easyChatPairs, sEasyChatPairsSave, sizeof(dest->easyChatPairs));
+ sub_80E89F8(&dest->dayCareMail);
+ SanitizeDayCareMailForRuby(&dest->dayCareMail);
+ sub_81659DC(sBattleTowerSave, &dest->battleTowerRecord);
+ SanitizeRubyBattleTowerRecord(&dest->battleTowerRecord);
+
+ if (GetMultiplayerId() == 0)
+ dest->battleTowerRecord.unk_11c8 = GetRecordMixingGift();
+}
+
+static void PrepareExchangePacket(void)
+{
+ sub_80E9914();
+ sub_80F0BB8();
+ SetSrcLookupPointers();
+
+ if (Link_AnyPartnersPlayingRubyOrSapphire())
+ {
+ if (sub_800A03C() == 0)
+ PrepareUnknownExchangePacket(&sSentRecord->ruby);
+ else
+ PrepareExchangePacketForRubySapphire(&sSentRecord->ruby);
+ }
+ else
+ {
+ memcpy(sSentRecord->emerald.secretBases, sSecretBasesSave, sizeof(sSentRecord->emerald.secretBases));
+ memcpy(sSentRecord->emerald.tvShows, sTvShowsSave, sizeof(sSentRecord->emerald.tvShows));
+ memcpy(sSentRecord->emerald.pokeNews, sPokeNewsSave, sizeof(sSentRecord->emerald.pokeNews));
+ memcpy(&sSentRecord->emerald.oldMan, sOldManSave, sizeof(sSentRecord->emerald.oldMan));
+ memcpy(&sSentRecord->emerald.lilycoveLady, sLilycoveLadySave, sizeof(sSentRecord->emerald.lilycoveLady));
+ memcpy(sSentRecord->emerald.easyChatPairs, sEasyChatPairsSave, sizeof(sSentRecord->emerald.easyChatPairs));
+ sub_80E89F8(&sSentRecord->emerald.dayCareMail);
+ memcpy(&sSentRecord->emerald.battleTowerRecord, sBattleTowerSave, sizeof(sSentRecord->emerald.battleTowerRecord));
+ SanitizeEmeraldBattleTowerRecord(&sSentRecord->emerald.battleTowerRecord);
+
+ if (GetMultiplayerId() == 0)
+ sSentRecord->emerald.unk_1210 = GetRecordMixingGift();
+
+ sub_80E8110(sSentRecord->emerald.unk_1254, gUnknown_03001154);
+ sub_80E8260(&sSentRecord->emerald.unk_12dc);
+ }
+}
+
+static void ReceiveExchangePacket(u32 which)
+{
+ if (Link_AnyPartnersPlayingRubyOrSapphire())
+ {
+ // Ruby/Sapphire
+ sub_80E7B2C((void *)sReceivedRecords->ruby.tvShows);
+ ReceiveSecretBasesData(sReceivedRecords->ruby.secretBases, sizeof(struct PlayerRecordsRS), which);
+ ReceiveDaycareMailData(&sReceivedRecords->ruby.dayCareMail, sizeof(struct PlayerRecordsRS), which, sReceivedRecords->ruby.tvShows);
+ ReceiveBattleTowerData(&sReceivedRecords->ruby.battleTowerRecord, sizeof(struct PlayerRecordsRS), which);
+ ReceiveTvShowsData(sReceivedRecords->ruby.tvShows, sizeof(struct PlayerRecordsRS), which);
+ ReceivePokeNewsData(sReceivedRecords->ruby.pokeNews, sizeof(struct PlayerRecordsRS), which);
+ ReceiveOldManData(&sReceivedRecords->ruby.oldMan, sizeof(struct PlayerRecordsRS), which);
+ ReceiveEasyChatPairsData(sReceivedRecords->ruby.easyChatPairs, sizeof(struct PlayerRecordsRS), which);
+ sub_80E7F68(&sReceivedRecords->ruby.battleTowerRecord.unk_11c8, which);
+ }
+ else
+ {
+ // Emerald
+ sub_80E7B2C((void *)sReceivedRecords->emerald.tvShows);
+ ReceiveSecretBasesData(sReceivedRecords->emerald.secretBases, sizeof(struct PlayerRecordsEmerald), which);
+ ReceiveTvShowsData(sReceivedRecords->emerald.tvShows, sizeof(struct PlayerRecordsEmerald), which);
+ ReceivePokeNewsData(sReceivedRecords->emerald.pokeNews, sizeof(struct PlayerRecordsEmerald), which);
+ ReceiveOldManData(&sReceivedRecords->emerald.oldMan, sizeof(struct PlayerRecordsEmerald), which);
+ ReceiveEasyChatPairsData(sReceivedRecords->emerald.easyChatPairs, sizeof(struct PlayerRecordsEmerald), which);
+ ReceiveDaycareMailData(&sReceivedRecords->emerald.dayCareMail, sizeof(struct PlayerRecordsEmerald), which, sReceivedRecords->emerald.tvShows);
+ ReceiveBattleTowerData(&sReceivedRecords->emerald.battleTowerRecord, sizeof(struct PlayerRecordsEmerald), which);
+ sub_80E7F68(&sReceivedRecords->emerald.unk_1210, which);
+ ReceiveLilycoveLadyData(&sReceivedRecords->emerald.lilycoveLady, sizeof(struct PlayerRecordsEmerald), which);
+ sub_80E8468(sReceivedRecords->emerald.unk_1254, sizeof(struct PlayerRecordsEmerald), (u8) which);
+ sub_80E89AC(&sReceivedRecords->emerald.unk_12dc, sizeof(struct PlayerRecordsEmerald), (u8) which);
+ }
+}
+
+static void PrintTextOnRecordMixing(const u8 *src)
+{
+ NewMenuHelpers_DrawDialogueFrame(0, 0);
+ PrintTextOnWindow(0, 1, src, 0, 1, 0, NULL);
+ CopyWindowToVram(0, 3);
+}
+
+#define tCounter data[0]
+
+static void Task_RecordMixing_SoundEffect(u8 taskId)
+{
+ if (++gTasks[taskId].tCounter == 50)
+ {
+ PlaySE(SE_W213);
+ gTasks[taskId].tCounter = 0;
+ }
+}
+
+#undef tCounter
+
+#define tState data[0]
+#define tSndEffTaskId data[15]
+
+static void Task_RecordMixing_Main(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (tState)
+ {
+ case 0: // init
+ sSentRecord = malloc(sizeof(union PlayerRecords));
+ sReceivedRecords = malloc(sizeof(union PlayerRecords) * 4);
+ sub_8009628(gSpecialVar_0x8005);
+ VarSet(VAR_TEMP_0, 1);
+ gUnknown_03001130 = FALSE;
+ PrepareExchangePacket();
+ CreateRecordMixingSprite();
+ tState = 1;
+ data[10] = CreateTask(sub_80E7324, 80);
+ tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 81);
+ break;
+ case 1: // wait for sub_80E7324
+ if (!gTasks[data[10]].isActive)
+ {
+ tState = 2;
+ FlagSet(FLAG_SYS_MIX_RECORD);
+ DestroyRecordMixingSprite();
+ DestroyTask(tSndEffTaskId);
+ }
+ break;
+ case 2:
+ data[10] = CreateTask(sub_80E7FF8, 10);
+ tState = 3;
+ PlaySE(SE_W226);
+ break;
+ case 3: // wait for sub_80E7FF8
+ if (!gTasks[data[10]].isActive)
+ {
+ tState = 4;
+ if (gWirelessCommType == 0)
+ data[10] = sub_80B3050();
+
+ PrintTextOnRecordMixing(gText_RecordMixingComplete);
+ data[8] = 0;
+ }
+ break;
+ case 4: // wait 60 frames
+ if (++data[8] > 60)
+ tState = 5;
+ break;
+ case 5:
+ if (!gTasks[data[10]].isActive)
+ {
+ free(sReceivedRecords);
+ free(sSentRecord);
+ sub_808729C();
+ if (gWirelessCommType != 0)
+ {
+ CreateTask(sub_80AF2B4, 10);
+ }
+ sub_8197434(0, 1);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+ break;
+ }
+}
+
+#undef tState
+#undef tSndEffTaskId
+
+static void sub_80E7324(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ PrintTextOnRecordMixing(gText_MixingRecords);
+ task->data[8] = 0x708;
+ task->data[0] = 400;
+ ClearLinkCallback_2();
+ break;
+ case 100: // wait 20 frames
+ if (++task->data[12] > 20)
+ {
+ task->data[12] = 0;
+ task->data[0] = 101;
+ }
+ break;
+ case 101:
+ {
+ u8 players = GetLinkPlayerCount_2();
+ if (IsLinkMaster() == TRUE)
+ {
+ if (players == sub_800AA48())
+ {
+ PlaySE(SE_PIN);
+ task->data[0] = 201;
+ task->data[12] = 0;
+ }
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ task->data[0] = 301;
+ }
+ }
+ break;
+ case 201:
+ if (sub_800AA48() == GetLinkPlayerCount_2() && ++task->data[12] > (GetLinkPlayerCount_2() * 30))
+ {
+ sub_800A620();
+ task->data[0] = 1;
+ }
+ break;
+ case 301:
+ if (sub_800AA48() == GetLinkPlayerCount_2())
+ task->data[0] = 1;
+ break;
+ case 400: // wait 20 frames
+ if (++task->data[12] > 20)
+ {
+ task->data[0] = 1;
+ task->data[12] = 0;
+ }
+ break;
+ case 1: // wait for handshake
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), STR_CONV_MODE_LEADING_ZEROS, 2);
+ task->data[0] = 5;
+ }
+ break;
+ case 2:
+ {
+ u8 subTaskId;
+
+ task->data[6] = GetLinkPlayerCount_2();
+ task->data[0] = 0;
+ task->data[5] = GetMultiplayerId_();
+ task->func = Task_SendPacket;
+ if (Link_AnyPartnersPlayingRubyOrSapphire())
+ {
+ StorePtrInTaskData(sSentRecord, (u16 *)&task->data[2]);
+ subTaskId = CreateTask(Task_CopyReceiveBuffer, 80);
+ task->data[10] = subTaskId;
+ gTasks[subTaskId].data[0] = taskId;
+ StorePtrInTaskData(sReceivedRecords, (u16 *)&gTasks[subTaskId].data[5]);
+ sRecordStructSize = sizeof(struct PlayerRecordsRS);
+ }
+ else
+ {
+ StorePtrInTaskData(sSentRecord, (u16 *)&task->data[2]);
+ subTaskId = CreateTask(Task_CopyReceiveBuffer, 80);
+ task->data[10] = subTaskId;
+ gTasks[subTaskId].data[0] = taskId;
+ StorePtrInTaskData(sReceivedRecords, (u16 *)&gTasks[subTaskId].data[5]);
+ sRecordStructSize = sizeof(struct PlayerRecordsEmerald);
+ }
+ }
+ break;
+ case 5: // wait 60 frames
+ if (++task->data[10] > 60)
+ {
+ task->data[10] = 0;
+ task->data[0] = 2;
+ }
+ break;
+ }
+}
+
+static void Task_SendPacket(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ // does this send the data 24 times?
+
+ switch (task->data[0])
+ {
+ case 0: // Copy record data to send buffer
+ {
+ void *recordData = LoadPtrFromTaskData(&task->data[2]) + task->data[4] * BUFFER_CHUNK_SIZE;
+
+ memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE);
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (GetMultiplayerId() == 0)
+ sub_800A4D8(1);
+ task->data[0]++;
+ break;
+ case 2:
+ break;
+ case 3:
+ task->data[4]++;
+ if (task->data[4] == sRecordStructSize / 200 + 1)
+ task->data[0]++;
+ else
+ task->data[0] = 0;
+ break;
+ case 4:
+ if (!gTasks[task->data[10]].isActive)
+ task->func = Task_SendPacket_SwitchToReceive;
+ break;
+ }
+}
+
+static void Task_CopyReceiveBuffer(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ u8 status = GetBlockReceivedStatus();
+ u8 handledPlayers = 0;
+
+ if (status == sub_800A9D8())
+ {
+ u8 i;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ void *dest;
+ void *src;
+
+ if ((status >> i) & 1)
+ {
+ dest = LoadPtrFromTaskData((u16 *)&task->data[5]) + task->data[i + 1] * BUFFER_CHUNK_SIZE + sRecordStructSize * i;
+ src = GetPlayerRecvBuffer(i);
+ if ((task->data[i + 1] + 1) * BUFFER_CHUNK_SIZE > sRecordStructSize)
+ memcpy(dest, src, sRecordStructSize - task->data[i + 1] * BUFFER_CHUNK_SIZE);
+ else
+ memcpy(dest, src, BUFFER_CHUNK_SIZE);
+ ResetBlockReceivedFlag(i);
+ task->data[i + 1]++;
+ if (task->data[i + 1] == sRecordStructSize / BUFFER_CHUNK_SIZE + 1)
+ handledPlayers++;
+ }
+ }
+ gTasks[task->data[0]].data[0]++;
+ }
+
+ if (handledPlayers == GetLinkPlayerCount())
+ DestroyTask(taskId);
+}
+
+static void sub_80E776C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (!gTasks[task->data[10]].isActive)
+ DestroyTask(taskId);
+}
+
+static void Task_ReceivePacket(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->func = sub_80E776C;
+ if (gUnknown_03001130 == TRUE)
+ ReceiveExchangePacket(task->data[5]);
+}
+
+static void Task_SendPacket_SwitchToReceive(u8 taskId)
+{
+ gTasks[taskId].func = Task_ReceivePacket;
+ gUnknown_03001130 = TRUE;
+}
+
+static void *LoadPtrFromTaskData(const u16 *asShort)
+{
+ return (void *)(asShort[0] | (asShort[1] << 16));
+}
+
+static void StorePtrInTaskData(void *records, u16 *asShort)
+{
+ asShort[0] = (u32)records;
+ asShort[1] = ((u32)records >> 16);
+}
+
+static u8 GetMultiplayerId_(void)
+{
+ return GetMultiplayerId();
+}
+
+static void *GetPlayerRecvBuffer(u8 id)
+{
+ return gBlockRecvBuffer[id];
+}
+
+static void ShufflePlayerIndices(u32 *data)
+{
+ u32 i;
+ u32 linkTrainerId;
+ u32 players = GetLinkPlayerCount();
+
+ switch (players)
+ {
+ case 2:
+ for (i = 0; i < 2; i++)
+ data[i] = gUnknown_0858CF8C[i];
+ break;
+ case 3:
+ linkTrainerId = GetLinkPlayerTrainerId(0) % 2;
+ for (i = 0; i < 3; i++)
+ data[i] = gUnknown_0858CF8E[linkTrainerId][i];
+ break;
+ case 4:
+ linkTrainerId = GetLinkPlayerTrainerId(0) % 9;
+ for (i = 0; i < 4; i++)
+ data[i] = gUnknown_0858CF94[linkTrainerId][i];
+ break;
+ }
+}
+
+static void ReceiveOldManData(OldMan *oldMan, size_t recordSize, u8 which)
+{
+ u8 version;
+ u16 language;
+ OldMan *dest;
+ u32 mixIndices[4];
+
+ ShufflePlayerIndices(mixIndices);
+ dest = (void *)oldMan + recordSize * mixIndices[which];
+ version = gLinkPlayers[mixIndices[which]].version;
+ language = gLinkPlayers[mixIndices[which]].language;
+
+ if (Link_AnyPartnersPlayingRubyOrSapphire())
+ SanitizeReceivedRubyOldMan(dest, version, language);
+ else
+ SanitizeReceivedEmeraldOldMan(dest, version, language);
+
+ memcpy(sOldManSave, (void *)oldMan + recordSize * mixIndices[which], sizeof(OldMan));
+ ResetMauvilleOldManFlag();
+}
+
+static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u8 which)
+{
+ struct EmeraldBattleTowerRecord *dest;
+ struct UnknownPokemonStruct *btPokemon;
+ u32 mixIndices[4];
+ s32 i;
+
+ ShufflePlayerIndices(mixIndices);
+ if (Link_AnyPartnersPlayingRubyOrSapphire())
+ {
+ if (sub_816587C((void *)battleTowerRecord + recordSize * mixIndices[which], (void *)battleTowerRecord + recordSize * which) == TRUE)
+ {
+ dest = (void *)battleTowerRecord + recordSize * which;
+ dest->language = gLinkPlayers[mixIndices[which]].language;
+ CalcEmeraldBattleTowerChecksum(dest);
+ }
+ }
+ else
+ {
+ memcpy((void *)battleTowerRecord + recordSize * which, (void *)battleTowerRecord + recordSize * mixIndices[which], sizeof(union BattleTowerRecord));
+ dest = (void *)battleTowerRecord + recordSize * which;
+ for (i = 0; i < 4; i ++)
+ {
+ btPokemon = &dest->party[i];
+ if (btPokemon->species != SPECIES_NONE && IsStringJapanese(btPokemon->nickname))
+ ConvertInternationalString(btPokemon->nickname, LANGUAGE_JAPANESE);
+ }
+ CalcEmeraldBattleTowerChecksum(dest);
+ }
+ sub_81628A0((void *)battleTowerRecord + recordSize * which);
+}
+
+static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSize, u8 which)
+{
+ LilycoveLady *dest;
+ u32 mixIndices[4];
+
+ ShufflePlayerIndices(mixIndices);
+ memcpy((void *)lilycoveLady + recordSize * which, sLilycoveLadySave, sizeof(LilycoveLady));
+
+ if (GetLilycoveLadyId() == 0)
+ {
+ dest = malloc(sizeof(LilycoveLady));
+ if (dest == NULL)
+ return;
+
+ memcpy(dest, sLilycoveLadySave, sizeof(LilycoveLady));
+ }
+ else
+ {
+ dest = NULL;
+ }
+
+ memcpy(sLilycoveLadySave, (void *)lilycoveLady + recordSize * mixIndices[which], sizeof(LilycoveLady));
+ sub_818DA78();
+ if (dest != NULL)
+ {
+ sub_818E570(dest);
+ free(dest);
+ }
+}
+
+static u8 sub_80E7A9C(struct DayCareMail *rmMail)
+{
+ return rmMail->message.itemId;
+}
+
+static void sub_80E7AA4(struct RecordMixingDayCareMail *src, size_t recordSize, u8 (*idxs)[2], u8 which0, u8 which1)
+{
+ struct DayCareMail buffer;
+ struct RecordMixingDayCareMail *mail1;
+ struct RecordMixingDayCareMail *mail2;
+
+ mail1 = (void *)src + recordSize * idxs[which0][0];
+ memcpy(&buffer, &mail1->mail[idxs[which0][1]], sizeof(struct DayCareMail));
+ mail2 = (void *)src + recordSize * idxs[which1][0];
+ memcpy(&mail1->mail[idxs[which0][1]], &mail2->mail[idxs[which1][1]], sizeof(struct DayCareMail));
+ memcpy(&mail2->mail[idxs[which1][1]], &buffer, sizeof(struct DayCareMail));
+}
+
+static void sub_80E7B2C(const u8 *src)
+{
+ u8 sum;
+ s32 i;
+
+ sum = 0;
+ for (i = 0; i < 256; i ++)
+ sum += src[i];
+
+ gUnknown_03001160 = sum;
+}
+
+static u8 sub_80E7B54(void)
+{
+ return gUnknown_03001160;
+}
+
+#ifdef NONMATCHING
+static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows)
+{
+ // r9 = which
+ u16 i;
+ u16 j;
+ u8 linkPlayerCount;
+ u16 language;
+ u16 otNameLanguage;
+ u16 nicknameLanguage;
+ u32 version;
+ u8 dcMail1;
+ u8 dcMail2;
+ u8 r1_80e7b54;
+ struct DayCareMail *recordMixingMail;
+ struct RecordMixingDayCareMail *_src;
+ u8 sp04[4];
+ u8 sp08[4];
+ struct RecordMixingDayCareMail *sp0c[4]; // -> sp+48
+ u8 sp1c[4][2]; // [][0] -> sp+4c, [][1] -> sp+50
+ u8 sp24[4][2];
+ // sp+2c = src
+ // sp+30 = recordSize
+ u8 sp34;
+ u16 oldSeed;
+ bool32 anyRS; // sp+3c
+
+ oldSeed = Random2();
+ SeedRng2(gLinkPlayers[0].trainerId);
+ linkPlayerCount = GetLinkPlayerCount();
+ for (i = 0; i < 4; i ++)
+ {
+ sp04[i] = 0xFF;
+ sp08[i] = 0;
+ sp1c[i][0] = 0;
+ sp1c[i][1] = 0;
+ }
+ anyRS = Link_AnyPartnersPlayingRubyOrSapphire();
+ for (i = 0; i < GetLinkPlayerCount(); i ++) // r8 = i
+ {
+ // sp+54 = linkPlayerCount << 16
+ // sp+44 = which * recordSize
+ _src = (void *)src + i * recordSize; // r7
+ language = gLinkPlayers[i].language; // r9
+ version = (u8)gLinkPlayers[i].version; // sp+40
+ for (j = 0; j < _src->unk_70; j ++)
+ {
+ // r10 = ~0x10
+ recordMixingMail = &_src->unk_00[j];
+ if (recordMixingMail->mail.itemId != ITEM_NONE)
+ {
+ if (anyRS)
+ {
+ if (StringLength(recordMixingMail->OT_name) <= 5)
+ {
+ otNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ StripExtCtrlCodes(recordMixingMail->OT_name);
+ otNameLanguage = language;
+ }
+ if (recordMixingMail->monName[0] == EXT_CTRL_CODE_BEGIN && recordMixingMail->monName[1] == EXT_CTRL_CODE_JPN)
+ {
+ StripExtCtrlCodes(recordMixingMail->monName);
+ nicknameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ nicknameLanguage = language;
+ }
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ {
+ recordMixingMail->language_maybe = otNameLanguage;
+ recordMixingMail->unknown = nicknameLanguage;
+ }
+ }
+ else if (language == LANGUAGE_JAPANESE)
+ {
+ if (IsStringJapanese(recordMixingMail->OT_name))
+ {
+ recordMixingMail->language_maybe = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ recordMixingMail->language_maybe = GAME_LANGUAGE;
+ }
+ if (IsStringJapanese(recordMixingMail->monName))
+ {
+ recordMixingMail->unknown = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ recordMixingMail->unknown = GAME_LANGUAGE;
+ }
+ }
+ }
+ }
+ }
+ sp34 = 0;
+ for (i = 0; i < linkPlayerCount; i ++)
+ {
+ _src = (void *)src + i * recordSize; // r7
+ if (_src->unk_70 != 0)
+ {
+ for (j = 0; j < _src->unk_70; j ++)
+ {
+ if (_src->unk_74[j] == 0)
+ {
+ sp1c[i][j] = 1;
+ }
+ }
+ }
+ }
+ i = 0;
+ for (j = 0; j < linkPlayerCount; j ++)
+ {
+ _src = (void *)src + j * recordSize;
+ if (sp1c[j][0] == TRUE || sp1c[j][1] == TRUE)
+ {
+ sp34 ++;
+ }
+ if (sp1c[j][0] == TRUE && sp1c[j][1] == FALSE)
+ {
+ sp24[i][0] = j;
+ sp24[i][1] = 0;
+ i ++;
+ }
+ else if (sp1c[j][0] == FALSE && sp1c[j][1] == TRUE)
+ {
+ sp24[i][0] = j;
+ sp24[i][1] = 0;
+ i ++;
+ }
+ else if (sp1c[j][0] == TRUE && sp1c[j][1] == TRUE)
+ {
+ sp24[i][0] = j;
+ dcMail1 = sub_80E7A9C(&_src->unk_00[0]);
+ dcMail2 = sub_80E7A9C(&_src->unk_00[1]);
+ if (!dcMail1 && dcMail2)
+ {
+ sp24[i][1] = 1;
+ }
+ else if ((dcMail1 && dcMail2) || (!dcMail1 && !dcMail2))
+ {
+ sp24[i][1] = Random2() % 2;
+ }
+ else
+ {
+ sp24[i][1] = 0;
+ }
+ i ++;
+ }
+ }
+ for (i = 0; i < 4; i ++)
+ {
+ _src = &src[which * recordSize];
+ sp0c[i] = _src;
+ }
+ r1_80e7b54 = sub_80E7B54() % 3;
+ switch (sp34)
+ {
+ case 2:
+ sub_80E7AA4(src, recordSize, sp24, 0, 1);
+ break;
+ case 3:
+ sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFB8[r1_80e7b54][0], gUnknown_0858CFB8[r1_80e7b54][1]);
+ break;
+ case 4:
+ sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][0], gUnknown_0858CFBE[r1_80e7b54][1]);
+ sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][2], gUnknown_0858CFBE[r1_80e7b54][3]);
+ break;
+ }
+ _src = (void *)src + which * recordSize;
+ memcpy(&gSaveBlock1Ptr->daycare.mons[0].misc.mail, &_src->unk_00[0], sizeof(struct DayCareMail));
+ memcpy(&gSaveBlock1Ptr->daycare.mons[1].misc.mail, &_src->unk_00[1], sizeof(struct DayCareMail));
+ SeedRng(oldSeed);
+}
+#else
+NAKED
+static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x58\n"
+ "\tstr r0, [sp, 0x2C]\n"
+ "\tstr r1, [sp, 0x30]\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r2, 24\n"
+ "\tmov r9, r2\n"
+ "\tbl Random2\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tstr r0, [sp, 0x38]\n"
+ "\tldr r0, =gLinkPlayers\n"
+ "\tldrh r0, [r0, 0x4]\n"
+ "\tbl SeedRng2\n"
+ "\tbl GetLinkPlayerCount\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tmovs r0, 0\n"
+ "\tmov r8, r0\n"
+ "\tmov r1, sp\n"
+ "\tadds r1, 0x1C\n"
+ "\tstr r1, [sp, 0x4C]\n"
+ "\tmov r2, sp\n"
+ "\tadds r2, 0x1D\n"
+ "\tstr r2, [sp, 0x50]\n"
+ "\tmov r3, sp\n"
+ "\tadds r3, 0xC\n"
+ "\tstr r3, [sp, 0x48]\n"
+ "\tmovs r7, 0xFF\n"
+ "\tadd r3, sp, 0x8\n"
+ "\tmovs r2, 0\n"
+ "\tadds r6, r1, 0\n"
+ "\tldr r5, [sp, 0x50]\n"
+ "_080E7BB0:\n"
+ "\tmov r1, sp\n"
+ "\tadd r1, r8\n"
+ "\tadds r1, 0x4\n"
+ "\tldrb r0, [r1]\n"
+ "\torrs r0, r7\n"
+ "\tstrb r0, [r1]\n"
+ "\tmov r1, r8\n"
+ "\tadds r0, r3, r1\n"
+ "\tstrb r2, [r0]\n"
+ "\tlsls r1, 1\n"
+ "\tadds r0, r6, r1\n"
+ "\tstrb r2, [r0]\n"
+ "\tadds r1, r5, r1\n"
+ "\tstrb r2, [r1]\n"
+ "\tmov r0, r8\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmov r8, r0\n"
+ "\tcmp r0, 0x3\n"
+ "\tbls _080E7BB0\n"
+ "\tbl Link_AnyPartnersPlayingRubyOrSapphire\n"
+ "\tstr r0, [sp, 0x3C]\n"
+ "\tmovs r2, 0\n"
+ "\tmov r8, r2\n"
+ "\tlsls r4, 16\n"
+ "\tstr r4, [sp, 0x54]\n"
+ "\tldr r0, [sp, 0x30]\n"
+ "\tmov r3, r9\n"
+ "\tmuls r3, r0\n"
+ "\tstr r3, [sp, 0x44]\n"
+ "\tb _080E7D04\n"
+ "\t.pool\n"
+ "_080E7BF8:\n"
+ "\tldr r1, [sp, 0x30]\n"
+ "\tmov r0, r8\n"
+ "\tmuls r0, r1\n"
+ "\tldr r2, [sp, 0x2C]\n"
+ "\tadds r7, r2, r0\n"
+ "\tldr r1, =gLinkPlayers\n"
+ "\tmov r3, r8\n"
+ "\tlsls r0, r3, 3\n"
+ "\tsubs r0, r3\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r1\n"
+ "\tldrh r1, [r0, 0x1A]\n"
+ "\tmov r9, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tstr r0, [sp, 0x40]\n"
+ "\tmovs r6, 0\n"
+ "\tldr r0, [r7, 0x70]\n"
+ "\tcmp r6, r0\n"
+ "\tbcs _080E7CFA\n"
+ "\tmovs r2, 0x10\n"
+ "\tnegs r2, r2\n"
+ "\tmov r10, r2\n"
+ "_080E7C24:\n"
+ "\tlsls r0, r6, 3\n"
+ "\tsubs r0, r6\n"
+ "\tlsls r0, 3\n"
+ "\tadds r5, r7, r0\n"
+ "\tldrh r0, [r5, 0x20]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080E7CEE\n"
+ "\tldr r3, [sp, 0x3C]\n"
+ "\tcmp r3, 0\n"
+ "\tbeq _080E7C9A\n"
+ "\tadds r4, r5, 0\n"
+ "\tadds r4, 0x24\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl StringLength\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x5\n"
+ "\tbhi _080E7C54\n"
+ "\tmovs r4, 0x1\n"
+ "\tb _080E7C5C\n"
+ "\t.pool\n"
+ "_080E7C54:\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl StripExtCtrlCodes\n"
+ "\tmov r4, r9\n"
+ "_080E7C5C:\n"
+ "\tldrh r1, [r5, 0x2C]\n"
+ "\tldr r0, =0x000015fc\n"
+ "\tcmp r1, r0\n"
+ "\tbne _080E7C74\n"
+ "\tadds r0, r5, 0\n"
+ "\tadds r0, 0x2C\n"
+ "\tbl StripExtCtrlCodes\n"
+ "\tmovs r1, 0x1\n"
+ "\tb _080E7C76\n"
+ "\t.pool\n"
+ "_080E7C74:\n"
+ "\tmov r1, r9\n"
+ "_080E7C76:\n"
+ "\tldr r0, [sp, 0x40]\n"
+ "\tsubs r0, 0x1\n"
+ "\tcmp r0, 0x1\n"
+ "\tbhi _080E7CEE\n"
+ "\tadds r2, r5, 0\n"
+ "\tadds r2, 0x37\n"
+ "\tmovs r0, 0xF\n"
+ "\tands r4, r0\n"
+ "\tldrb r0, [r2]\n"
+ "\tmov r3, r10\n"
+ "\tands r0, r3\n"
+ "\torrs r0, r4\n"
+ "\tlsls r1, 4\n"
+ "\tmovs r3, 0xF\n"
+ "\tands r0, r3\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r2]\n"
+ "\tb _080E7CEE\n"
+ "_080E7C9A:\n"
+ "\tmov r0, r9\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080E7CEE\n"
+ "\tadds r0, r5, 0\n"
+ "\tadds r0, 0x24\n"
+ "\tbl IsStringJapanese\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080E7CBA\n"
+ "\tadds r0, r5, 0\n"
+ "\tadds r0, 0x37\n"
+ "\tldrb r1, [r0]\n"
+ "\tmov r2, r10\n"
+ "\tands r1, r2\n"
+ "\tmovs r2, 0x1\n"
+ "\tb _080E7CC6\n"
+ "_080E7CBA:\n"
+ "\tadds r0, r5, 0\n"
+ "\tadds r0, 0x37\n"
+ "\tldrb r1, [r0]\n"
+ "\tmov r3, r10\n"
+ "\tands r1, r3\n"
+ "\tmovs r2, 0x2\n"
+ "_080E7CC6:\n"
+ "\torrs r1, r2\n"
+ "\tstrb r1, [r0]\n"
+ "\tadds r4, r0, 0\n"
+ "\tadds r0, r5, 0\n"
+ "\tadds r0, 0x2C\n"
+ "\tbl IsStringJapanese\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080E7CE2\n"
+ "\tldrb r0, [r4]\n"
+ "\tmovs r1, 0xF\n"
+ "\tands r1, r0\n"
+ "\tmovs r0, 0x10\n"
+ "\tb _080E7CEA\n"
+ "_080E7CE2:\n"
+ "\tldrb r0, [r4]\n"
+ "\tmovs r1, 0xF\n"
+ "\tands r1, r0\n"
+ "\tmovs r0, 0x20\n"
+ "_080E7CEA:\n"
+ "\torrs r1, r0\n"
+ "\tstrb r1, [r4]\n"
+ "_080E7CEE:\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tldr r0, [r7, 0x70]\n"
+ "\tcmp r6, r0\n"
+ "\tbcc _080E7C24\n"
+ "_080E7CFA:\n"
+ "\tmov r0, r8\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmov r8, r0\n"
+ "_080E7D04:\n"
+ "\tbl GetLinkPlayerCount\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r8, r0\n"
+ "\tbcs _080E7D12\n"
+ "\tb _080E7BF8\n"
+ "_080E7D12:\n"
+ "\tmovs r0, 0\n"
+ "\tstr r0, [sp, 0x34]\n"
+ "\tmov r8, r0\n"
+ "\tldr r1, [sp, 0x54]\n"
+ "\tlsrs r0, r1, 16\n"
+ "\tldr r2, [sp, 0x34]\n"
+ "\tcmp r2, r0\n"
+ "\tbcs _080E7D70\n"
+ "\tadds r5, r0, 0\n"
+ "_080E7D24:\n"
+ "\tldr r3, [sp, 0x30]\n"
+ "\tmov r0, r8\n"
+ "\tmuls r0, r3\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tadds r7, r1, r0\n"
+ "\tldr r0, [r7, 0x70]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080E7D62\n"
+ "\tmovs r6, 0\n"
+ "\tcmp r6, r0\n"
+ "\tbcs _080E7D62\n"
+ "\tadds r3, r7, 0\n"
+ "\tadds r3, 0x74\n"
+ "\tldr r2, [sp, 0x4C]\n"
+ "\tmov r0, r8\n"
+ "\tlsls r1, r0, 1\n"
+ "\tmovs r4, 0x1\n"
+ "_080E7D46:\n"
+ "\tlsls r0, r6, 1\n"
+ "\tadds r0, r3, r0\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080E7D56\n"
+ "\tadds r0, r6, r1\n"
+ "\tadds r0, r2, r0\n"
+ "\tstrb r4, [r0]\n"
+ "_080E7D56:\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tldr r0, [r7, 0x70]\n"
+ "\tcmp r6, r0\n"
+ "\tbcc _080E7D46\n"
+ "_080E7D62:\n"
+ "\tmov r0, r8\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmov r8, r0\n"
+ "\tcmp r8, r5\n"
+ "\tbcc _080E7D24\n"
+ "_080E7D70:\n"
+ "\tmovs r6, 0\n"
+ "\tmov r8, r6\n"
+ "\tldr r1, [sp, 0x54]\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _080E7E64\n"
+ "\tadd r2, sp, 0x24\n"
+ "\tmov r10, r2\n"
+ "\tmovs r3, 0x25\n"
+ "\tadd r3, sp\n"
+ "\tmov r9, r3\n"
+ "_080E7D84:\n"
+ "\tldr r1, [sp, 0x30]\n"
+ "\tmov r0, r8\n"
+ "\tmuls r0, r1\n"
+ "\tldr r2, [sp, 0x2C]\n"
+ "\tadds r7, r2, r0\n"
+ "\tmov r3, r8\n"
+ "\tlsls r1, r3, 1\n"
+ "\tldr r2, [sp, 0x4C]\n"
+ "\tadds r0, r2, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbeq _080E7DA6\n"
+ "\tldr r3, [sp, 0x50]\n"
+ "\tadds r0, r3, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080E7DB0\n"
+ "_080E7DA6:\n"
+ "\tldr r0, [sp, 0x34]\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp, 0x34]\n"
+ "_080E7DB0:\n"
+ "\tldr r2, [sp, 0x4C]\n"
+ "\tadds r0, r2, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080E7DD4\n"
+ "\tldr r3, [sp, 0x50]\n"
+ "\tadds r0, r3, r1\n"
+ "\tldrb r2, [r0]\n"
+ "\tcmp r2, 0\n"
+ "\tbne _080E7DD4\n"
+ "_080E7DC4:\n"
+ "\tlsls r1, r6, 1\n"
+ "\tmov r3, r10\n"
+ "\tadds r0, r3, r1\n"
+ "\tmov r3, r8\n"
+ "\tstrb r3, [r0]\n"
+ "\tadd r1, r9\n"
+ "\tstrb r2, [r1]\n"
+ "\tb _080E7E4E\n"
+ "_080E7DD4:\n"
+ "\tldr r2, [sp, 0x4C]\n"
+ "\tadds r0, r2, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080E7DE8\n"
+ "\tldr r3, [sp, 0x50]\n"
+ "\tadds r0, r3, r1\n"
+ "\tldrb r2, [r0]\n"
+ "\tcmp r2, 0x1\n"
+ "\tbeq _080E7DC4\n"
+ "_080E7DE8:\n"
+ "\tldr r2, [sp, 0x4C]\n"
+ "\tadds r0, r2, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080E7E54\n"
+ "\tldr r3, [sp, 0x50]\n"
+ "\tadds r0, r3, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080E7E54\n"
+ "\tlsls r5, r6, 1\n"
+ "\tmov r1, r10\n"
+ "\tadds r0, r1, r5\n"
+ "\tmov r2, r8\n"
+ "\tstrb r2, [r0]\n"
+ "\tadds r0, r7, 0\n"
+ "\tbl sub_80E7A9C\n"
+ "\tadds r4, r0, 0\n"
+ "\tlsls r4, 24\n"
+ "\tlsrs r4, 24\n"
+ "\tadds r0, r7, 0\n"
+ "\tadds r0, 0x38\n"
+ "\tbl sub_80E7A9C\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r1, r0, 24\n"
+ "\tcmp r4, 0\n"
+ "\tbne _080E7E30\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _080E7E34\n"
+ "\tmov r3, r9\n"
+ "\tadds r1, r3, r5\n"
+ "\tmovs r0, 0x1\n"
+ "\tstrb r0, [r1]\n"
+ "\tb _080E7E4E\n"
+ "_080E7E30:\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _080E7E48\n"
+ "_080E7E34:\n"
+ "\tbl Random2\n"
+ "\tmov r1, r9\n"
+ "\tadds r2, r1, r5\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmovs r1, 0x1\n"
+ "\tands r0, r1\n"
+ "\tstrb r0, [r2]\n"
+ "\tb _080E7E4E\n"
+ "_080E7E48:\n"
+ "\tmov r2, r9\n"
+ "\tadds r0, r2, r5\n"
+ "\tstrb r1, [r0]\n"
+ "_080E7E4E:\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r6, r0, 16\n"
+ "_080E7E54:\n"
+ "\tmov r0, r8\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r3, r0, 16\n"
+ "\tmov r8, r3\n"
+ "\tldr r1, [sp, 0x54]\n"
+ "\tcmp r0, r1\n"
+ "\tbcc _080E7D84\n"
+ "_080E7E64:\n"
+ "\tmovs r2, 0\n"
+ "\tmov r8, r2\n"
+ "\tldr r3, [sp, 0x44]\n"
+ "\tlsls r0, r3, 4\n"
+ "\tsubs r0, r3\n"
+ "\tlsls r0, 3\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tadds r7, r1, r0\n"
+ "\tldr r1, [sp, 0x48]\n"
+ "_080E7E76:\n"
+ "\tmov r2, r8\n"
+ "\tlsls r0, r2, 2\n"
+ "\tadds r0, r1, r0\n"
+ "\tstr r7, [r0]\n"
+ "\tmov r0, r8\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmov r8, r0\n"
+ "\tcmp r0, 0x3\n"
+ "\tbls _080E7E76\n"
+ "\tbl sub_80E7B54\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmovs r1, 0x3\n"
+ "\tbl __umodsi3\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r1, r0, 24\n"
+ "\tldr r3, [sp, 0x34]\n"
+ "\tcmp r3, 0x3\n"
+ "\tbeq _080E7EC8\n"
+ "\tcmp r3, 0x3\n"
+ "\tbgt _080E7EAE\n"
+ "\tcmp r3, 0x2\n"
+ "\tbeq _080E7EB6\n"
+ "\tb _080E7F1C\n"
+ "_080E7EAE:\n"
+ "\tldr r0, [sp, 0x34]\n"
+ "\tcmp r0, 0x4\n"
+ "\tbeq _080E7EE8\n"
+ "\tb _080E7F1C\n"
+ "_080E7EB6:\n"
+ "\tadd r2, sp, 0x24\n"
+ "\tmovs r0, 0x1\n"
+ "\tstr r0, [sp]\n"
+ "\tldr r0, [sp, 0x2C]\n"
+ "\tldr r1, [sp, 0x30]\n"
+ "\tmovs r3, 0\n"
+ "\tbl sub_80E7AA4\n"
+ "\tb _080E7F1C\n"
+ "_080E7EC8:\n"
+ "\tldr r0, =gUnknown_0858CFB8\n"
+ "\tlsls r1, 1\n"
+ "\tadds r2, r1, r0\n"
+ "\tldrb r3, [r2]\n"
+ "\tadds r0, 0x1\n"
+ "\tadds r1, r0\n"
+ "\tldrb r0, [r1]\n"
+ "\tadd r2, sp, 0x24\n"
+ "\tstr r0, [sp]\n"
+ "\tldr r0, [sp, 0x2C]\n"
+ "\tldr r1, [sp, 0x30]\n"
+ "\tbl sub_80E7AA4\n"
+ "\tb _080E7F1C\n"
+ "\t.pool\n"
+ "_080E7EE8:\n"
+ "\tadd r6, sp, 0x24\n"
+ "\tldr r4, =gUnknown_0858CFBE\n"
+ "\tlsls r5, r1, 2\n"
+ "\tadds r0, r5, r4\n"
+ "\tldrb r3, [r0]\n"
+ "\tadds r0, r4, 0x1\n"
+ "\tadds r0, r5, r0\n"
+ "\tldrb r0, [r0]\n"
+ "\tstr r0, [sp]\n"
+ "\tldr r0, [sp, 0x2C]\n"
+ "\tldr r1, [sp, 0x30]\n"
+ "\tadds r2, r6, 0\n"
+ "\tbl sub_80E7AA4\n"
+ "\tadds r0, r4, 0x2\n"
+ "\tadds r0, r5, r0\n"
+ "\tldrb r3, [r0]\n"
+ "\tadds r4, 0x3\n"
+ "\tadds r5, r4\n"
+ "\tldrb r0, [r5]\n"
+ "\tstr r0, [sp]\n"
+ "\tldr r0, [sp, 0x2C]\n"
+ "\tldr r1, [sp, 0x30]\n"
+ "\tadds r2, r6, 0\n"
+ "\tbl sub_80E7AA4\n"
+ "_080E7F1C:\n"
+ "\tldr r1, [sp, 0x2C]\n"
+ "\tldr r2, [sp, 0x44]\n"
+ "\tadds r7, r1, r2\n"
+ "\tldr r4, =gSaveBlock1Ptr\n"
+ "\tldr r0, [r4]\n"
+ "\tmovs r3, 0xC2\n"
+ "\tlsls r3, 6\n"
+ "\tadds r0, r3\n"
+ "\tadds r1, r7, 0\n"
+ "\tmovs r2, 0x38\n"
+ "\tbl memcpy\n"
+ "\tldr r0, [r4]\n"
+ "\tldr r1, =0x0000310c\n"
+ "\tadds r0, r1\n"
+ "\tadds r1, r7, 0\n"
+ "\tadds r1, 0x38\n"
+ "\tmovs r2, 0x38\n"
+ "\tbl memcpy\n"
+ "\tldr r0, [sp, 0x38]\n"
+ "\tbl SeedRng\n"
+ "\tadd sp, 0x58\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif // NONMATCHING
+
+static void sub_80E7F68(u16 *item, u8 which)
+{
+ if (which != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == POCKET_KEY_ITEMS)
+ {
+ if (!CheckBagHasItem(*item, 1) && !CheckPCHasItem(*item, 1) && AddBagItem(*item, 1))
+ {
+ VarSet(VAR_TEMP_1, *item);
+ StringCopy(gStringVar1, gLinkPlayers[0].name);
+ if (*item == ITEM_EON_TICKET)
+ FlagSet(FLAG_SYS_HAS_EON_TICKET);
+ }
+ else
+ {
+ VarSet(VAR_TEMP_1, ITEM_NONE);
+ }
+ }
+}
+
+static void sub_80E7FF8(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[0]++;
+ break;
+ case 1:
+ if (Link_AnyPartnersPlayingRubyOrSapphire())
+ task->data[0]++;
+ else
+ task->data[0] = 6;
+ break;
+ case 2:
+ sub_8076D5C();
+ sub_8153430();
+ task->data[0] ++;
+ break;
+ case 3:
+ if (sub_8153474())
+ {
+ sav2_gender2_inplace_and_xFE();
+ task->data[0] = 4;
+ task->data[1] = 0;
+ }
+ break;
+ case 4:
+ if (++task->data[1] > 10)
+ {
+ sub_800AC34();
+ task->data[0] ++;
+ }
+ break;
+ case 5:
+ if (gReceivedRemoteLinkPlayers == 0)
+ DestroyTask(taskId);
+ break;
+ case 6:
+ if (!sub_801048C(0))
+ {
+ CreateTask(sub_8153688, 5);
+ task->data[0] ++;
+ }
+ break;
+ case 7:
+ if (!FuncIsActiveTask(sub_8153688))
+ {
+ if (gWirelessCommType)
+ {
+ sub_801048C(1);
+ task->data[0] = 8;
+ }
+ else
+ {
+ task->data[0] = 4;
+ }
+ }
+ break;
+ case 8:
+ sub_800ADF8();
+ task->data[0] ++;
+ break;
+ case 9:
+ if (sub_800A520())
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+// New Emerald functions
+
+static void sub_80E8110(struct UnkRecordMixingStruct *dst, struct UnkRecordMixingStruct *src)
+{
+ s32 i, id;
+ s32 var_2C, var_28, var_24, r8;
+
+ dst[0].field_38[0] = 0xFF;
+ dst[1].field_38[0] = 0xFF;
+
+ dst[0] = src[0];
+
+ var_28 = 0;
+ var_24 = 0;
+ var_2C = 0;
+ r8 = 0;
+ for (i = 0; i < 2; i++)
+ {
+ id = ((i + gSaveBlock2Ptr->field_B2_1) % 3) + 1;
+ if (src[id].field_38[0] != 0xFF)
+ {
+ if (ReadUnalignedWord(src[id].playerId) != ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId))
+ {
+ r8++;
+ var_2C = id;
+ }
+ if (ReadUnalignedWord(src[id].playerId) == ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId))
+ {
+ var_24++;
+ var_28 = id;
+ }
+ }
+ }
+
+ if (r8 == 0 && var_24 != 0)
+ {
+ r8 = var_24;
+ var_2C = var_28;
+ }
+
+ switch (r8)
+ {
+ case 1:
+ dst[1] = src[var_2C];
+ break;
+ case 2:
+ if (Random2() > 0x3333)
+ {
+ dst[1] = src[gSaveBlock2Ptr->field_B2_1 + 1];
+ }
+ else
+ {
+ dst[1] = src[((gSaveBlock2Ptr->field_B2_1 + 1) % 3 + 1)];
+ }
+ break;
+ }
+}
+
+void sub_80E8260(struct UnkRecordMixingStruct2 *dst)
+{
+ s32 i, j;
+
+ for (i = 0; i < 9; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ CopyUnalignedWord(dst->field_0[i][j].playerId, gSaveBlock2Ptr->playerTrainerId);
+ dst->field_0[i][j].language = GAME_LANGUAGE;
+ StringCopy(dst->field_0[i][j].playerName, gSaveBlock2Ptr->playerName);
+ }
+ }
+
+ for (j = 0; j < 2; j++)
+ {
+ dst->field_120[j].language = GAME_LANGUAGE;
+ CopyUnalignedWord(dst->field_120[j].playerId1, gSaveBlock2Ptr->playerTrainerId);
+ CopyUnalignedWord(dst->field_120[j].playerId2, gSaveBlock2Ptr->frontier.field_EF1[j]);
+ StringCopy(dst->field_120[j].playerName1, gSaveBlock2Ptr->playerName);
+ StringCopy(dst->field_120[j].playerName2, gSaveBlock2Ptr->frontier.field_EE1[j]);
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ dst->field_0[0][i].field_4 = gSaveBlock2Ptr->frontier.field_CF0[i];
+ dst->field_0[1][i].field_4 = gSaveBlock2Ptr->frontier.field_CF4[i];
+ dst->field_0[2][i].field_4 = gSaveBlock2Ptr->frontier.field_CF8[i];
+ dst->field_0[3][i].field_4 = gSaveBlock2Ptr->frontier.field_D14[i];
+ dst->field_0[4][i].field_4 = gSaveBlock2Ptr->frontier.field_DD0[i];
+ dst->field_0[5][i].field_4 = gSaveBlock2Ptr->frontier.field_DDE[i];
+ dst->field_0[6][i].field_4 = gSaveBlock2Ptr->frontier.field_DEA[i];
+ dst->field_0[7][i].field_4 = gSaveBlock2Ptr->frontier.field_E08[i];
+ dst->field_0[8][i].field_4 = gSaveBlock2Ptr->frontier.field_E1E[i];
+
+ dst->field_120[i].field_8 = gSaveBlock2Ptr->frontier.field_CFC[i];
+ }
+}
+
+static bool32 sub_80E841C(struct UnkRecordMixingStruct *arg0, struct UnkRecordMixingStruct *arg1)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (ReadUnalignedWord(arg0->playerId) == ReadUnalignedWord(arg1[i].playerId)
+ && arg0->field_0[2] == arg1[i].field_0[2])
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_80E8468(struct UnkRecordMixingStruct *arg0, size_t arg1, u32 arg2)
+{
+ s32 i, r7, r8;
+ struct UnkRecordMixingStruct *structPtr;
+ u32 mixIndices[4];
+ u32 structId;
+
+ ShufflePlayerIndices(mixIndices);
+ structPtr = (void*)(arg0) + (arg1 * mixIndices[arg2]);
+ r7 = 0;
+ r8 = 0;
+ for (i = 0; i < 2; i++)
+ {
+ if (structPtr[i].field_38[0] != 0xFF && !sub_80E841C(&structPtr[i], gSaveBlock2Ptr->field_DC))
+ {
+ r7++;
+ r8 = i;
+ }
+ }
+
+ switch (r7)
+ {
+ case 1:
+ structId = gSaveBlock2Ptr->field_B2_1 + 1;
+ gSaveBlock2Ptr->field_DC[structId] = structPtr[r8];
+ gSaveBlock2Ptr->field_B2_1 = (gSaveBlock2Ptr->field_B2_1 + 1) % 3;
+ break;
+ case 2:
+ for (i = 0; i < 2; i++)
+ {
+ structId = ((i ^ 1) + gSaveBlock2Ptr->field_B2_1) % 3 + 1;
+ gSaveBlock2Ptr->field_DC[structId] = structPtr[i];
+ }
+ gSaveBlock2Ptr->field_B2_1 = (gSaveBlock2Ptr->field_B2_1 + 2) % 3;
+ break;
+ }
+}
+
+NAKED
+static void sub_80E8578(struct UnknownRecMixingStruct3 *arg0, struct UnkRecordMixingStruct2 *arg1, size_t arg2, u32 arg3, u32 arg4)
+{
+ asm_unified(" push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x54\n\
+ str r0, [sp]\n\
+ ldr r0, [sp, 0x74]\n\
+ movs r4, 0\n\
+ mov r8, r4\n\
+ movs r5, 0\n\
+ str r5, [sp, 0x4]\n\
+ ldr r4, =gUnknown_03001168\n\
+ b _080E85A0\n\
+ .pool\n\
+_080E8598:\n\
+ adds r1, r2\n\
+ ldr r6, [sp, 0x4]\n\
+ adds r6, 0x1\n\
+ str r6, [sp, 0x4]\n\
+_080E85A0:\n\
+ ldr r5, [sp, 0x4]\n\
+ cmp r5, r0\n\
+ bge _080E85B6\n\
+ cmp r5, r3\n\
+ beq _080E85B0\n\
+ stm r4!, {r1}\n\
+ movs r6, 0x1\n\
+ add r8, r6\n\
+_080E85B0:\n\
+ mov r5, r8\n\
+ cmp r5, 0x3\n\
+ bne _080E8598\n\
+_080E85B6:\n\
+ movs r6, 0\n\
+ str r6, [sp, 0x4]\n\
+ subs r0, 0x1\n\
+ str r0, [sp, 0x24]\n\
+_080E85BE:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x8]\n\
+ ldr r1, [sp, 0x4]\n\
+ adds r1, 0x1\n\
+ str r1, [sp, 0x28]\n\
+ ldr r2, [sp, 0x4]\n\
+ lsls r2, 1\n\
+ str r2, [sp, 0x34]\n\
+ ldr r3, [sp, 0x4]\n\
+ adds r3, r2, r3\n\
+ str r3, [sp, 0x10]\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x44]\n\
+ movs r5, 0\n\
+ str r5, [sp, 0x48]\n\
+_080E85DC:\n\
+ movs r6, 0\n\
+ mov r8, r6\n\
+ ldr r0, =gSaveBlock2Ptr\n\
+ ldr r1, [r0]\n\
+ ldr r2, [sp, 0x10]\n\
+ lsls r0, r2, 5\n\
+ ldr r3, [sp, 0x48]\n\
+ adds r0, r3, r0\n\
+ adds r3, r0, r1\n\
+ lsls r0, r2, 6\n\
+ ldr r4, [sp, 0x44]\n\
+ adds r0, r4, r0\n\
+ ldr r5, [sp]\n\
+ adds r2, r0, r5\n\
+_080E85F8:\n\
+ adds r0, r2, 0\n\
+ movs r6, 0x87\n\
+ lsls r6, 2\n\
+ adds r1, r3, r6\n\
+ ldm r1!, {r4-r6}\n\
+ stm r0!, {r4-r6}\n\
+ ldr r1, [r1]\n\
+ str r1, [r0]\n\
+ adds r3, 0x10\n\
+ adds r2, 0x10\n\
+ movs r0, 0x1\n\
+ add r8, r0\n\
+ mov r1, r8\n\
+ cmp r1, 0x2\n\
+ ble _080E85F8\n\
+ movs r2, 0\n\
+ mov r8, r2\n\
+ ldr r3, [sp, 0x24]\n\
+ cmp r8, r3\n\
+ bge _080E86DC\n\
+ ldr r4, [sp, 0x4]\n\
+ lsls r4, 5\n\
+ mov r9, r4\n\
+ ldr r5, [sp, 0x8]\n\
+ lsls r7, r5, 4\n\
+ ldr r6, [sp, 0x34]\n\
+ ldr r1, [sp, 0x4]\n\
+ adds r0, r6, r1\n\
+ lsls r0, 6\n\
+ str r0, [sp, 0x14]\n\
+ ldr r2, [sp]\n\
+ adds r0, r2, r0\n\
+ ldr r3, [sp, 0x44]\n\
+ str r3, [sp, 0x18]\n\
+ adds r0, r3\n\
+ str r0, [sp, 0x1C]\n\
+ ldr r4, [sp, 0x14]\n\
+ adds r0, r3, r4\n\
+ adds r0, r2\n\
+ adds r0, 0x30\n\
+ mov r10, r0\n\
+_080E864A:\n\
+ movs r5, 0\n\
+ str r5, [sp, 0xC]\n\
+ movs r3, 0\n\
+ mov r6, r8\n\
+ lsls r6, 2\n\
+ str r6, [sp, 0x38]\n\
+ ldr r1, [sp, 0x18]\n\
+ ldr r2, [sp, 0x14]\n\
+ adds r0, r1, r2\n\
+ ldr r4, [sp]\n\
+ adds r5, r0, r4\n\
+ ldr r0, =gUnknown_03001168\n\
+ adds r0, r6, r0\n\
+ str r0, [sp, 0x50]\n\
+_080E8666:\n\
+ lsls r0, r3, 4\n\
+ ldr r6, [sp, 0x1C]\n\
+ adds r0, r6, r0\n\
+ str r3, [sp, 0x4C]\n\
+ bl ReadUnalignedWord\n\
+ adds r4, r0, 0\n\
+ ldr r1, [sp, 0x50]\n\
+ ldr r0, [r1]\n\
+ add r0, r9\n\
+ adds r0, r7\n\
+ bl ReadUnalignedWord\n\
+ ldr r3, [sp, 0x4C]\n\
+ cmp r4, r0\n\
+ bne _080E86A8\n\
+ ldr r2, [sp, 0xC]\n\
+ adds r2, 0x1\n\
+ str r2, [sp, 0xC]\n\
+ ldr r4, [sp, 0x50]\n\
+ ldr r0, [r4]\n\
+ mov r6, r9\n\
+ adds r1, r7, r6\n\
+ adds r1, r0, r1\n\
+ ldrh r0, [r5, 0x4]\n\
+ ldrh r2, [r1, 0x4]\n\
+ cmp r0, r2\n\
+ bcs _080E86A8\n\
+ adds r0, r5, 0\n\
+ ldm r1!, {r2,r4,r6}\n\
+ stm r0!, {r2,r4,r6}\n\
+ ldr r1, [r1]\n\
+ str r1, [r0]\n\
+_080E86A8:\n\
+ adds r5, 0x10\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x2\n\
+ ble _080E8666\n\
+ ldr r3, [sp, 0xC]\n\
+ cmp r3, 0\n\
+ bne _080E86CE\n\
+ ldr r0, =gUnknown_03001168\n\
+ ldr r4, [sp, 0x38]\n\
+ adds r0, r4, r0\n\
+ ldr r0, [r0]\n\
+ mov r5, r9\n\
+ adds r2, r7, r5\n\
+ mov r1, r10\n\
+ adds r0, r2\n\
+ ldm r0!, {r2,r3,r6}\n\
+ stm r1!, {r2,r3,r6}\n\
+ ldr r0, [r0]\n\
+ str r0, [r1]\n\
+_080E86CE:\n\
+ movs r4, 0x10\n\
+ add r10, r4\n\
+ movs r5, 0x1\n\
+ add r8, r5\n\
+ ldr r6, [sp, 0x24]\n\
+ cmp r8, r6\n\
+ blt _080E864A\n\
+_080E86DC:\n\
+ ldr r0, [sp, 0x44]\n\
+ adds r0, 0x60\n\
+ str r0, [sp, 0x44]\n\
+ ldr r1, [sp, 0x48]\n\
+ adds r1, 0x30\n\
+ str r1, [sp, 0x48]\n\
+ ldr r2, [sp, 0x8]\n\
+ adds r2, 0x1\n\
+ str r2, [sp, 0x8]\n\
+ cmp r2, 0x1\n\
+ bgt _080E86F4\n\
+ b _080E85DC\n\
+_080E86F4:\n\
+ ldr r3, [sp, 0x28]\n\
+ str r3, [sp, 0x4]\n\
+ cmp r3, 0x8\n\
+ bgt _080E86FE\n\
+ b _080E85BE\n\
+_080E86FE:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x8]\n\
+_080E8702:\n\
+ ldr r5, [sp, 0x8]\n\
+ adds r5, 0x1\n\
+ str r5, [sp, 0x2C]\n\
+ ldr r0, =gSaveBlock2Ptr\n\
+ ldr r1, [r0]\n\
+ movs r0, 0x54\n\
+ ldr r6, [sp, 0x8]\n\
+ muls r0, r6\n\
+ adds r3, r0, r1\n\
+ movs r0, 0xA8\n\
+ muls r0, r6\n\
+ ldr r1, [sp]\n\
+ adds r2, r0, r1\n\
+ movs r4, 0x2\n\
+ mov r8, r4\n\
+_080E8720:\n\
+ movs r5, 0xD8\n\
+ lsls r5, 3\n\
+ adds r0, r2, r5\n\
+ ldr r6, =0x0000057c\n\
+ adds r1, r3, r6\n\
+ ldm r1!, {r4-r6}\n\
+ stm r0!, {r4-r6}\n\
+ ldm r1!, {r4-r6}\n\
+ stm r0!, {r4-r6}\n\
+ ldr r1, [r1]\n\
+ str r1, [r0]\n\
+ adds r3, 0x1C\n\
+ adds r2, 0x1C\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ add r8, r0\n\
+ mov r1, r8\n\
+ cmp r1, 0\n\
+ bge _080E8720\n\
+ movs r2, 0\n\
+ mov r8, r2\n\
+ ldr r3, [sp, 0x24]\n\
+ cmp r8, r3\n\
+ blt _080E8752\n\
+ b _080E885A\n\
+_080E8752:\n\
+ ldr r4, [sp, 0x8]\n\
+ lsls r1, r4, 3\n\
+ movs r0, 0xA8\n\
+ adds r5, r4, 0\n\
+ muls r5, r0\n\
+ str r5, [sp, 0x20]\n\
+ str r5, [sp, 0x3C]\n\
+ subs r1, r4\n\
+ lsls r1, 2\n\
+ mov r10, r1\n\
+_080E8766:\n\
+ movs r6, 0\n\
+ str r6, [sp, 0xC]\n\
+ mov r0, r8\n\
+ lsls r0, 2\n\
+ str r0, [sp, 0x38]\n\
+ mov r1, r8\n\
+ adds r1, 0x1\n\
+ str r1, [sp, 0x30]\n\
+ ldr r0, =gUnknown_03001168\n\
+ ldr r2, [sp, 0x38]\n\
+ adds r2, r0\n\
+ mov r9, r2\n\
+ ldr r3, [sp]\n\
+ movs r4, 0xD8\n\
+ lsls r4, 3\n\
+ adds r0, r3, r4\n\
+ ldr r5, [sp, 0x3C]\n\
+ adds r7, r5, r0\n\
+ str r6, [sp, 0x40]\n\
+ movs r3, 0x2\n\
+_080E878E:\n\
+ ldr r1, [sp, 0x20]\n\
+ movs r2, 0xD8\n\
+ lsls r2, 3\n\
+ adds r0, r1, r2\n\
+ ldr r4, [sp]\n\
+ adds r0, r4, r0\n\
+ ldr r6, [sp, 0x40]\n\
+ adds r5, r0, r6\n\
+ adds r0, r5, 0\n\
+ str r3, [sp, 0x4C]\n\
+ bl ReadUnalignedWord\n\
+ adds r4, r0, 0\n\
+ movs r6, 0x90\n\
+ lsls r6, 1\n\
+ add r6, r10\n\
+ mov r1, r9\n\
+ ldr r0, [r1]\n\
+ adds r0, r6\n\
+ bl ReadUnalignedWord\n\
+ ldr r3, [sp, 0x4C]\n\
+ cmp r4, r0\n\
+ bne _080E8808\n\
+ adds r0, r5, 0x4\n\
+ bl ReadUnalignedWord\n\
+ adds r4, r0, 0\n\
+ mov r2, r9\n\
+ ldr r0, [r2]\n\
+ adds r0, r6\n\
+ adds r0, 0x4\n\
+ bl ReadUnalignedWord\n\
+ ldr r3, [sp, 0x4C]\n\
+ cmp r4, r0\n\
+ bne _080E8808\n\
+ ldr r4, [sp, 0xC]\n\
+ adds r4, 0x1\n\
+ str r4, [sp, 0xC]\n\
+ mov r5, r9\n\
+ ldr r0, [r5]\n\
+ mov r6, r10\n\
+ adds r2, r0, r6\n\
+ movs r0, 0x94\n\
+ lsls r0, 1\n\
+ adds r1, r2, r0\n\
+ ldrh r0, [r7, 0x8]\n\
+ ldrh r1, [r1]\n\
+ cmp r0, r1\n\
+ bcs _080E8808\n\
+ adds r0, r7, 0\n\
+ movs r4, 0x90\n\
+ lsls r4, 1\n\
+ adds r1, r2, r4\n\
+ ldm r1!, {r2,r5,r6}\n\
+ stm r0!, {r2,r5,r6}\n\
+ ldm r1!, {r4-r6}\n\
+ stm r0!, {r4-r6}\n\
+ ldr r1, [r1]\n\
+ str r1, [r0]\n\
+_080E8808:\n\
+ adds r7, 0x1C\n\
+ ldr r0, [sp, 0x40]\n\
+ adds r0, 0x1C\n\
+ str r0, [sp, 0x40]\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _080E878E\n\
+ ldr r1, [sp, 0xC]\n\
+ cmp r1, 0\n\
+ bne _080E8850\n\
+ mov r0, r8\n\
+ adds r0, 0x3\n\
+ lsls r1, r0, 3\n\
+ subs r1, r0\n\
+ lsls r1, 2\n\
+ ldr r2, [sp, 0x20]\n\
+ adds r1, r2\n\
+ ldr r3, [sp]\n\
+ adds r1, r3, r1\n\
+ ldr r0, =gUnknown_03001168\n\
+ ldr r4, [sp, 0x38]\n\
+ adds r0, r4, r0\n\
+ ldr r0, [r0]\n\
+ add r0, r10\n\
+ movs r5, 0xD8\n\
+ lsls r5, 3\n\
+ adds r1, r5\n\
+ movs r6, 0x90\n\
+ lsls r6, 1\n\
+ adds r0, r6\n\
+ ldm r0!, {r2-r4}\n\
+ stm r1!, {r2-r4}\n\
+ ldm r0!, {r2,r5,r6}\n\
+ stm r1!, {r2,r5,r6}\n\
+ ldr r0, [r0]\n\
+ str r0, [r1]\n\
+_080E8850:\n\
+ ldr r3, [sp, 0x30]\n\
+ mov r8, r3\n\
+ ldr r4, [sp, 0x24]\n\
+ cmp r8, r4\n\
+ blt _080E8766\n\
+_080E885A:\n\
+ ldr r5, [sp, 0x2C]\n\
+ str r5, [sp, 0x8]\n\
+ cmp r5, 0x1\n\
+ bgt _080E8864\n\
+ b _080E8702\n\
+_080E8864:\n\
+ add sp, 0x54\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\
+ .pool\n\
+ ");
+}
+
+static void sub_80E8880(struct UnknownRecMixingStruct *arg0, struct UnknownRecMixingStruct *arg1)
+{
+ s32 i, j;
+
+ for (i = 0; i < 3; i++)
+ {
+ s32 r2 = 0;
+ s32 r4 = -1;
+ for (j = 0; j < 6; j++)
+ {
+ if (arg1[j].field_4 > r2)
+ {
+ r4 = j;
+ r2 = arg1[j].field_4;
+ }
+ }
+
+ if (r4 >= 0)
+ {
+ arg0[i] = arg1[r4];
+ arg1[r4].field_4 = 0;
+ }
+ }
+}
+
+static void sub_80E88CC(struct UnknownRecMixingStruct2 *arg0, struct UnknownRecMixingStruct2 *arg1)
+{
+ s32 i, j;
+
+ for (i = 0; i < 3; i++)
+ {
+ s32 r2 = 0;
+ s32 r4 = -1;
+ for (j = 0; j < 6; j++)
+ {
+ if (arg1[j].field_8 > r2)
+ {
+ r4 = j;
+ r2 = arg1[j].field_8;
+ }
+ }
+
+ if (r4 >= 0)
+ {
+ arg0[i] = arg1[r4];
+ arg1[r4].field_8 = 0;
+ }
+ }
+}
+
+NAKED
+static void sub_80E8924(struct UnknownRecMixingStruct3 *arg0)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ mov r9, r0\n\
+ movs r0, 0\n\
+ ldr r1, =gSaveBlock2Ptr\n\
+ mov r10, r1\n\
+_080E8936:\n\
+ lsls r1, r0, 1\n\
+ adds r2, r0, 0x1\n\
+ mov r8, r2\n\
+ adds r1, r0\n\
+ lsls r0, r1, 5\n\
+ movs r2, 0x87\n\
+ lsls r2, 2\n\
+ adds r7, r0, r2\n\
+ lsls r1, 6\n\
+ mov r0, r9\n\
+ adds r4, r0, r1\n\
+ movs r6, 0\n\
+ movs r5, 0x1\n\
+_080E8950:\n\
+ mov r1, r10\n\
+ ldr r0, [r1]\n\
+ adds r0, r7\n\
+ adds r0, r6\n\
+ adds r1, r4, 0\n\
+ bl sub_80E8880\n\
+ adds r4, 0x60\n\
+ adds r6, 0x30\n\
+ subs r5, 0x1\n\
+ cmp r5, 0\n\
+ bge _080E8950\n\
+ mov r0, r8\n\
+ cmp r0, 0x8\n\
+ ble _080E8936\n\
+ movs r5, 0\n\
+ ldr r4, =gSaveBlock2Ptr\n\
+_080E8972:\n\
+ movs r0, 0x54\n\
+ adds r1, r5, 0\n\
+ muls r1, r0\n\
+ ldr r2, =0x0000057c\n\
+ adds r1, r2\n\
+ ldr r0, [r4]\n\
+ adds r0, r1\n\
+ movs r1, 0xA8\n\
+ muls r1, r5\n\
+ movs r2, 0xD8\n\
+ lsls r2, 3\n\
+ adds r1, r2\n\
+ add r1, r9\n\
+ bl sub_80E88CC\n\
+ adds r5, 0x1\n\
+ cmp r5, 0x1\n\
+ ble _080E8972\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\
+ .pool");
+}
+
+static void sub_80E89AC(struct UnkRecordMixingStruct2 *arg0, size_t arg1, u32 arg2)
+{
+ u8 linkPlayerCount = GetLinkPlayerCount();
+ struct UnknownRecMixingStruct3 *largeStructPtr = AllocZeroed(sizeof(struct UnknownRecMixingStruct3));
+
+ sub_80E8578(largeStructPtr, arg0, arg1, arg2, linkPlayerCount);
+ sub_80E8924(largeStructPtr);
+
+ Free(largeStructPtr);
+}
+
+static void sub_80E89F8(struct RecordMixingDayCareMail *dst)
+{
+ gUnknown_02039F9C.mail[0] = gSaveBlock1Ptr->daycare.mons[0].mail;
+ gUnknown_02039F9C.mail[1] = gSaveBlock1Ptr->daycare.mons[1].mail;
+ InitDaycareMailRecordMixing(&gSaveBlock1Ptr->daycare, &gUnknown_02039F9C);
+ *dst = *gUnknown_03001148;
+}
+
+static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src)
+{
+ s32 i;
+
+ for (i = 0; i < src->numDaycareMons; i++)
+ {
+ struct DayCareMail *mail = &src->mail[i];
+ if (mail->message.itemId != 0)
+ {
+ if (mail->gameLanguage != LANGUAGE_JAPANESE)
+ PadNameString(mail->OT_name, 0xFC);
+
+ ConvertInternationalString(mail->monName, mail->monLanguage);
+ }
+ }
+}
+
+static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src)
+{
+
+}
+
+static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *dst)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ struct UnknownPokemonStruct *towerMon = &dst->party[i];
+ if (towerMon->species != 0)
+ StripExtCtrlCodes(towerMon->nickname);
+ }
+
+ CalcEmeraldBattleTowerChecksum(dst);
+}
diff --git a/src/recorded_battle.c b/src/recorded_battle.c
index e843ff7cb..45b07ca7a 100644
--- a/src/recorded_battle.c
+++ b/src/recorded_battle.c
@@ -3,7 +3,7 @@
#include "recorded_battle.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "event_data.h"
#include "link.h"
#include "string_util.h"
@@ -13,23 +13,15 @@
#include "util.h"
#include "task.h"
#include "text.h"
+#include "battle_setup.h"
-#define BANK_RECORD_SIZE 664
+#define BATTLER_RECORD_SIZE 664
#define ILLEGAL_BATTLE_TYPES ((BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE \
| BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \
| BATTLE_TYPE_KYOGRE_GROUDON | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI \
| BATTLE_TYPE_RECORDED | BATTLE_TYPE_x4000000 | BATTLE_TYPE_SECRET_BASE \
- | BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYORGE | BATTLE_TYPE_RAYQUAZA))
-
-extern u32 gBattleTypeFlags;
-extern u16 gTrainerBattleOpponent_A;
-extern u16 gTrainerBattleOpponent_B;
-extern u16 gPartnerTrainerId;
-extern u8 gActiveBank;
-extern u8 gNoOfAllBanks;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
+ | BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYOGRE | BATTLE_TYPE_RAYQUAZA))
+
extern u8 gUnknown_03001278;
extern u8 gUnknown_03001279;
@@ -38,7 +30,7 @@ struct PlayerInfo
u32 trainerId;
u8 name[PLAYER_NAME_LENGTH];
u8 gender;
- u16 bank;
+ u16 battlerId;
u16 language;
};
@@ -52,13 +44,13 @@ struct RecordedBattleSave
{
struct Pokemon playerParty[PARTY_SIZE];
struct Pokemon opponentParty[PARTY_SIZE];
- u8 playersName[BATTLE_BANKS_COUNT][PLAYER_NAME_LENGTH];
- u8 playersGender[BATTLE_BANKS_COUNT];
- u32 playersTrainerId[BATTLE_BANKS_COUNT];
- u8 playersLanguage[BATTLE_BANKS_COUNT];
+ u8 playersName[MAX_BATTLERS_COUNT][PLAYER_NAME_LENGTH];
+ u8 playersGender[MAX_BATTLERS_COUNT];
+ u32 playersTrainerId[MAX_BATTLERS_COUNT];
+ u8 playersLanguage[MAX_BATTLERS_COUNT];
u32 rngSeed;
u32 battleFlags;
- u8 playersBank[BATTLE_BANKS_COUNT];
+ u8 playersBattlers[MAX_BATTLERS_COUNT];
u16 opponentA;
u16 opponentB;
u16 partnerId;
@@ -66,8 +58,8 @@ struct RecordedBattleSave
u8 field_4FC;
u8 field_4FD;
u8 field_4FE;
- u8 battleStyle : 1;
- u8 textSpeed : 3;
+ u8 battleStyle:1;
+ u8 textSpeed:3;
u32 AI_scripts;
u8 field_504[8];
u8 field_50C;
@@ -75,31 +67,31 @@ struct RecordedBattleSave
u16 field_50E[6];
u8 field_51A;
u8 field_51B;
- u8 battleRecord[BATTLE_BANKS_COUNT][BANK_RECORD_SIZE];
+ u8 battleRecord[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE];
u32 checksum;
};
EWRAM_DATA u32 gRecordedBattleRngSeed = 0;
EWRAM_DATA u32 gBattlePalaceMoveSelectionRngValue = 0;
-EWRAM_DATA static u8 sBattleRecords[BATTLE_BANKS_COUNT][BANK_RECORD_SIZE] = {0};
-EWRAM_DATA static u16 sRecordedBytesNo[BATTLE_BANKS_COUNT] = {0};
+EWRAM_DATA static u8 sBattleRecords[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE] = {0};
+EWRAM_DATA static u16 sRecordedBytesNo[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA static u16 sUnknown_0203C79C[4] = {0};
EWRAM_DATA static u16 sUnknown_0203C7A4[4] = {0};
EWRAM_DATA static u8 sUnknown_0203C7AC = 0;
EWRAM_DATA static u8 sUnknown_0203C7AD = 0;
-EWRAM_DATA static u8 sUnknown_0203C7AE = 0;
+EWRAM_DATA static u8 sFrontierFacility = 0;
EWRAM_DATA static u8 sUnknown_0203C7AF = 0;
EWRAM_DATA static MainCallback sCallback2_AfterRecordedBattle = NULL;
EWRAM_DATA u8 gUnknown_0203C7B4 = 0;
EWRAM_DATA static u8 sUnknown_0203C7B5 = 0;
-EWRAM_DATA static u8 sRecordedBattle_BattleStyle = 0;
-EWRAM_DATA static u8 sRecordedBattle_TextSpeed = 0;
-EWRAM_DATA static u32 sRecordedBattle_BattleFlags = 0;
-EWRAM_DATA static u32 sRecordedBattle_AI_Scripts = 0;
+EWRAM_DATA static u8 sBattleStyle = 0;
+EWRAM_DATA static u8 sTextSpeed = 0;
+EWRAM_DATA static u32 sBattleFlags = 0;
+EWRAM_DATA static u32 sAI_Scripts = 0;
EWRAM_DATA static struct Pokemon sSavedPlayerParty[PARTY_SIZE] = {0};
EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0};
-EWRAM_DATA static u16 sRecordedBattle_PlayerMonMoves[2][4] = {0};
-EWRAM_DATA static struct PlayerInfo sRecordedBattle_Players[BATTLE_BANKS_COUNT] = {0};
+EWRAM_DATA static u16 sPlayerMonMoves[2][4] = {0};
+EWRAM_DATA static struct PlayerInfo sPlayers[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA static u8 sUnknown_0203CCD0 = 0;
EWRAM_DATA static u8 sUnknown_0203CCD1[8] = {0};
EWRAM_DATA static u8 sUnknown_0203CCD9 = 0;
@@ -108,7 +100,6 @@ EWRAM_DATA static u16 sUnknown_0203CCDC[6] = {0};
EWRAM_DATA static u8 sUnknown_0203CCE8 = 0;
extern u32 sub_81A513C(void);
-extern void PlayMapChosenOrBattleBGM(bool8);
// this file's functions
static u8 sub_8185278(u8 *arg0, u8 *arg1, u8 *arg2);
@@ -123,7 +114,7 @@ void sub_8184DA4(u8 arg0)
sUnknown_0203C7AC = arg0;
sUnknown_0203CCD0 = 0;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
sRecordedBytesNo[i] = 0;
sUnknown_0203C79C[i] = 0;
@@ -131,12 +122,12 @@ void sub_8184DA4(u8 arg0)
if (arg0 == 1)
{
- for (j = 0; j < BANK_RECORD_SIZE; j++)
+ for (j = 0; j < BATTLER_RECORD_SIZE; j++)
{
sBattleRecords[i][j] |= 0xFF;
}
- sRecordedBattle_BattleFlags = gBattleTypeFlags;
- sRecordedBattle_AI_Scripts = gBattleResources->ai->aiFlags;
+ sBattleFlags = gBattleTypeFlags;
+ sAI_Scripts = gBattleResources->ai->aiFlags;
}
}
}
@@ -148,7 +139,7 @@ void sub_8184E58(void)
if (sUnknown_0203C7AC == 1)
{
gRecordedBattleRngSeed = gRngValue;
- sUnknown_0203C7AE = VarGet(VAR_FRONTIER_FACILITY);
+ sFrontierFacility = VarGet(VAR_FRONTIER_FACILITY);
sUnknown_0203C7AF = sub_81A513C();
}
else if (sUnknown_0203C7AC == 2)
@@ -164,77 +155,77 @@ void sub_8184E58(void)
gUnknown_0203C7B4 = GetMultiplayerId();
linkPlayersCount = GetLinkPlayerCount();
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- sRecordedBattle_Players[i].trainerId = gLinkPlayers[i].trainerId;
- sRecordedBattle_Players[i].gender = gLinkPlayers[i].gender;
- sRecordedBattle_Players[i].bank = gLinkPlayers[i].lp_field_18;
- sRecordedBattle_Players[i].language = gLinkPlayers[i].language;
+ sPlayers[i].trainerId = gLinkPlayers[i].trainerId;
+ sPlayers[i].gender = gLinkPlayers[i].gender;
+ sPlayers[i].battlerId = gLinkPlayers[i].id;
+ sPlayers[i].language = gLinkPlayers[i].language;
if (i < linkPlayersCount)
{
StringCopy(text, gLinkPlayers[i].name);
StripExtCtrlCodes(text);
- StringCopy(sRecordedBattle_Players[i].name, text);
+ StringCopy(sPlayers[i].name, text);
}
else
{
for (j = 0; j < PLAYER_NAME_LENGTH; j++)
- sRecordedBattle_Players[i].name[j] = gLinkPlayers[i].name[j];
+ sPlayers[i].name[j] = gLinkPlayers[i].name[j];
}
}
}
else
{
- sRecordedBattle_Players[0].trainerId = (gSaveBlock2Ptr->playerTrainerId[0])
+ sPlayers[0].trainerId = (gSaveBlock2Ptr->playerTrainerId[0])
| (gSaveBlock2Ptr->playerTrainerId[1] << 8)
| (gSaveBlock2Ptr->playerTrainerId[2] << 16)
| (gSaveBlock2Ptr->playerTrainerId[3] << 24);
- sRecordedBattle_Players[0].gender = gSaveBlock2Ptr->playerGender;
- sRecordedBattle_Players[0].bank = 0;
- sRecordedBattle_Players[0].language = gGameLanguage;
+ sPlayers[0].gender = gSaveBlock2Ptr->playerGender;
+ sPlayers[0].battlerId = 0;
+ sPlayers[0].language = gGameLanguage;
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
- sRecordedBattle_Players[0].name[i] = gSaveBlock2Ptr->playerName[i];
+ sPlayers[0].name[i] = gSaveBlock2Ptr->playerName[i];
}
}
-void RecordedBattle_SetBankAction(u8 bank, u8 action)
+void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action)
{
- if (sRecordedBytesNo[bank] < BANK_RECORD_SIZE && sUnknown_0203C7AC != 2)
+ if (sRecordedBytesNo[battlerId] < BATTLER_RECORD_SIZE && sUnknown_0203C7AC != 2)
{
- sBattleRecords[bank][sRecordedBytesNo[bank]++] = action;
+ sBattleRecords[battlerId][sRecordedBytesNo[battlerId]++] = action;
}
}
-void RecordedBattle_ClearBankAction(u8 bank, u8 bytesToClear)
+void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear)
{
s32 i;
for (i = 0; i < bytesToClear; i++)
{
- sRecordedBytesNo[bank]--;
- sBattleRecords[bank][sRecordedBytesNo[bank]] |= 0xFF;
- if (sRecordedBytesNo[bank] == 0)
+ sRecordedBytesNo[battlerId]--;
+ sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] |= 0xFF;
+ if (sRecordedBytesNo[battlerId] == 0)
break;
}
}
-u8 RecordedBattle_ReadBankAction(u8 bank)
+u8 RecordedBattle_GetBattlerAction(u8 battlerId)
{
- // trying to read past array or invalid action byte, battle is over
- if (sRecordedBytesNo[bank] >= BANK_RECORD_SIZE || sBattleRecords[bank][sRecordedBytesNo[bank]] == 0xFF)
+ // Trying to read past array or invalid action byte, battle is over.
+ if (sRecordedBytesNo[battlerId] >= BATTLER_RECORD_SIZE || sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] == 0xFF)
{
- gSpecialVar_Result = gBattleOutcome = BATTLE_PLAYER_TELEPORTED; // hah
+ gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; // hah
ResetPaletteFadeControl();
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
SetMainCallback2(CB2_QuitRecordedBattle);
return -1;
}
else
{
- return sBattleRecords[bank][sRecordedBytesNo[bank]++];
+ return sBattleRecords[battlerId][sRecordedBytesNo[battlerId]++];
}
}
@@ -248,7 +239,7 @@ u8 sub_81850DC(u8 *arg0)
u8 i, j;
u8 ret = 0;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (sRecordedBytesNo[i] != sUnknown_0203C79C[i])
{
@@ -350,41 +341,41 @@ u32 MoveRecordedBattleToSaveData(void)
battleSave->opponentParty[i] = sSavedOpponentParty[i];
}
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
for (j = 0; j < PLAYER_NAME_LENGTH; j++)
{
- battleSave->playersName[i][j] = sRecordedBattle_Players[i].name[j];
+ battleSave->playersName[i][j] = sPlayers[i].name[j];
}
- battleSave->playersGender[i] = sRecordedBattle_Players[i].gender;
- battleSave->playersLanguage[i] = sRecordedBattle_Players[i].language;
- battleSave->playersBank[i] = sRecordedBattle_Players[i].bank;
- battleSave->playersTrainerId[i] = sRecordedBattle_Players[i].trainerId;
+ battleSave->playersGender[i] = sPlayers[i].gender;
+ battleSave->playersLanguage[i] = sPlayers[i].language;
+ battleSave->playersBattlers[i] = sPlayers[i].battlerId;
+ battleSave->playersTrainerId[i] = sPlayers[i].trainerId;
}
battleSave->rngSeed = gRecordedBattleRngSeed;
- if (sRecordedBattle_BattleFlags & BATTLE_TYPE_LINK)
+ if (sBattleFlags & BATTLE_TYPE_LINK)
{
- battleSave->battleFlags = (sRecordedBattle_BattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_20));
+ battleSave->battleFlags = (sBattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_20));
battleSave->battleFlags |= BATTLE_TYPE_x2000000;
- if (sRecordedBattle_BattleFlags & BATTLE_TYPE_WILD)
+ if (sBattleFlags & BATTLE_TYPE_WILD)
{
battleSave->battleFlags |= BATTLE_TYPE_x80000000;
}
- else if (sRecordedBattle_BattleFlags & BATTLE_TYPE_MULTI)
+ else if (sBattleFlags & BATTLE_TYPE_MULTI)
{
- switch (sRecordedBattle_Players[0].bank)
+ switch (sPlayers[0].battlerId)
{
case 0:
case 2:
- if (!(sRecordedBattle_Players[gUnknown_0203C7B4].bank & 1))
+ if (!(sPlayers[gUnknown_0203C7B4].battlerId & 1))
battleSave->battleFlags |= BATTLE_TYPE_x80000000;
break;
case 1:
case 3:
- if ((sRecordedBattle_Players[gUnknown_0203C7B4].bank & 1))
+ if ((sPlayers[gUnknown_0203C7B4].battlerId & 1))
battleSave->battleFlags |= BATTLE_TYPE_x80000000;
break;
}
@@ -392,7 +383,7 @@ u32 MoveRecordedBattleToSaveData(void)
}
else
{
- battleSave->battleFlags = sRecordedBattle_BattleFlags;
+ battleSave->battleFlags = sBattleFlags;
}
battleSave->opponentA = gTrainerBattleOpponent_A;
@@ -400,11 +391,11 @@ u32 MoveRecordedBattleToSaveData(void)
battleSave->partnerId = gPartnerTrainerId;
battleSave->field_4FA = gUnknown_0203C7B4;
battleSave->field_4FC = gSaveBlock2Ptr->field_CA9_b;
- battleSave->field_4FD = sUnknown_0203C7AE;
+ battleSave->field_4FD = sFrontierFacility;
battleSave->field_4FE = sUnknown_0203C7AF;
battleSave->battleStyle = gSaveBlock2Ptr->optionsBattleStyle;
battleSave->textSpeed = gSaveBlock2Ptr->optionsTextSpeed;
- battleSave->AI_scripts = sRecordedBattle_AI_Scripts;
+ battleSave->AI_scripts = sAI_Scripts;
/* Can't match it without proper knowledge of the Saveblock 2.
if (gTrainerBattleOpponent_A >= 300 && gTrainerBattleOpponent_A <= 399)
@@ -484,7 +475,7 @@ u32 MoveRecordedBattleToSaveData(void)
}
#else
-__attribute__((naked))
+NAKED
u32 MoveRecordedBattleToSaveData(void)
{
asm(".syntax unified\n\
@@ -534,7 +525,7 @@ _0818535E:\n\
lsls r3, 3\n\
adds r3, r7, r3\n\
str r3, [sp, 0x8]\n\
- ldr r5, =sRecordedBattle_Players\n\
+ ldr r5, =sPlayers\n\
mov r8, r6\n\
mov r12, r6\n\
movs r4, 0x96\n\
@@ -545,7 +536,7 @@ _0818535E:\n\
adds r4, r7, r0\n\
_081853AC:\n\
lsls r1, r6, 3\n\
- ldr r0, =sRecordedBattle_Players\n\
+ ldr r0, =sPlayers\n\
adds r0, 0x4\n\
mov r3, r8\n\
adds r2, r3, r0\n\
@@ -587,7 +578,7 @@ _081853BA:\n\
ldr r5, =gRecordedBattleRngSeed\n\
ldr r0, [r5]\n\
str r0, [r1]\n\
- ldr r0, =sRecordedBattle_BattleFlags\n\
+ ldr r0, =sBattleFlags\n\
ldr r2, [r0]\n\
movs r0, 0x2\n\
ands r0, r2\n\
@@ -617,7 +608,7 @@ _08185454:\n\
ands r2, r0\n\
cmp r2, 0\n\
beq _081854E2\n\
- ldr r2, =sRecordedBattle_Players\n\
+ ldr r2, =sPlayers\n\
ldrh r0, [r2, 0xE]\n\
cmp r0, 0x1\n\
beq _081854A8\n\
@@ -639,7 +630,7 @@ _0818547E:\n\
lsls r0, r1, 2\n\
adds r0, r1\n\
lsls r0, 2\n\
- ldr r4, =sRecordedBattle_Players\n\
+ ldr r4, =sPlayers\n\
adds r0, r4\n\
ldrh r1, [r0, 0xE]\n\
movs r0, 0x1\n\
@@ -656,7 +647,7 @@ _081854A8:\n\
lsls r0, r1, 2\n\
adds r0, r1\n\
lsls r0, 2\n\
- ldr r1, =sRecordedBattle_Players\n\
+ ldr r1, =sPlayers\n\
adds r0, r1\n\
ldrh r1, [r0, 0xE]\n\
movs r0, 0x1\n\
@@ -709,7 +700,7 @@ _081854E2:\n\
ldr r5, =0x000004fc\n\
adds r1, r7, r5\n\
strb r0, [r1]\n\
- ldr r0, =sUnknown_0203C7AE\n\
+ ldr r0, =sFrontierFacility\n\
ldrb r1, [r0]\n\
adds r2, 0x3\n\
adds r0, r7, r2\n\
@@ -744,7 +735,7 @@ _081854E2:\n\
movs r2, 0xA0\n\
lsls r2, 3\n\
adds r1, r7, r2\n\
- ldr r3, =sRecordedBattle_AI_Scripts\n\
+ ldr r3, =sAI_Scripts\n\
ldr r0, [r3]\n\
str r0, [r1]\n\
ldr r4, =0xfffffed4\n\
@@ -1302,7 +1293,7 @@ static bool32 AllocTryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst)
static void CB2_RecordedBattleEnd(void)
{
- gSaveBlock2Ptr->frontierChosenLvl = sUnknown_0203C7AD;
+ gSaveBlock2Ptr->frontier.chosenLvl = sUnknown_0203C7AD;
gBattleOutcome = 0;
gBattleTypeFlags = 0;
gTrainerBattleOpponent_A = 0;
@@ -1339,7 +1330,7 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src)
gEnemyParty[i] = src->opponentParty[i];
}
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
for (var = FALSE, j = 0; j < PLAYER_NAME_LENGTH; j++)
{
@@ -1349,7 +1340,7 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src)
}
gLinkPlayers[i].gender = src->playersGender[i];
gLinkPlayers[i].language = src->playersLanguage[i];
- gLinkPlayers[i].lp_field_18 = src->playersBank[i];
+ gLinkPlayers[i].id = src->playersBattlers[i];
gLinkPlayers[i].trainerId = src->playersTrainerId[i];
if (var)
@@ -1362,12 +1353,12 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src)
gTrainerBattleOpponent_B = src->opponentB;
gPartnerTrainerId = src->partnerId;
gUnknown_0203C7B4 = src->field_4FA;
- sUnknown_0203C7AD = gSaveBlock2Ptr->frontierChosenLvl;
- sUnknown_0203C7AE = src->field_4FD;
+ sUnknown_0203C7AD = gSaveBlock2Ptr->frontier.chosenLvl;
+ sFrontierFacility = src->field_4FD;
sUnknown_0203C7AF = src->field_4FE;
- sRecordedBattle_BattleStyle = src->battleStyle;
- sRecordedBattle_TextSpeed = src->textSpeed;
- sRecordedBattle_AI_Scripts = src->AI_scripts;
+ sBattleStyle = src->battleStyle;
+ sTextSpeed = src->textSpeed;
+ sAI_Scripts = src->AI_scripts;
for (i = 0; i < 8; i++)
{
@@ -1384,11 +1375,11 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src)
sUnknown_0203CCDC[i] = src->field_50E[i];
}
- gSaveBlock2Ptr->frontierChosenLvl = src->field_4FC;
+ gSaveBlock2Ptr->frontier.chosenLvl = src->field_4FC;
- for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
- for (j = 0; j < BANK_RECORD_SIZE; j++)
+ for (j = 0; j < BATTLER_RECORD_SIZE; j++)
{
sBattleRecords[i][j] = src->battleRecord[i][j];
}
@@ -1424,9 +1415,9 @@ static void CB2_RecordedBattle(void)
RunTasks();
}
-u8 sub_8185EA0(void)
+u8 GetRecordedBattleFrontierFacility(void)
{
- return sUnknown_0203C7AE;
+ return sFrontierFacility;
}
u8 sub_8185EAC(void)
@@ -1456,13 +1447,13 @@ static void RecordedBattle_RestoreSavedParties(void)
}
}
-u8 GetActiveBankLinkPlayerGender(void)
+u8 GetActiveBattlerLinkPlayerGender(void)
{
s32 i;
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
- if (gLinkPlayers[i].lp_field_18 == gActiveBank)
+ if (gLinkPlayers[i].id == gActiveBattler)
break;
}
@@ -1489,19 +1480,19 @@ u8 sub_8185FAC(void)
u8 GetBattleStyleInRecordedBattle(void)
{
- return sRecordedBattle_BattleStyle;
+ return sBattleStyle;
}
u8 GetTextSpeedInRecordedBattle(void)
{
- return sRecordedBattle_TextSpeed;
+ return sTextSpeed;
}
-void RecordedBattle_CopyBankMoves(void)
+void RecordedBattle_CopyBattlerMoves(void)
{
s32 i;
- if (GetBankSide(gActiveBank) == SIDE_OPPONENT)
+ if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
return;
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
return;
@@ -1510,7 +1501,7 @@ void RecordedBattle_CopyBankMoves(void)
for (i = 0; i < 4; i++)
{
- sRecordedBattle_PlayerMonMoves[gActiveBank / 2][i] = gBattleMons[gActiveBank].moves[i];
+ sPlayerMonMoves[gActiveBattler / 2][i] = gBattleMons[gActiveBattler].moves[i];
}
}
@@ -1518,32 +1509,32 @@ void RecordedBattle_CopyBankMoves(void)
void sub_818603C(u8 arg0)
{
- s32 bank, j, k;
+ s32 battlerId, j, k;
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
return;
- for (bank = 0; bank < gNoOfAllBanks; bank++)
+ for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
{
- if (GetBankSide(bank) != SIDE_OPPONENT) // player's side only
+ if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT) // player's side only
{
if (arg0 == 1)
{
for (j = 0; j < 4; j++)
{
- if (gBattleMons[bank].moves[j] != sRecordedBattle_PlayerMonMoves[bank / 2][j])
+ if (gBattleMons[battlerId].moves[j] != sPlayerMonMoves[battlerId / 2][j])
break;
}
if (j != 4) // player's mon's move has been changed
{
- RecordedBattle_SetBankAction(bank, ACTION_MOVE_CHANGE);
+ RecordedBattle_SetBattlerAction(battlerId, ACTION_MOVE_CHANGE);
for (j = 0; j < 4; j++)
{
for (k = 0; k < 4; k++)
{
- if (gBattleMons[bank].moves[j] == sRecordedBattle_PlayerMonMoves[bank / 2][k])
+ if (gBattleMons[battlerId].moves[j] == sPlayerMonMoves[battlerId / 2][k])
{
- RecordedBattle_SetBankAction(bank, k);
+ RecordedBattle_SetBattlerAction(battlerId, k);
break;
}
}
@@ -1552,7 +1543,7 @@ void sub_818603C(u8 arg0)
}
else
{
- if (sBattleRecords[bank][sRecordedBytesNo[bank]] == ACTION_MOVE_CHANGE)
+ if (sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] == ACTION_MOVE_CHANGE)
{
u8 ppBonuses[4];
u8 array1[4];
@@ -1561,58 +1552,58 @@ void sub_818603C(u8 arg0)
u8 array3[8];
u8 var;
- RecordedBattle_ReadBankAction(bank);
+ RecordedBattle_GetBattlerAction(battlerId);
for (j = 0; j < 4; j++)
{
- ppBonuses[j] = ((gBattleMons[bank].ppBonuses & ((3 << (j << 1)))) >> (j << 1));
+ ppBonuses[j] = ((gBattleMons[battlerId].ppBonuses & ((3 << (j << 1)))) >> (j << 1));
}
for (j = 0; j < 4; j++)
{
- array1[j] = RecordedBattle_ReadBankAction(bank);
- movePp.moves[j] = gBattleMons[bank].moves[array1[j]];
- movePp.pp[j] = gBattleMons[bank].pp[array1[j]];
+ array1[j] = RecordedBattle_GetBattlerAction(battlerId);
+ movePp.moves[j] = gBattleMons[battlerId].moves[array1[j]];
+ movePp.pp[j] = gBattleMons[battlerId].pp[array1[j]];
array3[j] = ppBonuses[array1[j]];
- array2[j] = (gDisableStructs[bank].unk18_b & gBitTable[j]) >> j;
+ array2[j] = (gDisableStructs[battlerId].unk18_b & gBitTable[j]) >> j;
}
for (j = 0; j < 4; j++)
{
- gBattleMons[bank].moves[j] = movePp.moves[j];
- gBattleMons[bank].pp[j] = movePp.pp[j];
+ gBattleMons[battlerId].moves[j] = movePp.moves[j];
+ gBattleMons[battlerId].pp[j] = movePp.pp[j];
}
- gBattleMons[bank].ppBonuses = 0;
- gDisableStructs[bank].unk18_b = 0;
+ gBattleMons[battlerId].ppBonuses = 0;
+ gDisableStructs[battlerId].unk18_b = 0;
for (j = 0; j < 4; j++)
{
- gBattleMons[bank].ppBonuses |= (array3[j]) << (j << 1);
- gDisableStructs[bank].unk18_b |= (array2[j]) << (j);
+ gBattleMons[battlerId].ppBonuses |= (array3[j]) << (j << 1);
+ gDisableStructs[battlerId].unk18_b |= (array2[j]) << (j);
}
- if (!(gBattleMons[bank].status2 & STATUS2_TRANSFORMED))
+ if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED))
{
for (j = 0; j < 4; j++)
{
- ppBonuses[j] = ((GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1));
+ ppBonuses[j] = ((GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1));
}
for (j = 0; j < 4; j++)
{
- movePp.moves[j] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_MOVE1 + array1[j], NULL);
- movePp.pp[j] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP1 + array1[j], NULL);
+ movePp.moves[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + array1[j], NULL);
+ movePp.pp[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + array1[j], NULL);
array3[j] = ppBonuses[array1[j]];
}
for (j = 0; j < 4; j++)
{
- SetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_MOVE1 + j, &movePp.moves[j]);
- SetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP1 + j, &movePp.pp[j]);
+ SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + j, &movePp.moves[j]);
+ SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + j, &movePp.pp[j]);
}
var = 0;
for (j = 0; j < 4; j++)
{
var |= (array3[j]) << (j << 1);
}
- SetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP_BONUSES, &var);
+ SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, &var);
}
- gChosenMovesByBanks[bank] = gBattleMons[bank].moves[*(gBattleStruct->chosenMovePositions + bank)];
+ gChosenMoveByBattler[battlerId] = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)];
}
}
}
@@ -1621,7 +1612,7 @@ void sub_818603C(u8 arg0)
u32 GetAiScriptsInRecordedBattle(void)
{
- return sRecordedBattle_AI_Scripts;
+ return sAI_Scripts;
}
void sub_8186444(void)
diff --git a/src/region_map.c b/src/region_map.c
index da96475c0..5176d4996 100644
--- a/src/region_map.c
+++ b/src/region_map.c
@@ -1,28 +1,27 @@
-
-// Includes
#include "global.h"
#include "main.h"
+#include "text.h"
#include "menu.h"
#include "malloc.h"
#include "gpu_regs.h"
#include "palette.h"
#include "party_menu.h"
#include "trig.h"
-#include "map_constants.h"
+#include "constants/maps.h"
#include "overworld.h"
-#include "flags.h"
+#include "constants/flags.h"
#include "event_data.h"
#include "rom6.h"
#include "secret_base.h"
#include "string_util.h"
#include "international_string_util.h"
#include "strings.h"
-#include "text.h"
#include "text_window.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "m4a.h"
#include "field_effect.h"
#include "region_map.h"
+#include "constants/region_map_sections.h"
#define MAP_WIDTH 28
#define MAP_HEIGHT 15
@@ -241,59 +240,59 @@ static const u8 sRegionMapFrameTilemapLZ[] = INCBIN_U8("graphics/pokenav/map_fra
static const u16 Unknown_085A1D48[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal");
-static const u8 gUnknown_085A1D68[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz");
-
-static const u8 gUnknown_085A1E3C[][3] = {
- {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 1},
- {MAP_GROUP_OLDALE_TOWN, MAP_ID_OLDALE_TOWN, 14},
- {MAP_GROUP_DEWFORD_TOWN, MAP_ID_DEWFORD_TOWN, 15},
- {MAP_GROUP_LAVARIDGE_TOWN, MAP_ID_LAVARIDGE_TOWN, 16},
- {MAP_GROUP_FALLARBOR_TOWN, MAP_ID_FALLARBOR_TOWN, 17},
- {MAP_GROUP_VERDANTURF_TOWN, MAP_ID_VERDANTURF_TOWN, 18},
- {MAP_GROUP_PACIFIDLOG_TOWN, MAP_ID_PACIFIDLOG_TOWN, 19},
- {MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, 3},
- {MAP_GROUP_SLATEPORT_CITY, MAP_ID_SLATEPORT_CITY, 4},
- {MAP_GROUP_MAUVILLE_CITY, MAP_ID_MAUVILLE_CITY, 5},
- {MAP_GROUP_RUSTBORO_CITY, MAP_ID_RUSTBORO_CITY, 6},
- {MAP_GROUP_FORTREE_CITY, MAP_ID_FORTREE_CITY, 7},
- {MAP_GROUP_LILYCOVE_CITY, MAP_ID_LILYCOVE_CITY, 8},
- {MAP_GROUP_MOSSDEEP_CITY, MAP_ID_MOSSDEEP_CITY, 9},
- {MAP_GROUP_SOOTOPOLIS_CITY, MAP_ID_SOOTOPOLIS_CITY, 10},
- {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 11},
- {MAP_GROUP_ROUTE101, MAP_ID_ROUTE101, 0},
- {MAP_GROUP_ROUTE102, MAP_ID_ROUTE102, 0},
- {MAP_GROUP_ROUTE103, MAP_ID_ROUTE103, 0},
- {MAP_GROUP_ROUTE104, MAP_ID_ROUTE104, 0},
- {MAP_GROUP_ROUTE105, MAP_ID_ROUTE105, 0},
- {MAP_GROUP_ROUTE106, MAP_ID_ROUTE106, 0},
- {MAP_GROUP_ROUTE107, MAP_ID_ROUTE107, 0},
- {MAP_GROUP_ROUTE108, MAP_ID_ROUTE108, 0},
- {MAP_GROUP_ROUTE109, MAP_ID_ROUTE109, 0},
- {MAP_GROUP_ROUTE110, MAP_ID_ROUTE110, 0},
- {MAP_GROUP_ROUTE111, MAP_ID_ROUTE111, 0},
- {MAP_GROUP_ROUTE112, MAP_ID_ROUTE112, 0},
- {MAP_GROUP_ROUTE113, MAP_ID_ROUTE113, 0},
- {MAP_GROUP_ROUTE114, MAP_ID_ROUTE114, 0},
- {MAP_GROUP_ROUTE115, MAP_ID_ROUTE115, 0},
- {MAP_GROUP_ROUTE116, MAP_ID_ROUTE116, 0},
- {MAP_GROUP_ROUTE117, MAP_ID_ROUTE117, 0},
- {MAP_GROUP_ROUTE118, MAP_ID_ROUTE118, 0},
- {MAP_GROUP_ROUTE119, MAP_ID_ROUTE119, 0},
- {MAP_GROUP_ROUTE120, MAP_ID_ROUTE120, 0},
- {MAP_GROUP_ROUTE121, MAP_ID_ROUTE121, 0},
- {MAP_GROUP_ROUTE122, MAP_ID_ROUTE122, 0},
- {MAP_GROUP_ROUTE123, MAP_ID_ROUTE123, 0},
- {MAP_GROUP_ROUTE124, MAP_ID_ROUTE124, 0},
- {MAP_GROUP_ROUTE125, MAP_ID_ROUTE125, 0},
- {MAP_GROUP_ROUTE126, MAP_ID_ROUTE126, 0},
- {MAP_GROUP_ROUTE127, MAP_ID_ROUTE127, 0},
- {MAP_GROUP_ROUTE128, MAP_ID_ROUTE128, 0},
- {MAP_GROUP_ROUTE129, MAP_ID_ROUTE129, 0},
- {MAP_GROUP_ROUTE130, MAP_ID_ROUTE130, 0},
- {MAP_GROUP_ROUTE131, MAP_ID_ROUTE131, 0},
- {MAP_GROUP_ROUTE132, MAP_ID_ROUTE132, 0},
- {MAP_GROUP_ROUTE133, MAP_ID_ROUTE133, 0},
- {MAP_GROUP_ROUTE134, MAP_ID_ROUTE134, 0}
+static const u8 sUnknown_085A1D68[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz");
+
+static const u8 sUnknown_085A1E3C[][3] = {
+ {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 1},
+ {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 14},
+ {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 15},
+ {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 16},
+ {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 17},
+ {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 18},
+ {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 19},
+ {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 3},
+ {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 4},
+ {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 5},
+ {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 6},
+ {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 7},
+ {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 8},
+ {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 9},
+ {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 10},
+ {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 11},
+ {MAP_GROUP(ROUTE101), MAP_NUM(ROUTE101), 0},
+ {MAP_GROUP(ROUTE102), MAP_NUM(ROUTE102), 0},
+ {MAP_GROUP(ROUTE103), MAP_NUM(ROUTE103), 0},
+ {MAP_GROUP(ROUTE104), MAP_NUM(ROUTE104), 0},
+ {MAP_GROUP(ROUTE105), MAP_NUM(ROUTE105), 0},
+ {MAP_GROUP(ROUTE106), MAP_NUM(ROUTE106), 0},
+ {MAP_GROUP(ROUTE107), MAP_NUM(ROUTE107), 0},
+ {MAP_GROUP(ROUTE108), MAP_NUM(ROUTE108), 0},
+ {MAP_GROUP(ROUTE109), MAP_NUM(ROUTE109), 0},
+ {MAP_GROUP(ROUTE110), MAP_NUM(ROUTE110), 0},
+ {MAP_GROUP(ROUTE111), MAP_NUM(ROUTE111), 0},
+ {MAP_GROUP(ROUTE112), MAP_NUM(ROUTE112), 0},
+ {MAP_GROUP(ROUTE113), MAP_NUM(ROUTE113), 0},
+ {MAP_GROUP(ROUTE114), MAP_NUM(ROUTE114), 0},
+ {MAP_GROUP(ROUTE115), MAP_NUM(ROUTE115), 0},
+ {MAP_GROUP(ROUTE116), MAP_NUM(ROUTE116), 0},
+ {MAP_GROUP(ROUTE117), MAP_NUM(ROUTE117), 0},
+ {MAP_GROUP(ROUTE118), MAP_NUM(ROUTE118), 0},
+ {MAP_GROUP(ROUTE119), MAP_NUM(ROUTE119), 0},
+ {MAP_GROUP(ROUTE120), MAP_NUM(ROUTE120), 0},
+ {MAP_GROUP(ROUTE121), MAP_NUM(ROUTE121), 0},
+ {MAP_GROUP(ROUTE122), MAP_NUM(ROUTE122), 0},
+ {MAP_GROUP(ROUTE123), MAP_NUM(ROUTE123), 0},
+ {MAP_GROUP(ROUTE124), MAP_NUM(ROUTE124), 0},
+ {MAP_GROUP(ROUTE125), MAP_NUM(ROUTE125), 0},
+ {MAP_GROUP(ROUTE126), MAP_NUM(ROUTE126), 0},
+ {MAP_GROUP(ROUTE127), MAP_NUM(ROUTE127), 0},
+ {MAP_GROUP(ROUTE128), MAP_NUM(ROUTE128), 0},
+ {MAP_GROUP(ROUTE129), MAP_NUM(ROUTE129), 0},
+ {MAP_GROUP(ROUTE130), MAP_NUM(ROUTE130), 0},
+ {MAP_GROUP(ROUTE131), MAP_NUM(ROUTE131), 0},
+ {MAP_GROUP(ROUTE132), MAP_NUM(ROUTE132), 0},
+ {MAP_GROUP(ROUTE133), MAP_NUM(ROUTE133), 0},
+ {MAP_GROUP(ROUTE134), MAP_NUM(ROUTE134), 0}
};
static const u8 *const gUnknown_085A1ED4[] = {
@@ -308,7 +307,7 @@ static const struct {
} gUnknown_085A1EDC[] = {
gUnknown_085A1ED4,
MAPSEC_EVER_GRANDE_CITY,
- FLAG_SYS_POKEMON_LEAGUE_FLY
+ FLAG_LANDMARK_POKEMON_LEAGUE
};
static const struct BgTemplate gUnknown_085A1EE4[] = {
@@ -328,8 +327,8 @@ static const struct SpritePalette gUnknown_085A1F10 = {
Unknown_085A1D48, 2
};
-static const u16 gUnknown_085A1F18[][2] = {
- {FLAG_UNLOCK_BATTLE_FRONTIER, MAPSEC_BATTLE_FRONTIER},
+static const u16 sUnknown_085A1F18[][2] = {
+ {FLAG_LANDMARK_BATTLE_FRONTIER, MAPSEC_BATTLE_FRONTIER},
{-1, MAPSEC_NONE}
};
@@ -873,16 +872,16 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
u16 xOnMap;
struct WarpData *storedWarp;
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_SS_TIDAL_CORRIDOR
- && (gSaveBlock1Ptr->location.mapNum == MAP_ID_SS_TIDAL_CORRIDOR
- || gSaveBlock1Ptr->location.mapNum == MAP_ID_SS_TIDAL_LOWER_DECK
- || gSaveBlock1Ptr->location.mapNum == MAP_ID_SS_TIDAL_ROOMS))
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SS_TIDAL_CORRIDOR)
+ && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_LOWER_DECK)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_ROOMS)))
{
RegionMap_InitializeStateBasedOnSSTidalLocation();
return;
}
- switch (get_map_light_level_by_bank_and_number(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum))
+ switch (GetMapTypeByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum))
{
default:
case 1:
@@ -892,8 +891,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
case 6:
gRegionMap->mapSecId = gMapHeader.regionMapSectionId;
gRegionMap->playerIsInCave = FALSE;
- mapWidth = gMapHeader.mapData->width;
- mapHeight = gMapHeader.mapData->height;
+ mapWidth = gMapHeader.mapLayout->width;
+ mapHeight = gMapHeader.mapLayout->height;
x = gSaveBlock1Ptr->pos.x;
y = gSaveBlock1Ptr->pos.y;
if (gRegionMap->mapSecId == MAPSEC_UNDERWATER_128 || gRegionMap->mapSecId == MAPSEC_UNDERWATER_MARINE_CAVE)
@@ -905,11 +904,11 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
case 7:
if (gMapHeader.flags & 0x02)
{
- mapHeader = get_mapheader_by_bank_and_number(gSaveBlock1Ptr->warp4.mapGroup, gSaveBlock1Ptr->warp4.mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp4.mapGroup, gSaveBlock1Ptr->warp4.mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
gRegionMap->playerIsInCave = TRUE;
- mapWidth = mapHeader->mapData->width;
- mapHeight = mapHeader->mapData->height;
+ mapWidth = mapHeader->mapLayout->width;
+ mapHeight = mapHeader->mapLayout->height;
x = gSaveBlock1Ptr->warp4.x;
y = gSaveBlock1Ptr->warp4.y;
}
@@ -924,11 +923,11 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
}
break;
case 9:
- mapHeader = get_mapheader_by_bank_and_number((u16)gSaveBlock1Ptr->warp2.mapGroup, (u16)gSaveBlock1Ptr->warp2.mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId((u16)gSaveBlock1Ptr->warp2.mapGroup, (u16)gSaveBlock1Ptr->warp2.mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
gRegionMap->playerIsInCave = TRUE;
- mapWidth = mapHeader->mapData->width;
- mapHeight = mapHeader->mapData->height;
+ mapWidth = mapHeader->mapLayout->width;
+ mapHeight = mapHeader->mapLayout->height;
x = gSaveBlock1Ptr->warp2.x;
y = gSaveBlock1Ptr->warp2.y;
break;
@@ -938,12 +937,12 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
if (gRegionMap->mapSecId != MAPSEC_DYNAMIC)
{
storedWarp = &gSaveBlock1Ptr->warp4;
- mapHeader = get_mapheader_by_bank_and_number(storedWarp->mapGroup, storedWarp->mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(storedWarp->mapGroup, storedWarp->mapNum);
}
else
{
storedWarp = &gSaveBlock1Ptr->warp2;
- mapHeader = get_mapheader_by_bank_and_number(storedWarp->mapGroup, storedWarp->mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(storedWarp->mapGroup, storedWarp->mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
}
if (RegionMap_IsPlayerInCave(gRegionMap->mapSecId))
@@ -954,8 +953,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
{
gRegionMap->playerIsInCave = FALSE;
}
- mapWidth = mapHeader->mapData->width;
- mapHeight = mapHeader->mapData->height;
+ mapWidth = mapHeader->mapLayout->width;
+ mapHeight = mapHeader->mapLayout->height;
x = storedWarp->x;
y = storedWarp->y;
break;
@@ -1066,17 +1065,17 @@ static void RegionMap_InitializeStateBasedOnSSTidalLocation(void)
break;
default:
case 0:
- mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
- dimensionScale = mapHeader->mapData->width / gRegionMapEntries[gRegionMap->mapSecId].width;
+ dimensionScale = mapHeader->mapLayout->width / gRegionMapEntries[gRegionMap->mapSecId].width;
if (dimensionScale == 0)
dimensionScale = 1;
x = xOnMap / dimensionScale;
if (x >= gRegionMapEntries[gRegionMap->mapSecId].width)
x = gRegionMapEntries[gRegionMap->mapSecId].width - 1;
- dimensionScale = mapHeader->mapData->height / gRegionMapEntries[gRegionMap->mapSecId].height;
+ dimensionScale = mapHeader->mapLayout->height / gRegionMapEntries[gRegionMap->mapSecId].height;
if (dimensionScale == 0)
dimensionScale = 1;
y = yOnMap / dimensionScale;
@@ -1128,9 +1127,9 @@ static u8 get_flagnr_blue_points(u16 mapSecId)
case MAPSEC_EVER_GRANDE_CITY:
return FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) ? MAPSECTYPE_CITY_CANFLY : MAPSECTYPE_CITY_CANTFLY;
case MAPSEC_BATTLE_FRONTIER:
- return FlagGet(FLAG_UNLOCK_BATTLE_FRONTIER) ? MAPSECTYPE_BATTLE_FRONTIER : MAPSECTYPE_NONE;
+ return FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER) ? MAPSECTYPE_BATTLE_FRONTIER : MAPSECTYPE_NONE;
case MAPSEC_SOUTHERN_ISLAND:
- return FlagGet(FLAG_UNLOCK_SOUTHERN_ISLAND) ? MAPSECTYPE_PLAIN : MAPSECTYPE_NONE;
+ return FlagGet(FLAG_LANDMARK_SOUTHERN_ISLAND) ? MAPSECTYPE_PLAIN : MAPSECTYPE_NONE;
default:
return MAPSECTYPE_PLAIN;
}
@@ -1334,9 +1333,9 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag)
gRegionMap->cursorSprite->pos1.x = 8 * gRegionMap->cursorPosX + 4;
gRegionMap->cursorSprite->pos1.y = 8 * gRegionMap->cursorPosY + 4;
}
- gRegionMap->cursorSprite->data1 = 2;
- gRegionMap->cursorSprite->data2 = (IndexOfSpritePaletteTag(paletteTag) << 4) + 0x101;
- gRegionMap->cursorSprite->data3 = TRUE;
+ gRegionMap->cursorSprite->data[1] = 2;
+ gRegionMap->cursorSprite->data[2] = (IndexOfSpritePaletteTag(paletteTag) << 4) + 0x101;
+ gRegionMap->cursorSprite->data[3] = TRUE;
}
}
@@ -1352,12 +1351,12 @@ static void FreeRegionMapCursorSprite(void)
void sub_8124268(void)
{
- gRegionMap->cursorSprite->data3 = TRUE;
+ gRegionMap->cursorSprite->data[3] = TRUE;
}
void sub_8124278(void)
{
- gRegionMap->cursorSprite->data3 = FALSE;
+ gRegionMap->cursorSprite->data[3] = FALSE;
}
void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag)
@@ -1431,17 +1430,17 @@ static void RegionMapPlayerIconSpriteCallback_Zoomed(struct Sprite *sprite)
{
sprite->pos2.x = -2 * gRegionMap->scrollX;
sprite->pos2.y = -2 * gRegionMap->scrollY;
- sprite->data0 = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
- sprite->data1 = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
- if (sprite->data0 < -8 || sprite->data0 > 0xa8 || sprite->data1 < -8 || sprite->data1 > 0xf8)
+ sprite->data[0] = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ sprite->data[1] = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ if (sprite->data[0] < -8 || sprite->data[0] > 0xa8 || sprite->data[1] < -8 || sprite->data[1] > 0xf8)
{
- sprite->data2 = FALSE;
+ sprite->data[2] = FALSE;
}
else
{
- sprite->data2 = TRUE;
+ sprite->data[2] = TRUE;
}
- if (sprite->data2 == TRUE)
+ if (sprite->data[2] == TRUE)
{
RegionMapPlayerIconSpriteCallback(sprite);
}
@@ -1460,9 +1459,9 @@ static void RegionMapPlayerIconSpriteCallback(struct Sprite *sprite)
{
if (gRegionMap->blinkPlayerIcon)
{
- if (++sprite->data7 > 16)
+ if (++sprite->data[7] > 16)
{
- sprite->data7 = 0;
+ sprite->data[7] = 0;
sprite->invisible = sprite->invisible ? FALSE : TRUE;
}
}
@@ -1582,7 +1581,7 @@ void MCB2_FlyMap(void)
gUnknown_0203A148 = malloc(sizeof(*gUnknown_0203A148));
if (gUnknown_0203A148 == NULL)
{
- SetMainCallback2(sub_8086194);
+ SetMainCallback2(CB2_ReturnToFieldWithOpenMenu);
}
else
{
@@ -1604,7 +1603,7 @@ void MCB2_FlyMap(void)
gMain.state++;
break;
case 3:
- sub_809882C(0, 0x65, 0xd0);
+ LoadUserWindowBorderGfx(0, 0x65, 0xd0);
clear_scheduled_bg_copies_to_vram();
gMain.state++;
break;
@@ -1740,7 +1739,7 @@ static void sub_8124A70(void)
{
struct SpriteSheet sheet;
- LZ77UnCompWram(gUnknown_085A1D68, gUnknown_0203A148->unk_88c);
+ LZ77UnCompWram(sUnknown_085A1D68, gUnknown_0203A148->unk_88c);
sheet.data = gUnknown_0203A148->unk_88c;
sheet.size = 0x1c0;
sheet.tag = 2;
@@ -1792,7 +1791,7 @@ static void sub_8124AD4(void)
shape += 3;
}
StartSpriteAnim(&gSprites[spriteId], shape);
- gSprites[spriteId].data0 = i;
+ gSprites[spriteId].data[0] = i;
}
canFlyFlag++;
}
@@ -1808,11 +1807,11 @@ static void sub_8124BE4(void)
u16 mapSecId;
u8 spriteId;
- for (i = 0; gUnknown_085A1F18[i][1] != MAPSEC_NONE; i++)
+ for (i = 0; sUnknown_085A1F18[i][1] != MAPSEC_NONE; i++)
{
- if (FlagGet(gUnknown_085A1F18[i][0]))
+ if (FlagGet(sUnknown_085A1F18[i][0]))
{
- mapSecId = gUnknown_085A1F18[i][1];
+ mapSecId = sUnknown_085A1F18[i][1];
sub_8124630(mapSecId, &x, &y, &width, &height);
x = (x + MAPCURSOR_X_MIN) * 8;
y = (y + MAPCURSOR_Y_MIN) * 8;
@@ -1822,7 +1821,7 @@ static void sub_8124BE4(void)
gSprites[spriteId].oam.size = 1;
gSprites[spriteId].callback = sub_8124CBC;
StartSpriteAnim(&gSprites[spriteId], 6);
- gSprites[spriteId].data0 = mapSecId;
+ gSprites[spriteId].data[0] = mapSecId;
}
}
}
@@ -1830,17 +1829,17 @@ static void sub_8124BE4(void)
static void sub_8124CBC(struct Sprite *sprite)
{
- if (gUnknown_0203A148->regionMap.mapSecId == sprite->data0)
+ if (gUnknown_0203A148->regionMap.mapSecId == sprite->data[0])
{
- if (++sprite->data1 > 16)
+ if (++sprite->data[1] > 16)
{
- sprite->data1 = 0;
+ sprite->data[1] = 0;
sprite->invisible = sprite->invisible ? FALSE : TRUE;
}
}
else
{
- sprite->data1 = 16;
+ sprite->data[1] = 16;
sprite->invisible = FALSE;
}
}
@@ -1850,7 +1849,7 @@ static void sub_8124D14(void)
switch (gUnknown_0203A148->unk_004)
{
case 0:
- BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
gUnknown_0203A148->unk_004++;
break;
case 1:
@@ -1897,7 +1896,7 @@ static void sub_8124E0C(void)
switch (gUnknown_0203A148->unk_004)
{
case 0:
- BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
gUnknown_0203A148->unk_004++;
break;
case 1:
@@ -1918,16 +1917,16 @@ static void sub_8124E0C(void)
sub_8084CCC(gSaveBlock2Ptr->playerGender == MALE ? 0x0C : 0x0D);
break;
case MAPSEC_EVER_GRANDE_CITY:
- sub_8084CCC(FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && gUnknown_0203A148->regionMap.posWithinMapSec == 0 ? 0x14 : 0x0B);
+ sub_8084CCC(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && gUnknown_0203A148->regionMap.posWithinMapSec == 0 ? 0x14 : 0x0B);
break;
default:
- if (gUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][2] != 0)
+ if (sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][2] != 0)
{
- sub_8084CCC(gUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][2]);
+ sub_8084CCC(sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][2]);
}
else
{
- warp1_set_2(gUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][0], gUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][1], -1);
+ warp1_set_2(sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][0], sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][1], -1);
}
break;
}
diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c
new file mode 100644
index 000000000..416a8da9d
--- /dev/null
+++ b/src/reset_rtc_screen.c
@@ -0,0 +1,639 @@
+#include "global.h"
+#include "reset_rtc_screen.h"
+#include "event_data.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "rtc.h"
+#include "save.h"
+#include "sprite.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "scanline_effect.h"
+#include "bg.h"
+#include "window.h"
+#include "gpu_regs.h"
+
+struct ResetRtcStruct
+{
+ /*0x0*/ u8 dataIndex;
+ /*0x2*/ u16 minVal;
+ /*0x4*/ u16 maxVal;
+ /*0x6*/ u8 left;
+ /*0x7*/ u8 right;
+ /*0x8*/ u8 unk8;
+};
+
+// this file's functions
+static void CB2_ResetRtcScreen(void);
+static void VBlankCB(void);
+static void Task_ResetRtcScreen(u8 taskId);
+static void sub_809F048(void);
+
+// const rom data
+static const struct BgTemplate sBackgroundTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ }
+};
+
+static const struct WindowTemplate sUnknown_08510408[] =
+{
+ {0x00, 0x01, 0x01, 0x13, 0x09, 0x0f, 0x0155},
+ {0x00, 0x02, 0x0f, 0x1b, 0x04, 0x0f, 0x00e9},
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate sUnknown_08510420 = {0x00, 0x04, 0x09, 0x15, 0x02, 0x0f, 0x00bf};
+
+static const struct ResetRtcStruct sUnknown_08510428[5] =
+{
+ {
+ .dataIndex = 3,
+ .minVal = 1,
+ .maxVal = 9999,
+ .left = 0,
+ .right = 2,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 4,
+ .minVal = 0,
+ .maxVal = 23,
+ .left = 1,
+ .right = 3,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 5,
+ .minVal = 0,
+ .maxVal = 59,
+ .left = 2,
+ .right = 4,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 6,
+ .minVal = 0,
+ .maxVal = 59,
+ .left = 3,
+ .right = 5,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 7,
+ .minVal = 0,
+ .maxVal = 0,
+ .left = 4,
+ .right = 0,
+ .unk8 = 6,
+ },
+};
+
+static const struct OamData sOamData_08510464 =
+{
+ .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,
+};
+
+static const u8 sResetRtcScreen_DownArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_downarrow.4bpp");
+static const u8 sResetRtcScreen_RightArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_rightarrow.4bpp");
+static const u16 sResetRtcScreen_ArrowPal[] = INCBIN_U16("graphics/misc/reset_rtc_screen_arrow.gbapal");
+
+static const struct SpriteFrameImage sSpriteImageTable_85104B4[] =
+{
+ obj_frame_tiles(sResetRtcScreen_DownArrowGfx),
+ obj_frame_tiles(sResetRtcScreen_RightArrowGfx)
+};
+
+static const struct SpritePalette sSpritePalette_Arrow =
+{
+ sResetRtcScreen_ArrowPal, 0x1000
+};
+
+static const union AnimCmd sSpriteAnim_85104CC[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_85104D4[] =
+{
+ ANIMCMD_FRAME(0, 158, .vFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSpriteAnim_85104DC[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_85104E4[] =
+{
+ sSpriteAnim_85104CC,
+ sSpriteAnim_85104D4,
+ sSpriteAnim_85104DC,
+};
+
+static const struct SpriteTemplate sSpriteTemplate_85104F0 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x1000,
+ .oam = &sOamData_08510464,
+ .anims = sSpriteAnimTable_85104E4,
+ .images = sSpriteImageTable_85104B4,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+// code
+static void SpriteCB_ResetRtcCursor0(struct Sprite *sprite)
+{
+ int state = gTasks[sprite->data[0]].data[2];
+ if (state != sprite->data[1])
+ {
+ sprite->data[1] = state;
+ switch (state)
+ {
+ case 1:
+ sprite->invisible = FALSE;
+ sprite->animNum = 1;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 53;
+ sprite->pos1.y = 68;
+ break;
+ case 2:
+ sprite->invisible = FALSE;
+ sprite->animNum = 1;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 86;
+ sprite->pos1.y = 68;
+ break;
+ case 3:
+ sprite->invisible = FALSE;
+ sprite->animNum = 1;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 101;
+ sprite->pos1.y = 68;
+ break;
+ case 4:
+ sprite->invisible = FALSE;
+ sprite->animNum = 1;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 116;
+ sprite->pos1.y = 68;
+ break;
+ case 5:
+ sprite->invisible = FALSE;
+ sprite->animNum = 2;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 153;
+ sprite->pos1.y = 80;
+ break;
+ case 6:
+ DestroySprite(sprite);
+ break;
+ }
+ }
+}
+
+static void SpriteCB_ResetRtcCursor1(struct Sprite *sprite)
+{
+ int state = gTasks[sprite->data[0]].data[2];
+ if (state != sprite->data[1])
+ {
+ sprite->data[1] = state;
+ switch (state)
+ {
+ case 1:
+ sprite->invisible = FALSE;
+ sprite->animNum = 0;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 53;
+ sprite->pos1.y = 92;
+ break;
+ case 2:
+ sprite->invisible = FALSE;
+ sprite->animNum = 0;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 86;
+ sprite->pos1.y = 92;
+ break;
+ case 3:
+ sprite->invisible = FALSE;
+ sprite->animNum = 0;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 101;
+ sprite->pos1.y = 92;
+ break;
+ case 4:
+ sprite->invisible = FALSE;
+ sprite->animNum = 0;
+ sprite->animDelayCounter = 0;
+ sprite->pos1.x = 116;
+ sprite->pos1.y = 92;
+ break;
+ case 5:
+ sprite->invisible = TRUE;
+ break;
+ case 6:
+ DestroySprite(sprite);
+ break;
+ }
+ }
+}
+
+static void CreateCursor(u8 taskId)
+{
+ u32 spriteId;
+
+ LoadSpritePalette(&sSpritePalette_Arrow);
+
+ spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0);
+ gSprites[spriteId].callback = SpriteCB_ResetRtcCursor0;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = -1;
+
+ spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0);
+ gSprites[spriteId].callback = SpriteCB_ResetRtcCursor1;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = -1;
+}
+
+static void FreeCursorPalette(void)
+{
+ FreeSpritePaletteByTag(sSpritePalette_Arrow.tag);
+}
+
+static void HideChooseTimeWindow(u8 windowId)
+{
+ sub_8198070(windowId, FALSE);
+ RemoveWindow(windowId);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void PrintTime(u8 windowId, u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds)
+{
+ u8 *dest = gStringVar4;
+
+ ConvertIntToDecimalStringN(gStringVar1, days, 1, 4);
+ dest = StringCopy(dest, gStringVar1);
+ dest = StringCopy(dest, gText_Day);
+
+ ConvertIntToDecimalStringN(gStringVar1, hours, 1, 3);
+ dest = StringCopy(dest, gStringVar1);
+ dest = StringCopy(dest, gText_Colon3);
+
+ ConvertIntToDecimalStringN(gStringVar1, minutes, 2, 2);
+ dest = StringCopy(dest, gStringVar1);
+ dest = StringCopy(dest, gText_Colon3);
+
+ ConvertIntToDecimalStringN(gStringVar1, seconds, 2, 2);
+ dest = StringCopy(dest, gStringVar1);
+
+ PrintTextOnWindow(windowId, 1, gStringVar4, x, y, TEXT_SPEED_FF, NULL);
+}
+
+static void ShowChooseTimeWindow(u8 windowId, u16 days, u8 hours, u8 minutes, u8 seconds)
+{
+ SetWindowBorderStyle(windowId, FALSE, 0x214, 0xE);
+ PrintTime(windowId, 0, 1, days, hours, minutes, seconds);
+ PrintTextOnWindow(windowId, 1, gText_Confirm2, 126, 1, 0, NULL);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static bool32 MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys)
+{
+ if (keys & DPAD_DOWN)
+ {
+ *val -= 1;
+ if (*val < minVal)
+ *val = maxVal;
+ }
+ else if (keys & DPAD_UP)
+ {
+ *val += 1;
+ if (*val > maxVal)
+ *val = minVal;
+ }
+ else if (keys & DPAD_LEFT)
+ {
+ *val -= 10;
+ if (*val < minVal)
+ *val = maxVal;
+ }
+ else if (keys & DPAD_RIGHT)
+ {
+ *val += 10;
+ if (*val > maxVal)
+ *val = minVal;
+ }
+ else
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void Task_ResetRtc_3(u8 taskId)
+{
+ gTasks[taskId].data[0] = 1;
+}
+
+static void Task_ResetRtc_2(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ HideChooseTimeWindow(data[8]);
+ FreeCursorPalette();
+ gTasks[taskId].func = Task_ResetRtc_3;
+}
+
+static void Task_ResetRtc_1(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u8 selection = data[2];
+ const struct ResetRtcStruct *selectionInfo = &sUnknown_08510428[selection - 1];
+
+ if (gMain.newKeys & B_BUTTON)
+ {
+ gTasks[taskId].func = Task_ResetRtc_2;
+ data[1] = 0;
+ data[2] = 6;
+ PlaySE(SE_SELECT);
+ return;
+ }
+
+ if (gMain.newKeys & DPAD_RIGHT)
+ {
+ if (selectionInfo->right)
+ {
+ data[2] = selectionInfo->right;
+ PlaySE(SE_SELECT);
+ return;
+ }
+ }
+
+ if (gMain.newKeys & DPAD_LEFT)
+ {
+ if (selectionInfo->left)
+ {
+ data[2] = selectionInfo->left;
+ PlaySE(SE_SELECT);
+ return;
+ }
+ }
+
+ if (selection == 5)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ gLocalTime.days = data[3];
+ gLocalTime.hours = data[4];
+ gLocalTime.minutes = data[5];
+ gLocalTime.seconds = data[6];
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = Task_ResetRtc_2;
+ data[1] = 1;
+ data[2] = 6;
+ }
+ }
+ else if (MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN)))
+ {
+ PlaySE(SE_SELECT);
+ PrintTime(data[8], 0, 1, data[3], data[4], data[5], data[6]);
+ CopyWindowToVram(data[8], 2);
+ }
+}
+
+static void Task_ResetRtc_0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ data[0] = 0;
+ data[3] = gLocalTime.days;
+ data[4] = gLocalTime.hours;
+ data[5] = gLocalTime.minutes;
+ data[6] = gLocalTime.seconds;
+ data[8] = AddWindow(&sUnknown_08510420);
+ ShowChooseTimeWindow(data[8], data[3], data[4], data[5], data[6]);
+ CreateCursor(taskId);
+ data[2] = 2;
+ gTasks[taskId].func = Task_ResetRtc_1;
+}
+
+void CB2_InitResetRtcScreen(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetVBlankCallback(NULL);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ DmaFillLarge16(3, 0, (u8 *)VRAM, 0x18000, 0x1000);
+ ResetOamRange(0, 128);
+ LoadOam();
+ ScanlineEffect_Stop();
+ ScanlineEffect_Clear();
+ ResetSpriteData();
+ ResetTasks();
+ ResetPaletteFade();
+ sub_809F048();
+ SetVBlankCallback(VBlankCB);
+ SetMainCallback2(CB2_ResetRtcScreen);
+ CreateTask(Task_ResetRtcScreen, 80);
+}
+
+static void sub_809F048(void)
+{
+ clear_scheduled_bg_copies_to_vram();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates));
+ schedule_bg_copy_tilemap_to_vram(0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ InitWindows(sUnknown_08510408);
+ DeactivateAllTextPrinters();
+ sub_81973A4();
+}
+
+static void CB2_ResetRtcScreen(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB(void)
+{
+ ProcessSpriteCopyRequests();
+ LoadOam();
+ TransferPlttBuffer();
+}
+
+static void ShowMessage(const u8 *str)
+{
+ sub_8197B1C(1, FALSE, 0x200, 0xF);
+ PrintTextOnWindow(1, 1, str, 0, 1, 0, NULL);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void Task_ShowResetRtcPrompt(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ SetWindowBorderStyle(0, FALSE, 0x214, 0xE);
+ PrintTextOnWindow(0, 1, gText_PresentTime, 0, 1, TEXT_SPEED_FF, 0);
+ PrintTime(
+ 0,
+ 0,
+ 17,
+ gLocalTime.days,
+ gLocalTime.hours,
+ gLocalTime.minutes,
+ gLocalTime.seconds);
+ PrintTextOnWindow(0, 1, gText_PreviousTime, 0, 33, TEXT_SPEED_FF, 0);
+ PrintTime(
+ 0,
+ 0,
+ 49,
+ gSaveBlock2Ptr->lastBerryTreeUpdate.days,
+ gSaveBlock2Ptr->lastBerryTreeUpdate.hours,
+ gSaveBlock2Ptr->lastBerryTreeUpdate.minutes,
+ gSaveBlock2Ptr->lastBerryTreeUpdate.seconds);
+ ShowMessage(gText_ResetRTCConfirmCancel);
+ CopyWindowToVram(0, 2);
+ schedule_bg_copy_tilemap_to_vram(0);
+ data[0]++;
+ case 1:
+ if (gMain.newKeys & B_BUTTON)
+ {
+ DestroyTask(taskId);
+ DoSoftReset();
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void Task_ResetRtcScreen(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF);
+ data[0] = 1;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
+ {
+ ShowMessage(gText_NoSaveFileCantSetTime);
+ data[0] = 5;
+ }
+ else
+ {
+ RtcCalcLocalTime();
+ data[1] = CreateTask(Task_ShowResetRtcPrompt, 80);
+ data[0] = 2;
+ }
+ }
+ break;
+ case 2:
+ if (gTasks[data[1]].isActive != TRUE)
+ {
+ sub_8198070(0, FALSE);
+ ShowMessage(gText_PleaseResetTime);
+ gLocalTime = gSaveBlock2Ptr->lastBerryTreeUpdate;
+ data[1] = CreateTask(Task_ResetRtc_0, 80);
+ data[0] = 3;
+ }
+ break;
+ case 3:
+ if (gTasks[data[1]].data[0])
+ {
+ if (!gTasks[data[1]].data[1])
+ {
+ DestroyTask(data[1]);
+ data[0] = 2;
+ }
+ else
+ {
+ DestroyTask(data[1]);
+ RtcReset();
+ RtcCalcLocalTimeOffset(
+ gLocalTime.days,
+ gLocalTime.hours,
+ gLocalTime.minutes,
+ gLocalTime.seconds);
+ gSaveBlock2Ptr->lastBerryTreeUpdate = gLocalTime;
+ VarSet(VAR_DAYS, gLocalTime.days);
+ DisableResetRTC();
+ ShowMessage(gText_ClockHasBeenReset);
+ data[0] = 4;
+ }
+ }
+ break;
+ case 4:
+ if (TrySavingData(0) == 1)
+ {
+ ShowMessage(gText_SaveCompleted);
+ PlaySE(SE_PINPON);
+ }
+ else
+ {
+ ShowMessage(gText_SaveFailed);
+ PlaySE(SE_BOO);
+ }
+ data[0] = 5;
+ case 5:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, 0xFFFF);
+ data[0] = 6;
+ }
+ else
+ {
+ break;
+ }
+ case 6:
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ FreeAllWindowBuffers();
+ DoSoftReset();
+ }
+ }
+}
diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c
index d4dbc5f42..1d90448b2 100644
--- a/src/reset_save_heap.c
+++ b/src/reset_save_heap.c
@@ -15,18 +15,16 @@ void sub_81700F8(void)
imeBackup = REG_IME;
REG_IME = 0;
RegisterRamReset(0x00000001);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, 0x80);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
REG_IME = imeBackup;
gMain.inBattle = FALSE;
SetSaveBlocksPointers(sub_815355C());
sub_808447C();
- ResetSaveCounters();
- sub_81534D0(0);
+ Save_ResetSaveCounters();
+ Save_LoadGameData(0);
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
- {
Sav2_ClearSetDefault();
- }
SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
- InitHeap(gHeap, 0x1c000);
- SetMainCallback2(sub_8086230);
+ InitHeap(gHeap, HEAP_SIZE);
+ SetMainCallback2(CB2_ContinueSavedGame);
}
diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c
index 3177a8946..60580ef2d 100644
--- a/src/reshow_battle_screen.c
+++ b/src/reshow_battle_screen.c
@@ -3,15 +3,18 @@
#include "battle.h"
#include "palette.h"
#include "main.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "text.h"
#include "gpu_regs.h"
#include "bg.h"
#include "battle_controllers.h"
#include "link.h"
#include "sprite.h"
-#include "species.h"
+#include "constants/species.h"
+#include "constants/trainers.h"
#include "battle_interface.h"
+#include "battle_anim.h"
+#include "data2.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
@@ -21,34 +24,16 @@ extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
-extern u8 gReservedSpritePaletteCount;
-extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
-extern u8 gBankInMenu;
-extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gNoOfAllBanks;
-extern u32 gBattleTypeFlags;
-extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
-extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
-extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
-extern struct SpriteTemplate gUnknown_0202499C;
extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[];
-extern void dp12_8087EA4(void);
-extern void trs_config(void);
-extern bool8 IsDoubleBattle(void);
-extern u8 GetSubstituteSpriteDefault_Y(u8 bank);
-extern u8 GetBankSpriteDefault_Y(u8 bank);
-extern u8 sub_80A82E4(u8 bank);
-extern void sub_806A068(u16 species, u8 bankIdentity);
-extern void sub_806A12C(u16 backPicId, u8 bankIdentity);
-extern u8 sub_80A5C6C(u8 bank, u8 caseId);
+extern void SetMultiuseSpriteTemplateToTrainerBack(u16 backPicId, u8 battlerPosition);
// this file's functions
static void CB2_ReshowBattleScreenAfterMenu(void);
-static bool8 LoadBankSpriteGfx(u8 bank);
-static void CreateBankSprite(u8 bank);
-static void CreateHealthboxSprite(u8 bank);
+static bool8 LoadBattlerSpriteGfx(u8 battlerId);
+static void CreateBattlerSprite(u8 battlerId);
+static void CreateHealthboxSprite(u8 battlerId);
static void sub_80A95F4(void);
void nullsub_35(void)
@@ -72,8 +57,8 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
switch (gBattleScripting.reshowMainState)
{
case 0:
- dp12_8087EA4();
- trs_config();
+ ScanlineEffect_Clear();
+ BattleInitBgsAndWindows();
SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
ShowBg(0);
@@ -118,32 +103,32 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
}
break;
case 7:
- if (!LoadBankSpriteGfx(0))
+ if (!LoadBattlerSpriteGfx(0))
gBattleScripting.reshowMainState--;
break;
case 8:
- if (!LoadBankSpriteGfx(1))
+ if (!LoadBattlerSpriteGfx(1))
gBattleScripting.reshowMainState--;
break;
case 9:
- if (!LoadBankSpriteGfx(2))
+ if (!LoadBattlerSpriteGfx(2))
gBattleScripting.reshowMainState--;
break;
case 10:
- if (!LoadBankSpriteGfx(3))
+ if (!LoadBattlerSpriteGfx(3))
gBattleScripting.reshowMainState--;
break;
case 11:
- CreateBankSprite(0);
+ CreateBattlerSprite(0);
break;
case 12:
- CreateBankSprite(1);
+ CreateBattlerSprite(1);
break;
case 13:
- CreateBankSprite(2);
+ CreateBattlerSprite(2);
break;
case 14:
- CreateBankSprite(3);
+ CreateBattlerSprite(3);
break;
case 15:
CreateHealthboxSprite(0);
@@ -159,28 +144,28 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
break;
case 19:
{
- u8 opponentBank;
+ u8 opponentBattler;
u16 species;
LoadAndCreateEnemyShadowSprites();
- opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
- SetBankEnemyShadowSpriteCallback(opponentBank, species);
+ opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES);
+ SetBattlerShadowSpriteCallback(opponentBattler, species);
if (IsDoubleBattle())
{
- opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
- species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
- SetBankEnemyShadowSpriteCallback(opponentBank, species);
+ opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES);
+ SetBattlerShadowSpriteCallback(opponentBattler, species);
}
- ActionSelectionCreateCursorAt(gActionSelectionCursor[gBankInMenu], 0);
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gBattlerInMenuId], 0);
- if (gLinkVSyncDisabled != 0 && gReceivedRemoteLinkPlayers != 0)
+ if (gWirelessCommType != 0 && gReceivedRemoteLinkPlayers != 0)
{
sub_800E0E8();
- sub_800DFB4(0, 0);
+ CreateWirelessStatusIndicatorSprite(0, 0);
}
}
break;
@@ -208,146 +193,136 @@ static void sub_80A95F4(void)
regBgcnt2->charBaseBlock = 0;
}
-static bool8 LoadBankSpriteGfx(u8 bank)
+static bool8 LoadBattlerSpriteGfx(u8 battler)
{
- if (bank < gNoOfAllBanks)
+ if (battler < gBattlersCount)
{
- if (GetBankSide(bank) != SIDE_PLAYER)
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
{
- if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
- BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank);
+ if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler);
else
- BattleLoadSubstituteOrMonSpriteGfx(bank, FALSE);
+ BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);
}
- else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
- DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, bank);
- else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
- DecompressTrainerBackPic(BACK_PIC_WALLY, bank);
- else if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
- BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank);
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler.
+ DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, battler);
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler.
+ DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, battler);
+ else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);
else
- BattleLoadSubstituteOrMonSpriteGfx(bank, FALSE);
+ BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);
gBattleScripting.reshowHelperState = 0;
}
return TRUE;
}
-// todo: get rid of it once the struct is declared in a header
-struct MonCoords
+static void CreateBattlerSprite(u8 battler)
{
- // This would use a bitfield, but sub_8079F44
- // uses it as a u8 and casting won't match.
- u8 coords; // u8 x:4, y:4;
- u8 y_offset;
-};
-extern const struct MonCoords gTrainerBackPicCoords[];
-
-static void CreateBankSprite(u8 bank)
-{
- if (bank < gNoOfAllBanks)
+ if (battler < gBattlersCount)
{
u8 posY;
- if (gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
- posY = GetSubstituteSpriteDefault_Y(bank);
+ if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
+ posY = GetSubstituteSpriteDefault_Y(battler);
else
- posY = GetBankSpriteDefault_Y(bank);
+ posY = GetBattlerSpriteDefault_Y(battler);
- if (GetBankSide(bank) != SIDE_PLAYER)
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
{
- if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
return;
- sub_806A068(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
- gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank));
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+ SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler));
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
+ gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM)
- gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);
+ if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_CASTFORM)
+ gSprites[gBattlerSpriteIds[battler]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
}
- else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT)
{
- sub_806A12C(gSaveBlock2Ptr->playerGender, GetBankIdentity(IDENTITY_PLAYER_MON1));
- gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50,
+ SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(B_POSITION_PLAYER_LEFT));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50,
(8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80,
sub_80A82E4(0));
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
}
- else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == B_POSITION_PLAYER_LEFT)
{
- sub_806A12C(BACK_PIC_WALLY, GetBankIdentity(0));
- gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50,
- (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords) * 4 + 80,
+ SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(0));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50,
+ (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].coords) * 4 + 80,
sub_80A82E4(0));
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
}
else
{
- if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
return;
- sub_806A068(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
- gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank));
- gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
- gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
- gSprites[gBankSpriteIds[bank]].data0 = bank;
- gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+ SetMultiuseSpriteTemplateToPokemon(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler));
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
+ gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);
- StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
- if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM)
- gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);
+ if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_CASTFORM)
+ gSprites[gBattlerSpriteIds[battler]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
}
- gSprites[gBankSpriteIds[bank]].invisible = gBattleSpritesDataPtr->bankData[bank].invisible;
+ gSprites[gBattlerSpriteIds[battler]].invisible = gBattleSpritesDataPtr->battlerData[battler].invisible;
}
}
-static void CreateHealthboxSprite(u8 bank)
+static void CreateHealthboxSprite(u8 battler)
{
- if (bank < gNoOfAllBanks)
+ if (battler < gBattlersCount)
{
u8 healthboxSpriteId;
- if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT)
healthboxSpriteId = CreateSafariPlayerHealthboxSprites();
- else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == B_POSITION_PLAYER_LEFT)
return;
else
- healthboxSpriteId = CreateBankHealthboxSprites(bank);
+ healthboxSpriteId = CreateBattlerHealthboxSprites(battler);
- gHealthBoxesIds[bank] = healthboxSpriteId;
- SetBankHealthboxSpritePos(bank);
+ gHealthboxSpriteIds[battler] = healthboxSpriteId;
+ InitBattlerHealthboxCoords(battler);
SetHealthboxSpriteVisible(healthboxSpriteId);
- if (GetBankSide(bank) != SIDE_PLAYER)
- UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gEnemyParty[gBattlePartyID[bank]], HEALTHBOX_ALL);
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gEnemyParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_SAFARI_ALL_TEXT);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_SAFARI_ALL_TEXT);
else
- UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_ALL);
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);
- if (GetBankIdentity(bank) == IDENTITY_OPPONENT_MON2 || GetBankIdentity(bank) == IDENTITY_PLAYER_MON2)
- DummyBattleInterfaceFunc(gHealthBoxesIds[bank], TRUE);
+ if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)
+ DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], TRUE);
else
- DummyBattleInterfaceFunc(gHealthBoxesIds[bank], FALSE);
+ DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], FALSE);
- if (GetBankSide(bank) != SIDE_PLAYER)
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
{
- if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
SetHealthboxSpriteInvisible(healthboxSpriteId);
}
else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
{
- if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
SetHealthboxSpriteInvisible(healthboxSpriteId);
}
}
diff --git a/src/roamer.c b/src/roamer.c
index cbe1b6312..fbd25bfad 100644
--- a/src/roamer.c
+++ b/src/roamer.c
@@ -1,8 +1,8 @@
#include "global.h"
#include "roamer.h"
#include "pokemon.h"
-#include "rng.h"
-#include "species.h"
+#include "random.h"
+#include "constants/species.h"
#include "event_data.h"
enum
diff --git a/src/rom4.c b/src/rom4.c
deleted file mode 100644
index c538595f2..000000000
--- a/src/rom4.c
+++ /dev/null
@@ -1,19 +0,0 @@
-
-// Includes
-#include "global.h"
-
-// Static type declarations
-
-// Static RAM declarations
-IWRAM_DATA void *gUnknown_03000E0C;
-IWRAM_DATA u8 gUnknown_03000E10[4];
-IWRAM_DATA u8 (*gUnknown_03000E14)(u32);
-IWRAM_DATA u8 gUnknown_03000E18;
-IWRAM_DATA u8 gUnknown_03000E19;
-IWRAM_DATA void *rom4_c_unused_03000e1c;
-
-// Static ROM declarations
-
-// .rodata
-
-// .text
diff --git a/src/rom6.c b/src/rom6.c
new file mode 100644
index 000000000..cc146fc94
--- /dev/null
+++ b/src/rom6.c
@@ -0,0 +1,210 @@
+#include "global.h"
+#include "constants/event_objects.h"
+#include "constants/songs.h"
+#include "rom6.h"
+#include "braille_puzzles.h"
+#include "event_data.h"
+#include "event_scripts.h"
+#include "field_effect.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "item_use.h"
+#include "party_menu.h"
+#include "overworld.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "constants/map_types.h"
+
+// static functions
+static void task08_080C9820(u8 taskId);
+static void sub_8135578(u8 taskId);
+static void sub_813552C(u8 taskId);
+static void sub_813561C(u8 taskId);
+static void sub_81356C4(void);
+static void sub_8135714(void);
+static void hm2_dig(void);
+static void sub_8135780(void);
+
+// extern RAM loc
+extern struct MapPosition gPlayerFacingPosition;
+
+// text
+bool8 CheckObjectGraphicsInFrontOfPlayer(u8 a)
+{
+ u8 eventObjId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+ gPlayerFacingPosition.height = PlayerGetZCoord();
+ eventObjId = GetEventObjectIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height);
+ if (gEventObjects[eventObjId].graphicsId != a)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSpecialVar_LastTalked = gEventObjects[eventObjId].localId;
+ return TRUE;
+ }
+}
+
+u8 oei_task_add(void)
+{
+ GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
+ return CreateTask(task08_080C9820, 8);
+}
+
+static void task08_080C9820(u8 taskId)
+{
+ u8 eventObjId;
+
+ ScriptContext2_Enable();
+ gPlayerAvatar.preventStep = TRUE;
+ eventObjId = gPlayerAvatar.eventObjectId;
+ if (!EventObjectIsMovementOverridden(&gEventObjects[eventObjId])
+ || EventObjectClearHeldMovementIfFinished(&gEventObjects[eventObjId]))
+ {
+ if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
+ {
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ gTasks[taskId].func = sub_8135578;
+ }
+ else
+ {
+ sub_808C114();
+ EventObjectSetHeldMovement(&gEventObjects[eventObjId], 0x39);
+ gTasks[taskId].func = sub_813552C;
+ }
+ }
+}
+
+static void sub_813552C(u8 taskId)
+{
+ if (EventObjectCheckHeldMovementStatus(&gEventObjects[gPlayerAvatar.eventObjectId]) == TRUE)
+ {
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ gTasks[taskId].func = sub_8135578;
+ }
+}
+
+static void sub_8135578(u8 taskId)
+{
+ if (!FieldEffectActiveListContains(6))
+ {
+ gFieldEffectArguments[1] = GetPlayerFacingDirection();
+ if (gFieldEffectArguments[1] == 1)
+ gFieldEffectArguments[2] = 0;
+ if (gFieldEffectArguments[1] == 2)
+ gFieldEffectArguments[2] = 1;
+ if (gFieldEffectArguments[1] == 3)
+ gFieldEffectArguments[2] = 2;
+ if (gFieldEffectArguments[1] == 4)
+ gFieldEffectArguments[2] = 3;
+ EventObjectSetGraphicsId(&gEventObjects[gPlayerAvatar.eventObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
+ StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);
+ FieldEffectActiveListRemove(6);
+ gTasks[taskId].func = sub_813561C;
+ }
+}
+
+static void sub_813561C(u8 taskId)
+{
+ void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]);
+
+ func();
+ gPlayerAvatar.preventStep = FALSE;
+ DestroyTask(taskId);
+}
+
+bool8 SetUpFieldMove_RockSmash(void)
+{
+ if (ShouldDoBrailleStrengthEffect())
+ {
+ gSpecialVar_Result = GetCursorSelectionMonId();
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = sub_8179834;
+ return TRUE;
+ }
+ else if (CheckObjectGraphicsInFrontOfPlayer(EVENT_OBJ_GFX_BREAKABLE_ROCK) == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = sub_81356C4;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void sub_81356C4(void)
+{
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+ ScriptContext1_SetupScript(Route111_EventScript_2907F0);
+}
+
+bool8 FldEff_UseRockSmash(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_8135714 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_8135714;
+ IncrementGameStat(GAME_STAT_USED_ROCK_SMASH);
+ return FALSE;
+}
+
+static void sub_8135714(void)
+{
+ PlaySE(SE_W088);
+ FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);
+ EnableBothScriptContexts();
+}
+
+bool8 SetUpFieldMove_Dig(void)
+{
+ if (CanUseEscapeRopeOnCurrMap() == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = hm2_dig;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void hm2_dig(void)
+{
+ Overworld_ResetStateAfterDigEscRope();
+ FieldEffectStart(FLDEFF_USE_DIG);
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+}
+
+bool8 FldEff_UseDig(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_8135780 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_8135780;
+ if (!ShouldDoBrailleDigEffect())
+ SetPlayerAvatarTransitionFlags(1);
+ return FALSE;
+}
+
+static void sub_8135780(void)
+{
+ u8 taskId;
+
+ FieldEffectActiveListRemove(FLDEFF_USE_DIG);
+ if (ShouldDoBrailleDigEffect())
+ {
+ DoBrailleDigEffect();
+ }
+ else
+ {
+ taskId = CreateTask(task08_080A1C44, 8);
+ gTasks[taskId].data[0] = 0;
+ }
+}
diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c
new file mode 100644
index 000000000..55e3fe32b
--- /dev/null
+++ b/src/rom_8011DC0.c
@@ -0,0 +1,3264 @@
+#include "global.h"
+#include "window.h"
+#include "bg.h"
+#include "string_util.h"
+#include "task.h"
+#include "event_data.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "librfu.h"
+#include "malloc.h"
+#include "menu.h"
+#include "list_menu.h"
+#include "menu_helpers.h"
+#include "script.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "constants/game_stat.h"
+#include "constants/maps.h"
+#include "constants/species.h"
+#include "constants/rgb.h"
+#include "trade.h"
+#include "trainer_card.h"
+#include "overworld.h"
+#include "battle.h"
+#include "load_save.h"
+#include "cable_club.h"
+#include "field_control_avatar.h"
+#include "party_menu.h"
+#include "field_weather.h"
+#include "palette.h"
+#include "decompress.h"
+#include "start_menu.h"
+#include "data2.h"
+#include "field_screen.h"
+
+extern void HealPlayerParty(void);
+
+struct UnkStruct_Shared
+{
+ struct UnkLinkRfuStruct_02022B14 field_0;
+ u8 needingPadding[3];
+ u8 playerName[PLAYER_NAME_LENGTH];
+};
+
+struct UnkStruct_x1C
+{
+ struct UnkStruct_Shared unk0;
+ u8 unk18;
+};
+
+struct UnkStruct_x20
+{
+ struct UnkStruct_Shared unk;
+ u16 field_18;
+ u8 field_1A_0:2;
+ u8 field_1A_1:1;
+ u8 field_1B;
+ u8 field_1D;
+ u8 field_1E;
+ u8 field_1F;
+};
+
+struct UnkStruct_Main0
+{
+ struct UnkStruct_x20 arr[5];
+};
+
+struct UnkStruct_Main4
+{
+ struct UnkStruct_x1C arr[5];
+};
+
+struct UnkStruct_Main8
+{
+ struct UnkStruct_x20 arr[5];
+};
+
+struct UnkStruct_Leader
+{
+ struct UnkStruct_Main0 *field_0;
+ struct UnkStruct_Main4 *field_4;
+ struct UnkStruct_Main8 *field_8;
+ u8 state;
+ u8 textState;
+ u8 field_E;
+ u8 listWindowId;
+ u8 field_10;
+ u8 field_11;
+ u8 listTaskId;
+ u8 field_13;
+ u8 field_14;
+ u8 field_15;
+ u8 field_16;
+ u8 field_17;
+ u8 field_18;
+ u8 field_19;
+ u16 field_1A;
+};
+
+struct UnkStruct_Group
+{
+ struct UnkStruct_Main0 *field_0;
+ struct UnkStruct_Main4 *field_4;
+ u8 state;
+ u8 textState;
+ u8 field_A;
+ u8 listWindowId;
+ u8 field_C;
+ u8 field_D;
+ u8 listTaskId;
+ u8 field_F;
+ u8 field_10;
+ u8 field_11;
+ u8 field_12;
+ u8 field_13;
+ u8 field_14;
+ u8 field_15;
+};
+
+struct UnkStruct_8019BA8
+{
+ u8 field_0;
+ u8 field_1;
+ u8 field_2;
+ u8 field_3;
+};
+
+struct UnkStruct_URoom
+{
+ struct UnkStruct_Main0 *field_0;
+ struct UnkStruct_Main4 *field_4;
+ struct UnkStruct_Main0 *field_8;
+ struct UnkStruct_Main4 *field_C;
+ u16 field_10;
+ u16 field_12;
+ u8 state;
+ u8 stateAfterPrint;
+ u8 textState;
+ u8 field_17;
+ u8 field_18;
+ u8 field_19;
+ u8 field_1A;
+ u8 field_1B;
+ u8 field_1C;
+ u8 field_1D;
+ u8 field_1E;
+ u8 field_1F;
+ u8 field_20;
+ u8 spriteIds[40];
+ u8 field_49;
+ u8 field_4A;
+ u16 field_4C[6];
+ u8 field_58[0x98 - 0x58];
+ u16 field_98;
+ u16 field_9A;
+ u16 field_9C;
+ u16 field_9E;
+ struct UnkStruct_8019BA8 field_A0[8];
+};
+
+union UnkUnion_Main
+{
+ struct UnkStruct_Leader *leader;
+ struct UnkStruct_Group *group;
+ struct UnkStruct_URoom *uRoom;
+};
+
+struct TradeUnkStruct
+{
+ u16 field_0;
+ u16 field_2;
+ u32 field_4;
+ u8 field_8;
+ u8 field_9;
+ u16 field_A;
+ u16 field_C;
+ u16 species;
+ u16 level;
+ u16 field_12;
+ u32 personality;
+};
+
+extern struct TradeUnkStruct gUnknown_02022C40;
+
+extern union UnkUnion_Main gUnknown_02022C30;
+
+extern u8 gUnknown_02022C2C;
+extern u8 gUnknown_02022C2D;
+extern u8 gUnknown_02022C3E;
+extern u16 gUnknown_02022C3C;
+extern struct UnkLinkRfuStruct_02022B14Substruct gUnknown_02022C38;
+
+extern u8 gFieldLinkPlayerCount;
+extern u8 gUnknown_03005DB4;
+
+// IWRAM vars
+IWRAM_DATA struct UnkStruct_Leader *gUnknown_03000DA0;
+IWRAM_DATA struct UnkStruct_Group *gUnknown_03000DA4;
+IWRAM_DATA struct UnkStruct_URoom *gUnknown_03000DA8;
+IWRAM_DATA void *gUnknown_03000DAC;
+IWRAM_DATA bool32 gUnknown_03000DB0;
+
+// this file's functions
+void sub_80173E0(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5);
+u16 ReadAsU16(const u8 *ptr);
+void sub_8012780(u8 taskId);
+void sub_80134E8(u8 taskId);
+void sub_8013C7C(u8 taskId);
+void sub_8014A40(u8 taskId);
+void sub_8014F48(u8 taskId);
+void sub_80152F4(u8 taskId);
+void sub_80156E0(u8 taskId);
+void sub_80175EC(struct UnkStruct_Main4 *arg0, u8 count);
+void sub_8017580(struct UnkStruct_Main0 *arg0, u8 count);
+u8 sub_8016FC0(struct UnkStruct_Main4 *arg0, u32 arg1);
+u8 sub_8016FF0(struct UnkStruct_Main4 *arg0, u32 arg1);
+bool8 PrintOnTextbox(u8 *textState, const u8 *str);
+bool8 sub_801320C(struct UnkStruct_Leader *data, u32 arg1, u32 arg2);
+u8 sub_8013398(struct UnkStruct_Main0 *arg0);
+s8 sub_80170B8(u8 *arg0, bool32 arg1);
+void sub_8018404(u8 *dest, struct UnkStruct_x20 *arg1);
+void sub_8012F64(struct UnkStruct_Leader *data);
+void sub_80149C4(void);
+u8 sub_80132D4(struct UnkStruct_Main0 *arg0);
+void sub_80178A0(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
+u32 sub_80176E4(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1);
+u8 sub_8017734(struct UnkStruct_x20 *arg0, struct UnkStruct_Shared *arg1, u8 arg2);
+u8 sub_8013E44(void);
+u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id);
+void sub_8013BD8(struct UnkStruct_Group *arg0, s32 id);
+void sub_80173D4(void);
+void sub_80177B8(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
+bool32 sub_8017678(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1);
+u32 sub_8018120(struct TradeUnkStruct *arg0, u8 multiplayerId);
+void sub_801807C(struct TradeUnkStruct *arg0);
+void sub_801B940(void);
+void sub_801B94C(u16);
+u16 sub_801B39C(void);
+void sub_801AC54(void);
+void sub_801DD98(void);
+void sub_802A9A8(u8 monId, MainCallback callback);
+void sub_802493C(u8 monId, MainCallback callback);
+void sub_8020C70(MainCallback callback);
+void sub_80149D8(void);
+u16 sub_8019930(void);
+void sub_8018784(u8 windowId);
+void sub_8018884(const u8 *src);
+bool32 mevent_0814257C(u8 *textState, const u8 *str);
+s8 sub_8018B08(u8 *textState, u8 *arg1, u8 arg2, const u8 *str);
+bool32 sub_8016F1C(struct UnkStruct_x20 *arg0, s16 arg1);
+u8 sub_8016DF0(struct UnkStruct_Main4 *arg0, struct UnkStruct_Main4 *arg1, u32 arg2);
+void sub_8019F2C(void);
+void sub_8019E70(u8 *arg0, s32 arg1);
+bool32 sub_80180A0(u8 monId, struct TradeUnkStruct *arg1);
+void sub_80180E8(u8 monId, struct TradeUnkStruct *arg1);
+bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3);
+void sub_80181CC(void);
+bool32 sub_8017940(void);
+u8 sub_8016B00(void);
+void sub_801A274(struct UnkStruct_URoom *arg0);
+void sub_801A284(struct UnkStruct_URoom *arg0);
+bool32 sub_8017FD8(struct UnkStruct_URoom *arg0);
+void sub_801689C(struct UnkStruct_URoom *arg0);
+u8 sub_80181DC(struct UnkStruct_URoom *arg0);
+bool32 sub_80168DC(struct UnkStruct_URoom *arg0);
+bool32 sub_801704C(void);
+u32 sub_8017CF8(u32 arg1, struct UnkStruct_Main0 *arg0);
+s32 sub_80179D4(struct UnkStruct_Main0 *arg0, u8 arg1, u8 arg2, u32 playerGender);
+void sub_801818C(bool32 arg0);
+void sub_801A3D0(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2);
+s32 sub_8017178(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate);
+s32 sub_80172A0(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6);
+bool32 sub_8018024(void);
+u32 sub_8017984(u32 arg0);
+void sub_8018220(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2);
+void sub_8017D9C(u8 *dst, u32 arg1, u32 playerGender);
+u32 sub_80179AC(struct UnkStruct_x20 *arg0);
+void sub_8017E00(u8 *dst, u8 arg1);
+void sub_8019F04(u8 *spriteIds);
+void sub_8019E3C(void);
+void sub_80173B0(void);
+s32 sub_8017D04(u32 type, u32 species);
+void sub_8017020(const u8 *src);
+void sub_8019BA8();
+
+// const rom data
+extern const u8 *const gUnknown_082EDB60[][5];
+
+extern const u8 gText_UnkCtrlCodeF907[];
+extern const u8 gUnknown_082EDBC4[];
+extern const u8 gText_AwaitingCommunication[];
+extern const u8 gText_AwaitingLink[];
+extern const u8 gUnknown_082EDC5C[];
+extern const u8 gUnknown_082EDC9C[];
+extern const u8 gUnknown_082EDC78[];
+extern const u8 gUnknown_082EDD58[];
+extern const u8 gUnknown_082EDBE8[];
+extern const u8 gUnknown_082EDC0C[];
+extern const u8 gUnknown_082EDC34[];
+extern const u8 gUnknown_082EE560[];
+extern const u8 gUnknown_082EE57C[];
+extern const u8 gUnknown_082EFC54[];
+extern const u8 gUnknown_082EFC3C[];
+extern const u8 gUnknown_082EDE0C[];
+extern const u8 gUnknown_082EDDF4[];
+extern const u8 gUnknown_082EF7DC[];
+extern const u8 gUnknown_082EDE48[];
+extern const u8 gUnknown_082EDE64[];
+extern const u8 gUnknown_082EDF40[];
+extern const u8 gText_PleaseStartOver[];
+extern const u8 gUnknown_082EF7F8[];
+extern const u8 gUnknown_082EFBC8[];
+extern const u8 gUnknown_082EFC90[];
+extern const u8 gUnknown_082EDEC4[];
+extern const u8 gUnknown_082EDF04[];
+extern const u8 gText_WirelessSearchCanceled[];
+extern const u8 gUnknown_082EF4FC[];
+extern const u8 gUnknown_082EF520[];
+extern const u8 gUnknown_082EF5B8[];
+extern const u8 gUnknown_082EF1EC[];
+extern const u8 gUnknown_082EF544[];
+extern const u8 gUnknown_082EF47C[];
+extern const u8 gUnknown_082EE6C8[];
+extern const u8 gUnknown_082EE004[];
+extern const u8 gUnknown_082EEBD0[];
+extern const u8 gUnknown_082EEB88[];
+extern const u8 gUnknown_082EE598[];
+extern const u8 gUnknown_082EEC14[];
+extern const u8 gUnknown_082EF590[];
+extern const u8 gUnknown_082EF20C[];
+extern const u8 gUnknown_082EF564[];
+extern const u8 gUnknown_082EF4C4[];
+extern const u8 gUnknown_082EF298[];
+extern const u8 gUnknown_082EF65C[];
+extern const u8 gUnknown_082EF6E4[];
+extern const u8 gUnknown_082EF718[];
+
+extern const u32 gUnknown_082F00C4[];
+
+extern const u8 gUnknown_082F0530[];
+
+extern const struct WindowTemplate gUnknown_082F00BC;
+extern const struct WindowTemplate gUnknown_082F0124;
+extern const struct WindowTemplate gUnknown_082F012C;
+extern const struct WindowTemplate gUnknown_082F011C;
+extern const struct WindowTemplate gUnknown_082F0174;
+extern const struct WindowTemplate gUnknown_082F017C;
+extern const struct WindowTemplate gUnknown_082F021C;
+extern const struct WindowTemplate gUnknown_082F025C;
+extern const struct WindowTemplate gUnknown_082F0294;
+extern const struct WindowTemplate gUnknown_082F034C;
+
+extern const struct ListMenuTemplate gUnknown_082F015C;
+extern const struct ListMenuTemplate gUnknown_082F0204;
+extern const struct ListMenuTemplate gUnknown_082F0244;
+extern const struct ListMenuTemplate gUnknown_082F027C;
+extern const struct ListMenuTemplate gUnknown_082F032C;
+extern const struct ListMenuTemplate gUnknown_082F03A4;
+
+extern const u8 *const gUnknown_082F0048[];
+extern const u8 *const gUnknown_082EDDC4[];
+extern const u8 *const gUnknown_082EFB70[];
+extern const u8 *const gUnknown_082EDD50[];
+extern const u8 *const gUnknown_082EDE9C[];
+extern const u8 *const gUnknown_082EDF80[];
+extern const u8 *const gUnknown_082EFD58[];
+extern const u8 *const gUnknown_082EEB80[];
+extern const u8 *const gUnknown_082EE378[];
+extern const u8 *const gUnknown_082EEC9C[];
+extern const u8 *const gUnknown_082EED3C[];
+extern const u8 *const gUnknown_082EE324[];
+extern const u8 *const gUnknown_082EE17C[];
+
+extern const u8 *const gUnknown_082EE82C[][4];
+
+extern const u8 *const gUnknown_082EE24C[][2];
+
+extern const struct UnkStruct_Shared gUnknown_082F045C[];
+
+// code
+void nullsub_89(void)
+{
+
+}
+
+void sub_80124EC(u8 windowId, u8 arg1, u8 stringId)
+{
+ FillWindowPixelBuffer(windowId, 0x11);
+ switch (arg1 << 8)
+ {
+ case 0x200:
+ sub_80173E0(windowId, 1, gUnknown_082EDB60[0][stringId - 1], 0, 1, 0);
+ break;
+ case 0x400:
+ sub_80173E0(windowId, 1, gUnknown_082EDB60[1][stringId - 1], 0, 1, 0);
+ break;
+ case 0x2500:
+ sub_80173E0(windowId, 1, gUnknown_082EDB60[2][stringId - 1], 0, 1, 0);
+ break;
+ case 0x3500:
+ sub_80173E0(windowId, 1, gUnknown_082EDB60[3][stringId - 1], 0, 1, 0);
+ break;
+ case 0x2400:
+ sub_80173E0(windowId, 1, gUnknown_082EDB60[4][stringId - 1], 0, 1, 0);
+ break;
+ }
+
+ CopyWindowToVram(windowId, 2);
+}
+
+void sub_80125BC(u8 windowId)
+{
+ u8 text[30];
+ u8 *txtPtr;
+
+ sub_80173E0(windowId, 1, gSaveBlock2Ptr->playerName, 0, 1, 0);
+ txtPtr = StringCopy(text, gText_UnkCtrlCodeF907);
+ ConvertIntToDecimalStringN(txtPtr, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5);
+ sub_80173E0(windowId, 1, text, 0, 0x11, 0);
+}
+
+void sub_801262C(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1 ... 4:
+ case 9 ... 11:
+ case 14 ... 16:
+ case 21 ... 28:
+ // UB: argument *dst isn't used, instead it always prints to gStringVar4
+ StringExpandPlaceholders(gStringVar4, gText_AwaitingCommunication);
+ break;
+ }
+}
+
+bool32 sub_80126CC(u32 caseId)
+{
+ switch (caseId)
+ {
+ case 9 ... 11:
+ case 15 ... 16:
+ case 23 ... 27:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+void BerryBlenderLinkBecomeLeader(void)
+{
+ u8 taskId;
+ struct UnkStruct_Leader *dataPtr;
+
+ taskId = CreateTask(sub_8012780, 0);
+ gUnknown_02022C30.leader = dataPtr = (void*)(gTasks[taskId].data);
+ gUnknown_03000DA0 = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ gSpecialVar_Result = 0;
+}
+
+void sub_8012780(u8 taskId)
+{
+ u32 id, val;
+ struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+
+ switch (data->state)
+ {
+ case 0:
+ if (gSpecialVar_0x8004 == 20 && gSaveBlock2Ptr->frontier.chosenLvl == 1)
+ gSpecialVar_0x8004++;
+ gUnknown_02022C2C = gUnknown_082F00C4[gSpecialVar_0x8004];
+ gUnknown_02022C2D = gUnknown_082F00C4[gSpecialVar_0x8004] >> 8;
+ sub_8010F84(gUnknown_02022C2C, 0, 0);
+ sub_800B488();
+ OpenLink();
+ sub_8011C10(gUnknown_02022C2D & 0xF);
+ data->state = 3;
+ break;
+ case 3:
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0xA0);
+ data->field_8 = AllocZeroed(0xA0);
+ sub_80175EC(data->field_4, 4);
+ sub_8017580(data->field_0, 5);
+ sub_800DF90(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName);
+ data->field_0->arr[0].field_18 = 0;
+ data->field_0->arr[0].field_1A_0 = 1;
+ data->field_0->arr[0].field_1A_1 = 0;
+ data->field_0->arr[0].field_1B = 0;
+ data->field_17 = sub_8016FC0(data->field_4, 0xFF);
+ data->field_10 = AddWindow(&gUnknown_082F00BC);
+ switch (gUnknown_02022C2D & 0xF)
+ {
+ case 2:
+ case 3:
+ case 4:
+ data->listWindowId = AddWindow(&gUnknown_082F011C);
+ break;
+ case 5:
+ data->listWindowId = AddWindow(&gUnknown_082F0124);
+ break;
+ }
+ data->field_11 = AddWindow(&gUnknown_082F012C);
+
+ FillWindowPixelBuffer(data->field_10, 0x22);
+ sub_80173E0(data->field_10, 0, gUnknown_082EDBC4, 8, 1, 4);
+ PutWindowTilemap(data->field_10);
+ CopyWindowToVram(data->field_10, 2);
+
+ NewMenuHelpers_DrawStdWindowFrame(data->listWindowId, FALSE);
+ gMultiuseListMenuTemplate = gUnknown_082F015C;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ NewMenuHelpers_DrawStdWindowFrame(data->field_11, FALSE);
+ PutWindowTilemap(data->field_11);
+ CopyWindowToVram(data->field_11, 2);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_13 = 1;
+ data->state = 4;
+ break;
+ case 4:
+ StringCopy(gStringVar1, gUnknown_082F0048[gUnknown_02022C2C]);
+ if ((gUnknown_02022C2D >> 4) != 0)
+ {
+ if (data->field_13 > (gUnknown_02022C2D >> 4) - 1 && (gUnknown_02022C2D & 0xF) != 0)
+ StringExpandPlaceholders(gStringVar4, gText_AwaitingLink);
+ else
+ StringExpandPlaceholders(gStringVar4, gText_AwaitingCommunication);
+ }
+ else
+ {
+ sub_801262C(gStringVar4, gUnknown_02022C2C);
+ }
+
+ sub_80124EC(data->field_11, gUnknown_02022C2D, data->field_13);
+ data->state = 5;
+ break;
+ case 5:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = 6;
+ break;
+ case 6:
+ sub_801320C(data, 7, 10);
+ if (gMain.newKeys & B_BUTTON)
+ {
+ if (data->field_13 == 1)
+ data->state = 23;
+ else if ((gUnknown_02022C2D & 0xF0) != 0)
+ data->state = 30;
+ else
+ data->state = 19;
+ }
+ if ((gUnknown_02022C2D >> 4) != 0
+ && data->field_13 > (gUnknown_02022C2D >> 4) - 1
+ && (gUnknown_02022C2D & 0xF) != 0
+ && sub_8012240()
+ && gMain.newKeys & START_BUTTON)
+ {
+ data->state = 15;
+ sub_800EF38();
+ }
+ if (data->state == 6 && sub_80105EC())
+ {
+ data->state = 9;
+ }
+ break;
+ case 9:
+ if (!sub_80105EC())
+ {
+ data->state = 6;
+ data->field_13 = sub_8013398(data->field_0);
+ }
+ break;
+ case 10:
+ id = ((gUnknown_02022C2C & 0xF) == 2) ? 1 : 0;
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDDC4[id]))
+ {
+ data->field_13 = sub_8013398(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 4;
+ }
+ break;
+ case 29:
+ id = ((gUnknown_02022C2D & 0xF) == 2) ? 0 : 1;
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDDC4[id]))
+ {
+ data->state = 21;
+ }
+ break;
+ case 7:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ data->state = 11;
+ }
+ break;
+ case 11:
+ switch (sub_80170B8(&data->textState, sub_801064C(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName)))
+ {
+ case 0:
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ data->field_19 = 5;
+ sub_8010688(5, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 12;
+ break;
+ case 1:
+ case -1:
+ data->field_19 = 6;
+ sub_8010688(6, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 12;
+ break;
+ case -3:
+ data->state = 9;
+ break;
+ }
+ break;
+ case 12:
+ val = sub_8010714(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ if (val == 1)
+ {
+ if (data->field_19 == 5)
+ {
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_13++;
+ if (data->field_13 == (gUnknown_02022C2D & 0xF))
+ {
+ if ((gUnknown_02022C2D & 0xF0) != 0 || data->field_13 == 4)
+ {
+ data->state = 15;
+ }
+ else
+ {
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_13 - 1]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_082EDC9C);
+ data->state = 13;
+ }
+
+ sub_800EF38();
+ sub_80124EC(data->field_11, gUnknown_02022C2D, data->field_13);
+ }
+ else
+ {
+ data->state = 4;
+ }
+ }
+ else
+ {
+ sub_8011DC0(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId));
+ data->field_0->arr[data->field_13].field_1A_0 = 0;
+ sub_8013398(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 4;
+ }
+
+ data->field_19 = 0;
+ }
+ else if (val == 2)
+ {
+ sub_8011A64(0, 0);
+ data->state = 4;
+ }
+ break;
+ case 13:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = 14;
+ break;
+ case 14:
+ if (++data->field_E > 120)
+ data->state = 17;
+ break;
+ case 15:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDC5C))
+ data->state = 16;
+ break;
+ case 16:
+ switch (sub_80170B8(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 17;
+ break;
+ case 1:
+ case -1:
+ if ((gUnknown_02022C2D & 0xF0) != 0)
+ data->state = 30;
+ else
+ data->state = 19;
+ break;
+ }
+ break;
+ case 19:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDC78))
+ data->state = 20;
+ break;
+ case 20:
+ switch (sub_80170B8(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 23;
+ break;
+ case 1:
+ case -1:
+ if ((gUnknown_02022C2D & 0xF0) != 0)
+ data->state = 15;
+ else if (data->field_13 == (gUnknown_02022C2D & 0xF))
+ data->state = 15;
+ else
+ data->state = 4;
+ break;
+ }
+ break;
+ case 17:
+ if (!sub_801320C(data, 7, 29))
+ data->state = 18;
+ break;
+ case 18:
+ if (sub_800EF1C())
+ {
+ if (sub_800EF58(FALSE))
+ {
+ data->state = 26;
+ }
+ else
+ {
+ if (++data->field_1A > 300)
+ {
+ data->state = 29;
+ data->textState = 0;
+ }
+ }
+ }
+ else
+ {
+ data->state = 29;
+ data->textState = 0;
+ }
+ break;
+ case 30:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDD58))
+ data->state = 23;
+ break;
+ case 21:
+ case 23:
+ sub_800E084();
+ sub_800EDD4();
+ sub_8012F64(data);
+ data->state++;
+ break;
+ case 24:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ gSpecialVar_Result = 5;
+ break;
+ case 22:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ gSpecialVar_Result = 8;
+ break;
+ case 26:
+ if (sub_8011A80())
+ {
+ data->state = 29;
+ }
+ else
+ {
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (sub_80126CC(gUnknown_02022C2C))
+ sub_801103C();
+ sub_8011068(1);
+ sub_80149C4();
+ sub_8012F64(data);
+ DestroyTask(taskId);
+ }
+ }
+ break;
+ }
+}
+
+void sub_8012F64(struct UnkStruct_Leader *data)
+{
+ ClearWindowTilemap(data->field_11);
+ sub_819746C(data->field_11, FALSE);
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ ClearWindowTilemap(data->field_10);
+ sub_819746C(data->listWindowId, FALSE);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->field_11);
+ RemoveWindow(data->listWindowId);
+ RemoveWindow(data->field_10);
+ DestroyTask(data->field_17);
+
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+}
+
+void sub_8012FC4(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 14:
+ case 28:
+ StringExpandPlaceholders(dst, gUnknown_082EDBE8);
+ break;
+ case 21:
+ case 22:
+ StringExpandPlaceholders(dst, gUnknown_082EDC0C);
+ break;
+ case 3:
+ case 9:
+ case 10:
+ case 11:
+ case 15:
+ case 16:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ StringExpandPlaceholders(dst, gUnknown_082EDC34);
+ break;
+ }
+}
+
+void sub_8013078(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 65:
+ case 68:
+ StringExpandPlaceholders(dst, gUnknown_082EE560);
+ break;
+ case 69:
+ case 72:
+ StringExpandPlaceholders(dst, gUnknown_082EE57C);
+ break;
+ }
+}
+
+void sub_80130B4(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 14:
+ case 21:
+ case 22:
+ case 28:
+ StringExpandPlaceholders(dst, gUnknown_082EFC3C);
+ break;
+ case 3:
+ case 9:
+ case 10:
+ case 11:
+ case 15:
+ case 16:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ StringExpandPlaceholders(dst, gUnknown_082EFC54);
+ break;
+ }
+}
+
+void sub_8013160(u8 *dst, u8 caseId)
+{
+ switch (caseId)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 14:
+ case 21:
+ case 22:
+ case 28:
+ StringExpandPlaceholders(dst, gUnknown_082EDDF4);
+ break;
+ case 3:
+ case 9:
+ case 10:
+ case 11:
+ case 15:
+ case 16:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ StringExpandPlaceholders(dst, gUnknown_082EDE0C);
+ break;
+ }
+}
+
+bool8 sub_801320C(struct UnkStruct_Leader *data, u32 arg1, u32 arg2)
+{
+ switch (sub_80132D4(data->field_0))
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ RedrawListMenu(data->listTaskId);
+ sub_8018404(gStringVar2, &data->field_0->arr[data->field_13]);
+ sub_8012FC4(gStringVar4, gUnknown_02022C2C);
+ data->state = arg1;
+ break;
+ case 2:
+ sub_8011A64(0, 0);
+ RedrawListMenu(data->listTaskId);
+ data->state = arg2;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_8013278(u8 arg0, u32 id, u8 arg2)
+{
+ struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+ u8 var = 0;
+
+ switch (data->field_0->arr[id].field_1A_0)
+ {
+ case 1:
+ if (data->field_0->arr[id].field_1B != 0)
+ var = 2;
+ break;
+ case 2:
+ var = 1;
+ break;
+ }
+
+ sub_80178A0(arg0, 0, arg2, &data->field_0->arr[id], var, id);
+}
+
+u8 sub_80132D4(struct UnkStruct_Main0 *arg0)
+{
+ struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+ u8 ret = 0;
+ u8 i;
+ s32 id;
+
+ for (i = 1; i < 5; i++)
+ {
+ u16 var = data->field_0->arr[i].field_1A_0;
+ if (var == 1)
+ {
+ id = sub_80176E4(&data->field_0->arr[i], data->field_4->arr);
+ if (id != 0xFF)
+ {
+ data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
+ data->field_0->arr[i].field_18 = var;
+ }
+ else
+ {
+ data->field_0->arr[i].field_1A_0 = 2;
+ ret = 2;
+ }
+ }
+ }
+
+ for (id = 0; id < 4; id++)
+ sub_8017734(data->field_0->arr, &data->field_4->arr[id].unk0, 5);
+
+ if (ret != 2)
+ {
+ for (id = 0; id < 5; id++)
+ {
+ if (data->field_0->arr[id].field_1B != 0)
+ ret = 1;
+ }
+ }
+
+ return ret;
+}
+
+u8 sub_8013398(struct UnkStruct_Main0 *arg0)
+{
+ struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+ u8 copiedCount;
+ s32 i;
+ u8 ret;
+
+ for (i = 0; i < 5; i++)
+ data->field_8->arr[i] = data->field_0->arr[i];
+
+ copiedCount = 0;
+ for (i = 0; i < 5; i++)
+ {
+ if (data->field_8->arr[i].field_1A_0 == 1)
+ {
+ data->field_0->arr[copiedCount] = data->field_8->arr[i];
+ copiedCount++;
+ }
+ }
+
+ ret = copiedCount;
+ for (; copiedCount < 5; copiedCount++)
+ {
+ data->field_0->arr[copiedCount].unk = gUnknown_082F045C[0];
+ data->field_0->arr[copiedCount].field_18 = 0;
+ data->field_0->arr[copiedCount].field_1A_0 = 0;
+ data->field_0->arr[copiedCount].field_1A_1 = 0;
+ data->field_0->arr[copiedCount].field_1B = 0;
+ }
+
+ for (i = 0; i < 5; i++)
+ {
+ if (data->field_0->arr[i].field_1A_0 != 1)
+ continue;
+ if (data->field_0->arr[i].field_1B != 0x40)
+ continue;
+
+ ret = i;
+ break;
+ }
+
+ return ret;
+}
+
+void BerryBlenderLinkJoinGroup(void)
+{
+ u8 taskId;
+ struct UnkStruct_Group *dataPtr;
+
+ taskId = CreateTask(sub_80134E8, 0);
+ gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
+ gUnknown_03000DA4 = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ gSpecialVar_Result = 0;
+}
+
+void sub_80134E8(u8 taskId)
+{
+ s32 id;
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+
+ switch (data->state)
+ {
+ case 0:
+ if (gSpecialVar_0x8004 == 20 && gSaveBlock2Ptr->frontier.chosenLvl == 1)
+ gSpecialVar_0x8004++;
+ gUnknown_02022C2C = gUnknown_082F0530[gSpecialVar_0x8004];
+ sub_8010F84(gUnknown_02022C2C, 0, 0);
+ sub_800B488();
+ OpenLink();
+ sub_8011C5C();
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0x200);
+ data->state = 1;
+ break;
+ case 1:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EFB70[gSpecialVar_0x8004]))
+ data->state = 2;
+ break;
+ case 2:
+ sub_80175EC(data->field_4, 4);
+ sub_8017580(data->field_0, 16);
+ data->field_11 = sub_8016FC0(data->field_4, gSpecialVar_0x8004);
+ data->field_C = AddWindow(&gUnknown_082F00BC);
+ data->listWindowId = AddWindow(&gUnknown_082F0174);
+ data->field_D = AddWindow(&gUnknown_082F017C);
+
+ FillWindowPixelBuffer(data->field_C, 0x22);
+ sub_80173E0(data->field_C, 0, gUnknown_082EF7DC, 8, 1, 4);
+ PutWindowTilemap(data->field_C);
+ CopyWindowToVram(data->field_C, 2);
+
+ NewMenuHelpers_DrawStdWindowFrame(data->listWindowId, FALSE);
+ gMultiuseListMenuTemplate = gUnknown_082F0204;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ NewMenuHelpers_DrawStdWindowFrame(data->field_D, FALSE);
+ PutWindowTilemap(data->field_D);
+ sub_80125BC(data->field_D);
+ CopyWindowToVram(data->field_D, 2);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ id = sub_8013E44();
+ switch (id)
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 0:
+ id = ListMenuHandleInputGetItemId(data->listTaskId);
+ if (gMain.newKeys & A_BUTTON && id != -1)
+ {
+ // this unused variable along with the assignment is needed to match
+ u32 unusedVar;
+ unusedVar = data->field_0->arr[id].unk.field_0.unk_0a_0;
+
+ if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.field_0.unk_0a_7)
+ {
+ u32 var = sub_8013B8C(data, id);
+ if (var == 0)
+ {
+ sub_8013BD8(data, id);
+ data->state = 5;
+ PlaySE(SE_PN_ON);
+ }
+ else
+ {
+ StringCopy(gStringVar4, gUnknown_082EDD50[var - 1]);
+ data->state = 18;
+ PlaySE(SE_PN_ON);
+ }
+ }
+ else
+ {
+ PlaySE(SE_WALL_HIT);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ data->state = 10;
+ }
+ break;
+ default:
+ RedrawListMenu(data->listTaskId);
+ break;
+ }
+ break;
+ case 5:
+ sub_80130B4(gStringVar4, gUnknown_02022C2C);
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ data->state = 6;
+ }
+ break;
+ case 6:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.unk_0a_0;
+ sub_8011A64(0, 0);
+ switch (gUnknown_02022C2C)
+ {
+ case 1 ... 5:
+ case 9 ... 11:
+ case 13 ... 16:
+ case 21 ... 28:
+ data->state = 20;
+ return;
+ }
+ }
+
+ switch (sub_8011A74())
+ {
+ case 1:
+ data->state = 12;
+ break;
+ case 2:
+ case 6:
+ case 9:
+ data->state = 14;
+ break;
+ case 5:
+ sub_8013160(gStringVar4, gUnknown_02022C2C);
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ if (gUnknown_02022C2C == 28 || gUnknown_02022C2C == 14)
+ {
+ sub_8011A64(12, 0);
+ }
+ else
+ {
+ sub_8011A64(7, 0);
+ StringCopy(gStringVar1, gUnknown_082F0048[gUnknown_02022C2C]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_082EDE48);
+ }
+ }
+ break;
+ case 7:
+ if (data->field_15 > 0xF0)
+ {
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ sub_8011A64(12, 0);
+ data->field_15 = 0;
+ }
+ }
+ else
+ {
+ switch (gUnknown_02022C2C)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 14:
+ case 28:
+ break;
+ default:
+ data->field_15++;
+ break;
+ }
+ }
+ break;
+ }
+
+ if (!sub_8011A74() && gMain.newKeys & B_BUTTON)
+ data->state = 7;
+ break;
+ case 7:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDE64))
+ data->state = 8;
+ break;
+ case 8:
+ switch (sub_80170B8(&data->textState, sub_8011A74()))
+ {
+ case 0:
+ sub_80106D4();
+ data->state = 9;
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 1:
+ case -1:
+ data->state = 5;
+ RedrawListMenu(data->listTaskId);
+ break;
+ case -3:
+ data->state = 6;
+ RedrawListMenu(data->listTaskId);
+ break;
+ }
+ break;
+ case 9:
+ if (sub_8011A74())
+ data->state = 6;
+ break;
+ case 10:
+ case 12:
+ case 14:
+ case 18:
+ case 20:
+ ClearWindowTilemap(data->field_D);
+ sub_819746C(data->field_D, FALSE);
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ ClearWindowTilemap(data->field_C);
+ sub_819746C(data->listWindowId, FALSE);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->field_D);
+ RemoveWindow(data->listWindowId);
+ RemoveWindow(data->field_C);
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 13:
+ sub_800E084();
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDE9C[sub_8011A74()]))
+ {
+ gSpecialVar_Result = 6;
+ data->state = 23;
+ }
+ break;
+ case 11:
+ sub_800E084();
+ gSpecialVar_Result = 5;
+ data->state = 23;
+ break;
+ case 15:
+ sub_800E084();
+ if (PrintOnTextbox(&data->textState, gUnknown_082EDE9C[sub_8011A74()]))
+ {
+ gSpecialVar_Result = 8;
+ data->state = 23;
+ }
+ break;
+ case 19:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ gSpecialVar_Result = 8;
+ data->state = 23;
+ }
+ break;
+ case 23:
+ DestroyTask(taskId);
+ sub_80173D4();
+ sub_800EDD4();
+ break;
+ case 21:
+ sub_80149C4();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id)
+{
+ struct UnkStruct_x20 *structPtr = &arg0->field_0->arr[id];
+
+ if (gUnknown_02022C2C == 4 && structPtr->unk.field_0.unk_00.unk_01_2 != 3)
+ {
+ if (!(gSaveBlock2Ptr->specialSaveWarp & 0x80))
+ return 1;
+ else if (structPtr->unk.field_0.unk_00.unk_00_7)
+ return 0;
+ }
+ else
+ {
+ return 0;
+ }
+
+ return 2;
+}
+
+void sub_8013BD8(struct UnkStruct_Group *data, s32 id)
+{
+ data->field_F = id;
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ RedrawListMenu(data->listTaskId);
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ sub_8011090(gUnknown_082F0530[gSpecialVar_0x8004], 0, 1);
+ sub_8011FC8(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId));
+}
+
+u8 sub_8013C40(void)
+{
+ u8 taskId;
+ struct UnkStruct_Group *dataPtr;
+
+ taskId = CreateTask(sub_8013C7C, 0);
+ gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+
+ gUnknown_03000DA4 = dataPtr;
+
+ return taskId;
+}
+
+void sub_8013C7C(u8 taskId)
+{
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+
+ switch (data->state)
+ {
+ case 0:
+ sub_8010F84(0, 0, 0);
+ sub_800B488();
+ OpenLink();
+ sub_8011C5C();
+ sub_80111B0(TRUE);
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0x200);
+ data->state = 2;
+ break;
+ case 2:
+ sub_80175EC(data->field_4, 4);
+ sub_8017580(data->field_0, 16);
+ data->field_11 = sub_8016FC0(data->field_4, 0xFF);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ if (sub_8013E44() == 1)
+ PlaySE(SE_PC_LOGIN);
+ if (gTasks[taskId].data[15] == 0xFF)
+ data->state = 10;
+ break;
+ case 10:
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ sub_800EDD4();
+ data->state++;
+ break;
+ case 11:
+ sub_800EDD4();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+extern const u8 *const gUnknown_082F04D8[22];
+
+bool32 sub_8013D88(u32 arg0, u32 id)
+{
+ if (id == 0xFF)
+ return TRUE;
+
+ if (id <= ARRAY_COUNT(gUnknown_082F04D8)) // UB: <= may access data outside the array
+ {
+ const u8 *bytes = gUnknown_082F04D8[id];
+
+ while ((*(bytes) != 0xFF))
+ {
+ if ((*bytes) == arg0)
+ return TRUE;
+ bytes++;
+ }
+ }
+
+ return FALSE;
+}
+
+u8 sub_8013DBC(struct UnkStruct_Group *data, u32 id)
+{
+ if (data->field_0->arr[id].field_1A_0 == 1)
+ {
+ if (data->field_0->arr[id].unk.field_0.unk_0a_7)
+ return 3;
+ else if (data->field_0->arr[id].field_1A_1 != 0)
+ return 1;
+ else if (data->field_0->arr[id].field_1B != 0)
+ return 2;
+ }
+
+ return 0;
+}
+
+void sub_8013DF4(u8 arg0, u32 id, u8 arg2)
+{
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ u8 var = sub_8013DBC(data, id);
+
+ sub_80177B8(arg0, 8, arg2, &data->field_0->arr[id], var, id);
+}
+
+u8 sub_8013E44(void)
+{
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ u8 ret = 0;
+ u8 i;
+ s32 id;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (data->field_0->arr[i].field_1A_0 != 0)
+ {
+ id = sub_80176E4(&data->field_0->arr[i], data->field_4->arr);
+ if (id != 0xFF)
+ {
+ if (data->field_0->arr[i].field_1A_0 == 1)
+ {
+ if (sub_8017678(&data->field_0->arr[i], &data->field_4->arr[id]))
+ {
+ data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1B != 0)
+ {
+ data->field_0->arr[i].field_1B--;
+ if (data->field_0->arr[i].field_1B == 0)
+ ret = 2;
+ }
+ }
+ }
+ else
+ {
+ data->field_0->arr[i].field_1A_0 = 1;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+
+ data->field_0->arr[i].field_18 = 0;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1A_0 != 2)
+ {
+ data->field_0->arr[i].field_18++;
+ if (data->field_0->arr[i].field_18 >= 300)
+ {
+ data->field_0->arr[i].field_1A_0 = 2;
+ ret = 2;
+ }
+ }
+ }
+ }
+ }
+
+ for (id = 0; id < 4; id++)
+ {
+ if (sub_8017734(data->field_0->arr, &data->field_4->arr[id].unk0, 16) != 0xFF)
+ ret = 1;
+ }
+
+ return ret;
+}
+
+void sub_8013F60(u8 taskId)
+{
+ sub_80773AC();
+ DestroyTask(taskId);
+}
+
+u8 sub_8013F78(void)
+{
+ u8 taskId = CreateTask(sub_8013F60, 0);
+
+ return taskId;
+}
+
+extern struct MailStruct gUnknown_020321C0[PARTY_SIZE];
+extern u8 gUnknown_02032298[2];
+
+void sub_8013F90(u8 taskId)
+{
+ u32 monId = sub_8018120(&gUnknown_02022C40, GetMultiplayerId());
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gTasks[taskId].data[0]++;
+ SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon));
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ gEnemyParty[0] = *(struct Pokemon*)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]);
+ IncrementGameStat(GAME_STAT_50);
+ ResetBlockReceivedFlags();
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct MailStruct) * PARTY_SIZE + 4);
+ if (SendBlock(0, gBlockSendBuffer, sizeof(struct MailStruct) * PARTY_SIZE + 4))
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ memcpy(gUnknown_020321C0, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct MailStruct) * PARTY_SIZE);
+ ResetBlockReceivedFlags();
+ gUnknown_02032298[0] = monId;
+ gUnknown_02032298[1] = 6;
+ gMain.savedCallback = CB2_ReturnToField;
+ SetMainCallback2(sub_807AE50);
+ sub_801807C(&gUnknown_02022C40);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80140E0(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (GetMultiplayerId() == 0)
+ sub_800A4D8(2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == sub_800A9D8())
+ {
+ s32 i;
+ u16 *recvBuff;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ recvBuff = gBlockRecvBuffer[i];
+ sub_80C3120(&gTrainerCards[i], recvBuff, gLinkPlayers[i].version);
+ }
+
+ if (GetLinkPlayerCount() == 2)
+ {
+ recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1];
+ sub_801B94C(recvBuff[48]);
+ }
+ else
+ {
+ sub_801B940();
+ }
+
+ ResetBlockReceivedFlags();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80141A4(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ CreateTask(sub_80140E0, 5);
+ gMain.state++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_80140E0))
+ sub_80C4E74(GetMultiplayerId() ^ 1, CB2_ReturnToField);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_8014210(u16 battleFlags)
+{
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ gLinkPlayers[0].linkType = 0x2211;
+ gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId();
+ gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1;
+ gMain.savedCallback = sub_80B360C;
+ gBattleTypeFlags = battleFlags;
+ PlayBattleBGM();
+}
+
+void sub_8014290(u16 arg0, u16 x, u16 y)
+{
+ VarSet(VAR_0x4087, arg0);
+ Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ saved_warp2_set_2(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ warp_in();
+}
+
+void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 arg4)
+{
+ gSpecialVar_0x8004 = arg4;
+ VarSet(VAR_0x4087, arg4);
+ gFieldLinkPlayerCount = GetLinkPlayerCount();
+ gUnknown_03005DB4 = GetMultiplayerId();
+ sub_809D2BC();
+ Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y);
+ warp_in();
+}
+
+void sub_8014384(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ CreateTask(sub_80140E0, 5);
+ gMain.state++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_80140E0))
+ SetMainCallback2(sub_8086074);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_80143E4(void *arg0, bool32 arg1)
+{
+ u16 *argAsU16Ptr = arg0;
+
+ sub_80C30A4(argAsU16Ptr);
+ if (arg1)
+ argAsU16Ptr[48] = sub_801B39C();
+ else
+ argAsU16Ptr[48] = 0;
+}
+
+void sub_801440C(u8 taskId)
+{
+ sub_801B940();
+ switch (gUnknown_02022C2C)
+ {
+ case 1 ... 4:
+ case 9 ... 11:
+ case 13:
+ case 15:
+ sub_800E3A8();
+ break;
+ }
+
+ switch (gUnknown_02022C2C)
+ {
+ case 65:
+ case 81:
+ overworld_free_bg_tilemaps();
+ gMain.savedCallback = sub_801AC54;
+ sub_81B8518(3);
+ break;
+ case 1:
+ overworld_free_bg_tilemaps();
+ sub_80143E4(gBlockSendBuffer, TRUE);
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_8014304(MAP_GROUP(SINGLE_BATTLE_COLOSSEUM), MAP_NUM(SINGLE_BATTLE_COLOSSEUM), 6, 8, 1);
+ SetMainCallback2(sub_8014384);
+ break;
+ case 2:
+ overworld_free_bg_tilemaps();
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_80143E4(gBlockSendBuffer, TRUE);
+ sub_8014304(MAP_GROUP(SINGLE_BATTLE_COLOSSEUM), MAP_NUM(SINGLE_BATTLE_COLOSSEUM), 6, 8, 2);
+ SetMainCallback2(sub_8014384);
+ break;
+ case 3:
+ overworld_free_bg_tilemaps();
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ sub_80143E4(gBlockSendBuffer, TRUE);
+ sub_8014304(MAP_GROUP(DOUBLE_BATTLE_COLOSSEUM), MAP_NUM(DOUBLE_BATTLE_COLOSSEUM), 5, 8, 5);
+ SetMainCallback2(sub_8014384);
+ break;
+ case 4:
+ sub_80143E4(gBlockSendBuffer, TRUE);
+ overworld_free_bg_tilemaps();
+ sub_8014304(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, 3);
+ SetMainCallback2(sub_8014384);
+ break;
+ case 15:
+ sub_80143E4(gBlockSendBuffer, TRUE);
+ overworld_free_bg_tilemaps();
+ sub_8014304(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, 4);
+ SetMainCallback2(sub_8014384);
+ break;
+ case 68:
+ overworld_free_bg_tilemaps();
+ CreateTask(sub_8013F90, 0);
+ break;
+ case 5:
+ case 69:
+ if (GetMultiplayerId() == 0)
+ {
+ sub_800ED10();
+ }
+ else
+ {
+ sub_800ED28();
+ sub_8010F84(69, 0, 1);
+ }
+ sub_801DD98();
+ break;
+ case 8:
+ case 72:
+ sub_80143E4(gBlockSendBuffer, FALSE);
+ SetMainCallback2(sub_80141A4);
+ break;
+ case 9:
+ sub_8014290(8, 5, 1);
+ sub_802A9A8(GetCursorSelectionMonId(), CB2_LoadMap);
+ break;
+ case 10:
+ sub_8014290(7, 9, 1);
+ sub_8020C70(CB2_LoadMap);
+ break;
+ case 11:
+ sub_8014290(8, 5, 1);
+ sub_802493C(GetCursorSelectionMonId(), CB2_LoadMap);
+ break;
+ }
+
+ DestroyTask(taskId);
+ gSpecialVar_Result = 1;
+ if (gUnknown_02022C2C != 68)
+ ScriptContext2_Disable();
+}
+
+extern u8 gUnknown_0203CEF8[];
+
+void sub_8014790(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 *sendBuff = (u16*)(gBlockSendBuffer);
+
+ switch (data[0])
+ {
+ case 0:
+ gSpecialVar_Result = 1;
+ switch (gUnknown_02022C2C)
+ {
+ case 14:
+ case 28:
+ gLinkPlayers[0].linkType = 0x2211;
+ gLinkPlayers[0].id = 0;
+ gLinkPlayers[1].id = 2;
+ sendBuff[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES);
+ sendBuff[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL);
+ gMain.savedCallback = NULL;
+ data[0] = 4;
+ sub_800E3A8();
+ ResetBlockReceivedFlags();
+ break;
+ case 16:
+ case 23 ... 27:
+ sub_800E3A8();
+ DestroyTask(taskId);
+ default:
+ EnableBothScriptContexts();
+ data[0] = 1;
+ break;
+ }
+ break;
+ case 1:
+ if (!ScriptContext1_IsScriptSetUp())
+ {
+ FadeScreen(1, 0);
+ data[0] = 2;
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ if (gUnknown_02022C2C == 29)
+ {
+ DestroyTask(taskId);
+ SetMainCallback2(sub_80773AC);
+ }
+ else
+ {
+ sub_800ADF8();
+ data[0] = 3;
+ }
+ }
+ break;
+ case 3:
+ if (sub_800A520())
+ {
+ DestroyTask(taskId);
+ sub_80149D8();
+ }
+ break;
+ case 4:
+ if (SendBlock(0, gBlockSendBuffer, 0xE))
+ data[0] = 5;
+ break;
+ case 5:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ ResetBlockReceivedFlags();
+ if (sub_80B2AF4(gBlockRecvBuffer[0], gBlockRecvBuffer[1]))
+ {
+ gSpecialVar_Result = 11;
+ data[0] = 7;
+ }
+ else
+ {
+ data[0] = 6;
+ }
+ }
+ break;
+ case 6:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ case 7:
+ sub_800AC34();
+ data[0] = 8;
+ break;
+ case 8:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ sub_800E084();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80149C4(void)
+{
+ CreateTask(sub_8014790, 0);
+}
+
+void sub_80149D8(void)
+{
+ u8 taskId = CreateTask(sub_801440C, 0);
+ gTasks[taskId].data[0] = 0;
+}
+
+void sub_8014A00(u32 arg0)
+{
+ u8 taskId;
+ struct UnkStruct_Leader *dataPtr;
+
+ taskId = CreateTask(sub_8014A40, 0);
+ gUnknown_02022C30.leader = dataPtr = (void*)(gTasks[taskId].data);
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_18 = arg0;
+ gSpecialVar_Result = 0;
+}
+
+void sub_8014A40(u8 taskId)
+{
+ struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+ struct WindowTemplate winTemplate;
+ s32 val;
+
+ switch (data->state)
+ {
+ case 0:
+ gUnknown_02022C2C = data->field_18;
+ gUnknown_02022C2D = 2;
+ sub_8010F84(data->field_18, 0, 0);
+ sub_8010FA0(FALSE, FALSE);
+ sub_800B488();
+ OpenLink();
+ sub_8011C10(2);
+ data->state = 1;
+ break;
+ case 1:
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0xA0);
+ data->field_8 = AllocZeroed(0xA0);
+ sub_80175EC(data->field_4, 4);
+ sub_8017580(data->field_0, 5);
+ sub_800DF90(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName);
+ data->field_0->arr[0].field_18 = 0;
+ data->field_0->arr[0].field_1A_0 = 1;
+ data->field_0->arr[0].field_1A_1 = 0;
+ data->field_0->arr[0].field_1B = 0;
+ data->field_17 = sub_8016FC0(data->field_4, 0xFF);
+
+ winTemplate = gUnknown_082F011C;
+ winTemplate.baseBlock = sub_8019930();
+ winTemplate.paletteNum = 0xC;
+ data->listWindowId = AddWindow(&winTemplate);
+ sub_8018784(data->listWindowId);
+ gMultiuseListMenuTemplate = gUnknown_082F015C;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_13 = 1;
+ data->state = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar1, gUnknown_082F0048[gUnknown_02022C2C]);
+ sub_801262C(gStringVar4, gUnknown_02022C2C);
+ data->state = 3;
+ break;
+ case 3:
+ sub_8018884(gStringVar4);
+ data->state = 4;
+ break;
+ case 4:
+ sub_801320C(data, 5, 6);
+ if (gMain.newKeys & B_BUTTON)
+ {
+ data->state = 13;
+ sub_800E084();
+ }
+ break;
+ case 6:
+ if (mevent_0814257C(&data->textState, gUnknown_082EDF40))
+ {
+ data->field_13 = sub_8013398(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 2;
+ }
+ break;
+ case 5:
+ data->state = 7;
+ break;
+ case 7:
+ switch (sub_8018B08(&data->textState, &data->field_14, 0, gStringVar4))
+ {
+ case 0:
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_19 = 5;
+ sub_8010688(5, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 8;
+ break;
+ case 1:
+ case -1:
+ data->field_19 = 6;
+ sub_8010688(6, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->state = 8;
+ break;
+ }
+ break;
+ case 8:
+ val = sub_8010714(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ if (val == 1)
+ {
+ if (data->field_19 == 5)
+ {
+ data->field_0->arr[data->field_13].field_1B = 0;
+ RedrawListMenu(data->listTaskId);
+ data->field_13++;
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_13 - 1]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_082EDC9C);
+ data->state = 9;
+ sub_800EF38();
+ }
+ else
+ {
+ sub_8011DC0(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId));
+ data->field_0->arr[data->field_13].field_1A_0 = 0;
+ sub_8013398(data->field_0);
+ RedrawListMenu(data->listTaskId);
+ data->state = 2;
+ }
+
+ data->field_19 = 0;
+ }
+ else if (val == 2)
+ {
+ sub_8011A64(0, 0);
+ data->state = 2;
+ }
+ break;
+ case 9:
+ sub_8018884(gStringVar4);
+ data->state = 10;
+ break;
+ case 10:
+ if (++data->field_E > 120)
+ data->state = 11;
+ break;
+ case 11:
+ if (!sub_801320C(data, 5, 6))
+ data->state = 12;
+ break;
+ case 12:
+ if (sub_800EF1C())
+ {
+ sub_800EF58(FALSE);
+ data->state = 15;
+ }
+ else
+ {
+ data->state = 6;
+ }
+ break;
+ case 13:
+ sub_800E084();
+ sub_800EDD4();
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_17);
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 14:
+ if (mevent_0814257C(&data->textState, gText_PleaseStartOver))
+ {
+ DestroyTask(taskId);
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 15:
+ if (sub_8011A74() == 1 || sub_8011A74() == 2)
+ {
+ data->state = 13;
+ }
+ else if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_8011068(1);
+ data->state++;
+ }
+ break;
+ case 16:
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_17);
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_4);
+ sub_800ADF8();
+ data->state++;
+ break;
+ case 17:
+ if (sub_800A520())
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_8014EFC(u32 arg0)
+{
+ u8 taskId;
+ struct UnkStruct_Group *dataPtr;
+
+ taskId = CreateTask(sub_8014F48, 0);
+ gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
+ gUnknown_03000DA4 = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_12 = arg0 - 21;
+ gSpecialVar_Result = 0;
+}
+
+void sub_8014F48(u8 taskId)
+{
+ s32 id;
+ struct WindowTemplate winTemplate1, winTemplate2;
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+
+ switch (data->state)
+ {
+ case 0:
+ sub_8010F84(data->field_12 + 21, 0, 0);
+ sub_800B488();
+ OpenLink();
+ sub_8011C5C();
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0x200);
+ data->state = 1;
+ break;
+ case 1:
+ sub_8018884(gUnknown_082EF7F8);
+ data->state = 2;
+ break;
+ case 2:
+ sub_80175EC(data->field_4, 4);
+ sub_8017580(data->field_0, 16);
+ data->field_11 = sub_8016FC0(data->field_4, data->field_12 + 7);
+
+ winTemplate1 = gUnknown_082F0174;
+ winTemplate1.baseBlock = sub_8019930();
+ winTemplate1.paletteNum = 0xC;
+ data->listWindowId = AddWindow(&winTemplate1);
+
+ winTemplate2 = gUnknown_082F017C;
+ winTemplate2.paletteNum = 0xC;
+ data->field_D = AddWindow(&winTemplate2);
+
+ sub_8018784(data->listWindowId);
+ gMultiuseListMenuTemplate = gUnknown_082F0204;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ sub_8018784(data->field_D);
+ FillWindowPixelBuffer(data->field_D, 0x11);
+ PutWindowTilemap(data->field_D);
+ sub_80125BC(data->field_D);
+ CopyWindowToVram(data->field_D, 2);
+
+ CopyBgTilemapBufferToVram(0);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ id = sub_8013E44();
+ switch (id)
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ default:
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 0:
+ id = ListMenuHandleInputGetItemId(data->listTaskId);
+ if (gMain.newKeys & A_BUTTON && id != -1)
+ {
+ // this unused variable along with the assignment is needed to match
+ u32 unusedVar;
+ unusedVar = data->field_0->arr[id].unk.field_0.unk_0a_0;
+
+ if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.field_0.unk_0a_7)
+ {
+ data->field_F = id;
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ RedrawListMenu(data->listTaskId);
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ sub_8011FC8(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId));
+ PlaySE(SE_PN_ON);
+ data->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_WALL_HIT);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ data->state = 6;
+ }
+ break;
+ }
+ break;
+ case 4:
+ sub_8018884(gUnknown_082EFC3C);
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ data->state = 5;
+ break;
+ case 5:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.unk_0a_0;
+ data->state = 10;
+ }
+
+ switch (sub_8011A74())
+ {
+ case 1:
+ case 2:
+ case 6:
+ data->state = 8;
+ break;
+ case 5:
+ sub_8018884(gUnknown_082EDDF4);
+ sub_8011A64(0, 0);
+ break;
+ }
+ break;
+ case 6:
+ case 8:
+ case 10:
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->field_D);
+ RemoveWindow(data->listWindowId);
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 9:
+ if (mevent_0814257C(&data->textState, gUnknown_082EDF80[sub_8011A74()]))
+ {
+ sub_800E084();
+ DestroyTask(taskId);
+ sub_800EDD4();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 7:
+ sub_800E084();
+ sub_8018884(gText_PleaseStartOver);
+ DestroyTask(taskId);
+ sub_800EDD4();
+ gSpecialVar_Result = 5;
+ break;
+ case 11:
+ data->state++;
+ sub_800ADF8();
+ break;
+ case 12:
+ if (sub_800A520())
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80152A8(u32 arg0)
+{
+ u8 taskId;
+ struct UnkStruct_Group *dataPtr;
+
+ taskId = CreateTask(sub_80152F4, 0);
+ gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
+ gUnknown_03000DA4 = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_12 = arg0 - 21;
+ gSpecialVar_Result = 0;
+}
+
+void sub_80152F4(u8 taskId)
+{
+ s32 id;
+ struct WindowTemplate winTemplate;
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+
+ switch (data->state)
+ {
+ case 0:
+ sub_8010F84(0, 0, 0);
+ sub_800B488();
+ OpenLink();
+ sub_8011C5C();
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0x200);
+ data->state = 1;
+ break;
+ case 1:
+ sub_8018884(gUnknown_082EFBC8);
+ data->state = 2;
+ break;
+ case 2:
+ sub_80175EC(data->field_4, 4);
+ sub_8017580(data->field_0, 16);
+ data->field_11 = sub_8016FF0(data->field_4, data->field_12 + 7);
+
+ if (data->field_13 != 0)
+ {
+ winTemplate = gUnknown_082F0174;
+ winTemplate.baseBlock = sub_8019930();
+ data->listWindowId = AddWindow(&winTemplate);
+
+ sub_8018784(data->listWindowId);
+ gMultiuseListMenuTemplate = gUnknown_082F0204;
+ gMultiuseListMenuTemplate.windowId = data->listWindowId;
+ data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+
+ CopyBgTilemapBufferToVram(0);
+ }
+
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ id = sub_8013E44();
+ switch (id)
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ default:
+ if (data->field_13 != 0)
+ RedrawListMenu(data->listTaskId);
+ break;
+ case 0:
+ if (data->field_13 != 0)
+ id = ListMenuHandleInputGetItemId(data->listTaskId);
+ if (data->field_14 > 120)
+ {
+ if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.field_0.unk_0a_7)
+ {
+ if (sub_8016F1C(&data->field_0->arr[0], data->field_12 + 7))
+ {
+ data->field_F = 0;
+ data->field_14 = 0;
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ sub_8011FC8(data->field_0->arr[0].unk.playerName, ReadAsU16(data->field_0->arr[0].unk.field_0.unk_00.playerTrainerId));
+ PlaySE(SE_PN_ON);
+ data->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ data->state = 10;
+ }
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ data->state = 6;
+ data->field_14 = 0;
+ }
+ data->field_14++;
+ break;
+ }
+ break;
+ case 4:
+ sub_8018884(gUnknown_082EFC90);
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ data->state = 5;
+ break;
+ case 5:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.unk_0a_0;
+ data->state = 12;
+ }
+
+ switch (sub_8011A74())
+ {
+ case 1:
+ case 2:
+ case 6:
+ data->state = 8;
+ break;
+ case 5:
+ sub_8018884(gUnknown_082EDEC4);
+ sub_8011A64(0, 0);
+ break;
+ }
+ break;
+ case 6:
+ case 8:
+ case 10:
+ case 12:
+ if (data->field_13 != 0)
+ {
+ DestroyListMenuTask(data->listTaskId, 0, 0);
+ CopyBgTilemapBufferToVram(0);
+ RemoveWindow(data->listWindowId);
+ }
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ data->state++;
+ break;
+ case 9:
+ if (mevent_0814257C(&data->textState, gUnknown_082EDF04))
+ {
+ sub_800E084();
+ DestroyTask(taskId);
+ sub_800EDD4();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 7:
+ if (mevent_0814257C(&data->textState, gText_WirelessSearchCanceled))
+ {
+ sub_800E084();
+ DestroyTask(taskId);
+ sub_800EDD4();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 11:
+ if (mevent_0814257C(&data->textState, gUnknown_082EFD58[data->field_12]))
+ {
+ sub_800E084();
+ DestroyTask(taskId);
+ sub_800EDD4();
+ gSpecialVar_Result = 5;
+ }
+ break;
+ case 13:
+ data->state++;
+ sub_800ADF8();
+ break;
+ case 14:
+ if (sub_800A520())
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void UnionRoomSpecial(void)
+{
+ struct UnkStruct_URoom *dataPtr;
+
+ sub_8010F60();
+ CreateTask(sub_80156E0, 10);
+
+ // dumb line needed to match
+ gUnknown_02022C30.uRoom = gUnknown_02022C30.uRoom;
+
+ dataPtr = AllocZeroed(0x26C);
+ gUnknown_02022C30.uRoom = dataPtr;
+ gUnknown_03000DA8 = dataPtr;
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+ dataPtr->field_10 = 0;
+ dataPtr->field_12 = 0;
+
+ gSpecialVar_Result = 0;
+ sub_819A2BC(0xD0, 1);
+}
+
+u16 ReadAsU16(const u8 *ptr)
+{
+ return (ptr[1] << 8) | (ptr[0]);
+}
+
+void sub_8015664(u32 arg0, const u8 *src)
+{
+ struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom;
+
+ data->state = 8;
+ data->stateAfterPrint = arg0;
+ if (src != gStringVar4)
+ StringExpandPlaceholders(gStringVar4, src);
+}
+
+void sub_801568C(const u8 *src)
+{
+ struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom;
+
+ data->state = 26;
+ if (src != gStringVar4)
+ StringExpandPlaceholders(gStringVar4, src);
+}
+
+void sub_80156B0(struct UnkStruct_URoom *data)
+{
+ memcpy(&gDecompressionBuffer[0x3F00], data->field_0, 0x100);
+}
+
+void sub_80156C8(struct UnkStruct_URoom *data)
+{
+ memcpy(data->field_0, &gDecompressionBuffer[0x3F00], 0x100);
+}
+
+// Cannot match, please fix later.
+/*
+void sub_80156E0(u8 taskId)
+{
+ u32 id = 0;
+ s32 var5 = 0;
+ u32 playerGender = 0;
+ struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom;
+ s16 *taskData = gTasks[taskId].data;
+
+ switch (data->state)
+ {
+ case 0:
+ data->field_4 = AllocZeroed(0x70);
+ data->field_C = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0x100);
+ data->field_8 = AllocZeroed(0x20);
+ sub_8017580(data->field_0, 8);
+ gUnknown_02022C2C = 0x40;
+ data->field_20 = sub_8016DF0(data->field_C, data->field_4, 9);
+ sub_8019BA8(data->field_A0);
+ sub_8019F2C();
+ data->state = 1;
+ break;
+ case 1:
+ sub_8019E70(data->spriteIds, taskData[0]);
+ if (++taskData[0] == 8)
+ data->state = 2;
+ break;
+ case 2:
+ sub_8010F84(0x40, 0, 0);
+ sub_8010FCC(gUnknown_02022C40.field_2, gUnknown_02022C40.field_A, gUnknown_02022C40.field_C);
+ sub_800B488();
+ OpenLink();
+ sub_8011C84();
+ sub_8017580(data->field_8, 1);
+ sub_80175EC(data->field_4, 4);
+ sub_80175EC(data->field_C, 4);
+ gSpecialVar_Result = 0;
+ data->state = 3;
+ break;
+ case 3:
+ if ((sub_81B1360() == 8 || sub_81B1360() == 9) && gUnknown_02022C40.field_0 != 0)
+ {
+ id = GetCursorSelectionMonId();
+ switch (gUnknown_02022C40.field_0)
+ {
+ case 1:
+ sub_8011090(0x54, 0, 1);
+ if (id >= PARTY_SIZE)
+ {
+ sub_801807C(&gUnknown_02022C40);
+ sub_8010FCC(0, 0, 0);
+ sub_801568C(gUnknown_082EF4FC);
+ }
+ else if (!sub_80180A0(GetCursorSelectionMonId(), &gUnknown_02022C40))
+ {
+ sub_8015664(0x34, gUnknown_082EF47C);
+ }
+ else
+ {
+ data->state = 55;
+ }
+ break;
+ case 2:
+ sub_80156C8(data);
+ taskData[1] = gUnknown_02022C40.field_8;
+ if (id >= PARTY_SIZE)
+ {
+ sub_801568C(gUnknown_082EF544);
+ }
+ else
+ {
+ sub_8011090(0x54, 0, 1);
+ gUnknown_02022C2C = 0x44;
+ sub_80180E8(GetCursorSelectionMonId(), &gUnknown_02022C40);
+ data->state = 51;
+ }
+ break;
+ }
+ gUnknown_02022C40.field_0 = 0;
+ }
+ else
+ {
+ data->state = 4;
+ }
+ break;
+ case 4:
+ if (gSpecialVar_Result != 0)
+ {
+ if (gSpecialVar_Result == 9)
+ {
+ sub_8011090(0x54, 0, 1);
+ PlaySE(SE_PC_LOGIN);
+ StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
+ data->state = 42;
+ gSpecialVar_Result = 0;
+ }
+ else if (gSpecialVar_Result == 11)
+ {
+ sub_8011090(0x54, 0, 1);
+ data->state = 23;
+ gSpecialVar_Result = 0;
+ }
+ else
+ {
+ taskData[0] = 0;
+ taskData[1] = gSpecialVar_Result - 1;
+ data->state = 24;
+ gSpecialVar_Result = 0;
+ }
+ }
+ else if (ScriptContext2_IsEnabled() != TRUE)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (sub_801A2A8(data->field_0, &taskData[0], &taskData[1], data->spriteIds))
+ {
+ PlaySE(SE_SELECT);
+ sub_80181CC();
+ data->state = 24;
+ break;
+ }
+ else if (sub_8017940())
+ {
+ sub_8011090(0x54, 0, 1);
+ PlaySE(SE_PC_LOGIN);
+ sub_80181CC();
+ StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
+ data->state = 45;
+ break;
+ }
+ }
+
+ switch (sub_8016B00())
+ {
+ case 1:
+ PlaySE(SE_PC_LOGIN);
+ case 2:
+ sub_801A274(data);
+ break;
+ case 4:
+ data->state = 11;
+ sub_80181CC();
+ sub_8010FCC(0, 0, 0);
+ sub_8011090(0x53, sub_80181DC(data), 0);
+ break;
+ }
+ sub_801A284(data);
+ }
+ break;
+ case 23:
+ if (!FuncIsActiveTask(sub_809FA34))
+ {
+ sub_8011090(0x40, 0, 0);
+ data->state = 4;
+ }
+ break;
+ case 24:
+ sub_801704C();
+ playerGender = sub_8017CF8(taskData[1], data->field_0);
+ sub_8011090(0x54, 0, 1);
+ switch (sub_80179D4(data->field_0, taskData[0], taskData[1], playerGender))
+ {
+ case 0:
+ data->state = 26;
+ break;
+ case 1:
+ sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, gUnknown_02022C2C);
+ data->field_12 = id;
+ data->state = 25;
+ break;
+ case 2:
+ sub_8015664(0x13, gStringVar4);
+ break;
+ }
+ break;
+ case 25:
+ sub_801704C();
+ switch (sub_8011A74())
+ {
+ case 4:
+ sub_801818C(TRUE);
+ data->state = 4;
+ break;
+ case 1:
+ case 2:
+ if (sub_8011B90() == TRUE)
+ sub_801568C(gUnknown_082EE6C8);
+ else
+ sub_8015664(30, gUnknown_082EE6C8);
+
+ gUnknown_02022C2C = 0x40;
+ break;
+ }
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_80143E4(gBlockSendBuffer, TRUE);
+ CreateTask(sub_80140E0, 5);
+ data->state = 38;
+ }
+ break;
+ case 38:
+ if (!FuncIsActiveTask(sub_80140E0))
+ {
+ if (gUnknown_02022C2C == 0x44)
+ sub_8015664(31, gUnknown_082EE004);
+ else
+ data->state = 5;
+ }
+ break;
+ case 30:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ sub_801818C(FALSE);
+ sub_801A3D0(taskData[0], taskData[1], data->field_0);
+ data->state = 2;
+ }
+ break;
+ case 6:
+ var5 = sub_8017178(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_082F021C, &gUnknown_082F0244);
+ if (var5 != -1)
+ {
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ data->state = 28;
+ }
+ else
+ {
+ data->field_98 = 0;
+ playerGender = sub_8017CF8(taskData[1], data->field_0);
+ switch (var5)
+ {
+ case -2:
+ case 0x40:
+ data->field_4C[0] = 0x40;
+ sub_800FE50(data->field_4C);
+ StringCopy(gStringVar4, gUnknown_082EEB80[gLinkPlayers[0].gender]);
+ data->state = 32;
+ break;
+ default:
+ gUnknown_02022C2C = var5;
+ gUnknown_02022C2D = (u32)(var5) >> 8;
+ if (gUnknown_02022C2C == 0x41 && !sub_8018024())
+ {
+ sub_8015664(5, gUnknown_082EEBD0);
+ }
+ else
+ {
+ data->field_4C[0] = gUnknown_02022C2C | 0x40;
+ sub_800FE50(data->field_4C);
+ data->state = 27;
+ }
+ break;
+ }
+ }
+ }
+ break;
+ case 28:
+ StringCopy(gStringVar4, gUnknown_082EEB88);
+ data->state = 36;
+ break;
+ case 27:
+ sub_8017FD8(data);
+ playerGender = sub_8017CF8(taskData[1], data->field_0);
+ id = sub_8017984(data->field_4C[0] & 0x3F);
+ if (PrintOnTextbox(&data->textState, gUnknown_082EE82C[playerGender][id]))
+ {
+ taskData[3] = 0;
+ data->state = 29;
+ }
+ break;
+ case 32:
+ sub_800AC34();
+ data->state = 36;
+ break;
+ case 31:
+ data->field_4C[0] = 0x44;
+ data->field_4C[1] = gUnknown_02022C40.species;
+ data->field_4C[2] = gUnknown_02022C40.level;
+ sub_800FE50(data->field_4C);
+ data->state = 29;
+ break;
+ case 29:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ StringCopy(gStringVar4, gUnknown_082EEB88);
+ data->state = 28;
+ }
+ else
+ {
+ sub_8017FD8(data);
+ if (data->field_98 == 0x51)
+ {
+ if (gUnknown_02022C2C == 8)
+ {
+ sub_8018220(gStringVar4, data, FALSE);
+ data->state = 40;
+ }
+ else
+ {
+ data->state = 13;
+ }
+ }
+ else if (data->field_98 == 0x52)
+ {
+ data->state = 32;
+ sub_8017D9C(gStringVar4, gUnknown_02022C2C | 0x40, gLinkPlayers[0].gender);
+ gUnknown_02022C2C = 0;
+ }
+ }
+ break;
+ case 5:
+ case 7:
+ id = sub_80179AC(&data->field_0->arr[taskData[1]]);
+ playerGender = sub_8017CF8(taskData[1], data->field_0);
+ sub_8015664(6, gUnknown_082EE24C[id][playerGender]);
+ break;
+ case 40:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ data->state = 41;
+ sub_800ADF8();
+ data->field_98 = 0;
+ data->field_9A = 0;
+ }
+ break;
+ case 41:
+ if (sub_800A520())
+ {
+ if (GetMultiplayerId() == 0)
+ {
+ StringCopy(gStringVar1, gLinkPlayers[GetMultiplayerId() ^ 1].name);
+ id = sub_800E540(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_082EE378[id]);
+ data->state = 33;
+ }
+ else
+ {
+ data->state = 7;
+ }
+ }
+ break;
+ case 19:
+ switch (sub_80170B8(&data->textState, FALSE))
+ {
+ case 0:
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022C2C = 0x45;
+ sub_8011090(0x45, 0, 1);
+ sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, gUnknown_02022C2C);
+ data->field_12 = taskData[1];
+ data->state = 20;
+ taskData[3] = 0;
+ break;
+ case 1:
+ case -1:
+ playerGender = sub_8017CF8(taskData[1], data->field_0);
+ sub_801568C(gUnknown_082EEC9C[playerGender]);
+ break;
+ }
+ break;
+ case 20:
+ if (++taskData[2] > 60)
+ {
+ data->state = 21;
+ taskData[2] = 0;
+ }
+ break;
+ case 21:
+ switch (sub_8011A74())
+ {
+ case 4:
+ sub_801818C(TRUE);
+ data->state = 4;
+ break;
+ case 1:
+ case 2:
+ playerGender = sub_8017CF8(taskData[1], data->field_0);
+ sub_8011090(0x54, 0, 1);
+ if (sub_8011B90() == TRUE)
+ sub_801568C(gUnknown_082EED3C[playerGender]);
+ else
+ sub_8015664(30, gUnknown_082EED3C[playerGender]);
+ break;
+ case 3:
+ data->state = 22;
+ break;
+ }
+ taskData[3]++;
+ break;
+ case 22:
+ if (sub_8011A80())
+ {
+ playerGender = sub_8017CF8(taskData[1], data->field_0);
+ sub_8011090(0x54, 0, 1);
+ if (sub_8011B90() == TRUE)
+ sub_801568C(gUnknown_082EED3C[playerGender]);
+ else
+ sub_8015664(30, gUnknown_082EED3C[playerGender]);
+ }
+ if (gReceivedRemoteLinkPlayers != 0)
+ data->state = 16;
+ break;
+ case 11:
+ PlaySE(SE_PINPON);
+ sub_800EF7C();
+ data->state = 12;
+ data->field_9A = 0;
+ break;
+ case 12:
+ if (sub_8011A80())
+ {
+ sub_801818C(FALSE);
+ data->state = 2;
+ }
+ else if (gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_80143E4(gBlockSendBuffer, TRUE);
+ CreateTask(sub_80140E0, 5);
+ data->state = 39;
+ }
+ break;
+ case 39:
+ sub_801689C(data);
+ if (!FuncIsActiveTask(sub_80140E0))
+ {
+ data->state = 33;
+ StringCopy(gStringVar1, gLinkPlayers[1].name);
+ id = sub_800E540(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
+ StringExpandPlaceholders(gStringVar4, gUnknown_082EE324[id]);
+ }
+ break;
+ case 33:
+ sub_801689C(data);
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = 34;
+ break;
+ case 34:
+ sub_801689C(data);
+ if (sub_80168DC(data) && gMain.newKeys & B_BUTTON)
+ {
+ sub_8011DE0(1);
+ StringCopy(gStringVar4, gUnknown_082EE598);
+ data->state = 36;
+ }
+ break;
+ case 35:
+ sub_8015664(9, gStringVar4);
+ break;
+ case 9:
+ switch (sub_80170B8(&data->textState, FALSE))
+ {
+ case 0:
+ data->field_4C[0] = 0x51;
+ if (gUnknown_02022C2C == 0x45)
+ sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 0);
+ else
+ sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 1);
+
+ data->field_8->arr[0].field_1B = 0;
+ taskData[3] = 0;
+ if (gUnknown_02022C2C == 0x41)
+ {
+ if (!sub_8018024())
+ {
+ data->field_4C[0] = 0x52;
+ sub_800FE50(data->field_4C);
+ data->state = 10;
+ StringCopy(gStringVar4, gUnknown_082EEC14);
+ }
+ else
+ {
+ sub_800FE50(data->field_4C);
+ data->state = 13;
+ }
+ }
+ else if (gUnknown_02022C2C == 0x48)
+ {
+ sub_800FE50(data->field_4C);
+ sub_8018220(gStringVar4, data, 1);
+ data->state = 40;
+ }
+ else
+ {
+ sub_800FE50(data->field_4C);
+ data->state = 13;
+ }
+ break;
+ case 1:
+ case -1:
+ data->field_4C[0] = 0x52;
+ sub_800FE50(data->field_4C);
+ data->state = 10;
+ sub_8013078(gStringVar4, gUnknown_02022C2C);
+ break;
+ }
+ break;
+ case 10:
+ sub_800AC34();
+ data->state = 36;
+ break;
+ case 36:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gUnknown_02022C2C = 0x40;
+ sub_8015664(0x25, gStringVar4);
+ memset(data->field_4C, 0, sizeof(data->field_4C));
+ data->field_9A = 0;
+ data->field_98 = 0;
+ }
+ break;
+ case 37:
+ data->state = 2;
+ sub_801818C(FALSE);
+ break;
+ case 13:
+ sub_8017E00(gStringVar4, gUnknown_02022C2C | 0x40);
+ sub_8015664(0xE, gStringVar4);
+ break;
+ case 14:
+ sub_800ADF8();
+ data->state = 15;
+ break;
+ case 15:
+ if (sub_800A520())
+ data->state = 16;
+ break;
+ case 16:
+ Free(data->field_8);
+ Free(data->field_0);
+ Free(data->field_C);
+ Free(data->field_4);
+ DestroyTask(data->field_20);
+ sub_8019F04(data->spriteIds);
+ data->state = 17;
+ break;
+ case 17:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK);
+ data->state = 18;
+ break;
+ case 18:
+ if (!UpdatePaletteFade())
+ {
+ sub_8019E3C();
+ DestroyTask(taskId);
+ Free(gUnknown_02022C30.uRoom);
+ sub_80149D8();
+ }
+ break;
+ case 42:
+ if (sub_800F7DC()->species == SPECIES_NONE)
+ {
+ data->state = 43;
+ }
+ else
+ {
+ if (sub_800F7DC()->species == SPECIES_EGG)
+ {
+ StringCopy(gStringVar4, gUnknown_082EF590);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gSpeciesNames[sub_800F7DC()->species]);
+ ConvertIntToDecimalStringN(gStringVar2, sub_800F7DC()->unk_0b_1, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringExpandPlaceholders(gStringVar4, gUnknown_082EF564);
+ }
+ sub_8015664(44, gStringVar4);
+ }
+ break;
+ case 43:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EF20C))
+ data->state = 47;
+ break;
+ case 47:
+ var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F025C, &gUnknown_082F027C);
+ if (var5 != -1)
+ {
+ if (var5 == -2 || var5 == 3)
+ {
+ data->state = 4;
+ sub_801818C(TRUE);
+ }
+ else
+ {
+ switch (var5)
+ {
+ case 1:
+ sub_8015664(53, gUnknown_082EF4C4);
+ break;
+ case 2:
+ sub_8015664(47, gUnknown_082EF298);
+ break;
+ }
+ }
+ }
+ break;
+ case 53:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ data->state = 54;
+ break;
+ case 54:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02022C40.field_0 = 1;
+ gFieldCallback = sub_80AF128;
+ sub_81B8904(8, CB2_ReturnToField);
+ }
+ break;
+ case 52:
+ var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F0294, &gUnknown_082F032C);
+ if (var5 != -1)
+ {
+ switch (var5)
+ {
+ case -2:
+ case 18:
+ sub_801807C(&gUnknown_02022C40);
+ sub_8010FCC(0, 0, 0);
+ sub_801568C(gUnknown_082EF4FC);
+ break;
+ default:
+ gUnknown_02022C40.field_2 = var5;
+ data->state = 55;
+ break;
+ }
+ }
+ break;
+ case 55:
+ sub_8010FCC(gUnknown_02022C40.field_2, gUnknown_02022C40.field_A, gUnknown_02022C40.field_C);
+ sub_801568C(gUnknown_082EF520);
+ break;
+ case 44:
+ switch (sub_80170B8(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 56;
+ break;
+ case 1:
+ case -1:
+ sub_801818C(TRUE);
+ data->state = 4;
+ break;
+ }
+ break;
+ case 56:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EF5B8))
+ {
+ sub_8010FCC(0, 0, 0);
+ sub_801807C(&gUnknown_02022C40);
+ sub_801818C(TRUE);
+ data->state = 4;
+ }
+ break;
+ case 45:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EF1EC))
+ data->state = 46;
+ break;
+ case 46:
+ sub_80173B0();
+ data->state = 48;
+ break;
+ case 48:
+ var5 = sub_80172A0(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_082F034C, &gUnknown_082F03A4, data->field_0);
+ if (var5 != -1)
+ {
+ switch (var5)
+ {
+ case -2:
+ case 8:
+ sub_801818C(TRUE);
+ data->state = 4;
+ break;
+ default:
+ sub_80173B0();
+ switch (sub_8017D04(data->field_0->arr[var5].unk.field_0.type, data->field_0->arr[var5].unk.field_0.species))
+ {
+ case 0:
+ sub_8018404(gStringVar1, &data->field_0->arr[var5]);
+ sub_8015664(49, gUnknown_082EF65C);
+ taskData[1] = var5;
+ break;
+ case 1:
+ sub_8018404(gStringVar1, &data->field_0->arr[var5]);
+ StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.field_0.type]);
+ sub_8015664(46, gUnknown_082EF6E4);
+ break;
+ case 2:
+ sub_8018404(gStringVar1, &data->field_0->arr[var5]);
+ StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.field_0.type]);
+ sub_8015664(46, gUnknown_082EF718);
+ break;
+ }
+ break;
+ }
+ }
+ break;
+ case 49:
+ switch (sub_80170B8(&data->textState, FALSE))
+ {
+ case 0:
+ data->state = 50;
+ break;
+ case -1:
+ case 1:
+ sub_801818C(TRUE);
+ data->state = 4;
+ break;
+ }
+ break;
+ case 50:
+ if (PrintOnTextbox(&data->textState, gUnknown_082EF4C4))
+ {
+ gUnknown_02022C40.field_0 = 2;
+ memcpy(&gUnknown_02022C38, &data->field_0->arr[taskData[1]].unk.field_0.unk_00, sizeof(gUnknown_02022C38));
+ gUnknown_02022C3E = data->field_0->arr[taskData[1]].unk.field_0.type;
+ gUnknown_02022C3C = data->field_0->arr[taskData[1]].unk.field_0.species;
+ gFieldCallback = sub_80AF128;
+ sub_81B8904(9, CB2_ReturnToField);
+ sub_80156B0(data);
+ gUnknown_02022C40.field_8 = taskData[1];
+ }
+ break;
+ case 51:
+ gUnknown_02022C2C = 0x44;
+ sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, 0x44);
+ sub_8018404(gStringVar1, &data->field_0->arr[taskData[1]]);
+ sub_8017020(gUnknown_082EE17C[2]);
+ data->state = 25;
+ break;
+ case 26:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ {
+ sub_801818C(TRUE);
+ sub_801A3D0(taskData[0], taskData[1], data->field_0);
+ data->state = 4;
+ }
+ break;
+ case 8:
+ if (PrintOnTextbox(&data->textState, gStringVar4))
+ data->state = data->stateAfterPrint;
+ break;
+ }
+}
+
+void var_800D_set_xB(void)
+{
+ if (InUnionRoom() == TRUE)
+ gSpecialVar_Result = 11;
+}
+
+*/
diff --git a/src/rom_8034C54.c b/src/rom_8034C54.c
new file mode 100644
index 000000000..42df51295
--- /dev/null
+++ b/src/rom_8034C54.c
@@ -0,0 +1,453 @@
+#include "global.h"
+#include "rom_8034C54.h"
+#include "malloc.h"
+#include "decompress.h"
+#include "main.h"
+
+struct UnkStruct2
+{
+ bool8 isActive;
+ u8 firstOamId;
+ u8 field_2;
+ u8 oamCount;
+ u8 palTagIndex;
+ u8 size;
+ u8 shape;
+ u8 priority;
+ u8 xDelta;
+ u8 field_9;
+ u16 tileStart;
+ s16 x;
+ s16 y;
+ u16 tileTag;
+ u16 palTag;
+ u32 field_14;
+ s32 field_18;
+};
+
+struct UnkStruct1
+{
+ u32 count;
+ struct UnkStruct2 *array;
+};
+
+extern struct UnkStruct1 *gUnknown_02022E10;
+
+extern const struct SpriteTemplate gUnknown_0831AC88;
+
+// this file's functions
+static u8 sub_8035518(u8 arg0);;
+static void sub_8034EFC(struct UnkStruct2 *arg0);
+static void sub_80350B0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
+static void sub_8035164(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
+static void sub_80352C0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2);
+static bool32 SharesTileWithAnyActive(u32 id);
+static bool32 SharesPalWithAnyActive(u32 id);
+static void sub_8035648(void);
+
+// iwram
+static IWRAM_DATA s32 gUnknown_03000DD4;
+static IWRAM_DATA s32 gUnknown_03000DD8;
+static IWRAM_DATA s32 gUnknown_03000DDC;
+
+// const rom data
+static const u8 gUnknown_082FF1C8[][4] =
+{
+ {0x01, 0x04, 0x10, 0x40},
+ {0x02, 0x04, 0x08, 0x20},
+ {0x02, 0x04, 0x08, 0x20},
+ {0x00, 0x00, 0x00, 0x00}
+};
+
+// code
+bool32 sub_8034C54(u32 count)
+{
+ u32 i;
+
+ if (gUnknown_02022E10 != NULL)
+ sub_8034CC8();
+
+ gUnknown_02022E10 = Alloc(sizeof(*gUnknown_02022E10));
+ if (gUnknown_02022E10 == NULL)
+ return FALSE;
+
+ gUnknown_02022E10->array = Alloc(sizeof(struct UnkStruct2) * count);
+ if (gUnknown_02022E10->array == NULL)
+ {
+ Free(gUnknown_02022E10);
+ return FALSE;
+ }
+
+ gUnknown_02022E10->count = count;
+ for (i = 0; i < count; i++)
+ {
+ gUnknown_02022E10->array[i].isActive = FALSE;
+ gUnknown_02022E10->array[i].firstOamId |= 0xFF;
+ }
+
+ return TRUE;
+}
+
+void sub_8034CC8(void)
+{
+ if (gUnknown_02022E10 != NULL)
+ {
+ if (gUnknown_02022E10->array != NULL)
+ {
+ u32 i;
+
+ for (i = 0; i < gUnknown_02022E10->count; i++)
+ sub_80353DC(i);
+
+ Free(gUnknown_02022E10->array);
+ }
+
+ FREE_AND_SET_NULL(gUnknown_02022E10);
+ }
+}
+
+bool32 sub_8034D14(u32 id, s32 arg1, const struct UnkStruct3 *arg2)
+{
+ u32 i;
+
+ if (gUnknown_02022E10 == NULL)
+ return FALSE;
+ if (gUnknown_02022E10->array[id].isActive)
+ return FALSE;
+
+ gUnknown_02022E10->array[id].firstOamId = sub_8035518(arg2->field_1);
+ if (gUnknown_02022E10->array[id].firstOamId == 0xFF)
+ return FALSE;
+
+ gUnknown_02022E10->array[id].tileStart = GetSpriteTileStartByTag(arg2->spriteSheet->tag);
+ if (gUnknown_02022E10->array[id].tileStart == 0xFFFF)
+ {
+ if (arg2->spriteSheet->size != 0)
+ {
+ gUnknown_02022E10->array[id].tileStart = LoadSpriteSheet(arg2->spriteSheet);
+ }
+ else
+ {
+ struct CompressedSpriteSheet compSpriteSheet;
+
+ compSpriteSheet = *(struct CompressedSpriteSheet*)(arg2->spriteSheet);
+ compSpriteSheet.size = GetDecompressedDataSize(arg2->spriteSheet->data);
+ gUnknown_02022E10->array[id].tileStart = LoadCompressedObjectPic(&compSpriteSheet);
+ }
+
+ if (gUnknown_02022E10->array[id].tileStart == 0xFFFF)
+ return FALSE;
+ }
+
+ gUnknown_02022E10->array[id].palTagIndex = IndexOfSpritePaletteTag(arg2->spritePal->tag);
+ if (gUnknown_02022E10->array[id].palTagIndex == 0xFF)
+ gUnknown_02022E10->array[id].palTagIndex = LoadSpritePalette(arg2->spritePal);
+
+ gUnknown_02022E10->array[id].field_2 = arg2->field_0_0;
+ gUnknown_02022E10->array[id].oamCount = arg2->field_1;
+ gUnknown_02022E10->array[id].x = arg2->x;
+ gUnknown_02022E10->array[id].y = arg2->y;
+ gUnknown_02022E10->array[id].shape = arg2->shape;
+ gUnknown_02022E10->array[id].size = arg2->size;
+ gUnknown_02022E10->array[id].priority = arg2->priority;
+ gUnknown_02022E10->array[id].xDelta = arg2->xDelta;
+ gUnknown_02022E10->array[id].field_9 = sub_80355F8(arg2->shape, arg2->size);
+ gUnknown_02022E10->array[id].tileTag = arg2->spriteSheet->tag;
+ gUnknown_02022E10->array[id].palTag = arg2->spritePal->tag;
+ gUnknown_02022E10->array[id].isActive = TRUE;
+ gUnknown_02022E10->array[id].field_14 = 1;
+
+ for (i = 1; i < arg2->field_1; i++)
+ gUnknown_02022E10->array[id].field_14 *= 10;
+
+ sub_8034EFC(&gUnknown_02022E10->array[id]);
+ sub_8035044(id, arg1);
+
+ return TRUE;
+}
+
+static void sub_8034EFC(struct UnkStruct2 *arg0)
+{
+ u32 i;
+ u32 oamId = arg0->firstOamId;
+ u32 x = arg0->x;
+ u32 oamCount = arg0->oamCount + 1;
+
+ CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount);
+ for (i = 0, oamId = arg0->firstOamId; i < oamCount; i++, oamId++)
+ {
+ gMain.oamBuffer[oamId].y = arg0->y;
+ gMain.oamBuffer[oamId].x = x;
+ gMain.oamBuffer[oamId].shape = arg0->shape;
+ gMain.oamBuffer[oamId].size = arg0->size;
+ gMain.oamBuffer[oamId].tileNum = arg0->tileStart;
+ gMain.oamBuffer[oamId].priority = arg0->priority;
+ gMain.oamBuffer[oamId].paletteNum = arg0->palTagIndex;
+
+ x += arg0->xDelta;
+ }
+
+ oamId--;
+ gMain.oamBuffer[oamId].x = arg0->x - arg0->xDelta;
+ gMain.oamBuffer[oamId].affineMode = 2;
+ gMain.oamBuffer[oamId].tileNum = arg0->tileStart + (arg0->field_9 * 10);
+}
+
+void sub_8035044(u32 id, s32 arg1)
+{
+ bool32 r2;
+
+ if (gUnknown_02022E10 == NULL)
+ return;
+ if (!gUnknown_02022E10->array[id].isActive)
+ return;
+
+ gUnknown_02022E10->array[id].field_18 = arg1;
+ if (arg1 < 0)
+ {
+ r2 = TRUE;
+ arg1 *= -1;
+ }
+ else
+ {
+ r2 = FALSE;
+ }
+
+ switch (gUnknown_02022E10->array[id].field_2)
+ {
+ case 0:
+ default:
+ sub_80350B0(&gUnknown_02022E10->array[id], arg1, r2);
+ break;
+ case 1:
+ sub_8035164(&gUnknown_02022E10->array[id], arg1, r2);
+ break;
+ case 2:
+ sub_80352C0(&gUnknown_02022E10->array[id], arg1, r2);
+ break;
+ }
+}
+
+static void sub_80350B0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
+{
+ u32 r5 = arg0->field_14;
+ u32 oamId = arg0->firstOamId;
+
+ while (r5 != 0)
+ {
+ u32 r4 = arg1 / r5;
+ arg1 -= (r4 * r5);
+ r5 /= 10;
+
+ gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
+ oamId++;
+ }
+
+ if (arg2)
+ gMain.oamBuffer[oamId].affineMode = 0;
+ else
+ gMain.oamBuffer[oamId].affineMode = 2;
+}
+
+static void sub_8035164(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
+{
+ u32 r5 = arg0->field_14;
+ gUnknown_03000DD4 = arg0->firstOamId;
+ gUnknown_03000DD8 = 0;
+ gUnknown_03000DDC = -1;
+
+ while (r5 != 0)
+ {
+ u32 r4 = arg1 / r5;
+ arg1 -= (r4 * r5);
+ r5 /= 10;
+
+ if (r4 != 0 || gUnknown_03000DDC != -1 || r5 == 0)
+ {
+ gMain.oamBuffer[gUnknown_03000DD4].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
+ gMain.oamBuffer[gUnknown_03000DD4].affineMode = 0;
+
+ if (gUnknown_03000DDC == -1)
+ gUnknown_03000DDC = gUnknown_03000DD8;
+ }
+ else
+ {
+ gMain.oamBuffer[gUnknown_03000DD4].affineMode = 2;
+ }
+
+ gUnknown_03000DD4++;
+ gUnknown_03000DD8++;
+ }
+
+ if (arg2)
+ {
+ gMain.oamBuffer[gUnknown_03000DD4].affineMode = 0;
+ gMain.oamBuffer[gUnknown_03000DD4].x = arg0->x + ((gUnknown_03000DDC - 1) * arg0->xDelta);
+ }
+ else
+ {
+ gMain.oamBuffer[gUnknown_03000DD4].affineMode = 2;
+ }
+}
+
+static void sub_80352C0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2)
+{
+ u32 r5 = arg0->field_14;
+ u32 oamId = arg0->firstOamId;
+ u32 var_28 = 0;
+ s32 r9 = 0;
+
+ while (r5 != 0)
+ {
+ u32 r4 = arg1 / r5;
+ arg1 -= (r4 * r5);
+ r5 /= 10;
+
+ if (r4 != 0 || var_28 != 0 || r5 == 0)
+ {
+ var_28 = 1;
+ gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart;
+ gMain.oamBuffer[oamId].affineMode = 0;
+
+ oamId++;
+ r9++;
+ }
+ }
+
+ while (r9 < arg0->oamCount)
+ {
+ gMain.oamBuffer[oamId].affineMode = 2;
+ oamId++;
+ r9++;
+ }
+
+ if (arg2)
+ gMain.oamBuffer[oamId].affineMode = 0;
+ else
+ gMain.oamBuffer[oamId].affineMode = 2;
+}
+
+void sub_80353DC(u32 id)
+{
+ s32 oamId, oamCount, i;
+
+ if (gUnknown_02022E10 == NULL)
+ return;
+ if (!gUnknown_02022E10->array[id].isActive)
+ return;
+
+ oamCount = gUnknown_02022E10->array[id].oamCount + 1;
+ oamId = gUnknown_02022E10->array[id].firstOamId;
+
+ for (i = 0; i < oamCount; i++, oamId++)
+ gMain.oamBuffer[oamId].affineMode = 2;
+
+ if (!SharesTileWithAnyActive(id))
+ FreeSpriteTilesByTag(gUnknown_02022E10->array[id].tileTag);
+ if (!SharesPalWithAnyActive(id))
+ FreeSpritePaletteByTag(gUnknown_02022E10->array[id].palTag);
+
+ gUnknown_02022E10->array[id].isActive = FALSE;
+}
+
+void sub_803547C(u32 id, bool32 arg1)
+{
+ s32 oamId, oamCount, i;
+
+ if (gUnknown_02022E10 == NULL)
+ return;
+ if (!gUnknown_02022E10->array[id].isActive)
+ return;
+
+ oamCount = gUnknown_02022E10->array[id].oamCount + 1;
+ oamId = gUnknown_02022E10->array[id].firstOamId;
+ if (arg1)
+ {
+ for (i = 0; i < oamCount; i++, oamId++)
+ gMain.oamBuffer[oamId].affineMode = 2;
+ }
+ else
+ {
+ for (i = 0; i < oamCount; i++, oamId++)
+ gMain.oamBuffer[oamId].affineMode = 0;
+
+ sub_8035044(id, gUnknown_02022E10->array[id].field_18);
+ }
+}
+
+static u8 sub_8035518(u8 arg0)
+{
+ u32 i;
+ u16 oamCount = 64;
+
+ for (i = 0; i < gUnknown_02022E10->count; i++)
+ {
+ if (!gUnknown_02022E10->array[i].isActive)
+ {
+ if (gUnknown_02022E10->array[i].firstOamId != 0xFF && gUnknown_02022E10->array[i].oamCount <= arg0)
+ return gUnknown_02022E10->array[i].firstOamId;
+ }
+ else
+ {
+ oamCount += 1 + gUnknown_02022E10->array[i].oamCount;
+ }
+ }
+
+ if (oamCount + arg0 + 1 > 128)
+ return 0xFF;
+ else
+ return oamCount;
+}
+
+static bool32 SharesTileWithAnyActive(u32 id)
+{
+ u32 i;
+
+ for (i = 0; i < gUnknown_02022E10->count; i++)
+ {
+ if (gUnknown_02022E10->array[i].isActive && i != id
+ && gUnknown_02022E10->array[i].tileTag == gUnknown_02022E10->array[id].tileTag)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool32 SharesPalWithAnyActive(u32 id)
+{
+ u32 i;
+
+ for (i = 0; i < gUnknown_02022E10->count; i++)
+ {
+ if (gUnknown_02022E10->array[i].isActive && i != id
+ && gUnknown_02022E10->array[i].palTag == gUnknown_02022E10->array[id].palTag)
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+u8 sub_80355F8(u32 arg0, u32 arg1)
+{
+ return gUnknown_082FF1C8[arg0][arg1];
+}
+
+static void sub_8035608(void)
+{
+ u8 spriteId;
+
+ ResetSpriteData();
+ spriteId = CreateSprite(&gUnknown_0831AC88, 0, 0, 0);
+ gSprites[spriteId].invisible = 1;
+ SetMainCallback2(sub_8035648);
+}
+
+static void sub_8035648(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+}
diff --git a/src/rotating_gate.c b/src/rotating_gate.c
new file mode 100644
index 000000000..1f5ef165f
--- /dev/null
+++ b/src/rotating_gate.c
@@ -0,0 +1,1188 @@
+#include "global.h"
+#include "bike.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "constants/maps.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+
+#define ROTATING_GATE_TILE_TAG 0x1300
+#define ROTATING_GATE_PUZZLE_MAX 12
+#define GATE_ARM_MAX_LENGTH 2
+
+#define GATE_ROT(rotationDirection, arm, longArm) \
+ ((rotationDirection & 15) << 4) | ((arm & 7) << 1) | (longArm & 1)
+#define GATE_ROT_CW(arm, longArm) GATE_ROT(ROTATE_CLOCKWISE, arm, longArm)
+#define GATE_ROT_ACW(arm, longArm) GATE_ROT(ROTATE_ANTICLOCKWISE, arm, longArm)
+#define GATE_ROT_NONE 255
+
+// static functions
+static void SpriteCallback_RotatingGate(struct Sprite *sprite);
+static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY);
+static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite);
+
+// enums
+enum
+{
+ /*
+ * |
+ * +--
+ */
+ GATE_SHAPE_L1,
+
+ /*
+ * |
+ * |
+ * +--
+ */
+ GATE_SHAPE_L2,
+
+ /*
+ * |
+ * +----
+ */
+ GATE_SHAPE_L3,
+
+ /*
+ * |
+ * |
+ * +----
+ */
+ GATE_SHAPE_L4,
+
+ /*
+ * |
+ * +--
+ * |
+ */
+ GATE_SHAPE_T1,
+
+ /*
+ * |
+ * |
+ * +--
+ * |
+ */
+ GATE_SHAPE_T2,
+
+ /*
+ * |
+ * +----
+ * |
+ */
+ GATE_SHAPE_T3,
+
+ /*
+ * An unused T-shape gate
+ * |
+ * +--
+ * |
+ * |
+ */
+ GATE_SHAPE_T4,
+
+ /*
+ * An unused T-shape gate
+ * |
+ * |
+ * +----
+ * |
+ */
+ GATE_SHAPE_UNUSED_T1,
+
+ /*
+ * An unused T-shape gate
+ * |
+ * |
+ * +--
+ * |
+ * |
+ */
+ GATE_SHAPE_UNUSED_T2,
+
+ /*
+ * An unused T-shape gate
+ * |
+ * +----
+ * |
+ * |
+ */
+ GATE_SHAPE_UNUSED_T3,
+
+ /*
+ * An unused T-shape gate
+ * |
+ * |
+ * +----
+ * |
+ * |
+ */
+ GATE_SHAPE_UNUSED_T4,
+};
+
+enum
+{
+ /*
+ * 0 degrees (clockwise)
+ * |
+ * +--
+ * |
+ */
+ GATE_ORIENTATION_0,
+
+ /*
+ * 90 degress (clockwise)
+ * --+--
+ * |
+ */
+ GATE_ORIENTATION_90,
+
+ /*
+ * 180 degrees (clockwise)
+ * |
+ * --+
+ * |
+ */
+ GATE_ORIENTATION_180,
+
+ /*
+ * 270 degrees (clockwise)
+ * |
+ * --+--
+ */
+ GATE_ORIENTATION_270,
+
+ GATE_ORIENTATION_MAX,
+};
+
+// Describes the location of the gates "arms" when the gate has not
+// been rotated (i.e. rotated 0 degrees)
+enum
+{
+ GATE_ARM_NORTH,
+ GATE_ARM_EAST,
+ GATE_ARM_SOUTH,
+ GATE_ARM_WEST,
+};
+
+enum
+{
+ ROTATE_NONE,
+ ROTATE_ANTICLOCKWISE,
+ ROTATE_CLOCKWISE,
+};
+
+enum
+{
+ PUZZLE_NONE,
+ PUZZLE_FORTREE_CITY_GYM,
+ PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6,
+};
+
+// structure
+struct RotatingGatePuzzle
+{
+ s16 x;
+ s16 y;
+ u8 shape;
+ u8 orientation;
+};
+
+struct Coords8
+{
+ s8 deltaX;
+ s8 deltaY;
+};
+
+// .rodata
+// Fortree
+static const struct RotatingGatePuzzle sRotatingGate_FortreePuzzleConfig[] =
+{
+ { 6, 7, GATE_SHAPE_T2, GATE_ORIENTATION_90},
+ { 9, 15, GATE_SHAPE_T2, GATE_ORIENTATION_180},
+ { 3, 19, GATE_SHAPE_T2, GATE_ORIENTATION_90},
+ { 2, 6, GATE_SHAPE_T1, GATE_ORIENTATION_90},
+ { 9, 12, GATE_SHAPE_T1, GATE_ORIENTATION_0},
+ { 6, 23, GATE_SHAPE_T1, GATE_ORIENTATION_0},
+ {12, 22, GATE_SHAPE_T1, GATE_ORIENTATION_0},
+ { 6, 3, GATE_SHAPE_L4, GATE_ORIENTATION_180},
+};
+
+// Trickhouse
+static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] =
+{
+ {14, 5, GATE_SHAPE_T1, GATE_ORIENTATION_90},
+ {10, 6, GATE_SHAPE_L2, GATE_ORIENTATION_180},
+ { 6, 6, GATE_SHAPE_L4, GATE_ORIENTATION_90},
+ {14, 8, GATE_SHAPE_T1, GATE_ORIENTATION_90},
+ { 3, 10, GATE_SHAPE_L3, GATE_ORIENTATION_270},
+ { 9, 14, GATE_SHAPE_L1, GATE_ORIENTATION_90},
+ { 3, 15, GATE_SHAPE_T3, GATE_ORIENTATION_0},
+ { 2, 17, GATE_SHAPE_L2, GATE_ORIENTATION_180},
+ {12, 18, GATE_SHAPE_T3, GATE_ORIENTATION_270},
+ { 5, 18, GATE_SHAPE_L4, GATE_ORIENTATION_90},
+ {10, 19, GATE_SHAPE_L3, GATE_ORIENTATION_180},
+};
+
+static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/misc/rotating_gate_1.4bpp");
+static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/misc/rotating_gate_2.4bpp");
+static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/misc/rotating_gate_3.4bpp");
+static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/misc/rotating_gate_4.4bpp");
+static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/misc/rotating_gate_5.4bpp");
+static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/misc/rotating_gate_6.4bpp");
+static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/misc/rotating_gate_7.4bpp");
+static const u8 sRotatingGateTiles_8[] = INCBIN_U8("graphics/misc/rotating_gate_8.4bpp");
+
+static const struct OamData sOamData_RotatingGateLarge =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 2,
+ .affineParam = 0,
+};
+
+static const struct OamData sOamData_RotatingGateRegular =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 2,
+ .affineParam = 0,
+};
+
+static const struct SpriteSheet sRotatingGatesGraphicsTable[] =
+{
+ {sRotatingGateTiles_1, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L1},
+ {sRotatingGateTiles_2, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L2},
+ {sRotatingGateTiles_3, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L3},
+ {sRotatingGateTiles_4, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L4},
+ {sRotatingGateTiles_5, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T1},
+ {sRotatingGateTiles_6, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T2},
+ {sRotatingGateTiles_7, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T3},
+ {sRotatingGateTiles_8, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T4},
+ {NULL},
+};
+
+static const union AnimCmd sSpriteAnim_RotatingGateLarge[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_RotatingGateRegular[] =
+{
+ ANIMCMD_FRAME(0, 0), ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_RotatingGateLarge[] =
+{
+ sSpriteAnim_RotatingGateLarge,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_RotatingGateRegular[] =
+{
+ sSpriteAnim_RotatingGateRegular,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_Rotated0[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_Rotated90[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_Rotated180[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_Rotated270[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0Faster[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_RotatingGate[] =
+{
+ sSpriteAffineAnim_Rotated0,
+ sSpriteAffineAnim_Rotated90,
+ sSpriteAffineAnim_Rotated180,
+ sSpriteAffineAnim_Rotated270,
+ sSpriteAffineAnim_RotatingAnticlockwise360to270,
+ sSpriteAffineAnim_RotatingAnticlockwise90to0,
+ sSpriteAffineAnim_RotatingAnticlockwise180to90,
+ sSpriteAffineAnim_RotatingAnticlockwise270to180,
+ sSpriteAffineAnim_RotatingClockwise0to90,
+ sSpriteAffineAnim_RotatingClockwise90to180,
+ sSpriteAffineAnim_RotatingClockwise180to270,
+ sSpriteAffineAnim_RotatingClockwise270to360,
+ sSpriteAffineAnim_RotatingAnticlockwise360to270Faster,
+ sSpriteAffineAnim_RotatingAnticlockwise90to0Faster,
+ sSpriteAffineAnim_RotatingAnticlockwise180to90Faster,
+ sSpriteAffineAnim_RotatingAnticlockwise270to180Faster,
+ sSpriteAffineAnim_RotatingClockwise0to90Faster,
+ sSpriteAffineAnim_RotatingClockwise90to180Faster,
+ sSpriteAffineAnim_RotatingClockwise180to270Faster,
+ sSpriteAffineAnim_RotatingClockwise270to360Faster,
+};
+
+
+static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge =
+{
+ .tileTag = ROTATING_GATE_TILE_TAG,
+ .paletteTag = 0xFFFF,
+ .oam = &sOamData_RotatingGateLarge,
+ .anims = sSpriteAnimTable_RotatingGateLarge,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_RotatingGate,
+ .callback = SpriteCallback_RotatingGate,
+};
+
+static const struct SpriteTemplate sSpriteTemplate_RotatingGateRegular =
+{
+ .tileTag = ROTATING_GATE_TILE_TAG,
+ .paletteTag = 0xFFFF,
+ .oam = &sOamData_RotatingGateRegular,
+ .anims = sSpriteAnimTable_RotatingGateRegular,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_RotatingGate,
+ .callback = SpriteCallback_RotatingGate,
+};
+
+// These structures describe what happens to the gate if you hit it at
+// a given coordinate in a 4x4 grid when walking in the specified
+// direction. Either the gate does not rotate, or it rotates in the
+// given direction. This information is compared against the gate
+// "arm" layout to see if there is an arm at the position in order to
+// produce the final rotation.
+static const u8 sRotatingGate_RotationInfoNorth[4 * 4] =
+{
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE,
+ GATE_ROT_CW(GATE_ARM_WEST, 1), GATE_ROT_CW(GATE_ARM_WEST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 1),
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE,
+};
+
+static const u8 sRotatingGate_RotationInfoSouth[4 * 4] =
+{
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE,
+ GATE_ROT_ACW(GATE_ARM_WEST, 1), GATE_ROT_ACW(GATE_ARM_WEST, 0), GATE_ROT_CW(GATE_ARM_EAST, 0), GATE_ROT_CW(GATE_ARM_EAST, 1),
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE,
+};
+
+static const u8 sRotatingGate_RotationInfoWest[4 * 4] =
+{
+ GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 1), GATE_ROT_NONE, GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 0), GATE_ROT_NONE, GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE, GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE, GATE_ROT_NONE,
+};
+
+static const u8 sRotatingGate_RotationInfoEast[4 * 4] =
+{
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 1), GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 0), GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE,
+ GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE,
+};
+
+// These tables describe the relative coordinate positions the arms
+// must move through in order to be rotated.
+static const struct Coords8 sRotatingGate_ArmPositionsClockwiseRotation[] = {
+ { 0, -1 }, { 1, -2 }, { 0, 0 }, { 1, 0 }, { -1, 0 }, { -1, 1 }, { -1, -1 }, { -2, -1 },
+};
+
+static const struct Coords8 sRotatingGate_ArmPositionsAntiClockwiseRotation[] = {
+ { -1, -1 }, { -1, -2 }, { 0, -1 }, { 1, -1 }, { 0, 0 }, { 0, 1 }, { -1, 0 }, { -2, 0 },
+};
+
+// Describes where the gates "arms" are in the order north, east, south, west.
+// These are adjusted using the current orientation to perform collision checking
+static const u8 sRotatingGate_ArmLayout[][4 * 2] =
+{
+ // L-shape gates
+ {
+ 1, 0,
+ 1, 0,
+ 0, 0,
+ 0, 0,
+ },
+ {
+ 1, 1,
+ 1, 0,
+ 0, 0,
+ 0, 0,
+ },
+ {
+ 1, 0,
+ 1, 1,
+ 0, 0,
+ 0, 0,
+ },
+ {
+ 1, 1,
+ 1, 1,
+ 0, 0,
+ 0, 0,
+ },
+
+ // T-shape gates
+ {
+ 1, 0,
+ 1, 0,
+ 1, 0,
+ 0, 0,
+ },
+ {
+ 1, 1,
+ 1, 0,
+ 1, 0,
+ 0, 0,
+ },
+ {
+ 1, 0,
+ 1, 1,
+ 1, 0,
+ 0, 0,
+ },
+ {
+ 1, 0,
+ 1, 0,
+ 1, 1,
+ 0, 0,
+ },
+
+ // Unused T-shape gates
+ // These have 2-3 long arms and cannot actually be used anywhere
+ // since configuration for them is missing from the other tables.
+ {
+ 1, 1,
+ 1, 1,
+ 1, 0,
+ 0, 0,
+ },
+ {
+ 1, 1,
+ 1, 0,
+ 1, 1,
+ 0, 0,
+ },
+ {
+ 1, 0,
+ 1, 1,
+ 1, 1,
+ 0, 0,
+ },
+ {
+ 1, 1,
+ 1, 1,
+ 1, 1,
+ 0, 0,
+ },
+};
+
+// ewram
+static EWRAM_DATA u8 gRotatingGate_GateSpriteIds[ROTATING_GATE_PUZZLE_MAX] = {0};
+static EWRAM_DATA const struct RotatingGatePuzzle *gRotatingGate_PuzzleConfig = NULL;
+static EWRAM_DATA u8 gRotatingGate_PuzzleCount = 0;
+
+// text
+static s32 GetCurrentMapRotatingGatePuzzleType(void)
+{
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FORTREE_CITY_GYM) &&
+ gSaveBlock1Ptr->location.mapNum == MAP_NUM(FORTREE_CITY_GYM))
+ {
+ return PUZZLE_FORTREE_CITY_GYM;
+ }
+
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE110_TRICK_HOUSE_PUZZLE6) &&
+ gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE110_TRICK_HOUSE_PUZZLE6))
+ {
+ return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6;
+ }
+
+ return PUZZLE_NONE;
+}
+
+static void RotatingGate_ResetAllGateOrientations(void)
+{
+ s32 i;
+ u8 *ptr;
+
+ ptr = (u8 *)GetVarPointer(VAR_TEMP_0);
+
+ for (i = 0; i < gRotatingGate_PuzzleCount; i++)
+ {
+ ptr[i] = gRotatingGate_PuzzleConfig[i].orientation;
+ }
+}
+
+static s32 RotatingGate_GetGateOrientation(u8 gateId)
+{
+ return ((u8 *)GetVarPointer(VAR_TEMP_0))[gateId];
+}
+
+static void RotatingGate_SetGateOrientation(u8 gateId, u8 orientation)
+{
+ ((u8 *)GetVarPointer(VAR_TEMP_0))[gateId] = orientation;
+}
+
+static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection)
+{
+ u8 orientation = RotatingGate_GetGateOrientation(gateId);
+
+ if (rotationDirection == ROTATE_ANTICLOCKWISE)
+ {
+ if (orientation)
+ orientation--;
+ else
+ orientation = GATE_ORIENTATION_270;
+ }
+ else
+ {
+ orientation = ++orientation % GATE_ORIENTATION_MAX;
+ }
+ RotatingGate_SetGateOrientation(gateId, orientation);
+}
+
+static void RotatingGate_LoadPuzzleConfig(void)
+{
+ s32 puzzleType = GetCurrentMapRotatingGatePuzzleType();
+ u32 i;
+
+ switch (puzzleType)
+ {
+ case PUZZLE_FORTREE_CITY_GYM:
+ gRotatingGate_PuzzleConfig = sRotatingGate_FortreePuzzleConfig;
+ gRotatingGate_PuzzleCount =
+ sizeof(sRotatingGate_FortreePuzzleConfig) / sizeof(struct RotatingGatePuzzle);
+ break;
+ case PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6:
+ gRotatingGate_PuzzleConfig = sRotatingGate_TrickHousePuzzleConfig;
+ gRotatingGate_PuzzleCount =
+ sizeof(sRotatingGate_TrickHousePuzzleConfig) / sizeof(struct RotatingGatePuzzle);
+ break;
+ case PUZZLE_NONE:
+ default:
+ return;
+ }
+
+ for (i = 0; i < ROTATING_GATE_PUZZLE_MAX - 1; i++)
+ {
+ gRotatingGate_GateSpriteIds[i] = MAX_SPRITES;
+ }
+}
+
+static void RotatingGate_CreateGatesWithinViewport(s16 deltaX, s16 deltaY)
+{
+ u8 i;
+
+ // Calculate the bounding box of the camera
+ // Same as RotatingGate_DestroyGatesOutsideViewport
+ s16 x = gSaveBlock1Ptr->pos.x - 2;
+ s16 x2 = gSaveBlock1Ptr->pos.x + 0x11;
+ s16 y = gSaveBlock1Ptr->pos.y - 2;
+ s16 y2 = gSaveBlock1Ptr->pos.y + 0xe;
+
+ s16 x3, y3;
+
+ for (i = 0; i < gRotatingGate_PuzzleCount; i++)
+ {
+ x3 = gRotatingGate_PuzzleConfig[i].x + 7;
+ y3 = gRotatingGate_PuzzleConfig[i].y + 7;
+
+ if (y <= y3 && y2 >= y3 && x <= x3 && x2 >= x3 &&
+ gRotatingGate_GateSpriteIds[i] == MAX_SPRITES)
+ {
+ gRotatingGate_GateSpriteIds[i] = RotatingGate_CreateGate(i, deltaX, deltaY);
+ }
+ }
+}
+
+static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY)
+{
+ struct Sprite *sprite;
+ struct SpriteTemplate template;
+ const struct RotatingGatePuzzle *gate;
+ u8 spriteId;
+ s16 x, y;
+
+ gate = &gRotatingGate_PuzzleConfig[gateId];
+
+ if (gate->shape == GATE_SHAPE_L1 || gate->shape == GATE_SHAPE_T1)
+ template = sSpriteTemplate_RotatingGateRegular;
+ else
+ template = sSpriteTemplate_RotatingGateLarge;
+
+ template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG;
+
+ spriteId = CreateSprite(&template, 0, 0, 0x94);
+ if (spriteId == MAX_SPRITES)
+ return MAX_SPRITES;
+
+ x = gate->x + 7;
+ y = gate->y + 7;
+
+ sprite = &gSprites[spriteId];
+ sprite->data[0] = gateId;
+ sprite->coordOffsetEnabled = 1;
+
+ sub_8092FF0(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y);
+ RotatingGate_HideGatesOutsideViewport(sprite);
+ StartSpriteAffineAnim(sprite, RotatingGate_GetGateOrientation(gateId));
+
+ return spriteId;
+}
+
+static void SpriteCallback_RotatingGate(struct Sprite *sprite)
+{
+ u8 rotationDirection;
+ u8 orientation;
+ u8 affineAnimation;
+
+ rotationDirection = sprite->data[1];
+ orientation = sprite->data[2];
+
+ RotatingGate_HideGatesOutsideViewport(sprite);
+
+ if (rotationDirection == ROTATE_ANTICLOCKWISE)
+ {
+ affineAnimation = orientation + 4;
+
+ if (GetPlayerSpeed() != 1)
+ affineAnimation += 8;
+
+ PlaySE(SE_HI_TURUN);
+ StartSpriteAffineAnim(sprite, affineAnimation);
+ }
+ else if (rotationDirection == ROTATE_CLOCKWISE)
+ {
+ affineAnimation = orientation + 8;
+
+ if (GetPlayerSpeed() != 1)
+ affineAnimation += 8;
+
+ PlaySE(SE_HI_TURUN);
+ StartSpriteAffineAnim(sprite, affineAnimation);
+ }
+
+ sprite->data[1] = ROTATE_NONE;
+}
+
+static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite)
+{
+ u16 x;
+ s16 x2;
+ u16 y;
+ s16 y2;
+
+ sprite->invisible = FALSE;
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+
+ x2 = x + 0x40; // Dimensions of the rotating gate
+ y2 = y + 0x40;
+
+ if ((s16)x > DISPLAY_WIDTH + 0x10 - 1 || x2 < -0x10)
+ {
+ sprite->invisible = TRUE;
+ }
+
+ if ((s16)y > DISPLAY_HEIGHT + 0x10 - 1 || y2 < -0x10)
+ {
+ sprite->invisible = TRUE;
+ }
+}
+
+static void LoadRotatingGatePics(void)
+{
+ LoadSpriteSheets(sRotatingGatesGraphicsTable);
+}
+
+/*
+static*/ void RotatingGate_DestroyGatesOutsideViewport(void)
+{
+ s16 x;
+ s16 x2;
+ s16 y;
+ s16 y2;
+ s16 xGate;
+ s16 yGate;
+ s32 i;
+ struct Sprite *sprite;
+
+ // Same as RotatingGate_CreateGatesWithinViewport
+ x = gSaveBlock1Ptr->pos.x - 2;
+ x2 = gSaveBlock1Ptr->pos.x + 0x11;
+ y = gSaveBlock1Ptr->pos.y - 2;
+ y2 = gSaveBlock1Ptr->pos.y + 0xe;
+
+ for (i = 0; i < gRotatingGate_PuzzleCount; i++)
+ {
+ xGate = gRotatingGate_PuzzleConfig[i].x + 7;
+ yGate = gRotatingGate_PuzzleConfig[i].y + 7;
+
+ if (gRotatingGate_GateSpriteIds[i] == MAX_SPRITES)
+ continue;
+
+ if (xGate < x || xGate > x2 || yGate < y || yGate > y2)
+ {
+ sprite = &gSprites[gRotatingGate_GateSpriteIds[i]];
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ gRotatingGate_GateSpriteIds[i] = MAX_SPRITES;
+ }
+ }
+}
+
+
+#ifdef NONMATCHING
+bool8 MapGridIsImpassableAt(s32, s32); //fool the compiler
+
+static s32 RotatingGate_CanRotate(u8 gateId, s16 rotationDirection)
+{
+ const struct Coords8 *armPos;
+ u8 orientation;
+ s16 x;
+ s16 y;
+ u8 shape;
+ u32 shape8;
+ s32 i;
+ s32 j;
+ s32 armOrientation;
+ const u8 *gateArmCollisionData;
+ u8 armIndex;
+
+ if (rotationDirection == ROTATE_ANTICLOCKWISE)
+ armPos = sRotatingGate_ArmPositionsAntiClockwiseRotation;
+ else if (rotationDirection == ROTATE_CLOCKWISE)
+ armPos = sRotatingGate_ArmPositionsClockwiseRotation;
+ else
+ return FALSE;
+
+ orientation = RotatingGate_GetGateOrientation(gateId);
+
+ shape = gRotatingGate_PuzzleConfig[gateId].shape;
+ x = gRotatingGate_PuzzleConfig[gateId].x + 7;
+ y = gRotatingGate_PuzzleConfig[gateId].y + 7;
+
+
+ // Loop through the gate's "arms" clockwise (north, south, east, west)
+ for (i = GATE_ARM_NORTH, shape8 = shape* 4*2 ; i <= GATE_ARM_WEST; i++)
+ {
+ // Ensure that no part of the arm collides with the map
+ for (j = 0, armOrientation = orientation + i, gateArmCollisionData = (u8 *)((u32)sRotatingGate_ArmLayout + shape8 + 2*i); j < GATE_ARM_MAX_LENGTH; j++)
+ {
+ armIndex = 2 * (armOrientation % 4) + j;
+
+ if (*gateArmCollisionData)
+ {
+ if (MapGridIsImpassableAt(x + armPos[armIndex].deltaX, y + armPos[armIndex].deltaY) == TRUE)
+ return FALSE;
+ }
+ gateArmCollisionData++;
+ }
+ }
+
+ return TRUE;
+}
+
+#else
+NAKED
+static s32 RotatingGate_CanRotate(u8 a, s16 rotationDirection)
+{
+ 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\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r1, 0x1\n\
+ bne _080FBCFC\n\
+ ldr r0, =sRotatingGate_ArmPositionsAntiClockwiseRotation\n\
+ mov r10, r0\n\
+ b _080FBD08\n\
+ .pool\n\
+_080FBCFC:\n\
+ cmp r1, 0x2\n\
+ beq _080FBD04\n\
+_080FBD00:\n\
+ movs r0, 0\n\
+ b _080FBD98\n\
+_080FBD04:\n\
+ ldr r1, =sRotatingGate_ArmPositionsClockwiseRotation\n\
+ mov r10, r1\n\
+_080FBD08:\n\
+ adds r0, r4, 0\n\
+ bl RotatingGate_GetGateOrientation\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp]\n\
+ ldr r0, =gRotatingGate_PuzzleConfig\n\
+ ldr r1, [r0]\n\
+ lsls r0, r4, 3\n\
+ adds r0, r1\n\
+ ldrb r2, [r0, 0x4]\n\
+ ldrh r1, [r0]\n\
+ adds r1, 0x7\n\
+ ldrh r0, [r0, 0x2]\n\
+ adds r0, 0x7\n\
+ movs r3, 0\n\
+ lsls r2, 3\n\
+ str r2, [sp, 0x4]\n\
+ lsls r1, 16\n\
+ asrs r1, 16\n\
+ mov r9, r1\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ mov r8, r0\n\
+_080FBD38:\n\
+ movs r6, 0\n\
+ ldr r2, [sp]\n\
+ adds r7, r2, r3\n\
+ lsls r0, r3, 1\n\
+ adds r5, r7, 0\n\
+ ldr r1, [sp, 0x4]\n\
+ adds r0, r1\n\
+ ldr r2, =sRotatingGate_ArmLayout\n\
+ adds r4, r0, r2\n\
+_080FBD4A:\n\
+ adds r0, r5, 0\n\
+ cmp r5, 0\n\
+ bge _080FBD52\n\
+ adds r0, r7, 0x3\n\
+_080FBD52:\n\
+ asrs r0, 2\n\
+ lsls r0, 2\n\
+ subs r0, r5, r0\n\
+ lsls r0, 1\n\
+ adds r0, r6\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ beq _080FBD88\n\
+ lsls r1, 2\n\
+ add r1, r10\n\
+ movs r0, 0\n\
+ ldrsb r0, [r1, r0]\n\
+ add r0, r9\n\
+ ldrb r1, [r1, 0x1]\n\
+ lsls r1, 24\n\
+ asrs r1, 24\n\
+ add r1, r8\n\
+ str r3, [sp, 0x8]\n\
+ bl MapGridIsImpassableAt\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r3, [sp, 0x8]\n\
+ cmp r0, 0x1\n\
+ beq _080FBD00\n\
+_080FBD88:\n\
+ adds r4, 0x1\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x1\n\
+ ble _080FBD4A\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x3\n\
+ ble _080FBD38\n\
+ movs r0, 0x1\n\
+_080FBD98:\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 {r1}\n\
+ bx r1\n\
+ .pool\n\
+.syntax divided\n");
+}
+#endif
+
+static s32 RotatingGate_HasArm(u8 gateId, u8 armInfo)
+{
+ s32 isLongArm;
+ s8 armOrientation;
+ s32 arm;
+ s32 shape;
+
+ arm = armInfo >> 1;
+ isLongArm = armInfo & 1;
+
+ armOrientation = (arm - RotatingGate_GetGateOrientation(gateId) + 4) % 4;
+ shape = gRotatingGate_PuzzleConfig[gateId].shape;
+ return sRotatingGate_ArmLayout[shape][armOrientation * 2 + isLongArm];
+}
+
+static void RotatingGate_TriggerRotationAnimation(u8 gateId, s32 rotationDirection)
+{
+ struct Sprite *sprite;
+
+ if (gRotatingGate_GateSpriteIds[gateId] != MAX_SPRITES)
+ {
+ sprite = &gSprites[gRotatingGate_GateSpriteIds[gateId]];
+ sprite->data[1] = rotationDirection;
+ sprite->data[2] = RotatingGate_GetGateOrientation(gateId);
+ }
+}
+
+static u8 RotatingGate_GetRotationInfo(u8 direction, s16 x, s16 y)
+{
+ register const u8 *ptr;
+
+ if (direction == DIR_NORTH)
+ ptr = sRotatingGate_RotationInfoNorth;
+ else if (direction == DIR_SOUTH)
+ ptr = sRotatingGate_RotationInfoSouth;
+ else if (direction == DIR_WEST)
+ ptr = sRotatingGate_RotationInfoWest;
+ else if (direction == DIR_EAST)
+ ptr = sRotatingGate_RotationInfoEast;
+ else
+ return GATE_ROT_NONE;
+
+ return ptr[y * 4 + x];
+}
+
+void RotatingGate_InitPuzzle(void)
+{
+ if (GetCurrentMapRotatingGatePuzzleType())
+ {
+ RotatingGate_LoadPuzzleConfig();
+ RotatingGate_ResetAllGateOrientations();
+ }
+}
+
+void RotatingGatePuzzleCameraUpdate(u16 deltaX, u16 deltaY)
+{
+ if (GetCurrentMapRotatingGatePuzzleType())
+ {
+ RotatingGate_CreateGatesWithinViewport(deltaX, deltaY);
+ RotatingGate_DestroyGatesOutsideViewport();
+ }
+}
+
+void RotatingGate_InitPuzzleAndGraphics(void)
+{
+ if (GetCurrentMapRotatingGatePuzzleType())
+ {
+ LoadRotatingGatePics();
+ RotatingGate_LoadPuzzleConfig();
+ RotatingGate_CreateGatesWithinViewport(0, 0);
+ }
+}
+
+bool8 CheckForRotatingGatePuzzleCollision(u8 direction, s16 x, s16 y)
+{
+ s32 i;
+
+ if (!GetCurrentMapRotatingGatePuzzleType())
+ return FALSE;
+ for (i = 0; i < gRotatingGate_PuzzleCount; i++)
+ {
+ s16 gateX = gRotatingGate_PuzzleConfig[i].x + 7;
+ s16 gateY = gRotatingGate_PuzzleConfig[i].y + 7;
+
+ if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1)
+ {
+ s16 centerX = x - gateX + 2;
+ s16 centerY = y - gateY + 2;
+ u8 rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY);
+
+ if (rotationInfo != GATE_ROT_NONE)
+ {
+ u8 rotationDirection = ((rotationInfo & 0xF0) >> 4);
+ u8 armInfo = rotationInfo & 0xF;
+
+ if (RotatingGate_HasArm(i, armInfo))
+ {
+ if (RotatingGate_CanRotate(i, rotationDirection))
+ {
+ RotatingGate_TriggerRotationAnimation(i, rotationDirection);
+ RotatingGate_RotateInDirection(i, rotationDirection);
+ return FALSE;
+ }
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+bool8 CheckForRotatingGatePuzzleCollisionWithoutAnimation(u8 direction, s16 x, s16 y)
+{
+ s32 i;
+
+ if (!GetCurrentMapRotatingGatePuzzleType())
+ return FALSE;
+ for (i = 0; i < gRotatingGate_PuzzleCount; i++)
+ {
+ s16 gateX = gRotatingGate_PuzzleConfig[i].x + 7;
+ s16 gateY = gRotatingGate_PuzzleConfig[i].y + 7;
+
+ if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1)
+ {
+ s16 centerX = x - gateX + 2;
+ s16 centerY = y - gateY + 2;
+ u8 rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY);
+
+ if (rotationInfo != GATE_ROT_NONE)
+ {
+ u8 rotationDirection = ((rotationInfo & 0xF0) >> 4);
+ u8 armInfo = rotationInfo & 0xF;
+
+ if (RotatingGate_HasArm(i, armInfo))
+ {
+ if (!RotatingGate_CanRotate(i, rotationDirection))
+ {
+ return TRUE;
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}
diff --git a/src/safari_zone.c b/src/safari_zone.c
index d3d40af28..01d72fa13 100644
--- a/src/safari_zone.c
+++ b/src/safari_zone.c
@@ -1,10 +1,11 @@
#include "global.h"
#include "safari_zone.h"
#include "event_data.h"
-#include "game_stat.h"
+#include "constants/game_stat.h"
#include "main.h"
#include "battle.h"
#include "string_util.h"
+#include "pokeblock.h"
struct PokeblockFeeder
{
@@ -24,15 +25,14 @@ extern u8 EventScript_2A4B8A[];
extern u8 EventScript_2A4B6F[];
extern u8 EventScript_2A4B4C[];
extern u8 EventScript_2A4B9B[];
-extern const u8* const gPokeblockNames[];
extern void sub_80EE44C(u8, u8);
extern void IncrementGameStat(u8 index);
extern void ScriptContext1_SetupScript(u8*);
extern void ScriptContext2_RunNewScript(u8*);
-extern void c2_exit_to_overworld_2_switch(void);
-extern void c2_exit_to_overworld_1_continue_scripts_restart_music(void);
-extern void c2_load_new_map(void);
+extern void CB2_ReturnToField(void);
+extern void CB2_ReturnToFieldContinueScriptPlayMapMusic(void);
+extern void CB2_LoadMap(void);
extern void sub_80AF6F0(void);
extern void ScriptContext1_Stop(void);
extern void warp_in(void);
@@ -42,7 +42,7 @@ extern void PlayerGetDestCoords(s16* x, s16* y);
EWRAM_DATA u8 gNumSafariBalls = 0;
EWRAM_DATA static u16 sSafariZoneStepCounter = 0;
EWRAM_DATA static u8 sSafariZoneCaughtMons = 0;
-EWRAM_DATA static u8 sSafariZoneFleedMons = 0;
+EWRAM_DATA static u8 sSafariZonePkblkUses = 0;
EWRAM_DATA static struct PokeblockFeeder sPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0};
static void ClearAllPokeblockFeeders(void);
@@ -71,12 +71,12 @@ void EnterSafariMode(void)
gNumSafariBalls = 30;
sSafariZoneStepCounter = 500;
sSafariZoneCaughtMons = 0;
- sSafariZoneFleedMons = 0;
+ sSafariZonePkblkUses = 0;
}
void ExitSafariMode(void)
{
- sub_80EE44C(sSafariZoneCaughtMons, sSafariZoneFleedMons);
+ sub_80EE44C(sSafariZoneCaughtMons, sSafariZonePkblkUses);
ResetSafariZoneFlag();
ClearAllPokeblockFeeders();
gNumSafariBalls = 0;
@@ -105,27 +105,27 @@ void SafariZoneRetirePrompt(void)
ScriptContext1_SetupScript(EventScript_2A4B6F);
}
-void sub_80FC190(void)
+void CB2_EndSafariBattle(void)
{
- sSafariZoneFleedMons += gBattleResults.field_1F;
- if (gBattleOutcome == BATTLE_CAUGHT)
+ sSafariZonePkblkUses += gBattleResults.pokeblockThrows;
+ if (gBattleOutcome == B_OUTCOME_CAUGHT)
sSafariZoneCaughtMons++;
if (gNumSafariBalls != 0)
{
- SetMainCallback2(c2_exit_to_overworld_2_switch);
+ SetMainCallback2(CB2_ReturnToField);
}
- else if (gBattleOutcome == BATTLE_SAFARI_OUT_OF_BALLS)
+ else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS)
{
ScriptContext2_RunNewScript(EventScript_2A4B4C);
warp_in();
gFieldCallback = sub_80AF6F0;
- SetMainCallback2(c2_load_new_map);
+ SetMainCallback2(CB2_LoadMap);
}
- else if (gBattleOutcome == BATTLE_CAUGHT)
+ else if (gBattleOutcome == B_OUTCOME_CAUGHT)
{
ScriptContext1_SetupScript(EventScript_2A4B9B);
ScriptContext1_Stop();
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
}
@@ -172,7 +172,7 @@ void GetPokeblockFeederWithinRange(void)
{
if (gSaveBlock1Ptr->location.mapNum == sPokeblockFeeders[i].mapNum)
{
- //Get absolute value of x and y distance from Pokeblock feeder on current map
+ // Get absolute value of x and y distance from Pokeblock feeder on current map.
x -= sPokeblockFeeders[i].x;
y -= sPokeblockFeeders[i].y;
if (x < 0)
diff --git a/src/save.c b/src/save.c
index 528c67145..81731692e 100644
--- a/src/save.c
+++ b/src/save.c
@@ -1,20 +1,76 @@
#include "global.h"
#include "gba/flash_internal.h"
#include "save.h"
-#include "game_stat.h"
+#include "constants/game_stat.h"
#include "task.h"
+#include "decompress.h"
+#include "load_save.h"
+#include "overworld.h"
+
+// for the chunk declarations
extern struct SaveSectionLocation gRamSaveSectionLocations[0xE];
-extern u8 gDecompressionBuffer[];
-extern u32 gFlashMemoryPresent;
extern u16 gUnknown_03006294;
extern bool8 gSoftResetDisabled;
+extern u32 gUnknown_0203CF5C;
-extern const struct SaveSectionOffsets gSaveSectionOffsets[0xE];
+// Divide save blocks into individual chunks to be written to flash sectors
+
+// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer
+#define SECTOR_DATA_SIZE 3968
+#define SECTOR_FOOTER_SIZE 128
+
+/*
+ * Sector Layout:
+ *
+ * Sectors 0 - 13: Save Slot 1
+ * Sectors 14 - 27: Save Slot 2
+ * Sectors 28 - 29: Hall of Fame
+ * Sector 30: e-Reader/Mystery Gift Stuff (note: e-Reader is deprecated in Emerald US)
+ * Sector 31: Recorded Battle
+ *
+ * There are two save slots for saving the player's game data. We alternate between
+ * them each time the game is saved, so that if the current save slot is corrupt,
+ * we can load the previous one. We also rotate the sectors in each save slot
+ * so that the same data is not always being written to the same sector. This
+ * might be done to reduce wear on the flash memory, but I'm not sure, since all
+ * 14 sectors get written anyway.
+ */
+
+// (u8 *)structure was removed from the first statement of the macro in Emerald.
+// This is because malloc is used to allocate addresses so storing the raw
+// addresses should not be done in the offsets information.
+#define SAVEBLOCK_CHUNK(structure, chunkNum) \
+{ \
+ chunkNum * SECTOR_DATA_SIZE, \
+ min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \
+} \
+
+const struct SaveSectionOffsets gSaveSectionOffsets[] =
+{
+ SAVEBLOCK_CHUNK(gSaveblock2, 0),
+
+ SAVEBLOCK_CHUNK(gSaveblock1, 0),
+ SAVEBLOCK_CHUNK(gSaveblock1, 1),
+ SAVEBLOCK_CHUNK(gSaveblock1, 2),
+ SAVEBLOCK_CHUNK(gSaveblock1, 3),
+
+ SAVEBLOCK_CHUNK(gPokemonStorage, 0),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 1),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 2),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 3),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 4),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 5),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 6),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 7),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 8),
+};
extern void DoSaveFailedScreen(u8); // save_failed_screen
-extern void LoadSerializedGame(void); // load_save
extern bool32 ProgramFlashSectorAndVerify(u8 sector, u8 *data);
+extern void save_serialize_map(void);
+extern void sub_800ADF8(void);
+extern bool8 sub_800A520(void);
// iwram common
u16 gLastWrittenSector;
@@ -41,7 +97,7 @@ void ClearSaveData(void)
}
}
-void ResetSaveCounters(void)
+void Save_ResetSaveCounters(void)
{
gSaveCounter = 0;
gLastWrittenSector = 0;
@@ -600,11 +656,6 @@ void UpdateSaveAddresses(void)
}
}
-extern u32 GetGameStat(u8 index); // rom4
-extern void IncrementGameStat(u8 index); // rom4
-extern void SaveSerializedGame(void); // load_save
-extern u32 gUnknown_0203CF5C;
-
u8 HandleSavingData(u8 saveType)
{
u8 i;
@@ -615,25 +666,25 @@ u8 HandleSavingData(u8 saveType)
UpdateSaveAddresses();
switch (saveType)
{
- case HOF_DELETE_SAVE: // deletes HOF before overwriting HOF completely. unused
+ case SAVE_HALL_OF_FAME_ERASE_BEFORE: // deletes HOF before overwriting HOF completely. unused
for (i = 0xE * 2 + 0; i < 32; i++)
EraseFlashSector(i);
- case HOF_SAVE: // hall of fame.
+ case SAVE_HALL_OF_FAME: // hall of fame.
if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999)
IncrementGameStat(GAME_STAT_ENTERED_HOF);
SaveSerializedGame();
save_write_to_flash(0xFFFF, gRamSaveSectionLocations);
- tempAddr = (u8 *)0x201C000; // FIXME: make this a label.
+ tempAddr = gDecompressionBuffer;
HandleWriteSectorNBytes(0x1C, tempAddr, 0xF80);
HandleWriteSectorNBytes(0x1D, tempAddr + 0xF80, 0xF80);
break;
- case NORMAL_SAVE: // normal save. also called by overwriting your own save.
+ case SAVE_NORMAL: // normal save. also called by overwriting your own save.
default:
SaveSerializedGame();
save_write_to_flash(0xFFFF, gRamSaveSectionLocations);
break;
- case LINK_SAVE: // _081532C4
- case LINK2_SAVE:
+ case SAVE_LINK: // _081532C4
+ case SAVE_LINK2:
SaveSerializedGame();
for(i = 0; i < 5; i++)
ClearSaveData_2(i, gRamSaveSectionLocations);
@@ -647,7 +698,7 @@ u8 HandleSavingData(u8 saveType)
save_write_to_flash(0, gRamSaveSectionLocations);
break;
*/
- case DIFFERENT_FILE_SAVE:
+ case SAVE_OVERWRITE_DIFFERENT_FILE:
for (i = (0xE * 2 + 0); i < 32; i++)
EraseFlashSector(i); // erase HOF.
SaveSerializedGame();
@@ -744,7 +795,7 @@ bool8 sub_8153474(void)
return retVal;
}
-u8 sub_81534D0(u8 a1)
+u8 Save_LoadGameData(u8 a1)
{
u8 result;
@@ -780,7 +831,7 @@ u16 sub_815355C(void)
struct SaveSection* savSection;
savSection = gFastSaveSection = &gSaveDataBuffer;
- if (gFlashMemoryPresent != 1)
+ if (gFlashMemoryPresent != TRUE)
return 0;
UpdateSaveAddresses();
GetSaveValidStatus(gRamSaveSectionLocations);
@@ -841,12 +892,6 @@ u32 sub_8153634(u8 sector, u8* src)
return 1;
}
-extern void save_serialize_map(void);
-extern void sub_8076D5C(void);
-extern void sav2_gender2_inplace_and_xFE(void);
-extern void sub_800ADF8(void);
-extern bool8 sub_800A520(void);
-
void sub_8153688(u8 taskId)
{
s16* taskData = gTasks[taskId].data;
diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c
index 3f49b89e6..b207d7e74 100755..100644
--- a/src/save_failed_screen.c
+++ b/src/save_failed_screen.c
@@ -9,12 +9,11 @@
#include "menu.h"
#include "save.h"
#include "gba/flash_internal.h"
+#include "text_window.h"
#define MSG_WIN_TOP 12
#define CLOCK_WIN_TOP (MSG_WIN_TOP - 4)
-extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, u8 *str);
-
extern void (*gGameContinueCallback)(void);
extern u32 gDamagedSaveSectors;
@@ -23,9 +22,7 @@ extern const u8 gBirchHelpGfx[];
extern const u8 gBirchBagTilemap[];
extern const u8 gBirchGrassTilemap[];
extern const u16 gBirchBagGrassPal[];
-extern const u16 gUnknown_0850FEFC[];
extern const u16 gUnknown_0860F074[];
-extern const u32 gUnknown_0850E87C[];
extern struct SaveSection gSaveDataBuffer;
extern u8 gText_SaveFailedCheckingBackup[];
@@ -156,8 +153,8 @@ 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 const u8 sSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal");
+static const u8 sSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz");
static void CB2_SaveFailedScreen(void);
static void CB2_WipeSave(void);
@@ -171,12 +168,12 @@ static bool8 WipeSectors(u32);
// although this is a general text printer, it's only used in this file.
static void SaveFailedScreenTextPrint(u8 *text, u8 var1, u8 var2)
{
- struct TextColor color;
+ u8 color[3];
- color.fgColor = 0;
- color.bgColor = 15;
- color.shadowColor = 3;
- AddTextPrinterParametrized2(gSaveFailedWindowIds[TEXT_WIN_ID], 1, var1 * 8, var2 * 8 + 1, 0, 0, &color, 0, text);
+ color[0] = 0;
+ color[1] = 15;
+ color[2] = 3;
+ AddTextPrinterParameterized2(gSaveFailedWindowIds[TEXT_WIN_ID], 1, var1 * 8, var2 * 8 + 1, 0, 0, color, 0, text);
}
void DoSaveFailedScreen(u8 saveType)
@@ -223,12 +220,12 @@ static void CB2_SaveFailedScreen(void)
LZ77UnCompVram(gBirchHelpGfx, (void *)VRAM);
LZ77UnCompVram(gBirchBagTilemap, (void *)(VRAM + 0x7000));
LZ77UnCompVram(gBirchGrassTilemap, (void *)(VRAM + 0x7800));
- LZ77UnCompVram(gSaveFailedClockGfx, (void *)(VRAM + 0x10020));
+ LZ77UnCompVram(sSaveFailedClockGfx, (void *)(VRAM + 0x10020));
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_085EFD88, 3);
SetBgTilemapBuffer(0, (void *)&gDecompressionBuffer[0x2000]);
CpuFill32(0, &gDecompressionBuffer[0x2000], 0x800);
- LoadBgTiles(0, gUnknown_0850E87C, 0x120, 0x214);
+ LoadBgTiles(0, gTextWindowFrame1_Gfx, 0x120, 0x214);
InitWindows(gUnknown_085EFD94);
// AddWindowWithoutTileMap returns a u16/integer, but the info is clobbered into a u8 here resulting in lost info. Bug?
gSaveFailedWindowIds[TEXT_WIN_ID] = AddWindowWithoutTileMap(gUnknown_085EFD9C);
@@ -240,8 +237,8 @@ static void CB2_SaveFailedScreen(void)
ResetTasks();
ResetPaletteFade();
LoadPalette(gBirchBagGrassPal, 0, 0x40);
- LoadPalette(gSaveFailedClockPal, 0x100, 0x20);
- LoadPalette(gUnknown_0850FEFC, 0xE0, 0x20);
+ LoadPalette(sSaveFailedClockPal, 0x100, 0x20);
+ LoadPalette(gTextWindowFrame1_Pal, 0xE0, 0x20);
LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
SetWindowBorderStyle(gSaveFailedWindowIds[TEXT_WIN_ID], FALSE, 0x214, 0xE);
SetWindowBorderStyle(gSaveFailedWindowIds[CLOCK_WIN_ID], FALSE, 0x214, 0xE);
diff --git a/src/save_location.c b/src/save_location.c
index 61a5fd30d..262aaf40c 100755..100644
--- a/src/save_location.c
+++ b/src/save_location.c
@@ -1,9 +1,6 @@
#include "global.h"
#include "save_location.h"
-#include "map_constants.h"
-
-// used to make the list defines a little less ugly.
-#define MAP(name) ((MAP_GROUP_##name << 8) + (MAP_ID_##name))
+#include "constants/maps.h"
// specialSaveWarp flags
#define POKECENTER_SAVEWARP (1 << 1)
@@ -29,44 +26,44 @@ static bool32 IsCurMapInLocationList(const u16 *list)
// TODO: Not require a packed u16 array for these lists
static const u16 sSaveLocationPokeCenterList[] =
{
- MAP(OLDALE_TOWN_POKEMON_CENTER_1F),
- MAP(OLDALE_TOWN_POKEMON_CENTER_2F),
- MAP(DEWFORD_TOWN_POKEMON_CENTER_1F),
- MAP(DEWFORD_TOWN_POKEMON_CENTER_2F),
- MAP(LAVARIDGE_TOWN_POKEMON_CENTER_1F),
- MAP(LAVARIDGE_TOWN_POKEMON_CENTER_2F),
- MAP(FALLARBOR_TOWN_POKEMON_CENTER_1F),
- MAP(FALLARBOR_TOWN_POKEMON_CENTER_2F),
- MAP(VERDANTURF_TOWN_POKEMON_CENTER_1F),
- MAP(VERDANTURF_TOWN_POKEMON_CENTER_2F),
- MAP(PACIFIDLOG_TOWN_POKEMON_CENTER_1F),
- MAP(PACIFIDLOG_TOWN_POKEMON_CENTER_2F),
- MAP(PETALBURG_CITY_POKEMON_CENTER_1F),
- MAP(PETALBURG_CITY_POKEMON_CENTER_2F),
- MAP(SLATEPORT_CITY_POKEMON_CENTER_1F),
- MAP(SLATEPORT_CITY_POKEMON_CENTER_2F),
- MAP(MAUVILLE_CITY_POKEMON_CENTER_1F),
- MAP(MAUVILLE_CITY_POKEMON_CENTER_2F),
- MAP(RUSTBORO_CITY_POKEMON_CENTER_1F),
- MAP(RUSTBORO_CITY_POKEMON_CENTER_2F),
- MAP(FORTREE_CITY_POKEMON_CENTER_1F),
- MAP(FORTREE_CITY_POKEMON_CENTER_2F),
- MAP(LILYCOVE_CITY_POKEMON_CENTER_1F),
- MAP(LILYCOVE_CITY_POKEMON_CENTER_2F),
- MAP(MOSSDEEP_CITY_POKEMON_CENTER_1F),
- MAP(MOSSDEEP_CITY_POKEMON_CENTER_2F),
- MAP(SOOTOPOLIS_CITY_POKEMON_CENTER_1F),
- MAP(SOOTOPOLIS_CITY_POKEMON_CENTER_2F),
- MAP(EVER_GRANDE_CITY_POKEMON_CENTER_1F),
- MAP(EVER_GRANDE_CITY_POKEMON_CENTER_2F),
- MAP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F),
- MAP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F),
- MAP(BATTLE_FRONTIER_POKEMON_CENTER_1F),
- MAP(BATTLE_FRONTIER_POKEMON_CENTER_2F),
- MAP(SINGLE_BATTLE_COLOSSEUM),
- MAP(TRADE_CENTER),
- MAP(RECORD_CORNER),
- MAP(DOUBLE_BATTLE_COLOSSEUM),
+ MAP_OLDALE_TOWN_POKEMON_CENTER_1F,
+ MAP_OLDALE_TOWN_POKEMON_CENTER_2F,
+ MAP_DEWFORD_TOWN_POKEMON_CENTER_1F,
+ MAP_DEWFORD_TOWN_POKEMON_CENTER_2F,
+ MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F,
+ MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F,
+ MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F,
+ MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F,
+ MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F,
+ MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F,
+ MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F,
+ MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F,
+ MAP_PETALBURG_CITY_POKEMON_CENTER_1F,
+ MAP_PETALBURG_CITY_POKEMON_CENTER_2F,
+ MAP_SLATEPORT_CITY_POKEMON_CENTER_1F,
+ MAP_SLATEPORT_CITY_POKEMON_CENTER_2F,
+ MAP_MAUVILLE_CITY_POKEMON_CENTER_1F,
+ MAP_MAUVILLE_CITY_POKEMON_CENTER_2F,
+ MAP_RUSTBORO_CITY_POKEMON_CENTER_1F,
+ MAP_RUSTBORO_CITY_POKEMON_CENTER_2F,
+ MAP_FORTREE_CITY_POKEMON_CENTER_1F,
+ MAP_FORTREE_CITY_POKEMON_CENTER_2F,
+ MAP_LILYCOVE_CITY_POKEMON_CENTER_1F,
+ MAP_LILYCOVE_CITY_POKEMON_CENTER_2F,
+ MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F,
+ MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F,
+ MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F,
+ MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F,
+ MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F,
+ MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F,
+ MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F,
+ MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F,
+ MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F,
+ MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F,
+ MAP_SINGLE_BATTLE_COLOSSEUM,
+ MAP_TRADE_CENTER,
+ MAP_RECORD_CORNER,
+ MAP_DOUBLE_BATTLE_COLOSSEUM,
0xFFFF,
};
@@ -77,7 +74,7 @@ static bool32 IsCurMapPokeCenter(void)
static const u16 sSaveLocationReloadLocList[] = // there's only 1 location, and it's presumed its for the save reload feature for battle tower
{
- MAP(BATTLE_TOWER_LOBBY),
+ MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY,
0xFFFF,
};
diff --git a/src/scanline_effect.c b/src/scanline_effect.c
new file mode 100644
index 000000000..148e053fc
--- /dev/null
+++ b/src/scanline_effect.c
@@ -0,0 +1,262 @@
+#include "global.h"
+#include "data2.h"
+#include "task.h"
+#include "trig.h"
+#include "scanline_effect.h"
+
+static void CopyValue16Bit(void);
+static void CopyValue32Bit(void);
+
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG3_X;
+extern u16 gBattle_BG3_Y;
+
+// EWRAM vars
+
+// Per-scanline register values.
+// This is double buffered so that it can be safely written to at any time
+// without overwriting the buffer that the DMA is currently reading
+EWRAM_DATA u16 gScanlineEffectRegBuffers[2][0x3C0] = {0};
+
+EWRAM_DATA struct ScanlineEffect gScanlineEffect = {0};
+EWRAM_DATA static bool8 sShouldStopWaveTask = FALSE;
+
+void ScanlineEffect_Stop(void)
+{
+ gScanlineEffect.state = 0;
+ DmaStop(0);
+ if (gScanlineEffect.waveTaskId != 0xFF)
+ {
+ DestroyTask(gScanlineEffect.waveTaskId);
+ gScanlineEffect.waveTaskId = 0xFF;
+ }
+}
+
+void ScanlineEffect_Clear(void)
+{
+ CpuFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers));
+ gScanlineEffect.dmaSrcBuffers[0] = NULL;
+ gScanlineEffect.dmaSrcBuffers[1] = NULL;
+ gScanlineEffect.dmaDest = NULL;
+ gScanlineEffect.dmaControl = 0;
+ gScanlineEffect.srcBuffer = 0;
+ gScanlineEffect.state = 0;
+ gScanlineEffect.unused16 = 0;
+ gScanlineEffect.unused17 = 0;
+ gScanlineEffect.waveTaskId = 0xFF;
+}
+
+void ScanlineEffect_SetParams(struct ScanlineEffectParams params)
+{
+ if (params.dmaControl == SCANLINE_EFFECT_DMACNT_16BIT) // 16-bit
+ {
+ // Set the DMA src to the value for the second scanline because the
+ // first DMA transfer occurs in HBlank *after* the first scanline is drawn
+ gScanlineEffect.dmaSrcBuffers[0] = (u16 *)gScanlineEffectRegBuffers[0] + 1;
+ gScanlineEffect.dmaSrcBuffers[1] = (u16 *)gScanlineEffectRegBuffers[1] + 1;
+ gScanlineEffect.setFirstScanlineReg = CopyValue16Bit;
+ }
+ else // assume 32-bit
+ {
+ // Set the DMA src to the value for the second scanline because the
+ // first DMA transfer occurs in HBlank *after* the first scanline is drawn
+ gScanlineEffect.dmaSrcBuffers[0] = (u32 *)gScanlineEffectRegBuffers[0] + 1;
+ gScanlineEffect.dmaSrcBuffers[1] = (u32 *)gScanlineEffectRegBuffers[1] + 1;
+ gScanlineEffect.setFirstScanlineReg = CopyValue32Bit;
+ }
+
+ gScanlineEffect.dmaControl = params.dmaControl;
+ gScanlineEffect.dmaDest = params.dmaDest;
+ gScanlineEffect.state = params.initState;
+ gScanlineEffect.unused16 = params.unused9;
+ gScanlineEffect.unused17 = params.unused9;
+}
+
+void ScanlineEffect_InitHBlankDmaTransfer(void)
+{
+ if (gScanlineEffect.state == 0)
+ {
+ return;
+ }
+ else if (gScanlineEffect.state == 3)
+ {
+ gScanlineEffect.state = 0;
+ DmaStop(0);
+ sShouldStopWaveTask = TRUE;
+ }
+ else
+ {
+ DmaStop(0);
+ // Set DMA to copy to dest register on each HBlank for the next frame.
+ // The HBlank DMA transfers do not occurr during VBlank, so the transfer
+ // will begin on the HBlank after the first scanline
+ DmaSet(0, gScanlineEffect.dmaSrcBuffers[gScanlineEffect.srcBuffer], gScanlineEffect.dmaDest, gScanlineEffect.dmaControl);
+ // Manually set the reg for the first scanline
+ gScanlineEffect.setFirstScanlineReg();
+ // Swap current buffer
+ gScanlineEffect.srcBuffer ^= 1;
+ }
+}
+
+// These two functions are used to copy the register for the first scanline,
+// depending whether it is a 16-bit register or a 32-bit register.
+
+static void CopyValue16Bit(void)
+{
+ u16 *dest = (u16 *)gScanlineEffect.dmaDest;
+ u16 *src = (u16 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];
+
+ *dest = *src;
+}
+
+static void CopyValue32Bit(void)
+{
+ u32 *dest = (u32 *)gScanlineEffect.dmaDest;
+ u32 *src = (u32 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];
+
+ *dest = *src;
+}
+
+#define tStartLine data[0]
+#define tEndLine data[1]
+#define tWaveLength data[2]
+#define tSrcBufferOffset data[3]
+#define tFramesUntilMove data[4]
+#define tDelayInterval data[5]
+#define tRegOffset data[6]
+#define tApplyBattleBgOffsets data[7]
+
+static void TaskFunc_UpdateWavePerFrame(u8 taskId)
+{
+ int value = 0;
+ int i;
+ int offset;
+
+ if (sShouldStopWaveTask)
+ {
+ DestroyTask(taskId);
+ gScanlineEffect.waveTaskId = 0xFF;
+ }
+ else
+ {
+ if (gTasks[taskId].tApplyBattleBgOffsets)
+ {
+ switch (gTasks[taskId].tRegOffset)
+ {
+ case SCANLINE_EFFECT_REG_BG0HOFS:
+ value = gBattle_BG0_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG0VOFS:
+ value = gBattle_BG0_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG1HOFS:
+ value = gBattle_BG1_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG1VOFS:
+ value = gBattle_BG1_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG2HOFS:
+ value = gBattle_BG2_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG2VOFS:
+ value = gBattle_BG2_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG3HOFS:
+ value = gBattle_BG3_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG3VOFS:
+ value = gBattle_BG3_Y;
+ break;
+ }
+ }
+ if (gTasks[taskId].tFramesUntilMove != 0)
+ {
+ gTasks[taskId].tFramesUntilMove--;
+ offset = gTasks[taskId].tSrcBufferOffset + 320;
+ for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;
+ offset++;
+ }
+ }
+ else
+ {
+ gTasks[taskId].tFramesUntilMove = gTasks[taskId].tDelayInterval;
+ offset = gTasks[taskId].tSrcBufferOffset + 320;
+ for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;
+ offset++;
+ }
+
+ // increment src buffer offset
+ gTasks[taskId].tSrcBufferOffset++;
+ if (gTasks[taskId].tSrcBufferOffset == gTasks[taskId].tWaveLength)
+ gTasks[taskId].tSrcBufferOffset = 0;
+ }
+ }
+}
+
+static void GenerateWave(u16 *buffer, u8 frequency, u8 amplitude, u8 unused)
+{
+ u16 i = 0;
+ u8 theta = 0;
+
+ while (i < 256)
+ {
+ buffer[i] = (gSineTable[theta] * amplitude) / 256;
+ theta += frequency;
+ i++;
+ }
+}
+
+// Initializes a background "wave" effect that affects scanlines startLine (inclusive) to endLine (exclusive).
+// 'frequency' and 'amplitude' control the frequency and amplitude of the wave.
+// 'delayInterval' controls how fast the wave travels up the screen. The wave will shift upwards one scanline every 'delayInterval'+1 frames.
+// 'regOffset' is the offset of the video register to modify.
+u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 applyBattleBgOffsets)
+{
+ int i;
+ int offset;
+ struct ScanlineEffectParams params;
+ u8 taskId;
+
+ ScanlineEffect_Clear();
+
+ params.dmaDest = (void *)(REG_ADDR_BG0HOFS + regOffset);
+ params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ params.initState = 1;
+ params.unused9 = 0;
+ ScanlineEffect_SetParams(params);
+
+ taskId = CreateTask(TaskFunc_UpdateWavePerFrame, 0);
+
+ gTasks[taskId].tStartLine = startLine;
+ gTasks[taskId].tEndLine = endLine;
+ gTasks[taskId].tWaveLength = 256 / frequency;
+ gTasks[taskId].tSrcBufferOffset = 0;
+ gTasks[taskId].tFramesUntilMove = delayInterval;
+ gTasks[taskId].tDelayInterval = delayInterval;
+ gTasks[taskId].tRegOffset = regOffset;
+ gTasks[taskId].tApplyBattleBgOffsets = applyBattleBgOffsets;
+
+ gScanlineEffect.waveTaskId = taskId;
+ sShouldStopWaveTask = FALSE;
+
+ GenerateWave(&gScanlineEffectRegBuffers[0][320], frequency, amplitude, endLine - startLine);
+
+ offset = 320;
+ for (i = startLine; i < endLine; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[0][offset];
+ gScanlineEffectRegBuffers[1][i] = gScanlineEffectRegBuffers[0][offset];
+ offset++;
+ }
+
+ return taskId;
+}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 183b9bab5..a15ad666c 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -13,8 +13,7 @@
#include "field_door.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
#include "field_screen_effect.h"
@@ -25,16 +24,14 @@
#include "item.h"
#include "lilycove_lady.h"
#include "main.h"
-#include "map_obj_lock.h"
+#include "event_obj_lock.h"
#include "menu.h"
#include "money.h"
#include "mystery_event_script.h"
-#include "new_menu_helpers.h"
#include "palette.h"
#include "party_menu.h"
-#include "pokemon_3.h"
#include "pokemon_storage_system.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rtc.h"
#include "script.h"
@@ -64,13 +61,6 @@ static EWRAM_DATA u16 sMovingNpcMapBank = 0;
static EWRAM_DATA u16 sMovingNpcMapId = 0;
static EWRAM_DATA u16 sFieldEffectScriptId = 0;
-extern u16 gSpecialVar_0x8000;
-extern u16 gSpecialVar_0x8001;
-extern u16 gSpecialVar_0x8002;
-extern u16 gSpecialVar_0x8004;
-
-extern u16 gSpecialVar_Result;
-
extern u16 gSpecialVar_ContestCategory;
IWRAM_DATA u8 gUnknown_03000F30;
@@ -638,7 +628,7 @@ static bool8 IsPaletteNotActive(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
- fade_screen(ScriptReadByte(ctx), 0);
+ FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -648,7 +638,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
u8 mode = ScriptReadByte(ctx);
u8 speed = ScriptReadByte(ctx);
- fade_screen(mode, speed);
+ FadeScreen(mode, speed);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -656,18 +646,18 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx)
{
u8 mode = ScriptReadByte(ctx);
-
+
switch (mode)
{
case 1:
default:
CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_DECOMP_BUFFER_SIZE);
- fade_screen(mode, 0);
+ FadeScreen(mode, 0);
break;
case 0:
case 2:
CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_DECOMP_BUFFER_SIZE);
- fade_screen(mode, 0);
+ FadeScreen(mode, 0);
break;
}
@@ -726,7 +716,7 @@ bool8 ScrCmd_setweather(struct ScriptContext *ctx)
bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
{
- sub_80AEDBC();
+ SetSav1WeatherFromCurrMapHeader();
return FALSE;
}
@@ -1061,7 +1051,7 @@ bool8 ScrCmd_removeobject(struct ScriptContext *ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
- RemoveFieldObjectByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ RemoveEventObjectByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
return FALSE;
}
@@ -1071,7 +1061,7 @@ bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx)
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
- RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup);
+ RemoveEventObjectByLocalIdAndMap(objectId, mapNum, mapGroup);
return FALSE;
}
@@ -1109,7 +1099,7 @@ bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetMapObjTemplateCoords(localId, x, y);
+ Overworld_SetEventObjTemplateCoords(localId, x, y);
return FALSE;
}
@@ -1164,10 +1154,10 @@ bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx)
bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
{
- if (gMapObjects[gSelectedMapObject].active)
+ if (gEventObjects[gSelectedEventObject].active)
{
- FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject],
- player_get_direction_lower_nybble());
+ EventObjectFaceOppositeDirection(&gEventObjects[gSelectedEventObject],
+ GetPlayerFacingDirection());
}
return FALSE;
}
@@ -1177,7 +1167,7 @@ bool8 ScrCmd_turnobject(struct ScriptContext *ctx)
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 direction = ScriptReadByte(ctx);
- FieldObjectTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction);
+ EventObjectTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction);
return FALSE;
}
@@ -1186,7 +1176,7 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx)
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 movementType = ScriptReadByte(ctx);
- Overworld_SetMapObjTemplateMovementType(localId, movementType);
+ Overworld_SetEventObjTemplateMovementType(localId, movementType);
return FALSE;
}
@@ -1220,7 +1210,7 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx)
}
else
{
- ScriptFreezeMapObjects();
+ ScriptFreezeEventObjects();
SetupNativeScript(ctx, sub_80983C4);
return TRUE;
}
@@ -1234,14 +1224,14 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx)
}
else
{
- if (gMapObjects[gSelectedMapObject].active)
+ if (gEventObjects[gSelectedEventObject].active)
{
- LockSelectedMapObject();
+ LockSelectedEventObject();
SetupNativeScript(ctx, sub_809847C);
}
else
{
- ScriptFreezeMapObjects();
+ ScriptFreezeEventObjects();
SetupNativeScript(ctx, sub_80983C4);
}
return TRUE;
@@ -1253,10 +1243,10 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
u8 objectId;
HideFieldMessageBox();
- objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
+ objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
sub_80D338C();
- UnfreezeMapObjects();
+ UnfreezeEventObjects();
return FALSE;
}
@@ -1265,12 +1255,12 @@ bool8 ScrCmd_release(struct ScriptContext *ctx)
u8 objectId;
HideFieldMessageBox();
- if (gMapObjects[gSelectedMapObject].active)
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]);
- objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
- FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
+ if (gEventObjects[gSelectedEventObject].active)
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]);
+ objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
sub_80D338C();
- UnfreezeMapObjects();
+ UnfreezeEventObjects();
return FALSE;
}
@@ -1313,7 +1303,7 @@ bool8 ScrCmd_cmdDB(struct ScriptContext *ctx)
if (msg == NULL)
msg = (const u8 *)ctx->data[0];
sub_81973A4();
- sub_81973C4(0, 1);
+ NewMenuHelpers_DrawDialogueFrame(0, 1);
PrintTextOnWindow(0, 1, msg, 0, 1, 0, 0);
return FALSE;
}
@@ -1445,7 +1435,7 @@ bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx)
u8 top = ScriptReadByte(ctx);
u8 multichoiceId = ScriptReadByte(ctx);
u8 ignoreBPress = ScriptReadByte(ctx);
-
+
/*if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE)
{
ScriptContext1_Stop();
@@ -1485,199 +1475,55 @@ bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx)
return TRUE;
}
-// Lots of math, can't figure it out.
-/*
bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
{
u8 *ptr = (u8 *)ScriptReadWord(ctx);
- struct WindowTemplate template1;
- struct WindowTemplate template2;
- int i;
- u8 width;
- u8 height;
- int temp1;
- int temp2;
- u8 x;
- u8 y;
+ struct WindowTemplate winTemplate;
+ s32 i;
+ u8 width, height;
+ u8 xWindow, yWindow, xText, yText;
+ u8 temp;
StringExpandPlaceholders(gStringVar4, ptr + 6);
-
+
width = GetStringWidth(6, gStringVar4, -1) / 8;
-
+
if (width > 0x1C)
width = 0x1C;
-
+
for (i = 0, height = 4; gStringVar4[i] != 0xFF;)
{
if (gStringVar4[i++] == 0xFE)
height += 3;
}
-
+
if (height > 0x12)
height = 0x12;
-
- x = width + 2;
- temp1 = (0x1E - x) / 2;
- x = temp1 + 1;
- temp1 = ((x - temp1 - 1) * 8 + 3);
-
- y = height + 2;
- temp2 = (0x14 - y) / 2;
- y = temp2 + 2;
- temp2 = ((y - temp2 - 1) * 8);
-
- sub_8198A50(&template1, 0, x, y, width, height, 0xF, 0x1);
- template2 = template1;
- gUnknown_03000F30 = AddWindow(&template2);
- sub_809882C(gUnknown_03000F30, 0x214, 0xE0);
- sub_81973FC(gUnknown_03000F30, 0);
+
+ temp = width + 2;
+ xWindow = (0x1E - temp) / 2;
+
+ temp = height + 2;
+ yText = (0x14 - temp) / 2;
+
+ xText = xWindow;
+ xWindow += 1;
+
+ yWindow = yText;
+ yText += 2;
+
+ xText = (xWindow - xText - 1) * 8 + 3;
+ yText = (yText - yWindow - 1) * 8;
+
+ winTemplate = sub_8198A50(0, xWindow, yWindow + 1, width, height, 0xF, 0x1);
+ gUnknown_03000F30 = AddWindow(&winTemplate);
+ LoadUserWindowBorderGfx(gUnknown_03000F30, 0x214, 0xE0);
+ NewMenuHelpers_DrawStdWindowFrame(gUnknown_03000F30, 0);
PutWindowTilemap(gUnknown_03000F30);
FillWindowPixelBuffer(gUnknown_03000F30, 0x11);
- PrintTextOnWindow(gUnknown_03000F30, 6, gStringVar4, temp1, temp2, 0xFF, 0x0);
+ PrintTextOnWindow(gUnknown_03000F30, 6, gStringVar4, xText, yText, 0xFF, 0x0);
CopyWindowToVram(gUnknown_03000F30, 3);
return FALSE;
-}*/
-__attribute__((naked))
-bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
-{
- asm("push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- sub sp, #0x20\n\
- bl ScriptReadWord\n\
- add r1, r0, #0\n\
- ldr r4, =gStringVar4\n\
- add r1, #0x6\n\
- add r0, r4, #0\n\
- bl StringExpandPlaceholders\n\
- mov r2, #0x1\n\
- neg r2, r2\n\
- mov r0, #0x6\n\
- add r1, r4, #0\n\
- bl GetStringWidth\n\
- lsr r0, #3\n\
- lsl r0, #24\n\
- lsr r7, r0, #24\n\
- cmp r7, #0x1C\n\
- bls _0809AE9C\n\
- mov r7, #0x1C\n\
-_0809AE9C:\n\
- mov r5, #0x4\n\
- ldrb r0, [r4]\n\
- add r2, r7, #0x2\n\
- add r1, sp, #0x18\n\
- mov r8, r1\n\
- cmp r0, #0xFF\n\
- beq _0809AEC0\n\
- add r1, r4, #0\n\
-_0809AEAC:\n\
- ldrb r0, [r1]\n\
- add r1, #0x1\n\
- cmp r0, #0xFE\n\
- bne _0809AEBA\n\
- add r0, r5, #0x3\n\
- lsl r0, #24\n\
- lsr r5, r0, #24\n\
-_0809AEBA:\n\
- ldrb r0, [r1]\n\
- cmp r0, #0xFF\n\
- bne _0809AEAC\n\
-_0809AEC0:\n\
- cmp r5, #0x12\n\
- bls _0809AEC6\n\
- mov r5, #0x12\n\
-_0809AEC6:\n\
- lsl r0, r2, #24\n\
- lsr r0, #24\n\
- mov r2, #0x1E\n\
- sub r2, r0\n\
- lsr r0, r2, #31\n\
- add r2, r0\n\
- asr r2, #1\n\
- lsl r2, #24\n\
- add r0, r5, #0x2\n\
- lsl r0, #24\n\
- lsr r0, #24\n\
- mov r4, #0x14\n\
- sub r4, r0\n\
- lsr r0, r4, #31\n\
- add r4, r0\n\
- asr r4, #1\n\
- lsl r4, #24\n\
- lsr r6, r2, #24\n\
- mov r0, #0x80\n\
- lsl r0, #17\n\
- add r2, r0\n\
- lsr r2, #24\n\
- lsr r3, r4, #24\n\
- mov r1, #0x80\n\
- lsl r1, #18\n\
- add r4, r1\n\
- lsr r4, #24\n\
- sub r6, r2, r6\n\
- sub r6, #0x1\n\
- lsl r6, #3\n\
- add r6, #0x3\n\
- lsl r6, #24\n\
- lsr r6, #24\n\
- sub r4, r3\n\
- sub r4, #0x1\n\
- lsl r4, #27\n\
- lsr r4, #24\n\
- add r3, #0x1\n\
- lsl r3, #24\n\
- lsr r3, #24\n\
- str r7, [sp]\n\
- str r5, [sp, #0x4]\n\
- mov r0, #0xF\n\
- str r0, [sp, #0x8]\n\
- mov r0, #0x1\n\
- str r0, [sp, #0xC]\n\
- add r0, sp, #0x10\n\
- mov r1, #0\n\
- bl sub_8198A50\n\
- ldr r0, [sp, #0x10]\n\
- ldr r1, [sp, #0x14]\n\
- str r0, [sp, #0x18]\n\
- str r1, [sp, #0x1C]\n\
- ldr r5, =gUnknown_03000F30\n\
- mov r0, r8\n\
- bl AddWindow\n\
- strb r0, [r5]\n\
- ldrb r0, [r5]\n\
- mov r1, #0x85\n\
- lsl r1, #2\n\
- mov r2, #0xE0\n\
- bl sub_809882C\n\
- ldrb r0, [r5]\n\
- mov r1, #0\n\
- bl sub_81973FC\n\
- ldrb r0, [r5]\n\
- bl PutWindowTilemap\n\
- ldrb r0, [r5]\n\
- mov r1, #0x11\n\
- bl FillWindowPixelBuffer\n\
- ldrb r0, [r5]\n\
- ldr r2, =gStringVar4\n\
- str r4, [sp]\n\
- mov r1, #0xFF\n\
- str r1, [sp, #0x4]\n\
- mov r1, #0\n\
- str r1, [sp, #0x8]\n\
- mov r1, #0x6\n\
- add r3, r6, #0\n\
- bl PrintTextOnWindow\n\
- ldrb r0, [r5]\n\
- mov r1, #0x3\n\
- bl CopyWindowToVram\n\
- mov r0, #0\n\
- add sp, #0x20\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .pool");
}
bool8 ScrCmd_cmdDA(struct ScriptContext *ctx)
@@ -1765,7 +1611,7 @@ bool8 ScrCmd_buffernumberstring(struct ScriptContext *ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 v1 = VarGet(ScriptReadHalfword(ctx));
- u8 v2 = sub_80EF370(v1);
+ u8 v2 = CountDigits(v1);
ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2);
return FALSE;
@@ -1924,7 +1770,7 @@ bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx)
{
/*u8 x = ScriptReadByte(ctx);
u8 y = ScriptReadByte(ctx);*/
-
+
HideMoneyBox();
return FALSE;
}
@@ -1979,13 +1825,13 @@ bool8 ScrCmd_dotrainerbattle(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_ontrainerbattleend(struct ScriptContext *ctx)
+bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx)
{
ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle();
return FALSE;
}
-bool8 ScrCmd_ontrainerbattleendgoto(struct ScriptContext *ctx)
+bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx)
{
ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript();
return FALSE;
@@ -1995,7 +1841,7 @@ bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
- ctx->comparisonResult = HasTrainerAlreadyBeenFought(index);
+ ctx->comparisonResult = HasTrainerBeenFought(index);
return FALSE;
}
@@ -2003,7 +1849,7 @@ bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
- trainer_flag_set(index);
+ SetTrainerFlag(index);
return FALSE;
}
@@ -2011,7 +1857,7 @@ bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
- trainer_flag_clear(index);
+ ClearTrainerFlag(index);
return FALSE;
}
@@ -2063,7 +1909,7 @@ bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx)
{
u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx));
- PlaySlotMachine(slotMachineIndex, c2_exit_to_overworld_1_continue_scripts_restart_music);
+ PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic);
ScriptContext1_Stop();
return TRUE;
}
@@ -2089,7 +1935,7 @@ bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_choosecontestpkmn(struct ScriptContext *ctx)
+bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx)
{
sub_81B9404();
ScriptContext1_Stop();
@@ -2332,7 +2178,7 @@ bool8 ScrCmd_mossdeepgym4(struct ScriptContext *ctx)
bool8 ScrCmd_cmdD8(struct ScriptContext *ctx)
{
- gSelectedMapObject = sub_80B47BC();
+ gSelectedEventObject = GetCurrentApproachingTrainerEventObjectId();
return FALSE;
}
@@ -2344,7 +2190,7 @@ bool8 ScrCmd_cmdD9(struct ScriptContext *ctx)
}
else
{
- if (gMapObjects[gSelectedMapObject].active)
+ if (gEventObjects[gSelectedEventObject].active)
{
sub_8098630();
SetupNativeScript(ctx, sub_8098734);
@@ -2374,7 +2220,7 @@ bool8 ScrCmd_checkmonobedience(struct ScriptContext *ctx)
bool8 ScrCmd_cmdCF(struct ScriptContext *ctx)
{
const u8* v1 = sub_8099244();
-
+
if (v1)
{
((u8*)gUnknown_020375C0) = ctx->scriptPtr;
@@ -2392,7 +2238,7 @@ bool8 ScrCmd_warpD1(struct ScriptContext *ctx)
u16 y = VarGet(ScriptReadHalfword(ctx));
Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
- sub_808D074(player_get_direction_lower_nybble());
+ sub_808D074(GetPlayerFacingDirection());
sub_80B0244();
player_avatar_init_params_reset();
return TRUE;
diff --git a/src/script.c b/src/script.c
index 5a1c5daa9..8c868128b 100644
--- a/src/script.c
+++ b/src/script.c
@@ -243,7 +243,7 @@ void ScriptContext2_RunNewScript(const u8 *ptr)
u8 *mapheader_get_tagged_pointer(u8 tag)
{
- u8 *mapScripts = gMapHeader.mapScripts;
+ const u8 *mapScripts = gMapHeader.mapScripts;
if (!mapScripts)
return NULL;
diff --git a/src/script_movement.c b/src/script_movement.c
new file mode 100644
index 000000000..9fee9e060
--- /dev/null
+++ b/src/script_movement.c
@@ -0,0 +1,232 @@
+#include "global.h"
+#include "script_movement.h"
+#include "event_object_movement.h"
+#include "task.h"
+#include "util.h"
+
+// static functions
+static void sub_80D33AC(u8);
+static u8 sub_80D33F4(void);
+static bool8 sub_80D3408(u8, u8, const u8 *);
+static u8 sub_80D3474(u8, u8);
+static bool8 sub_80D3584(u8, u8);
+static void sub_80D35DC(u8, u8, u8, const u8 *);
+static void UnfreezeObjects(u8);
+static void sub_80D3660(u8);
+static void sub_80A2490(u8, u8, u8, const u8 *);
+
+// EWRAM_DATA
+static EWRAM_DATA const u8 *gUnknown_02039D90[16] = {0};
+
+// text
+bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript)
+{
+ u8 eventObjId;
+
+ if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjId))
+ return TRUE;
+ if (!FuncIsActiveTask(sub_80D3660))
+ sub_80D33AC(50);
+ return sub_80D3408(sub_80D33F4(), eventObjId, movementScript);
+}
+
+bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapBank)
+{
+ u8 eventObjId;
+ u8 r4;
+ u8 r1;
+
+ if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapBank, &eventObjId))
+ return TRUE;
+ r4 = sub_80D33F4();
+ r1 = sub_80D3474(r4, eventObjId);
+ if (r1 == 16)
+ return TRUE;
+ return sub_80D3584(r4, r1);
+}
+
+void sub_80D338C(void)
+{
+ u8 taskId;
+
+ taskId = sub_80D33F4();
+ if (taskId != 0xFF)
+ {
+ UnfreezeObjects(taskId);
+ DestroyTask(taskId);
+ }
+}
+
+
+static void sub_80D33AC(u8 priority)
+{
+ u8 taskId;
+ u8 i;
+
+ taskId = CreateTask(sub_80D3660, priority);
+ for (i = 1; i < 16; i++)
+ gTasks[taskId].data[i] = 0xFFFF;
+}
+
+static u8 sub_80D33F4(void)
+{
+ return FindTaskIdByFunc(sub_80D3660);
+}
+
+static bool8 sub_80D3408(u8 taskId, u8 eventObjId, const u8 *movementScript)
+{
+ u8 r4;
+
+ r4 = sub_80D3474(taskId, eventObjId);
+ if (r4 != 16)
+ {
+ if (sub_80D3584(taskId, r4) == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ sub_80D35DC(taskId, r4, eventObjId, movementScript);
+ return FALSE;
+ }
+ }
+ r4 = sub_80D3474(taskId, 0xFF);
+ if (r4 == 16)
+ {
+ return TRUE;
+ }
+ else
+ {
+ sub_80D35DC(taskId, r4, eventObjId, movementScript);
+ return FALSE;
+ }
+}
+
+static u8 sub_80D3474(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_80D34B0(u8 taskId, u8 b, u8 **c)
+{
+ u8 i;
+
+ *c = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < b; i++, (*c)++)
+ ;
+}
+
+static void sub_80D34E4(u8 taskId, u8 b, u8 c)
+{
+ u8 *ptr;
+
+ sub_80D34B0(taskId, b, &ptr);
+ *ptr = c; //what is this supposed to do?
+}
+
+static void sub_80D3508(u8 taskId, u8 b, u8 *c)
+{
+ u8 *ptr;
+
+ sub_80D34B0(taskId, b, &ptr);
+ *c = *ptr;
+}
+
+static void sub_80D352C(u8 a, u8 b)
+{
+ u16 var = ~gBitTable[b];
+
+ gTasks[a].data[0] &= var;
+}
+
+static void sub_80D355C(u8 taskId, u8 b)
+{
+ gTasks[taskId].data[0] |= gBitTable[b];
+}
+
+static bool8 sub_80D3584(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, const u8 *movementScript)
+{
+ gUnknown_02039D90[a] = movementScript;
+}
+
+static const u8 *sub_80D35CC(u8 a)
+{
+ return gUnknown_02039D90[a];
+}
+
+static void sub_80D35DC(u8 taskId, u8 b, u8 eventObjId, const u8 *movementScript)
+{
+ sub_80D352C(taskId, b);
+ npc_obj_offscreen_culling_and_flag_update(b, movementScript);
+ sub_80D34E4(taskId, b, eventObjId);
+}
+
+static void UnfreezeObjects(u8 taskId)
+{
+ u8 *pEventObjId;
+ u8 i;
+
+ pEventObjId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < 16; i++, pEventObjId++)
+ {
+ if (*pEventObjId != 0xFF)
+ UnfreezeEventObject(&gEventObjects[*pEventObjId]);
+ }
+}
+
+static void sub_80D3660(u8 taskId)
+{
+ u8 i;
+ u8 var;
+
+ for (i = 0; i < 16; i++)
+ {
+ sub_80D3508(taskId, i, &var);
+ if (var != 0xFF)
+ sub_80A2490(taskId, i, var, sub_80D35CC(i));
+ }
+}
+
+static void sub_80A2490(u8 taskId, u8 b, u8 eventObjId, const u8 *d)
+{
+ u8 var;
+
+ if (EventObjectIsHeldMovementActive(&gEventObjects[eventObjId])
+ && !EventObjectClearHeldMovementIfFinished(&gEventObjects[eventObjId]))
+ return;
+
+ var = *d;
+ if (var == 0xFE)
+ {
+ sub_80D355C(taskId, b);
+ FreezeEventObject(&gEventObjects[eventObjId]);
+ }
+ else
+ {
+ if (!EventObjectSetHeldMovement(&gEventObjects[eventObjId], var))
+ {
+ d++;
+ npc_obj_offscreen_culling_and_flag_update(b, d);
+ }
+ }
+}
+
diff --git a/src/secret_base.c b/src/secret_base.c
index de2b7221a..c71f7ed23 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -1,17 +1,19 @@
// Includes
#include "global.h"
+#include "constants/bg_event_constants.h"
+#include "constants/decorations.h"
#include "malloc.h"
+#include "main.h"
#include "task.h"
#include "palette.h"
-#include "list_menu.h"
#include "window.h"
+#include "list_menu.h"
#include "menu.h"
#include "menu_helpers.h"
-#include "new_menu_helpers.h"
-#include "menu_indicators.h"
-#include "map_constants.h"
-#include "songs.h"
+#include "constants/maps.h"
+#include "constants/songs.h"
+#include "constants/species.h"
#include "sound.h"
#include "overworld.h"
#include "fieldmap.h"
@@ -19,7 +21,7 @@
#include "field_player_avatar.h"
#include "field_screen.h"
#include "field_weather.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_effect.h"
#include "fldeff_80F9BCC.h"
#include "metatile_behavior.h"
@@ -31,11 +33,15 @@
#include "international_string_util.h"
#include "event_data.h"
#include "battle.h"
+#include "battle_setup.h"
#include "rom6.h"
#include "decoration.h"
#include "link.h"
#include "tv.h"
#include "secret_base.h"
+#include "constants/map_types.h"
+
+extern void mapldr_default(void);
// Static type declarations
@@ -59,7 +65,7 @@ EWRAM_DATA struct SecretBaseListMenuBuffer *gUnknown_0203A020 = NULL;
void sub_80E9C9C(u8 taskId);
void game_continue(u8 taskId);
-void sub_80E9DEC(u32 a0, bool8 flag, struct ListMenu *menu);
+void sub_80E9DEC(s32 a0, bool8 flag, struct ListMenu *menu);
void sub_80E9E00(u8 taskId);
void sub_80E9E44(u8 taskId);
void sub_80E9E90(u8 taskId);
@@ -89,30 +95,30 @@ const struct {
};
const u8 gUnknown_0858CFE8[] = {
- MAP_ID_SECRET_BASE_RED_CAVE1, 0x00, 0x01, 0x03,
- MAP_ID_SECRET_BASE_RED_CAVE2, 0x00, 0x05, 0x09,
- MAP_ID_SECRET_BASE_RED_CAVE3, 0x00, 0x01, 0x03,
- MAP_ID_SECRET_BASE_RED_CAVE4, 0x00, 0x07, 0x0d,
- MAP_ID_SECRET_BASE_BROWN_CAVE1, 0x00, 0x02, 0x03,
- MAP_ID_SECRET_BASE_BROWN_CAVE2, 0x00, 0x09, 0x02,
- MAP_ID_SECRET_BASE_BROWN_CAVE3, 0x00, 0x0d, 0x04,
- MAP_ID_SECRET_BASE_BROWN_CAVE4, 0x00, 0x01, 0x02,
- MAP_ID_SECRET_BASE_BLUE_CAVE1, 0x00, 0x01, 0x03,
- MAP_ID_SECRET_BASE_BLUE_CAVE2, 0x00, 0x01, 0x02,
- MAP_ID_SECRET_BASE_BLUE_CAVE3, 0x00, 0x03, 0x0f,
- MAP_ID_SECRET_BASE_BLUE_CAVE4, 0x00, 0x03, 0x0e,
- MAP_ID_SECRET_BASE_YELLOW_CAVE1, 0x00, 0x09, 0x03,
- MAP_ID_SECRET_BASE_YELLOW_CAVE2, 0x00, 0x08, 0x07,
- MAP_ID_SECRET_BASE_YELLOW_CAVE3, 0x00, 0x03, 0x06,
- MAP_ID_SECRET_BASE_YELLOW_CAVE4, 0x00, 0x05, 0x09,
- MAP_ID_SECRET_BASE_TREE1, 0x00, 0x02, 0x03,
- MAP_ID_SECRET_BASE_TREE2, 0x00, 0x05, 0x06,
- MAP_ID_SECRET_BASE_TREE3, 0x00, 0x0f, 0x03,
- MAP_ID_SECRET_BASE_TREE4, 0x00, 0x04, 0x0a,
- MAP_ID_SECRET_BASE_SHRUB1, 0x00, 0x03, 0x03,
- MAP_ID_SECRET_BASE_SHRUB2, 0x00, 0x01, 0x02,
- MAP_ID_SECRET_BASE_SHRUB3, 0x00, 0x07, 0x08,
- MAP_ID_SECRET_BASE_SHRUB4, 0x00, 0x09, 0x06
+ MAP_NUM(SECRET_BASE_RED_CAVE1), 0x00, 0x01, 0x03,
+ MAP_NUM(SECRET_BASE_RED_CAVE2), 0x00, 0x05, 0x09,
+ MAP_NUM(SECRET_BASE_RED_CAVE3), 0x00, 0x01, 0x03,
+ MAP_NUM(SECRET_BASE_RED_CAVE4), 0x00, 0x07, 0x0d,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0x00, 0x02, 0x03,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0x00, 0x09, 0x02,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0x00, 0x0d, 0x04,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0x00, 0x01, 0x02,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0x00, 0x01, 0x03,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0x00, 0x01, 0x02,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0x00, 0x03, 0x0f,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0x00, 0x03, 0x0e,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0x00, 0x09, 0x03,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0x00, 0x08, 0x07,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0x00, 0x03, 0x06,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0x00, 0x05, 0x09,
+ MAP_NUM(SECRET_BASE_TREE1), 0x00, 0x02, 0x03,
+ MAP_NUM(SECRET_BASE_TREE2), 0x00, 0x05, 0x06,
+ MAP_NUM(SECRET_BASE_TREE3), 0x00, 0x0f, 0x03,
+ MAP_NUM(SECRET_BASE_TREE4), 0x00, 0x04, 0x0a,
+ MAP_NUM(SECRET_BASE_SHRUB1), 0x00, 0x03, 0x03,
+ MAP_NUM(SECRET_BASE_SHRUB2), 0x00, 0x01, 0x02,
+ MAP_NUM(SECRET_BASE_SHRUB3), 0x00, 0x07, 0x08,
+ MAP_NUM(SECRET_BASE_SHRUB4), 0x00, 0x09, 0x06
};
const struct MenuAction gUnknown_0858D048[] = {
@@ -242,16 +248,16 @@ void sub_80E8C98(void)
void sub_80E8CB0(s16 *xPtr, s16 *yPtr, u16 tile)
{
- struct MapData *mapData;
+ const struct MapLayout *mapLayout;
s16 x;
s16 y;
- mapData = gMapHeader.mapData;
- for (y = 0; y < mapData->height; y ++)
+ mapLayout = gMapHeader.mapLayout;
+ for (y = 0; y < mapLayout->height; y ++)
{
- for (x = 0; x < mapData->width; x ++)
+ for (x = 0; x < mapLayout->width; x ++)
{
- if ((mapData->map[y * mapData->width + x] & 0x3ff) == tile)
+ if ((mapLayout->map[y * mapLayout->width + x] & 0x3ff) == tile)
{
*xPtr = x;
*yPtr = y;
@@ -320,7 +326,7 @@ void sub_80E8E18(void)
VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId);
}
-void sub_80E8EE0(struct MapEvents *events)
+void sub_80E8EE0(struct MapEvents const *events)
{
u16 bgEventIndex;
u16 i;
@@ -331,7 +337,7 @@ void sub_80E8EE0(struct MapEvents *events)
for (bgEventIndex = 0; bgEventIndex < events->bgEventCount; bgEventIndex ++)
{
- if (events->bgEvents[bgEventIndex].kind == 8)
+ if (events->bgEvents[bgEventIndex].kind == BG_EVENT_SECRET_BASE)
{
for (j = 0; j < 20; j ++)
{
@@ -360,7 +366,7 @@ void sub_80E8F9C(void)
s8 idx;
idx = sCurSecretBaseId / 10 * 4;
- warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]);
+ warp1_set_2(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]);
}
void sub_80E8FD0(u8 taskId)
@@ -384,7 +390,7 @@ void sub_80E8FD0(u8 taskId)
sub_80E8F9C();
warp_in();
gFieldCallback = sub_80AF168;
- SetMainCallback2(c2_load_new_map);
+ SetMainCallback2(CB2_LoadMap);
DestroyTask(taskId);
break;
}
@@ -393,7 +399,7 @@ void sub_80E8FD0(u8 taskId)
void sub_80E9068(void)
{
CreateTask(sub_80E8FD0, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
@@ -408,8 +414,8 @@ bool8 sub_80E909C(void)
void sub_80E90C8(u8 taskId)
{
- FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_NORTH);
- if (sub_80ABDFC() == TRUE)
+ EventObjectTurn(&gEventObjects[gPlayerAvatar.eventObjectId], DIR_NORTH);
+ if (IsWeatherNotFadingIn() == TRUE)
{
EnableBothScriptContexts();
DestroyTask(taskId);
@@ -442,7 +448,7 @@ void sub_80E916C(u8 taskId)
Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gUnknown_0858CFE8[idx + 2], gUnknown_0858CFE8[idx + 3]);
warp_in();
gFieldCallback = sub_80E9108;
- SetMainCallback2(c2_load_new_map);
+ SetMainCallback2(CB2_LoadMap);
DestroyTask(taskId);
}
}
@@ -450,12 +456,12 @@ void sub_80E916C(u8 taskId)
void sub_80E91F8(void)
{
CreateTask(sub_80E916C, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
bool8 CurrentMapIsSecretBase(void)
{
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_SECRET_BASE_RED_CAVE1 && (u8)gSaveBlock1Ptr->location.mapNum <= MAP_ID_SECRET_BASE_SHRUB4)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SECRET_BASE_RED_CAVE1) && (u8)gSaveBlock1Ptr->location.mapNum <= MAP_NUM(SECRET_BASE_SHRUB4))
{
return TRUE;
}
@@ -528,14 +534,14 @@ void sub_80E933C(void)
category = gDecorations[roomDecor[decorIdx]].category;
if (permission == DECORPERM_SOLID_MAT)
{
- for (objIdx = 0; objIdx < gMapHeader.events->mapObjectCount; objIdx ++)
+ for (objIdx = 0; objIdx < gMapHeader.events->eventObjectCount; objIdx ++)
{
- if (gMapHeader.events->mapObjects[objIdx].flagId == gSpecialVar_0x8004 + 0xAE)
+ if (gMapHeader.events->eventObjects[objIdx].flagId == gSpecialVar_0x8004 + 0xAE)
{
break;
}
}
- if (objIdx == gMapHeader.events->mapObjectCount)
+ if (objIdx == gMapHeader.events->eventObjectCount)
{
continue;
}
@@ -544,9 +550,9 @@ void sub_80E933C(void)
metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7);
if (MetatileBehavior_IsMB_B5(metatile) == TRUE || MetatileBehavior_IsMB_C3(metatile) == TRUE)
{
- gSpecialVar_Result = gMapHeader.events->mapObjects[objIdx].graphicsId + VAR_0x3F20;
+ gSpecialVar_Result = gMapHeader.events->eventObjects[objIdx].graphicsId + VAR_0x3F20;
VarSet(gSpecialVar_Result, gDecorations[roomDecor[decorIdx]].tiles[0]);
- gSpecialVar_Result = gMapHeader.events->mapObjects[objIdx].localId;
+ gSpecialVar_Result = gMapHeader.events->eventObjects[objIdx].localId;
FlagClear(gSpecialVar_0x8004 + 0xAE);
show_sprite(gSpecialVar_Result, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
sub_808EBA8(gSpecialVar_Result, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007);
@@ -574,12 +580,12 @@ void sub_80E9578(void)
u8 objectEventIdx;
u16 flagId;
- for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->mapObjectCount; objectEventIdx ++)
+ for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->eventObjectCount; objectEventIdx ++)
{
- flagId = gMapHeader.events->mapObjects[objectEventIdx].flagId;
+ flagId = gMapHeader.events->eventObjects[objectEventIdx].flagId;
if (flagId >= 0xAE && flagId <= 0xBB)
{
- RemoveFieldObjectByLocalIdAndMap(gMapHeader.events->mapObjects[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ RemoveEventObjectByLocalIdAndMap(gMapHeader.events->eventObjects[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
FlagSet(flagId);
}
}
@@ -587,7 +593,7 @@ void sub_80E9578(void)
void sub_80E95D4(void)
{
- VarSet(VAR_0x401F, gUnknown_0858D060[sub_80EA20C(VarGet(VAR_0x4054))]);
+ VarSet(VAR_OBJ_GFX_ID_F, gUnknown_0858D060[sub_80EA20C(VarGet(VAR_0x4054))]);
}
void sub_80E9608(struct Coords16 *coords, struct MapEvents *events)
@@ -596,7 +602,7 @@ void sub_80E9608(struct Coords16 *coords, struct MapEvents *events)
for (bgEventIdx = 0; bgEventIdx < events->bgEventCount; bgEventIdx ++)
{
- if (events->bgEvents[bgEventIdx].kind == 8 && coords->x == events->bgEvents[bgEventIdx].x + 7 && coords->y == events->bgEvents[bgEventIdx].y + 7)
+ if (events->bgEvents[bgEventIdx].kind == BG_EVENT_SECRET_BASE && coords->x == events->bgEvents[bgEventIdx].x + 7 && coords->y == events->bgEvents[bgEventIdx].y + 7)
{
sCurSecretBaseId = events->bgEvents[bgEventIdx].bgUnion.secretBaseId;
break;
@@ -640,7 +646,7 @@ void sub_80E96A4(u8 taskId)
copy_saved_warp2_bank_and_enter_x_to_warp1(0x7e);
warp_in();
gFieldCallback = mapldr_default;
- SetMainCallback2(c2_load_new_map);
+ SetMainCallback2(CB2_LoadMap);
ScriptContext2_Disable();
DestroyTask(taskId);
break;
@@ -650,7 +656,7 @@ void sub_80E96A4(u8 taskId)
void sub_80E9728(void)
{
CreateTask(sub_80E96A4, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
void sub_80E9744(void)
@@ -710,237 +716,45 @@ u8 sub_80E98AC(struct Pokemon *pokemon)
return evTotal / 6;
}
-#ifdef NONMATCHING
-// This function is a meme
void sub_80E9914(void)
{
- u32 zero;
- u32 *personality;
u16 partyIdx;
u16 moveIdx;
u16 sbPartyIdx;
- u16 *species;
- u16 *items;
- u16 *moves;
- u8 *levels;
- u8 *evs;
+ struct SecretBaseParty *party;
sbPartyIdx = 0;
- personality = gSaveBlock1Ptr->secretBases[0].partyPersonality;
+ party = &gSaveBlock1Ptr->secretBases[0].party;
if (gSaveBlock1Ptr->secretBases[0].secretBaseId != 0)
{
- partyIdx = 0;
- moves = gSaveBlock1Ptr->secretBases[0].partyMoves;
- species = gSaveBlock1Ptr->secretBases[0].partySpecies;
- items = gSaveBlock1Ptr->secretBases[0].partyHeldItems;
- levels = gSaveBlock1Ptr->secretBases[0].partyLevels;
- evs = gSaveBlock1Ptr->secretBases[0].partyEVs;
- zero = 0;
- for (partyIdx = 0; partyIdx < PARTY_SIZE; partyIdx ++)
+ for (partyIdx = 0; partyIdx < PARTY_SIZE; partyIdx++)
{
- for (moveIdx = 0; moveIdx < 4; moveIdx ++)
+ for (moveIdx = 0; moveIdx < 4; moveIdx++)
{
- moves[partyIdx * 4 + moveIdx] = zero;
+ party->moves[partyIdx * 4 + moveIdx] = 0;
}
- species[partyIdx] = zero;
- items[partyIdx] = zero;
- levels[partyIdx] = zero;
- personality[partyIdx] = zero;
- evs[partyIdx] = zero;
- if (GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_EGG))
+ party->species[partyIdx] = 0;
+ party->heldItems[partyIdx] = 0;
+ party->levels[partyIdx] = 0;
+ party->personality[partyIdx] = 0;
+ party->EVs[partyIdx] = 0;
+ if (GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES) != SPECIES_NONE
+ && !GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_EGG))
{
- for (moveIdx = 0; moveIdx < 4; moveIdx ++)
+ for (moveIdx = 0; moveIdx < 4; moveIdx++)
{
- moves[sbPartyIdx * 4 + moveIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_MOVE1 + moveIdx);
+ party->moves[sbPartyIdx * 4 + moveIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_MOVE1 + moveIdx);
}
- species[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES);
- items[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_HELD_ITEM);
- levels[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_LEVEL);
- personality[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY);
- evs[sbPartyIdx] = sub_80E98AC(&gPlayerParty[partyIdx]);
- sbPartyIdx ++;
+ party->species[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES);
+ party->heldItems[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_HELD_ITEM);
+ party->levels[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_LEVEL);
+ party->personality[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY);
+ party->EVs[sbPartyIdx] = sub_80E98AC(&gPlayerParty[partyIdx]);
+ sbPartyIdx++;
}
}
}
}
-#else
-__attribute__((naked)) void sub_80E9914(void)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r10\n"
- "\tmov r6, r9\n"
- "\tmov r5, r8\n"
- "\tpush {r5-r7}\n"
- "\tsub sp, 0x24\n"
- "\tmovs r0, 0\n"
- "\tmov r10, r0\n"
- "\tldr r0, =gSaveBlock1Ptr\n"
- "\tldr r1, [r0]\n"
- "\tldr r2, =0x00001ad0\n"
- "\tadds r2, r1, r2\n"
- "\tstr r2, [sp]\n"
- "\tldr r3, =0x00001a9c\n"
- "\tadds r0, r1, r3\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0\n"
- "\tbne _080E993A\n"
- "\tb _080E9A60\n"
- "_080E993A:\n"
- "\tmovs r6, 0\n"
- "\tldr r7, =0x00001ae8\n"
- "\tadds r7, r1, r7\n"
- "\tstr r7, [sp, 0x14]\n"
- "\tldr r0, =0x00001b18\n"
- "\tadds r0, r1, r0\n"
- "\tstr r0, [sp, 0xC]\n"
- "\tldr r2, =0x00001b24\n"
- "\tadds r2, r1, r2\n"
- "\tstr r2, [sp, 0x10]\n"
- "\tadds r3, 0x94\n"
- "\tadds r3, r1, r3\n"
- "\tstr r3, [sp, 0x18]\n"
- "\tldr r7, =0x00001b36\n"
- "\tadds r7, r1, r7\n"
- "\tstr r7, [sp, 0x1C]\n"
- "\tmov r9, r6\n"
- "_080E995C:\n"
- "\tmovs r4, 0\n"
- "\tlsls r5, r6, 2\n"
- "\tlsls r3, r6, 1\n"
- "\tldr r0, =gPlayerParty\n"
- "\tmov r8, r0\n"
- "\tadds r1, r6, 0x1\n"
- "\tstr r1, [sp, 0x4]\n"
- "\tadds r2, r5, 0\n"
- "\tldr r1, [sp, 0x14]\n"
- "_080E996E:\n"
- "\tadds r0, r2, r4\n"
- "\tlsls r0, 1\n"
- "\tadds r0, r1, r0\n"
- "\tmov r7, r9\n"
- "\tstrh r7, [r0]\n"
- "\tadds r0, r4, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r4, r0, 16\n"
- "\tcmp r4, 0x3\n"
- "\tbls _080E996E\n"
- "\tldr r1, [sp, 0xC]\n"
- "\tadds r0, r1, r3\n"
- "\tmov r2, r9\n"
- "\tstrh r2, [r0]\n"
- "\tldr r7, [sp, 0x10]\n"
- "\tadds r0, r7, r3\n"
- "\tstrh r2, [r0]\n"
- "\tldr r1, [sp, 0x18]\n"
- "\tadds r0, r1, r6\n"
- "\tmov r2, r9\n"
- "\tstrb r2, [r0]\n"
- "\tldr r3, [sp]\n"
- "\tadds r0, r3, r5\n"
- "\tmov r7, r9\n"
- "\tstr r7, [r0]\n"
- "\tldr r1, [sp, 0x1C]\n"
- "\tadds r0, r1, r6\n"
- "\tstrb r7, [r0]\n"
- "\tmovs r2, 0x64\n"
- "\tadds r5, r6, 0\n"
- "\tmuls r5, r2\n"
- "\tmov r3, r8\n"
- "\tadds r4, r5, r3\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0xB\n"
- "\tbl GetMonData\n"
- "\tcmp r0, 0\n"
- "\tbeq _080E9A54\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x2D\n"
- "\tbl GetMonData\n"
- "\tcmp r0, 0\n"
- "\tbne _080E9A54\n"
- "\tmovs r4, 0\n"
- "\tmov r7, r10\n"
- "\tlsls r7, 2\n"
- "\tmov r8, r7\n"
- "\tmov r0, r10\n"
- "\tlsls r7, r0, 1\n"
- "\tadds r0, 0x1\n"
- "\tstr r0, [sp, 0x8]\n"
- "\tldr r2, =gPlayerParty\n"
- "_080E99DA:\n"
- "\tadds r1, r4, 0\n"
- "\tadds r1, 0xD\n"
- "\tadds r0, r5, r2\n"
- "\tstr r2, [sp, 0x20]\n"
- "\tbl GetMonData\n"
- "\tmov r3, r8\n"
- "\tadds r1, r3, r4\n"
- "\tlsls r1, 1\n"
- "\tldr r3, [sp, 0x14]\n"
- "\tadds r1, r3, r1\n"
- "\tstrh r0, [r1]\n"
- "\tadds r0, r4, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r4, r0, 16\n"
- "\tldr r2, [sp, 0x20]\n"
- "\tcmp r4, 0x3\n"
- "\tbls _080E99DA\n"
- "\tmovs r0, 0x64\n"
- "\tadds r4, r6, 0\n"
- "\tmuls r4, r0\n"
- "\tldr r0, =gPlayerParty\n"
- "\tadds r4, r0\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0xB\n"
- "\tbl GetMonData\n"
- "\tldr r2, [sp, 0xC]\n"
- "\tadds r1, r2, r7\n"
- "\tstrh r0, [r1]\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0xC\n"
- "\tbl GetMonData\n"
- "\tldr r3, [sp, 0x10]\n"
- "\tadds r1, r3, r7\n"
- "\tstrh r0, [r1]\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0x38\n"
- "\tbl GetMonData\n"
- "\tldr r1, [sp, 0x18]\n"
- "\tadd r1, r10\n"
- "\tstrb r0, [r1]\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r1, 0\n"
- "\tbl GetMonData\n"
- "\tldr r1, [sp]\n"
- "\tadd r1, r8\n"
- "\tstr r0, [r1]\n"
- "\tadds r0, r4, 0\n"
- "\tbl sub_80E98AC\n"
- "\tldr r1, [sp, 0x1C]\n"
- "\tadd r1, r10\n"
- "\tstrb r0, [r1]\n"
- "\tldr r7, [sp, 0x8]\n"
- "\tlsls r0, r7, 16\n"
- "\tlsrs r0, 16\n"
- "\tmov r10, r0\n"
- "_080E9A54:\n"
- "\tldr r1, [sp, 0x4]\n"
- "\tlsls r0, r1, 16\n"
- "\tlsrs r6, r0, 16\n"
- "\tcmp r6, 0x5\n"
- "\tbhi _080E9A60\n"
- "\tb _080E995C\n"
- "_080E9A60:\n"
- "\tadd sp, 0x24\n"
- "\tpop {r3-r5}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tmov r10, r5\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.pool");
-}
-#endif
void sub_80E9A90(void)
{
@@ -963,12 +777,12 @@ void sub_80E9AD0(void)
u16 i;
u16 j;
s16 tile;
- struct MapEvents *events;
+ const struct MapEvents *events;
events = gMapHeader.events;
for (i = 0; i < events->bgEventCount; i ++)
{
- if (events->bgEvents[i].kind == 8 && gSaveBlock1Ptr->secretBases[0].secretBaseId == events->bgEvents[i].bgUnion.secretBaseId)
+ if (events->bgEvents[i].kind == BG_EVENT_SECRET_BASE && gSaveBlock1Ptr->secretBases[0].secretBaseId == events->bgEvents[i].bgUnion.secretBaseId)
{
tile = MapGridGetMetatileIdAt(events->bgEvents[i].x + 7, events->bgEvents[i].y + 7);
for (j = 0; j < 7; j ++)
@@ -1081,13 +895,13 @@ void game_continue(u8 taskId)
if (sub_80E9878(i))
{
sub_80E9780(gUnknown_0203A020->names[count], i);
- gUnknown_0203A020->items[count].unk_00 = gUnknown_0203A020->names[count];
- gUnknown_0203A020->items[count].unk_04 = i;
+ gUnknown_0203A020->items[count].name = gUnknown_0203A020->names[count];
+ gUnknown_0203A020->items[count].id = i;
count ++;
}
}
- gUnknown_0203A020->items[count].unk_00 = gText_Cancel;
- gUnknown_0203A020->items[count].unk_04 = -2;
+ gUnknown_0203A020->items[count].name = gText_Cancel;
+ gUnknown_0203A020->items[count].id = -2;
data[0] = count + 1;
if (data[0] < 8)
{
@@ -1097,14 +911,14 @@ void game_continue(u8 taskId)
{
data[3] = 8;
}
- gUnknown_03006310 = gUnknown_0858D07C;
- gUnknown_03006310.unk_10 = data[6];
- gUnknown_03006310.totalItems = data[0];
- gUnknown_03006310.items = gUnknown_0203A020->items;
- gUnknown_03006310.maxShowed = data[3];
+ gMultiuseListMenuTemplate = gUnknown_0858D07C;
+ gMultiuseListMenuTemplate.windowId = data[6];
+ gMultiuseListMenuTemplate.totalItems = data[0];
+ gMultiuseListMenuTemplate.items = gUnknown_0203A020->items;
+ gMultiuseListMenuTemplate.maxShowed = data[3];
}
-void sub_80E9DEC(u32 a0, bool8 flag, struct ListMenu *menu)
+void sub_80E9DEC(s32 a0, bool8 flag, struct ListMenu *menu)
{
if (flag != TRUE)
{
@@ -1118,7 +932,7 @@ void sub_80E9E00(u8 taskId)
data = gTasks[taskId].data;
SetStandardWindowBorderStyle(data[6], 0);
- data[5] = ListMenuInit(&gUnknown_03006310, data[2], data[1]);
+ data[5] = ListMenuInit(&gMultiuseListMenuTemplate, data[2], data[1]);
sub_80E9E44(taskId);
schedule_bg_copy_tilemap_to_vram(0);
}
@@ -1128,7 +942,7 @@ void sub_80E9E44(u8 taskId)
s16 *data;
data = gTasks[taskId].data;
- data[8] = AddScrollIndicatorArrowPairParametrized(0x02, 0xbc, 0x0c, 0x94, data[0] - data[3], 0x13f8, 0x13f8, &data[2]);
+ data[8] = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xbc, 0x0c, 0x94, data[0] - data[3], 0x13f8, 0x13f8, &data[2]);
}
void sub_80E9E90(u8 taskId)
@@ -1137,15 +951,15 @@ void sub_80E9E90(u8 taskId)
s32 input;
data = gTasks[taskId].data;
- input = ListMenuHandleInput(data[5]);
- get_coro_args_x18_x1A(data[5], &data[2], &data[1]);
+ input = ListMenuHandleInputGetItemId(data[5]);
+ ListMenuGetScrollAndRow(data[5], &data[2], &data[1]);
switch (input)
{
case -1:
break;
case -2:
PlaySE(SE_SELECT);
- sub_81AE6C8(data[5], NULL, NULL);
+ DestroyListMenuTask(data[5], NULL, NULL);
RemoveScrollIndicatorArrowPair(data[8]);
sub_819746C(data[6], 0);
ClearWindowTilemap(data[6]);
@@ -1227,7 +1041,7 @@ void sub_80EA08C(u8 taskId)
data = gTasks[taskId].data;
sub_8197434(0, 0);
- sub_81AE6C8(data[5], &data[2], &data[1]);
+ DestroyListMenuTask(data[5], &data[2], &data[1]);
gSaveBlock1Ptr->secretBases[data[4]].sbr_field_1_6 = 0;
game_continue(taskId);
sub_812225C(&data[2], &data[1], data[3], data[0]);
@@ -1246,7 +1060,7 @@ void sub_80EA13C(u8 taskId)
data = gTasks[taskId].data;
sub_8197434(0, 0);
- sub_81AE6C8(data[5], &data[2], &data[1]);
+ DestroyListMenuTask(data[5], &data[2], &data[1]);
sub_80E9E00(taskId);
gTasks[taskId].func = sub_80E9E90;
}
@@ -1282,7 +1096,7 @@ u8 sub_80EA20C(u8 secretBaseRecordId)
return (gSaveBlock1Ptr->secretBases[secretBaseRecordId].trainerId[0] % 5) + (gSaveBlock1Ptr->secretBases[secretBaseRecordId].gender * 5);
}
-const u8 *sub_80EA250(void)
+const u8 *GetSecretBaseTrainerLoseText(void)
{
u8 param;
@@ -1356,7 +1170,6 @@ void sub_80EA354(void)
gSpecialVar_Result = gSaveBlock1Ptr->secretBases[secretBaseRecordId].sbr_field_1_5;
}
-
void sub_80EA3E4(u8 taskId)
{
s16 x;
@@ -1862,7 +1675,7 @@ void sub_80EAEF4(struct SecretBaseRecordMixer *mixers)
sub_80EABA4(&mixers[2], 0);
}
-void sub_80EAF80(void *records, size_t recordSize, u8 linkIdx)
+void ReceiveSecretBasesData(void *records, size_t recordSize, u8 linkIdx)
{
struct SecretBaseRecordMixer mixers[3];
u16 i;
diff --git a/src/smokescreen.c b/src/smokescreen.c
new file mode 100644
index 000000000..9b37cd234
--- /dev/null
+++ b/src/smokescreen.c
@@ -0,0 +1,71 @@
+#include "global.h"
+#include "data2.h"
+#include "decompress.h"
+#include "sprite.h"
+#include "util.h"
+
+static void sub_8075370(struct Sprite *);
+
+u8 sub_807521C(s16 x, s16 y, u8 a3)
+{
+ u8 mainSpriteId;
+ u8 spriteId1, spriteId2, spriteId3, spriteId4;
+ struct Sprite *mainSprite;
+
+ if (GetSpriteTileStartByTag(gUnknown_0831C620.tag) == 0xFFFF)
+ {
+ LoadCompressedObjectPicUsingHeap(&gUnknown_0831C620);
+ LoadCompressedObjectPaletteUsingHeap(&gUnknown_0831C628);
+ }
+
+ mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8075370);
+ mainSprite = &gSprites[mainSpriteId];
+ mainSprite->data[1] = a3;
+
+ spriteId1 = CreateSprite(&gUnknown_0831C688, x - 16, y - 16, 2);
+ gSprites[spriteId1].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
+ AnimateSprite(&gSprites[spriteId1]);
+
+ spriteId2 = CreateSprite(&gUnknown_0831C688, x, y - 16, 2);
+ gSprites[spriteId2].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
+ StartSpriteAnim(&gSprites[spriteId2], 1);
+ AnimateSprite(&gSprites[spriteId2]);
+
+ spriteId3 = CreateSprite(&gUnknown_0831C688, x - 16, y, 2);
+ gSprites[spriteId3].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
+ StartSpriteAnim(&gSprites[spriteId3], 2);
+ AnimateSprite(&gSprites[spriteId3]);
+
+ spriteId4 = CreateSprite(&gUnknown_0831C688, x, y, 2);
+ gSprites[spriteId4].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
+ StartSpriteAnim(&gSprites[spriteId4], 3);
+ AnimateSprite(&gSprites[spriteId4]);
+
+ return mainSpriteId;
+}
+
+static void sub_8075370(struct Sprite *sprite)
+{
+ if (!sprite->data[0])
+ {
+ FreeSpriteTilesByTag(gUnknown_0831C620.tag);
+ FreeSpritePaletteByTag(gUnknown_0831C628.tag);
+ if (!sprite->data[1])
+ DestroySprite(sprite);
+ else
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+void sub_80753B4(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ gSprites[sprite->data[0]].data[0]--;
+ DestroySprite(sprite);
+ }
+}
diff --git a/src/sound.c b/src/sound.c
index a95511ece..ba3f659cc 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -5,7 +5,7 @@
#include "m4a.h"
#include "main.h"
#include "pokemon.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "task.h"
struct Fanfare
@@ -29,10 +29,10 @@ IWRAM_DATA static u16 sFanfareCounter;
bool8 gDisableMusic;
extern u32 gBattleTypeFlags;
-extern struct MusicPlayerInfo gMPlay_BGM;
-extern struct MusicPlayerInfo gMPlay_SE1;
-extern struct MusicPlayerInfo gMPlay_SE2;
-extern struct MusicPlayerInfo gMPlay_SE3;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+extern struct MusicPlayerInfo gMPlayInfo_SE1;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
+extern struct MusicPlayerInfo gMPlayInfo_SE3;
extern struct ToneData gCryTable[];
extern struct ToneData gCryTable2[];
extern const struct Fanfare sFanfares[];
@@ -171,7 +171,7 @@ bool8 IsNotWaitingForBGMStop(void)
void PlayFanfareByFanfareNum(u8 fanfareNum)
{
u16 songNum;
- m4aMPlayStop(&gMPlay_BGM);
+ m4aMPlayStop(&gMPlayInfo_BGM);
songNum = sFanfares[fanfareNum].songNum;
sFanfareCounter = sFanfares[fanfareNum].duration;
m4aSongNumStart(songNum);
@@ -187,9 +187,9 @@ bool8 WaitFanfare(bool8 stop)
else
{
if (!stop)
- m4aMPlayContinue(&gMPlay_BGM);
+ m4aMPlayContinue(&gMPlayInfo_BGM);
else
- m4aSongNumStart(SE_STOP);
+ m4aSongNumStart(MUS_DUMMY);
return TRUE;
}
@@ -232,7 +232,7 @@ static void Task_Fanfare(u8 taskId)
}
else
{
- m4aMPlayContinue(&gMPlay_BGM);
+ m4aMPlayContinue(&gMPlayInfo_BGM);
DestroyTask(taskId);
}
}
@@ -250,46 +250,46 @@ void FadeInNewBGM(u16 songNum, u8 speed)
if (songNum == 0xFFFF)
songNum = 0;
m4aSongNumStart(songNum);
- m4aMPlayImmInit(&gMPlay_BGM);
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0);
+ m4aMPlayImmInit(&gMPlayInfo_BGM);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0);
m4aSongNumStop(songNum);
- m4aMPlayFadeIn(&gMPlay_BGM, speed);
+ m4aMPlayFadeIn(&gMPlayInfo_BGM, speed);
}
void FadeOutBGMTemporarily(u8 speed)
{
- m4aMPlayFadeOutTemporarily(&gMPlay_BGM, speed);
+ m4aMPlayFadeOutTemporarily(&gMPlayInfo_BGM, speed);
}
bool8 IsBGMPausedOrStopped(void)
{
- if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE)
+ if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE)
return TRUE;
- if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK))
+ if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK))
return TRUE;
return FALSE;
}
void FadeInBGM(u8 speed)
{
- m4aMPlayFadeIn(&gMPlay_BGM, speed);
+ m4aMPlayFadeIn(&gMPlayInfo_BGM, speed);
}
void FadeOutBGM(u8 speed)
{
- m4aMPlayFadeOut(&gMPlay_BGM, speed);
+ m4aMPlayFadeOut(&gMPlayInfo_BGM, speed);
}
bool8 IsBGMStopped(void)
{
- if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK))
+ if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK))
return TRUE;
return FALSE;
}
void PlayCry1(u16 species, s8 pan)
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 85);
PlayCryInternal(species, pan, CRY_VOLUME, 10, 0);
gPokemonCryBGMDuckingCounter = 2;
RestoreBGMVolumeAfterPokemonCry();
@@ -308,7 +308,7 @@ void PlayCry3(u16 species, s8 pan, u8 mode)
}
else
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 85);
PlayCryInternal(species, pan, CRY_VOLUME, 10, mode);
gPokemonCryBGMDuckingCounter = 2;
RestoreBGMVolumeAfterPokemonCry();
@@ -324,7 +324,7 @@ void PlayCry4(u16 species, s8 pan, u8 mode)
else
{
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 85);
PlayCryInternal(species, pan, CRY_VOLUME, 10, mode);
}
}
@@ -337,7 +337,7 @@ void PlayCry6(u16 species, s8 pan, u8 mode) // not present in R/S
}
else
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 85);
PlayCryInternal(species, pan, CRY_VOLUME, 10, mode);
gPokemonCryBGMDuckingCounter = 2;
}
@@ -345,7 +345,7 @@ void PlayCry6(u16 species, s8 pan, u8 mode) // not present in R/S
void PlayCry5(u16 species, u8 mode)
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 85);
PlayCryInternal(species, 0, CRY_VOLUME, 10, mode);
gPokemonCryBGMDuckingCounter = 2;
RestoreBGMVolumeAfterPokemonCry();
@@ -529,7 +529,7 @@ static void Task_DuckBGMForPokemonCry(u8 taskId)
if (!IsPokemonCryPlaying(gMPlay_PokemonCry))
{
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256);
DestroyTask(taskId);
}
}
@@ -557,55 +557,55 @@ void PlaySE(u16 songNum)
void PlaySE12WithPanning(u16 songNum, s8 pan)
{
m4aSongNumStart(songNum);
- m4aMPlayImmInit(&gMPlay_SE1);
- m4aMPlayImmInit(&gMPlay_SE2);
- m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan);
- m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan);
+ m4aMPlayImmInit(&gMPlayInfo_SE1);
+ m4aMPlayImmInit(&gMPlayInfo_SE2);
+ m4aMPlayPanpotControl(&gMPlayInfo_SE1, 0xFFFF, pan);
+ m4aMPlayPanpotControl(&gMPlayInfo_SE2, 0xFFFF, pan);
}
void PlaySE1WithPanning(u16 songNum, s8 pan)
{
m4aSongNumStart(songNum);
- m4aMPlayImmInit(&gMPlay_SE1);
- m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan);
+ m4aMPlayImmInit(&gMPlayInfo_SE1);
+ m4aMPlayPanpotControl(&gMPlayInfo_SE1, 0xFFFF, pan);
}
void PlaySE2WithPanning(u16 songNum, s8 pan)
{
m4aSongNumStart(songNum);
- m4aMPlayImmInit(&gMPlay_SE2);
- m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan);
+ m4aMPlayImmInit(&gMPlayInfo_SE2);
+ m4aMPlayPanpotControl(&gMPlayInfo_SE2, 0xFFFF, pan);
}
void SE12PanpotControl(s8 pan)
{
- m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan);
- m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan);
+ m4aMPlayPanpotControl(&gMPlayInfo_SE1, 0xFFFF, pan);
+ m4aMPlayPanpotControl(&gMPlayInfo_SE2, 0xFFFF, pan);
}
bool8 IsSEPlaying(void)
{
- if ((gMPlay_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlay_SE2.status & MUSICPLAYER_STATUS_PAUSE))
+ if ((gMPlayInfo_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlayInfo_SE2.status & MUSICPLAYER_STATUS_PAUSE))
return FALSE;
- if (!(gMPlay_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlay_SE2.status & MUSICPLAYER_STATUS_TRACK))
+ if (!(gMPlayInfo_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlayInfo_SE2.status & MUSICPLAYER_STATUS_TRACK))
return FALSE;
return TRUE;
}
bool8 IsBGMPlaying(void)
{
- if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE)
+ if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE)
return FALSE;
- if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK))
+ if (!(gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_TRACK))
return FALSE;
return TRUE;
}
bool8 IsSpecialSEPlaying(void)
{
- if (gMPlay_SE3.status & MUSICPLAYER_STATUS_PAUSE)
+ if (gMPlayInfo_SE3.status & MUSICPLAYER_STATUS_PAUSE)
return FALSE;
- if (!(gMPlay_SE3.status & MUSICPLAYER_STATUS_TRACK))
+ if (!(gMPlayInfo_SE3.status & MUSICPLAYER_STATUS_TRACK))
return FALSE;
return TRUE;
}
diff --git a/src/sprite.c b/src/sprite.c
index daa019019..8a4729b27 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -168,14 +168,7 @@ static const struct Sprite sDummySprite =
.animPaused = 0,
.affineAnimPaused = 0,
.animLoopCounter = 0,
- .data0 = 0,
- .data1 = 0,
- .data2 = 0,
- .data3 = 0,
- .data4 = 0,
- .data5 = 0,
- .data6 = 0,
- .data7 = 0,
+ .data = {0, 0, 0, 0, 0, 0, 0},
.inUse = 0,
.coordOffsetEnabled = 0,
.invisible = 0,
@@ -247,12 +240,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
AffineAnimCmd_frame,
};
-static const s32 gUnknown_082EC6F4[24] =
+static const s32 sUnknown_082EC6F4[3][4][2] =
{
- 8, 8, 0x10, 0x10, 0x20, 0x20,
- 0x40, 0x40, 0x10, 8, 0x20, 8,
- 0x20, 0x10, 0x40, 0x20, 8, 0x10,
- 8, 0x20, 0x10, 0x20, 0x20, 0x40,
+ {
+ {8, 8},
+ {0x10, 0x10},
+ {0x20, 0x20},
+ {0x40, 0x40},
+ },
+ {
+ {0x10, 8},
+ {0x20, 8},
+ {0x20, 0x10},
+ {0x40, 0x20},
+ },
+ {
+ {8, 0x10},
+ {8, 0x20},
+ {0x10, 0x20},
+ {0x20, 0x40},
+ },
};
static const struct OamDimensions sOamDimensions[3][4] =
@@ -1075,7 +1082,7 @@ void BeginAffineAnim(struct Sprite *sprite)
ApplyAffineAnimFrame(matrixNum, &frameCmd);
sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration;
if (sprite->flags_f)
- obj_update_pos2(sprite, sprite->data6, sprite->data7);
+ obj_update_pos2(sprite, sprite->data[6], sprite->data[7]);
}
}
@@ -1101,7 +1108,7 @@ void ContinueAffineAnim(struct Sprite *sprite)
sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite);
}
if (sprite->flags_f)
- obj_update_pos2(sprite, sprite->data6, sprite->data7);
+ obj_update_pos2(sprite, sprite->data[6], sprite->data[7]);
}
}
@@ -1197,8 +1204,8 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite)
void sub_8007E18(struct Sprite* sprite, s16 a2, s16 a3)
{
- sprite->data6 = a2;
- sprite->data7 = a3;
+ sprite->data[6] = a2;
+ sprite->data[7] = a3;
sprite->flags_f = 1;
}
@@ -1214,106 +1221,26 @@ s32 sub_8007E28(s32 a0, s32 a1, s32 a2)
return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1);
}
-#ifdef NONMATCHING
-void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
+void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2)
{
s32 var0, var1, var2;
- u8 matrixNum = sprite->oam.matrixNum;
+
+ u32 matrixNum = sprite->oam.matrixNum;
if (a1 != 0x800)
{
- var0 = gUnknown_082EC6F4[sprite->oam.size * 8 + sprite->oam.shape * 32];
+ var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0];
var1 = var0 << 8;
var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
sprite->pos2.x = sub_8007E28(var1, var2, a1);
}
if (a2 != 0x800)
{
- var0 = gUnknown_082EC6F4[4 + (sprite->oam.size * 8 + sprite->oam.shape * 32)];
+ var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1];
var1 = var0 << 8;
var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
sprite->pos2.y = sub_8007E28(var1, var2, a2);
}
}
-#else
-__attribute__((naked))
-void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- adds r5, r0, 0\n\
- adds r6, r1, 0\n\
- mov r8, r2\n\
- ldrb r1, [r5, 0x3]\n\
- lsls r0, r1, 26\n\
- lsrs r7, r0, 27\n\
- movs r0, 0x80\n\
- lsls r0, 4\n\
- mov r9, r0\n\
- cmp r6, r9\n\
- beq _08007EA2\n\
- ldr r2, =gUnknown_082EC6F4\n\
- lsrs r1, 6\n\
- lsls r1, 3\n\
- ldrb r0, [r5, 0x1]\n\
- lsrs r0, 6\n\
- lsls r0, 5\n\
- adds r1, r0\n\
- adds r1, r2\n\
- ldr r0, [r1]\n\
- lsls r4, r0, 8\n\
- lsls r0, 16\n\
- ldr r2, =gOamMatrices\n\
- lsls r1, r7, 3\n\
- adds r1, r2\n\
- movs r2, 0\n\
- ldrsh r1, [r1, r2]\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- adds r0, r4, 0\n\
- adds r2, r6, 0\n\
- bl sub_8007E28\n\
- strh r0, [r5, 0x24]\n\
-_08007EA2:\n\
- cmp r8, r9\n\
- beq _08007EDA\n\
- ldr r2, =gUnknown_082EC6F4\n\
- ldrb r1, [r5, 0x3]\n\
- lsrs r1, 6\n\
- lsls r1, 3\n\
- ldrb r0, [r5, 0x1]\n\
- lsrs r0, 6\n\
- lsls r0, 5\n\
- adds r1, r0\n\
- adds r2, 0x4\n\
- adds r1, r2\n\
- ldr r0, [r1]\n\
- lsls r4, r0, 8\n\
- lsls r0, 16\n\
- ldr r2, =gOamMatrices\n\
- lsls r1, r7, 3\n\
- adds r1, r2\n\
- movs r2, 0x6\n\
- ldrsh r1, [r1, r2]\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- adds r0, r4, 0\n\
- mov r2, r8\n\
- bl sub_8007E28\n\
- strh r0, [r5, 0x26]\n\
-_08007EDA:\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- .syntax divided");
-}
-#endif // NONMATCHING
void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip)
{
diff --git a/src/start_menu.c b/src/start_menu.c
index f45fd8626..7591d3b57 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -6,6 +6,33 @@
#include "window.h"
#include "string_util.h"
#include "text.h"
+#include "strings.h"
+#include "bg.h"
+#include "field_effect.h"
+#include "task.h"
+#include "overworld.h"
+#include "link.h"
+#include "battle_frontier_2.h"
+#include "rom_818CFC8.h"
+#include "field_specials.h"
+#include "event_object_movement.h"
+#include "script.h"
+#include "main.h"
+#include "sound.h"
+#include "pokedex.h"
+#include "field_weather.h"
+#include "palette.h"
+#include "item_menu.h"
+#include "option_menu.h"
+#include "event_scripts.h"
+#include "save.h"
+#include "gpu_regs.h"
+#include "scanline_effect.h"
+#include "text_window.h"
+#include "load_save.h"
+#include "international_string_util.h"
+#include "constants/songs.h"
+#include "field_player_avatar.h"
// Menu actions
enum
@@ -25,69 +52,257 @@ enum
MENU_ACTION_PYRAMID_BAG
};
-static void BuildStartMenuActions_LinkMode(void);
-static void BuildStartMenuActions_UnionRoom(void);
-static void BuildStartMenuActions_SafariZone(void);
-static void BuildStartMenuActions_BattlePike(void);
-static void BuildStartMenuActions_BattlePyramid(void);
-static void BuildStartMenuActions_MultiBattleRoom(void);
-static void BuildStartMenuActions_Normal(void);
-u8 StartMenu_PlayerName(void);
-
-extern bool32 is_c1_link_related_active(void);
-extern bool32 InUnionRoom(void);
-extern bool8 InBattlePike(void);
-extern bool8 InBattlePyramid(void);
-extern bool8 InMultiBattleRoom(void);
-extern void sub_81973FC(u8 windowId, u8 a1);
-extern void sub_8198070(u8 windowId, u8 a1);
-
-EWRAM_DATA u8 sSafariBallsWindowId = 0;
-EWRAM_DATA u8 sBattlePyramidFloorWindowId = 0;
-EWRAM_DATA u8 sStartMenuCursorPos = 0;
-EWRAM_DATA u8 sNumStartMenuActions = 0;
-EWRAM_DATA u8 sCurrentStartMenuActions[9] = {0};
-
-void BuildStartMenuActions(void)
+// Save status
+enum
+{
+ SAVE_IN_PROGRESS,
+ SAVE_SUCCESS,
+ SAVE_CANCELED,
+ SAVE_ERROR
+};
+
+EWRAM_DATA static u8 sSafariBallsWindowId = 0;
+EWRAM_DATA static u8 sBattlePyramidFloorWindowId = 0;
+EWRAM_DATA static u8 sStartMenuCursorPos = 0;
+EWRAM_DATA static u8 sNumStartMenuActions = 0;
+EWRAM_DATA static u8 sCurrentStartMenuActions[9] = {0};
+EWRAM_DATA static u8 sUnknown_02037619[2] = {0};
+
+EWRAM_DATA static u8 (*sSaveDialogCallback)(void) = NULL;
+EWRAM_DATA static u8 sSaveDialogTimer = 0;
+EWRAM_DATA static bool8 sSavingComplete = FALSE;
+EWRAM_DATA static u8 sSaveInfoWindowId = 0;
+
+// Extern variables
+extern u8 gDifferentSaveFile;
+extern u16 gSaveFileStatus;
+extern u8 gUnknown_03005DB4;
+
+// Extern functions in uncompiled files
+extern void sub_80AF688(void);
+extern void var_800D_set_xB(void);
+extern void sub_808B864(void);
+extern void sub_80BB534(void);
+extern void play_some_sound(void);
+extern void CB2_PartyMenuFromStartMenu(void);
+extern void CB2_PokeNav(void);
+extern void sub_80C4DDC(void (*)(void));
+extern void sub_80C51C4(void (*)(void));
+extern void sub_80C4E74(u8, void (*)(void));
+extern void sub_81C4EFC(void);
+extern void ScriptUnfreezeEventObjects(void);
+extern void sub_81A9EC8(void);
+extern void save_serialize_map(void);
+extern void sub_81A9E90(void);
+
+// Menu action callbacks
+static bool8 StartMenuPokedexCallback(void);
+static bool8 StartMenuPokemonCallback(void);
+static bool8 StartMenuBagCallback(void);
+static bool8 StartMenuPokeNavCallback(void);
+static bool8 StartMenuPlayerNameCallback(void);
+static bool8 StartMenuSaveCallback(void);
+static bool8 StartMenuOptionCallback(void);
+static bool8 StartMenuExitCallback(void);
+static bool8 StartMenuSafariZoneRetireCallback(void);
+static bool8 StartMenuLinkModePlayerNameCallback(void);
+static bool8 StartMenuBattlePyramidRetireCallback(void);
+static bool8 StartMenuBattlePyramidBagCallback(void);
+
+// Menu callbacks
+static bool8 SaveStartCallback(void);
+static bool8 SaveCallback(void);
+static bool8 BattlePyramidRetireStartCallback(void);
+static bool8 BattlePyramidRetireReturnCallback(void);
+static bool8 BattlePyramidRetireCallback(void);
+static bool8 HandleStartMenuInput(void);
+
+// Save dialog callbacks
+static u8 SaveConfirmSaveCallback(void);
+static u8 SaveYesNoCallback(void);
+static u8 SaveConfirmInputCallback(void);
+static u8 SaveFileExistsCallback(void);
+static u8 SaveConfirmOverwriteNoCallback(void);
+static u8 SaveConfirmOverwriteCallback(void);
+static u8 SaveOverwriteInputCallback(void);
+static u8 SaveSavingMessageCallback(void);
+static u8 SaveDoSaveCallback(void);
+static u8 SaveSuccessCallback(void);
+static u8 SaveReturnSuccessCallback(void);
+static u8 SaveErrorCallback(void);
+static u8 SaveReturnErrorCallback(void);
+static u8 BattlePyramidConfirmRetireCallback(void);
+static u8 BattlePyramidRetireYesNoCallback(void);
+static u8 BattlePyramidRetireInputCallback(void);
+
+// Task callbacks
+static void StartMenuTask(u8 taskId);
+static void SaveGameTask(u8 taskId);
+static void sub_80A0550(u8 taskId);
+static void sub_80A08A4(u8 taskId);
+
+// Some other callback
+static bool8 sub_809FA00(void);
+
+static const struct WindowTemplate sSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8};
+
+static const u8* const sPyramindFloorNames[] =
+{
+ gText_Floor1,
+ gText_Floor2,
+ gText_Floor3,
+ gText_Floor4,
+ gText_Floor5,
+ gText_Floor6,
+ gText_Floor7,
+ gText_Peak
+};
+
+static const struct WindowTemplate sPyramidFloorWindowTemplate_2 = {0, 1, 1, 0xA, 4, 0xF, 8};
+static const struct WindowTemplate sPyramidFloorWindowTemplate_1 = {0, 1, 1, 0xC, 4, 0xF, 8};
+
+static const struct MenuAction sStartMenuItems[] =
+{
+ {gText_MenuPokedex, {.u8_void = StartMenuPokedexCallback}},
+ {gText_MenuPokemon, {.u8_void = StartMenuPokemonCallback}},
+ {gText_MenuBag, {.u8_void = StartMenuBagCallback}},
+ {gText_MenuPokenav, {.u8_void = StartMenuPokeNavCallback}},
+ {gText_MenuPlayer, {.u8_void = StartMenuPlayerNameCallback}},
+ {gText_MenuSave, {.u8_void = StartMenuSaveCallback}},
+ {gText_MenuOption, {.u8_void = StartMenuOptionCallback}},
+ {gText_MenuExit, {.u8_void = StartMenuExitCallback}},
+ {gText_MenuRetire, {.u8_void = StartMenuSafariZoneRetireCallback}},
+ {gText_MenuPlayer, {.u8_void = StartMenuLinkModePlayerNameCallback}},
+ {gText_MenuRest, {.u8_void = StartMenuSaveCallback}},
+ {gText_MenuRetire, {.u8_void = StartMenuBattlePyramidRetireCallback}},
+ {gText_MenuBag, {.u8_void = StartMenuBattlePyramidBagCallback}}
+};
+
+static const struct BgTemplate sUnknown_085105A8[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ }
+};
+
+static const struct WindowTemplate sUnknown_085105AC[] =
+{
+ {0, 2, 0xF, 0x1A, 4, 0xF, 0x194},
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate sSaveInfoWindowTemplate = {0, 1, 1, 0xE, 0xA, 0xF, 8};
+
+// Local functions
+static void BuildStartMenuActions(void);
+static void AddStartMenuAction(u8 action);
+static void BuildNormalStartMenu(void);
+static void BuildSafariZoneStartMenu(void);
+static void BuildLinkModeStartMenu(void);
+static void BuildUnionRoomStartMenu(void);
+static void BuildBattlePikeStartMenu(void);
+static void BuildBattlePyramidStartMenu(void);
+static void BuildMultiBattleRoomStartMenu(void);
+static void ShowSafariBallsWindow(void);
+static void ShowPyramidFloorWindow(void);
+static void RemoveExtraStartMenuWindows(void);
+static bool32 PrintStartMenuActions(s8 *pIndex, u32 count);
+static bool32 InitStartMenuStep(void);
+static void InitStartMenu(void);
+static void CreateStartMenuTask(TaskFunc followupFunc);
+static void InitSave(void);
+static u8 RunSaveCallback(void);
+static void ShowSaveMessage(const u8 *message, u8 (*saveCallback)(void));
+static void sub_80A0014(void);
+static void HideSaveInfoWindow(void);
+static void SaveStartTimer(void);
+static bool8 SaveSuccesTimer(void);
+static bool8 SaveErrorTimer(void);
+static void InitBattlePyramidRetire(void);
+static void sub_80A03D8(void);
+static bool32 sub_80A03E4(u8 *par1);
+static void sub_80A0540(void);
+static void ShowSaveInfoWindow(void);
+static void RemoveSaveInfoWindow(void);
+static void HideStartMenuWindow(void);
+
+void SetDexPokemonPokenavFlags(void) // unused
+{
+ FlagSet(FLAG_SYS_POKEDEX_GET);
+ FlagSet(FLAG_SYS_POKEMON_GET);
+ FlagSet(FLAG_SYS_POKENAV_GET);
+}
+
+static void BuildStartMenuActions(void)
{
sNumStartMenuActions = 0;
+
if (is_c1_link_related_active() == TRUE)
- BuildStartMenuActions_LinkMode();
+ {
+ BuildLinkModeStartMenu();
+ }
else if (InUnionRoom() == TRUE)
- BuildStartMenuActions_UnionRoom();
+ {
+ BuildUnionRoomStartMenu();
+ }
else if (GetSafariZoneFlag() == TRUE)
- BuildStartMenuActions_SafariZone();
+ {
+ BuildSafariZoneStartMenu();
+ }
else if (InBattlePike())
- BuildStartMenuActions_BattlePike();
+ {
+ BuildBattlePikeStartMenu();
+ }
else if (InBattlePyramid())
- BuildStartMenuActions_BattlePyramid();
+ {
+ BuildBattlePyramidStartMenu();
+ }
else if (InMultiBattleRoom())
- BuildStartMenuActions_MultiBattleRoom();
+ {
+ BuildMultiBattleRoomStartMenu();
+ }
else
- BuildStartMenuActions_Normal();
+ {
+ BuildNormalStartMenu();
+ }
}
-void AddStartMenuAction(u8 action)
+static void AddStartMenuAction(u8 action)
{
AppendToList(sCurrentStartMenuActions, &sNumStartMenuActions, action);
}
-static void BuildStartMenuActions_Normal(void)
+static void BuildNormalStartMenu(void)
{
if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
+ {
AddStartMenuAction(MENU_ACTION_POKEDEX);
+ }
if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE)
+ {
AddStartMenuAction(MENU_ACTION_POKEMON);
+ }
+
AddStartMenuAction(MENU_ACTION_BAG);
+
if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE)
+ {
AddStartMenuAction(MENU_ACTION_POKENAV);
+ }
+
AddStartMenuAction(MENU_ACTION_PLAYER);
AddStartMenuAction(MENU_ACTION_SAVE);
AddStartMenuAction(MENU_ACTION_OPTION);
AddStartMenuAction(MENU_ACTION_EXIT);
}
-static void BuildStartMenuActions_SafariZone(void)
+static void BuildSafariZoneStartMenu(void)
{
AddStartMenuAction(MENU_ACTION_RETIRE_SAFARI);
AddStartMenuAction(MENU_ACTION_POKEDEX);
@@ -98,29 +313,37 @@ static void BuildStartMenuActions_SafariZone(void)
AddStartMenuAction(MENU_ACTION_EXIT);
}
-static void BuildStartMenuActions_LinkMode(void)
+static void BuildLinkModeStartMenu(void)
{
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_BAG);
+
if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE)
+ {
AddStartMenuAction(MENU_ACTION_POKENAV);
+ }
+
AddStartMenuAction(MENU_ACTION_PLAYER_LINK);
AddStartMenuAction(MENU_ACTION_OPTION);
AddStartMenuAction(MENU_ACTION_EXIT);
}
-static void BuildStartMenuActions_UnionRoom(void)
+static void BuildUnionRoomStartMenu(void)
{
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_BAG);
+
if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE)
+ {
AddStartMenuAction(MENU_ACTION_POKENAV);
+ }
+
AddStartMenuAction(MENU_ACTION_PLAYER);
AddStartMenuAction(MENU_ACTION_OPTION);
AddStartMenuAction(MENU_ACTION_EXIT);
}
-static void BuildStartMenuActions_BattlePike(void)
+static void BuildBattlePikeStartMenu(void)
{
AddStartMenuAction(MENU_ACTION_POKEDEX);
AddStartMenuAction(MENU_ACTION_POKEMON);
@@ -129,7 +352,7 @@ static void BuildStartMenuActions_BattlePike(void)
AddStartMenuAction(MENU_ACTION_EXIT);
}
-static void BuildStartMenuActions_BattlePyramid(void)
+static void BuildBattlePyramidStartMenu(void)
{
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_PYRAMID_BAG);
@@ -140,7 +363,7 @@ static void BuildStartMenuActions_BattlePyramid(void)
AddStartMenuAction(MENU_ACTION_EXIT);
}
-static void BuildStartMenuActions_MultiBattleRoom(void)
+static void BuildMultiBattleRoomStartMenu(void)
{
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_PLAYER);
@@ -148,84 +371,1052 @@ static void BuildStartMenuActions_MultiBattleRoom(void)
AddStartMenuAction(MENU_ACTION_EXIT);
}
-extern const struct WindowTemplate gSafariBallsWindowTemplate;
-extern const struct WindowTemplate gPyramidFloorWindowTemplate_1;
-extern const struct WindowTemplate gPyramidFloorWindowTemplate_2;
-extern const u8 gText_SafariBallStock[];
-
-void DisplaySafariBallsWindow(void)
+static void ShowSafariBallsWindow(void)
{
- sSafariBallsWindowId = AddWindow(&gSafariBallsWindowTemplate);
+ sSafariBallsWindowId = AddWindow(&sSafariBallsWindowTemplate);
PutWindowTilemap(sSafariBallsWindowId);
- sub_81973FC(sSafariBallsWindowId, 0);
+ NewMenuHelpers_DrawStdWindowFrame(sSafariBallsWindowId, FALSE);
ConvertIntToDecimalStringN(gStringVar1, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2);
StringExpandPlaceholders(gStringVar4, gText_SafariBallStock);
PrintTextOnWindow(sSafariBallsWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
CopyWindowToVram(sSafariBallsWindowId, 2);
}
-extern const u8* const gUnknown_08510510[];
-extern const u8 gText_BattlePyramidFloor[];
-
-void DisplayPyramidFloorWindow(void)
+static void ShowPyramidFloorWindow(void)
{
- // TODO: fix location
- if (gSaveBlock2Ptr->field_CAA[4] == 7)
- sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_1);
+ if (gSaveBlock2Ptr->frontier.field_CB2 == 7)
+ sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_1);
else
- sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_2);
+ sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_2);
+
PutWindowTilemap(sBattlePyramidFloorWindowId);
- sub_81973FC(sBattlePyramidFloorWindowId, 0);
- StringCopy(gStringVar1, gUnknown_08510510[gSaveBlock2Ptr->field_CAA[4]]);
+ NewMenuHelpers_DrawStdWindowFrame(sBattlePyramidFloorWindowId, FALSE);
+ StringCopy(gStringVar1, sPyramindFloorNames[gSaveBlock2Ptr->frontier.field_CB2]);
StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor);
PrintTextOnWindow(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
CopyWindowToVram(sBattlePyramidFloorWindowId, 2);
}
-void RemoveExtraStartMenuWindows(void)
+static void RemoveExtraStartMenuWindows(void)
{
if (GetSafariZoneFlag())
{
- sub_8198070(sSafariBallsWindowId, 0);
+ sub_8198070(sSafariBallsWindowId, FALSE);
CopyWindowToVram(sSafariBallsWindowId, 2);
RemoveWindow(sSafariBallsWindowId);
}
if (InBattlePyramid())
{
- sub_8198070(sBattlePyramidFloorWindowId, 0);
+ sub_8198070(sBattlePyramidFloorWindowId, FALSE);
RemoveWindow(sBattlePyramidFloorWindowId);
}
}
-extern const struct MenuAction sStartMenuItems[];
-
-/*
-// Prints n menu items starting at *index
-static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n)
+static bool32 PrintStartMenuActions(s8 *pIndex, u32 count)
{
- s8 _index = *index;
+ s8 index = *pIndex;
do
{
- if (sStartMenuItems[sCurrentStartMenuActions[_index]].func.u8_void == StartMenu_PlayerName)
+ if (sStartMenuItems[sCurrentStartMenuActions[index]].func.u8_void == StartMenuPlayerNameCallback) {
+ PrintPlayerNameOnWindow(GetStartMenuWindowId(), sStartMenuItems[sCurrentStartMenuActions[index]].text, 8, (index << 4) + 9);
+ }
+ else {
+ StringExpandPlaceholders(gStringVar4, sStartMenuItems[sCurrentStartMenuActions[index]].text);
+ PrintTextOnWindow(GetStartMenuWindowId(), 1, gStringVar4, 8, (index << 4) + 9, 0xFF, NULL);
+ }
+
+ index++;
+ if (index >= sNumStartMenuActions) {
+ *pIndex = index;
+ return TRUE;
+ }
+
+ count--;
+ }
+ while (count != 0);
+
+ *pIndex = index;
+ return FALSE;
+}
+
+static bool32 InitStartMenuStep(void)
+{
+ s8 value = sUnknown_02037619[0];
+
+ switch (value)
+ {
+ case 0:
+ sUnknown_02037619[0]++;
+ break;
+ case 1:
+ BuildStartMenuActions();
+ sUnknown_02037619[0]++;
+ break;
+ case 2:
+ sub_81973A4();
+ NewMenuHelpers_DrawStdWindowFrame(sub_81979C4(sNumStartMenuActions), FALSE);
+ sUnknown_02037619[1] = 0;
+ sUnknown_02037619[0]++;
+ break;
+ case 3:
+ if (GetSafariZoneFlag() != FALSE)
+ {
+ ShowSafariBallsWindow();
+ }
+ if (InBattlePyramid() != FALSE)
+ {
+ ShowPyramidFloorWindow();
+ }
+ sUnknown_02037619[0]++;
+ break;
+ case 4:
+ if (PrintStartMenuActions(&sUnknown_02037619[1], 2) == FALSE)
{
+ break;
+ }
+ sUnknown_02037619[0]++;
+ break;
+ case 5:
+ sStartMenuCursorPos = sub_81983AC(GetStartMenuWindowId(), 1, 0, 9, 16, sNumStartMenuActions, sStartMenuCursorPos);
+ CopyWindowToVram(GetStartMenuWindowId(), TRUE);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void InitStartMenu(void)
+{
+ sUnknown_02037619[0] = 0;
+ sUnknown_02037619[1] = 0;
+ while (!InitStartMenuStep());
+}
+
+static void StartMenuTask(u8 taskId)
+{
+ if (InitStartMenuStep() == TRUE)
+ {
+ SwitchTaskToFollowupFunc(taskId);
+ }
+}
+
+static void CreateStartMenuTask(TaskFunc followupFunc)
+{
+ u8 taskId;
+
+ sUnknown_02037619[0] = 0;
+ sUnknown_02037619[1] = 0;
+ taskId = CreateTask(StartMenuTask, 0x50);
+ SetTaskFuncWithFollowupFunc(taskId, StartMenuTask, followupFunc);
+}
+
+static bool8 sub_809FA00(void)
+{
+ if (InitStartMenuStep() == FALSE)
+ {
+ return FALSE;
+ }
+
+ sub_80AF688();
+ return TRUE;
+}
+
+void sub_809FA18(void) // Called from field_screen.s
+{
+ sUnknown_02037619[0] = 0;
+ sUnknown_02037619[1] = 0;
+ gFieldCallback2 = sub_809FA00;
+}
+
+void sub_809FA34(u8 taskId) // Referenced in field_screen.s and rom_8011DC0.s
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch(task->data[0])
+ {
+ case 0:
+ if (InUnionRoom() == TRUE)
+ {
+ var_800D_set_xB();
}
- else
+
+ gMenuCallback = HandleStartMenuInput;
+ task->data[0]++;
+ break;
+ case 1:
+ if (gMenuCallback() == TRUE)
+ {
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void ShowStartMenu(void) // Called from overworld.c and field_control_avatar.s
+{
+ if (!is_c1_link_related_active())
+ {
+ FreezeEventObjects();
+ sub_808B864();
+ sub_808BCF4();
+ }
+ CreateStartMenuTask(sub_809FA34);
+ ScriptContext2_Enable();
+}
+
+static bool8 HandleStartMenuInput(void)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sStartMenuCursorPos = MoveMenuCursor(-1);
+ }
+
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sStartMenuCursorPos = MoveMenuCursor(1);
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void == StartMenuPokedexCallback)
{
+ if (GetNationalPokedexCount(0) == 0) {
+ return FALSE;
+ }
+ }
+
+ gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void;
+ if (gMenuCallback != StartMenuSaveCallback
+ && gMenuCallback != StartMenuExitCallback
+ && gMenuCallback != StartMenuSafariZoneRetireCallback
+ && gMenuCallback != StartMenuBattlePyramidRetireCallback)
+ {
+ FadeScreen(1, 0);
}
- } while (++_index > sNumStartMenuActions);
+ return FALSE;
+ }
+
+ if (gMain.newKeys & (START_BUTTON | B_BUTTON))
+ {
+ RemoveExtraStartMenuWindows();
+ HideStartMenu();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenuPokedexCallback(void)
+{
+ if (!gPaletteFade.active)
+ {
+ IncrementGameStat(GAME_STAT_CHECKED_POKEDEX);
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(sub_80BB534); // Display pokedex
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenuPokemonCallback(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_PartyMenuFromStartMenu); // Display party menu
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
- if (--n == 0)
+static bool8 StartMenuBagCallback(void)
+{
+ if (!gPaletteFade.active)
{
- *index = _index;
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_BagMenuFromStartMenu); // Display bag menu
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenuPokeNavCallback(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_PokeNav); // Display PokeNav
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenuPlayerNameCallback(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+
+ if (is_c1_link_related_active() || InUnionRoom())
+ {
+ sub_80C4DDC(CB2_ReturnToFieldWithOpenMenu); // Display trainer card
+ }
+ else if (FlagGet(FLAG_SYS_FRONTIER_PASS))
+ {
+ sub_80C51C4(CB2_ReturnToFieldWithOpenMenu); // Display frontier pass
+ }
+ else
+ {
+ sub_80C4DDC(CB2_ReturnToFieldWithOpenMenu); // Display trainer card
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenuSaveCallback(void)
+{
+ if (InBattlePyramid())
+ {
+ RemoveExtraStartMenuWindows();
+ }
+
+ gMenuCallback = SaveStartCallback; // Display save menu
+
+ return FALSE;
+}
+
+static bool8 StartMenuOptionCallback(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(CB2_InitOptionMenu); // Display option menu
+ gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenuExitCallback(void)
+{
+ RemoveExtraStartMenuWindows();
+ HideStartMenu(); // Hide start menu
+
+ return TRUE;
+}
+
+static bool8 StartMenuSafariZoneRetireCallback(void)
+{
+ RemoveExtraStartMenuWindows();
+ HideStartMenu();
+ SafariZoneRetirePrompt();
+
+ return TRUE;
+}
+
+static bool8 StartMenuLinkModePlayerNameCallback(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ overworld_free_bg_tilemaps();
+ sub_80C4E74(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 StartMenuBattlePyramidRetireCallback(void)
+{
+ gMenuCallback = BattlePyramidRetireStartCallback; // Confirm retire
+
+ return FALSE;
+}
+
+void sub_809FDD4(void) // Called from battle_frontier_2.s
+{
+ sub_8197DF8(0, FALSE);
+ ScriptUnfreezeEventObjects();
+ CreateStartMenuTask(sub_809FA34);
+ ScriptContext2_Enable();
+}
+
+static bool8 StartMenuBattlePyramidBagCallback(void)
+{
+ if (!gPaletteFade.active)
+ {
+ play_some_sound();
+ RemoveExtraStartMenuWindows();
+ overworld_free_bg_tilemaps();
+ SetMainCallback2(sub_81C4EFC); // Display battle pyramid bag
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 SaveStartCallback(void)
+{
+ InitSave();
+ gMenuCallback = SaveCallback;
+
+ return FALSE;
+}
+
+static bool8 SaveCallback(void)
+{
+ switch (RunSaveCallback())
+ {
+ case SAVE_IN_PROGRESS:
return FALSE;
+ case SAVE_CANCELED: // Back to start menu
+ sub_8197DF8(0, FALSE);
+ InitStartMenu();
+ gMenuCallback = HandleStartMenuInput;
+ return FALSE;
+ case SAVE_SUCCESS:
+ case SAVE_ERROR: // Close start menu
+ sub_8197DF8(0, TRUE);
+ ScriptUnfreezeEventObjects();
+ ScriptContext2_Disable();
+ sub_81A9EC8();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 BattlePyramidRetireStartCallback(void)
+{
+ InitBattlePyramidRetire();
+ gMenuCallback = BattlePyramidRetireCallback;
+
+ return FALSE;
+}
+
+static bool8 BattlePyramidRetireReturnCallback(void)
+{
+ InitStartMenu();
+ gMenuCallback = HandleStartMenuInput;
+
+ return FALSE;
+}
+
+static bool8 BattlePyramidRetireCallback(void)
+{
+ switch (RunSaveCallback())
+ {
+ case SAVE_SUCCESS: // No (Stay in battle pyramid)
+ RemoveExtraStartMenuWindows();
+ gMenuCallback = BattlePyramidRetireReturnCallback;
+ return FALSE;
+ case SAVE_IN_PROGRESS:
+ return FALSE;
+ case SAVE_CANCELED: // Yes (Retire from battle pyramid)
+ sub_8197DF8(0, TRUE);
+ ScriptUnfreezeEventObjects();
+ ScriptContext2_Disable();
+ ScriptContext1_SetupScript(BattleFrontier_BattlePyramidEmptySquare_EventScript_252C88);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void InitSave(void)
+{
+ save_serialize_map();
+ sSaveDialogCallback = SaveConfirmSaveCallback;
+ sSavingComplete = FALSE;
+}
+
+static u8 RunSaveCallback(void)
+{
+ // True if text is still printing
+ if (sub_8197224() == TRUE)
+ {
+ return SAVE_IN_PROGRESS;
+ }
+
+ sSavingComplete = FALSE;
+ return sSaveDialogCallback();
+}
+
+void SaveGame(void) // Called from cable_club.s
+{
+ InitSave();
+ CreateTask(SaveGameTask, 0x50);
+}
+
+static void ShowSaveMessage(const u8 *message, u8 (*saveCallback)(void))
+{
+ StringExpandPlaceholders(gStringVar4, message);
+ sub_819786C(0, TRUE);
+ AddTextPrinterForMessage_2(TRUE);
+ sSavingComplete = TRUE;
+ sSaveDialogCallback = saveCallback;
+}
+
+static void SaveGameTask(u8 taskId)
+{
+ u8 status = RunSaveCallback();
+
+ switch (status)
+ {
+ case SAVE_CANCELED:
+ case SAVE_ERROR:
+ gSpecialVar_Result = 0;
+ break;
+ case SAVE_SUCCESS:
+ gSpecialVar_Result = status;
+ break;
+ case SAVE_IN_PROGRESS:
+ return;
+ }
+
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+static void sub_80A0014(void)
+{
+ sub_8197434(0, TRUE);
+}
+
+static void HideSaveInfoWindow(void)
+{
+ RemoveSaveInfoWindow();
+}
+
+static void SaveStartTimer(void)
+{
+ sSaveDialogTimer = 60;
+}
+
+static bool8 SaveSuccesTimer(void)
+{
+ sSaveDialogTimer--;
+
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return TRUE;
+ }
+ else if (sSaveDialogTimer == 0)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 SaveErrorTimer(void)
+{
+ if (sSaveDialogTimer != 0)
+ {
+ sSaveDialogTimer--;
+ }
+ else if (gMain.heldKeys & A_BUTTON)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static u8 SaveConfirmSaveCallback(void)
+{
+ sub_819746C(GetStartMenuWindowId(), FALSE);
+ RemoveStartMenuWindow();
+ ShowSaveInfoWindow();
+
+ if (InBattlePyramid())
+ {
+ ShowSaveMessage(gText_BattlePyramidConfirmRest, SaveYesNoCallback);
}
else
{
- *index = _index;
+ ShowSaveMessage(gText_ConfirmSave, SaveYesNoCallback);
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveYesNoCallback(void)
+{
+ sub_8197930(); // Show Yes/No menu
+ sSaveDialogCallback = SaveConfirmInputCallback;
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveConfirmInputCallback(void)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0: // Yes
+ switch (gSaveFileStatus)
+ {
+ case 0:
+ case 2:
+ if (gDifferentSaveFile == FALSE)
+ {
+ sSaveDialogCallback = SaveFileExistsCallback;
+ return SAVE_IN_PROGRESS;
+ }
+
+ sSaveDialogCallback = SaveSavingMessageCallback;
+ return SAVE_IN_PROGRESS;
+ default:
+ sSaveDialogCallback = SaveFileExistsCallback;
+ return SAVE_IN_PROGRESS;
+ }
+ case -1: // B Button
+ case 1: // No
+ HideSaveInfoWindow();
+ sub_80A0014();
+ return SAVE_CANCELED;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+// A different save file exists
+static u8 SaveFileExistsCallback(void)
+{
+ if (gDifferentSaveFile == TRUE)
+ {
+ ShowSaveMessage(gText_DifferentSaveFile, SaveConfirmOverwriteNoCallback);
+ }
+ else
+ {
+ ShowSaveMessage(gText_AlreadySavedFile, SaveConfirmOverwriteCallback);
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveConfirmOverwriteNoCallback(void)
+{
+ sub_8197948(1); // Show Yes/No menu (No selected as default)
+ sSaveDialogCallback = SaveOverwriteInputCallback;
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveConfirmOverwriteCallback(void)
+{
+ sub_8197930(); // Show Yes/No menu
+ sSaveDialogCallback = SaveOverwriteInputCallback;
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveOverwriteInputCallback(void)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0: // Yes
+ sSaveDialogCallback = SaveSavingMessageCallback;
+ return SAVE_IN_PROGRESS;
+ case -1: // B Button
+ case 1: // No
+ HideSaveInfoWindow();
+ sub_80A0014();
+ return SAVE_CANCELED;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveSavingMessageCallback(void)
+{
+ ShowSaveMessage(gText_SavingDontTurnOff, SaveDoSaveCallback);
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveDoSaveCallback(void)
+{
+ u8 saveStatus;
+
+ IncrementGameStat(GAME_STAT_SAVED_GAME);
+ sub_81A9E90();
+
+ if (gDifferentSaveFile == TRUE)
+ {
+ saveStatus = TrySavingData(SAVE_OVERWRITE_DIFFERENT_FILE);
+ gDifferentSaveFile = FALSE;
+ }
+ else
+ {
+ saveStatus = TrySavingData(SAVE_NORMAL);
+ }
+
+ if (saveStatus == 1) // Save succeded
+ {
+ ShowSaveMessage(gText_PlayerSavedGame, SaveSuccessCallback);
+ }
+ else // Save error
+ {
+ ShowSaveMessage(gText_SaveError, SaveErrorCallback);
+ }
+
+ SaveStartTimer();
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveSuccessCallback(void)
+{
+ if (!IsTextPrinterActive(0))
+ {
+ PlaySE(SE_SAVE);
+ sSaveDialogCallback = SaveReturnSuccessCallback;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveReturnSuccessCallback(void)
+{
+ if (!IsSEPlaying() && SaveSuccesTimer())
+ {
+ HideSaveInfoWindow();
+ return SAVE_SUCCESS;
+ }
+ else
+ {
+ return SAVE_IN_PROGRESS;
+ }
+}
+
+static u8 SaveErrorCallback(void)
+{
+ if (!IsTextPrinterActive(0))
+ {
+ PlaySE(SE_BOO);
+ sSaveDialogCallback = SaveReturnErrorCallback;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 SaveReturnErrorCallback(void)
+{
+ if (!SaveErrorTimer())
+ {
+ return SAVE_IN_PROGRESS;
+ }
+ else
+ {
+ HideSaveInfoWindow();
+ return SAVE_ERROR;
+ }
+}
+
+static void InitBattlePyramidRetire(void)
+{
+ sSaveDialogCallback = BattlePyramidConfirmRetireCallback;
+ sSavingComplete = FALSE;
+}
+
+static u8 BattlePyramidConfirmRetireCallback(void)
+{
+ sub_819746C(GetStartMenuWindowId(), FALSE);
+ RemoveStartMenuWindow();
+ ShowSaveMessage(gText_BattlePyramidConfirmRetire, BattlePyramidRetireYesNoCallback);
+
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 BattlePyramidRetireYesNoCallback(void)
+{
+ sub_8197948(1); // Show Yes/No menu (No selected as default)
+ sSaveDialogCallback = BattlePyramidRetireInputCallback;
+
+ return SAVE_IN_PROGRESS;
+}
+
+static u8 BattlePyramidRetireInputCallback(void)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0: // Yes
+ return SAVE_CANCELED;
+ case -1: // B Button
+ case 1: // No
+ sub_80A0014();
+ return SAVE_SUCCESS;
+ }
+
+ return SAVE_IN_PROGRESS;
+}
+
+static void sub_80A03D8(void)
+{
+ TransferPlttBuffer();
+}
+
+static bool32 sub_80A03E4(u8 *par1)
+{
+ switch (*par1)
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);
+ SetVBlankCallback(NULL);
+ ScanlineEffect_Stop();
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
+ break;
+ case 1:
+ ResetSpriteData();
+ ResetTasks();
+ ResetPaletteFade();
+ ScanlineEffect_Clear();
+ break;
+ case 2:
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sUnknown_085105A8, ARRAY_COUNT(sUnknown_085105A8));
+ InitWindows(sUnknown_085105AC);
+ LoadUserWindowBorderGfx_(0, 8, 224);
+ sub_81978B0(240);
+ break;
+ case 3:
+ ShowBg(0);
+ BlendPalettes(-1, 16, 0);
+ SetVBlankCallback(sub_80A03D8);
+ EnableInterrupts(1);
+ break;
+ case 4:
return TRUE;
}
-}*/
+
+ (*par1)++;
+ return FALSE;
+}
+
+void sub_80A0514(void) // Called from cable_club.s
+{
+ if (sub_80A03E4(&gMain.state))
+ {
+ CreateTask(sub_80A0550, 0x50);
+ SetMainCallback2(sub_80A0540);
+ }
+}
+
+static void sub_80A0540(void)
+{
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+static void sub_80A0550(u8 taskId)
+{
+ s16 *step = gTasks[taskId].data;
+
+ if (!gPaletteFade.active)
+ {
+ switch (*step)
+ {
+ case 0:
+ FillWindowPixelBuffer(0, 17);
+ AddTextPrinterParameterized(0,
+ 1,
+ gText_SavingDontTurnOffPower,
+ 255,
+ NULL,
+ 2,
+ 1,
+ 3);
+ sub_8098858(0, 8, 14);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+
+ if (gWirelessCommType != 0 && InUnionRoom())
+ {
+ if (sub_800A07C())
+ {
+ *step = 1;
+ }
+ else
+ {
+ *step = 5;
+ }
+ }
+ else
+ {
+ gSoftResetDisabled = 1;
+ *step = 1;
+ }
+ break;
+ case 1:
+ sub_8076D5C();
+ sub_8153430();
+ *step = 2;
+ break;
+ case 2:
+ if (sub_8153474())
+ {
+ sav2_gender2_inplace_and_xFE();
+ *step = 3;
+ gSoftResetDisabled = 0;
+ }
+ break;
+ case 3:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ *step = 4;
+ break;
+ case 4:
+ FreeAllWindowBuffers();
+ SetMainCallback2(gMain.savedCallback);
+ DestroyTask(taskId);
+ break;
+ case 5:
+ CreateTask(sub_8153688, 0x5);
+ *step = 6;
+ break;
+ case 6:
+ if (!FuncIsActiveTask(sub_8153688))
+ {
+ *step = 3;
+ }
+ break;
+ }
+ }
+}
+
+static void ShowSaveInfoWindow(void)
+{
+ struct WindowTemplate saveInfoWindow = sSaveInfoWindowTemplate;
+ u8 gender;
+ u8 color;
+ u32 xOffset;
+ u32 yOffset;
+
+ if (!FlagGet(FLAG_SYS_POKEDEX_GET))
+ {
+ saveInfoWindow.height -= 2;
+ }
+
+ sSaveInfoWindowId = AddWindow(&saveInfoWindow);
+ NewMenuHelpers_DrawStdWindowFrame(sSaveInfoWindowId, FALSE);
+
+ gender = gSaveBlock2Ptr->playerGender;
+ color = TEXT_COLOR_RED; // Red when female, blue when male.
+
+ if (gender == MALE)
+ {
+ color = TEXT_COLOR_BLUE;
+ }
+
+ // Print region name
+ yOffset = 1;
+ sub_819A344(3, gStringVar4, TEXT_COLOR_GREEN);
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, 0, yOffset, 0xFF, NULL);
+
+ // Print player name
+ yOffset = 0x11;
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingPlayer, 0, yOffset, 0xFF, NULL);
+ sub_819A344(0, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintPlayerNameOnWindow(sSaveInfoWindowId, gStringVar4, xOffset, yOffset);
+
+ // Print badge count
+ yOffset = 0x21;
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingBadges, 0, yOffset, 0xFF, NULL);
+ sub_819A344(4, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
+
+ if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
+ {
+ // Print pokedex count
+ yOffset = 0x31;
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingPokedex, 0, yOffset, 0xFF, NULL);
+ sub_819A344(1, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
+ }
+
+ // Print play time
+ yOffset += 0x10;
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingTime, 0, yOffset, 0xFF, NULL);
+ sub_819A344(2, gStringVar4, color);
+ xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70);
+ PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL);
+
+ CopyWindowToVram(sSaveInfoWindowId, 2);
+}
+
+static void RemoveSaveInfoWindow(void)
+{
+ sub_819746C(sSaveInfoWindowId, FALSE);
+ RemoveWindow(sSaveInfoWindowId);
+}
+
+static void sub_80A08A4(u8 taskId)
+{
+ if (!FuncIsActiveTask(sub_8153688))
+ {
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}
+
+void sub_80A08CC(void) // Referenced in data/specials.inc and data/scripts/maps/BattleFrontier_BattleTowerLobby.inc
+{
+ u8 taskId = CreateTask(sub_8153688, 0x5);
+ gTasks[taskId].data[2] = 1;
+ gTasks[CreateTask(sub_80A08A4, 0x6)].data[1] = taskId;
+}
+
+static void HideStartMenuWindow(void)
+{
+ sub_819746C(GetStartMenuWindowId(), TRUE);
+ RemoveStartMenuWindow();
+ ScriptUnfreezeEventObjects();
+ ScriptContext2_Disable();
+}
+
+void HideStartMenu(void) // Called from map_name_popup.s
+{
+ PlaySE(SE_SELECT);
+ HideStartMenuWindow();
+}
+
+void AppendToList(u8 *list, u8 *pos, u8 newEntry)
+{
+ list[*pos] = newEntry;
+ (*pos)++;
+}
diff --git a/src/starter_choose.c b/src/starter_choose.c
index 8cf3cfefa..b55b0fbc5 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -9,15 +9,17 @@
#include "main.h"
#include "window.h"
#include "text.h"
+#include "text_window.h"
#include "decompress.h"
#include "menu.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "event_data.h"
#include "pokedex.h"
#include "data2.h"
#include "international_string_util.h"
#include "trig.h"
+#include "scanline_effect.h"
#define STARTER_MON_COUNT 3
@@ -25,12 +27,6 @@
#define STARTER_PKMN_POS_X 120
#define STARTER_PKMN_POS_Y 64
-// graphics
-extern const u32 gBirchHelpGfx[];
-extern const u32 gBirchBagTilemap[];
-extern const u32 gBirchGrassTilemap[];
-extern const u16 gBirchBagGrassPal[];
-
// text
extern const u8 gText_BirchInTrouble[];
extern const u8 gText_ConfirmStarterChoice[];
@@ -52,13 +48,10 @@ extern const u8 gStarterChoose_LabelCoords[][2];
extern const u8 gUnknown_085B1E0C[];
extern const u8 gUnknown_085B1E28[][2];
-extern void sub_809882C(u8, u16, u8);
-extern void remove_some_task(void);
extern void clear_scheduled_bg_copies_to_vram(void);
extern void dp13_810BB8C(void);
extern void do_scheduled_bg_tilemap_copies_to_vram(void);
extern u16 sub_818D820(u16);
-extern const u16 *GetOverworldTextboxPalettePtr(void);
extern u8 sub_818D3E4(u16 species, u32 trainerId, u32 personality, u8 flags, s16 x, s16 y, u8, u16);
// this file's functions
@@ -74,7 +67,7 @@ static void Task_MoveStarterChooseCursor(u8 taskId);
static void sub_8134668(u8 taskId);
static void CreateStarterPokemonLabel(u8 selection);
static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y);
-static void StarterPokemonSpriteCallback(struct Sprite *sprite);
+void StarterPokemonSpriteCallback(struct Sprite *sprite);
static IWRAM_DATA u16 sStarterChooseWindowId;
@@ -132,9 +125,9 @@ void CB2_ChooseStarter(void)
InitWindows(gUnknown_085B1DCC);
DeactivateAllTextPrinters();
- sub_809882C(0, 0x2A8, 0xD0);
+ LoadUserWindowBorderGfx(0, 0x2A8, 0xD0);
clear_scheduled_bg_copies_to_vram();
- remove_some_task();
+ ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
@@ -146,7 +139,7 @@ void CB2_ChooseStarter(void)
LoadCompressedObjectPic(&gUnknown_085B1ED8[0]);
LoadCompressedObjectPic(&gUnknown_085B1EE8[0]);
LoadSpritePalettes(gUnknown_085B1EF8);
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
EnableInterrupts(DISPSTAT_VBLANK);
SetVBlankCallback(VblankCB_StarterChoose);
@@ -170,20 +163,20 @@ void CB2_ChooseStarter(void)
// Create hand sprite
spriteId = CreateSprite(&sSpriteTemplate_Hand, 120, 56, 2);
- gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data[0] = taskId;
// Create three Pokeball sprites
spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[0][0], sPokeballCoords[0][1], 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 0;
spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[1][0], sPokeballCoords[1][1], 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 1;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 1;
spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[2][0], sPokeballCoords[2][1], 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 2;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 2;
sStarterChooseWindowId = 0xFF;
}
@@ -265,7 +258,7 @@ static void Task_StarterChoose5(u8 taskId)
{
u8 spriteId;
- switch (sub_8198C58())
+ switch (ProcessMenuInputNoWrap_())
{
case 0: // YES
// Return the starter choice and exit.
@@ -361,23 +354,23 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
return spriteId;
}
-static void sub_81346DC(struct Sprite *sprite)
+void sub_81346DC(struct Sprite *sprite)
{
- sprite->pos1.x = gUnknown_085B1E28[gTasks[sprite->data0].tStarterSelection][0];
- sprite->pos1.y = gUnknown_085B1E28[gTasks[sprite->data0].tStarterSelection][1];
- sprite->pos2.y = Sin(sprite->data1, 8);
- sprite->data1 = (u8)(sprite->data1) + 4;
+ sprite->pos1.x = gUnknown_085B1E28[gTasks[sprite->data[0]].tStarterSelection][0];
+ sprite->pos1.y = gUnknown_085B1E28[gTasks[sprite->data[0]].tStarterSelection][1];
+ sprite->pos2.y = Sin(sprite->data[1], 8);
+ sprite->data[1] = (u8)(sprite->data[1]) + 4;
}
-static void sub_813473C(struct Sprite *sprite)
+void sub_813473C(struct Sprite *sprite)
{
- if (gTasks[sprite->data0].tStarterSelection == sprite->data1)
+ if (gTasks[sprite->data[0]].tStarterSelection == sprite->data[1])
StartSpriteAnimIfDifferent(sprite, 1);
else
StartSpriteAnimIfDifferent(sprite, 0);
}
-static void StarterPokemonSpriteCallback(struct Sprite *sprite)
+void StarterPokemonSpriteCallback(struct Sprite *sprite)
{
//Move sprite to upper center of screen
if (sprite->pos1.x > STARTER_PKMN_POS_X)
diff --git a/src/strings.c b/src/strings.c
new file mode 100644
index 000000000..cdbbb4468
--- /dev/null
+++ b/src/strings.c
@@ -0,0 +1,2051 @@
+#include "global.h"
+#include "strings.h"
+
+// Yes, all the aligns are absolutely necessary.
+// Until someone can come up with a better way to align byte arrays in C, this is what we're doing.
+asm(".align 2");
+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_Emerald[] = _("EMERALD");
+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");
+const u8 gText_EggNickname[] = _("EGG");
+const u8 gText_Pokemon[] = _("POKéMON");
+const u8 gProfBirchMatchCallName[] = _("PROF. BIRCH");
+const u8 gText_MainMenuNewGame[] = _("NEW GAME");
+const u8 gText_MainMenuContinue[] = _("CONTINUE");
+const u8 gText_MainMenuOption[] = _("OPTION");
+const u8 gText_MainMenuMysteryGift[] = _("MYSTERY GIFT");
+const u8 gText_MainMenuMysteryGift2[] = _("MYSTERY GIFT");
+const u8 gText_MainMenuMysteryEvents[] = _("MYSTERY EVENTS");
+const u8 gText_WirelessNotConnected[] = _("The Wireless Adapter is not\nconnected.");
+const u8 gText_MysteryGiftCantUse[] = _("MYSTERY GIFT can’t be used while\nthe Wireless Adapter is attached.");
+const u8 gText_MysteryEventsCantUse[] = _("MYSTERY EVENTS can’t be used while\nthe Wireless Adapter is attached.");
+const u8 gUnknown_085E836D[] = _("Updating save file using external\ndata. Please wait.");
+const u8 gUnknown_085E83A2[] = _("The save file has been updated.");
+const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted. The\nprevious save file will be loaded.");
+const u8 gText_SaveFileErased[] = _("The save file has been erased\ndue to corruption or damage.");
+const u8 gJPText_No1MSubCircuit[] = _("1Mサブきばんが ささっていません!");
+const u8 gText_BatteryRunDry[] = _("The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur.");
+const u8 gUnknown_085E84BF[] = _("PLAYER");
+const u8 gUnknown_085E84C6[] = _("POKéDEX");
+const u8 gText_MainMenuTime[] = _("TIME");
+const u8 gUnknown_085E84D3[] = _("BADGES");
+const u8 gUnknown_085E84DA[] = _("A Button");
+const u8 gUnknown_085E84E3[] = _("B Button");
+const u8 gUnknown_085E84EC[] = _("R Button");
+const u8 gUnknown_085E84F5[] = _("L Button");
+const u8 gUnknown_085E84FE[] = _("START");
+const u8 gUnknown_085E8504[] = _("SELECT");
+const u8 gUnknown_085E850B[] = _("+ Control Pad");
+const u8 gUnknown_085E8519[] = _("L Button R Button");
+const u8 gUnknown_085E852C[] = _("CONTROLS");
+
+asm(".align 2");
+const u8 gUnknown_085E8538[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK");
+
+asm(".align 2");
+const u8 gUnknown_085E8544[] = _("{A_BUTTON}NEXT");
+
+asm(".align 2");
+const u8 gUnknown_085E854C[] = _("{A_BUTTON}NEXT {B_BUTTON}BACK");
+
+asm(".align 2");
+const u8 gText_PickNextCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}NEXT {B_BUTTON}CANCEL");
+
+asm(".align 2");
+const u8 gText_PickCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}{B_BUTTON}CANCEL");
+
+asm(".align 2");
+const u8 gText_UnkCtrlF800Exit[] = _("{A_BUTTON}EXIT");
+const u8 gText_BirchBoy[] = _("BOY");
+const u8 gText_BirchGirl[] = _("GIRL");
+const u8 gText_DefaultNameStu[] = _("STU");
+const u8 gText_DefaultNameMilton[] = _("MILTON");
+const u8 gText_DefaultNameTom[] = _("TOM");
+const u8 gText_DefaultNameKenny[] = _("KENNY");
+const u8 gText_DefaultNameReid[] = _("REID");
+const u8 gText_DefaultNameJude[] = _("JUDE");
+const u8 gText_DefaultNameJaxson[] = _("JAXSON");
+const u8 gText_DefaultNameEaston[] = _("EASTON");
+const u8 gText_DefaultNameWalker[] = _("WALKER");
+const u8 gText_DefaultNameTeru[] = _("TERU");
+const u8 gText_DefaultNameJohnny[] = _("JOHNNY");
+const u8 gText_DefaultNameBrett[] = _("BRETT");
+const u8 gText_DefaultNameSeth[] = _("SETH");
+const u8 gText_DefaultNameTerry[] = _("TERRY");
+const u8 gText_DefaultNameCasey[] = _("CASEY");
+const u8 gText_DefaultNameDarren[] = _("DARREN");
+const u8 gText_DefaultNameLandon[] = _("LANDON");
+const u8 gText_DefaultNameCollin[] = _("COLLIN");
+const u8 gText_DefaultNameStanley[] = _("STANLEY");
+const u8 gText_DefaultNameQuincy[] = _("QUINCY");
+const u8 gText_DefaultNameKimmy[] = _("KIMMY");
+const u8 gText_DefaultNameTiara[] = _("TIARA");
+const u8 gText_DefaultNameBella[] = _("BELLA");
+const u8 gText_DefaultNameJayla[] = _("JAYLA");
+const u8 gText_DefaultNameAllie[] = _("ALLIE");
+const u8 gText_DefaultNameLianna[] = _("LIANNA");
+const u8 gText_DefaultNameSara[] = _("SARA");
+const u8 gText_DefaultNameMonica[] = _("MONICA");
+const u8 gText_DefaultNameCamila[] = _("CAMILA");
+const u8 gText_DefaultNameAubree[] = _("AUBREE");
+const u8 gText_DefaultNameRuthie[] = _("RUTHIE");
+const u8 gText_DefaultNameHazel[] = _("HAZEL");
+const u8 gText_DefaultNameNadine[] = _("NADINE");
+const u8 gText_DefaultNameTanja[] = _("TANJA");
+const u8 gText_DefaultNameYasmin[] = _("YASMIN");
+const u8 gText_DefaultNameNicola[] = _("NICOLA");
+const u8 gText_DefaultNameLillie[] = _("LILLIE");
+const u8 gText_DefaultNameTerra[] = _("TERRA");
+const u8 gText_DefaultNameLucy[] = _("LUCY");
+const u8 gText_DefaultNameHalie[] = _("HALIE");
+const u8 gText_ThisIsAPokemon[] = _("This is what we call a “POKéMON.”{PAUSE 96}\p");
+const u8 gText_5MarksPokemon[] = _("????? POKéMON");
+const u8 gText_UnkHeight[] = _("{CLEAR_TO 0x0C}??’??”");
+const u8 gText_UnkWeight[] = _("????.? lbs.");
+const u8 gUnknown_085E86DC[] = _(" POKéMON");
+const u8 gUnknown_085E86FB[] = _("{CLEAR_TO 0x0C} ’ ”");
+const u8 gUnknown_085E8709[] = _(" . lbs.");
+const u8 gUnknown_085E871A[] = _("");
+const u8 gText_CryOf[] = _("CRY OF");
+const u8 gUnknown_085E8722[] = _("");
+const u8 gText_SizeComparedTo[] = _("SIZE COMPARED TO ");
+const u8 gText_PokedexRegistration[] = _("POKéDEX registration completed.");
+const u8 gText_HTHeight[] = _("HT");
+const u8 gText_WTWeight[] = _("WT");
+const u8 gText_SearchingPleaseWait[] = _("Searching…\nPlease wait.");
+const u8 gText_SearchCompleted[] = _("Search completed.");
+const u8 gUnknown_085E8785[] = _("No matching POKéMON were found.");
+const u8 gUnknown_085E87A5[] = _("Search for POKéMON based on\nselected parameters.");
+const u8 gUnknown_085E87D6[] = _("Switch POKéDEX listings.");
+const u8 gUnknown_085E87EF[] = _("Return to the POKéDEX.");
+const u8 gUnknown_085E8806[] = _("Select the POKéDEX mode.");
+const u8 gUnknown_085E881F[] = _("Select the POKéDEX listing mode.");
+const u8 gUnknown_085E8840[] = _("List by the first letter in the name.\nSpotted POKéMON only.");
+const u8 gUnknown_085E887C[] = _("List by body color.\nSpotted POKéMON only.");
+const u8 gUnknown_085E88A6[] = _("List by type.\nOwned POKéMON only.");
+const u8 gUnknown_085E88C8[] = _("Execute search/switch.");
+const u8 gUnknown_085E88DF[] = _("HOENN DEX");
+const u8 gUnknown_085E88E9[] = _("NATIONAL DEX");
+const u8 gUnknown_085E88F6[] = _("NUMERICAL MODE");
+const u8 gUnknown_085E8905[] = _("A TO Z MODE");
+const u8 gUnknown_085E8911[] = _("HEAVIEST MODE");
+const u8 gUnknown_085E891F[] = _("LIGHTEST MODE");
+const u8 gUnknown_085E892D[] = _("TALLEST MODE");
+const u8 gUnknown_085E893A[] = _("SMALLEST MODE");
+const u8 gUnknown_085E8948[] = _("ABC");
+const u8 gUnknown_085E894C[] = _("DEF");
+const u8 gUnknown_085E8950[] = _("GHI");
+const u8 gUnknown_085E8954[] = _("JKL");
+const u8 gUnknown_085E8958[] = _("MNO");
+const u8 gUnknown_085E895C[] = _("PQR");
+const u8 gUnknown_085E8960[] = _("STU");
+const u8 gUnknown_085E8964[] = _("VWX");
+const u8 gUnknown_085E8968[] = _("YZ");
+const u8 gUnknown_085E896B[] = _("RED");
+const u8 gUnknown_085E896F[] = _("BLUE");
+const u8 gUnknown_085E8974[] = _("YELLOW");
+const u8 gUnknown_085E897B[] = _("GREEN");
+const u8 gUnknown_085E8981[] = _("BLACK");
+const u8 gUnknown_085E8987[] = _("BROWN");
+const u8 gUnknown_085E898D[] = _("PURPLE");
+const u8 gUnknown_085E8994[] = _("GRAY");
+const u8 gUnknown_085E8999[] = _("WHITE");
+const u8 gUnknown_085E899F[] = _("PINK");
+const u8 gUnknown_085E89A4[] = _("HOENN region’s POKéDEX");
+const u8 gUnknown_085E89BB[] = _("National edition POKéDEX");
+const u8 gUnknown_085E89D4[] = _("POKéMON are listed according to their\nnumber.");
+const u8 gUnknown_085E8A02[] = _("Spotted and owned POKéMON are listed\nalphabetically.");
+const u8 gUnknown_085E8A37[] = _("Owned POKéMON are listed from the\nheaviest to the lightest.");
+const u8 gUnknown_085E8A73[] = _("Owned POKéMON are listed from the\nlightest to the heaviest.");
+const u8 gUnknown_085E8AAF[] = _("Owned POKéMON are listed from the\ntallest to the smallest.");
+const u8 gUnknown_085E8AEA[] = _("Owned POKéMON are listed from the\nsmallest to the tallest.");
+const u8 gUnknown_085E8B25[] = _("");
+const u8 gUnknown_085E8B26[] = _("DON’T SPECIFY.");
+const u8 gUnknown_085E8B35[] = _("NONE");
+const u8 gText_SelectorArrow[] = _("▶");
+const u8 gUnknown_085E8B3C[] = _(" ");
+const u8 gText_WelcomeToHOF[] = _("Welcome to the HALL OF FAME!");
+const u8 gUnknown_085E8B5B[] = _("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 gUnknown_085E8BBA[] = _("SAVING…\nDON’T TURN OFF THE POWER.");
+const u8 gText_HOFCorrupted[] = _("The HALL OF FAME data is corrupted.");
+const u8 gText_HOFNumber[] = _("HALL OF FAME No. {STR_VAR_1}");
+const u8 gText_LeagueChamp[] = _("LEAGUE CHAMPION!\nCONGRATULATIONS!");
+const u8 gText_Number[] = _("No. ");
+const u8 gText_Level[] = _("Lv. ");
+const u8 gUnknown_085E8C40[] = _("IDNo. /");
+const u8 gText_Name[] = _("NAME");
+const u8 gText_IDNumber[] = _("IDNo.");
+const u8 gText_BirchInTrouble[] = _("PROF. BIRCH is in trouble!\nRelease a POKéMON and rescue him!");
+const u8 gText_ConfirmStarterChoice[] = _("Do you choose this POKéMON?");
+const u8 gUnknown_085E8CAC[] = _("POKéMON");
+const u8 gText_FlyToWhere[] = _("FLY to where?");
+const u8 gMenuText_Use[] = _("USE");
+const u8 gMenuText_Toss[] = _("TOSS");
+const u8 gMenuText_Register[] = _("REGISTER");
+const u8 gMenuText_Give[] = _("GIVE");
+const u8 gMenuText_CheckTag[] = _("CHECK TAG");
+const u8 gMenuText_Confirm[] = _("CONFIRM");
+const u8 gMenuText_Walk[] = _("WALK");
+const u8 gText_Cancel[] = _("CANCEL");
+const u8 gText_Cancel2[] = _("CANCEL");
+const u8 gMenuText_Show[] = _("SHOW");
+const u8 gText_EmptyString2[] = _("");
+const u8 gUnknown_085E8D04[] = _("CANCEL");
+const u8 gText_Item[] = _("ITEM");
+const u8 gText_Mail[] = _("MAIL");
+const u8 gText_Take[] = _("TAKE");
+const u8 gText_Store[] = _("STORE");
+const u8 gMenuText_Check[] = _("CHECK");
+const u8 gText_None[] = _("NONE");
+const u8 gMenuText_Deselect[] = _("DESELECT");
+const u8 gText_ThreeMarks[] = _("???");
+const u8 gText_FiveMarks[] = _("?????");
+const u8 gText_Slash[] = _("/");
+const u8 gText_OneDash[] = _("-");
+const u8 gText_TwoDashes[] = _("--");
+const u8 gText_ThreeDashes[] = _("---");
+const u8 gText_MaleSymbol[] = _("♂");
+const u8 gText_FemaleSymbol[] = _("♀");
+const u8 gText_LevelSymbol[] = _("{LV}");
+const u8 gText_UnkCtrlF908Clear01[] = _("{NO}{CLEAR 0x01}");
+const u8 gUnknown_085E8D55[] = _("+");
+const u8 gUnknown_085E8D57[] = _("{RIGHT_ARROW}");
+const u8 gText_UnkCtrlF907F908[] = _("{ID}{NO}");
+const u8 gText_Space[] = _(" ");
+const u8 gText_SelectorArrow2[] = _("▶");
+const u8 gText_GoBackPrevMenu[] = _("Go back to the\nprevious menu.");
+const u8 gText_WhatWouldYouLike[] = _("What would you like to do?");
+const u8 gMenuText_Give2[] = _("GIVE");
+const u8 gText_xVar1[] = _("×{STR_VAR_1}");
+const u8 gUnknown_085E8DA4[] = _(" BERRY");
+const u8 gText_Coins[] = _("{STR_VAR_1} COINS");
+const u8 gText_CloseBag[] = _("CLOSE BAG");
+const u8 gText_Var1IsSelected[] = _("{STR_VAR_1} is\nselected.");
+const u8 gText_CantWriteMail[] = _("You can’t write\nMAIL here.");
+const u8 gText_NoPokemon[] = _("There is no\nPOKéMON.");
+const u8 gText_MoveVar1Where[] = _("Move the\n{STR_VAR_1}\nwhere?");
+const u8 gText_Var1CantBeHeld[] = _("The {STR_VAR_1} can’t be held.");
+const u8 gText_Var1CantBeHeldHere[] = _("The {STR_VAR_1} can’t be held\nhere.");
+const u8 gText_DepositHowManyVar1[] = _("Deposit how many\n{STR_VAR_1}(s)?");
+const u8 gText_DepositedVar2Var1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gText_NoRoomForItems[] = _("There’s no room to\nstore items.");
+const u8 gText_CantStoreImportantItems[] = _("Important items\ncan’t be stored in\nthe PC!");
+const u8 gText_TooImportantToToss[] = _("That’s much too\nimportant to toss\nout!");
+const u8 gText_TossHowManyVar1s[] = _("Toss out how many\n{STR_VAR_1}(s)?");
+const u8 gText_ThrewAwayVar2Var1s[] = _("Threw away {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gText_ConfirmTossItems[] = _("Is it okay to\nthrow away {STR_VAR_2}\n{STR_VAR_1}(s)?");
+const u8 gText_DadsAdvice[] = _("DAD’s advice…\n{PLAYER}, there’s a time and place for\leverything!{PAUSE_UNTIL_PRESS}");
+const u8 gText_CantDismountBike[] = _("You can’t dismount your BIKE here.{PAUSE_UNTIL_PRESS}");
+const u8 gText_ItemFinderNearby[] = _("Huh?\nThe ITEMFINDER’s responding!\pThere’s an item buried around here!{PAUSE_UNTIL_PRESS}");
+const u8 gText_ItemFinderOnTop[] = _("Oh!\nThe ITEMFINDER’s shaking wildly!{PAUSE_UNTIL_PRESS}");
+const u8 gText_ItemFinderNothing[] = _("… … … …Nope!\nThere’s no response.{PAUSE_UNTIL_PRESS}");
+const u8 gText_CoinCase[] = _("Your COINS:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}");
+const u8 gText_BootedUpTM[] = _("Booted up a TM.");
+const u8 gText_BootedUpHM[] = _("Booted up an HM.");
+const u8 gText_TMHMContainedVar1[] = _("It contained\n{STR_VAR_1}.\pTeach {STR_VAR_1}\nto a POKéMON?");
+const u8 gText_PlayerUsedVar2[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_RepelEffectsLingered[] = _("But the effects of a REPEL\nlingered from earlier.{PAUSE_UNTIL_PRESS}");
+const u8 gText_UsedVar2WildLured[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}");
+const u8 gText_UsedVar2WildRepelled[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}");
+const u8 gText_BoxFull[] = _("The BOX is full.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PowderQty[] = _("POWDER QTY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}");
+const u8 gText_TheField[] = _("the field");
+const u8 gText_TheBattle[] = _("the battle");
+const u8 gText_ThePokemonList[] = _("the POKéMON LIST");
+const u8 gText_TheShop[] = _("the shop");
+const u8 gText_ThePC[] = _("the PC");
+
+const u8 *const gReturnToXStringsTable[] =
+{
+ gText_TheField,
+ gText_TheBattle,
+ gText_ThePokemonList,
+ gText_TheShop,
+ gText_TheField,
+ gText_TheField,
+ gText_ThePC,
+ gText_TheField,
+ gText_TheField,
+ gText_TheField,
+ gText_TheBattle,
+ gText_ThePC
+};
+
+const u8 *const gReturnToXStringsTable2[] =
+{
+ gText_TheField,
+ gText_TheBattle,
+ gText_ThePokemonList,
+ gText_TheField
+};
+
+const u8 gText_ReturnToVar1[] = _("Return to\n{STR_VAR_1}.");
+const u8 gText_ItemsPocket[] = _("ITEMS");
+const u8 gText_PokeBallsPocket[] = _("POKé BALLS");
+const u8 gText_TMHMPocket[] = _("TMs & HMs");
+const u8 gText_BerriesPocket[] = _("BERRIES");
+const u8 gText_KeyItemsPocket[] = _("KEY ITEMS");
+
+const u8 *const gPocketNamesStringsTable[] =
+{
+ gText_ItemsPocket,
+ gText_PokeBallsPocket,
+ gText_TMHMPocket,
+ gText_BerriesPocket,
+ gText_KeyItemsPocket
+};
+
+const u8 gText_UnkF908Var1Clear7Var2[] = _("{NO}{STR_VAR_1}{CLEAR 0x07}{STR_VAR_2}");
+const u8 gText_ClearTo11Var1Clear5Var2[] = _("{CLEAR_TO 0x11}{STR_VAR_1}{CLEAR 0x05}{STR_VAR_2}");
+const u8 gText_SizeSlash[] = _("SIZE /");
+const u8 gText_FirmSlash[] = _("FIRM /");
+const u8 gText_Var1DotVar2[] = _("{STR_VAR_1}.{STR_VAR_2}”");
+
+// Berry firmness strings
+const u8 gBerryFirmnessString_VerySoft[] = _("Very soft");
+const u8 gBerryFirmnessString_Soft[] = _("Soft");
+const u8 gBerryFirmnessString_Hard[] = _("Hard");
+const u8 gBerryFirmnessString_VeryHard[] = _("Very hard");
+const u8 gBerryFirmnessString_SuperHard[] = _("Super hard");
+
+const u8 gText_UnkF908Var1Var2[] = _("{NO}{STR_VAR_1} {STR_VAR_2}");
+const u8 gText_BerryTag[] = _("BERRY TAG");
+const u8 gText_RedPokeblock[] = _("RED {POKEBLOCK}");
+const u8 gText_BluePokeblock[] = _("BLUE {POKEBLOCK}");
+const u8 gText_PinkPokeblock[] = _("PINK {POKEBLOCK}");
+const u8 gText_GreenPokeblock[] = _("GREEN {POKEBLOCK}");
+const u8 gText_YellowPokeblock[] = _("YELLOW {POKEBLOCK}");
+const u8 gText_PurplePokeblock[] = _("PURPLE {POKEBLOCK}");
+const u8 gText_IndigoPokeblock[] = _("INDIGO {POKEBLOCK}");
+const u8 gText_BrownPokeblock[] = _("BROWN {POKEBLOCK}");
+const u8 gText_LiteBluePokeblock[] = _("LITEBLUE {POKEBLOCK}");
+const u8 gText_OlivePokeblock[] = _("OLIVE {POKEBLOCK}");
+const u8 gText_GrayPokeblock[] = _("GRAY {POKEBLOCK}");
+const u8 gText_BlackPokeblock[] = _("BLACK {POKEBLOCK}");
+const u8 gText_WhitePokeblock[] = _("WHITE {POKEBLOCK}");
+const u8 gText_GoldPokeblock[] = _("GOLD {POKEBLOCK}");
+const u8 gText_Spicy[] = _("SPICY");
+const u8 gText_Dry[] = _("DRY");
+const u8 gText_Sweet[] = _("SWEET");
+const u8 gText_Bitter[] = _("BITTER");
+const u8 gText_Sour[] = _("SOUR");
+const u8 gUnknown_085E9339[] = _("TASTY");
+const u8 gUnknown_085E933F[] = _("FEEL");
+const u8 gText_StowCase[] = _("Stow CASE.");
+const u8 gText_LvVar1[] = _("{LV}{STR_VAR_1}");
+const u8 gText_ThrowAwayVar1[] = _("Throw away this\n{STR_VAR_1}?");
+const u8 gText_Var1ThrownAway[] = _("The {STR_VAR_1}\nwas thrown away.");
+const u8 gText_Var1AteTheVar2[] = _("{STR_VAR_1} ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_Var1HappilyAteVar2[] = _("{STR_VAR_1} happily ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_Var1DisdainfullyAteVar2[] = _("{STR_VAR_1} disdainfully ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_085E93C7[] = _("BUY");
+const u8 gUnknown_085E93CB[] = _("SELL");
+const u8 gUnknown_085E93D0[] = _("QUIT");
+const u8 gText_InBagVar1[] = _("IN BAG: {STR_VAR_1}");
+const u8 gText_QuitShopping[] = _("Quit shopping.");
+const u8 gText_Var1CertainlyHowMany[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?");
+const u8 gText_Var1CertainlyHowMany2[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?");
+const u8 gText_Var1AndYouWantedVar2[] = _("{STR_VAR_1}? And you wanted {STR_VAR_2}?\nThat will be ¥{STR_VAR_3}.");
+const u8 gText_Var1IsItThatllBeVar2[] = _("{STR_VAR_1}, is it?\nThat’ll be ¥{STR_VAR_2}. Do you want it?");
+const u8 gText_YouWantedVar1ThatllBeVar2[] = _("You wanted {STR_VAR_1}?\nThat’ll be ¥{STR_VAR_2}. Will that be okay?");
+const u8 gText_HereYouGoThankYou[] = _("Here you go!\nThank you very much.");
+const u8 gText_ThankYouIllSendItHome[] = _("Thank you!\nI’ll send it to your home PC.");
+const u8 gText_ThanksIllSendItHome[] = _("Thanks!\nI’ll send it to your PC at home.");
+const u8 gText_YouDontHaveMoney[] = _("You don’t have enough money.{PAUSE_UNTIL_PRESS}");
+const u8 gText_NoMoreRoomForThis[] = _("You have no more room for this\nitem.{PAUSE_UNTIL_PRESS}");
+const u8 gText_SpaceForVar1Full[] = _("The space for {STR_VAR_1} is full.{PAUSE_UNTIL_PRESS}");
+const u8 gText_AnythingElseICanHelp[] = _("Is there anything else I can help\nyou with?");
+const u8 gText_CanIHelpWithAnythingElse[] = _("Can I help you with anything else?");
+const u8 gText_ThrowInPremierBall[] = _("I’ll throw in a PREMIER BALL, too.{PAUSE_UNTIL_PRESS}");
+const u8 gText_CantBuyKeyItem[] = _("{STR_VAR_2}? Oh, no.\nI can’t buy that.{PAUSE_UNTIL_PRESS}");
+const u8 gText_HowManyToSell[] = _("{STR_VAR_2}?\nHow many would you like to sell?");
+const u8 gText_ICanPayVar1[] = _("I can pay ¥{STR_VAR_1}.\nWould that be okay?");
+const u8 gText_TurnedOverVar1ForVar2[] = _("Turned over the {STR_VAR_2}\nand received ¥{STR_VAR_1}.");
+const u8 gText_PokedollarVar1[] = _("¥{STR_VAR_1}");
+const u8 gText_Shift[] = _("SHIFT");
+const u8 gText_SendOut[] = _("SEND OUT");
+const u8 gText_Switch2[] = _("SWITCH");
+const u8 gText_Summary5[] = _("SUMMARY");
+const u8 gUnknown_085E96BE[] = _("MOVES");
+const u8 gText_Enter[] = _("ENTER");
+const u8 gText_NoEntry[] = _("NO ENTRY");
+const u8 gText_Take2[] = _("TAKE");
+const u8 gText_Read2[] = _("READ");
+const u8 gText_Trade4[] = _("TRADE");
+const u8 gText_HP3[] = _("HP");
+const u8 gText_SpAtk3[] = _("SP. ATK");
+const u8 gText_SpDef3[] = _("SP. DEF");
+const u8 gText_WontHaveEffect[] = _("It won’t have any effect.{PAUSE_UNTIL_PRESS}");
+const u8 gText_CantBeUsedOnPkmn[] = _("This can’t be used on\nthat POKéMON.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnCantSwitchOut[] = _("{STR_VAR_1} can’t be switched\nout!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAlreadyInBattle[] = _("{STR_VAR_1} is already\nin battle!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAlreadySelected[] = _("{STR_VAR_1} has already been\nselected.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnHasNoEnergy[] = _("{STR_VAR_1} has no energy\nleft to battle!{PAUSE_UNTIL_PRESS}");
+const u8 gText_CantSwitchWithAlly[] = _("You can’t switch {STR_VAR_1}’s\nPOKéMON with one of yours!{PAUSE_UNTIL_PRESS}");
+const u8 gText_EggCantBattle[] = _("An EGG can’t battle!{PAUSE_UNTIL_PRESS}");
+const u8 gText_CantUseUntilNewBadge[] = _("This can’t be used until a new\nBADGE is obtained.{PAUSE_UNTIL_PRESS}");
+const u8 gText_NoMoreThanVar1Pkmn[] = _("No more than {STR_VAR_1} POKéMON\nmay enter.{PAUSE_UNTIL_PRESS}");
+const u8 gText_SendMailToPC[] = _("Send the removed MAIL to\nyour PC?");
+const u8 gText_MailSentToPC[] = _("The MAIL was sent to your PC.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PCMailboxFull[] = _("Your PC’s MAILBOX is full.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailMessageWillBeLost[] = _("If the MAIL is removed, the\nmessage will be lost. Okay?");
+const u8 gText_RemoveMailBeforeItem[] = _("MAIL must be removed before\nholding an item.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnWasGivenItem[] = _("{STR_VAR_1} was given the\n{STR_VAR_2} to hold.{PAUSE_UNTIL_PRESS}");
+const u8 gText_SwitchPkmnItem[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}.\pWould you like to switch the\ntwo items?");
+const u8 gText_PkmnNotHolding[] = _("{STR_VAR_1} isn’t holding\nanything.{PAUSE_UNTIL_PRESS}");
+const u8 gText_RecievedItemFromPkmn[] = _("Received the {STR_VAR_2}\nfrom {STR_VAR_1}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailTakenFromPkmn[] = _("MAIL was taken from the\nPOKéMON.{PAUSE_UNTIL_PRESS}");
+const u8 gText_SwitchedPkmnItem[] = _("The {STR_VAR_2} was taken and\nreplaced with the {STR_VAR_1}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnHoldingItemCantHoldMail[] = _("This POKéMON is holding an\nitem. It cannot hold MAIL.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailTransferredFromMailbox[] = _("MAIL was transferred from\nthe MAILBOX.{PAUSE_UNTIL_PRESS}");
+const u8 gText_BagFullCouldNotRemoveItem[] = _("The BAG is full. The POKéMON’s\nitem could not be removed.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnLearnedMove3[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!");
+const u8 gText_PkmnCantLearnMove[] = _("{STR_VAR_1} and {STR_VAR_2}\nare not compatible.\p{STR_VAR_2} can’t be\nlearned.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnNeedsToReplaceMove[] = _("{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 gText_StopLearningMove2[] = _("Stop trying to teach\n{STR_VAR_2}?");
+const u8 gText_MoveNotLearned[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_WhichMoveToForget[] = _("Which move should be forgotten?{PAUSE_UNTIL_PRESS}");
+const u8 gText_12PoofForgotMove[] = _("1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p{STR_VAR_1} forgot how to\nuse {STR_VAR_2}.\pAnd…{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAlreadyKnows[] = _("{STR_VAR_1} already knows\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnHPRestoredByVar2[] = _("{STR_VAR_1}’s HP was restored\nby {STR_VAR_2} point(s).{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnCuredOfPoison[] = _("{STR_VAR_1} was cured of its\npoisoning.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnCuredOfParalysis[] = _("{STR_VAR_1} was cured of\nparalysis.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnWokeUp2[] = _("{STR_VAR_1} woke up.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnBurnHealed[] = _("{STR_VAR_1}’s burn was healed.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnThawedOut[] = _("{STR_VAR_1} was thawed out.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PPWasRestored[] = _("PP was restored.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_085E9CCA[] = _("{STR_VAR_1} regained health.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnBecameHealthy[] = _("{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MovesPPIncreased[] = _("{STR_VAR_1}’s PP increased.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnElevatedToLvVar2[] = _("{STR_VAR_1} was elevated to\nLv. {STR_VAR_2}.");
+const u8 gText_PkmnBaseVar2StatIncreased[] = _("{STR_VAR_1}’s base {STR_VAR_2}\nstat was raised.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnFriendlyBaseVar2Fell[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnAdoresBaseVar2Fell[] = _("{STR_VAR_1} adores you!\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnFriendlyBaseVar2CantFall[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} can’t fall!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnSnappedOutOfConfusion[] = _("{STR_VAR_1} snapped out of its\nconfusion.{PAUSE_UNTIL_PRESS}");
+const u8 gText_PkmnGotOverInfatuation[] = _("{STR_VAR_1} got over its\ninfatuation.{PAUSE_UNTIL_PRESS}");
+const u8 gText_ThrowAwayItem[] = _("Throw away this\n{STR_VAR_1}?");
+const u8 gText_ItemThrownAway[] = _("The {STR_VAR_1}\nwas thrown away.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_085E9E2E[] = _("Teach which POKéMON?");
+const u8 gUnknown_085E9E43[] = _("Choose a POKéMON.");
+const u8 gUnknown_085E9E55[] = _("Move to where?");
+const u8 gUnknown_085E9E64[] = _("Teach which POKéMON?");
+const u8 gUnknown_085E9E79[] = _("Use on which POKéMON?");
+const u8 gUnknown_085E9E8F[] = _("Give to which POKéMON?");
+const u8 gUnknown_085E9EA6[] = _("Do what with this {PKMN}?");
+const u8 gUnknown_085E9EBC[] = _("There’s nothing to CUT.");
+const u8 gUnknown_085E9ED4[] = _("You can’t SURF here.");
+const u8 gUnknown_085E9EE9[] = _("You’re already SURFING.");
+const u8 gUnknown_085E9F01[] = _("Can’t use that here.");
+const u8 gUnknown_085E9F16[] = _("Restore which move?");
+const u8 gUnknown_085E9F2A[] = _("Boost PP of which move?");
+const u8 gUnknown_085E9F42[] = _("Do what with an item?");
+const u8 gUnknown_085E9F58[] = _("No POKéMON for battle!");
+const u8 gUnknown_085E9F6F[] = _("Choose a POKéMON.");
+const u8 gUnknown_085E9F81[] = _("Not enough HP…");
+const u8 gUnknown_085E9F90[] = _("{STR_VAR_1} POKéMON are needed.");
+const u8 gUnknown_085E9FA7[] = _("POKéMON can’t be the same.");
+const u8 gUnknown_085E9FC2[] = _("No identical hold items.");
+const u8 gUnknown_085E9FDB[] = _("The current is much too fast!");
+const u8 gUnknown_085E9FF9[] = _("Do what with the MAIL?");
+const u8 gUnknown_085EA010[] = _("Choose POKéMON or CANCEL.");
+const u8 gUnknown_085EA02A[] = _("Choose POKéMON and confirm.");
+const u8 gUnknown_085EA046[] = _("Let’s enjoy cycling!");
+const u8 gUnknown_085EA05B[] = _("This is in use already.");
+const u8 gUnknown_085EA073[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}.");
+const u8 gUnknown_085EA091[] = _("No use.");
+const u8 gUnknown_085EA099[] = _("ABLE");
+const u8 gUnknown_085EA09E[] = _("FIRST");
+const u8 gUnknown_085EA0A4[] = _("SECOND");
+const u8 gUnknown_085EA0AB[] = _("THIRD");
+const u8 gUnknown_085EA0B1[] = _("ABLE");
+const u8 gUnknown_085EA0B6[] = _("NOT ABLE");
+const u8 gUnknown_085EA0BF[] = _("ABLE!");
+const u8 gUnknown_085EA0C5[] = _("NOT ABLE!");
+const u8 gUnknown_085EA0CF[] = _("LEARNED");
+const u8 gUnknown_085EA0D7[] = _("HAVE");
+const u8 gUnknown_085EA0DC[] = _("DON’T HAVE");
+const u8 gUnknown_085EA0E7[] = _("FOURTH");
+const u8 gText_PkmnCantParticipate[] = _("That POKéMON can’t participate.{PAUSE_UNTIL_PRESS}");
+const u8 gText_CancelParticipation[] = _("Cancel participation?");
+const u8 gText_CancelBattle[] = _("Cancel the battle?");
+const u8 gText_ReturnToWaitingRoom[] = _("Return to the WAITING ROOM?");
+const u8 gText_CancelChallenge[] = _("Cancel the challenge?");
+const u8 gText_EscapeFromHere[] = _("Want to escape from here and return\nto {STR_VAR_1}?");
+const u8 gText_ReturnToHealingSpot[] = _("Want to return to the healing spot\nused last in {STR_VAR_1}?");
+const u8 gText_PauseUntilPress[] = _("{PAUSE_UNTIL_PRESS}");
+const u8 gJPText_PutVar1IntoSpinner[] = _("{STR_VAR_1}を ぐるぐるこうかんに\nだして よろしいですか?");
+
+asm(".align 2");
+const u8 gText_OnlyPkmnForBattle[] = _("That’s your only\nPOKéMON for battle.");
+
+asm(".align 2");
+const u8 gText_PkmnCantBeTradedNow[] = _("That POKéMON can’t be traded\nnow.");
+
+asm(".align 2");
+const u8 gText_EggCantBeTradedNow[] = _("An EGG can’t be traded now.");
+
+asm(".align 2");
+const u8 gText_OtherTrainersPkmnCantBeTraded[] = _("The other TRAINER’s POKéMON\ncan’t be traded now.");
+
+asm(".align 2");
+const u8 gText_OtherTrainerCantAcceptPkmn[] = _("The other TRAINER can’t accept\nthat POKéMON now.");
+
+asm(".align 2");
+const u8 gText_CantTradeWithTrainer[] = _("You can’t trade with that\nTRAINER now.");
+
+asm(".align 2");
+const u8 gText_NotPkmnOtherTrainerWants[] = _("That isn’t the type of POKéMON\nthat the other TRAINER wants.");
+
+asm(".align 2");
+const u8 gText_ThatIsntAnEgg[] = _("That isn’t an EGG.");
+const u8 gText_Register[] = _("REGISTER");
+const u8 gText_Attack3[] = _("ATTACK");
+const u8 gText_Defense3[] = _("DEFENSE");
+const u8 gText_SpAtk4[] = _("SP. ATK");
+const u8 gText_SpDef4[] = _("SP. DEF");
+const u8 gText_Speed2[] = _("SPEED");
+const u8 gText_HP4[] = _("HP");
+const u8 gUnknown_085EA364[] = _("");
+const u8 gText_OTSlash[] = _("OT/");
+const u8 gText_RentalPkmn[] = _("RENTAL POKéMON");
+const u8 gText_TypeSlash[] = _("TYPE/");
+const u8 gText_Power[] = _("POWER");
+const u8 gText_Accuracy2[] = _("ACCURACY");
+const u8 gText_Appeal[] = _("APPEAL");
+const u8 gText_Jam[] = _("JAM");
+const u8 gText_Status[] = _("STATUS");
+const u8 gText_ExpPoints[] = _("EXP. POINTS");
+const u8 gText_NextLv[] = _("NEXT LV.");
+const u8 gText_RibbonsVar1[] = _("RIBBONS: {STR_VAR_1}");
+const u8 gText_EmptyString5[] = _("");
+const u8 gUnknown_085EA3C1[] = _("EVENTS");
+const u8 gText_Switch[] = _("SWITCH");
+const u8 gText_PkmnInfo[] = _("POKéMON INFO");
+const u8 gText_PkmnSkills[] = _("POKéMON SKILLS");
+const u8 gText_BattleMoves[] = _("BATTLE MOVES");
+const u8 gText_ContestMoves[] = _("C0NTEST MOVES");
+const u8 gText_Info[] = _("INFO");
+const u8 gText_EggWillTakeALongTime[] = _("It looks like this EGG will\ntake a long time to hatch.");
+const u8 gText_EggWillTakeSomeTime[] = _("What will hatch from this?\nIt will take some time.");
+const u8 gText_EggWillHatchSoon[] = _("It moves occasionally.\nIt should hatch soon.");
+const u8 gText_EggAboutToHatch[] = _("It’s making sounds.\nIt’s about to hatch!");
+const u8 gText_HMMovesCantBeForgotten2[] = _("HM moves can’t be\nforgotten now.");
+const u8 gText_XNatureMetAtYZ[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nmet at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01},\n{SPECIAL_F7 0x00}{SPECIAL_F7 0x04}{SPECIAL_F7 0x01}.");
+const u8 gText_XNatureHatchedAtYZ[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nhatched at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01},\n{SPECIAL_F7 0x00}{SPECIAL_F7 0x04}{SPECIAL_F7 0x01}.");
+const u8 gText_XNatureObtainedInTrade[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nobtained in a trade.");
+const u8 gText_XNatureFatefulEncounter[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nobtained in a fateful\nencounter at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01}.");
+const u8 gText_XNatureProbablyMetAt[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nprobably met at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01},\n{SPECIAL_F7 0x00}{SPECIAL_F7 0x04}{SPECIAL_F7 0x01}.");
+const u8 gText_XNature[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature");
+const u8 gText_XNatureMetSomewhereAt[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nmet somewhere at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01}.");
+const u8 gText_XNatureHatchedSomewhereAt[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nhatched somewhere at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01}.");
+const u8 gText_OddEggFoundByCouple[] = _("An odd POKéMON EGG found\nby the DAY CARE couple.");
+const u8 gText_PeculiarEggNicePlace[] = _("A peculiar POKéMON EGG\nobtained at the nice place.");
+const u8 gText_PeculiarEggTrade[] = _("A peculiar POKéMON EGG\nobtained in a trade.");
+const u8 gText_EggFromHotSprings[] = _("A POKéMON EGG obtained\nat the hot springs.");
+const u8 gText_EggFromTraveler[] = _("An odd POKéMON EGG\nobtained from a traveler.");
+const u8 gText_ApostropheSBase[] = _("’s BASE");
+const u8 gText_OkayToDeleteFromRegistry[] = _("Is it okay to delete {STR_VAR_1}\nfrom the REGISTRY?");
+const u8 gText_RegisteredDataDeleted[] = _("The registered data was deleted.{PAUSE_UNTIL_PRESS}");
+const u8 gText_NoRegistry[] = _("There is no REGISTRY.{PAUSE_UNTIL_PRESS}");
+const u8 gUnknown_085EA79D[] = _("DEL REGIST.");
+const u8 gUnknown_085EA7A9[] = _("{STR_VAR_3}{STR_VAR_1}/{STR_VAR_2}");
+const u8 gText_Decorate[] = _("DECORATE");
+const u8 gText_PutAway[] = _("PUT AWAY");
+const u8 gText_Toss2[] = _("TOSS");
+const u8 gText_Color161Shadow161[] = _("{COLOR 161}{SHADOW 161}");
+const u8 gText_PutOutSelectedDecorItem[] = _("Put out the selected decoration item.");
+const u8 gText_StoreChosenDecorInPC[] = _("Store the chosen decoration in the PC.");
+const u8 gText_ThrowAwayUnwantedDecors[] = _("Throw away unwanted decorations.");
+const u8 gText_NoDecorations[] = _("There are no decorations.{PAUSE_UNTIL_PRESS}");
+const u8 gText_Desk[] = _("DESK");
+const u8 gText_Chair[] = _("CHAIR");
+const u8 gText_Plant[] = _("PLANT");
+const u8 gText_Ornament[] = _("ORNAMENT");
+const u8 gText_Mat[] = _("MAT");
+const u8 gText_Poster[] = _("POSTER");
+const u8 gText_Doll[] = _("DOLL");
+const u8 gText_Cushion[] = _("CUSHION");
+const u8 gText_Gold[] = _("GOLD");
+const u8 gText_Silver[] = _("SILVER");
+const u8 gText_PlaceItHere[] = _("Place it here?");
+const u8 gText_CantBePlacedHere[] = _("It can’t be placed here.");
+const u8 gText_CancelDecorating[] = _("Cancel decorating?");
+const u8 gText_InUseAlready[] = _("This is in use already.");
+const u8 gText_NoMoreDecorations[] = _("No more decorations can be placed.\nThe most that can be placed are {STR_VAR_1}.");
+const u8 gText_NoMoreDecorations2[] = _("No more decorations can be placed.\nThe most that can be placed are {STR_VAR_1}.");
+const u8 gUnknown_085EA978[] = _("This can’t be placed here.\nIt must be on a DESK, etc.");
+const u8 gText_CantPlaceInRoom[] = _("This decoration can’t be placed in\nyour own room.");
+const u8 gText_CantThrowAwayInUse[] = _("This decoration is in use.\nIt can’t be thrown away.");
+const u8 gText_DecorationWillBeDiscarded[] = _("This {STR_VAR_1} will be discarded.\nIs that okay?");
+const u8 gText_DecorationThrownAway[] = _("The decoration item was thrown away.");
+const u8 gText_StopPuttingAwayDecorations[] = _("Stop putting away decorations?");
+const u8 gText_NoDecorationHere[] = _("There is no decoration item here.");
+const u8 gText_ReturnDecorationToPC[] = _("Return this decoration to the PC?");
+const u8 gText_DecorationReturnedToPC[] = _("The decoration was returned to the PC.");
+const u8 gText_NoDecorationsInUse[] = _("There are no decorations in use.{PAUSE_UNTIL_PRESS}");
+const u8 gText_Tristan[] = _("TRISTAN");
+const u8 gText_Philip[] = _("PHILIP");
+const u8 gText_Dennis[] = _("DENNIS");
+const u8 gText_Roberto[] = _("ROBERTO");
+const u8 gText_TurnOff[] = _("TURN OFF");
+const u8 gText_Decoration[] = _("DECORATION");
+const u8 gText_ItemStorage[] = _("ITEM STORAGE");
+const u8 gText_Mailbox[] = _("MAILBOX");
+const u8 gText_DepositItem[] = _("DEPOSIT ITEM");
+const u8 gText_WithdrawItem[] = _("WITHDRAW ITEM");
+const u8 gText_TossItem[] = _("TOSS ITEM");
+const u8 gText_StoreItemsInPC[] = _("Store items in the PC.");
+const u8 gText_TakeOutItemsFromPC[] = _("Take out items from the PC.");
+const u8 gText_ThrowAwayItemsInPC[] = _("Throw away items stored in the PC.");
+const u8 gText_NoItems[] = _("There are no items.{PAUSE_UNTIL_PRESS}");
+const u8 gText_NoRoomInBag[] = _("There is no more\nroom in the BAG.");
+const u8 gText_WithdrawHowManyItems[] = _("Withdraw how many\n{STR_VAR_1}(s)?");
+const u8 gText_WithdrawXItems[] = _("Withdrew {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gText_Read[] = _("READ");
+const u8 gText_MoveToBag[] = _("MOVE TO BAG");
+const u8 gText_Give2[] = _("GIVE");
+const u8 gText_NoMailHere[] = _("There’s no MAIL here.{PAUSE_UNTIL_PRESS}");
+const u8 gText_WhatToDoWithVar1sMail[] = _("What would you like to do with\n{STR_VAR_1}’s MAIL?");
+const u8 gText_MessageWillBeLost[] = _("The message will be lost.\nIs that okay?");
+const u8 gText_BagIsFull[] = _("The BAG is full.{PAUSE_UNTIL_PRESS}");
+const u8 gText_MailToBagMessageErased[] = _("The MAIL was returned to the BAG\nwith its message erased.{PAUSE_UNTIL_PRESS}");
+const u8 gText_Dad[] = _("DAD");
+const u8 gText_Mom[] = _("MOM");
+const u8 gText_Wallace[] = _("WALLACE");
+const u8 gText_Steven[] = _("STEVEN");
+const u8 gText_Brawly[] = _("BRAWLY");
+const u8 gText_Winona[] = _("WINONA");
+const u8 gText_Phoebe[] = _("PHOEBE");
+const u8 gText_Glacia[] = _("GLACIA");
+const u8 gUnknown_085EAD37[] = _("PETALBURG");
+const u8 gUnknown_085EAD41[] = _("SLATEPORT");
+const u8 gUnknown_085EAD4B[] = _("LITTLEROOT");
+const u8 gUnknown_085EAD56[] = _("LILYCOVE");
+const u8 gUnknown_085EAD5F[] = _("DEWFORD");
+const u8 gUnknown_085EAD67[] = _("ENTER");
+const u8 gUnknown_085EAD6D[] = _("INFO");
+const u8 gUnknown_085EAD72[] = _("What’s a CONTEST?");
+const u8 gUnknown_085EAD84[] = _("Types of CONTESTS");
+const u8 gUnknown_085EAD96[] = _("Ranks");
+const u8 gUnknown_085EAD9C[] = _("Judging");
+const u8 gUnknown_085EADA4[] = _("COOLNESS CONTEST");
+const u8 gUnknown_085EADB5[] = _("BEAUTY CONTEST");
+const u8 gUnknown_085EADC4[] = _("CUTENESS CONTEST");
+const u8 gUnknown_085EADD5[] = _("SMARTNESS CONTEST");
+const u8 gUnknown_085EADE7[] = _("TOUGHNESS CONTEST");
+const u8 gUnknown_085EADF9[] = _("DECORATION");
+const u8 gUnknown_085EAE04[] = _("PACK UP");
+const u8 gUnknown_085EAE0C[] = _("COUNT");
+const u8 gUnknown_085EAE12[] = _("REGISTRY");
+const u8 gUnknown_085EAE1B[] = _("INFORMATION");
+const u8 gUnknown_085EAE27[] = _("MACH");
+const u8 gUnknown_085EAE2C[] = _("ACRO");
+const u8 gUnknown_085EAE31[] = _("PSN");
+const u8 gUnknown_085EAE35[] = _("PAR");
+const u8 gUnknown_085EAE39[] = _("SLP");
+const u8 gUnknown_085EAE3D[] = _("BRN");
+const u8 gUnknown_085EAE41[] = _("FRZ");
+const u8 gUnknown_085EAE45[] = _("TOXIC");
+const u8 gUnknown_085EAE4B[] = _("OK");
+const u8 gUnknown_085EAE4E[] = _("QUIT");
+const u8 gUnknown_085EAE53[] = _("Saw it");
+const u8 gUnknown_085EAE5A[] = _("Not yet");
+const u8 gText_Yes[] = _("YES");
+const u8 gText_No[] = _("NO");
+const u8 gUnknown_085EAE69[] = _("INFO");
+const u8 gUnknown_085EAE6E[] = _("SINGLE BATTLE");
+const u8 gUnknown_085EAE7C[] = _("DOUBLE BATTLE");
+const u8 gUnknown_085EAE8A[] = _("MULTI BATTLE");
+const u8 gUnknown_085EAE97[] = _("MR. BRINEY");
+const u8 gUnknown_085EAEA2[] = _("CHALLENGE");
+const u8 gUnknown_085EAEAC[] = _("INFO");
+const u8 gText_Lv50[] = _("LV. 50");
+const u8 gText_OpenLevel[] = _("OPEN LEVEL");
+const u8 gUnknown_085EAEC3[] = _("FRESH WATER{CLEAR_TO 0x48}¥200");
+const u8 gUnknown_085EAED6[] = _("SODA POP{CLEAR_TO 0x48}¥300");
+const u8 gUnknown_085EAEE6[] = _("LEMONADE{CLEAR_TO 0x48}¥350");
+const u8 gUnknown_085EAEF6[] = _("HOW TO RIDE");
+const u8 gUnknown_085EAF02[] = _("HOW TO TURN");
+const u8 gUnknown_085EAF0E[] = _("SANDY SLOPES");
+const u8 gUnknown_085EAF1B[] = _("WHEELIES");
+const u8 gUnknown_085EAF24[] = _("BUNNY-HOPS");
+const u8 gUnknown_085EAF2F[] = _("JUMP");
+const u8 gUnknown_085EAF34[] = _("Satisfied");
+const u8 gUnknown_085EAF3E[] = _("Dissatisfied");
+const u8 gUnknown_085EAF4B[] = _("DEEPSEATOOTH");
+const u8 gUnknown_085EAF58[] = _("DEEPSEASCALE");
+const u8 gUnknown_085EAF65[] = _("BLUE FLUTE");
+const u8 gUnknown_085EAF70[] = _("YELLOW FLUTE");
+const u8 gUnknown_085EAF7D[] = _("RED FLUTE");
+const u8 gUnknown_085EAF87[] = _("WHITE FLUTE");
+const u8 gUnknown_085EAF93[] = _("BLACK FLUTE");
+const u8 gUnknown_085EAF9F[] = _("GLASS CHAIR");
+const u8 gUnknown_085EAFAB[] = _("GLASS DESK");
+const u8 gUnknown_085EAFB6[] = _("TREECKO DOLL 1,000 COINS");
+const u8 gUnknown_085EAFCF[] = _("TORCHIC DOLL 1,000 COINS");
+const u8 gUnknown_085EAFE8[] = _("MUDKIP DOLL 1,000 COINS");
+const u8 gUnknown_085EB002[] = _(" 50 COINS ¥1,000");
+const u8 gUnknown_085EB017[] = _("500 COINS ¥10,000");
+const u8 gUnknown_085EB02A[] = _("Excellent");
+const u8 gUnknown_085EB034[] = _("Not so good");
+const u8 gUnknown_085EB040[] = _("RED SHARD");
+const u8 gUnknown_085EB04A[] = _("YELLOW SHARD");
+const u8 gUnknown_085EB057[] = _("BLUE SHARD");
+const u8 gUnknown_085EB062[] = _("GREEN SHARD");
+const u8 gText_BattleFrontier[] = _("BATTLE FRONTIER");
+const u8 gUnknown_085EB07E[] = _("Right");
+const u8 gUnknown_085EB084[] = _("Left");
+const u8 gUnknown_085EB089[] = _("TM32{CLEAR_TO 0x48}1,500 COINS");
+const u8 gUnknown_085EB09C[] = _("TM29{CLEAR_TO 0x48}3,500 COINS");
+const u8 gUnknown_085EB0AF[] = _("TM35{CLEAR_TO 0x48}4,000 COINS");
+const u8 gUnknown_085EB0C2[] = _("TM24{CLEAR_TO 0x48}4,000 COINS");
+const u8 gUnknown_085EB0D5[] = _("TM13{CLEAR_TO 0x48}4,000 COINS");
+const u8 gText_Cool[] = _("COOL");
+const u8 gText_Beauty[] = _("BEAUTY");
+const u8 gText_Cute[] = _("CUTE");
+const u8 gText_Smart[] = _("SMART");
+const u8 gText_Tough[] = _("TOUGH");
+const u8 gText_Normal[] = _("NORMAL");
+const u8 gText_Super[] = _("SUPER");
+const u8 gText_Hyper[] = _("HYPER");
+const u8 gText_Master[] = _("MASTER");
+const u8 gText_Cool2[] = _("COOL");
+const u8 gText_Beauty2[] = _("BEAUTY");
+const u8 gText_Cute2[] = _("CUTE");
+const u8 gText_Smart2[] = _("SMART");
+const u8 gText_Tough2[] = _("TOUGH");
+const u8 gText_Items[] = _("ITEMS");
+const u8 gText_Key_Items[] = _("KEY ITEMS");
+const u8 gText_Poke_Balls[] = _("POKé BALLS");
+const u8 gText_TMs_Hms[] = _("TMs & HMs");
+const u8 gText_Berries2[] = _("BERRIES");
+const u8 gText_SomeonesPC[] = _("SOMEONE’S PC");
+const u8 gText_LanettesPC[] = _("LANETTE’S PC");
+const u8 gText_PlayersPC[] = _("{PLAYER}’s PC");
+const u8 gText_HallOfFame[] = _("HALL OF FAME");
+const u8 gText_LogOff[] = _("LOG OFF");
+const u8 gText_Opponent[] = _("OPPONENT");
+const u8 gText_Tourney_Tree[] = _("TOURNEY TREE");
+const u8 gText_ReadyToStart[] = _("READY TO START");
+const u8 gText_NormalRank[] = _("NORMAL RANK");
+const u8 gText_SuperRank[] = _("SUPER RANK");
+const u8 gText_HyperRank[] = _("HYPER RANK");
+const u8 gText_MasterRank[] = _("MASTER RANK");
+const u8 gText_Single2[] = _("SINGLE");
+const u8 gText_Double2[] = _("DOUBLE");
+const u8 gText_Multi[] = _("MULTI");
+const u8 gText_MultiLink[] = _("MULTI-LINK");
+const u8 gText_BattleBag[] = _("BATTLE BAG");
+const u8 gText_HeldItem[] = _("HELD ITEM");
+const u8 gText_LinkContest[] = _("LINK CONTEST");
+const u8 gText_AboutE_Mode[] = _("ABOUT E-MODE");
+const u8 gText_AboutG_Mode[] = _("ABOUT G-MODE");
+const u8 gText_E_Mode[] = _("E-MODE");
+const u8 gText_G_Mode[] = _("G-MODE");
+const u8 gText_MenuOptionPokedex[] = _("POKéDEX");
+const u8 gText_MenuOptionPokemon[] = _("POKéMON");
+const u8 gText_MenuOptionBag[] = _("BAG");
+const u8 gText_MenuOptionPokenav[] = _("POKéNAV");
+const u8 gUnknown_085EB278[] = _("");
+const u8 gText_MenuOptionSave[] = _("SAVE");
+const u8 gText_MenuOptionOption[] = _("OPTION");
+const u8 gText_MenuOptionExit[] = _("EXIT");
+const u8 gUnknown_085EB28A[] = __(" ");
+const u8 gUnknown_085EB28C[] = _("5BP");
+const u8 gUnknown_085EB290[] = _("10BP");
+const u8 gUnknown_085EB295[] = _("15BP");
+const u8 gUnknown_085EB29A[] = _("RED TENT");
+const u8 gUnknown_085EB2A3[] = _("BLUE TENT");
+const u8 gText_SouthernIsland[] = _("SOUTHERN ISLAND");
+const u8 gText_BirthIsland[] = _("BIRTH ISLAND");
+const u8 gText_FarawayIsland[] = _("FARAWAY ISLAND");
+const u8 gText_NavelRock[] = _("NAVEL ROCK");
+const u8 gUnknown_085EB2E4[] = _("CLAW FOSSIL");
+const u8 gUnknown_085EB2F0[] = _("ROOT FOSSIL");
+const u8 gUnknown_085EB2FC[] = _("NO");
+const u8 gUnknown_085EB2FF[] = _("I’ll battle now!");
+const u8 gUnknown_085EB310[] = _("I won!");
+const u8 gUnknown_085EB317[] = _("I lost!");
+const u8 gUnknown_085EB31F[] = _("I won’t tell.");
+const u8 gUnknown_085EB32D[] = _("NORMAL TAG MATCH");
+const u8 gUnknown_085EB33E[] = _("VARIETY TAG MATCH");
+const u8 gUnknown_085EB350[] = _("UNIQUE TAG MATCH");
+const u8 gUnknown_085EB361[] = _("EXPERT TAG MATCH");
+const u8 gUnknown_085EB372[] = _("TRADE CENTER");
+const u8 gUnknown_085EB37F[] = _("COLOSSEUM");
+const u8 gUnknown_085EB389[] = _("RECORD CORNER");
+const u8 gUnknown_085EB397[] = _("BERRY CRUSH");
+const u8 gUnknown_085EB3A3[] = _("");
+const u8 gUnknown_085EB3A4[] = _("POKéMON JUMP");
+const u8 gUnknown_085EB3B1[] = _("DODRIO BERRY-PICKING");
+const u8 gUnknown_085EB3C6[] = _("BECOME LEADER");
+const u8 gUnknown_085EB3D4[] = _("JOIN GROUP");
+const u8 gUnknown_085EB3DF[] = _("TWO STYLES");
+const u8 gUnknown_085EB3EA[] = _("LV. 50");
+const u8 gUnknown_085EB3F1[] = _("OPEN LEVEL");
+const u8 gUnknown_085EB3FC[] = _("{PKMN} TYPE & NO.");
+const u8 gUnknown_085EB40A[] = _("HOLD ITEMS");
+const u8 gUnknown_085EB415[] = _("SYMBOLS");
+const u8 gUnknown_085EB41D[] = _("RECORD");
+const u8 gUnknown_085EB424[] = _("BATTLE PTS");
+const u8 gUnknown_085EB42F[] = _("TOWER INFO");
+const u8 gUnknown_085EB43A[] = _("BATTLE {PKMN}");
+const u8 gUnknown_085EB444[] = _("BATTLE SALON");
+const u8 gUnknown_085EB451[] = _("MULTI-LINK");
+const u8 gUnknown_085EB45C[] = _("BATTLE RULES");
+const u8 gUnknown_085EB469[] = _("JUDGE: MIND");
+const u8 gUnknown_085EB475[] = _("JUDGE: SKILL");
+const u8 gUnknown_085EB482[] = _("JUDGE: BODY");
+const u8 gUnknown_085EB48E[] = _("MATCHUP");
+const u8 gUnknown_085EB496[] = _("TOURNEY TREE");
+const u8 gUnknown_085EB4A3[] = _("DOUBLE KO");
+const u8 gUnknown_085EB4AD[] = _("BASIC RULES");
+const u8 gUnknown_085EB4B9[] = _("SWAP: PARTNER");
+const u8 gUnknown_085EB4C7[] = _("SWAP: NUMBER");
+const u8 gUnknown_085EB4D4[] = _("SWAP: NOTES");
+const u8 gUnknown_085EB4E0[] = _("OPEN LEVEL");
+const u8 gText_BattleBasics[] = _("BATTLE BASICS");
+const u8 gText_PokemonNature[] = _("POKéMON NATURE");
+const u8 gText_PokemonMoves[] = _("POKéMON MOVES");
+const u8 gText_Underpowered[] = _("UNDERPOWERED");
+const u8 gText_WhenInDanger[] = _("WHEN IN DANGER");
+const u8 gUnknown_085EB532[] = _("PYRAMID: POKéMON");
+const u8 gUnknown_085EB543[] = _("PYRAMID: TRAINERS");
+const u8 gUnknown_085EB555[] = _("PYRAMID: MAZE");
+const u8 gUnknown_085EB563[] = _("BATTLE BAG");
+const u8 gUnknown_085EB56E[] = _("POKéNAV AND BAG");
+const u8 gUnknown_085EB57E[] = _("HELD ITEMS");
+const u8 gUnknown_085EB589[] = _("POKéMON ORDER");
+const u8 gUnknown_085EB597[] = _("BATTLE POKéMON");
+const u8 gText_BattleTrainers[] = _("BATTLE TRAINERS");
+const u8 gUnknown_085EB5B6[] = _("GO ON");
+const u8 gUnknown_085EB5BC[] = _("RECORD");
+const u8 gUnknown_085EB5C3[] = _("REST");
+const u8 gUnknown_085EB5C8[] = _("RETIRE");
+const u8 gText_99TimesPlus[] = _("99 times +");
+const u8 gText_1MinutePlus[] = _("1 minute +");
+const u8 gText_SpaceSeconds[] = _(" seconds");
+const u8 gText_SpaceTimes[] = _(" time(s)");
+const u8 gUnknown_085EB5F7[] = _(".");
+const u8 gText_BigGuy[] = _("Big guy");
+const u8 gText_BigGirl[] = _("Big girl");
+const u8 gText_Son[] = _("son");
+const u8 gText_Daughter[] = _("daughter");
+const u8 gText_BlueFlute[] = _("BLUE FLUTE");
+const u8 gText_YellowFlute[] = _("YELLOW FLUTE");
+const u8 gText_RedFlute[] = _("RED FLUTE");
+const u8 gText_WhiteFlute[] = _("WHITE FLUTE");
+const u8 gText_BlackFlute[] = _("BLACK FLUTE");
+const u8 gText_PrettyChair[] = _("PRETTY CHAIR");
+const u8 gText_PrettyDesk[] = _("PRETTY DESK");
+const u8 gText_1F[] = _("1F");
+const u8 gText_2F[] = _("2F");
+const u8 gText_3F[] = _("3F");
+const u8 gText_4F[] = _("4F");
+const u8 gText_5F[] = _("5F");
+const u8 gText_6F[] = _("6F");
+const u8 gText_7F[] = _("7F");
+const u8 gText_8F[] = _("8F");
+const u8 gText_9F[] = _("9F");
+const u8 gText_10F[] = _("10F");
+const u8 gText_11F[] = _("11F");
+const u8 gText_B1F[] = _("B1F");
+const u8 gText_B2F[] = _("B2F");
+const u8 gText_B3F[] = _("B3F");
+const u8 gText_B4F[] = _("B4F");
+const u8 gText_Rooftop[] = _("ROOFTOP");
+const u8 gText_ElevatorNowOn[] = _("Now on:");
+const u8 gText_BP[] = _("BP");
+const u8 gText_EnergyPowder50[] = _("ENERGYPOWDER{CLEAR_TO 0x72}{SIZE 0}50");
+const u8 gText_EnergyRoot80[] = _("ENERGY ROOT{CLEAR_TO 0x72}{SIZE 0}80");
+const u8 gText_HealPowder50[] = _("HEAL POWDER{CLEAR_TO 0x72}{SIZE 0}50");
+const u8 gText_RevivalHerb300[] = _("REVIVAL HERB{CLEAR_TO 0x6C}{SIZE 0}300");
+const u8 gText_Protein1000[] = _("PROTEIN{CLEAR_TO 0x63}{SIZE 0}1,000");
+const u8 gText_Iron1000[] = _("IRON{CLEAR_TO 0x63}{SIZE 0}1,000");
+const u8 gText_Carbos1000[] = _("CARBOS{CLEAR_TO 0x63}{SIZE 0}1,000");
+const u8 gText_Calcium1000[] = _("CALCIUM{CLEAR_TO 0x63}{SIZE 0}1,000");
+const u8 gText_Zinc1000[] = _("ZINC{CLEAR_TO 0x63}{SIZE 0}1,000");
+const u8 gText_HPUp1000[] = _("HP UP{CLEAR_TO 0x63}{SIZE 0}1,000");
+const u8 gText_PPUp3000[] = _("PP UP{CLEAR_TO 0x63}{SIZE 0}3,000");
+const u8 gText_RankingHall[] = _("RANKING HALL");
+const u8 gText_ExchangeService[] = _("EXCHANGE SERVICE");
+const u8 gText_LilycoveCity[] = _("LILYCOVE CITY");
+const u8 gText_SlateportCity[] = _("SLATEPORT CITY");
+const u8 gText_CaveOfOrigin[] = _("CAVE OF ORIGIN");
+const u8 gText_MtPyre[] = _("MT. PYRE");
+const u8 gText_SkyPillar[] = _("SKY PILLAR");
+const u8 gText_DontRemember[] = _("Don’t remember");
+const u8 gText_Exit[] = _("EXIT");
+const u8 gText_ExitFromBox[] = _("Exit from the BOX?");
+const u8 gText_WhatDoYouWantToDo[] = _("What do you want to do?");
+const u8 gText_PleasePickATheme[] = _("Please pick a theme.");
+const u8 gText_PickTheWallpaper[] = _("Pick the wallpaper.");
+const u8 gText_PkmnIsSelected[] = _("{SPECIAL_F7 0x00} is selected.");
+const u8 gText_JumpToWhichBox[] = _("Jump to which BOX?");
+const u8 gText_DepositInWhichBox[] = _("Deposit in which BOX?");
+const u8 gText_PkmnWasDeposited[] = _("{SPECIAL_F7 0x00} was deposited.");
+const u8 gText_BoxIsFull2[] = _("The BOX is full.");
+const u8 gText_ReleaseThisPokemon[] = _("Release this POKéMON?");
+const u8 gText_PkmnWasReleased[] = _("{SPECIAL_F7 0x00} was released.");
+const u8 gText_ByeByePkmn[] = _("Bye-bye, {SPECIAL_F7 0x00}!");
+const u8 gText_MarkYourPkmn[] = _("Mark your POKéMON.");
+const u8 gText_ThatsYourLastPkmn[] = _("That’s your last POKéMON!");
+const u8 gText_YourPartysFull[] = _("Your party’s full!");
+const u8 gText_YoureHoldingAPkmn[] = _("You’re holding a POKéMON!");
+const u8 gText_WhichOneWillYouTake[] = _("Which one will you take?");
+const u8 gText_YouCantReleaseAnEgg[] = _("You can’t release an EGG.");
+const u8 gText_ContinueBoxOperations[] = _("Continue BOX operations?");
+const u8 gText_PkmnCameBack[] = _("{SPECIAL_F7 0x00} came back!");
+const u8 gText_WasItWorriedAboutYou[] = _("Was it worried about you?");
+const u8 gText_FourEllipsesExclamation[] = _("… … … … !");
+const u8 gText_PleaseRemoveTheMail[] = _("Please remove the MAIL.");
+const u8 gText_GiveToAPkmn[] = _("GIVE to a POKéMON?");
+const u8 gText_PlacedItemInBag[] = _("Placed item in the BAG.");
+const u8 gText_BagIsFull2[] = _("The BAG is full.");
+const u8 gText_PutItemInBag[] = _("Put this item in the BAG?");
+const u8 gText_ItemIsNowHeld[] = _("{SPECIAL_F7 0x00} is now held.");
+const u8 gText_ChangedToNewItem[] = _("Changed to {SPECIAL_F7 0x00}.");
+const u8 gText_MailCantBeStored[] = _("MAIL can’t be stored!");
+const u8 gPCText_Cancel[] = _("CANCEL");
+const u8 gPCText_Store[] = _("STORE");
+const u8 gPCText_Withdraw[] = _("WITHDRAW");
+const u8 gPCText_Shift[] = _("SHIFT");
+const u8 gPCText_Move[] = _("MOVE");
+const u8 gPCText_Place[] = _("PLACE");
+const u8 gPCText_Summary[] = _("SUMMARY");
+const u8 gPCText_Release[] = _("RELEASE");
+const u8 gPCText_Mark[] = _("MARK");
+const u8 gPCText_Name[] = _("NAME");
+const u8 gPCText_Jump[] = _("JUMP");
+const u8 gPCText_Wallpaper[] = _("WALLPAPER");
+const u8 gPCText_Take[] = _("TAKE");
+const u8 gPCText_Give[] = _("GIVE");
+const u8 gPCText_Switch[] = _("SWITCH");
+const u8 gPCText_Bag[] = _("BAG");
+const u8 gPCText_Info[] = _("INFO");
+const u8 gPCText_Scenery1[] = _("SCENERY 1");
+const u8 gPCText_Scenery2[] = _("SCENERY 2");
+const u8 gPCText_Scenery3[] = _("SCENERY 3");
+const u8 gPCText_Etcetera[] = _("ETCETERA");
+const u8 gPCText_Friends[] = _("FRIENDS");
+const u8 gPCText_Forest[] = _("FOREST");
+const u8 gPCText_City[] = _("CITY");
+const u8 gPCText_Desert[] = _("DESERT");
+const u8 gPCText_Savanna[] = _("SAVANNA");
+const u8 gPCText_Crag[] = _("CRAG");
+const u8 gPCText_Volcano[] = _("VOLCANO");
+const u8 gPCText_Snow[] = _("SNOW");
+const u8 gPCText_Cave[] = _("CAVE");
+const u8 gPCText_Beach[] = _("BEACH");
+const u8 gPCText_Seafloor[] = _("SEAFLOOR");
+const u8 gPCText_River[] = _("RIVER");
+const u8 gPCText_Sky[] = _("SKY");
+const u8 gPCText_PolkaDot[] = _("POLKA-DOT");
+const u8 gPCText_Pokecenter[] = _("POKéCENTER");
+const u8 gPCText_Machine[] = _("MACHINE");
+const u8 gPCText_Simple[] = _("SIMPLE");
+const u8 gUnknown_085EBB56[] = _("What would you like to do?");
+const u8 gText_WithdrawPokemon[] = _("WITHDRAW POKéMON");
+const u8 gText_DepositPokemon[] = _("DEPOSIT POKéMON");
+const u8 gText_MovePokemon[] = _("MOVE POKéMON");
+const u8 gText_MoveItems[] = _("MOVE ITEMS");
+const u8 gText_SeeYa[] = _("SEE YA!");
+const u8 gText_WithdrawMonDescription[] = _("Move POKéMON stored in BOXES to\nyour party.");
+const u8 gText_DepositMonDescription[] = _("Store POKéMON in your party in BOXES.");
+const u8 gText_MoveMonDescription[] = _("Organize the POKéMON in BOXES and\nin your party.");
+const u8 gText_MoveItemsDescription[] = _("Move items held by any POKéMON\nin a BOX or your party.");
+const u8 gText_SeeYaDescription[] = _("Return to the previous menu.");
+const u8 gText_JustOnePkmn[] = _("There is just one POKéMON with you.");
+const u8 gText_PartyFull[] = _("Your party is full!");
+const u8 gText_Box[] = _("BOX");
+const u8 gUnknown_085EBCC5[] = _("Check the map of the HOENN region.");
+const u8 gUnknown_085EBCE8[] = _("Check POKéMON in detail.");
+const u8 gUnknown_085EBD01[] = _("Call a registered TRAINER.");
+const u8 gUnknown_085EBD1C[] = _("Check obtained RIBBONS.");
+const u8 gUnknown_085EBD34[] = _("Put away the POKéNAV.");
+const u8 gText_NoRibbonWinners[] = _("There are no RIBBON winners.");
+const u8 gUnknown_085EBD67[] = _("No TRAINERS are registered.");
+const u8 gUnknown_085EBD83[] = _("Check party POKéMON in detail.");
+const u8 gUnknown_085EBDA2[] = _("Check all POKéMON in detail.");
+const u8 gUnknown_085EBDBF[] = _("Return to the POKéNAV menu.");
+const u8 gUnknown_085EBDDB[] = _("Find cool POKéMON.");
+const u8 gUnknown_085EBDEE[] = _("Find beautiful POKéMON.");
+const u8 gUnknown_085EBE06[] = _("Find cute POKéMON.");
+const u8 gUnknown_085EBE19[] = _("Find smart POKéMON.");
+const u8 gUnknown_085EBE2D[] = _("Find tough POKéMON.");
+const u8 gUnknown_085EBE41[] = _("Return to the CONDITION menu.");
+const u8 gText_NumberRegistered[] = _("No. registered");
+const u8 gText_NumberOfBattles[] = _("No. of battles");
+const u8 gUnknown_085EBE7D[] = _("DETAIL");
+const u8 gUnknown_085EBE84[] = _("CALL");
+const u8 gUnknown_085EBE89[] = _("EXIT");
+const u8 gUnknown_085EBE8E[] = _("Can’t call opponent here.");
+const u8 gUnknown_085EBEA8[] = _("STRATEGY");
+const u8 gUnknown_085EBEB1[] = _("TRAINER’S POKéMON");
+const u8 gUnknown_085EBEC3[] = _("SELF-INTRODUCTION");
+const u8 gUnknown_085EBED5[] = _("{CLEAR 0x80}");
+const u8 gUnknown_085EBED9[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBEE9[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBEF9[] = _("{A_BUTTON}CONDITION {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF0E[] = _("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF22[] = _("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF39[] = _("{A_BUTTON}MENU {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF49[] = _("{A_BUTTON}OK {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF57[] = _("{B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF60[] = _("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF73[] = _("{A_BUTTON}CHECK {B_BUTTON}CANCEL");
+const u8 gUnknown_085EBF84[] = _("{B_BUTTON}CANCEL");
+const u8 gText_NatureSlash[] = _("NATURE/");
+const u8 gText_TrainerCloseBy[] = _("That TRAINER is close by.\nTalk to the TRAINER in person!");
+const u8 gText_InParty[] = _("IN PARTY");
+const u8 gText_Number2[] = _("No. ");
+const u8 gUnknown_085EBFDC[] = _("RIBBONS");
+const u8 gUnknown_085EBFE4[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}");
+const u8 gUnknown_085EBFF6[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}");
+const u8 gUnknown_085EC008[] = _("{SPECIAL_F7 0x00}/{LV}{SPECIAL_F7 0x01}");
+const u8 gText_Unknown[] = _("UNKNOWN");
+const u8 gUnknown_085EC017[] = _("CALL");
+const u8 gUnknown_085EC01C[] = _("CHECK");
+const u8 gUnknown_085EC022[] = _("CANCEL");
+const u8 gText_NumberF700[] = _("No. {SPECIAL_F7 0x00}");
+const u8 gText_RibbonsF700[] = _("RIBBONS {SPECIAL_F7 0x00}");
+const u8 gUnknown_085EC03B[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}{SPECIAL_F7 0x02}");
+const u8 gUnknown_085EC04F[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}{SPECIAL_F7 0x02}");
+const u8 gUnknown_085EC063[] = _("{SPECIAL_F7 0x00}/{LV}{SPECIAL_F7 0x01}{SPECIAL_F7 0x02}");
+const u8 gText_CombineFourWordsOrPhrases[] = _("Combine four words or phrases");
+const u8 gText_AndMakeYourProfile[] = _("and make your profile.");
+const u8 gText_CombineSixWordsOrPhrases[] = _("Combine six words or phrases");
+const u8 gText_AndMakeAMessage[] = _("and make a message.");
+const u8 gText_FindWordsThatDescribeYour[] = _("Find words that describe your");
+const u8 gText_FeelingsRightNow[] = _("feelings right now.");
+const u8 gUnknown_085EC104[] = _("With four phrases,");
+const u8 gText_CombineNineWordsOrPhrases[] = _("Combine nine words or phrases");
+const u8 gText_AndMakeAMessage2[] = _("and make a message.");
+const u8 gText_ChangeJustOneWordOrPhrase[] = _("Change just one word or phrase");
+const u8 gText_AndImproveTheBardsSong[] = _("and improve the BARD’s song.");
+const u8 gText_YourProfile[] = _("Your profile");
+const u8 gText_YourFeelingAtTheBattlesStart[] = _("Your feeling at the battle’s start");
+const u8 gText_WhatYouSayIfYouWin[] = _("What you say if you win a battle");
+const u8 gText_WhatYouSayIfYouLose[] = _("What you say if you lose a battle");
+const u8 gText_TheAnswer[] = _("The answer");
+const u8 gText_TheMailMessage[] = _("The MAIL message");
+const u8 gUnknown_085EC214[] = _("The MAIL salutation");
+const u8 gText_TheBardsSong2[] = _("The new song");
+const u8 gText_CombineTwoWordsOrPhrases[] = _("Combine two words or phrases");
+const u8 gText_AndMakeATrendySaying[] = _("and make a trendy saying.");
+const u8 gText_TheTrendySaying[] = _("The trendy saying");
+const u8 gText_IsAsShownOkay[] = _("is as shown. Okay?");
+const u8 gText_CombineTwoWordsOrPhrases2[] = _("Combine two words or phrases");
+const u8 gText_ToTeachHerAGoodSaying[] = _("to teach her a good saying.");
+const u8 gText_FindWordsWhichFit[] = _("Find words which fit");
+const u8 gText_TheTrainersImage[] = _("the TRAINER’s image.");
+const u8 gText_TheImage[] = _("The image:");
+const u8 gText_OutOfTheListedChoices[] = _("Out of the listed choices,");
+const u8 gText_SelectTheAnswerToTheQuiz[] = _("select the answer to the quiz!");
+const u8 gText_AndCreateAQuiz[] = _("and create a quiz!");
+const u8 gText_PickAWordOrPhraseAnd[] = _("Pick a word or phrase and");
+const u8 gText_SetTheQuizAnswer[] = _("set the quiz answer.");
+const u8 gText_TheAnswerColon[] = _("The answer:");
+const u8 gUnknown_085EC387[] = _("The quiz:");
+const u8 gText_ApprenticePhrase[] = _("Apprentice’s phrase:");
+const u8 gText_QuitEditing[] = _("Quit editing?");
+const u8 gText_StopGivingPkmnMail[] = _("Stop giving the POKéMON MAIL?");
+const u8 gText_AndFillOutTheQuestionnaire[] = _("and fill out the questionnaire.");
+const u8 gText_LetsReplyToTheInterview[] = _("Let’s reply to the interview!");
+const u8 gText_AllTextBeingEditedWill[] = _("All the text being edited will");
+const u8 gText_BeDeletedThatOkay[] = _("be deleted. Is that okay?");
+const u8 gUnknown_085EC449[] = _("Quit editing?");
+const u8 gUnknown_085EC457[] = _("The edited text will not be saved.");
+const u8 gUnknown_085EC47A[] = _("Is that okay?");
+const u8 gUnknown_085EC488[] = _("Please enter a phrase or word.");
+const u8 gUnknown_085EC4A7[] = _("The entire text can’t be deleted.");
+const u8 gText_OnlyOnePhrase[] = _("Only one phrase may be changed.");
+const u8 gText_OriginalSongWillBeUsed[] = _("The original song will be used.");
+const u8 gUnknown_085EC509[] = _("That’s trendy already!");
+const u8 gText_CombineTwoWordsOrPhrases3[] = _("Combine two words or phrases.");
+const u8 gUnknown_085EC53E[] = _("Quit giving information?");
+const u8 gUnknown_085EC557[] = _("Stop giving the POKéMON MAIL?");
+const u8 gUnknown_085EC575[] = _("Create a quiz!");
+const u8 gUnknown_085EC584[] = _("Set the answer!");
+const u8 gUnknown_085EC594[] = _("Cancel the selection?");
+const u8 gText_Profile[] = _("PROFILE");
+const u8 gText_AtTheBattlesStart[] = _("At the battle’s start:");
+const u8 gText_UponWinningABattle[] = _("Upon winning a battle:");
+const u8 gText_UponLosingABattle[] = _("Upon losing a battle:");
+const u8 gText_TheBardsSong[] = _("The BARD’s Song");
+const u8 gText_WhatsHipAndHappening[] = _("What’s hip and happening?");
+const u8 gText_Interview[] = _("Interview");
+const u8 gText_GoodSaying[] = _("Good saying");
+const u8 gText_FansQuestion[] = _("Fan’s question");
+const u8 gUnknown_085EC645[] = _("クイズの こたえは?");
+const u8 gText_ApprenticesPhrase[] = _("Apprentice’s phrase");
+const u8 gText_Questionnaire[] = _("QUESTIONNAIRE");
+const u8 gText_YouCannotQuitHere[] = _("You cannot quit here.");
+const u8 gText_SectionMustBeCompleted[] = _("This section must be completed.");
+const u8 gText_F700sQuiz[] = _("{SPECIAL_F7 0x00}’s quiz");
+const u8 gText_Lady[] = _("Lady");
+const u8 gText_AfterYouHaveReadTheQuiz[] = _("After you have read the quiz");
+const u8 gText_QuestionPressTheAButton[] = _("question, press the A Button.");
+const u8 gText_TheQuizAnswerIs[] = _("The quiz answer is?");
+const u8 gText_LikeToQuitQuiz[] = _("Would you like to quit this quiz");
+const u8 gText_ChallengeQuestionMark[] = _("challenge?");
+const u8 gText_IsThisQuizOK[] = _("Is this quiz OK?");
+const u8 gText_CreateAQuiz[] = _("Create a quiz!");
+const u8 gText_SelectTheAnswer[] = _("Select the answer!");
+const u8 gText_LyricsCantBeDeleted[] = _("The lyrics can’t be deleted.");
+const u8 gText_PokemonLeague[] = _("POKéMON LEAGUE");
+const u8 gText_PokemonCenter[] = _("POKéMON CENTER");
+const u8 gText_GetsAPokeBlockQuestion[] = _(" gets a {POKEBLOCK}?");
+const u8 gText_Coolness[] = _("Coolness ");
+const u8 gText_Beauty3[] = _("Beauty ");
+const u8 gText_Cuteness[] = _("Cuteness ");
+const u8 gText_Smartness[] = _("Smartness ");
+const u8 gText_Toughness[] = _("Toughness ");
+const u8 gText_WasEnhanced[] = _("was enhanced!");
+const u8 gText_NothingChanged[] = _("Nothing changed!");
+const u8 gText_WontEatAnymore[] = _("It won’t eat anymore…");
+const u8 gText_SaveFailedCheckingBackup[] = _("Save failed. Checking the backup\nmemory… Please wait.\n{COLOR RED}“Time required: about 1 minute”");
+const u8 gText_BackupMemoryDamaged[] = _("The backup memory is damaged, or\nthe internal battery has run dry.\nYou can still play, but not save.");
+const u8 gText_GamePlayCannotBeContinued[] = _("{COLOR RED}“Game play cannot be continued.\nReturning to the title screen…”");
+const u8 gText_CheckCompleted[] = _("Check completed.\nAttempting to save again.\nPlease wait.");
+const u8 gText_SaveCompleteGameCannotContinue[] = _("Save completed.\n{COLOR RED}“Game play cannot be continued.\nReturning to the title screen.”");
+const u8 gText_SaveCompletePressA[] = _("Save completed.\n{COLOR RED}“Please press the A Button.”");
+const u8 gText_Ferry[] = _("FERRY");
+const u8 gText_SecretBase[] = _("SECRET BASE");
+const u8 gText_Hideout[] = _("HIDEOUT");
+const u8 gText_ResetRTCConfirmCancel[] = _("Reset RTC?\nA: Confirm, B: Cancel");
+const u8 gText_PresentTime[] = _("Present time in game");
+const u8 gText_PreviousTime[] = _("Previous time in game");
+const u8 gText_PleaseResetTime[] = _("Please reset the time.");
+const u8 gText_ClockHasBeenReset[] = _("The clock has been reset.\nData will be saved. Please wait.");
+const u8 gText_SaveCompleted[] = _("Save completed.");
+const u8 gText_SaveFailed[] = _("Save failed…");
+const u8 gText_NoSaveFileCantSetTime[] = _("There is no save file, so the time\ncan’t be set.");
+const u8 gText_InGameClockUsable[] = _("The in-game clock adjustment system\nis now useable.");
+const u8 gText_Slots[] = _("SLOTS");
+const u8 gText_Roulette[] = _("ROULETTE");
+const u8 gText_Good[] = _("Good");
+const u8 gText_VeryGood[] = _("Very good");
+const u8 gText_Excellent[] = _("Excellent");
+const u8 gText_SoSo[] = _("So-so");
+const u8 gText_Bad[] = _("Bad");
+const u8 gText_TheWorst[] = _("The worst");
+const u8 gText_Spicy2[] = _("spicy");
+const u8 gText_Dry2[] = _("dry");
+const u8 gText_Sweet2[] = _("sweet");
+const u8 gText_Bitter2[] = _("bitter");
+const u8 gText_Sour2[] = _("sour");
+const u8 gText_Single[] = _("SINGLE");
+const u8 gText_Double[] = _("DOUBLE");
+const u8 gText_Jackpot[] = _("jackpot");
+const u8 gText_First[] = _("first");
+const u8 gText_Second[] = _("second");
+const u8 gText_Third[] = _("third");
+const u8 gText_0Pts[] = _("0 pts");
+const u8 gText_10Pts[] = _("10 pts");
+const u8 gText_20Pts[] = _("20 pts");
+const u8 gText_30Pts[] = _("30 pts");
+const u8 gText_40Pts[] = _("40 pts");
+const u8 gText_50Pts[] = _("50 pts");
+const u8 gText_60Pts[] = _("60 pts");
+const u8 gText_70Pts[] = _("70 pts");
+const u8 gText_80Pts[] = _("80 pts");
+const u8 gText_90Pts[] = _("90 pts");
+const u8 gText_100Pts[] = _("100 pts");
+const u8 gText_QuestionMark[] = _("?");
+const u8 gText_KissPoster16BP[] = _("KISS POSTER{CLEAR_TO 0x5E}16BP");
+const u8 gText_KissCushion32BP[] = _("KISS CUSHION{CLEAR_TO 0x5E}32BP");
+const u8 gText_SmoochumDoll32BP[] = _("SMOOCHUM DOLL{CLEAR_TO 0x5E}32BP");
+const u8 gText_TogepiDoll48BP[] = _("TOGEPI DOLL{CLEAR_TO 0x5E}48BP");
+const u8 gText_MeowthDoll48BP[] = _("MEOWTH DOLL{CLEAR_TO 0x5E}48BP");
+const u8 gText_ClefairyDoll48BP[] = _("CLEFAIRY DOLL{CLEAR_TO 0x5E}48BP");
+const u8 gText_DittoDoll48BP[] = _("DITTO DOLL{CLEAR_TO 0x5E}48BP");
+const u8 gText_CyndaquilDoll80BP[] = _("CYNDAQUIL DOLL{CLEAR_TO 0x5E}80BP");
+const u8 gText_ChikoritaDoll80BP[] = _("CHIKORITA DOLL{CLEAR_TO 0x5E}80BP");
+const u8 gText_TotodileDoll80BP[] = _("TOTODILE DOLL{CLEAR_TO 0x5E}80BP");
+const u8 gText_LaprasDoll128BP[] = _("LAPRAS DOLL{CLEAR_TO 0x58}128BP");
+const u8 gText_SnorlaxDoll128BP[] = _("SNORLAX DOLL{CLEAR_TO 0x58}128BP");
+const u8 gText_VenusaurDoll256BP[] = _("VENUSAUR DOLL{CLEAR_TO 0x58}256BP");
+const u8 gText_CharizardDoll256BP[] = _("CHARIZARD DOLL{CLEAR_TO 0x58}256BP");
+const u8 gText_BlastoiseDoll256BP[] = _("BLASTOISE DOLL{CLEAR_TO 0x58}256BP");
+const u8 gText_Protein1BP[] = _("PROTEIN{CLEAR_TO 0x64}1BP");
+const u8 gText_Calcium1BP[] = _("CALCIUM{CLEAR_TO 0x64}1BP");
+const u8 gText_Iron1BP[] = _("IRON{CLEAR_TO 0x64}1BP");
+const u8 gText_Zinc1BP[] = _("ZINC{CLEAR_TO 0x64}1BP");
+const u8 gText_Carbos1BP[] = _("CARBOS{CLEAR_TO 0x64}1BP");
+const u8 gText_HpUp1BP[] = _("HP UP{CLEAR_TO 0x64}1BP");
+const u8 gText_Leftovers48BP[] = _("LEFTOVERS{CLEAR_TO 0x5E}48BP");
+const u8 gText_WhiteHerb48BP[] = _("WHITE HERB{CLEAR_TO 0x5E}48BP");
+const u8 gText_QuickClaw48BP[] = _("QUICK CLAW{CLEAR_TO 0x5E}48BP");
+const u8 gText_MentalHerb48BP[] = _("MENTAL HERB{CLEAR_TO 0x5E}48BP");
+const u8 gText_BrightPowder64BP[] = _("BRIGHTPOWDER{CLEAR_TO 0x5E}64BP");
+const u8 gText_ChoiceBand64BP[] = _("CHOICE BAND{CLEAR_TO 0x5E}64BP");
+const u8 gText_KingsRock64BP[] = _("KING’S ROCK{CLEAR_TO 0x5E}64BP");
+const u8 gText_FocusBand64BP[] = _("FOCUS BAND{CLEAR_TO 0x5E}64BP");
+const u8 gText_ScopeLens64BP[] = _("SCOPE LENS{CLEAR_TO 0x5E}64BP");
+const u8 gText_Softboiled16BP[] = _("SOFTBOILED{CLEAR_TO 0x4E}16BP");
+const u8 gText_SeismicToss24BP[] = _("SEISMIC TOSS{CLEAR_TO 0x4E}24BP");
+const u8 gText_DreamEater24BP[] = _("DREAM EATER{CLEAR_TO 0x4E}24BP");
+const u8 gText_MegaPunch24BP[] = _("MEGA PUNCH{CLEAR_TO 0x4E}24BP");
+const u8 gText_MegaKick48BP[] = _("MEGA KICK{CLEAR_TO 0x4E}48BP");
+const u8 gText_BodySlam48BP[] = _("BODY SLAM{CLEAR_TO 0x4E}48BP");
+const u8 gText_RockSlide48BP[] = _("ROCK SLIDE{CLEAR_TO 0x4E}48BP");
+const u8 gText_Counter48BP[] = _("COUNTER{CLEAR_TO 0x4E}48BP");
+const u8 gText_ThunderWave48BP[] = _("THUNDER WAVE{CLEAR_TO 0x4E}48BP");
+const u8 gText_SwordsDance48BP[] = _("SWORDS DANCE{CLEAR_TO 0x4E}48BP");
+const u8 gText_DefenseCurl16BP[] = _("DEFENSE CURL{CLEAR_TO 0x4E}16BP");
+const u8 gText_Snore24BP[] = _("SNORE{CLEAR_TO 0x4E}24BP");
+const u8 gText_MudSlap24BP[] = _("MUD-SLAP{CLEAR_TO 0x4E}24BP");
+const u8 gText_Swift24BP[] = _("SWIFT{CLEAR_TO 0x4E}24BP");
+const u8 gText_IcyWind24BP[] = _("ICY WIND{CLEAR_TO 0x4E}24BP");
+const u8 gText_Endure48BP[] = _("ENDURE{CLEAR_TO 0x4E}48BP");
+const u8 gText_PsychUp48BP[] = _("PSYCH UP{CLEAR_TO 0x4E}48BP");
+const u8 gText_IcePunch48BP[] = _("ICE PUNCH{CLEAR_TO 0x4E}48BP");
+const u8 gText_ThunderPunch48BP[] = _("THUNDERPUNCH{CLEAR_TO 0x4E}48BP");
+const u8 gText_FirePunch48BP[] = _("FIRE PUNCH{CLEAR_TO 0x4E}48BP");
+const u8 gText_PkmnFainted3[] = _("{STR_VAR_1} fainted…\p\n");
+const u8 gText_Marco[] = _("MARCO");
+const u8 gText_TrainerCardName[] = _("NAME: ");
+const u8 gText_TrainerCardIDNo[] = _("IDNo.");
+const u8 gText_TrainerCardMoney[] = _("MONEY");
+const u8 gUnknown_085ECF84[] = _("¥");
+const u8 gText_TrainerCardPokedex[] = _("POKéDEX");
+const u8 gText_EmptyString6[] = _("");
+const u8 gText_Colon2[] = _(":");
+const u8 gUnknown_085ECF91[] = _(" points");
+const u8 gText_TrainerCardTime[] = _("TIME");
+const u8 gUnknown_085ECF9E[] = _("ゲ-ムポイント");
+const u8 gText_Var1sTrainerCard[] = _("{STR_VAR_1}’s TRAINER CARD");
+const u8 gText_HallOfFameDebut[] = _("HALL OF FAME DEBUT ");
+const u8 gText_LinkBattles[] = _("LINK BATTLES");
+const u8 gText_LinkCableBattles[] = _("LINK CABLE BATTLES");
+const u8 gText_WinsLosses[] = _("W:{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} L:{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}");
+const u8 gText_PokemonTrades[] = _("POKéMON TRADES");
+const u8 gText_UnionTradesAndBattles[] = _("UNION TRADES & BATTLES");
+const u8 gText_BerryCrush[] = _("BERRY CRUSH");
+const u8 gText_WaitingTrainerFinishReading[] = _("Waiting for the other TRAINER to\nfinish reading your TRAINER CARD.");
+const u8 gText_PokeblocksWithFriends[] = _("{POKEBLOCK}S W/FRIENDS");
+const u8 gText_Var1DarkGreyShadowLightGrey[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}");
+const u8 gText_WonContestsWFriends[] = _("WON CONTESTS W/FRIENDS");
+const u8 gText_BattlePtsWon[] = _("BATTLE POINTS WON");
+const u8 gText_Var1DarkLightGreyBP[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}BP");
+const u8 gText_BattleTower[] = _("BATTLE TOWER");
+const u8 gText_WSlashStraightSlash[] = _("W/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} STRAIGHT/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}");
+const u8 gText_BattleTower2[] = _("BATTLE TOWER");
+const u8 gText_BattleDome[] = _("BATTLE DOME");
+const u8 gText_BattlePalace[] = _("BATTLE PALACE");
+const u8 gText_BattleFactory[] = _("BATTLE FACTORY");
+const u8 gText_BattleArena[] = _("BATTLE ARENA");
+const u8 gText_BattlePike[] = _("BATTLE PIKE");
+const u8 gText_BattlePyramid[] = _("BATTLE PYRAMID");
+
+asm(".align 2");
+const u8 gUnknown_085ED164[] = _("{STR_VAR_1} SINGLE");
+
+asm(".align 2");
+const u8 gUnknown_085ED170[] = _("{STR_VAR_1} DOUBLE");
+
+asm(".align 2");
+const u8 gUnknown_085ED17C[] = _("{STR_VAR_1} MULTI");
+
+asm(".align 2");
+const u8 gUnknown_085ED188[] = _("{STR_VAR_1} LINK");
+
+asm(".align 2");
+const u8 gUnknown_085ED190[] = _("{STR_VAR_1}");
+const u8 gText_Give[] = _("Give");
+const u8 gText_NoNeed[] = _("No need");
+const u8 gText_ColorLightShadowDarkGrey[] = _("{COLOR LIGHT_GREY}{SHADOW DARK_GREY}");
+const u8 gText_ColorBlue[] = _("{COLOR BLUE}");
+const u8 gText_ColorTransparent[] = _("{HIGHLIGHT TRANSPARENT}{COLOR TRANSPARENT}");
+const u8 gText_CDot[] = _("C.");
+const u8 gText_BDot[] = _("B.");
+const u8 gText_AnnouncingResults[] = _("Announcing the results!");
+const u8 gText_PreliminaryResults[] = _("The preliminary results!");
+const u8 gText_Round2Results[] = _("Round 2 results!");
+const u8 gText_Var1sVar2Won[] = _("{STR_VAR_1}’s {STR_VAR_2} won!");
+const u8 gText_CommunicationStandby[] = _("Communication standby…");
+const u8 gText_ColorDarkGrey[] = _("{COLOR DARK_GREY}");
+const u8 gUnknown_085ED222[] = _("{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR6 WHITE DYNAMIC_COLOR5}");
+const u8 gText_HighlightDarkGrey[] = _("{HIGHLIGHT DARK_GREY}");
+const u8 gUnknown_085ED22C[] = _(" ");
+const u8 gText_DynColor2Male[] = _("{COLOR DYNAMIC_COLOR2}♂");
+const u8 gText_DynColor1Female[] = _("{COLOR DYNAMIC_COLOR1}♀");
+const u8 gText_DynColor2[] = _("{COLOR DYNAMIC_COLOR2}");
+const u8 gText_Upper[] = _("UPPER");
+const u8 gText_Lower[] = _("lower");
+const u8 gText_Others[] = _("OTHERS");
+const u8 gText_Symbols[] = _("SYMBOLS");
+const u8 gText_Register2[] = _("REGISTER");
+const u8 gText_Exit2[] = _("EXIT");
+const u8 gText_QuitChatting[] = _("Quit chatting?");
+const u8 gText_RegisterTextWhere[] = _("Register text where?");
+const u8 gText_RegisterTextHere[] = _("Register text here?");
+const u8 gText_InputText[] = _("Input text.");
+const u8 gText_F700JoinedChat[] = _("{SPECIAL_F7 0x00} joined the chat!");
+const u8 gText_F700LeftChat[] = _("{SPECIAL_F7 0x00} left the chat.");
+const u8 gUnknown_085ED2CF[] = _("{SPECIAL_F7 0x00}の{SPECIAL_F7 0x01}ひきめ:");
+const u8 gUnknown_085ED2D9[] = _("{SPECIAL_F7 0x00}の{SPECIAL_F7 0x01}ひきめは いません");
+const u8 gText_ExitingChat[] = _("Exiting the chat…");
+const u8 gText_LeaderLeftEndingChat[] = _("The LEADER, {SPECIAL_F7 0x00}, has\nleft, ending the chat.");
+const u8 gText_RegisteredTextChanged[] = _("The registered text has been changed.\nIs it okay to save the game?");
+const u8 gText_AlreadySavedFile_Unused[] = _("There is already a saved file.\nIs it okay to overwrite it?");
+const u8 gText_SavingDontTurnOff_Unused[] = _("SAVING…\nDON’T TURN OFF THE POWER.");
+const u8 gText_PlayerSavedGame_Unused[] = _("{SPECIAL_F7 0x00} saved the game.");
+const u8 gText_IfLeaderLeavesChatEnds[] = _("If the LEADER leaves, the chat\nwill end. Is that okay?");
+const u8 gText_Hello[] = _("HELLO");
+const u8 gText_Pokemon2[] = _("POKéMON");
+const u8 gText_Trade[] = _("TRADE");
+const u8 gText_Battle[] = _("BATTLE");
+const u8 gText_Lets[] = _("LET’S");
+const u8 gText_Ok[] = _("OK!");
+const u8 gText_Sorry[] = _("SORRY");
+const u8 gText_YayUnkF9F9[] = _("YAY{EMOJI_BIGSMILE}");
+const u8 gText_ThankYou[] = _("THANK YOU");
+const u8 gText_ByeBye[] = _("BYE-BYE!");
+const u8 gMatchCallStevenStrategyText[] = _("Attack the weak points!");
+const u8 gMatchCall_StevenTrainersPokemonText[] = _("Ultimate STEEL POKéMON.");
+const u8 gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle[] = _("I’d climb even waterfalls");
+const u8 gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle[] = _("to find a rare stone!");
+const u8 gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle[] = _("I’m the strongest and most");
+const u8 gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle[] = _("energetic after all!");
+const u8 gMatchCall_BrendanStrategyText[] = _("Battle with knowledge!");
+const u8 gMatchCall_BrendanTrainersPokemonText[] = _("I will use various POKéMON.");
+const u8 gMatchCall_BrendanSelfIntroductionText_Line1[] = _("I’ll be a better POKéMON");
+const u8 gMatchCall_BrendanSelfIntroductionText_Line2[] = _("prof than my father is!");
+const u8 gMatchCall_MayStrategyText[] = _("I’m not so good at battles.");
+const u8 gMatchCall_MayTrainersPokemonText[] = _("I’ll use any POKéMON!");
+const u8 gMatchCall_MaySelfIntroductionText_Line1[] = _("My POKéMON and I help");
+const u8 gMatchCall_MaySelfIntroductionText_Line2[] = _("my father’s research.");
+const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!");
+const u8 gText_NickHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?");
+
+asm(".align 2");
+const u8 gText_ReadyToBerryCrush[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p");
+
+asm(".align 2");
+const u8 gText_WaitForAllChooseBerry[] = _("Please wait while each member\nchooses a BERRY.");
+
+asm(".align 2");
+const u8 gText_EndedWithXUnitsPowder[] = _("{PAUSE_MUSIC}{PLAY_BGM MUS_FANFA1}You ended up with {STR_VAR_1} units of\nsilky-smooth BERRY POWDER.{RESUME_MUSIC}\pYour total amount of BERRY POWDER\nis {STR_VAR_2}.\p");
+
+asm(".align 2");
+const u8 gText_RecordingGameResults[] = _("Recording your game results in the\nsave file.\lPlease wait.");
+
+asm(".align 2");
+const u8 gText_PlayBerryCrushAgain[] = _("Want to play BERRY CRUSH again?");
+
+asm(".align 2");
+const u8 gText_YouHaveNoBerries[] = _("You have no BERRIES.\nThe game will be canceled.");
+
+asm(".align 2");
+const u8 gText_MemberDroppedOut[] = _("A member dropped out.\nThe game will be canceled.");
+
+asm(".align 2");
+const u8 gText_TimesUpNoGoodPowder[] = _("Time’s up.\pGood BERRY POWDER could not be\nmade…\p");
+
+asm(".align 2");
+const u8 gText_CommunicationStandby2[] = _("Communication standby…");
+
+asm(".align 2");
+const u8 gText_1DotBlueF700[] = _("1. {COLOR BLUE}{SHADOW LIGHT_BLUE}{SPECIAL_F7 0x00}");
+
+asm(".align 2");
+const u8 gText_1DotF700[] = _("1. {SPECIAL_F7 0x00}");
+
+asm(".align 2");
+const u8 gText_SpaceTimes2[] = _(" time(s)");
+
+asm(".align 2");
+const u8 gText_XDotY[] = _("{STR_VAR_1}.{STR_VAR_2}");
+
+asm(".align 2");
+const u8 gText_Var1Berry[] = _("{STR_VAR_1} BERRY");
+
+asm(".align 2");
+const u8 gText_TimeColon[] = _("Time:");
+
+asm(".align 2");
+const u8 gText_PressingSpeed[] = _("Pressing Speed:");
+
+asm(".align 2");
+const u8 gText_Silkiness[] = _("Silkiness:");
+
+asm(".align 2");
+const u8 gText_StrVar1[] = _("{STR_VAR_1}");
+
+asm(".align 2");
+const u8 gText_SpaceMin[] = _(" min. ");
+
+asm(".align 2");
+const u8 gText_XDotY2[] = _("{STR_VAR_1}.{STR_VAR_2}");
+
+asm(".align 2");
+const u8 gText_SpaceSec[] = _(" sec.");
+
+asm(".align 2");
+const u8 gText_XDotY3[] = _("{STR_VAR_1}.{STR_VAR_2}");
+
+asm(".align 2");
+const u8 gText_TimesPerSec[] = _(" Times/sec.");
+
+asm(".align 2");
+const u8 gText_Var1Percent[] = _("{STR_VAR_1}%");
+
+asm(".align 2");
+const u8 gText_PressesRankings[] = _("No. of Presses Rankings");
+
+asm(".align 2");
+const u8 gText_CrushingResults[] = _("Crushing Results");
+
+asm(".align 2");
+const u8 gText_NeatnessRankings[] = _("Neatness Rankings");
+
+asm(".align 2");
+const u8 gText_CoopRankings[] = _("Cooperative Rankings");
+
+asm(".align 2");
+const u8 gText_PressingPowerRankings[] = _("Pressing-Power Rankings");
+const u8 gText_BerryCrush2[] = _("BERRY CRUSH");
+const u8 gText_PressingSpeedRankings[] = _("Pressing-Speed Rankings");
+const u8 gText_Var1Players[] = _("{STR_VAR_1} PLAYERS");
+const u8 gText_SymbolsEarned[] = _("Symbols Earned");
+const u8 gText_BattleRecord[] = _("Battle Record");
+const u8 gText_BattlePoints[] = _("Battle Points");
+const u8 gUnknown_085ED92A[] = _("CANCEL");
+const u8 gUnknown_085ED931[] = _("");
+const u8 gUnknown_085ED932[] = _("Check BATTLE FRONTIER MAP.");
+const u8 gUnknown_085ED94D[] = _("Check TRAINER CARD.");
+const u8 gUnknown_085ED961[] = _("View recorded battle.");
+const u8 gUnknown_085ED977[] = _("Put away the FRONTIER PASS.");
+const u8 gUnknown_085ED993[] = _("Your current Battle Points.");
+const u8 gUnknown_085ED9AF[] = _("Your collected Symbols.");
+const u8 gUnknown_085ED9C7[] = _("Battle Tower - Ability Symbol");
+const u8 gUnknown_085ED9E5[] = _("Battle Dome - Tactics Symbol");
+const u8 gUnknown_085EDA02[] = _("Battle Palace - Spirits Symbol");
+const u8 gUnknown_085EDA21[] = _("Battle Arena - Guts Symbol");
+const u8 gUnknown_085EDA3C[] = _("Battle Factory - Knowledge Symbol");
+const u8 gUnknown_085EDA5E[] = _("Battle Pike - Luck Symbol");
+const u8 gUnknown_085EDA78[] = _("Battle Pyramid - Brave Symbol");
+const u8 gUnknown_085EDA96[] = _("There is no Battle Record.");
+const u8 gUnknown_085EDAB1[] = _("BATTLE TOWER");
+const u8 gUnknown_085EDABE[] = _("BATTLE DOME");
+const u8 gUnknown_085EDACA[] = _("BATTLE PALACE");
+const u8 gUnknown_085EDAD8[] = _("BATTLE ARENA");
+const u8 gUnknown_085EDAE5[] = _("BATTLE FACTORY");
+const u8 gUnknown_085EDAF4[] = _("BATTLE PIKE");
+const u8 gUnknown_085EDB00[] = _("BATTLE PYRAMID");
+const u8 gUnknown_085EDB0F[] = _("KO opponents and aim for the top!\nYour ability will be tested.");
+const u8 gUnknown_085EDB4E[] = _("Keep winning at the tournament!\nYour tactics will be tested.");
+const u8 gUnknown_085EDB8B[] = _("Watch your POKéMON battle!\nYour spirit will be tested.");
+const u8 gUnknown_085EDBC2[] = _("Win battles with teamed-up POKéMON!\nYour guts will be tested.");
+const u8 gUnknown_085EDC00[] = _("Aim for victory using rental POKéMON!\nYour knowledge will be tested.");
+const u8 gUnknown_085EDC45[] = _("Select one of three paths to battle!\nYour luck will be tested.");
+const u8 gUnknown_085EDC84[] = _("Aim for the top with exploration!\nYour bravery will be tested.");
+const u8 gText_ContinueMenuPlayer[] = _("PLAYER");
+const u8 gText_ContinueMenuTime[] = _("TIME");
+const u8 gText_ContinueMenuPokedex[] = _("POKéDEX");
+const u8 gText_ContinueMenuBadges[] = _("BADGES");
+const u8 gText_Powder[] = _("POWDER");
+const u8 gText_BerryPickingRecords[] = _("DODRIO BERRY-PICKING RECORDS");
+const u8 gText_BerriesPicked[] = _("BERRIES picked:");
+const u8 gText_BestScore[] = _("Best score:");
+const u8 gText_BerriesInRowFivePlayers[] = _("BERRIES picked in a row with\nfive players:");
+const u8 gText_BerryPickingResults[] = _("Announcing BERRY-PICKING results!");
+const u8 gText_10P30P50P50P[] = _("{CLEAR_TO 0x03}10P{CLEAR_TO 0x2B}30P{CLEAR_TO 0x53}50P{CLEAR_TO 0x77}{EMOJI_MINUS}50P");
+const u8 gText_AnnouncingRankings[] = _("Announcing rankings!");
+const u8 gText_AnnouncingPrizes[] = _("Announcing prizes!");
+const u8 gText_1Colon[] = _("1:");
+const u8 gText_2Colon[] = _("2:");
+const u8 gText_3Colon[] = _("3:");
+const u8 gText_4Colon[] = _("4:");
+const u8 gText_5Colon[] = _("5:");
+const u8 gText_FirstPlacePrize[] = _("The first-place winner gets\nthis {SPECIAL_F7 0x00}!");
+const u8 gText_CantHoldAnyMore[] = _("You can’t hold any more!");
+const u8 gText_FilledStorageSpace[] = _("It filled its storage space.");
+const u8 gText_WantToPlayAgain[] = _("Want to play again?");
+const u8 gText_SomeoneDroppedOut[] = _("Somebody dropped out.\nThe link will be canceled.");
+const u8 gText_SpacePoints[] = _(" points");
+const u8 gText_CommunicationStandby3[] = _("Communication standby…");
+const u8 gText_SpacePoints2[] = _(" points");
+const u8 gText_SpaceTimes3[] = _(" time(s)");
+const u8 gText_PkmnJumpRecords[] = _("POKéMON JUMP RECORDS");
+const u8 gText_JumpsInARow[] = _("Jumps in a row:");
+const u8 gText_BestScore2[] = _("Best score:");
+const u8 gText_ExcellentsInARow[] = _("EXCELLENTS in a row:");
+const u8 gText_AwesomeWonF701F700[] = _("Awesome score! You’ve\nwon {SPECIAL_F7 0x01} {SPECIAL_F7 0x00}!");
+const u8 gText_FilledStorageSpace2[] = _("It filled its storage space.");
+const u8 gText_CantHoldMore[] = _("You can’t hold any more!");
+const u8 gText_WantToPlayAgain2[] = _("Want to play again?");
+const u8 gText_SomeoneDroppedOut2[] = _("Somebody dropped out.\nThe link will be canceled.");
+const u8 gText_CommunicationStandby4[] = _("Communication standby…");
+const u8 gText_LinkContestResults[] = _("{PLAYER}’s Link Contest Results");
+const u8 gText_1st[] = _("1st");
+const u8 gText_2nd[] = _("2nd");
+const u8 gText_3rd[] = _("3rd");
+const u8 gText_4th[] = _("4th");
+const u8 gText_Friend[] = _("Friend");
+const u8 gUnknown_085EDFB7[] = _("POKeMON");
+const u8 gJPText_MysteryGift[] = _("ふしぎなもらいもの");
+const u8 gJPText_DecideStop[] = _("{A_BUTTON}けってい {B_BUTTON}やめる");
+const u8 gUnknown_085EDFD6[] = _("カードeリーダー{PLUS} で\nふしぎなもらいものを よみこみます");
+const u8 gUnknown_085EDFF5[] = _("カードeリーダー{PLUS}の メニューから\n‘つうしん’を えらび");
+const u8 gUnknown_085EE014[] = _("‘ゲームボーイアドバンスとつうしん’\nを せんたく してください");
+const u8 gUnknown_085EE035[] = _("カードeリーダー{PLUS}の ‘つうしん’を\nえらんで Aボタンを おしてください");
+const u8 gUnknown_085EE05C[] = _("せつぞくが まちがっています");
+const u8 gUnknown_085EE06B[] = _("カードの よみこみを\nちゅうし しました");
+const u8 gUnknown_085EE080[] = _("カードeリーダー{PLUS}と\nつうしん できません");
+const u8 gUnknown_085EE097[] = _("つうしん ちゅう です");
+const u8 gUnknown_085EE0A3[] = _("つうしん エラーです\nせつぞくを たしかめて ください");
+const u8 gUnknown_085EE0BF[] = _("つうしん エラーです\nはじめから やりなおして ください");
+const u8 gUnknown_085EE0DC[] = _("カードeリーダー{PLUS} に\nカードを よみこませて ください");
+const u8 gUnknown_085EE0FA[] = _("つうしん しゅうりょう!");
+const u8 gUnknown_085EE107[] = _("あらたな トレーナーが\nホウエンに やってきた!");
+const u8 gUnknown_085EE120[] = _("しばらく おまちください");
+const u8 gUnknown_085EE12D[] = _("かきこみ エラー です\nデータが ほぞん できませんでした");
+const u8 gUnknown_085EE14B[] = _("RED");
+const u8 gUnknown_085EE14F[] = _("BLUE");
+const u8 gUnknown_085EE154[] = _("---");
+const u8 gText_SingleBattleRoomResults[] = _("{PLAYER}’s Single Battle Room Results");
+const u8 gText_DoubleBattleRoomResults[] = _("{PLAYER}’s Double Battle Room Results");
+const u8 gText_MultiBattleRoomResults[] = _("{PLAYER}’s Multi Battle Room Results");
+const u8 gText_LinkMultiBattleRoomResults[] = _("{PLAYER}’s Link Multi Battle Room Results");
+const u8 gText_SingleBattleTourneyResults[] = _("{PLAYER}’s Single Battle Tourney Results");
+const u8 gText_DoubleBattleTourneyResults[] = _("{PLAYER}’s Double Battle Tourney Results");
+const u8 gText_SingleBattleHallResults[] = _("{PLAYER}’s Single Battle Hall Results");
+const u8 gText_DoubleBattleHallResults[] = _("{PLAYER}’s Double Battle Hall Results");
+const u8 gText_BattleChoiceResults[] = _("{PLAYER}’s Battle Choice Results");
+const u8 gText_SetKOTourneyResults[] = _("{PLAYER}’s Set KO Tourney Results");
+const u8 gText_BattleSwapSingleResults[] = _("{PLAYER}’s Battle Swap Single Results");
+const u8 gText_BattleSwapDoubleResults[] = _("{PLAYER}’s Battle Swap Double Results");
+const u8 gText_BattleQuestResults[] = _("{PLAYER}’s Battle Quest Results");
+const u8 gText_Lv502[] = _("LV. 50");
+const u8 gText_OpenLv[] = _("OPEN LV.");
+const u8 gText_WinStreak[] = _("Win streak: {STR_VAR_1}");
+const u8 gText_Current[] = _("CURRENT");
+const u8 gText_Record[] = _("RECORD");
+const u8 gText_Prev[] = _("PREV.");
+const u8 gText_RentalSwap[] = _("Rental/Swap");
+const u8 gText_Total[] = _("Total");
+const u8 gText_ClearStreak[] = _("Clear streak: {STR_VAR_1}");
+const u8 gText_Championships[] = _("Championships: {STR_VAR_1}");
+const u8 gText_RoomsCleared[] = _("Rooms cleared: {STR_VAR_1}");
+const u8 gText_TimesCleared[] = _("Times cleared:{CLEAR 0x05}{STR_VAR_1}");
+const u8 gText_KOsInARow[] = _("KOs in a row: {STR_VAR_1}");
+const u8 gText_TimesVar1[] = _("Times: {STR_VAR_1}");
+const u8 gText_FloorsCleared[] = _("Floors cleared: {STR_VAR_1}");
+
+asm(".align 2");
+const u8 gUnknown_085EE3B0[] = _("LV. 50");
+
+asm(".align 2");
+const u8 gUnknown_085EE3B8[] = _("OPEN LEVEL");
+
+asm(".align 2");
+const u8 gUnknown_085EE3C4[] = _("Win streak: {STR_VAR_2}");
+
+asm(".align 2");
+const u8 gUnknown_085EE3D4[] = _("Clear streak: {STR_VAR_2}");
+
+asm(".align 2");
+const u8 gUnknown_085EE3E8[] = _("Rooms cleared: {STR_VAR_2}");
+
+asm(".align 2");
+const u8 gUnknown_085EE3FC[] = _("KOs in a row: {STR_VAR_2}");
+
+asm(".align 2");
+const u8 gUnknown_085EE410[] = _("Floors cleared: {STR_VAR_2}");
+
+asm(".align 2");
+const u8 gText_1Dot[] = _("1.");
+const u8 gUnknown_085EE427[] = _("2.");
+const u8 gUnknown_085EE42A[] = _("3.");
+const u8 gText_SavingDontTurnOff2[] = _("SAVING…\nDON’T TURN OFF THE POWER.");
+const u8 gText_BlenderMaxSpeedRecord[] = _("BERRY BLENDER\nMAXIMUM SPEED RECORD!");
+const u8 gText_234Players[] = _("2 PLAYERS\n3 PLAYERS\n4 PLAYERS");
+const u8 gText_YesNo[] = _("YES\nNO");
+const u8 gText_SelectorArrow3[] = _("▶");
+const u8 gText_Peekaboo[] = _("PEEKABOO!");
+const u8 gText_CommErrorCheckConnections[] = _("Communication error…\nPlease check all connections,\nthen turn the power OFF and ON.");
+const u8 gText_CommErrorEllipsis[] = _("Communication error…");
+const u8 gText_MoveCloserToLinkPartner[] = _("Move closer to your link partner(s).\nAvoid obstacles between partners.");
+const u8 gText_ABtnRegistrationCounter[] = _("A Button: Registration Counter");
+const u8 gText_ABtnTitleScreen[] = _("A Button: Title Screen");
+const u8 gText_Option[] = _("OPTION");
+const u8 gText_TextSpeed[] = _("TEXT SPEED");
+const u8 gText_BattleScene[] = _("BATTLE SCENE");
+const u8 gText_BattleStyle[] = _("BATTLE STYLE");
+const u8 gText_Sound[] = _("SOUND");
+const u8 gText_Frame[] = _("FRAME");
+const u8 gText_OptionMenuCancel[] = _("CANCEL");
+const u8 gText_ButtonMode[] = _("BUTTON MODE");
+const u8 gText_TextSpeedSlow[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SLOW");
+const u8 gText_TextSpeedMid[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MID");
+const u8 gText_TextSpeedFast[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}FAST");
+const u8 gText_BattleSceneOn[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}ON");
+const u8 gText_BattleSceneOff[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}OFF");
+const u8 gText_BattleStyleShift[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SHIFT");
+const u8 gText_BattleStyleSet[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SET");
+const u8 gText_SoundMono[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MONO");
+const u8 gText_SoundStereo[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}STEREO");
+const u8 gText_FrameType[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}TYPE");
+const u8 gText_FrameTypeNumber[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}");
+const u8 gText_ButtonTypeNormal[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}NORMAL");
+const u8 gText_ButtonTypeLR[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}LR");
+const u8 gText_ButtonTypeLEqualsA[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}L=A");
+const u8 gText_XPLink[] = _("{STR_VAR_1}P LINK");
+const u8 gText_BronzeCard[] = _("BRONZE");
+const u8 gText_CopperCard[] = _("COPPER");
+const u8 gText_SilverCard[] = _("SILVER");
+const u8 gText_GoldCard[] = _("GOLD");
+const u8 gText_Day[] = _("DAY");
+const u8 gText_Colon3[] = _(":");
+const u8 gText_Confirm2[] = _("CONFIRM");
+const u8 gUnknown_085EE698[] = _("Days");
+const u8 gUnknown_085EE69D[] = _("Time:");
+const u8 gUnknown_085EE6A3[] = _("Game time");
+const u8 gUnknown_085EE6AD[] = _("RTC time");
+const u8 gUnknown_085EE6B6[] = _("Updated time");
+const u8 gText_MenuPokedex[] = _("POKéDEX");
+const u8 gText_MenuPokemon[] = _("POKéMON");
+const u8 gText_MenuBag[] = _("BAG");
+const u8 gText_MenuPokenav[] = _("POKéNAV");
+const u8 gText_MenuPlayer[] = _("{PLAYER}");
+const u8 gText_MenuSave[] = _("SAVE");
+const u8 gText_MenuOption[] = _("OPTION");
+const u8 gText_MenuExit[] = _("EXIT");
+const u8 gText_MenuRetire[] = _("RETIRE");
+const u8 gText_MenuRest[] = _("REST");
+const u8 gText_SafariBallStock[] = _("SAFARI BALLS\nStock: {STR_VAR_1}");
+const u8 gText_BattlePyramidFloor[] = _("Battle Pyramid\n{STR_VAR_1}");
+const u8 gText_Floor1[] = _("Floor 1");
+const u8 gText_Floor2[] = _("Floor 2");
+const u8 gText_Floor3[] = _("Floor 3");
+const u8 gText_Floor4[] = _("Floor 4");
+const u8 gText_Floor5[] = _("Floor 5");
+const u8 gText_Floor6[] = _("Floor 6");
+const u8 gText_Floor7[] = _("Floor 7");
+const u8 gText_Peak[] = _("Peak");
+const u8 gText_LinkStandby2[] = _("Link standby…\n… … B Button: Cancel");
+const u8 gText_PressAToLoadEvent[] = _("Press the A Button to load event.\n… … B Button: Cancel");
+const u8 gText_LoadingEvent[] = _("Loading event…");
+const u8 gText_DontRemoveCableTurnOff[] = _("Don’t remove the Game Link cable.\nDon’t turn off the power.");
+const u8 gText_EventSafelyLoaded[] = _("The event was safely loaded.");
+const u8 gText_LoadErrorEndingSession[] = _("Loading error.\nEnding session.");
+const u8 gUnknown_085EE846[] = _("プレイヤー");
+const u8 gUnknown_085EE84C[] = _("さま");
+const u8 gText_DexHoenn[] = _("HOENN");
+const u8 gText_DexNational[] = _("NATIONAL");
+const u8 gText_PokedexDiploma[] = _("PLAYER: {CLEAR 0x10}{COLOR RED}{SHADOW LIGHT_RED}{PLAYER}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}\n\nThis document certifies\nthat you have successfully\ncompleted your\n{STR_VAR_1} POKéDEX.\n\n{CLEAR_TO 0x42}{COLOR RED}{SHADOW LIGHT_RED}GAME FREAK");
+const u8 gUnknown_085EE8DC[] = _("{COLOR RED}{SHADOW LIGHT_RED}ゲ-ムフリ-ク");
+const u8 gUnknown_085EE8EA[] = _("{COLOR RED}{SHADOW LIGHT_RED}");
+const u8 gText_Hoenn[] = _("HOENN");
+const u8 gText_OhABite[] = _("Oh! A bite!");
+const u8 gText_PokemonOnHook[] = _("A POKéMON’s on the hook!{PAUSE_UNTIL_PRESS}");
+const u8 gText_NotEvenANibble[] = _("Not even a nibble…{PAUSE_UNTIL_PRESS}");
+const u8 gText_ItGotAway[] = _("It got away…{PAUSE_UNTIL_PRESS}");
+const u8 gText_XWillBeSentToY[] = _("{STR_VAR_2} will be\nsent to {STR_VAR_1}.");
+const u8 gText_ByeByeVar1[] = _("Bye-bye, {STR_VAR_2}!");
+const u8 gText_XSentOverY[] = _("{STR_VAR_1} sent over {STR_VAR_3}.");
+const u8 gText_TakeGoodCareOfX[] = _("Take good care of {STR_VAR_3}!");
+
+// Easy chat group names
+const u8 gEasyChatGroupName_Pokemon[] = _("POKéMON");
+const u8 gEasyChatGroupName_Trainer[] = _("TRAINER");
+const u8 gEasyChatGroupName_Status[] = _("STATUS");
+const u8 gEasyChatGroupName_Battle[] = _("BATTLE");
+const u8 gEasyChatGroupName_Greetings[] = _("GREETINGS");
+const u8 gEasyChatGroupName_People[] = _("PEOPLE");
+const u8 gEasyChatGroupName_Voices[] = _("VOICES");
+const u8 gEasyChatGroupName_Speech[] = _("SPEECH");
+const u8 gEasyChatGroupName_Endings[] = _("ENDINGS");
+const u8 gEasyChatGroupName_Feelings[] = _("FEELINGS");
+const u8 gEasyChatGroupName_Conditions[] = _("CONDITIONS");
+const u8 gEasyChatGroupName_Actions[] = _("ACTIONS");
+const u8 gEasyChatGroupName_Lifestyle[] = _("LIFESTYLE");
+const u8 gEasyChatGroupName_Hobbies[] = _("HOBBIES");
+const u8 gEasyChatGroupName_Time[] = _("TIME");
+const u8 gEasyChatGroupName_Misc[] = _("MISC.");
+const u8 gEasyChatGroupName_Adjectives[] = _("ADJECTIVES");
+const u8 gEasyChatGroupName_Events[] = _("EVENTS");
+const u8 gEasyChatGroupName_Move1[] = _("MOVE 1");
+const u8 gEasyChatGroupName_Move2[] = _("MOVE 2");
+const u8 gEasyChatGroupName_TrendySaying[] = _("TRENDY SAYING");
+const u8 gEasyChatGroupName_Pokemon2[] = _("POKéMON2");
+
+const u8 gText_ThreeQuestionMarks[] = _("???");
+const u8 gUnknown_085EEA46[] = _("MAX. HP");
+const u8 gUnknown_085EEA4E[] = _("ATTACK");
+const u8 gUnknown_085EEA55[] = _("DEFENSE");
+const u8 gUnknown_085EEA5D[] = _("SPEED");
+const u8 gUnknown_085EEA63[] = _("SP. ATK");
+const u8 gUnknown_085EEA6B[] = _("SP. DEF");
+const u8 gText_UnkCtrlF904[] = _("{PLUS}");
+const u8 gText_Dash[] = _("-");
+const u8 gText_FromSpace[] = _("From ");
+const u8 gText_MixingRecords[] = _("Mixing records…");
+const u8 gText_RecordMixingComplete[] = _("Record mixing completed.\nThank you for waiting.");
+const u8 gText_YourName[] = _("YOUR NAME?");
+const u8 gText_BoxName[] = _("BOX NAME?");
+const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}’s nickname?");
+const u8 gText_TellHimTheWords[] = _("Tell him the words.");
+const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK");
+const u8 gText_CallCantBeMadeHere[] = _("A call can’t be made from here.");
+const u8 gUnknown_085EEB2B[] = _("HANDSOME");
+const u8 gUnknown_085EEB34[] = _("VINNY");
+const u8 gUnknown_085EEB3A[] = _("MOREME");
+const u8 gUnknown_085EEB41[] = _("IRONHARD");
+const u8 gUnknown_085EEB4A[] = _("MUSCLE");
+const u8 gUnknown_085EEB51[] = _("coolness");
+const u8 gUnknown_085EEB5A[] = _("beauty");
+const u8 gUnknown_085EEB61[] = _("cuteness");
+const u8 gUnknown_085EEB6A[] = _("smartness");
+const u8 gUnknown_085EEB74[] = _("toughness");
+const u8 gText_Lady2[] = _("Lady");
+const u8 gUnknown_085EEB83[] = _("slippery");
+const u8 gUnknown_085EEB8C[] = _("roundish");
+const u8 gUnknown_085EEB95[] = _("wham-ish");
+const u8 gUnknown_085EEB9E[] = _("shiny");
+const u8 gUnknown_085EEBA4[] = _("sticky");
+const u8 gUnknown_085EEBAB[] = _("pointy");
+const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON");
+const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON.");
+const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON.");
+const u8 gText_SelectThirdPkmn[] = _("Select the third POKéMON.");
+const u8 gText_Rent[] = _("RENT");
+const u8 gText_Summary[] = _("SUMMARY");
+const u8 gText_Others2[] = _("OTHERS");
+const u8 gText_Deselect[] = _("DESELECT");
+const u8 gText_TheseThreePkmnOkay[] = _("Are these three POKéMON OK?");
+const u8 gText_Yes2[] = _("YES");
+const u8 gText_No2[] = _("NO");
+const u8 gText_CantSelectSamePkmn[] = _("Can’t select same {PKMN}.");
+const u8 gText_PkmnSwap[] = _("POKéMON SWAP");
+const u8 gText_SelectPkmnToSwap[] = _("Select POKéMON to swap.");
+const u8 gText_SelectPkmnToAccept[] = _("Select POKéMON to accept.");
+const u8 gText_Swap[] = _("SWAP");
+const u8 gText_Summary2[] = _("SUMMARY");
+const u8 gText_Rechoose[] = _("RECHOOSE");
+const u8 gText_QuitSwapping[] = _("Quit swapping?");
+const u8 gText_Yes3[] = _("YES");
+const u8 gText_No3[] = _("NO");
+const u8 gText_PkmnForSwap[] = _("{PKMN} FOR SWAP");
+const u8 gText_Cancel3[] = _("CANCEL");
+const u8 gUnknown_085EECE4[] = _("SWAP");
+const u8 gUnknown_085EECE9[] = _("ACCEPT");
+const u8 gText_AcceptThisPkmn[] = _("Accept this POKéMON?");
+const u8 gUnknown_085EED05[] = _(" ");
+const u8 gText_SamePkmnInPartyAlready[] = _("Same {PKMN} in party already.");
+const u8 gText_DecimalPoint[] = _(".");
+const u8 gText_SavingPlayer[] = _("PLAYER");
+const u8 gText_SavingBadges[] = _("BADGES");
+const u8 gText_SavingPokedex[] = _("POKéDEX");
+const u8 gText_SavingTime[] = _("TIME");
+const u8 gText_WirelessCommStatus[] = _("Wireless Communication Status");
+const u8 gText_PeopleTrading[] = _("People trading:");
+const u8 gText_PeopleBattling[] = _("People battling:");
+const u8 gText_PeopleInUnionRoom[] = _("People in the UNION ROOM:");
+const u8 gText_PeopleCommunicating[] = _("People communicating:");
+const u8 gText_F700Players[] = _("{SPECIAL_F7 0} players");
+const u8 gText_F701Players[] = _("{SPECIAL_F7 1} players");
+const u8 gText_F702Players[] = _("{SPECIAL_F7 2} players");
+const u8 gText_F703Players[] = _("{SPECIAL_F7 3} players");
+
+const u8 *const gTextTable_Players[] = {
+ gText_F700Players,
+ gText_F701Players,
+ gText_F702Players,
+ gText_F703Players
+};
+
+asm(".align 2");
+const u8 gText_WonderCards[] = _("WONDER CARDS");
+
+asm(".align 2");
+const u8 gText_WonderNews[] = _("WONDER NEWS");
+
+asm(".align 2");
+const u8 gText_WirelessCommunication[] = _("WIRELESS COMMUNICATION");
+
+asm(".align 2");
+const u8 gText_Friend2[] = _("FRIEND");
+
+asm(".align 2");
+const u8 gText_Exit3[] = _("EXIT");
+
+asm(".align 2");
+const u8 gText_Receive[] = _("RECEIVE");
+
+asm(".align 2");
+const u8 gText_Send[] = _("SEND");
+
+asm(".align 2");
+const u8 gText_Toss[] = _("TOSS");
+
+asm(".align 2");
+const u8 gText_VarietyOfEventsImportedWireless[] = _("A variety of events will be imported\nover Wireless Communication.");
+
+asm(".align 2");
+const u8 gText_WonderCardsInPossession[] = _("Read the WONDER CARDS in your\npossession.");
+
+asm(".align 2");
+const u8 gText_ReadNewsThatArrived[] = _("Read the NEWS that arrived.");
+
+asm(".align 2");
+const u8 gText_ReturnToTitle[] = _("Return to the title screen.");
+
+asm(".align 2");
+const u8 gText_DontHaveCardNewOneInput[] = _("You don’t have a WONDER CARD,\nso a new CARD will be input.");
+
+asm(".align 2");
+const u8 gText_DontHaveNewsNewOneInput[] = _("You don’t have any WONDER NEWS,\nso new NEWS will be input.");
+
+asm(".align 2");
+const u8 gText_WhereShouldCardBeAccessed[] = _("Where should the WONDER CARD\nbe accessed?");
+
+asm(".align 2");
+const u8 gText_WhereShouldNewsBeAccessed[] = _("Where should the WONDER NEWS\nbe accessed?");
+
+asm(".align 2");
+const u8 gUnknown_085EEFC0[] = _("Communication standby…\nB Button: Cancel");
+
+asm(".align 2");
+const u8 gText_Communicating[] = _("Communicating…");
+
+asm(".align 2");
+const u8 gText_CommunicationCompleted[] = _("Communication completed.");
+
+asm(".align 2");
+const u8 gText_CommunicationError[] = _("Communication error.");
+
+asm(".align 2");
+const u8 gText_CommunicationCanceled[] = _("Communication has been canceled.");
+
+asm(".align 2");
+const u8 gText_ThrowAwayWonderCard[] = _("Throw away the WONDER CARD\nand input a new CARD?");
+
+asm(".align 2");
+const u8 gText_HaventReceivedCardsGift[] = _("You haven’t received the CARD’s gift\nyet. Input a new CARD anyway?");
+
+asm(".align 2");
+const u8 gText_WonderCardReceivedFrom[] = _("A WONDER CARD has been received\nfrom {STR_VAR_1}.");
+
+asm(".align 2");
+const u8 gText_WonderNewsReceivedFrom[] = _("A WONDER NEWS item has been\nreceived from {STR_VAR_1}.");
+
+asm(".align 2");
+const u8 gText_WonderCardReceived[] = _("A new WONDER CARD has been\nreceived.");
+
+asm(".align 2");
+const u8 gText_WonderNewsReceived[] = _("A new WONDER NEWS item has been\nreceived.");
+
+asm(".align 2");
+const u8 gText_NewStampReceived[] = _("A new STAMP has been received.");
+
+asm(".align 2");
+const u8 gText_NewTrainerReceived[] = _("A new TRAINER has arrived.");
+
+asm(".align 2");
+const u8 gText_AlreadyHadCard[] = _("You already had that\nWONDER CARD.");
+
+asm(".align 2");
+const u8 gText_AlreadyHadNews[] = _("You already had that\nWONDER NEWS item.");
+
+asm(".align 2");
+const u8 gText_AlreadyHadStamp[] = _("You already had that\nSTAMP.");
+
+asm(".align 2");
+const u8 gText_NoMoreRoomForStamps[] = _("There’s no more room for adding\nSTAMPS.");
+
+asm(".align 2");
+const u8 gText_RecordUploadedViaWireless[] = _("Your record has been uploaded via\nWIRELESS COMMUNICATION.");
+
+asm(".align 2");
+const u8 gText_CantAcceptCardFromTrainer[] = _("You can’t accept a WONDER CARD\nfrom this TRAINER.");
+
+asm(".align 2");
+const u8 gText_CantAcceptNewsFromTrainer[] = _("You can’t accept WONDER NEWS\nfrom this TRAINER.");
+
+asm(".align 2");
+const u8 gText_NothingSentOver[] = _("Nothing was sent over…");
+
+asm(".align 2");
+const u8 gText_WhatToDoWithCards[] = _("What would you like to do\nwith the WONDER CARDS?");
+
+asm(".align 2");
+const u8 gText_WhatToDoWithNews[] = _("What would you like to do\nwith the WONDER NEWS?");
+
+asm(".align 2");
+const u8 gText_SendingWonderCard[] = _("Sending your WONDER CARD…");
+
+asm(".align 2");
+const u8 gText_SendingWonderNews[] = _("Sending your WONDER NEWS item…");
+
+asm(".align 2");
+const u8 gText_WonderCardSentTo[] = _("Your WONDER CARD has been sent\nto {STR_VAR_1}.");
+
+asm(".align 2");
+const u8 gText_WonderNewsSentTo[] = _("Your WONDER NEWS item has been\nsent to {STR_VAR_1}.");
+
+asm(".align 2");
+const u8 gText_StampSentTo[] = _("A STAMP has been sent to {STR_VAR_1}.");
+
+asm(".align 2");
+const u8 gText_GiftSentTo[] = _("A GIFT has been sent to {STR_VAR_1}.");
+
+asm(".align 2");
+const u8 gText_OtherTrainerHasCard[] = _("The other TRAINER has the same\nWONDER CARD already.");
+
+asm(".align 2");
+const u8 gText_OtherTrainerHasNews[] = _("The other TRAINER has the same\nWONDER NEWS already.");
+
+asm(".align 2");
+const u8 gText_OtherTrainerHasStamp[] = _("The other TRAINER has the same\nSTAMP already.");
+
+asm(".align 2");
+const u8 gText_OtherTrainerCanceled[] = _("The other TRAINER canceled\ncommunication.");
+
+asm(".align 2");
+const u8 gText_CantSendGiftToTrainer[] = _("You can’t send a MYSTERY GIFT to\nthis TRAINER.");
+
+asm(".align 2");
+const u8 gText_IfThrowAwayCardEventWontHappen[] = _("If you throw away the CARD,\nits event won’t happen. Okay?");
+
+asm(".align 2");
+const u8 gText_OkayToDiscardNews[] = _("Is it okay to discard this\nNEWS item?");
+
+asm(".align 2");
+const u8 gText_HaventReceivedGiftOkayToDiscard[] = _("You haven’t received the\nGIFT. Is it okay to discard?");
+
+asm(".align 2");
+const u8 gText_DataWillBeSaved[] = _("Data will be saved.\nPlease wait.");
+
+asm(".align 2");
+const u8 gText_SaveCompletedPressA[] = _("Save completed.\nPlease press the A Button.");
+
+asm(".align 2");
+const u8 gText_WonderCardThrownAway[] = _("The WONDER CARD was thrown away.");
+
+asm(".align 2");
+const u8 gText_WonderNewsThrownAway[] = _("The WONDER NEWS was thrown away.");
+
+asm(".align 2");
+const u8 gText_MysteryGift[] = _("MYSTERY GIFT");
+
+asm(".align 2");
+const u8 gText_PickOKExit[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}EXIT");
+
+asm(".align 2");
+const u8 gText_PickOKCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL");
+const u8 gText_PlayersBattleResults[] = _("{PLAYER}’s BATTLE RESULTS");
+const u8 gText_TotalRecordWLD[] = _("TOTAL RECORD W:{STR_VAR_1} L:{STR_VAR_2} D:{STR_VAR_3}");
+const u8 gText_WinLoseDraw[] = _("{CLEAR_TO 0x53}WIN{CLEAR_TO 0x80}LOSE{CLEAR_TO 0xB0}DRAW");
+const u8 gText_CommunicationStandby5[] = _("Communication standby…");
+const u8 gText_QuitTheGame[] = _("Quit the game?");
+const u8 gText_YouveGot9999Coins[] = _("You’ve got 9,999 COINS.");
+const u8 gText_YouveRunOutOfCoins[] = _("You’ve run out of COINS.\nGame over!");
+const u8 gText_YouDontHaveThreeCoins[] = _("You don’t have three COINS.");
+const u8 gText_ReelTimeHelp[] = _("REEL TIME\nHere’s your chance to take\naim and nail marks!\nReel Time continues for the\nawarded number of spins.\nIt all ends on a Big Bonus.");
+const u8 gDaycareText_GetAlongVeryWell[] = _("The two seem to get along\nvery well.");
+const u8 gDaycareText_GetAlong[] = _("The two seem to get along.");
+const u8 gDaycareText_DontLikeOther[] = _("The two don’t seem to like\neach other much.");
+const u8 gDaycareText_PlayOther[] = _("The two prefer to play with other\nPOKéMON than each other.");
+const u8 gText_NewLine2[] = _("\n");
+const u8 gText_Exit4[] = _("EXIT");
+const u8 gText_Lv[] = _("{LV}");
+const u8 gText_TimeBoard[] = _("TIME BOARD");
+const u8 gText_TimeCleared[] = _("TIME CLEARED ");
+const u8 gText_XMinYDotZSec[] = _("{STR_VAR_1} min. {STR_VAR_2}.{STR_VAR_3} sec.");
+const u8 gUnknown_085EF8B6[] = _("1F");
+const u8 gUnknown_085EF8B9[] = _("2F");
+const u8 gUnknown_085EF8BC[] = _("3F");
+const u8 gUnknown_085EF8BF[] = _("4F");
+const u8 gText_TeachWhichMoveToPkmn[] = _("Teach which move to {STR_VAR_1}?");
+const u8 gText_TeachX[] = _("Teach {STR_VAR_2}?");
+const u8 gText_PkmnLearnedMove4[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!");
+const u8 gText_PkmnTryingToLearnMove[] = _("{STR_VAR_1} is trying to learn\n{STR_VAR_2}.\pBut {STR_VAR_1} can’t learn more\nthan four moves.\pDelete an older move to make\nroom for {STR_VAR_2}?");
+const u8 gText_StopTryingToTeachMove[] = _("Stop trying to teach\n{STR_VAR_2}?");
+const u8 gText_12AndPoof[] = _("{PAUSE 32}1, {PAUSE 15}2, and {PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p");
+const u8 gText_PkmnForgotMoveAndLearnedNew[] = _("{STR_VAR_1} forgot {STR_VAR_3}.\pAnd…\p{STR_VAR_1} learned {STR_VAR_2}.");
+const u8 gUnknown_085EF9C8[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}.");
+const u8 gText_GiveUpTeachingNewMove[] = _("Give up trying to teach a new\nmove to {STR_VAR_1}?");
+const u8 gText_WhichMoveToForget2[] = _("Which move should be\nforgotten?\p");
+const u8 gText_BattleMoves2[] = _("BATTLE MOVES");
+const u8 gText_ContestMoves2[] = _("CONTEST MOVES");
+const u8 gUnknown_085EFA4C[] = _("TYPE/");
+const u8 gText_PPSlash[] = _("PP/");
+const u8 gText_PowerSlash[] = _("POWER/");
+const u8 gText_AccuracySlash[] = _("ACCURACY/");
+const u8 gText_Appeal2[] = _("APPEAL");
+const u8 gText_Jam2[] = _("JAM");
+const u8 gText_Kira[] = _("KIRA");
+const u8 gText_Amy[] = _("AMY");
+const u8 gText_John[] = _("JOHN");
+const u8 gText_Roy[] = _("ROY");
+const u8 gText_Gabby[] = _("GABBY");
+const u8 gText_Anna[] = _("ANNA");
+const u8 gText_ClearAllSaveData[] = _("Clear all save data areas?");
+const u8 gText_ClearingData[] = _("Clearing data…\nPlease wait.");
+const u8 gText_IsThisTheCorrectTime[] = _("Is this the correct time?");
+const u8 gText_Confirm3[] = _("CONFIRM");
+const u8 gText_Cancel4[] = _("CANCEL");
+const u8 gMrStoneMatchCallDesc[] = _("DEVON PRES");
+const u8 gMrStoneMatchCallName[] = _("MR. STONE");
+const u8 gStevenMatchCallDesc[] = _("HARD AS ROCK");
+const u8 gStevenMatchCallName[] = _("STEVEN");
+const u8 gMayBrendanMatchCallDesc[] = _("RAD NEIGHBOR");
+const u8 gNormanMatchCallDesc[] = _("RELIABLE ONE");
+const u8 gMomMatchCallDesc[] = _("CALM & KIND");
+const u8 gWallyMatchCallDesc[] = _("{PKMN} LOVER");
+const u8 gNormanMatchCallName[] = _("DAD");
+const u8 gMomMatchCallName[] = _("MOM");
+const u8 gScottMatchCallDesc[] = _("ELUSIVE EYES");
+const u8 gScottMatchCallName[] = _("SCOTT");
+const u8 gRoxanneMatchCallDesc[] = _("ROCKIN’ WHIZ");
+const u8 gBrawlyMatchCallDesc[] = _("THE BIG HIT");
+const u8 gWattsonMatchCallDesc[] = _("SWELL SHOCK");
+const u8 gFlanneryMatchCallDesc[] = _("PASSION BURN");
+const u8 gWinonaMatchCallDesc[] = _("SKY TAMER");
+const u8 gTateLizaMatchCallDesc[] = _("MYSTIC DUO");
+const u8 gJuanMatchCallDesc[] = _("DANDY CHARM");
+const u8 gEliteFourMatchCallDesc[] = _("ELITE FOUR");
+const u8 gChampionMatchCallDesc[] = _("CHAMPION");
+const u8 gProfBirchMatchCallDesc[] = _("{PKMN} PROF.");
+const u8 gText_CommStandbyAwaitingOtherPlayer[] = _("Communication standby…\nAwaiting another player to choose.");
+const u8 gText_BattleWasRefused[] = _("The battle was refused.{PAUSE 60}");
+const u8 gText_RefusedBattle[] = _("Refused the battle.{PAUSE 60}");
+const u8 gUnknown_085EFC3E[] = _("NO WEATHER");
+const u8 gUnknown_085EFC49[] = _("SUNNY");
+const u8 gUnknown_085EFC4F[] = _("SUNNY2");
+const u8 gUnknown_085EFC56[] = _("RAIN");
+const u8 gUnknown_085EFC5B[] = _("SNOW");
+const u8 gUnknown_085EFC60[] = _("LIGHTNING");
+const u8 gUnknown_085EFC6A[] = _("FOG");
+const u8 gUnknown_085EFC6E[] = _("VOLCANO ASH");
+const u8 gUnknown_085EFC7A[] = _("SANDSTORM");
+const u8 gUnknown_085EFC84[] = _("FOG2");
+const u8 gUnknown_085EFC89[] = _("SEAFLOOR");
+const u8 gUnknown_085EFC92[] = _("CLOUDY");
+const u8 gUnknown_085EFC99[] = _("SUNNY3");
+const u8 gUnknown_085EFCA0[] = _("HEAVY RAIN");
+const u8 gUnknown_085EFCAB[] = _("SEAFLOOR2");
+const u8 gText_DelAll[] = _("DEL. ALL");
+const u8 gText_Cancel5[] = _("CANCEL");
+const u8 gText_Ok2[] = _("OK");
+const u8 gText_Quiz[] = _("QUIZ");
+const u8 gText_Answer[] = _("ANSWER");
+const u8 gText_PokeBalls[] = _("POKé BALLS");
+const u8 gText_Berry[] = _("BERRY");
+const u8 gText_Berries[] = _("BERRIES");
diff --git a/src/text.c b/src/text.c
index 8108a6867..ed70f767b 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1,19 +1,20 @@
#include "global.h"
+#include "battle.h"
#include "main.h"
+#include "m4a.h"
#include "palette.h"
+#include "sound.h"
+#include "constants/songs.h"
#include "string_util.h"
#include "window.h"
#include "text.h"
+#include "blit.h"
-extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
-extern void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height);
-extern void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
extern u8 GetKeypadIconWidth(u8 keypadIconId);
-extern void CopyWindowToVram(u8 windowId, u8 mode);
extern u16 Font6Func(struct TextPrinter *textPrinter);
extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
-extern void PlaySE(u16 songNum);
-extern u8* sub_81AFC74(u8 a1);
+extern u8* DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 a1);
+extern int sub_8197964();
EWRAM_DATA struct TextPrinter gTempTextPrinter = {0};
EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS] = {0};
@@ -23,7 +24,7 @@ static u16 gLastTextBgColor;
static u16 gLastTextFgColor;
static u16 gLastTextShadowColor;
-extern struct Main gMain;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
const struct FontInfo *gFonts;
u8 gUnknown_03002F84;
@@ -35,22 +36,22 @@ u8 gGlyphDimensions[0x2];
TextFlags gTextFlags;
const u8 gFontHalfRowOffsets[] = {
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,
0x24, 0x25, 0x26, 0x24, 0x27, 0x28, 0x29, 0x27, 0x2A, 0x2B, 0x2C, 0x2A, 0x24, 0x25, 0x26, 0x24,
- 0x2D, 0x2E, 0x2F, 0x2D, 0x30, 0x31, 0x32, 0x30, 0x33, 0x34, 0x35, 0x33, 0x2D, 0x2E, 0x2F, 0x2D,
+ 0x2D, 0x2E, 0x2F, 0x2D, 0x30, 0x31, 0x32, 0x30, 0x33, 0x34, 0x35, 0x33, 0x2D, 0x2E, 0x2F, 0x2D,
0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,
0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,
- 0x3F, 0x40, 0x41, 0x3F, 0x42, 0x43, 0x44, 0x42, 0x45, 0x46, 0x47, 0x45, 0x3F, 0x40, 0x41, 0x3F,
+ 0x3F, 0x40, 0x41, 0x3F, 0x42, 0x43, 0x44, 0x42, 0x45, 0x46, 0x47, 0x45, 0x3F, 0x40, 0x41, 0x3F,
0x48, 0x49, 0x4A, 0x48, 0x4B, 0x4C, 0x4D, 0x4B, 0x4E, 0x4F, 0x50, 0x4E, 0x48, 0x49, 0x4A, 0x48,
0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00
};
const u8 gDownArrowTiles[] = INCBIN_U8("data/graphics/fonts/down_arrow.4bpp");
@@ -159,7 +160,7 @@ u16 PrintTextOnWindow(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 spee
subPrinter.letterSpacing = gFonts[fontId].letterSpacing;
subPrinter.lineSpacing = gFonts[fontId].lineSpacing;
subPrinter.fontColor_l = gFonts[fontId].fontColor_l;
- subPrinter.fontColor_h = gFonts[fontId].fontColor_h;
+ subPrinter.fgColor = gFonts[fontId].fgColor;
subPrinter.bgColor = gFonts[fontId].bgColor;
subPrinter.shadowColor = gFonts[fontId].shadowColor;
return AddTextPrinter(&subPrinter, speed, callback);
@@ -189,8 +190,8 @@ bool16 AddTextPrinter(struct TextSubPrinter *textSubPrinter, u8 speed, void (*ca
gTempTextPrinter.minLetterSpacing = 0;
gTempTextPrinter.japanese = 0;
- GenerateFontHalfRowLookupTable(textSubPrinter->fontColor_h, textSubPrinter->bgColor, textSubPrinter->shadowColor);
- if (speed != 0xFF && speed != 0x0)
+ GenerateFontHalfRowLookupTable(textSubPrinter->fgColor, textSubPrinter->bgColor, textSubPrinter->shadowColor);
+ if (speed != TEXT_SPEED_FF && speed != 0x0)
{
--gTempTextPrinter.text_speed;
gTextPrinters[textSubPrinter->windowId] = gTempTextPrinter;
@@ -204,7 +205,7 @@ bool16 AddTextPrinter(struct TextSubPrinter *textSubPrinter, u8 speed, void (*ca
break;
}
- if (speed != 0xFF)
+ if (speed != TEXT_SPEED_FF)
CopyWindowToVram(gTempTextPrinter.subPrinter.windowId, 2);
gTextPrinters[textSubPrinter->windowId].sub_union.sub.active = 0;
}
@@ -374,464 +375,464 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
*(current++) = (shadowColor << 12) | (shadowColor << 8) | (shadowColor << 4) | shadowColor;
}
#else
-__attribute__((naked))
+NAKED
void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
{
asm("push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, #0x24\n\
- lsl r0, #24\n\
- lsr r0, #24\n\
- lsl r1, #24\n\
- lsr r1, #24\n\
- lsl r2, #24\n\
- lsr r2, #24\n\
- ldr r3, =gFontHalfRowLookupTable\n\
- ldr r4, =gLastTextBgColor\n\
- strh r1, [r4]\n\
- ldr r4, =gLastTextFgColor\n\
- strh r0, [r4]\n\
- ldr r4, =gLastTextShadowColor\n\
- strh r2, [r4]\n\
- lsl r5, r1, #12\n\
- lsl r6, r0, #12\n\
- lsl r4, r2, #12\n\
- mov r8, r4\n\
- lsl r7, r1, #8\n\
- str r7, [sp]\n\
- lsl r4, r1, #4\n\
- mov r9, r4\n\
- orr r7, r4\n\
- str r7, [sp, #0x4]\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r0, #8\n\
- mov r10, r7\n\
- mov r4, r10\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0x8]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r2, #8\n\
- mov r12, r7\n\
- mov r4, r12\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0xC]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r0, #4\n\
- mov r9, r7\n\
- ldr r4, [sp]\n\
- orr r4, r7\n\
- str r4, [sp, #0x10]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r7, r10\n\
- add r4, r7, #0\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0x14]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r7, r12\n\
- add r4, r7, #0\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0x18]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r2, #4\n\
- mov r9, r7\n\
- mov r4, r9\n\
- ldr r7, [sp]\n\
- orr r7, r4\n\
- str r7, [sp, #0x1C]\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r7, r9\n\
- mov r4, r10\n\
- orr r4, r7\n\
- str r4, [sp, #0x20]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r4, r12\n\
- mov r7, r9\n\
- orr r4, r7\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x4]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x8]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0xC]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x10]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x14]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x18]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x1C]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x20]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r4, #0\n\
- orr r7, r0\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r0, [sp, #0x4]\n\
- orr r7, r0\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x8]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0xC]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x10]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x14]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x18]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x1C]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x20]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- orr r7, r4\n\
- orr r5, r7\n\
- strh r5, [r3]\n\
- add r3, #0x2\n\
- orr r6, r7\n\
- strh r6, [r3]\n\
- orr r0, r7\n\
- strh r0, [r3, #0x2]\n\
- add sp, #0x24\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\
- .pool");
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, #0x24\n\
+ lsl r0, #24\n\
+ lsr r0, #24\n\
+ lsl r1, #24\n\
+ lsr r1, #24\n\
+ lsl r2, #24\n\
+ lsr r2, #24\n\
+ ldr r3, =gFontHalfRowLookupTable\n\
+ ldr r4, =gLastTextBgColor\n\
+ strh r1, [r4]\n\
+ ldr r4, =gLastTextFgColor\n\
+ strh r0, [r4]\n\
+ ldr r4, =gLastTextShadowColor\n\
+ strh r2, [r4]\n\
+ lsl r5, r1, #12\n\
+ lsl r6, r0, #12\n\
+ lsl r4, r2, #12\n\
+ mov r8, r4\n\
+ lsl r7, r1, #8\n\
+ str r7, [sp]\n\
+ lsl r4, r1, #4\n\
+ mov r9, r4\n\
+ orr r7, r4\n\
+ str r7, [sp, #0x4]\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r0, #8\n\
+ mov r10, r7\n\
+ mov r4, r10\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x8]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r2, #8\n\
+ mov r12, r7\n\
+ mov r4, r12\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0xC]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r0, #4\n\
+ mov r9, r7\n\
+ ldr r4, [sp]\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x10]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r7, r10\n\
+ add r4, r7, #0\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x14]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r7, r12\n\
+ add r4, r7, #0\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x18]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r2, #4\n\
+ mov r9, r7\n\
+ mov r4, r9\n\
+ ldr r7, [sp]\n\
+ orr r7, r4\n\
+ str r7, [sp, #0x1C]\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r7, r9\n\
+ mov r4, r10\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x20]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r12\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x4]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x8]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0xC]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x10]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x14]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x18]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x1C]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x20]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r4, #0\n\
+ orr r7, r0\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r0, [sp, #0x4]\n\
+ orr r7, r0\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x8]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0xC]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x10]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x14]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x18]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x1C]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x20]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ orr r7, r4\n\
+ orr r5, r7\n\
+ strh r5, [r3]\n\
+ add r3, #0x2\n\
+ orr r6, r7\n\
+ strh r6, [r3]\n\
+ orr r0, r7\n\
+ strh r0, [r3, #0x2]\n\
+ add sp, #0x24\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\
+ .pool");
}
#endif
@@ -870,169 +871,169 @@ void DecompressGlyphTile(const u16 *src, u16 *dest)
*(dest) = (gFontHalfRowLookupTable[gFontHalfRowOffsets[src[1] & 0xFF]] << 16) | gFontHalfRowLookupTable[gFontHalfRowOffsets[src[1] >> 8]];
}
#else
-__attribute__((naked))
+NAKED
void DecompressGlyphTile(const u16 *src, u16 *dest)
{
asm("push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- ldrh r7, [r0]\n\
- ldr r5, =gFontHalfRowLookupTable\n\
- ldr r4, =gFontHalfRowOffsets\n\
- mov r2, #0xFF\n\
- mov r8, r2\n\
- add r2, r7, #0\n\
- mov r3, r8\n\
- and r2, r3\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r3, [r2]\n\
- lsl r3, #16\n\
- lsr r2, r7, #8\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r2, [r2]\n\
- orr r3, r2\n\
- add r6, r1, #0\n\
- stmia r6!, {r3}\n\
- ldrh r7, [r0, #0x2]\n\
- add r0, #0x4\n\
- add r2, r7, #0\n\
- mov r3, r8\n\
- and r2, r3\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r3, [r2]\n\
- lsl r3, #16\n\
- lsr r2, r7, #8\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r2, [r2]\n\
- orr r3, r2\n\
- str r3, [r1, #0x4]\n\
- add r6, #0x4\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- mov r2, r8\n\
- and r1, r2\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- mov r3, r8\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r1, r7, #0\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0, #0x2]\n\
- add r0, r7, #0\n\
- and r0, r3\n\
- add r0, r4\n\
- ldrb r0, [r0]\n\
- lsl r0, #1\n\
- add r0, r5\n\
- ldrh r1, [r0]\n\
- lsl r1, #16\n\
- lsr r0, r7, #8\n\
- add r0, r4\n\
- ldrb r0, [r0]\n\
- lsl r0, #1\n\
- add r0, r5\n\
- ldrh r0, [r0]\n\
- orr r1, r0\n\
- str r1, [r6]\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool");
+ mov r7, r8\n\
+ push {r7}\n\
+ ldrh r7, [r0]\n\
+ ldr r5, =gFontHalfRowLookupTable\n\
+ ldr r4, =gFontHalfRowOffsets\n\
+ mov r2, #0xFF\n\
+ mov r8, r2\n\
+ add r2, r7, #0\n\
+ mov r3, r8\n\
+ and r2, r3\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r3, [r2]\n\
+ lsl r3, #16\n\
+ lsr r2, r7, #8\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r2, [r2]\n\
+ orr r3, r2\n\
+ add r6, r1, #0\n\
+ stmia r6!, {r3}\n\
+ ldrh r7, [r0, #0x2]\n\
+ add r0, #0x4\n\
+ add r2, r7, #0\n\
+ mov r3, r8\n\
+ and r2, r3\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r3, [r2]\n\
+ lsl r3, #16\n\
+ lsr r2, r7, #8\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r2, [r2]\n\
+ orr r3, r2\n\
+ str r3, [r1, #0x4]\n\
+ add r6, #0x4\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ mov r2, r8\n\
+ and r1, r2\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ mov r3, r8\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r1, r7, #0\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0, #0x2]\n\
+ add r0, r7, #0\n\
+ and r0, r3\n\
+ add r0, r4\n\
+ ldrb r0, [r0]\n\
+ lsl r0, #1\n\
+ add r0, r5\n\
+ ldrh r1, [r0]\n\
+ lsl r1, #16\n\
+ lsr r0, r7, #8\n\
+ add r0, r4\n\
+ ldrb r0, [r0]\n\
+ lsl r0, #1\n\
+ add r0, r5\n\
+ ldrh r0, [r0]\n\
+ orr r1, r0\n\
+ str r1, [r6]\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool");
}
#endif
@@ -1051,707 +1052,707 @@ u8 GetLastTextColor(u8 colorType)
}
}
-__attribute__((naked))
+NAKED
void CopyGlyphToWindow(struct TextPrinter *x)
{
asm("push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, #0x8C\n\
- add r3, r0, #0\n\
- ldrb r1, [r3, #0x4]\n\
- lsl r0, r1, #1\n\
- add r0, r1\n\
- lsl r0, #2\n\
- ldr r1, =gWindows\n\
- add r1, r0, r1\n\
- add r2, r1, #0\n\
- ldrb r7, [r1, #0x3]\n\
- lsl r0, r7, #3\n\
- ldrb r6, [r3, #0x8]\n\
- sub r4, r0, r6\n\
- ldr r5, =gUnknown_03002F90\n\
- add r0, r5, #0\n\
- add r0, #0x80\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- ble _08004DD2\n\
- add r4, r0, #0\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, #0x8C\n\
+ add r3, r0, #0\n\
+ ldrb r1, [r3, #0x4]\n\
+ lsl r0, r1, #1\n\
+ add r0, r1\n\
+ lsl r0, #2\n\
+ ldr r1, =gWindows\n\
+ add r1, r0, r1\n\
+ add r2, r1, #0\n\
+ ldrb r7, [r1, #0x3]\n\
+ lsl r0, r7, #3\n\
+ ldrb r6, [r3, #0x8]\n\
+ sub r4, r0, r6\n\
+ ldr r5, =gUnknown_03002F90\n\
+ add r0, r5, #0\n\
+ add r0, #0x80\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ ble _08004DD2\n\
+ add r4, r0, #0\n\
_08004DD2:\n\
- ldrb r0, [r1, #0x4]\n\
- lsl r0, #3\n\
- ldrb r3, [r3, #0x9]\n\
- sub r0, r3\n\
- add r1, r5, #0\n\
- add r1, #0x81\n\
- ldrb r1, [r1]\n\
- cmp r0, r1\n\
- ble _08004DE6\n\
- add r0, r1, #0\n\
+ ldrb r0, [r1, #0x4]\n\
+ lsl r0, #3\n\
+ ldrb r3, [r3, #0x9]\n\
+ sub r0, r3\n\
+ add r1, r5, #0\n\
+ add r1, #0x81\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ ble _08004DE6\n\
+ add r0, r1, #0\n\
_08004DE6:\n\
- str r6, [sp]\n\
- mov r8, r3\n\
- add r3, r5, #0\n\
- ldr r2, [r2, #0x8]\n\
- mov r9, r2\n\
- lsl r1, r7, #5\n\
- str r1, [sp, #0x4]\n\
- cmp r4, #0x8\n\
- ble _08004DFA\n\
- b _08004F94\n\
+ str r6, [sp]\n\
+ mov r8, r3\n\
+ add r3, r5, #0\n\
+ ldr r2, [r2, #0x8]\n\
+ mov r9, r2\n\
+ lsl r1, r7, #5\n\
+ str r1, [sp, #0x4]\n\
+ cmp r4, #0x8\n\
+ ble _08004DFA\n\
+ b _08004F94\n\
_08004DFA:\n\
- cmp r0, #0x8\n\
- bgt _08004E84\n\
- mov r1, r8\n\
- str r3, [sp, #0x8]\n\
- add r2, r6, #0\n\
- add r2, r4\n\
- mov r8, r2\n\
- add r0, r1, r0\n\
- str r0, [sp, #0xC]\n\
- str r6, [sp, #0x10]\n\
- cmp r1, r0\n\
- bcc _08004E14\n\
- b _080052AA\n\
+ cmp r0, #0x8\n\
+ bgt _08004E84\n\
+ mov r1, r8\n\
+ str r3, [sp, #0x8]\n\
+ add r2, r6, #0\n\
+ add r2, r4\n\
+ mov r8, r2\n\
+ add r0, r1, r0\n\
+ str r0, [sp, #0xC]\n\
+ str r6, [sp, #0x10]\n\
+ cmp r1, r0\n\
+ bcc _08004E14\n\
+ b _080052AA\n\
_08004E14:\n\
- ldr r3, [sp, #0x8]\n\
- ldm r3!, {r5}\n\
- str r3, [sp, #0x8]\n\
- ldr r4, [sp, #0x10]\n\
- add r0, r1, #0x1\n\
- mov r10, r0\n\
- cmp r4, r8\n\
- bcs _08004E72\n\
- mov r2, #0x7\n\
- mov r12, r2\n\
- lsr r0, r1, #3\n\
- ldr r2, [sp, #0x4]\n\
- add r3, r0, #0\n\
- mul r3, r2\n\
- add r7, r3, #0\n\
- mov r3, r12\n\
- and r1, r3\n\
- lsl r6, r1, #2\n\
+ ldr r3, [sp, #0x8]\n\
+ ldm r3!, {r5}\n\
+ str r3, [sp, #0x8]\n\
+ ldr r4, [sp, #0x10]\n\
+ add r0, r1, #0x1\n\
+ mov r10, r0\n\
+ cmp r4, r8\n\
+ bcs _08004E72\n\
+ mov r2, #0x7\n\
+ mov r12, r2\n\
+ lsr r0, r1, #3\n\
+ ldr r2, [sp, #0x4]\n\
+ add r3, r0, #0\n\
+ mul r3, r2\n\
+ add r7, r3, #0\n\
+ mov r3, r12\n\
+ and r1, r3\n\
+ lsl r6, r1, #2\n\
_08004E38:\n\
- add r3, r5, #0\n\
- mov r0, #0xF\n\
- and r3, r0\n\
- cmp r3, #0\n\
- beq _08004E6A\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r0, #0xF\n\
+ and r3, r0\n\
+ cmp r3, #0\n\
+ beq _08004E6A\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_08004E6A:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _08004E38\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _08004E38\n\
_08004E72:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0xC]\n\
- cmp r1, r2\n\
- bcc _08004E14\n\
- b _080052AA\n\
- .pool\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0xC]\n\
+ cmp r1, r2\n\
+ bcc _08004E14\n\
+ b _080052AA\n\
+ .pool\n\
_08004E84:\n\
- mov r1, r8\n\
- str r3, [sp, #0x14]\n\
- ldr r3, [sp]\n\
- add r3, r4\n\
- mov r12, r3\n\
- add r2, r1, #0\n\
- add r2, #0x8\n\
- str r2, [sp, #0x18]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x1C]\n\
- mov r2, r12\n\
- str r2, [sp, #0x74]\n\
- ldr r3, [sp, #0x18]\n\
- str r3, [sp, #0x88]\n\
- sub r0, #0x8\n\
- str r0, [sp, #0x80]\n\
- cmp r1, r3\n\
- bcs _08004F0E\n\
+ mov r1, r8\n\
+ str r3, [sp, #0x14]\n\
+ ldr r3, [sp]\n\
+ add r3, r4\n\
+ mov r12, r3\n\
+ add r2, r1, #0\n\
+ add r2, #0x8\n\
+ str r2, [sp, #0x18]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x1C]\n\
+ mov r2, r12\n\
+ str r2, [sp, #0x74]\n\
+ ldr r3, [sp, #0x18]\n\
+ str r3, [sp, #0x88]\n\
+ sub r0, #0x8\n\
+ str r0, [sp, #0x80]\n\
+ cmp r1, r3\n\
+ bcs _08004F0E\n\
_08004EA8:\n\
- ldr r0, [sp, #0x14]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x14]\n\
- ldr r4, [sp, #0x1C]\n\
- add r2, r1, #0x1\n\
- mov r8, r2\n\
- cmp r4, r12\n\
- bcs _08004F06\n\
- mov r3, #0x7\n\
- mov r10, r3\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r10\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x14]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x14]\n\
+ ldr r4, [sp, #0x1C]\n\
+ add r2, r1, #0x1\n\
+ mov r8, r2\n\
+ cmp r4, r12\n\
+ bcs _08004F06\n\
+ mov r3, #0x7\n\
+ mov r10, r3\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r10\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_08004ECC:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _08004EFE\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r10\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _08004EFE\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r10\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_08004EFE:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r12\n\
- bcc _08004ECC\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r12\n\
+ bcc _08004ECC\n\
_08004F06:\n\
- mov r1, r8\n\
- ldr r2, [sp, #0x18]\n\
- cmp r1, r2\n\
- bcc _08004EA8\n\
+ mov r1, r8\n\
+ ldr r2, [sp, #0x18]\n\
+ cmp r1, r2\n\
+ bcc _08004EA8\n\
_08004F0E:\n\
- ldr r1, [sp, #0x88]\n\
- ldr r3, =gUnknown_03002FD0\n\
- str r3, [sp, #0x20]\n\
- ldr r0, [sp, #0x74]\n\
- mov r8, r0\n\
- ldr r2, [sp, #0x80]\n\
- add r2, r1, r2\n\
- str r2, [sp, #0x24]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x28]\n\
- cmp r1, r2\n\
- bcc _08004F28\n\
- b _080052AA\n\
+ ldr r1, [sp, #0x88]\n\
+ ldr r3, =gUnknown_03002FD0\n\
+ str r3, [sp, #0x20]\n\
+ ldr r0, [sp, #0x74]\n\
+ mov r8, r0\n\
+ ldr r2, [sp, #0x80]\n\
+ add r2, r1, r2\n\
+ str r2, [sp, #0x24]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x28]\n\
+ cmp r1, r2\n\
+ bcc _08004F28\n\
+ b _080052AA\n\
_08004F28:\n\
- ldr r0, [sp, #0x20]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x20]\n\
- ldr r4, [sp, #0x28]\n\
- add r2, r1, #0x1\n\
- mov r10, r2\n\
- cmp r4, r8\n\
- bcs _08004F86\n\
- mov r3, #0x7\n\
- mov r12, r3\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x20]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x20]\n\
+ ldr r4, [sp, #0x28]\n\
+ add r2, r1, #0x1\n\
+ mov r10, r2\n\
+ cmp r4, r8\n\
+ bcs _08004F86\n\
+ mov r3, #0x7\n\
+ mov r12, r3\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_08004F4C:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _08004F7E\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _08004F7E\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_08004F7E:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _08004F4C\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _08004F4C\n\
_08004F86:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x24]\n\
- cmp r1, r2\n\
- bcc _08004F28\n\
- b _080052AA\n\
- .pool\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x24]\n\
+ cmp r1, r2\n\
+ bcc _08004F28\n\
+ b _080052AA\n\
+ .pool\n\
_08004F94:\n\
- cmp r0, #0x8\n\
- ble _08004F9A\n\
- b _080050A4\n\
+ cmp r0, #0x8\n\
+ ble _08004F9A\n\
+ b _080050A4\n\
_08004F9A:\n\
- mov r1, r8\n\
- str r3, [sp, #0x2C]\n\
- ldr r3, [sp]\n\
- add r3, #0x8\n\
- mov r12, r3\n\
- add r0, r8\n\
- str r0, [sp, #0x30]\n\
- ldr r0, [sp]\n\
- str r0, [sp, #0x34]\n\
- ldr r2, [sp, #0x30]\n\
- str r2, [sp, #0x78]\n\
- str r3, [sp, #0x84]\n\
- sub r4, #0x8\n\
- str r4, [sp, #0x7C]\n\
- cmp r8, r2\n\
- bcs _0800501C\n\
+ mov r1, r8\n\
+ str r3, [sp, #0x2C]\n\
+ ldr r3, [sp]\n\
+ add r3, #0x8\n\
+ mov r12, r3\n\
+ add r0, r8\n\
+ str r0, [sp, #0x30]\n\
+ ldr r0, [sp]\n\
+ str r0, [sp, #0x34]\n\
+ ldr r2, [sp, #0x30]\n\
+ str r2, [sp, #0x78]\n\
+ str r3, [sp, #0x84]\n\
+ sub r4, #0x8\n\
+ str r4, [sp, #0x7C]\n\
+ cmp r8, r2\n\
+ bcs _0800501C\n\
_08004FBA:\n\
- ldr r0, [sp, #0x2C]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x2C]\n\
- ldr r4, [sp, #0x34]\n\
- add r2, r1, #0x1\n\
- mov r10, r2\n\
- cmp r4, r12\n\
- bcs _08005014\n\
- lsr r0, r1, #3\n\
- ldr r2, [sp, #0x4]\n\
- add r3, r0, #0\n\
- mul r3, r2\n\
- add r7, r3, #0\n\
- mov r3, #0x7\n\
- and r1, r3\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x2C]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x2C]\n\
+ ldr r4, [sp, #0x34]\n\
+ add r2, r1, #0x1\n\
+ mov r10, r2\n\
+ cmp r4, r12\n\
+ bcs _08005014\n\
+ lsr r0, r1, #3\n\
+ ldr r2, [sp, #0x4]\n\
+ add r3, r0, #0\n\
+ mul r3, r2\n\
+ add r7, r3, #0\n\
+ mov r3, #0x7\n\
+ and r1, r3\n\
+ lsl r6, r1, #2\n\
_08004FDA:\n\
- add r3, r5, #0\n\
- mov r0, #0xF\n\
- and r3, r0\n\
- cmp r3, #0\n\
- beq _0800500C\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, #0x7\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r0, #0xF\n\
+ and r3, r0\n\
+ cmp r3, #0\n\
+ beq _0800500C\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, #0x7\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800500C:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r12\n\
- bcc _08004FDA\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r12\n\
+ bcc _08004FDA\n\
_08005014:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x30]\n\
- cmp r1, r2\n\
- bcc _08004FBA\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x30]\n\
+ cmp r1, r2\n\
+ bcc _08004FBA\n\
_0800501C:\n\
- mov r1, r8\n\
- ldr r3, =gUnknown_03002FB0\n\
- str r3, [sp, #0x38]\n\
- ldr r0, [sp, #0x84]\n\
- ldr r2, [sp, #0x7C]\n\
- add r0, r2\n\
- mov r8, r0\n\
- ldr r3, [sp, #0x78]\n\
- str r3, [sp, #0x3C]\n\
- ldr r0, [sp, #0x84]\n\
- str r0, [sp, #0x40]\n\
- cmp r1, r3\n\
- bcc _08005038\n\
- b _080052AA\n\
+ mov r1, r8\n\
+ ldr r3, =gUnknown_03002FB0\n\
+ str r3, [sp, #0x38]\n\
+ ldr r0, [sp, #0x84]\n\
+ ldr r2, [sp, #0x7C]\n\
+ add r0, r2\n\
+ mov r8, r0\n\
+ ldr r3, [sp, #0x78]\n\
+ str r3, [sp, #0x3C]\n\
+ ldr r0, [sp, #0x84]\n\
+ str r0, [sp, #0x40]\n\
+ cmp r1, r3\n\
+ bcc _08005038\n\
+ b _080052AA\n\
_08005038:\n\
- ldr r2, [sp, #0x38]\n\
- ldm r2!, {r5}\n\
- str r2, [sp, #0x38]\n\
- ldr r4, [sp, #0x40]\n\
- add r3, r1, #0x1\n\
- mov r10, r3\n\
- cmp r4, r8\n\
- bcs _08005096\n\
- mov r0, #0x7\n\
- mov r12, r0\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r2, [sp, #0x38]\n\
+ ldm r2!, {r5}\n\
+ str r2, [sp, #0x38]\n\
+ ldr r4, [sp, #0x40]\n\
+ add r3, r1, #0x1\n\
+ mov r10, r3\n\
+ cmp r4, r8\n\
+ bcs _08005096\n\
+ mov r0, #0x7\n\
+ mov r12, r0\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_0800505C:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800508E\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800508E\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800508E:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _0800505C\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _0800505C\n\
_08005096:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x3C]\n\
- cmp r1, r2\n\
- bcc _08005038\n\
- b _080052AA\n\
- .pool\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x3C]\n\
+ cmp r1, r2\n\
+ bcc _08005038\n\
+ b _080052AA\n\
+ .pool\n\
_080050A4:\n\
- mov r1, r8\n\
- str r5, [sp, #0x44]\n\
- ldr r3, [sp]\n\
- add r3, #0x8\n\
- mov r12, r3\n\
- mov r2, r8\n\
- add r2, #0x8\n\
- str r2, [sp, #0x48]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x4C]\n\
- str r2, [sp, #0x88]\n\
- sub r0, #0x8\n\
- str r0, [sp, #0x80]\n\
- mov r0, r12\n\
- str r0, [sp, #0x84]\n\
- sub r4, #0x8\n\
- str r4, [sp, #0x7C]\n\
- cmp r8, r2\n\
- bcs _0800512C\n\
+ mov r1, r8\n\
+ str r5, [sp, #0x44]\n\
+ ldr r3, [sp]\n\
+ add r3, #0x8\n\
+ mov r12, r3\n\
+ mov r2, r8\n\
+ add r2, #0x8\n\
+ str r2, [sp, #0x48]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x4C]\n\
+ str r2, [sp, #0x88]\n\
+ sub r0, #0x8\n\
+ str r0, [sp, #0x80]\n\
+ mov r0, r12\n\
+ str r0, [sp, #0x84]\n\
+ sub r4, #0x8\n\
+ str r4, [sp, #0x7C]\n\
+ cmp r8, r2\n\
+ bcs _0800512C\n\
_080050CA:\n\
- ldr r2, [sp, #0x44]\n\
- ldm r2!, {r5}\n\
- str r2, [sp, #0x44]\n\
- ldr r4, [sp, #0x4C]\n\
- add r3, r1, #0x1\n\
- mov r10, r3\n\
- cmp r4, r12\n\
- bcs _08005124\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, #0x7\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r2, [sp, #0x44]\n\
+ ldm r2!, {r5}\n\
+ str r2, [sp, #0x44]\n\
+ ldr r4, [sp, #0x4C]\n\
+ add r3, r1, #0x1\n\
+ mov r10, r3\n\
+ cmp r4, r12\n\
+ bcs _08005124\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, #0x7\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_080050EA:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800511C\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, #0x7\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800511C\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, #0x7\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800511C:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r12\n\
- bcc _080050EA\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r12\n\
+ bcc _080050EA\n\
_08005124:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x48]\n\
- cmp r1, r2\n\
- bcc _080050CA\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x48]\n\
+ cmp r1, r2\n\
+ bcc _080050CA\n\
_0800512C:\n\
- mov r1, r8\n\
- ldr r3, =gUnknown_03002FB0\n\
- str r3, [sp, #0x50]\n\
- ldr r0, [sp, #0x84]\n\
- ldr r2, [sp, #0x7C]\n\
- add r0, r2\n\
- mov r8, r0\n\
- ldr r3, [sp, #0x88]\n\
- str r3, [sp, #0x54]\n\
- ldr r0, [sp, #0x84]\n\
- str r0, [sp, #0x58]\n\
- cmp r1, r3\n\
- bcs _080051AC\n\
+ mov r1, r8\n\
+ ldr r3, =gUnknown_03002FB0\n\
+ str r3, [sp, #0x50]\n\
+ ldr r0, [sp, #0x84]\n\
+ ldr r2, [sp, #0x7C]\n\
+ add r0, r2\n\
+ mov r8, r0\n\
+ ldr r3, [sp, #0x88]\n\
+ str r3, [sp, #0x54]\n\
+ ldr r0, [sp, #0x84]\n\
+ str r0, [sp, #0x58]\n\
+ cmp r1, r3\n\
+ bcs _080051AC\n\
_08005146:\n\
- ldr r2, [sp, #0x50]\n\
- ldm r2!, {r5}\n\
- str r2, [sp, #0x50]\n\
- ldr r4, [sp, #0x58]\n\
- add r3, r1, #0x1\n\
- mov r10, r3\n\
- cmp r4, r8\n\
- bcs _080051A4\n\
- mov r0, #0x7\n\
- mov r12, r0\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r2, [sp, #0x50]\n\
+ ldm r2!, {r5}\n\
+ str r2, [sp, #0x50]\n\
+ ldr r4, [sp, #0x58]\n\
+ add r3, r1, #0x1\n\
+ mov r10, r3\n\
+ cmp r4, r8\n\
+ bcs _080051A4\n\
+ mov r0, #0x7\n\
+ mov r12, r0\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_0800516A:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800519C\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800519C\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800519C:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _0800516A\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _0800516A\n\
_080051A4:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x54]\n\
- cmp r1, r2\n\
- bcc _08005146\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x54]\n\
+ cmp r1, r2\n\
+ bcc _08005146\n\
_080051AC:\n\
- ldr r1, [sp, #0x88]\n\
- ldr r3, =gUnknown_03002FD0\n\
- str r3, [sp, #0x5C]\n\
- ldr r0, [sp, #0x84]\n\
- mov r8, r0\n\
- ldr r2, [sp, #0x80]\n\
- add r2, r1, r2\n\
- str r2, [sp, #0x60]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x64]\n\
- cmp r1, r2\n\
- bcs _0800522A\n\
+ ldr r1, [sp, #0x88]\n\
+ ldr r3, =gUnknown_03002FD0\n\
+ str r3, [sp, #0x5C]\n\
+ ldr r0, [sp, #0x84]\n\
+ mov r8, r0\n\
+ ldr r2, [sp, #0x80]\n\
+ add r2, r1, r2\n\
+ str r2, [sp, #0x60]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x64]\n\
+ cmp r1, r2\n\
+ bcs _0800522A\n\
_080051C4:\n\
- ldr r0, [sp, #0x5C]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x5C]\n\
- ldr r4, [sp, #0x64]\n\
- add r2, r1, #0x1\n\
- mov r10, r2\n\
- cmp r4, r8\n\
- bcs _08005222\n\
- mov r3, #0x7\n\
- mov r12, r3\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x5C]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x5C]\n\
+ ldr r4, [sp, #0x64]\n\
+ add r2, r1, #0x1\n\
+ mov r10, r2\n\
+ cmp r4, r8\n\
+ bcs _08005222\n\
+ mov r3, #0x7\n\
+ mov r12, r3\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_080051E8:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800521A\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800521A\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800521A:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _080051E8\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _080051E8\n\
_08005222:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x60]\n\
- cmp r1, r2\n\
- bcc _080051C4\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x60]\n\
+ cmp r1, r2\n\
+ bcc _080051C4\n\
_0800522A:\n\
- ldr r4, [sp, #0x84]\n\
- ldr r1, [sp, #0x88]\n\
- ldr r3, =gUnknown_03002FF0\n\
- str r3, [sp, #0x68]\n\
- ldr r0, [sp, #0x7C]\n\
- add r0, r4\n\
- mov r8, r0\n\
- ldr r2, [sp, #0x80]\n\
- add r2, r1, r2\n\
- str r2, [sp, #0x6C]\n\
- str r4, [sp, #0x70]\n\
- cmp r1, r2\n\
- bcs _080052AA\n\
+ ldr r4, [sp, #0x84]\n\
+ ldr r1, [sp, #0x88]\n\
+ ldr r3, =gUnknown_03002FF0\n\
+ str r3, [sp, #0x68]\n\
+ ldr r0, [sp, #0x7C]\n\
+ add r0, r4\n\
+ mov r8, r0\n\
+ ldr r2, [sp, #0x80]\n\
+ add r2, r1, r2\n\
+ str r2, [sp, #0x6C]\n\
+ str r4, [sp, #0x70]\n\
+ cmp r1, r2\n\
+ bcs _080052AA\n\
_08005244:\n\
- ldr r3, [sp, #0x68]\n\
- ldm r3!, {r5}\n\
- str r3, [sp, #0x68]\n\
- ldr r4, [sp, #0x70]\n\
- add r0, r1, #0x1\n\
- mov r10, r0\n\
- cmp r4, r8\n\
- bcs _080052A2\n\
- mov r2, #0x7\n\
- mov r12, r2\n\
- lsr r0, r1, #3\n\
- ldr r2, [sp, #0x4]\n\
- add r3, r0, #0\n\
- mul r3, r2\n\
- add r7, r3, #0\n\
- mov r3, r12\n\
- and r1, r3\n\
- lsl r6, r1, #2\n\
+ ldr r3, [sp, #0x68]\n\
+ ldm r3!, {r5}\n\
+ str r3, [sp, #0x68]\n\
+ ldr r4, [sp, #0x70]\n\
+ add r0, r1, #0x1\n\
+ mov r10, r0\n\
+ cmp r4, r8\n\
+ bcs _080052A2\n\
+ mov r2, #0x7\n\
+ mov r12, r2\n\
+ lsr r0, r1, #3\n\
+ ldr r2, [sp, #0x4]\n\
+ add r3, r0, #0\n\
+ mul r3, r2\n\
+ add r7, r3, #0\n\
+ mov r3, r12\n\
+ and r1, r3\n\
+ lsl r6, r1, #2\n\
_08005268:\n\
- add r3, r5, #0\n\
- mov r0, #0xF\n\
- and r3, r0\n\
- cmp r3, #0\n\
- beq _0800529A\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r0, #0xF\n\
+ and r3, r0\n\
+ cmp r3, #0\n\
+ beq _0800529A\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800529A:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _08005268\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _08005268\n\
_080052A2:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x6C]\n\
- cmp r1, r2\n\
- bcc _08005244\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x6C]\n\
+ cmp r1, r2\n\
+ bcc _08005244\n\
_080052AA:\n\
- add sp, #0x8C\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\
- .pool");
+ add sp, #0x8C\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\
+ .pool");
}
void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
@@ -1981,7 +1982,7 @@ bool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter)
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
result = TRUE;
- PlaySE(5);
+ PlaySE(SE_SELECT);
}
}
return result;
@@ -1999,7 +2000,7 @@ bool16 TextPrinterWait(struct TextPrinter *textPrinter)
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
result = TRUE;
- PlaySE(5);
+ PlaySE(SE_SELECT);
}
}
return result;
@@ -2046,733 +2047,1027 @@ void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *c
}
}
}
+#ifdef NONMATCHING
+u16 RenderText(struct TextPrinter *textPrinter)
+{
+ struct TextPrinterSubStruct *r4 = &textPrinter->sub_union.sub;
+ u16 currChar;
+ s32 width;
+
+ switch (textPrinter->state) // _080057C4
+ {
+ case 0: // _080057F0
+ if ((gMain.heldKeys & (A_BUTTON | B_BUTTON)) && r4->font_type_upper)
+ textPrinter->delayCounter = 0;
+
+ if (textPrinter->delayCounter && textPrinter->text_speed) //_0800580A
+ {
+ textPrinter->delayCounter--;
+ if (gTextFlags.flag_0 && (gMain.newKeys & (A_BUTTON | B_BUTTON)))
+ {
+ r4->font_type_upper = 1;
+ textPrinter->delayCounter = 0;
+ }
+ return 3;
+ }
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED) && gTextFlags.flag_2)
+ textPrinter->delayCounter = 3;
+ else
+ textPrinter->delayCounter = textPrinter->text_speed;
+
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+
+ switch (currChar) //_0800588A
+ {
+ case 0xF8+6: //_080058B8
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->subPrinter.currentY += (gFonts[textPrinter->subPrinter.fontId].maxLetterHeight + textPrinter->subPrinter.lineSpacing);
+ return 2;
+ case 0xF8+5: //_080058DC
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 0xF8+4: //_080058E0
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ switch (currChar) // _080058F0
+ {
+ case 1: // _08005960
+ textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 2: // _08005982
+ textPrinter->subPrinter.bgColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 3: // _080059A6
+ textPrinter->subPrinter.shadowColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 4: // _080059C0
+ textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ textPrinter->subPrinter.bgColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ textPrinter->subPrinter.shadowColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 5: // _08005A0E
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 6: //_08005A12
+ r4->font_type = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 7: // _08005A0A
+ return 2;
+ case 8: // _08005A2A
+ textPrinter->delayCounter = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ textPrinter->state = 6;
+ return 2;
+ case 9: // _08005A3A
+ textPrinter->state = 1;
+ if (gTextFlags.flag_2)
+ r4->frames_visible_counter = 0;
+ return 3;
+ case 10: // _08005A58
+ textPrinter->state = 5;
+ return 3;
+ case 11: // _08005A5C
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ currChar |= *textPrinter->subPrinter.current_text_offset << 8;
+ textPrinter->subPrinter.current_text_offset++;
+ PlayBGM(currChar);
+ return 2;
+ case 16: // _08005A76
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ currChar |= (*textPrinter->subPrinter.current_text_offset << 8);
+ textPrinter->subPrinter.current_text_offset++;
+ PlaySE(currChar);
+ return 2;
+ case 13: // _08005A90
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x + *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 14: // _08005A98
+ textPrinter->subPrinter.currentY = textPrinter->subPrinter.y + *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 15: // _08005AA4
+ FillWindowPixelBuffer(textPrinter->subPrinter.windowId, textPrinter->subPrinter.bgColor | textPrinter->subPrinter.bgColor << 4);
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->subPrinter.currentY = textPrinter->subPrinter.y;
+ return 2;
+ case 23: // _08005ABE
+ m4aMPlayStop(&gMPlayInfo_BGM);
+ return 2;
+ case 24: // _08005ACC
+ m4aMPlayContinue(&gMPlayInfo_BGM);
+ return 2;
+ case 17: // _08005AD8
+ width = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ if (width > 0)
+ {
+ ClearTextSpan(textPrinter, width);
+ textPrinter->subPrinter.currentX += width;
+ return 0;
+ }
+ return 2;
+ case 18: // _08005AF2
+ textPrinter->subPrinter.currentX = *textPrinter->subPrinter.current_text_offset + textPrinter->subPrinter.x;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 19: // _08005B02
+ {
+ s32 widthHelper = *textPrinter->subPrinter.current_text_offset;
+ widthHelper += textPrinter->subPrinter.x;
+ textPrinter->subPrinter.current_text_offset++;
+ width = widthHelper - textPrinter->subPrinter.currentX;
+ if (width > 0)
+ {
+ ClearTextSpan(textPrinter, width);
+ textPrinter->subPrinter.currentX += width;
+ return 0;
+ }
+ }
+ return 2;
+ case 20: // _08005B26
+ textPrinter->minLetterSpacing = *textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 21: // _08005B36
+ textPrinter->japanese = 1;
+ return 2;
+ case 22: // _08005B3E
+ textPrinter->japanese = 0;
+ return 2;
+ case 12: // _08005B5A
+ currChar = *textPrinter->subPrinter.current_text_offset | 0x100;
+ textPrinter->subPrinter.current_text_offset++;
+ break;
+ }
+ break;
+
+ case 0xF8+3: // _08005B48
+ textPrinter->state = 2;
+ TextPrinterInitDownArrowCounters(textPrinter);
+ return 3;
+ case 0xF8+2: // _08005B4C
+ textPrinter->state = 3;
+ TextPrinterInitDownArrowCounters(textPrinter);
+ return 3;
+ case 0xF8+1: // _08005B5A
+ currChar = *textPrinter->subPrinter.current_text_offset | 0x100;
+ textPrinter->subPrinter.current_text_offset++;
+ break;
+ case 0xF8+0: // _08005B6C
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ gUnknown_03002F90[0x80] = DrawKeypadIcon(textPrinter->subPrinter.windowId, currChar, textPrinter->subPrinter.currentX, textPrinter->subPrinter.currentY);
+ textPrinter->subPrinter.currentX += gUnknown_03002F90[0x80] + textPrinter->subPrinter.letterSpacing;
+ return 0;
+ case 0xF8+7: // _08005D6C
+ return 1;
+ }
+
+ switch (r4->font_type) // _08005B90
+ {
+ case 0: // _08005BCC
+ DecompressGlyphFont0(currChar, textPrinter->japanese);
+ break;
+ case 1: // _08005BDA
+ DecompressGlyphFont1(currChar, textPrinter->japanese);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5: // _08005BE8
+ DecompressGlyphFont2(currChar, textPrinter->japanese);
+ break;
+ case 7: // _08005BF6
+ DecompressGlyphFont7(currChar, textPrinter->japanese);
+ break;
+ case 8: // _08005C04
+ DecompressGlyphFont8(currChar, textPrinter->japanese);
+ break;
+ case 6: // _08005C10
+ break;
+ }
+
+ CopyGlyphToWindow(textPrinter); // _08005C10
-__attribute__((naked))
-u16 RenderText(struct TextPrinter *textPrinter) // 80057B4
+ if (textPrinter->minLetterSpacing)
+ {
+ textPrinter->subPrinter.currentX += gUnknown_03002F90[0x80];
+ width = textPrinter->minLetterSpacing - gUnknown_03002F90[0x80];
+ if (width > 0)
+ {
+ ClearTextSpan(textPrinter, width);
+ textPrinter->subPrinter.currentX += width;
+ }
+ }
+ else // _08005C48
+ {
+ if (textPrinter->japanese)
+ textPrinter->subPrinter.currentX += (gUnknown_03002F90[0x80] + textPrinter->subPrinter.letterSpacing);
+ else
+ textPrinter->subPrinter.currentX += gUnknown_03002F90[0x80];
+ }
+ return 0;
+ case 1: // _08005C78
+ if (TextPrinterWait(textPrinter))
+ textPrinter->state = 0;
+ return 3;
+ case 2: // _08005C8C
+ if (TextPrinterWaitWithDownArrow(textPrinter))
+ {
+ FillWindowPixelBuffer(textPrinter->subPrinter.windowId, (textPrinter->subPrinter.bgColor << 4) | textPrinter->subPrinter.bgColor);
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->subPrinter.currentY = textPrinter->subPrinter.y;
+ textPrinter->state = 0;
+ }
+ return 3;
+ case 3: // _08005CB8
+ if (TextPrinterWaitWithDownArrow(textPrinter))
+ {
+ TextPrinterClearDownArrow(textPrinter);
+ textPrinter->scrollDistance = gFonts[textPrinter->subPrinter.fontId].maxLetterHeight + textPrinter->subPrinter.lineSpacing;
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->state = 4;
+ }
+ return 3;
+ case 4: // _08005CF0
+ if (textPrinter->scrollDistance)
+ {
+ int scrollSpeed = sub_8197964();
+ int speed = gWindowVerticalScrollSpeeds[scrollSpeed];
+ if (textPrinter->scrollDistance < speed)
+ {
+ ScrollWindow(textPrinter->subPrinter.windowId, 0, textPrinter->scrollDistance, textPrinter->subPrinter.bgColor << 4 | textPrinter->subPrinter.bgColor);
+ textPrinter->scrollDistance = 0;
+ }
+ else
+ {
+ ScrollWindow(textPrinter->subPrinter.windowId, 0, speed, textPrinter->subPrinter.bgColor << 4 | textPrinter->subPrinter.bgColor);
+ textPrinter->scrollDistance -= speed;
+ }
+ CopyWindowToVram(textPrinter->subPrinter.windowId, 2);
+ }
+ else
+ {
+ textPrinter->state = 0;
+ }
+ return 3;
+ case 5: // _08005D48
+ if (!IsSEPlaying())
+ textPrinter->state = 0;
+ return 3;
+ case 6: // _08005D5A
+ if (textPrinter->delayCounter != 0)
+ textPrinter->delayCounter--;
+ else
+ textPrinter->state = 0;
+ return 3;
+ }
+
+ return 1;
+}
+#else
+NAKED
+u16 RenderText(struct TextPrinter *textPrinter)
{
asm("push {r4-r6,lr}\n\
- add r6, r0, #0\n\
- add r4, r6, #0\n\
- add r4, #0x14\n\
- ldrb r0, [r6, #0x1C]\n\
- cmp r0, #0x6\n\
- bls _080057C4\n\
- b _08005D6C\n\
+ add r6, r0, #0\n\
+ add r4, r6, #0\n\
+ add r4, #0x14\n\
+ ldrb r0, [r6, #0x1C]\n\
+ cmp r0, #0x6\n\
+ bls _080057C4\n\
+ b _08005D6C\n\
_080057C4:\n\
- lsl r0, #2\n\
- ldr r1, =_080057D4\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ lsl r0, #2\n\
+ ldr r1, =_080057D4\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_080057D4:\n\
- .4byte _080057F0\n\
- .4byte _08005C78\n\
- .4byte _08005C8C\n\
- .4byte _08005CB8\n\
- .4byte _08005CF0\n\
- .4byte _08005D48\n\
- .4byte _08005D5A\n\
+ .4byte _080057F0\n\
+ .4byte _08005C78\n\
+ .4byte _08005C8C\n\
+ .4byte _08005CB8\n\
+ .4byte _08005CF0\n\
+ .4byte _08005D48\n\
+ .4byte _08005D5A\n\
_080057F0:\n\
- ldr r2, =gMain\n\
- ldrh r1, [r2, #0x2C]\n\
- mov r0, #0x3\n\
- and r0, r1\n\
- cmp r0, #0\n\
- beq _0800580A\n\
- ldrb r1, [r4]\n\
- mov r0, #0x10\n\
- and r0, r1\n\
- cmp r0, #0\n\
- beq _0800580A\n\
- mov r0, #0\n\
- strb r0, [r6, #0x1E]\n\
+ ldr r2, =gMain\n\
+ ldrh r1, [r2, #0x2C]\n\
+ mov r0, #0x3\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ beq _0800580A\n\
+ ldrb r1, [r4]\n\
+ mov r0, #0x10\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ beq _0800580A\n\
+ mov r0, #0\n\
+ strb r0, [r6, #0x1E]\n\
_0800580A:\n\
- ldrb r1, [r6, #0x1E]\n\
- cmp r1, #0\n\
- beq _0800584C\n\
- ldrb r0, [r6, #0x1D]\n\
- cmp r0, #0\n\
- beq _0800584C\n\
- sub r0, r1, #0x1\n\
- strb r0, [r6, #0x1E]\n\
- ldr r0, =gTextFlags\n\
- ldrb r1, [r0]\n\
- mov r0, #0x1\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005828\n\
- b _08005B56\n\
+ ldrb r1, [r6, #0x1E]\n\
+ cmp r1, #0\n\
+ beq _0800584C\n\
+ ldrb r0, [r6, #0x1D]\n\
+ cmp r0, #0\n\
+ beq _0800584C\n\
+ sub r0, r1, #0x1\n\
+ strb r0, [r6, #0x1E]\n\
+ ldr r0, =gTextFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005828\n\
+ b _08005B56\n\
_08005828:\n\
- ldrh r1, [r2, #0x2E]\n\
- mov r0, #0x3\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005834\n\
- b _08005B56\n\
+ ldrh r1, [r2, #0x2E]\n\
+ mov r0, #0x3\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005834\n\
+ b _08005B56\n\
_08005834:\n\
- ldrb r0, [r4]\n\
- mov r1, #0x10\n\
- orr r0, r1\n\
- strb r0, [r4]\n\
- mov r0, #0\n\
- strb r0, [r6, #0x1E]\n\
- b _08005B56\n\
- .pool\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x10\n\
+ orr r0, r1\n\
+ strb r0, [r4]\n\
+ mov r0, #0\n\
+ strb r0, [r6, #0x1E]\n\
+ b _08005B56\n\
+ .pool\n\
_0800584C:\n\
- ldr r0, =gBattleTypeFlags\n\
- ldr r0, [r0]\n\
- mov r1, #0x80\n\
- lsl r1, #17\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005874\n\
- ldr r0, =gTextFlags\n\
- ldrb r1, [r0]\n\
- mov r0, #0x4\n\
- and r0, r1\n\
- cmp r0, #0\n\
- beq _08005874\n\
- mov r0, #0x3\n\
- b _08005876\n\
- .pool\n\
+ ldr r0, =gBattleTypeFlags\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x80\n\
+ lsl r1, #17\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005874\n\
+ ldr r0, =gTextFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x4\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ beq _08005874\n\
+ mov r0, #0x3\n\
+ b _08005876\n\
+ .pool\n\
_08005874:\n\
- ldrb r0, [r6, #0x1D]\n\
+ ldrb r0, [r6, #0x1D]\n\
_08005876:\n\
- strb r0, [r6, #0x1E]\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- add r0, r3, #0\n\
- sub r0, #0xF8\n\
- cmp r0, #0x7\n\
- bls _0800588A\n\
- b _08005B90\n\
+ strb r0, [r6, #0x1E]\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ add r0, r3, #0\n\
+ sub r0, #0xF8\n\
+ cmp r0, #0x7\n\
+ bls _0800588A\n\
+ b _08005B90\n\
_0800588A:\n\
- lsl r0, #2\n\
- ldr r1, =_08005898\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ lsl r0, #2\n\
+ ldr r1, =_08005898\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_08005898:\n\
- .4byte _08005B6C\n\
- .4byte _08005B5A\n\
- .4byte _08005B4C\n\
- .4byte _08005B48\n\
- .4byte _080058E0\n\
- .4byte _080058DC\n\
- .4byte _080058B8\n\
- .4byte _08005D6C\n\
+ .4byte _08005B6C\n\
+ .4byte _08005B5A\n\
+ .4byte _08005B4C\n\
+ .4byte _08005B48\n\
+ .4byte _080058E0\n\
+ .4byte _080058DC\n\
+ .4byte _080058B8\n\
+ .4byte _08005D6C\n\
_080058B8:\n\
- ldrb r0, [r6, #0x6]\n\
- strb r0, [r6, #0x8]\n\
- ldrb r1, [r6, #0x5]\n\
- ldr r0, =gFonts\n\
- ldr r2, [r0]\n\
- lsl r0, r1, #1\n\
- add r0, r1\n\
- lsl r0, #2\n\
- add r0, r2\n\
- ldrb r1, [r6, #0xB]\n\
- ldrb r0, [r0, #0x5]\n\
- add r1, r0\n\
- ldrb r0, [r6, #0x9]\n\
- add r0, r1\n\
- b _08005ABA\n\
- .pool\n\
+ ldrb r0, [r6, #0x6]\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r1, [r6, #0x5]\n\
+ ldr r0, =gFonts\n\
+ ldr r2, [r0]\n\
+ lsl r0, r1, #1\n\
+ add r0, r1\n\
+ lsl r0, #2\n\
+ add r0, r2\n\
+ ldrb r1, [r6, #0xB]\n\
+ ldrb r0, [r0, #0x5]\n\
+ add r1, r0\n\
+ ldrb r0, [r6, #0x9]\n\
+ add r0, r1\n\
+ b _08005ABA\n\
+ .pool\n\
_080058DC:\n\
- ldr r0, [r6]\n\
- b _08005B30\n\
+ ldr r0, [r6]\n\
+ b _08005B30\n\
_080058E0:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- sub r0, r3, #0x1\n\
- cmp r0, #0x17\n\
- bls _080058F0\n\
- b _08005B90\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ sub r0, r3, #0x1\n\
+ cmp r0, #0x17\n\
+ bls _080058F0\n\
+ b _08005B90\n\
_080058F0:\n\
- lsl r0, #2\n\
- ldr r1, =_08005900\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ lsl r0, #2\n\
+ ldr r1, =_08005900\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_08005900:\n\
- .4byte _08005960\n\
- .4byte _08005982\n\
- .4byte _080059A6\n\
- .4byte _080059C0\n\
- .4byte _08005A0E\n\
- .4byte _08005A12\n\
- .4byte _08005A0A\n\
- .4byte _08005A2A\n\
- .4byte _08005A3A\n\
- .4byte _08005A58\n\
- .4byte _08005A5C\n\
- .4byte _08005B5A\n\
- .4byte _08005A90\n\
- .4byte _08005A98\n\
- .4byte _08005AA4\n\
- .4byte _08005A76\n\
- .4byte _08005AD8\n\
- .4byte _08005AF2\n\
- .4byte _08005B02\n\
- .4byte _08005B26\n\
- .4byte _08005B36\n\
- .4byte _08005B3E\n\
- .4byte _08005ABE\n\
- .4byte _08005ACC\n\
+ .4byte _08005960 @0\n\
+ .4byte _08005982 @1\n\
+ .4byte _080059A6 @2\n\
+ .4byte _080059C0 @3\n\
+ .4byte _08005A0E @4\n\
+ .4byte _08005A12 @5\n\
+ .4byte _08005A0A @6\n\
+ .4byte _08005A2A @7\n\
+ .4byte _08005A3A @8\n\
+ .4byte _08005A58 @9\n\
+ .4byte _08005A5C @10\n\
+ .4byte _08005B5A @11\n\
+ .4byte _08005A90 @12\n\
+ .4byte _08005A98 @13\n\
+ .4byte _08005AA4 @14\n\
+ .4byte _08005A76 @15\n\
+ .4byte _08005AD8 @16\n\
+ .4byte _08005AF2 @17\n\
+ .4byte _08005B02 @18\n\
+ .4byte _08005B26 @19\n\
+ .4byte _08005B36 @20\n\
+ .4byte _08005B3E @21\n\
+ .4byte _08005ABE @22\n\
+ .4byte _08005ACC @23\n\
_08005960:\n\
- ldr r2, [r6]\n\
- ldrb r1, [r2]\n\
- lsl r1, #4\n\
- ldrb r3, [r6, #0xC]\n\
- mov r0, #0xF\n\
- and r0, r3\n\
- orr r0, r1\n\
- strb r0, [r6, #0xC]\n\
- add r2, #0x1\n\
- str r2, [r6]\n\
- lsl r0, #24\n\
- lsr r0, #28\n\
- ldrb r2, [r6, #0xD]\n\
- lsl r1, r2, #28\n\
- lsr r1, #28\n\
- lsr r2, #4\n\
- b _08005A06\n\
+ ldr r2, [r6]\n\
+ ldrb r1, [r2]\n\
+ lsl r1, #4\n\
+ ldrb r3, [r6, #0xC]\n\
+ mov r0, #0xF\n\
+ and r0, r3\n\
+ orr r0, r1\n\
+ strb r0, [r6, #0xC]\n\
+ add r2, #0x1\n\
+ str r2, [r6]\n\
+ lsl r0, #24\n\
+ lsr r0, #28\n\
+ ldrb r2, [r6, #0xD]\n\
+ lsl r1, r2, #28\n\
+ lsr r1, #28\n\
+ lsr r2, #4\n\
+ b _08005A06\n\
_08005982:\n\
- ldr r1, [r6]\n\
- ldrb r2, [r1]\n\
- mov r0, #0xF\n\
- and r0, r2\n\
- ldrb r3, [r6, #0xD]\n\
- mov r2, #0x10\n\
- neg r2, r2\n\
- and r2, r3\n\
- orr r2, r0\n\
- strb r2, [r6, #0xD]\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r6, #0xC]\n\
- lsr r0, #4\n\
- lsl r1, r2, #28\n\
- lsr r1, #28\n\
- lsr r2, #4\n\
- b _08005A06\n\
+ ldr r1, [r6]\n\
+ ldrb r2, [r1]\n\
+ mov r0, #0xF\n\
+ and r0, r2\n\
+ ldrb r3, [r6, #0xD]\n\
+ mov r2, #0x10\n\
+ neg r2, r2\n\
+ and r2, r3\n\
+ orr r2, r0\n\
+ strb r2, [r6, #0xD]\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r6, #0xC]\n\
+ lsr r0, #4\n\
+ lsl r1, r2, #28\n\
+ lsr r1, #28\n\
+ lsr r2, #4\n\
+ b _08005A06\n\
_080059A6:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r1]\n\
- lsl r0, #4\n\
- ldrb r3, [r6, #0xD]\n\
- mov r2, #0xF\n\
- and r2, r3\n\
- orr r2, r0\n\
- strb r2, [r6, #0xD]\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r6, #0xC]\n\
- lsr r0, #4\n\
- b _080059FE\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r1]\n\
+ lsl r0, #4\n\
+ ldrb r3, [r6, #0xD]\n\
+ mov r2, #0xF\n\
+ and r2, r3\n\
+ orr r2, r0\n\
+ strb r2, [r6, #0xD]\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r6, #0xC]\n\
+ lsr r0, #4\n\
+ b _080059FE\n\
_080059C0:\n\
- ldr r3, [r6]\n\
- ldrb r1, [r3]\n\
- lsl r1, #4\n\
- ldrb r4, [r6, #0xC]\n\
- mov r2, #0xF\n\
- add r0, r2, #0\n\
- and r0, r4\n\
- orr r0, r1\n\
- strb r0, [r6, #0xC]\n\
- add r5, r3, #0x1\n\
- str r5, [r6]\n\
- ldrb r3, [r3, #0x1]\n\
- add r1, r2, #0\n\
- and r1, r3\n\
- ldrb r4, [r6, #0xD]\n\
- mov r3, #0x10\n\
- neg r3, r3\n\
- and r3, r4\n\
- orr r3, r1\n\
- strb r3, [r6, #0xD]\n\
- add r4, r5, #0x1\n\
- str r4, [r6]\n\
- ldrb r1, [r5, #0x1]\n\
- lsl r1, #4\n\
- and r2, r3\n\
- orr r2, r1\n\
- strb r2, [r6, #0xD]\n\
- add r4, #0x1\n\
- str r4, [r6]\n\
- lsl r0, #24\n\
- lsr r0, #28\n\
+ ldr r3, [r6]\n\
+ ldrb r1, [r3]\n\
+ lsl r1, #4\n\
+ ldrb r4, [r6, #0xC]\n\
+ mov r2, #0xF\n\
+ add r0, r2, #0\n\
+ and r0, r4\n\
+ orr r0, r1\n\
+ strb r0, [r6, #0xC]\n\
+ add r5, r3, #0x1\n\
+ str r5, [r6]\n\
+ ldrb r3, [r3, #0x1]\n\
+ add r1, r2, #0\n\
+ and r1, r3\n\
+ ldrb r4, [r6, #0xD]\n\
+ mov r3, #0x10\n\
+ neg r3, r3\n\
+ and r3, r4\n\
+ orr r3, r1\n\
+ strb r3, [r6, #0xD]\n\
+ add r4, r5, #0x1\n\
+ str r4, [r6]\n\
+ ldrb r1, [r5, #0x1]\n\
+ lsl r1, #4\n\
+ and r2, r3\n\
+ orr r2, r1\n\
+ strb r2, [r6, #0xD]\n\
+ add r4, #0x1\n\
+ str r4, [r6]\n\
+ lsl r0, #24\n\
+ lsr r0, #28\n\
_080059FE:\n\
- lsl r1, r2, #28\n\
- lsr r1, #28\n\
- lsl r2, #24\n\
- lsr r2, #28\n\
+ lsl r1, r2, #28\n\
+ lsr r1, #28\n\
+ lsl r2, #24\n\
+ lsr r2, #28\n\
_08005A06:\n\
- bl GenerateFontHalfRowLookupTable\n\
+ bl GenerateFontHalfRowLookupTable\n\
_08005A0A:\n\
- mov r0, #0x2\n\
- b _08005D6E\n\
+ mov r0, #0x2\n\
+ b _08005D6E\n\
_08005A0E:\n\
- ldr r0, [r6]\n\
- b _08005B30\n\
+ ldr r0, [r6]\n\
+ b _08005B30\n\
_08005A12:\n\
- ldr r0, [r6]\n\
- ldrb r0, [r0]\n\
- mov r1, #0xF\n\
- and r1, r0\n\
- ldrb r2, [r4]\n\
- mov r0, #0x10\n\
- neg r0, r0\n\
- and r0, r2\n\
- orr r0, r1\n\
- strb r0, [r4]\n\
- ldr r0, [r6]\n\
- b _08005B30\n\
+ ldr r0, [r6]\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0xF\n\
+ and r1, r0\n\
+ ldrb r2, [r4]\n\
+ mov r0, #0x10\n\
+ neg r0, r0\n\
+ and r0, r2\n\
+ orr r0, r1\n\
+ strb r0, [r4]\n\
+ ldr r0, [r6]\n\
+ b _08005B30\n\
_08005A2A:\n\
- ldr r0, [r6]\n\
- ldrb r1, [r0]\n\
- strb r1, [r6, #0x1E]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- mov r0, #0x6\n\
- strb r0, [r6, #0x1C]\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r1, [r0]\n\
+ strb r1, [r6, #0x1E]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ mov r0, #0x6\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005A0A\n\
_08005A3A:\n\
- mov r0, #0x1\n\
- strb r0, [r6, #0x1C]\n\
- ldr r0, =gTextFlags\n\
- ldrb r1, [r0]\n\
- mov r0, #0x4\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005A4C\n\
- b _08005B56\n\
+ mov r0, #0x1\n\
+ strb r0, [r6, #0x1C]\n\
+ ldr r0, =gTextFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x4\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005A4C\n\
+ b _08005B56\n\
_08005A4C:\n\
- mov r0, #0\n\
- strb r0, [r4, #0x2]\n\
- b _08005B56\n\
- .pool\n\
+ mov r0, #0\n\
+ strb r0, [r4, #0x2]\n\
+ b _08005B56\n\
+ .pool\n\
_08005A58:\n\
- mov r0, #0x5\n\
- b _08005D56\n\
+ mov r0, #0x5\n\
+ b _08005D56\n\
_08005A5C:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r1, r0, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r0, #0x1]\n\
- lsl r0, #8\n\
- orr r3, r0\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- add r0, r3, #0\n\
- bl PlayBGM\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r1, r0, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r0, #0x1]\n\
+ lsl r0, #8\n\
+ orr r3, r0\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ add r0, r3, #0\n\
+ bl PlayBGM\n\
+ b _08005A0A\n\
_08005A76:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r1, r0, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r0, #0x1]\n\
- lsl r0, #8\n\
- orr r3, r0\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- add r0, r3, #0\n\
- bl PlaySE\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r1, r0, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r0, #0x1]\n\
+ lsl r0, #8\n\
+ orr r3, r0\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ add r0, r3, #0\n\
+ bl PlaySE\n\
+ b _08005A0A\n\
_08005A90:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r1]\n\
- ldrb r3, [r6, #0x6]\n\
- b _08005AF8\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r1]\n\
+ ldrb r3, [r6, #0x6]\n\
+ b _08005AF8\n\
_08005A98:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r1]\n\
- ldrb r2, [r6, #0x7]\n\
- add r0, r2\n\
- strb r0, [r6, #0x9]\n\
- b _08005AFC\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r1]\n\
+ ldrb r2, [r6, #0x7]\n\
+ add r0, r2\n\
+ strb r0, [r6, #0x9]\n\
+ b _08005AFC\n\
_08005AA4:\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r2, [r6, #0xD]\n\
- lsl r2, #28\n\
- lsr r1, r2, #4\n\
- orr r1, r2\n\
- lsr r1, #24\n\
- bl FillWindowPixelBuffer\n\
- ldrb r0, [r6, #0x6]\n\
- strb r0, [r6, #0x8]\n\
- ldrb r0, [r6, #0x7]\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r2, [r6, #0xD]\n\
+ lsl r2, #28\n\
+ lsr r1, r2, #4\n\
+ orr r1, r2\n\
+ lsr r1, #24\n\
+ bl FillWindowPixelBuffer\n\
+ ldrb r0, [r6, #0x6]\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r0, [r6, #0x7]\n\
_08005ABA:\n\
- strb r0, [r6, #0x9]\n\
- b _08005A0A\n\
+ strb r0, [r6, #0x9]\n\
+ b _08005A0A\n\
_08005ABE:\n\
- ldr r0, =gMPlay_BGM\n\
- bl m4aMPlayStop\n\
- b _08005A0A\n\
- .pool\n\
+ ldr r0, =gMPlayInfo_BGM\n\
+ bl m4aMPlayStop\n\
+ b _08005A0A\n\
+ .pool\n\
_08005ACC:\n\
- ldr r0, =gMPlay_BGM\n\
- bl m4aMPlayContinue\n\
- b _08005A0A\n\
- .pool\n\
+ ldr r0, =gMPlayInfo_BGM\n\
+ bl m4aMPlayContinue\n\
+ b _08005A0A\n\
+ .pool\n\
_08005AD8:\n\
- ldr r0, [r6]\n\
- ldrb r4, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- cmp r4, #0\n\
- ble _08005A0A\n\
- add r0, r6, #0\n\
- add r1, r4, #0\n\
- bl ClearTextSpan\n\
- ldrb r0, [r6, #0x8]\n\
- add r0, r4\n\
- b _08005C6E\n\
+ ldr r0, [r6]\n\
+ ldrb r4, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ cmp r4, #0\n\
+ ble _08005A0A\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ bl ClearTextSpan\n\
+ ldrb r0, [r6, #0x8]\n\
+ add r0, r4\n\
+ b _08005C6E\n\
_08005AF2:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r6, #0x6]\n\
- ldrb r3, [r1]\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r6, #0x6]\n\
+ ldrb r3, [r1]\n\
_08005AF8:\n\
- add r0, r3\n\
- strb r0, [r6, #0x8]\n\
+ add r0, r3\n\
+ strb r0, [r6, #0x8]\n\
_08005AFC:\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- b _08005A0A\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ b _08005A0A\n\
_08005B02:\n\
- ldr r0, [r6]\n\
- ldrb r2, [r0]\n\
- ldrb r1, [r6, #0x6]\n\
- add r2, r1\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- ldrb r0, [r6, #0x8]\n\
- sub r4, r2, r0\n\
- cmp r4, #0\n\
- bgt _08005B18\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r2, [r0]\n\
+ ldrb r1, [r6, #0x6]\n\
+ add r2, r1\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ ldrb r0, [r6, #0x8]\n\
+ sub r4, r2, r0\n\
+ cmp r4, #0\n\
+ bgt _08005B18\n\
+ b _08005A0A\n\
_08005B18:\n\
- add r0, r6, #0\n\
- add r1, r4, #0\n\
- bl ClearTextSpan\n\
- ldrb r0, [r6, #0x8]\n\
- add r0, r4\n\
- b _08005C6E\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ bl ClearTextSpan\n\
+ ldrb r0, [r6, #0x8]\n\
+ add r0, r4\n\
+ b _08005C6E\n\
_08005B26:\n\
- ldr r0, [r6]\n\
- ldrb r2, [r0]\n\
- add r1, r6, #0\n\
- add r1, #0x20\n\
- strb r2, [r1]\n\
+ ldr r0, [r6]\n\
+ ldrb r2, [r0]\n\
+ add r1, r6, #0\n\
+ add r1, #0x20\n\
+ strb r2, [r1]\n\
_08005B30:\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- b _08005A0A\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ b _08005A0A\n\
_08005B36:\n\
- add r1, r6, #0\n\
- add r1, #0x21\n\
- mov r0, #0x1\n\
- b _08005B44\n\
+ add r1, r6, #0\n\
+ add r1, #0x21\n\
+ mov r0, #0x1\n\
+ b _08005B44\n\
_08005B3E:\n\
- add r1, r6, #0\n\
- add r1, #0x21\n\
- mov r0, #0\n\
+ add r1, r6, #0\n\
+ add r1, #0x21\n\
+ mov r0, #0\n\
_08005B44:\n\
- strb r0, [r1]\n\
- b _08005A0A\n\
+ strb r0, [r1]\n\
+ b _08005A0A\n\
_08005B48:\n\
- mov r0, #0x2\n\
- b _08005B4E\n\
+ mov r0, #0x2\n\
+ b _08005B4E\n\
_08005B4C:\n\
- mov r0, #0x3\n\
+ mov r0, #0x3\n\
_08005B4E:\n\
- strb r0, [r6, #0x1C]\n\
- add r0, r6, #0\n\
- bl TextPrinterInitDownArrowCounters\n\
+ strb r0, [r6, #0x1C]\n\
+ add r0, r6, #0\n\
+ bl TextPrinterInitDownArrowCounters\n\
_08005B56:\n\
- mov r0, #0x3\n\
- b _08005D6E\n\
+ mov r0, #0x3\n\
+ b _08005D6E\n\
_08005B5A:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- mov r2, #0x80\n\
- lsl r2, #1\n\
- add r1, r2, #0\n\
- orr r3, r1\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- b _08005B90\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ mov r2, #0x80\n\
+ lsl r2, #1\n\
+ add r1, r2, #0\n\
+ orr r3, r1\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ b _08005B90\n\
_08005B6C:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- ldrb r0, [r6, #0x4]\n\
- add r1, r3, #0\n\
- ldrb r2, [r6, #0x8]\n\
- ldrb r3, [r6, #0x9]\n\
- bl DrawKeypadIcon\n\
- ldr r1, =gUnknown_03002F90\n\
- add r1, #0x80\n\
- strb r0, [r1]\n\
- ldrb r3, [r6, #0xA]\n\
- add r0, r3\n\
- b _08005C6A\n\
- .pool\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ ldrb r0, [r6, #0x4]\n\
+ add r1, r3, #0\n\
+ ldrb r2, [r6, #0x8]\n\
+ ldrb r3, [r6, #0x9]\n\
+ bl DrawKeypadIcon\n\
+ ldr r1, =gUnknown_03002F90\n\
+ add r1, #0x80\n\
+ strb r0, [r1]\n\
+ ldrb r3, [r6, #0xA]\n\
+ add r0, r3\n\
+ b _08005C6A\n\
+ .pool\n\
_08005B90:\n\
- ldr r0, [r4]\n\
- lsl r0, #28\n\
- lsr r0, #28\n\
- cmp r0, #0x8\n\
- bhi _08005C10\n\
- lsl r0, #2\n\
- ldr r1, =_08005BA8\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ ldr r0, [r4]\n\
+ lsl r0, #28\n\
+ lsr r0, #28\n\
+ cmp r0, #0x8\n\
+ bhi _08005C10\n\
+ lsl r0, #2\n\
+ ldr r1, =_08005BA8\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_08005BA8:\n\
- .4byte _08005BCC\n\
- .4byte _08005BDA\n\
- .4byte _08005BE8\n\
- .4byte _08005BE8\n\
- .4byte _08005BE8\n\
- .4byte _08005BE8\n\
- .4byte _08005C10\n\
- .4byte _08005BF6\n\
- .4byte _08005C04\n\
+ .4byte _08005BCC\n\
+ .4byte _08005BDA\n\
+ .4byte _08005BE8\n\
+ .4byte _08005BE8\n\
+ .4byte _08005BE8\n\
+ .4byte _08005BE8\n\
+ .4byte _08005C10\n\
+ .4byte _08005BF6\n\
+ .4byte _08005C04\n\
_08005BCC:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont0\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont0\n\
+ b _08005C10\n\
_08005BDA:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont1\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont1\n\
+ b _08005C10\n\
_08005BE8:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont2\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont2\n\
+ b _08005C10\n\
_08005BF6:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont7\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont7\n\
+ b _08005C10\n\
_08005C04:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont8\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont8\n\
_08005C10:\n\
- add r0, r6, #0\n\
- bl CopyGlyphToWindow\n\
- add r2, r6, #0\n\
- add r2, #0x20\n\
- ldrb r0, [r2]\n\
- cmp r0, #0\n\
- beq _08005C48\n\
- ldr r1, =gUnknown_03002F90\n\
- add r1, #0x80\n\
- ldrb r0, [r1]\n\
- ldrb r3, [r6, #0x8]\n\
- add r0, r3\n\
- strb r0, [r6, #0x8]\n\
- ldrb r2, [r2]\n\
- ldrb r0, [r1]\n\
- sub r4, r2, r0\n\
- cmp r4, #0\n\
- ble _08005C70\n\
- add r0, r6, #0\n\
- add r1, r4, #0\n\
- bl ClearTextSpan\n\
- ldrb r0, [r6, #0x8]\n\
- add r0, r4\n\
- b _08005C6E\n\
- .pool\n\
+ add r0, r6, #0\n\
+ bl CopyGlyphToWindow\n\
+ add r2, r6, #0\n\
+ add r2, #0x20\n\
+ ldrb r0, [r2]\n\
+ cmp r0, #0\n\
+ beq _08005C48\n\
+ ldr r1, =gUnknown_03002F90\n\
+ add r1, #0x80\n\
+ ldrb r0, [r1]\n\
+ ldrb r3, [r6, #0x8]\n\
+ add r0, r3\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r2, [r2]\n\
+ ldrb r0, [r1]\n\
+ sub r4, r2, r0\n\
+ cmp r4, #0\n\
+ ble _08005C70\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ bl ClearTextSpan\n\
+ ldrb r0, [r6, #0x8]\n\
+ add r0, r4\n\
+ b _08005C6E\n\
+ .pool\n\
_08005C48:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r0, [r0]\n\
- cmp r0, #0\n\
- beq _08005C64\n\
- ldr r0, =gUnknown_03002F90\n\
- add r0, #0x80\n\
- ldrb r1, [r6, #0xA]\n\
- ldrb r0, [r0]\n\
- add r1, r0\n\
- ldrb r0, [r6, #0x8]\n\
- b _08005C6C\n\
- .pool\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq _08005C64\n\
+ ldr r0, =gUnknown_03002F90\n\
+ add r0, #0x80\n\
+ ldrb r1, [r6, #0xA]\n\
+ ldrb r0, [r0]\n\
+ add r1, r0\n\
+ ldrb r0, [r6, #0x8]\n\
+ b _08005C6C\n\
+ .pool\n\
_08005C64:\n\
- ldr r0, =gUnknown_03002F90\n\
- add r0, #0x80\n\
- ldrb r0, [r0]\n\
+ ldr r0, =gUnknown_03002F90\n\
+ add r0, #0x80\n\
+ ldrb r0, [r0]\n\
_08005C6A:\n\
- ldrb r1, [r6, #0x8]\n\
+ ldrb r1, [r6, #0x8]\n\
_08005C6C:\n\
- add r0, r1\n\
+ add r0, r1\n\
_08005C6E:\n\
- strb r0, [r6, #0x8]\n\
+ strb r0, [r6, #0x8]\n\
_08005C70:\n\
- mov r0, #0\n\
- b _08005D6E\n\
- .pool\n\
+ mov r0, #0\n\
+ b _08005D6E\n\
+ .pool\n\
_08005C78:\n\
- add r0, r6, #0\n\
- bl TextPrinterWait\n\
- lsl r0, #16\n\
- cmp r0, #0\n\
- bne _08005C86\n\
- b _08005B56\n\
+ add r0, r6, #0\n\
+ bl TextPrinterWait\n\
+ lsl r0, #16\n\
+ cmp r0, #0\n\
+ bne _08005C86\n\
+ b _08005B56\n\
_08005C86:\n\
- mov r0, #0\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
+ mov r0, #0\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005C8C:\n\
- add r0, r6, #0\n\
- bl TextPrinterWaitWithDownArrow\n\
- lsl r0, #16\n\
- cmp r0, #0\n\
- bne _08005C9A\n\
- b _08005B56\n\
+ add r0, r6, #0\n\
+ bl TextPrinterWaitWithDownArrow\n\
+ lsl r0, #16\n\
+ cmp r0, #0\n\
+ bne _08005C9A\n\
+ b _08005B56\n\
_08005C9A:\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r2, [r6, #0xD]\n\
- lsl r2, #28\n\
- lsr r1, r2, #4\n\
- orr r1, r2\n\
- lsr r1, #24\n\
- bl FillWindowPixelBuffer\n\
- ldrb r0, [r6, #0x6]\n\
- mov r1, #0\n\
- strb r0, [r6, #0x8]\n\
- ldrb r0, [r6, #0x7]\n\
- strb r0, [r6, #0x9]\n\
- strb r1, [r6, #0x1C]\n\
- b _08005B56\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r2, [r6, #0xD]\n\
+ lsl r2, #28\n\
+ lsr r1, r2, #4\n\
+ orr r1, r2\n\
+ lsr r1, #24\n\
+ bl FillWindowPixelBuffer\n\
+ ldrb r0, [r6, #0x6]\n\
+ mov r1, #0\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r0, [r6, #0x7]\n\
+ strb r0, [r6, #0x9]\n\
+ strb r1, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005CB8:\n\
- add r0, r6, #0\n\
- bl TextPrinterWaitWithDownArrow\n\
- lsl r0, #16\n\
- cmp r0, #0\n\
- bne _08005CC6\n\
- b _08005B56\n\
+ add r0, r6, #0\n\
+ bl TextPrinterWaitWithDownArrow\n\
+ lsl r0, #16\n\
+ cmp r0, #0\n\
+ bne _08005CC6\n\
+ b _08005B56\n\
_08005CC6:\n\
- add r0, r6, #0\n\
- bl TextPrinterClearDownArrow\n\
- ldrb r1, [r6, #0x5]\n\
- ldr r0, =gFonts\n\
- ldr r2, [r0]\n\
- lsl r0, r1, #1\n\
- add r0, r1\n\
- lsl r0, #2\n\
- add r0, r2\n\
- ldrb r1, [r6, #0xB]\n\
- ldrb r0, [r0, #0x5]\n\
- add r1, r0\n\
- strb r1, [r6, #0x1F]\n\
- ldrb r0, [r6, #0x6]\n\
- strb r0, [r6, #0x8]\n\
- mov r0, #0x4\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
- .pool\n\
+ add r0, r6, #0\n\
+ bl TextPrinterClearDownArrow\n\
+ ldrb r1, [r6, #0x5]\n\
+ ldr r0, =gFonts\n\
+ ldr r2, [r0]\n\
+ lsl r0, r1, #1\n\
+ add r0, r1\n\
+ lsl r0, #2\n\
+ add r0, r2\n\
+ ldrb r1, [r6, #0xB]\n\
+ ldrb r0, [r0, #0x5]\n\
+ add r1, r0\n\
+ strb r1, [r6, #0x1F]\n\
+ ldrb r0, [r6, #0x6]\n\
+ strb r0, [r6, #0x8]\n\
+ mov r0, #0x4\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
+ .pool\n\
_08005CF0:\n\
- ldrb r0, [r6, #0x1F]\n\
- cmp r0, #0\n\
- beq _08005D44\n\
- bl sub_8197964\n\
- ldr r1, =gWindowVerticalScrollSpeeds\n\
- add r0, r1\n\
- ldrb r4, [r0]\n\
- ldrb r2, [r6, #0x1F]\n\
- cmp r2, r4\n\
- bge _08005D20\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r1, [r6, #0xD]\n\
- lsl r1, #28\n\
- lsr r3, r1, #4\n\
- orr r3, r1\n\
- lsr r3, #24\n\
- mov r1, #0\n\
- bl ScrollWindow\n\
- mov r0, #0\n\
- b _08005D38\n\
- .pool\n\
+ ldrb r0, [r6, #0x1F]\n\
+ cmp r0, #0\n\
+ beq _08005D44\n\
+ bl sub_8197964\n\
+ ldr r1, =gWindowVerticalScrollSpeeds\n\
+ add r0, r1\n\
+ ldrb r4, [r0]\n\
+ ldrb r2, [r6, #0x1F]\n\
+ cmp r2, r4\n\
+ bge _08005D20\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r1, [r6, #0xD]\n\
+ lsl r1, #28\n\
+ lsr r3, r1, #4\n\
+ orr r3, r1\n\
+ lsr r3, #24\n\
+ mov r1, #0\n\
+ bl ScrollWindow\n\
+ mov r0, #0\n\
+ b _08005D38\n\
+ .pool\n\
_08005D20:\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r1, [r6, #0xD]\n\
- lsl r1, #28\n\
- lsr r3, r1, #4\n\
- orr r3, r1\n\
- lsr r3, #24\n\
- mov r1, #0\n\
- add r2, r4, #0\n\
- bl ScrollWindow\n\
- ldrb r0, [r6, #0x1F]\n\
- sub r0, r4\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r1, [r6, #0xD]\n\
+ lsl r1, #28\n\
+ lsr r3, r1, #4\n\
+ orr r3, r1\n\
+ lsr r3, #24\n\
+ mov r1, #0\n\
+ add r2, r4, #0\n\
+ bl ScrollWindow\n\
+ ldrb r0, [r6, #0x1F]\n\
+ sub r0, r4\n\
_08005D38:\n\
- strb r0, [r6, #0x1F]\n\
- ldrb r0, [r6, #0x4]\n\
- mov r1, #0x2\n\
- bl CopyWindowToVram\n\
- b _08005B56\n\
+ strb r0, [r6, #0x1F]\n\
+ ldrb r0, [r6, #0x4]\n\
+ mov r1, #0x2\n\
+ bl CopyWindowToVram\n\
+ b _08005B56\n\
_08005D44:\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005D48:\n\
- bl IsSEPlaying\n\
- lsl r0, #24\n\
- lsr r0, #24\n\
- cmp r0, #0\n\
- beq _08005D56\n\
- b _08005B56\n\
+ bl IsSEPlaying\n\
+ lsl r0, #24\n\
+ lsr r0, #24\n\
+ cmp r0, #0\n\
+ beq _08005D56\n\
+ b _08005B56\n\
_08005D56:\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005D5A:\n\
- ldrb r0, [r6, #0x1E]\n\
- add r1, r0, #0\n\
- cmp r1, #0\n\
- beq _08005D68\n\
- sub r0, #0x1\n\
- strb r0, [r6, #0x1E]\n\
- b _08005B56\n\
+ ldrb r0, [r6, #0x1E]\n\
+ add r1, r0, #0\n\
+ cmp r1, #0\n\
+ beq _08005D68\n\
+ sub r0, #0x1\n\
+ strb r0, [r6, #0x1E]\n\
+ b _08005B56\n\
_08005D68:\n\
- strb r1, [r6, #0x1C]\n\
- b _08005B56\n\
+ strb r1, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005D6C:\n\
- mov r0, #0x1\n\
+ mov r0, #0x1\n\
_08005D6E:\n\
- pop {r4-r6}\n\
- pop {r1}\n\
- bx r1");
+ pop {r4-r6}\n\
+ pop {r1}\n\
+ bx r1\n");
}
+#endif
u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
{
@@ -2862,7 +3157,7 @@ u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
width = lineWidths[strPos];
}
- return (u8)(GetFontAttribute(fontId, 0) + letterSpacing) * width;
+ return (u8)(GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + letterSpacing) * width;
}
u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32)
@@ -2898,7 +3193,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
return 0;
if (letterSpacing == -1)
- localLetterSpacing = GetFontAttribute(fontId, 2);
+ localLetterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);
else
localLetterSpacing = letterSpacing;
@@ -2932,7 +3227,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
}
case 0xF7:
if (bufferPointer == NULL)
- bufferPointer = sub_81AFC74(*++str);
+ bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str);
while (*bufferPointer != 0xFF)
{
glyphWidth = func(*bufferPointer++, isJapanese);
@@ -2974,7 +3269,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
if (func == NULL)
return 0;
if (letterSpacing == -1)
- localLetterSpacing = GetFontAttribute(*str, 2);
+ localLetterSpacing = GetFontAttribute(*str, FONTATTR_LETTER_SPACING);
break;
case 0x11:
glyphWidth = *++str;
@@ -3202,28 +3497,28 @@ u8 GetFontAttribute(u8 fontId, u8 attributeId)
int result = 0;
switch (attributeId)
{
- case 0:
+ case FONTATTR_MAX_LETTER_WIDTH:
result = gFontInfos[fontId].maxLetterWidth;
break;
- case 1:
+ case FONTATTR_MAX_LETTER_HEIGHT:
result = gFontInfos[fontId].maxLetterHeight;
break;
- case 2:
+ case FONTATTR_LETTER_SPACING:
result = gFontInfos[fontId].letterSpacing;
break;
- case 3:
+ case FONTATTR_LINE_SPACING:
result = gFontInfos[fontId].lineSpacing;
break;
- case 4:
+ case FONTATTR_COLOR_LOWNIBBLE:
result = gFontInfos[fontId].fontColor_l;
break;
- case 5:
- result = gFontInfos[fontId].fontColor_h;
+ case FONTATTR_COLOR_FOREGROUND:
+ result = gFontInfos[fontId].fgColor;
break;
- case 6:
+ case FONTATTR_COLOR_BACKGROUND:
result = gFontInfos[fontId].bgColor;
break;
- case 7:
+ case FONTATTR_COLOR_SHADOW:
result = gFontInfos[fontId].shadowColor;
break;
}
diff --git a/src/text_window.c b/src/text_window.c
index 336536c04..e7e8f0ca6 100644
--- a/src/text_window.c
+++ b/src/text_window.c
@@ -3,43 +3,114 @@
#include "text_window.h"
#include "window.h"
#include "palette.h"
-
-extern u8 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset);
-extern void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette);
-
-extern const struct TilesPal gUnknown_0851021C[];
-extern const u32 gUnknown_08DDD748[];
-extern const u16 gUnknown_0851017C[];
-extern const u16 gUnknown_08DDD728[];
-
-const struct TilesPal* sub_8098758(u8 id)
+#include "bg.h"
+#include "graphics.h"
+
+// const rom data
+const u8 gTextWindowFrame1_Gfx[] = INCBIN_U8("graphics/text_window/1.4bpp");
+static const u8 sTextWindowFrame2_Gfx[] = INCBIN_U8("graphics/text_window/2.4bpp");
+static const u8 sTextWindowFrame3_Gfx[] = INCBIN_U8("graphics/text_window/3.4bpp");
+static const u8 sTextWindowFrame4_Gfx[] = INCBIN_U8("graphics/text_window/4.4bpp");
+static const u8 sTextWindowFrame5_Gfx[] = INCBIN_U8("graphics/text_window/5.4bpp");
+static const u8 sTextWindowFrame6_Gfx[] = INCBIN_U8("graphics/text_window/6.4bpp");
+static const u8 sTextWindowFrame7_Gfx[] = INCBIN_U8("graphics/text_window/7.4bpp");
+static const u8 sTextWindowFrame8_Gfx[] = INCBIN_U8("graphics/text_window/8.4bpp");
+static const u8 sTextWindowFrame9_Gfx[] = INCBIN_U8("graphics/text_window/9.4bpp");
+static const u8 sTextWindowFrame10_Gfx[] = INCBIN_U8("graphics/text_window/10.4bpp");
+static const u8 sTextWindowFrame11_Gfx[] = INCBIN_U8("graphics/text_window/11.4bpp");
+static const u8 sTextWindowFrame12_Gfx[] = INCBIN_U8("graphics/text_window/12.4bpp");
+static const u8 sTextWindowFrame13_Gfx[] = INCBIN_U8("graphics/text_window/13.4bpp");
+static const u8 sTextWindowFrame14_Gfx[] = INCBIN_U8("graphics/text_window/14.4bpp");
+static const u8 sTextWindowFrame15_Gfx[] = INCBIN_U8("graphics/text_window/15.4bpp");
+static const u8 sTextWindowFrame16_Gfx[] = INCBIN_U8("graphics/text_window/16.4bpp");
+static const u8 sTextWindowFrame17_Gfx[] = INCBIN_U8("graphics/text_window/17.4bpp");
+static const u8 sTextWindowFrame18_Gfx[] = INCBIN_U8("graphics/text_window/18.4bpp");
+static const u8 sTextWindowFrame19_Gfx[] = INCBIN_U8("graphics/text_window/19.4bpp");
+static const u8 sTextWindowFrame20_Gfx[] = INCBIN_U8("graphics/text_window/20.4bpp");
+
+const u16 gTextWindowFrame1_Pal[] = INCBIN_U16("graphics/text_window/1.gbapal");
+static const u16 sTextWindowFrame2_Pal[] = INCBIN_U16("graphics/text_window/2.gbapal");
+static const u16 sTextWindowFrame3_Pal[] = INCBIN_U16("graphics/text_window/3.gbapal");
+static const u16 sTextWindowFrame4_Pal[] = INCBIN_U16("graphics/text_window/4.gbapal");
+static const u16 sTextWindowFrame5_Pal[] = INCBIN_U16("graphics/text_window/5.gbapal");
+static const u16 sTextWindowFrame6_Pal[] = INCBIN_U16("graphics/text_window/6.gbapal");
+static const u16 sTextWindowFrame7_Pal[] = INCBIN_U16("graphics/text_window/7.gbapal");
+static const u16 sTextWindowFrame8_Pal[] = INCBIN_U16("graphics/text_window/8.gbapal");
+static const u16 sTextWindowFrame9_Pal[] = INCBIN_U16("graphics/text_window/9.gbapal");
+static const u16 sTextWindowFrame10_Pal[] = INCBIN_U16("graphics/text_window/10.gbapal");
+static const u16 sTextWindowFrame11_Pal[] = INCBIN_U16("graphics/text_window/11.gbapal");
+static const u16 sTextWindowFrame12_Pal[] = INCBIN_U16("graphics/text_window/12.gbapal");
+static const u16 sTextWindowFrame13_Pal[] = INCBIN_U16("graphics/text_window/13.gbapal");
+static const u16 sTextWindowFrame14_Pal[] = INCBIN_U16("graphics/text_window/14.gbapal");
+static const u16 sTextWindowFrame15_Pal[] = INCBIN_U16("graphics/text_window/15.gbapal");
+static const u16 sTextWindowFrame16_Pal[] = INCBIN_U16("graphics/text_window/16.gbapal");
+static const u16 sTextWindowFrame17_Pal[] = INCBIN_U16("graphics/text_window/17.gbapal");
+static const u16 sTextWindowFrame18_Pal[] = INCBIN_U16("graphics/text_window/18.gbapal");
+static const u16 sTextWindowFrame19_Pal[] = INCBIN_U16("graphics/text_window/19.gbapal");
+static const u16 sTextWindowFrame20_Pal[] = INCBIN_U16("graphics/text_window/20.gbapal");
+
+static const u16 sUnknown_0851017C[][16] =
{
- if (id > 19)
- return &gUnknown_0851021C[0];
+ INCBIN_U16("graphics/text_window/message_box.gbapal"),
+ INCBIN_U16("graphics/text_window/text_pal1.gbapal"),
+ INCBIN_U16("graphics/text_window/text_pal2.gbapal"),
+ INCBIN_U16("graphics/text_window/text_pal3.gbapal"),
+ INCBIN_U16("graphics/text_window/text_pal4.gbapal")
+};
+
+static const struct TilesPal sWindowFrames[WINDOW_FRAMES_COUNT] =
+{
+ {gTextWindowFrame1_Gfx, gTextWindowFrame1_Pal},
+ {sTextWindowFrame2_Gfx, sTextWindowFrame2_Pal},
+ {sTextWindowFrame3_Gfx, sTextWindowFrame3_Pal},
+ {sTextWindowFrame4_Gfx, sTextWindowFrame4_Pal},
+ {sTextWindowFrame5_Gfx, sTextWindowFrame5_Pal},
+ {sTextWindowFrame6_Gfx, sTextWindowFrame6_Pal},
+ {sTextWindowFrame7_Gfx, sTextWindowFrame7_Pal},
+ {sTextWindowFrame8_Gfx, sTextWindowFrame8_Pal},
+ {sTextWindowFrame9_Gfx, sTextWindowFrame9_Pal},
+ {sTextWindowFrame10_Gfx, sTextWindowFrame10_Pal},
+ {sTextWindowFrame11_Gfx, sTextWindowFrame11_Pal},
+ {sTextWindowFrame12_Gfx, sTextWindowFrame12_Pal},
+ {sTextWindowFrame13_Gfx, sTextWindowFrame13_Pal},
+ {sTextWindowFrame14_Gfx, sTextWindowFrame14_Pal},
+ {sTextWindowFrame15_Gfx, sTextWindowFrame15_Pal},
+ {sTextWindowFrame16_Gfx, sTextWindowFrame16_Pal},
+ {sTextWindowFrame17_Gfx, sTextWindowFrame17_Pal},
+ {sTextWindowFrame18_Gfx, sTextWindowFrame18_Pal},
+ {sTextWindowFrame19_Gfx, sTextWindowFrame19_Pal},
+ {sTextWindowFrame20_Gfx, sTextWindowFrame20_Pal}
+};
+
+// code
+const struct TilesPal *GetWindowFrameTilesPal(u8 id)
+{
+ if (id >= WINDOW_FRAMES_COUNT)
+ return &sWindowFrames[0];
else
- return &gUnknown_0851021C[id];
+ return &sWindowFrames[id];
}
-void copy_textbox_border_tile_patterns_to_vram(u8 windowId, u16 destOffset, u8 palOffset)
+void LoadMessageBoxGfx(u8 windowId, u16 destOffset, u8 palOffset)
{
- LoadBgTiles(GetWindowAttribute(windowId, WINDOW_PRIORITY), gUnknown_08DDD748, 0x1C0, destOffset);
+ LoadBgTiles(GetWindowAttribute(windowId, WINDOW_PRIORITY), gMessageBox_Gfx, 0x1C0, destOffset);
LoadPalette(GetOverworldTextboxPalettePtr(), palOffset, 0x20);
}
-void box_border_load_tiles_and_pal(u8 windowId, u16 destOffset, u8 palOffset)
+void LoadUserWindowBorderGfx_(u8 windowId, u16 destOffset, u8 palOffset)
{
- sub_809882C(windowId, destOffset, palOffset);
+ LoadUserWindowBorderGfx(windowId, destOffset, palOffset);
}
-void sub_80987D4(u8 windowId, u8 frameId, u16 destOffset, u8 palOffset)
+void LoadWindowGfx(u8 windowId, u8 frameId, u16 destOffset, u8 palOffset)
{
- LoadBgTiles(GetWindowAttribute(windowId, WINDOW_PRIORITY), gUnknown_0851021C[frameId].tiles, 0x120, destOffset);
- LoadPalette(gUnknown_0851021C[frameId].pal, palOffset, 0x20);
+ LoadBgTiles(GetWindowAttribute(windowId, WINDOW_PRIORITY), sWindowFrames[frameId].tiles, 0x120, destOffset);
+ LoadPalette(sWindowFrames[frameId].pal, palOffset, 0x20);
}
-void sub_809882C(u8 windowId, u16 destOffset, u8 palOffset)
+void LoadUserWindowBorderGfx(u8 windowId, u16 destOffset, u8 palOffset)
{
- sub_80987D4(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset);
+ LoadWindowGfx(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset);
}
void sub_8098858(u8 windowId, u16 tileNum, u8 palNum)
@@ -89,7 +160,7 @@ void rbox_fill_rectangle(u8 windowId)
FillBgTilemapBufferRect(bgLayer, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, 0x11);
}
-const u16* stdpal_get(u8 id)
+const u16 *stdpal_get(u8 id)
{
switch (id)
{
@@ -110,16 +181,17 @@ const u16* stdpal_get(u8 id)
id = 0x40;
break;
}
- return &gUnknown_0851017C[id];
+
+ return (const u16 *)(sUnknown_0851017C) + id;
}
-const u16* GetOverworldTextboxPalettePtr(void)
+const u16 *GetOverworldTextboxPalettePtr(void)
{
- return gUnknown_08DDD728;
+ return gMessageBox_Pal;
}
void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset)
{
- LoadBgTiles(bg, gUnknown_0851021C[gSaveBlock2Ptr->optionsWindowFrameType].tiles, 0x120, destOffset);
- LoadPalette(sub_8098758(gSaveBlock2Ptr->optionsWindowFrameType)->pal, palOffset, 0x20);
+ LoadBgTiles(bg, sWindowFrames[gSaveBlock2Ptr->optionsWindowFrameType].tiles, 0x120, destOffset);
+ LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, palOffset, 0x20);
}
diff --git a/src/tileset_anims.c b/src/tileset_anims.c
index 4ad787e1c..d05931dba 100644
--- a/src/tileset_anims.c
+++ b/src/tileset_anims.c
@@ -5,6 +5,7 @@
#include "blend_palette.h"
#include "battle_transition.h"
#include "task.h"
+#include "battle_transition.h"
// Static type declarations
@@ -32,192 +33,192 @@ static void cur_mapheader_run_tileset2_func(void);
// .rodata
-const u16 gUnknown_085105C4[] = INCBIN_U16("data/tilesets/primary/general/anim/0/1.4bpp");
+const u16 gTilesetAnims_General0_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/0/1.4bpp");
-const u16 gUnknown_08510644[] = INCBIN_U16("data/tilesets/primary/general/anim/0/0.4bpp");
+const u16 gTilesetAnims_General0_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/0/0.4bpp");
-const u16 gUnknown_085106C4[] = INCBIN_U16("data/tilesets/primary/general/anim/0/2.4bpp");
+const u16 gTilesetAnims_General0_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/0/2.4bpp");
const u16 tileset_anims_space_0[16] = {};
const u16 *const gTilesetAnims_General0[] = {
- gUnknown_08510644,
- gUnknown_085105C4,
- gUnknown_08510644,
- gUnknown_085106C4
+ gTilesetAnims_General0_Frame0,
+ gTilesetAnims_General0_Frame1,
+ gTilesetAnims_General0_Frame0,
+ gTilesetAnims_General0_Frame2
};
-const u16 gUnknown_08510774[] = INCBIN_U16("data/tilesets/primary/general/anim/1/0.4bpp");
+const u16 gTilesetAnims_General1_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/1/0.4bpp");
-const u16 gUnknown_08510B34[] = INCBIN_U16("data/tilesets/primary/general/anim/1/1.4bpp");
+const u16 gTilesetAnims_General1_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/1/1.4bpp");
-const u16 gUnknown_08510EF4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/2.4bpp");
+const u16 gTilesetAnims_General1_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/1/2.4bpp");
-const u16 gUnknown_085112B4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/3.4bpp");
+const u16 gTilesetAnims_General1_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/1/3.4bpp");
-const u16 gUnknown_08511674[] = INCBIN_U16("data/tilesets/primary/general/anim/1/4.4bpp");
+const u16 gTilesetAnims_General1_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/4.4bpp");
-const u16 gUnknown_08511A34[] = INCBIN_U16("data/tilesets/primary/general/anim/1/5.4bpp");
+const u16 gTilesetAnims_General1_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/1/5.4bpp");
-const u16 gUnknown_08511DF4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/6.4bpp");
+const u16 gTilesetAnims_General1_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/1/6.4bpp");
-const u16 gUnknown_085121B4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/7.4bpp");
+const u16 gTilesetAnims_General1_Frame7[] = INCBIN_U16("data/tilesets/primary/general/anim/1/7.4bpp");
const u16 *const gTilesetAnims_General1[] = {
- gUnknown_08510774,
- gUnknown_08510B34,
- gUnknown_08510EF4,
- gUnknown_085112B4,
- gUnknown_08511674,
- gUnknown_08511A34,
- gUnknown_08511DF4,
- gUnknown_085121B4
+ gTilesetAnims_General1_Frame0,
+ gTilesetAnims_General1_Frame1,
+ gTilesetAnims_General1_Frame2,
+ gTilesetAnims_General1_Frame3,
+ gTilesetAnims_General1_Frame4,
+ gTilesetAnims_General1_Frame5,
+ gTilesetAnims_General1_Frame6,
+ gTilesetAnims_General1_Frame7
};
-const u16 gUnknown_08512594[] = INCBIN_U16("data/tilesets/primary/general/anim/2/0.4bpp");
+const u16 gTilesetAnims_General2_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/2/0.4bpp");
-const u16 gUnknown_085126D4[] = INCBIN_U16("data/tilesets/primary/general/anim/2/1.4bpp");
+const u16 gTilesetAnims_General2_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/2/1.4bpp");
-const u16 gUnknown_08512814[] = INCBIN_U16("data/tilesets/primary/general/anim/2/2.4bpp");
+const u16 gTilesetAnims_General2_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/2/2.4bpp");
-const u16 gUnknown_08512954[] = INCBIN_U16("data/tilesets/primary/general/anim/2/3.4bpp");
+const u16 gTilesetAnims_General2_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/2/3.4bpp");
-const u16 gUnknown_08512A94[] = INCBIN_U16("data/tilesets/primary/general/anim/2/4.4bpp");
+const u16 gTilesetAnims_General2_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/2/4.4bpp");
-const u16 gUnknown_08512BD4[] = INCBIN_U16("data/tilesets/primary/general/anim/2/5.4bpp");
+const u16 gTilesetAnims_General2_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/2/5.4bpp");
-const u16 gUnknown_08512D14[] = INCBIN_U16("data/tilesets/primary/general/anim/2/6.4bpp");
+const u16 gTilesetAnims_General2_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/2/6.4bpp");
const u16 *const gTilesetAnims_General2[] = {
- gUnknown_08512594,
- gUnknown_085126D4,
- gUnknown_08512814,
- gUnknown_08512954,
- gUnknown_08512A94,
- gUnknown_08512BD4,
- gUnknown_08512D14,
- gUnknown_08512594
+ gTilesetAnims_General2_Frame0,
+ gTilesetAnims_General2_Frame1,
+ gTilesetAnims_General2_Frame2,
+ gTilesetAnims_General2_Frame3,
+ gTilesetAnims_General2_Frame4,
+ gTilesetAnims_General2_Frame5,
+ gTilesetAnims_General2_Frame6,
+ gTilesetAnims_General2_Frame0
};
-const u16 gUnknown_08512E74[] = INCBIN_U16("data/tilesets/primary/general/anim/3/0.4bpp");
+const u16 gTilesetAnims_General3_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/3/0.4bpp");
-const u16 gUnknown_08512F34[] = INCBIN_U16("data/tilesets/primary/general/anim/3/1.4bpp");
+const u16 gTilesetAnims_General3_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/3/1.4bpp");
-const u16 gUnknown_08512FF4[] = INCBIN_U16("data/tilesets/primary/general/anim/3/2.4bpp");
+const u16 gTilesetAnims_General3_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/3/2.4bpp");
-const u16 gUnknown_085130B4[] = INCBIN_U16("data/tilesets/primary/general/anim/3/3.4bpp");
+const u16 gTilesetAnims_General3_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/3/3.4bpp");
const u16 *const gTilesetAnims_General3[] = {
- gUnknown_08512E74,
- gUnknown_08512F34,
- gUnknown_08512FF4,
- gUnknown_085130B4
+ gTilesetAnims_General3_Frame0,
+ gTilesetAnims_General3_Frame1,
+ gTilesetAnims_General3_Frame2,
+ gTilesetAnims_General3_Frame3
};
-const u16 gUnknown_08513184[] = INCBIN_U16("data/tilesets/primary/general/anim/4/0.4bpp");
+const u16 gTilesetAnims_General4_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/4/0.4bpp");
-const u16 gUnknown_085132C4[] = INCBIN_U16("data/tilesets/primary/general/anim/4/1.4bpp");
+const u16 gTilesetAnims_General4_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/4/1.4bpp");
-const u16 gUnknown_08513404[] = INCBIN_U16("data/tilesets/primary/general/anim/4/2.4bpp");
+const u16 gTilesetAnims_General4_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/4/2.4bpp");
-const u16 gUnknown_08513544[] = INCBIN_U16("data/tilesets/primary/general/anim/4/3.4bpp");
+const u16 gTilesetAnims_General4_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/4/3.4bpp");
const u16 *const gTilesetAnims_General4[] = {
- gUnknown_08513184,
- gUnknown_085132C4,
- gUnknown_08513404,
- gUnknown_08513544
+ gTilesetAnims_General4_Frame0,
+ gTilesetAnims_General4_Frame1,
+ gTilesetAnims_General4_Frame2,
+ gTilesetAnims_General4_Frame3
};
-const u16 gUnknown_08513694[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/0.4bpp");
+const u16 gTilesetAnims_Lavaridge0_Frame0[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/0.4bpp");
-const u16 gUnknown_08513714[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/1.4bpp");
+const u16 gTilesetAnims_Lavaridge0_Frame1[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/1.4bpp");
-const u16 gUnknown_08513794[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/2.4bpp");
+const u16 gTilesetAnims_Lavaridge0_Frame2[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/2.4bpp");
-const u16 gUnknown_08513814[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/3.4bpp");
+const u16 gTilesetAnims_Lavaridge0_Frame3[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/3.4bpp");
const u16 *const gTilesetAnims_Lavaridge0[] = {
- gUnknown_08513694,
- gUnknown_08513714,
- gUnknown_08513794,
- gUnknown_08513814
+ gTilesetAnims_Lavaridge0_Frame0,
+ gTilesetAnims_Lavaridge0_Frame1,
+ gTilesetAnims_Lavaridge0_Frame2,
+ gTilesetAnims_Lavaridge0_Frame3
};
-const u16 gUnknown_085138A4[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/0.4bpp");
+const u16 gTilesetAnims_Pacifidlog0_Frame0[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/0.4bpp");
-const u16 gUnknown_08513C64[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/1.4bpp");
+const u16 gTilesetAnims_Pacifidlog0_Frame1[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/1.4bpp");
-const u16 gUnknown_08514024[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/2.4bpp");
+const u16 gTilesetAnims_Pacifidlog0_Frame2[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/2.4bpp");
const u16 *const gTilesetAnims_Pacifidlog0[] = {
- gUnknown_085138A4,
- gUnknown_08513C64,
- gUnknown_08514024,
- gUnknown_08513C64
+ gTilesetAnims_Pacifidlog0_Frame0,
+ gTilesetAnims_Pacifidlog0_Frame1,
+ gTilesetAnims_Pacifidlog0_Frame2,
+ gTilesetAnims_Pacifidlog0_Frame1
};
-const u16 gUnknown_085143F4[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/0.4bpp");
+const u16 gTilesetAnims_Underwater0_Frame0[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/0.4bpp");
-const u16 gUnknown_08514474[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/1.4bpp");
+const u16 gTilesetAnims_Underwater0_Frame1[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/1.4bpp");
-const u16 gUnknown_085144F4[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/2.4bpp");
+const u16 gTilesetAnims_Underwater0_Frame2[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/2.4bpp");
-const u16 gUnknown_08514574[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/3.4bpp");
+const u16 gTilesetAnims_Underwater0_Frame3[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/3.4bpp");
const u16 *const gTilesetAnims_Underwater0[] = {
- gUnknown_085143F4,
- gUnknown_08514474,
- gUnknown_085144F4,
- gUnknown_08514574
+ gTilesetAnims_Underwater0_Frame0,
+ gTilesetAnims_Underwater0_Frame1,
+ gTilesetAnims_Underwater0_Frame2,
+ gTilesetAnims_Underwater0_Frame3
};
-const u16 gUnknown_08514604[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/0.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame0[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/0.4bpp");
-const u16 gUnknown_08514704[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/1.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame1[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/1.4bpp");
-const u16 gUnknown_08514804[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/2.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame2[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/2.4bpp");
-const u16 gUnknown_08514904[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/3.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame3[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/3.4bpp");
-const u16 gUnknown_08514A04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/4.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame4[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/4.4bpp");
-const u16 gUnknown_08514B04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/5.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame5[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/5.4bpp");
-const u16 gUnknown_08514C04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/6.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame6[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/6.4bpp");
-const u16 gUnknown_08514D04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/7.4bpp");
+const u16 gTilesetAnims_Pacifidlog1_Frame7[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/7.4bpp");
const u16 *const gTilesetAnims_Pacifidlog1[] = {
- gUnknown_08514604,
- gUnknown_08514704,
- gUnknown_08514804,
- gUnknown_08514904,
- gUnknown_08514A04,
- gUnknown_08514B04,
- gUnknown_08514C04,
- gUnknown_08514D04
+ gTilesetAnims_Pacifidlog1_Frame0,
+ gTilesetAnims_Pacifidlog1_Frame1,
+ gTilesetAnims_Pacifidlog1_Frame2,
+ gTilesetAnims_Pacifidlog1_Frame3,
+ gTilesetAnims_Pacifidlog1_Frame4,
+ gTilesetAnims_Pacifidlog1_Frame5,
+ gTilesetAnims_Pacifidlog1_Frame6,
+ gTilesetAnims_Pacifidlog1_Frame7
};
-const u16 gUnknown_08514E24[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/0.4bpp");
+const u16 gTilesetAnims_Mauville0a_Frame0[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/0.4bpp");
-const u16 gUnknown_08514EA4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/1.4bpp");
+const u16 gTilesetAnims_Mauville0a_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/1.4bpp");
-const u16 gUnknown_08514F24[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/2.4bpp");
+const u16 gTilesetAnims_Mauville0a_Frame2[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/2.4bpp");
-const u16 gUnknown_08514FA4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/3.4bpp");
+const u16 gTilesetAnims_Mauville0a_Frame3[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/3.4bpp");
-const u16 gUnknown_08515024[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/a/1.4bpp");
+const u16 gTilesetAnims_Mauville1a_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/a/1.4bpp");
-const u16 gUnknown_085150A4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/0.4bpp");
+const u16 gTilesetAnims_Mauville0b_Frame0[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/0.4bpp");
-const u16 gUnknown_08515124[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/1.4bpp");
+const u16 gTilesetAnims_Mauville0b_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/1.4bpp");
-const u16 gUnknown_085151A4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/2.4bpp");
+const u16 gTilesetAnims_Mauville0b_Frame2[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/2.4bpp");
-const u16 gUnknown_08515224[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/3.4bpp");
+const u16 gTilesetAnims_Mauville0b_Frame3[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/3.4bpp");
-const u16 gUnknown_085152A4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/b/1.4bpp");
+const u16 gTilesetAnims_Mauville1b_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/b/1.4bpp");
const u16 tileset_anims_space_1[16] = {};
@@ -244,64 +245,64 @@ u16 *const gTilesetAnims_MauvilleVDests1[] = {
};
const u16 *const gTilesetAnims_Mauville0a[] = {
- gUnknown_08514E24,
- gUnknown_08514E24,
- gUnknown_08514EA4,
- gUnknown_08514F24,
- gUnknown_08514FA4,
- gUnknown_08514FA4,
- gUnknown_08514FA4,
- gUnknown_08514FA4,
- gUnknown_08514FA4,
- gUnknown_08514FA4,
- gUnknown_08514F24,
- gUnknown_08514EA4
+ gTilesetAnims_Mauville0a_Frame0,
+ gTilesetAnims_Mauville0a_Frame0,
+ gTilesetAnims_Mauville0a_Frame1,
+ gTilesetAnims_Mauville0a_Frame2,
+ gTilesetAnims_Mauville0a_Frame3,
+ gTilesetAnims_Mauville0a_Frame3,
+ gTilesetAnims_Mauville0a_Frame3,
+ gTilesetAnims_Mauville0a_Frame3,
+ gTilesetAnims_Mauville0a_Frame3,
+ gTilesetAnims_Mauville0a_Frame3,
+ gTilesetAnims_Mauville0a_Frame2,
+ gTilesetAnims_Mauville0a_Frame1
};
const u16 *const gTilesetAnims_Mauville0b[] = {
- gUnknown_085150A4,
- gUnknown_085150A4,
- gUnknown_08515124,
- gUnknown_085151A4,
- gUnknown_08515224,
- gUnknown_08515224,
- gUnknown_08515224,
- gUnknown_08515224,
- gUnknown_08515224,
- gUnknown_08515224,
- gUnknown_085151A4,
- gUnknown_08515124
+ gTilesetAnims_Mauville0b_Frame0,
+ gTilesetAnims_Mauville0b_Frame0,
+ gTilesetAnims_Mauville0b_Frame1,
+ gTilesetAnims_Mauville0b_Frame2,
+ gTilesetAnims_Mauville0b_Frame3,
+ gTilesetAnims_Mauville0b_Frame3,
+ gTilesetAnims_Mauville0b_Frame3,
+ gTilesetAnims_Mauville0b_Frame3,
+ gTilesetAnims_Mauville0b_Frame3,
+ gTilesetAnims_Mauville0b_Frame3,
+ gTilesetAnims_Mauville0b_Frame2,
+ gTilesetAnims_Mauville0b_Frame1
};
const u16 *const gTilesetAnims_Mauville1a[] = {
- gUnknown_08514E24,
- gUnknown_08514E24,
- gUnknown_08515024,
- gUnknown_08515024
+ gTilesetAnims_Mauville0a_Frame0,
+ gTilesetAnims_Mauville0a_Frame0,
+ gTilesetAnims_Mauville1a_Frame1,
+ gTilesetAnims_Mauville1a_Frame1
};
const u16 *const gTilesetAnims_Mauville1b[] = {
- gUnknown_085150A4,
- gUnknown_085150A4,
- gUnknown_085152A4,
- gUnknown_085152A4
+ gTilesetAnims_Mauville0b_Frame0,
+ gTilesetAnims_Mauville0b_Frame0,
+ gTilesetAnims_Mauville1b_Frame1,
+ gTilesetAnims_Mauville1b_Frame1
};
-const u16 gUnknown_08515404[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/0.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame0[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/0.4bpp");
-const u16 gUnknown_08515484[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/1.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame1[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/1.4bpp");
-const u16 gUnknown_08515504[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/2.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame2[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/2.4bpp");
-const u16 gUnknown_08515584[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/3.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame3[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/3.4bpp");
-const u16 gUnknown_08515604[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/4.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame4[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/4.4bpp");
-const u16 gUnknown_08515684[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/5.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame5[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/5.4bpp");
-const u16 gUnknown_08515704[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/6.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame6[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/6.4bpp");
-const u16 gUnknown_08515784[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/7.4bpp");
+const u16 gTilesetAnims_Rustboro0_Frame7[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/7.4bpp");
u16 *const gTilesetAnims_RustboroVDests0[] = {
(u16 *)(BG_VRAM + 0x5000),
@@ -315,67 +316,67 @@ u16 *const gTilesetAnims_RustboroVDests0[] = {
};
const u16 *const gTilesetAnims_Rustboro0[] = {
- gUnknown_08515404,
- gUnknown_08515484,
- gUnknown_08515504,
- gUnknown_08515584,
- gUnknown_08515604,
- gUnknown_08515684,
- gUnknown_08515704,
- gUnknown_08515784
+ gTilesetAnims_Rustboro0_Frame0,
+ gTilesetAnims_Rustboro0_Frame1,
+ gTilesetAnims_Rustboro0_Frame2,
+ gTilesetAnims_Rustboro0_Frame3,
+ gTilesetAnims_Rustboro0_Frame4,
+ gTilesetAnims_Rustboro0_Frame5,
+ gTilesetAnims_Rustboro0_Frame6,
+ gTilesetAnims_Rustboro0_Frame7
};
-const u16 gUnknown_08515844[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/0.4bpp");
+const u16 gTilesetAnims_Rustboro1_Frame0[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/0.4bpp");
-const u16 gUnknown_085158C4[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/1.4bpp");
+const u16 gTilesetAnims_Rustboro1_Frame1[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/1.4bpp");
const u16 tileset_anims_space_2[16] = {};
const u16 *const gTilesetAnims_Rustboro1[] = {
- gUnknown_08515844,
- gUnknown_085158C4
+ gTilesetAnims_Rustboro1_Frame0,
+ gTilesetAnims_Rustboro1_Frame1
};
-const u16 gUnknown_0851596C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/0.4bpp");
+const u16 gTilesetAnims_Lavaridge1_Cave0_Frame0[] = INCBIN_U16("data/tilesets/secondary/cave/anim/0.4bpp");
-const u16 gUnknown_085159EC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/1.4bpp");
+const u16 gTilesetAnims_Lavaridge1_Cave0_Frame1[] = INCBIN_U16("data/tilesets/secondary/cave/anim/1.4bpp");
-const u16 gUnknown_08515A6C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/2.4bpp");
+const u16 gTilesetAnims_Lavaridge1_Cave0_Frame2[] = INCBIN_U16("data/tilesets/secondary/cave/anim/2.4bpp");
-const u16 gUnknown_08515AEC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/3.4bpp");
+const u16 gTilesetAnims_Lavaridge1_Cave0_Frame3[] = INCBIN_U16("data/tilesets/secondary/cave/anim/3.4bpp");
-const u16 gUnknown_08515B6C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/0.4bpp");
+const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame0[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/0.4bpp");
-const u16 gUnknown_08515BEC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/1.4bpp");
+const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame1[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/1.4bpp");
-const u16 gUnknown_08515C6C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/2.4bpp");
+const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame2[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/2.4bpp");
-const u16 gUnknown_08515CEC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/3.4bpp");
+const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame3[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/3.4bpp");
const u16 tileset_anims_space_3[16] = {};
const u16 *const gTilesetAnims_Lavaridge1_Cave0[] = {
- gUnknown_0851596C,
- gUnknown_085159EC,
- gUnknown_08515A6C,
- gUnknown_08515AEC
+ gTilesetAnims_Lavaridge1_Cave0_Frame0,
+ gTilesetAnims_Lavaridge1_Cave0_Frame1,
+ gTilesetAnims_Lavaridge1_Cave0_Frame2,
+ gTilesetAnims_Lavaridge1_Cave0_Frame3
};
-const u16 gUnknown_08515D9C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/0.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame0[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/0.4bpp");
-const u16 gUnknown_08515E1C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/1.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame1[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/1.4bpp");
-const u16 gUnknown_08515E9C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/2.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame2[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/2.4bpp");
-const u16 gUnknown_08515F1C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/3.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame3[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/3.4bpp");
-const u16 gUnknown_08515F9C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/4.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame4[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/4.4bpp");
-const u16 gUnknown_0851601C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/5.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame5[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/5.4bpp");
-const u16 gUnknown_0851609C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/6.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame6[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/6.4bpp");
-const u16 gUnknown_0851611C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/7.4bpp");
+const u16 gTilesetAnims_EverGrande0_Frame7[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/7.4bpp");
const u16 tileset_anims_space_4[16] = {};
@@ -391,238 +392,238 @@ u16 *const gTilesetAnims_EverGrandeVDests0[] = {
};
const u16 *const gTilesetAnims_EverGrande0[] = {
- gUnknown_08515D9C,
- gUnknown_08515E1C,
- gUnknown_08515E9C,
- gUnknown_08515F1C,
- gUnknown_08515F9C,
- gUnknown_0851601C,
- gUnknown_0851609C,
- gUnknown_0851611C
+ gTilesetAnims_EverGrande0_Frame0,
+ gTilesetAnims_EverGrande0_Frame1,
+ gTilesetAnims_EverGrande0_Frame2,
+ gTilesetAnims_EverGrande0_Frame3,
+ gTilesetAnims_EverGrande0_Frame4,
+ gTilesetAnims_EverGrande0_Frame5,
+ gTilesetAnims_EverGrande0_Frame6,
+ gTilesetAnims_EverGrande0_Frame7
};
-const u16 gUnknown_085161FC[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/0.4bpp");
+const u16 gTilesetAnims_Dewford0_Frame0[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/0.4bpp");
-const u16 gUnknown_085162BC[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/1.4bpp");
+const u16 gTilesetAnims_Dewford0_Frame1[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/1.4bpp");
-const u16 gUnknown_0851637C[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/2.4bpp");
+const u16 gTilesetAnims_Dewford0_Frame2[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/2.4bpp");
-const u16 gUnknown_0851643C[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/3.4bpp");
+const u16 gTilesetAnims_Dewford0_Frame3[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/3.4bpp");
const u16 *const gTilesetAnims_Dewford0[] = {
- gUnknown_085161FC,
- gUnknown_085162BC,
- gUnknown_0851637C,
- gUnknown_0851643C
+ gTilesetAnims_Dewford0_Frame0,
+ gTilesetAnims_Dewford0_Frame1,
+ gTilesetAnims_Dewford0_Frame2,
+ gTilesetAnims_Dewford0_Frame3
};
-const u16 gUnknown_0851650C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/0.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/0.4bpp");
-const u16 gUnknown_085165CC[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/1.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/1.4bpp");
-const u16 gUnknown_0851668C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/2.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/2.4bpp");
-const u16 gUnknown_0851674C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/3.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame3[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/3.4bpp");
const u16 *const gTilesetAnims_BattleFrontierOutsideWest0[] = {
- gUnknown_0851650C,
- gUnknown_085165CC,
- gUnknown_0851668C,
- gUnknown_0851674C
+ gTilesetAnims_BattleFrontierOutsideWest0_Frame0,
+ gTilesetAnims_BattleFrontierOutsideWest0_Frame1,
+ gTilesetAnims_BattleFrontierOutsideWest0_Frame2,
+ gTilesetAnims_BattleFrontierOutsideWest0_Frame3
};
-const u16 gUnknown_0851681C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/0.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/0.4bpp");
-const u16 gUnknown_085168DC[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/1.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/1.4bpp");
-const u16 gUnknown_0851699C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/2.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/2.4bpp");
-const u16 gUnknown_08516A5C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/3.4bpp");
+const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame3[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/3.4bpp");
const u16 *const gTilesetAnims_BattleFrontierOutsideEast0[] = {
- gUnknown_0851681C,
- gUnknown_085168DC,
- gUnknown_0851699C,
- gUnknown_08516A5C
+ gTilesetAnims_BattleFrontierOutsideEast0_Frame0,
+ gTilesetAnims_BattleFrontierOutsideEast0_Frame1,
+ gTilesetAnims_BattleFrontierOutsideEast0_Frame2,
+ gTilesetAnims_BattleFrontierOutsideEast0_Frame3
};
-const u16 gUnknown_08516B2C[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/0.4bpp");
+const u16 gTilesetAnims_Slateport0_Frame0[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/0.4bpp");
-const u16 gUnknown_08516BAC[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/1.4bpp");
+const u16 gTilesetAnims_Slateport0_Frame1[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/1.4bpp");
-const u16 gUnknown_08516C2C[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/2.4bpp");
+const u16 gTilesetAnims_Slateport0_Frame2[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/2.4bpp");
-const u16 gUnknown_08516CAC[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/3.4bpp");
+const u16 gTilesetAnims_Slateport0_Frame3[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/3.4bpp");
const u16 *const gTilesetAnims_Slateport0[] = {
- gUnknown_08516B2C,
- gUnknown_08516BAC,
- gUnknown_08516C2C,
- gUnknown_08516CAC
+ gTilesetAnims_Slateport0_Frame0,
+ gTilesetAnims_Slateport0_Frame1,
+ gTilesetAnims_Slateport0_Frame2,
+ gTilesetAnims_Slateport0_Frame3
};
-const u16 gUnknown_08516D3C[] = INCBIN_U16("data/tilesets/primary/building/anim/0.4bpp");
+const u16 gTilesetAnims_InsideBuilding0_Frame0[] = INCBIN_U16("data/tilesets/primary/building/anim/0.4bpp");
-const u16 gUnknown_08516DBC[] = INCBIN_U16("data/tilesets/primary/building/anim/1.4bpp");
+const u16 gTilesetAnims_InsideBuilding0_Frame1[] = INCBIN_U16("data/tilesets/primary/building/anim/1.4bpp");
const u16 *const gTilesetAnims_InsideBuilding0[] = {
- gUnknown_08516D3C,
- gUnknown_08516DBC
+ gTilesetAnims_InsideBuilding0_Frame0,
+ gTilesetAnims_InsideBuilding0_Frame1
};
-const u16 gUnknown_08516E44[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/0.4bpp");
+const u16 gTilesetAnims_SootopolisGym0_Frame0[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/0.4bpp");
-const u16 gUnknown_08516FC4[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/1.4bpp");
+const u16 gTilesetAnims_SootopolisGym0_Frame1[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/1.4bpp");
-const u16 gUnknown_08517144[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/2.4bpp");
+const u16 gTilesetAnims_SootopolisGym0_Frame2[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/2.4bpp");
-const u16 gUnknown_085172C4[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/0.4bpp");
+const u16 gTilesetAnims_SootopolisGym1_Frame0[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/0.4bpp");
-const u16 gUnknown_08517544[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/1.4bpp");
+const u16 gTilesetAnims_SootopolisGym1_Frame1[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/1.4bpp");
-const u16 gUnknown_085177C4[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/2.4bpp");
+const u16 gTilesetAnims_SootopolisGym1_Frame2[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/2.4bpp");
const u16 *const gTilesetAnims_SootopolisGym0[] = {
- gUnknown_08516E44,
- gUnknown_08516FC4,
- gUnknown_08517144
+ gTilesetAnims_SootopolisGym0_Frame0,
+ gTilesetAnims_SootopolisGym0_Frame1,
+ gTilesetAnims_SootopolisGym0_Frame2
};
const u16 *const gTilesetAnims_SootopolisGym1[] = {
- gUnknown_085172C4,
- gUnknown_08517544,
- gUnknown_085177C4
+ gTilesetAnims_SootopolisGym1_Frame0,
+ gTilesetAnims_SootopolisGym1_Frame1,
+ gTilesetAnims_SootopolisGym1_Frame2
};
-const u16 gUnknown_08517A5C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/0.4bpp");
+const u16 gTilesetAnims_EliteFour0_Frame0[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/0.4bpp");
-const u16 gUnknown_08517ADC[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/1.4bpp");
+const u16 gTilesetAnims_EliteFour0_Frame1[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/1.4bpp");
-const u16 gUnknown_08517B5C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/0.4bpp");
+const u16 gTilesetAnims_EliteFour1_Frame0[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/0.4bpp");
-const u16 gUnknown_08517B7C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/1.4bpp");
+const u16 gTilesetAnims_EliteFour1_Frame1[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/1.4bpp");
-const u16 gUnknown_08517B9C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/2.4bpp");
+const u16 gTilesetAnims_EliteFour1_Frame2[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/2.4bpp");
-const u16 gUnknown_08517BBC[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/3.4bpp");
+const u16 gTilesetAnims_EliteFour1_Frame3[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/3.4bpp");
const u16 tileset_anims_space_5[16] = {};
const u16 *const gTilesetAnims_EliteFour1[] = {
- gUnknown_08517B5C,
- gUnknown_08517B7C,
- gUnknown_08517B9C,
- gUnknown_08517BBC
+ gTilesetAnims_EliteFour1_Frame0,
+ gTilesetAnims_EliteFour1_Frame1,
+ gTilesetAnims_EliteFour1_Frame2,
+ gTilesetAnims_EliteFour1_Frame3
};
const u16 *const gTilesetAnims_EliteFour0[] = {
- gUnknown_08517A5C,
- gUnknown_08517ADC
+ gTilesetAnims_EliteFour0_Frame0,
+ gTilesetAnims_EliteFour0_Frame1
};
-const u16 gUnknown_08517C14[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/0.4bpp");
+const u16 gTilesetAnims_MauvilleGym0_Frame0[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/0.4bpp");
-const u16 gUnknown_08517E14[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/1.4bpp");
+const u16 gTilesetAnims_MauvilleGym0_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/1.4bpp");
const u16 tileset_anims_space_6[16] = {};
const u16 *const gTilesetAnims_MauvilleGym0[] = {
- gUnknown_08517C14,
- gUnknown_08517E14
+ gTilesetAnims_MauvilleGym0_Frame0,
+ gTilesetAnims_MauvilleGym0_Frame1
};
-const u16 gUnknown_0851803C[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/0.4bpp");
+const u16 gTilesetAnims_BikeShop0_Frame0[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/0.4bpp");
-const u16 gUnknown_0851815C[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/1.4bpp");
+const u16 gTilesetAnims_BikeShop0_Frame1[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/1.4bpp");
const u16 tileset_anims_space_7[16] = {};
const u16 *const gTilesetAnims_BikeShop0[] = {
- gUnknown_0851803C,
- gUnknown_0851815C
+ gTilesetAnims_BikeShop0_Frame0,
+ gTilesetAnims_BikeShop0_Frame1
};
-const u16 gUnknown_085182A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/0.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame0[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/0.4bpp");
-const u16 gUnknown_08518EA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/1.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame1[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/1.4bpp");
-const u16 gUnknown_08519AA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/2.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame2[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/2.4bpp");
-const u16 gUnknown_0851A6A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/3.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame3[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/3.4bpp");
-const u16 gUnknown_0851B2A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/4.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/4.4bpp");
-const u16 gUnknown_0851BEA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/5.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame5[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/5.4bpp");
-const u16 gUnknown_0851CAA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/6.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame6[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/6.4bpp");
-const u16 gUnknown_0851D6A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/7.4bpp");
+const u16 gTilesetAnims_Sootopolis0_Frame7[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/7.4bpp");
const u16 tileset_anims_space_8[16] = {};
-const u16 gUnknown_0851E2C4[] = INCBIN_U16("data/tilesets/secondary/unused_1/0.4bpp");
+const u16 gTilesetAnims_Unused1_Frame0[] = INCBIN_U16("data/tilesets/secondary/unused_1/0.4bpp");
-const u16 gUnknown_0851EAC4[] = INCBIN_U16("data/tilesets/secondary/unused_1/1.4bpp");
+const u16 gTilesetAnims_Unused1_Frame1[] = INCBIN_U16("data/tilesets/secondary/unused_1/1.4bpp");
-const u16 gUnknown_0851F2C4[] = INCBIN_U16("data/tilesets/secondary/unused_1/2.4bpp");
+const u16 gTilesetAnims_Unused1_Frame2[] = INCBIN_U16("data/tilesets/secondary/unused_1/2.4bpp");
-const u16 gUnknown_0851FAC4[] = INCBIN_U16("data/tilesets/secondary/unused_1/3.4bpp");
+const u16 gTilesetAnims_Unused1_Frame3[] = INCBIN_U16("data/tilesets/secondary/unused_1/3.4bpp");
const u16 *const gTilesetAnims_Sootopolis0[] = {
- gUnknown_085182A4,
- gUnknown_08518EA4,
- gUnknown_08519AA4,
- gUnknown_0851A6A4,
- gUnknown_0851B2A4,
- gUnknown_0851BEA4,
- gUnknown_0851CAA4,
- gUnknown_0851D6A4
+ gTilesetAnims_Sootopolis0_Frame0,
+ gTilesetAnims_Sootopolis0_Frame1,
+ gTilesetAnims_Sootopolis0_Frame2,
+ gTilesetAnims_Sootopolis0_Frame3,
+ gTilesetAnims_Sootopolis0_Frame4,
+ gTilesetAnims_Sootopolis0_Frame5,
+ gTilesetAnims_Sootopolis0_Frame6,
+ gTilesetAnims_Sootopolis0_Frame7
};
-const u16 gUnknown_085202E4[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/0.4bpp");
+const u16 gTilesetAnims_BattlePyramid0_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/0.4bpp");
-const u16 gUnknown_085203E4[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/1.4bpp");
+const u16 gTilesetAnims_BattlePyramid0_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/1.4bpp");
-const u16 gUnknown_085204E4[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/2.4bpp");
+const u16 gTilesetAnims_BattlePyramid0_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/2.4bpp");
const u16 tileset_anims_space_9[16] = {};
-const u16 gUnknown_08520604[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/0.4bpp");
+const u16 gTilesetAnims_BattlePyramid1_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/0.4bpp");
-const u16 gUnknown_08520704[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/1.4bpp");
+const u16 gTilesetAnims_BattlePyramid1_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/1.4bpp");
-const u16 gUnknown_08520804[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/2.4bpp");
+const u16 gTilesetAnims_BattlePyramid1_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/2.4bpp");
const u16 tileset_anims_space_10[7808] = {};
-const u16 gUnknown_08524604[] = INCBIN_U16("data/tilesets/secondary/unused_2/0.4bpp");
+const u16 gTilesetAnims_Unused2_Frame0[] = INCBIN_U16("data/tilesets/secondary/unused_2/0.4bpp");
const u16 tileset_anims_space_11[224] = {};
-const u16 gUnknown_08524804[] = INCBIN_U16("data/tilesets/secondary/unused_2/1.4bpp");
+const u16 gTilesetAnims_Unused2_Frame1[] = INCBIN_U16("data/tilesets/secondary/unused_2/1.4bpp");
const u16 *const gTilesetAnims_BattlePyramid0[] = {
- gUnknown_085202E4,
- gUnknown_085203E4,
- gUnknown_085204E4
+ gTilesetAnims_BattlePyramid0_Frame0,
+ gTilesetAnims_BattlePyramid0_Frame1,
+ gTilesetAnims_BattlePyramid0_Frame2
};
const u16 *const gTilesetAnims_BattlePyramid1[] = {
- gUnknown_08520604,
- gUnknown_08520704,
- gUnknown_08520804
+ gTilesetAnims_BattlePyramid1_Frame0,
+ gTilesetAnims_BattlePyramid1_Frame1,
+ gTilesetAnims_BattlePyramid1_Frame2
};
-extern const u16 gUnknown_08D85640[];
-extern const u16 gUnknown_08D85660[];
-extern const u16 gUnknown_08D85680[];
-extern const u16 gUnknown_08D856A0[];
+extern const u16 gTilesetAnims_BattleDomePals0_0[];
+extern const u16 gTilesetAnims_BattleDomePals0_1[];
+extern const u16 gTilesetAnims_BattleDomePals0_2[];
+extern const u16 gTilesetAnims_BattleDomePals0_3[];
static const u16 *const gTilesetAnims_BattleDomePals0[] = {
- gUnknown_08D85640,
- gUnknown_08D85660,
- gUnknown_08D85680,
- gUnknown_08D856A0,
+ gTilesetAnims_BattleDomePals0_0,
+ gTilesetAnims_BattleDomePals0_1,
+ gTilesetAnims_BattleDomePals0_2,
+ gTilesetAnims_BattleDomePals0_3,
};
// .text
@@ -685,8 +686,8 @@ static void cur_mapheader_run_tileset1_func(void)
sPrimaryTilesetCBCounter = 0;
sPrimaryTilesetCBBufferSize = 0;
sPrimaryTilesetCB = NULL;
- if (gMapHeader.mapData->primaryTileset && gMapHeader.mapData->primaryTileset->callback)
- gMapHeader.mapData->primaryTileset->callback();
+ if (gMapHeader.mapLayout->primaryTileset && gMapHeader.mapLayout->primaryTileset->callback)
+ gMapHeader.mapLayout->primaryTileset->callback();
}
static void cur_mapheader_run_tileset2_func(void)
@@ -694,8 +695,8 @@ static void cur_mapheader_run_tileset2_func(void)
sSecondaryTilesetCBCounter = 0;
sSecondaryTilesetCBBufferSize = 0;
sSecondaryTilesetCB = NULL;
- if (gMapHeader.mapData->secondaryTileset && gMapHeader.mapData->secondaryTileset->callback)
- gMapHeader.mapData->secondaryTileset->callback();
+ if (gMapHeader.mapLayout->secondaryTileset && gMapHeader.mapLayout->secondaryTileset->callback)
+ gMapHeader.mapLayout->secondaryTileset->callback();
}
void TilesetCb_General(void)
@@ -1392,7 +1393,7 @@ static void sub_80A1818(u16 a1)
{
CpuCopy16(gTilesetAnims_BattleDomePals0[a1 & 0x3], gPlttBufferUnfaded + 0x80, 32);
BlendPalette(0x80, 0x10, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF);
- if ((u8)FindTaskIdByFunc(sub_8149DFC) != 0xFF )
+ if ((u8)FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) != 0xFF )
{
sSecondaryTilesetCB = sub_80A1670;
sSecondaryTilesetCBBufferSize = 0x20;
@@ -1402,7 +1403,7 @@ static void sub_80A1818(u16 a1)
static void sub_80A1884(u16 a1)
{
CpuCopy16(gTilesetAnims_BattleDomePals0[a1 & 0x3], gPlttBufferUnfaded + 0x80, 32);
- if ((u8)FindTaskIdByFunc(sub_8149DFC) == 0xFF )
+ if ((u8)FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) == 0xFF )
{
BlendPalette(0x80, 0x10, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF);
if (!--sSecondaryTilesetCBBufferSize)
diff --git a/src/time_events.c b/src/time_events.c
new file mode 100644
index 000000000..1f46e7705
--- /dev/null
+++ b/src/time_events.c
@@ -0,0 +1,118 @@
+#include "global.h"
+#include "time_events.h"
+#include "event_data.h"
+#include "field_weather.h"
+#include "pokemon.h"
+#include "random.h"
+#include "overworld.h"
+#include "rtc.h"
+#include "script.h"
+#include "task.h"
+
+static u32 GetMirageRnd(void)
+{
+ u32 hi = VarGet(VAR_MIRAGE_RND_H);
+ u32 lo = VarGet(VAR_MIRAGE_RND_L);
+ return (hi << 16) | lo;
+}
+
+static void SetMirageRnd(u32 rnd)
+{
+ VarSet(VAR_MIRAGE_RND_H, rnd >> 16);
+ VarSet(VAR_MIRAGE_RND_L, rnd);
+}
+
+// unused
+void InitMirageRnd(void)
+{
+ SetMirageRnd((Random() << 16) | Random());
+}
+
+void UpdateMirageRnd(u16 days)
+{
+ s32 rnd = GetMirageRnd();
+ while (days)
+ {
+ rnd = 1103515245 * rnd + 12345;
+ days--;
+ }
+ SetMirageRnd(rnd);
+}
+
+bool8 IsMirageIslandPresent(void)
+{
+ u16 rnd = GetMirageRnd() >> 16;
+ int i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && (GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY) & 0xFFFF) == rnd)
+ return TRUE;
+
+ return FALSE;
+}
+
+void UpdateShoalTideFlag(void)
+{
+ static const u8 tide[] =
+ {
+ 1, // 00
+ 1, // 01
+ 1, // 02
+ 0, // 03
+ 0, // 04
+ 0, // 05
+ 0, // 06
+ 0, // 07
+ 0, // 08
+ 1, // 09
+ 1, // 10
+ 1, // 11
+ 1, // 12
+ 1, // 13
+ 1, // 14
+ 0, // 15
+ 0, // 16
+ 0, // 17
+ 0, // 18
+ 0, // 19
+ 0, // 20
+ 1, // 21
+ 1, // 22
+ 1, // 23
+ };
+
+ if (is_map_type_1_2_3_5_or_6(get_map_light_from_warp0()))
+ {
+ RtcCalcLocalTime();
+ if (tide[gLocalTime.hours])
+ FlagSet(FLAG_SYS_SHOAL_TIDE);
+ else
+ FlagClear(FLAG_SYS_SHOAL_TIDE);
+ }
+}
+
+static void Task_WaitWeather(u8 taskId)
+{
+ if (IsWeatherChangeComplete())
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+void WaitWeather(void)
+{
+ CreateTask(Task_WaitWeather, 80);
+}
+
+void InitBirchState(void)
+{
+ *GetVarPointer(VAR_BIRCH_STATE) = 0;
+}
+
+void UpdateBirchState(u16 days)
+{
+ u16 *state = GetVarPointer(VAR_BIRCH_STATE);
+ *state += days;
+ *state %= 7;
+}
diff --git a/src/title_screen.c b/src/title_screen.c
new file mode 100644
index 000000000..8a2c01192
--- /dev/null
+++ b/src/title_screen.c
@@ -0,0 +1,784 @@
+#include "global.h"
+#include "title_screen.h"
+#include "sprite.h"
+#include "gba/m4a_internal.h"
+#include "clear_save_data_menu.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "intro.h"
+#include "m4a.h"
+#include "main.h"
+#include "main_menu.h"
+#include "palette.h"
+#include "reset_rtc_screen.h"
+#include "berry_fix_program.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "scanline_effect.h"
+#include "gpu_regs.h"
+#include "trig.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+
+#define VERSION_BANNER_SHAPE 1
+#define VERSION_BANNER_RIGHT_TILEOFFSET 64
+#define VERSION_BANNER_BYTES 0x1000
+#define VERSION_BANNER_LEFT_X 98
+#define VERSION_BANNER_RIGHT_X 162
+#define VERSION_BANNER_Y 2
+#define VERSION_BANNER_Y_GOAL 66
+#define START_BANNER_X 128
+
+#define CLEAR_SAVE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_UP)
+#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT)
+#define BERRY_UPDATE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON)
+#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON)
+
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+
+extern const u8 gTitleScreenEmeraldVersionGfx[];
+extern const u8 gTitleScreenPressStartGfx[];
+extern const u8 gTitleScreenPokemonLogoGfx[];
+extern const u8 gUnknown_08DE0644[];
+extern const u8 gUnknown_08DDE458[];
+extern const u16 gTitleScreenBgPalettes[];
+extern const u16 gTitleScreenPressStartPal[];
+extern const u16 gTitleScreenEmeraldVersionPal[];
+
+// this file's functions
+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_GoToBerryFixScreen(void);
+static void CB2_GoToCopyrightScreen(void);
+static void UpdateLegendaryMarkingColor(u8);
+
+static void SpriteCB_VersionBannerLeft(struct Sprite *sprite);
+static void SpriteCB_VersionBannerRight(struct Sprite *sprite);
+static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite);
+static void SpriteCB_PokemonLogoShine(struct Sprite *sprite);
+
+// const rom data
+static const u16 sUnusedUnknownPal[] = INCBIN_U16("graphics/title_screen/unk_853EF78.gbapal");
+
+static const u8 sTitleScreenRayquazaGfx[] = INCBIN_U8("graphics/title_screen/rayquaza.4bpp.lz");
+static const u8 sTitleScreenRayquazaTilemap[] = INCBIN_U8("graphics/title_screen/rayquaza.bin.lz");
+static const u8 sTitleScreenLogoShineGfx[] = INCBIN_U8("graphics/title_screen/logo_shine.4bpp.lz");
+static const u8 sTitleScreenCloudsGfx[] = INCBIN_U8("graphics/title_screen/clouds.4bpp.lz");
+
+const u16 gUnknown_0853FF70[] =
+{
+ 0x0010, 0x0110, 0x0210, 0x0310, 0x0410, 0x0510, 0x0610, 0x0710,
+ 0x0810, 0x0910, 0x0a10, 0x0b10, 0x0c10, 0x0d10, 0x0e10, 0x0f10,
+ 0x100f, 0x100e, 0x100d, 0x100c, 0x100b, 0x100a, 0x1009, 0x1008,
+ 0x1007, 0x1006, 0x1005, 0x1004, 0x1003, 0x1002, 0x1001, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+};
+
+static const struct OamData sVersionBannerLeftOamData =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 1,
+ .shape = VERSION_BANNER_SHAPE,
+ .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 = VERSION_BANNER_SHAPE,
+ .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(VERSION_BANNER_RIGHT_TILEOFFSET, 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 = SpriteCB_VersionBannerLeft,
+};
+
+static const struct SpriteTemplate sVersionBannerRightSpriteTemplate =
+{
+ .tileTag = 1000,
+ .paletteTag = 1000,
+ .oam = &sVersionBannerRightOamData,
+ .anims = sVersionBannerRightAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_VersionBannerRight,
+};
+
+static const struct CompressedSpriteSheet sSpriteSheet_EmeraldVersion[] =
+{
+ {gTitleScreenEmeraldVersionGfx, VERSION_BANNER_BYTES, 1000},
+ {NULL},
+};
+
+static const struct OamData sOamData_CopyrightBanner =
+{
+ .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 sCopyrightBannerAnim0[] =
+{
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim1[] =
+{
+ ANIMCMD_FRAME(5, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim2[] =
+{
+ ANIMCMD_FRAME(9, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim3[] =
+{
+ ANIMCMD_FRAME(13, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim4[] =
+{
+ ANIMCMD_FRAME(17, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim5[] =
+{
+ ANIMCMD_FRAME(21, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim6[] =
+{
+ ANIMCMD_FRAME(25, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim7[] =
+{
+ ANIMCMD_FRAME(29, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim8[] =
+{
+ ANIMCMD_FRAME(33, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd sCopyrightBannerAnim9[] =
+{
+ ANIMCMD_FRAME(37, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sStartCopyrightBannerAnimTable[] =
+{
+ sCopyrightBannerAnim0,
+ sCopyrightBannerAnim1,
+ sCopyrightBannerAnim2,
+ sCopyrightBannerAnim3,
+ sCopyrightBannerAnim4,
+ sCopyrightBannerAnim5,
+ sCopyrightBannerAnim6,
+ sCopyrightBannerAnim7,
+ sCopyrightBannerAnim8,
+ sCopyrightBannerAnim9,
+};
+
+static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate =
+{
+ .tileTag = 1001,
+ .paletteTag = 1001,
+ .oam = &sOamData_CopyrightBanner,
+ .anims = sStartCopyrightBannerAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_PressStartCopyrightBanner,
+};
+
+static const struct CompressedSpriteSheet sSpriteSheet_PressStart[] =
+{
+ {gTitleScreenPressStartGfx, 0x520, 1001},
+ {NULL},
+};
+
+static const struct SpritePalette sSpritePalette_PressStart[] =
+{
+ {gTitleScreenPressStartPal, 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 = SpriteCB_PokemonLogoShine,
+};
+
+static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] =
+{
+ {sTitleScreenLogoShineGfx, 0x800, 1002},
+ {NULL},
+};
+
+// code
+static void SpriteCB_VersionBannerLeft(struct Sprite *sprite)
+{
+ if (gTasks[sprite->data[1]].data[1] != 0)
+ {
+ sprite->oam.objMode = 0;
+ sprite->pos1.y = VERSION_BANNER_Y_GOAL;
+ }
+ else
+ {
+ if (sprite->pos1.y != VERSION_BANNER_Y_GOAL)
+ sprite->pos1.y++;
+ if (sprite->data[0] != 0)
+ sprite->data[0]--;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[sprite->data[0]]);
+ }
+}
+
+static void SpriteCB_VersionBannerRight(struct Sprite *sprite)
+{
+ if (gTasks[sprite->data[1]].data[1] != 0)
+ {
+ sprite->oam.objMode = 0;
+ sprite->pos1.y = VERSION_BANNER_Y_GOAL;
+ }
+ else
+ {
+ if (sprite->pos1.y != VERSION_BANNER_Y_GOAL)
+ sprite->pos1.y++;
+ }
+}
+
+static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 1)
+ {
+ sprite->data[1]++;
+ // Alternate between hidden and shown every 16th frame
+ if (sprite->data[1] & 0x10)
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ }
+}
+
+static void CreatePressStartBanner(s16 x, s16 y)
+{
+ u8 i;
+ u8 spriteId;
+
+ x -= 64;
+ for (i = 0; i < 5; i++, x += 32)
+ {
+ spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0);
+ StartSpriteAnim(&gSprites[spriteId], i);
+ gSprites[spriteId].data[0] = 1;
+ }
+}
+
+static void CreateCopyrightBanner(s16 x, s16 y)
+{
+ u8 i;
+ u8 spriteId;
+
+ x -= 64;
+ for (i = 0; i < 5; i++, x += 32)
+ {
+ spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0);
+ StartSpriteAnim(&gSprites[spriteId], i + 5);
+ }
+}
+
+static void SpriteCB_PokemonLogoShine(struct Sprite *sprite)
+{
+ if (sprite->pos1.x < 272)
+ {
+ if (sprite->data[0]) // Flash background
+ {
+ u16 backgroundColor;
+
+ if (sprite->pos1.x < DISPLAY_WIDTH / 2)
+ {
+ // Brighten background color
+ if (sprite->data[1] < 31)
+ sprite->data[1]++;
+ if (sprite->data[1] < 31)
+ sprite->data[1]++;
+ }
+ else
+ {
+ // Darken background color
+ if (sprite->data[1] != 0)
+ sprite->data[1]--;
+ if (sprite->data[1] != 0)
+ sprite->data[1]--;
+ }
+
+ backgroundColor = _RGB(sprite->data[1], sprite->data[1], sprite->data[1]);
+ if (sprite->pos1.x == DISPLAY_WIDTH / 2 + 12
+ || sprite->pos1.x == DISPLAY_WIDTH / 2 + 16
+ || sprite->pos1.x == DISPLAY_WIDTH / 2 + 20
+ || sprite->pos1.x == DISPLAY_WIDTH / 2 + 24)
+ gPlttBufferFaded[0] = RGB(24, 31, 12);
+ else
+ gPlttBufferFaded[0] = backgroundColor;
+ }
+ sprite->pos1.x += 4;
+ }
+ else
+ {
+ gPlttBufferFaded[0] = RGB_BLACK;
+ DestroySprite(sprite);
+ }
+}
+
+static void SpriteCB_PokemonLogoShine2(struct Sprite *sprite)
+{
+ if (sprite->pos1.x < 272)
+ sprite->pos1.x += 8;
+ else
+ DestroySprite(sprite);
+}
+
+static void StartPokemonLogoShine(u8 flashBg)
+{
+ u8 spriteId;
+
+ switch (flashBg)
+ {
+ case 0:
+ case 2:
+ spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
+ gSprites[spriteId].oam.objMode = 2;
+ gSprites[spriteId].data[0] = flashBg;
+ break;
+ case 1:
+ spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
+ gSprites[spriteId].oam.objMode = 2;
+ gSprites[spriteId].data[0] = flashBg;
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
+ gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2;
+ gSprites[spriteId].oam.objMode = 2;
+
+ spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, -80, 68, 0);
+ gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2;
+ gSprites[spriteId].oam.objMode = 2;
+ break;
+ }
+}
+
+static void VBlankCB(void)
+{
+ ScanlineEffect_InitHBlankDmaTransfer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+}
+
+#define tCounter data[0]
+#define tSkipToNext data[1]
+
+void CB2_InitTitleScreen(void)
+{
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ *((u16 *)PLTT) = RGB_WHITE;
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+ ResetPaletteFade();
+ gMain.state = 1;
+ break;
+ case 1:
+ LZ77UnCompVram(gTitleScreenPokemonLogoGfx, (void *)VRAM);
+ LZ77UnCompVram(gUnknown_08DE0644, (void *)(VRAM + 0x4800));
+ LoadPalette(gTitleScreenBgPalettes, 0, 0x1E0);
+ LZ77UnCompVram(sTitleScreenRayquazaGfx, (void *)(VRAM + 0x8000));
+ LZ77UnCompVram(sTitleScreenRayquazaTilemap, (void *)(VRAM + 0xD000));
+ LZ77UnCompVram(sTitleScreenCloudsGfx, (void *)(VRAM + 0xC000));
+ LZ77UnCompVram(gUnknown_08DDE458, (void *)(VRAM + 0xD800));
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 9;
+ LoadCompressedObjectPic(&sSpriteSheet_EmeraldVersion[0]);
+ LoadCompressedObjectPic(&sSpriteSheet_PressStart[0]);
+ LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]);
+ LoadPalette(gTitleScreenEmeraldVersionPal, 0x100, 0x20);
+ LoadSpritePalette(&sSpritePalette_PressStart[0]);
+ gMain.state = 2;
+ break;
+ case 2:
+ {
+ u8 taskId = CreateTask(Task_TitleScreenPhase1, 0);
+
+ gTasks[taskId].tCounter = 256;
+ gTasks[taskId].tSkipToNext = FALSE;
+ gTasks[taskId].data[2] = -16;
+ gTasks[taskId].data[3] = -32;
+ gMain.state = 3;
+ break;
+ }
+ case 3:
+ BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF);
+ SetVBlankCallback(VBlankCB);
+ gMain.state = 4;
+ break;
+ case 4:
+ sub_816F2A8(0x78, 0x50, 0x100, 0);
+ SetGpuReg(REG_OFFSET_BG2X_L, -29 * 256);
+ SetGpuReg(REG_OFFSET_BG2X_H, -1);
+ SetGpuReg(REG_OFFSET_BG2Y_L, -32 * 256);
+ SetGpuReg(REG_OFFSET_BG2Y_H, -1);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, 0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0x1F1F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x3F1F);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x84);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0xC);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_16COLOR | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(27) | BGCNT_16COLOR | BGCNT_TXT256x256);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON
+ | DISPCNT_WIN0_ON
+ | DISPCNT_OBJWIN_ON);
+ m4aSongNumStart(MUS_TITLE3);
+ gMain.state = 5;
+ break;
+ case 5:
+ if (!UpdatePaletteFade())
+ {
+ StartPokemonLogoShine(0);
+ ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE);
+ SetMainCallback2(MainCB2);
+ }
+ break;
+ }
+}
+
+static void MainCB2(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+// Shine the Pokemon logo two more times, and fade in the version banner
+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].tSkipToNext = TRUE;
+ gTasks[taskId].tCounter = 0;
+ }
+
+ if (gTasks[taskId].tCounter != 0)
+ {
+ u16 frameNum = gTasks[taskId].tCounter;
+ if (frameNum == 176)
+ StartPokemonLogoShine(1);
+ else if (frameNum == 64)
+ StartPokemonLogoShine(2);
+
+ gTasks[taskId].tCounter--;
+ }
+ else
+ {
+ u8 spriteId;
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x3F50);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x10);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+
+ // Create left side of version banner
+ spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0);
+ gSprites[spriteId].data[0] = 64;
+ gSprites[spriteId].data[1] = taskId;
+
+ // Create right side of version banner
+ spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0);
+ gSprites[spriteId].data[1] = taskId;
+
+ gTasks[taskId].tCounter = 144;
+ gTasks[taskId].func = Task_TitleScreenPhase2;
+ }
+}
+
+// Create "Press Start" and copyright banners, and slide Pokemon logo up
+static void Task_TitleScreenPhase2(u8 taskId)
+{
+ u32 yPos;
+
+ // Skip to next phase when A, B, Start, or Select is pressed
+ if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].tSkipToNext)
+ {
+ gTasks[taskId].tSkipToNext = TRUE;
+ gTasks[taskId].tCounter = 0;
+ }
+
+ if (gTasks[taskId].tCounter != 0)
+ {
+ gTasks[taskId].tCounter--;
+ }
+ else
+ {
+ gTasks[taskId].tSkipToNext = TRUE;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x2142);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0xF06);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1
+ | DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_BG1_ON
+ | DISPCNT_BG2_ON
+ | DISPCNT_OBJ_ON);
+ CreatePressStartBanner(START_BANNER_X, 108);
+ CreateCopyrightBanner(START_BANNER_X, 148);
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].func = Task_TitleScreenPhase3;
+ }
+
+ if (!(gTasks[taskId].tCounter & 3) && gTasks[taskId].data[2] != 0)
+ gTasks[taskId].data[2]++;
+ if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0)
+ gTasks[taskId].data[3]++;
+
+ // Slide Pokemon logo up
+ yPos = gTasks[taskId].data[3] * 256;
+ SetGpuReg(REG_OFFSET_BG2Y_L, yPos);
+ SetGpuReg(REG_OFFSET_BG2Y_H, yPos / 0x10000);
+
+ gTasks[taskId].data[5] = 15;
+ gTasks[taskId].data[6] = 6;
+}
+
+// Show Rayquaza silhouette and process main title screen input
+static void Task_TitleScreenPhase3(u8 taskId)
+{
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON))
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF);
+ SetMainCallback2(CB2_GoToMainMenu);
+ }
+ else if ((gMain.heldKeys & CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO)
+ {
+ SetMainCallback2(CB2_GoToClearSaveDataScreen);
+ }
+ else if ((gMain.heldKeys & RESET_RTC_BUTTON_COMBO) == RESET_RTC_BUTTON_COMBO
+ && CanResetRTC() == TRUE)
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ SetMainCallback2(CB2_GoToResetRtcScreen);
+ }
+ else if ((gMain.heldKeys & BERRY_UPDATE_BUTTON_COMBO) == BERRY_UPDATE_BUTTON_COMBO)
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ SetMainCallback2(CB2_GoToBerryFixScreen);
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BG2Y_L, 0);
+ SetGpuReg(REG_OFFSET_BG2Y_H, 0);
+ gTasks[taskId].tCounter++;
+ if (gTasks[taskId].tCounter & 1)
+ {
+ gTasks[taskId].data[4]++;
+ gBattle_BG1_Y = gTasks[taskId].data[4] / 2;
+ gBattle_BG1_X = 0;
+ }
+ UpdateLegendaryMarkingColor(gTasks[taskId].tCounter);
+ if ((gMPlayInfo_BGM.status & 0xFFFF) == 0)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF);
+ SetMainCallback2(CB2_GoToCopyrightScreen);
+ }
+ }
+}
+
+static void CB2_GoToMainMenu(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitMainMenu);
+}
+
+static void CB2_GoToCopyrightScreen(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen);
+}
+
+static void CB2_GoToClearSaveDataScreen(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitClearSaveDataScreen);
+}
+
+static void CB2_GoToResetRtcScreen(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitResetRtcScreen);
+}
+
+static void CB2_GoToBerryFixScreen(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ m4aMPlayAllStop();
+ SetMainCallback2(CB2_InitBerryFixProgram);
+ }
+}
+
+static void UpdateLegendaryMarkingColor(u8 frameNum)
+{
+ if ((frameNum % 4) == 0) // Change color every 4th frame
+ {
+ s32 intensity = Cos(frameNum, 128) + 128;
+ s32 r = 31 - ((intensity * 32 - intensity) / 256);
+ s32 g = 31 - (intensity * 22 / 256);
+ s32 b = 12;
+
+ u16 color = RGB(r, g, b);
+ LoadPalette(&color, 0xEF, sizeof(color));
+ }
+}
diff --git a/src/trader.c b/src/trader.c
new file mode 100644
index 000000000..c4d70ac9a
--- /dev/null
+++ b/src/trader.c
@@ -0,0 +1,209 @@
+#include "global.h"
+#include "constants/decorations.h"
+#include "constants/mauville_man.h"
+#include "decoration.h"
+#include "decoration_inventory.h"
+#include "event_data.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "script.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "script_menu.h"
+
+static const u8 * const sDefaultTraderNames[] =
+{
+ gText_Tristan,
+ gText_Philip,
+ gText_Dennis,
+ gText_Roberto,
+};
+
+static const u8 sDefaultTraderDecorations[] =
+{
+ DECOR_DUSKULL_DOLL,
+ DECOR_BALL_CUSHION,
+ DECOR_TIRE,
+ DECOR_PRETTY_FLOWERS,
+};
+
+void TraderSetup(void)
+{
+ u8 i;
+ struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader;
+
+ trader->id = MAUVILLE_MAN_TRADER;
+ trader->alreadyTraded = FALSE;
+
+ for (i = 0; i < 4; i++)
+ {
+ StringCopy(trader->playerNames[i], sDefaultTraderNames[i]);
+ trader->decorIds[i] = sDefaultTraderDecorations[i];
+ trader->language[i] = GAME_LANGUAGE;
+ }
+}
+
+void Trader_ResetFlag(void)
+{
+ struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader;
+ trader->alreadyTraded = FALSE;
+}
+
+void CreateAvailableDecorationsMenu(u8 taskId)
+{
+ u8 i;
+ s16 * data = gTasks[taskId].data;
+ struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader;
+ struct WindowTemplate windowTemplate = {0, 1, 1, 10, 10, 15, 1};
+ s32 windowWidth = GetStringWidth(1, gText_Exit, 0);
+ s32 fiveMarksWidth = GetStringWidth(1, gText_FiveMarks, 0);
+ for (i = 0; i < 4; i++)
+ {
+ s32 curWidth;
+ if (trader->decorIds[i] > NUM_DECORATIONS)
+ curWidth = fiveMarksWidth;
+ else
+ curWidth = GetStringWidth(1, gDecorations[trader->decorIds[i]].name, 0);
+ if (curWidth > windowWidth)
+ windowWidth = curWidth;
+ }
+ windowTemplate.width = convert_pixel_width_to_tile_width(windowWidth);
+ data[3] = AddWindow(&windowTemplate);
+ SetWindowBorderStyle(data[3], FALSE, 0x214, 14);
+ for (i = 0; i < 4; i++)
+ {
+ if (trader->decorIds[i] > NUM_DECORATIONS)
+ PrintTextOnWindow(data[3], 1, gText_FiveMarks, 8, 16 * i + 1, 255, NULL);
+ else
+ PrintTextOnWindow(data[3], 1, gDecorations[trader->decorIds[i]].name, 8, 16 * i + 1, 255, NULL);
+ }
+ PrintTextOnWindow(data[3], 1, gText_Exit, 8, 16 * i + 1, 255, NULL);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[3], 5, 0);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+void sub_8133BE4(u8 taskId, u8 decorationId)
+{
+ s16 * data = gTasks[taskId].data;
+ if (decorationId > NUM_DECORATIONS)
+ {
+ gSpecialVar_0x8004 = 0xFFFF;
+ }
+ else
+ {
+ gSpecialVar_0x8004 = decorationId;
+ }
+
+ sub_8198070(data[3], FALSE);
+ ClearWindowTilemap(data[3]);
+ RemoveWindow(data[3]);
+ schedule_bg_copy_tilemap_to_vram(0);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+void Task_HandleGetDecorationMenuInput(u8 taskId)
+{
+ struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader;
+ s8 input = ProcessMenuInput();
+
+ switch (input)
+ {
+ case -2:
+ break;
+ case -1:
+ case 4:
+ PlaySE(SE_SELECT);
+ sub_8133BE4(taskId, 0);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ gSpecialVar_0x8005 = input;
+ StringCopy(gStringVar1, trader->playerNames[input]);
+ ConvertInternationalString(gStringVar1, trader->language[input]);
+ sub_8133BE4(taskId, trader->decorIds[input]);
+ break;
+ }
+}
+
+void ScrSpecial_GetTraderTradedFlag(void)
+{
+ struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader;
+ gSpecialVar_Result = trader->alreadyTraded;
+}
+
+void ScrSpecial_DoesPlayerHaveNoDecorations(void)
+{
+ u8 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (CountDecorationCategoryN(i))
+ {
+ gSpecialVar_Result = FALSE;
+ return;
+ }
+ }
+ gSpecialVar_Result = TRUE;
+}
+
+void ScrSpecial_IsDecorationFull(void)
+{
+ gSpecialVar_Result = FALSE;
+ if (gDecorations[gSpecialVar_0x8004].category != gDecorations[gSpecialVar_0x8006].category
+ && GetFirstEmptyDecorSlot(gDecorations[gSpecialVar_0x8004].category) == -1)
+ {
+ sub_8127250(gStringVar2, gDecorations[gSpecialVar_0x8004].category);
+ gSpecialVar_Result = TRUE;
+ }
+}
+
+void ScrSpecial_TraderMenuGiveDecoration(void)
+{
+ CreateTask(sub_8127208, 0);
+}
+
+void sub_8133DA0(u8 taskId)
+{
+ if (IsSelectedDecorInThePC() == TRUE)
+ {
+ gSpecialVar_0x8006 = gCurDecorInventoryItems[gCurDecorationIndex];
+ StringCopy(gStringVar3, gDecorations[gSpecialVar_0x8004].name);
+ StringCopy(gStringVar2, gDecorations[gSpecialVar_0x8006].name);
+ }
+ else
+ {
+ gSpecialVar_0x8006 = 0xFFFF;
+ }
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+void sub_8133E1C(u8 taskId)
+{
+ gSpecialVar_0x8006 = 0;
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+void ScrSpecial_TraderDoDecorationTrade(void)
+{
+ struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader;
+
+ DecorationRemove(gSpecialVar_0x8006);
+ DecorationAdd(gSpecialVar_0x8004);
+ StringCopy(trader->playerNames[gSpecialVar_0x8005], gSaveBlock2Ptr->playerName);
+ trader->decorIds[gSpecialVar_0x8005] = gSpecialVar_0x8006;
+ trader->language[gSpecialVar_0x8005] = GAME_LANGUAGE;
+ trader->alreadyTraded = TRUE;
+}
+
+void ScrSpecial_TraderMenuGetDecoration(void)
+{
+ u8 taskId = CreateTask(Task_HandleGetDecorationMenuInput, 0);
+ CreateAvailableDecorationsMenu(taskId);
+}
diff --git a/src/trainer_see.c b/src/trainer_see.c
new file mode 100644
index 000000000..f5e9c300e
--- /dev/null
+++ b/src/trainer_see.c
@@ -0,0 +1,780 @@
+#include "global.h"
+#include "trainer_see.h"
+#include "battle_setup.h"
+#include "pokemon.h"
+#include "sprite.h"
+#include "field_effect.h"
+#include "event_object_movement.h"
+#include "field_player_avatar.h"
+#include "pokenav.h"
+#include "task.h"
+#include "util.h"
+#include "script.h"
+#include "event_data.h"
+#include "script_movement.h"
+
+extern bool8 InBattlePyramid(void);
+extern bool32 InTrainerHill(void);
+extern bool8 GetBattlePyramidTrainerFlag(u8 eventObjectId);
+extern bool8 GetTrainerHillTrainerFlag(u8 eventObjectId);
+extern void sub_809BE48(u16 npcId);
+
+// this file's functions
+static u8 CheckTrainer(u8 eventObjectId);
+static u8 GetTrainerApproachDistance(struct EventObject *trainerObj);
+static u8 CheckPathBetweenTrainerAndPlayer(struct EventObject *trainerObj, u8 approachDistance, u8 direction);
+static void TrainerApproachPlayer(struct EventObject *trainerObj, u8 range);
+static void Task_RunTrainerSeeFuncList(u8 taskId);
+static void Task_DestroyTrainerApproachTask(u8 taskId);
+static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum);
+
+static u8 GetTrainerApproachDistanceSouth(struct EventObject *trainerObj, s16 range, s16 x, s16 y);
+static u8 GetTrainerApproachDistanceNorth(struct EventObject *trainerObj, s16 range, s16 x, s16 y);
+static u8 GetTrainerApproachDistanceWest(struct EventObject *trainerObj, s16 range, s16 x, s16 y);
+static u8 GetTrainerApproachDistanceEast(struct EventObject *trainerObj, s16 range, s16 x, s16 y);
+
+static bool8 sub_80B4178(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B417C(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B4200(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B425C(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B4318(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B435C(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B4390(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B4438(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct EventObject *trainerObj);
+
+static void SpriteCB_TrainerIcons(struct Sprite *sprite);
+
+// IWRAM common
+u16 gUnknown_03006080;
+u8 gUnknown_03006084[4];
+struct ApproachingTrainer gApproachingTrainers[2];
+u8 gNoOfApproachingTrainers;
+u8 gUnknown_030060AC;
+
+// EWRAM
+EWRAM_DATA u8 gApproachingTrainerId = 0;
+
+// const rom data
+static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion_exclamation.4bpp");
+static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp");
+static const u8 sEmotion_HeartGfx[] = INCBIN_U8("graphics/misc/emotion_heart.4bpp");
+
+static u8 (*const sDirectionalApproachDistanceFuncs[])(struct EventObject *trainerObj, s16 range, s16 x, s16 y) =
+{
+ GetTrainerApproachDistanceSouth,
+ GetTrainerApproachDistanceNorth,
+ GetTrainerApproachDistanceWest,
+ GetTrainerApproachDistanceEast,
+};
+
+static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct EventObject *trainerObj) =
+{
+ sub_80B4178,
+ sub_80B417C,
+ sub_80B41C0,
+ sub_80B4200,
+ sub_80B425C,
+ sub_80B4318,
+ sub_80B435C,
+ sub_80B4390,
+ sub_80B43AC,
+ sub_80B43E0,
+ sub_80B4438,
+ sub_80B44AC
+};
+
+static bool8 (*const sTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct EventObject *trainerObj) =
+{
+ sub_80B43AC,
+ sub_80B43E0,
+ sub_80B4438,
+ sub_80B44AC,
+};
+
+static const struct OamData sOamData_Icons =
+{
+ .y = 0,
+ .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 struct SpriteFrameImage sSpriteImageTable_ExclamationQuestionMark[] =
+{
+ {sEmotion_ExclamationMarkGfx, 0x80},
+ {sEmotion_QuestionMarkGfx, 0x80}
+};
+
+static const struct SpriteFrameImage sSpriteImageTable_HeartIcon[] =
+{
+ {sEmotion_HeartGfx, 0x80}
+};
+
+static const union AnimCmd sSpriteAnim_Icons1[] =
+{
+ ANIMCMD_FRAME(0, 60),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_Icons2[] =
+{
+ ANIMCMD_FRAME(1, 60),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_Icons[] =
+{
+ sSpriteAnim_Icons1,
+ sSpriteAnim_Icons2
+};
+
+static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark =
+{
+ .tileTag = 0xffff,
+ .paletteTag = 0xffff,
+ .oam = &sOamData_Icons,
+ .anims = sSpriteAnimTable_Icons,
+ .images = sSpriteImageTable_ExclamationQuestionMark,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_TrainerIcons
+};
+
+static const struct SpriteTemplate sSpriteTemplate_HeartIcon =
+{
+ .tileTag = 0xffff,
+ .paletteTag = 0x1004,
+ .oam = &sOamData_Icons,
+ .anims = sSpriteAnimTable_Icons,
+ .images = sSpriteImageTable_HeartIcon,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_TrainerIcons
+};
+
+// code
+bool8 CheckForTrainersWantingBattle(void)
+{
+ u8 i;
+
+ gNoOfApproachingTrainers = 0;
+ gApproachingTrainerId = 0;
+
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
+ {
+ u8 retVal;
+
+ if (!gEventObjects[i].active)
+ continue;
+ if (gEventObjects[i].trainerType != 1 && gEventObjects[i].trainerType != 3)
+ continue;
+
+ retVal = CheckTrainer(i);
+ if (retVal == 2)
+ break; // two trainers have been found
+
+ if (retVal == 0) // no trainers
+ continue;
+
+ if (gNoOfApproachingTrainers > 1)
+ break;
+ if (GetMonsStateToDoubles_2() != 0) // one trainer found and cant have a double battle
+ break;
+ }
+
+ if (gNoOfApproachingTrainers == 1)
+ {
+ ResetTrainerOpponentIds();
+ ConfigureAndSetUpOneTrainerBattle(gApproachingTrainers[gNoOfApproachingTrainers - 1].eventObjectId,
+ gApproachingTrainers[gNoOfApproachingTrainers - 1].trainerScriptPtr);
+ gUnknown_030060AC = 1;
+ return TRUE;
+ }
+ else if (gNoOfApproachingTrainers == 2)
+ {
+ ResetTrainerOpponentIds();
+ for (i = 0; i < gNoOfApproachingTrainers; i++, gApproachingTrainerId++)
+ {
+ ConfigureTwoTrainersBattle(gApproachingTrainers[i].eventObjectId,
+ gApproachingTrainers[i].trainerScriptPtr);
+ }
+ SetUpTwoTrainersBattle();
+ gApproachingTrainerId = 0;
+ gUnknown_030060AC = 1;
+ return TRUE;
+ }
+ else
+ {
+ gUnknown_030060AC = 0;
+ return FALSE;
+ }
+}
+
+static u8 CheckTrainer(u8 eventObjectId)
+{
+ const u8 *scriptPtr;
+ u8 ret = 1;
+ u8 approachDistance;
+
+ if (InTrainerHill() == TRUE)
+ scriptPtr = sub_81D62AC();
+ else
+ scriptPtr = GetEventObjectScriptPointerByEventObjectId(eventObjectId);
+
+ if (InBattlePyramid())
+ {
+ if (GetBattlePyramidTrainerFlag(eventObjectId))
+ return 0;
+ }
+ else if (InTrainerHill() == TRUE)
+ {
+ if (GetTrainerHillTrainerFlag(eventObjectId))
+ return 0;
+ }
+ else
+ {
+ if (GetTrainerFlagFromScriptPointer(scriptPtr))
+ return 0;
+ }
+
+ approachDistance = GetTrainerApproachDistance(&gEventObjects[eventObjectId]);
+
+ if (approachDistance != 0)
+ {
+ if (scriptPtr[1] == TRAINER_BATTLE_DOUBLE
+ || scriptPtr[1] == TRAINER_BATTLE_REMATCH_DOUBLE
+ || scriptPtr[1] == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE)
+ {
+ if (GetMonsStateToDoubles_2() != 0)
+ return 0;
+
+ ret = 2;
+ }
+
+ gApproachingTrainers[gNoOfApproachingTrainers].eventObjectId = eventObjectId;
+ gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr;
+ gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance;
+ TrainerApproachPlayer(&gEventObjects[eventObjectId], approachDistance - 1);
+ gNoOfApproachingTrainers++;
+
+ return ret;
+ }
+
+ return 0;
+}
+
+static u8 GetTrainerApproachDistance(struct EventObject *trainerObj)
+{
+ s16 x, y;
+ u8 i;
+ u8 approachDistance;
+
+ PlayerGetDestCoords(&x, &y);
+ if (trainerObj->trainerType == 1) // can only see in one direction
+ {
+ approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->facingDirection - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->facingDirection);
+ }
+ else // can see in all directions
+ {
+ for (i = 0; i < 4; i++)
+ {
+ approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east
+ return approachDistance;
+ }
+ }
+
+ return 0;
+}
+
+// Returns how far south the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceSouth(struct EventObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.x == x
+ && y > trainerObj->currentCoords.y
+ && y <= trainerObj->currentCoords.y + range)
+ return (y - trainerObj->currentCoords.y);
+ else
+ return 0;
+}
+
+// Returns how far north the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceNorth(struct EventObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.x == x
+ && y < trainerObj->currentCoords.y
+ && y >= trainerObj->currentCoords.y - range)
+ return (trainerObj->currentCoords.y - y);
+ else
+ return 0;
+}
+
+// Returns how far west the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceWest(struct EventObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.y == y
+ && x < trainerObj->currentCoords.x
+ && x >= trainerObj->currentCoords.x - range)
+ return (trainerObj->currentCoords.x - x);
+ else
+ return 0;
+}
+
+// Returns how far east the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceEast(struct EventObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->currentCoords.y == y
+ && x > trainerObj->currentCoords.x
+ && x <= trainerObj->currentCoords.x + range)
+ return (x - trainerObj->currentCoords.x);
+ else
+ return 0;
+}
+
+#define COLLISION_MASK (~1)
+
+static u8 CheckPathBetweenTrainerAndPlayer(struct EventObject *trainerObj, u8 approachDistance, u8 direction)
+{
+ s16 x, y;
+ u8 unk19_temp;
+ u8 unk19b_temp;
+ u8 i;
+ u8 collision;
+
+ if (approachDistance == 0)
+ return 0;
+
+ x = trainerObj->currentCoords.x;
+ y = trainerObj->currentCoords.y;
+
+ MoveCoords(direction, &x, &y);
+ for (i = 0; i < approachDistance - 1; i++, MoveCoords(direction, &x, &y))
+ {
+ collision = GetCollisionFlagsAtCoords(trainerObj, x, y, direction);
+ if (collision != 0 && (collision & COLLISION_MASK))
+ return 0;
+ }
+
+ // preserve mapobj_unk_19 before clearing.
+ unk19_temp = trainerObj->range.as_nybbles.x;
+ unk19b_temp = trainerObj->range.as_nybbles.y;
+ trainerObj->range.as_nybbles.x = 0;
+ trainerObj->range.as_nybbles.y = 0;
+
+ collision = GetCollisionAtCoords(trainerObj, x, y, direction);
+
+ trainerObj->range.as_nybbles.x = unk19_temp;
+ trainerObj->range.as_nybbles.y = unk19b_temp;
+ if (collision == 4)
+ return approachDistance;
+
+ return 0;
+}
+
+#define tFuncId data[0]
+#define tTrainerRange data[3]
+#define tOutOfAshSpriteId data[4]
+#define tTrainerEventObjectId data[7]
+
+static void TrainerApproachPlayer(struct EventObject *trainerObj, u8 range)
+{
+ struct Task *task;
+
+ gApproachingTrainers[gNoOfApproachingTrainers].taskId = CreateTask(Task_RunTrainerSeeFuncList, 0x50);
+ task = &gTasks[gApproachingTrainers[gNoOfApproachingTrainers].taskId];
+ task->tTrainerRange = range;
+ task->tTrainerEventObjectId = gApproachingTrainers[gNoOfApproachingTrainers].eventObjectId;
+}
+
+static void sub_80B40C8(TaskFunc followupFunc)
+{
+ u8 taskId;
+ TaskFunc taskFunc;
+
+ if (gApproachingTrainerId == 0)
+ taskId = gApproachingTrainers[0].taskId;
+ else
+ taskId = gApproachingTrainers[1].taskId;
+
+ taskFunc = Task_RunTrainerSeeFuncList;
+ SetTaskFuncWithFollowupFunc(taskId, taskFunc, followupFunc);
+ gTasks[taskId].tFuncId = 1;
+ taskFunc(taskId);
+}
+
+static void Task_RunTrainerSeeFuncList(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct EventObject *trainerObj = &gEventObjects[task->tTrainerEventObjectId];
+
+ if (!trainerObj->active)
+ {
+ SwitchTaskToFollowupFunc(taskId);
+ }
+ else
+ {
+ while (sTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj));
+ }
+}
+
+static bool8 sub_80B4178(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ return FALSE;
+}
+
+static bool8 sub_80B417C(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ u8 direction;
+
+ EventObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON);
+ direction = GetFaceDirectionMovementAction(trainerObj->facingDirection);
+ EventObjectSetHeldMovement(trainerObj, direction);
+ task->tFuncId++;
+ return TRUE;
+}
+
+static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON))
+ {
+ return FALSE;
+ }
+ else
+ {
+ task->tFuncId++;
+ if (trainerObj->movementType == 57 || trainerObj->movementType == 58)
+ task->tFuncId = 6;
+ if (trainerObj->movementType == 63)
+ task->tFuncId = 8;
+ return TRUE;
+ }
+}
+
+static bool8 sub_80B4200(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ if (!(EventObjectIsMovementOverridden(trainerObj)) || EventObjectClearHeldMovementIfFinished(trainerObj))
+ {
+ if (task->tTrainerRange)
+ {
+ EventObjectSetHeldMovement(trainerObj, GetWalkNormalMovementAction(trainerObj->facingDirection));
+ task->tTrainerRange--;
+ }
+ else
+ {
+ EventObjectSetHeldMovement(trainerObj, 0x3E);
+ task->tFuncId++;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_80B425C(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ struct EventObject *playerObj;
+
+ if (EventObjectIsMovementOverridden(trainerObj) && !EventObjectClearHeldMovementIfFinished(trainerObj))
+ return FALSE;
+
+ SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));
+ TryOverrideTemplateCoordsForEventObject(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection));
+ OverrideTemplateCoordsForEventObject(trainerObj);
+
+ playerObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if (EventObjectIsMovementOverridden(playerObj) && !EventObjectClearHeldMovementIfFinished(playerObj))
+ return FALSE;
+
+ sub_808BCE8();
+ EventObjectSetHeldMovement(&gEventObjects[gPlayerAvatar.eventObjectId], GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection)));
+ task->tFuncId++;
+ return FALSE;
+}
+
+static bool8 sub_80B4318(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ struct EventObject *playerObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+
+ if (!EventObjectIsMovementOverridden(playerObj)
+ || EventObjectClearHeldMovementIfFinished(playerObj))
+ SwitchTaskToFollowupFunc(taskId);
+ return FALSE;
+}
+
+static bool8 sub_80B435C(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ if (!EventObjectIsMovementOverridden(trainerObj)
+ || EventObjectClearHeldMovementIfFinished(trainerObj))
+ {
+ EventObjectSetHeldMovement(trainerObj, 0x59);
+ task->tFuncId++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80B4390(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ if (EventObjectClearHeldMovementIfFinished(trainerObj))
+ task->tFuncId = 3;
+
+ return FALSE;
+}
+
+static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ if (!EventObjectIsMovementOverridden(trainerObj)
+ || EventObjectClearHeldMovementIfFinished(trainerObj))
+ {
+ EventObjectSetHeldMovement(trainerObj, 0x3E);
+ task->tFuncId++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ if (EventObjectCheckHeldMovementStatus(trainerObj))
+ {
+ gFieldEffectArguments[0] = trainerObj->currentCoords.x;
+ gFieldEffectArguments[1] = trainerObj->currentCoords.y;
+ gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1;
+ gFieldEffectArguments[3] = 2;
+ task->tOutOfAshSpriteId = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
+ task->tFuncId++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80B4438(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ struct Sprite *sprite;
+
+ if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2)
+ {
+ trainerObj->fixedPriority = 0;
+ trainerObj->triggerGroundEffectsOnMove = 1;
+
+ sprite = &gSprites[trainerObj->spriteId];
+ sprite->oam.priority = 2;
+ EventObjectClearHeldMovementIfFinished(trainerObj);
+ EventObjectSetHeldMovement(trainerObj, GetJumpInPlaceMovementAction(trainerObj->facingDirection));
+ task->tFuncId++;
+ }
+
+ return FALSE;
+}
+
+static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct EventObject *trainerObj)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
+ task->tFuncId = 3;
+
+ return FALSE;
+}
+
+#undef tFuncId
+#undef tTrainerRange
+#undef tOutOfAshSpriteId
+#undef tTrainerEventObjectId
+
+static void sub_80B44C8(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct EventObject *eventObj;
+
+ // another eventObj loaded into by loadword?
+ LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&eventObj);
+ if (!task->data[7])
+ {
+ EventObjectClearHeldMovement(eventObj);
+ task->data[7]++;
+ }
+ sTrainerSeeFuncList2[task->data[0]](taskId, task, eventObj);
+ if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
+ {
+ SetTrainerMovementType(eventObj, GetTrainerFacingDirectionMovementType(eventObj->facingDirection));
+ TryOverrideTemplateCoordsForEventObject(eventObj, GetTrainerFacingDirectionMovementType(eventObj->facingDirection));
+ DestroyTask(taskId);
+ }
+ else
+ {
+ eventObj->heldMovementFinished = 0;
+ }
+}
+
+void sub_80B4578(struct EventObject *var)
+{
+ StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80B44C8, 0)].data[1], (u32)var);
+}
+
+void EndTrainerApproach(void)
+{
+ sub_80B40C8(Task_DestroyTrainerApproachTask);
+}
+
+static void Task_DestroyTrainerApproachTask(u8 taskId)
+{
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+void sub_80B45D0(void)
+{
+ if (gNoOfApproachingTrainers == 2)
+ {
+ if (gApproachingTrainerId == 0)
+ {
+ gApproachingTrainerId++;
+ gSpecialVar_Result = 1;
+ UnfreezeEventObjects();
+ FreezeEventObjectsExceptOne(gApproachingTrainers[1].eventObjectId);
+ }
+ else
+ {
+ gApproachingTrainerId = 0;
+ gSpecialVar_Result = 0;
+ }
+ }
+ else
+ {
+ gSpecialVar_Result = 0;
+ }
+}
+
+#define sLocalId data[0]
+#define sMapNum data[1]
+#define sMapGroup data[2]
+#define sData3 data[3]
+#define sData4 data[4]
+#define sFldEffId data[7]
+
+u8 FldEff_ExclamationMarkIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53);
+
+ if (spriteId != MAX_SPRITES)
+ SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0);
+
+ return 0;
+}
+
+u8 FldEff_QuestionMarkIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x52);
+
+ if (spriteId != MAX_SPRITES)
+ SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 1);
+
+ return 0;
+}
+
+u8 FldEff_HeartIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_HeartIcon, 0, 0, 0x52);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ SetIconSpriteData(sprite, FLDEFF_HEART_ICON, 0);
+ sprite->oam.paletteNum = 2;
+ }
+
+ return 0;
+}
+
+static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum)
+{
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = 1;
+
+ sprite->sLocalId = gFieldEffectArguments[0];
+ sprite->sMapNum = gFieldEffectArguments[1];
+ sprite->sMapGroup = gFieldEffectArguments[2];
+ sprite->sData3 = -5;
+ sprite->sFldEffId = fldEffId;
+
+ StartSpriteAnim(sprite, spriteAnimNum);
+}
+
+static void SpriteCB_TrainerIcons(struct Sprite *sprite)
+{
+ u8 eventObjId;
+
+ if (TryGetEventObjectIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &eventObjId)
+ || sprite->animEnded)
+ {
+ FieldEffectStop(sprite, sprite->sFldEffId);
+ }
+ else
+ {
+ struct Sprite *eventObjSprite = &gSprites[gEventObjects[eventObjId].spriteId];
+ sprite->sData4 += sprite->sData3;
+ sprite->pos1.x = eventObjSprite->pos1.x;
+ sprite->pos1.y = eventObjSprite->pos1.y - 16;
+ sprite->pos2.x = eventObjSprite->pos2.x;
+ sprite->pos2.y = eventObjSprite->pos2.y + sprite->sData4;
+ if (sprite->sData4)
+ sprite->sData3++;
+ else
+ sprite->sData3 = 0;
+ }
+}
+
+#undef sLocalId
+#undef sMapNum
+#undef sMapGroup
+#undef sData3
+#undef sData4
+#undef sFldEffId
+
+u8 GetCurrentApproachingTrainerEventObjectId(void)
+{
+ if (gApproachingTrainerId == 0)
+ return gApproachingTrainers[0].eventObjectId;
+ else
+ return gApproachingTrainers[1].eventObjectId;
+}
+
+u8 GetChosenApproachingTrainerEventObjectId(u8 arrayId)
+{
+ if (arrayId >= ARRAY_COUNT(gApproachingTrainers))
+ return 0;
+ else if (arrayId == 0)
+ return gApproachingTrainers[0].eventObjectId;
+ else
+ return gApproachingTrainers[1].eventObjectId;
+}
+
+void sub_80B4808(void)
+{
+ struct EventObject *trainerObj;
+
+ if (gUnknown_030060AC == 1)
+ {
+ trainerObj = &gEventObjects[gApproachingTrainers[gUnknown_03006080].eventObjectId];
+ gUnknown_03006084[0] = GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection));
+ gUnknown_03006084[1] = 0xFE;
+ ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084);
+ }
+ else
+ {
+ trainerObj = &gEventObjects[gPlayerAvatar.eventObjectId];
+ gUnknown_03006084[0] = GetFaceDirectionMovementAction(trainerObj->facingDirection);
+ gUnknown_03006084[1] = 0xFE;
+ ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084);
+ }
+
+ sub_809BE48(0xFF);
+}
diff --git a/src/tv.c b/src/tv.c
index 1d978b093..2e915697e 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -1,10 +1,8 @@
-
-// Includes
#include "global.h"
#include "rtc.h"
#include "overworld.h"
-#include "map_constants.h"
-#include "rng.h"
+#include "constants/maps.h"
+#include "random.h"
#include "event_data.h"
#include "fieldmap.h"
#include "field_camera.h"
@@ -14,12 +12,12 @@
#include "pokemon_storage_system.h"
#include "field_message_box.h"
#include "easy_chat.h"
-#include "species.h"
-#include "moves.h"
+#include "constants/species.h"
+#include "constants/moves.h"
#include "battle.h"
#include "battle_tower.h"
#include "contest.h"
-#include "items.h"
+#include "constants/items.h"
#include "item.h"
#include "link.h"
#include "main.h"
@@ -28,15 +26,17 @@
#include "lilycove_lady.h"
#include "rom6.h"
#include "pokedex.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "text.h"
#include "script_menu.h"
#include "naming_screen.h"
#include "malloc.h"
#include "region_map.h"
+#include "constants/region_map_sections.h"
#include "decoration.h"
#include "secret_base.h"
#include "tv.h"
+#include "data2.h"
// Static type declarations
@@ -85,101 +85,100 @@ void tv_store_id_3x(TVShow *show);
void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx);
s8 FindEmptyTVSlotWithinFirstFiveShowsOfArray(TVShow *shows);
void FindActiveBroadcastByShowType_SetScriptResult(u8 kind);
-void InterviewBefore_BravoTrainerPkmnProfile(void);
-void InterviewBefore_NameRater(void);
+static void InterviewBefore_BravoTrainerPkmnProfile(void);
+static void InterviewBefore_NameRater(void);
u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies);
-void sub_80EFA88(void);
-void sub_80EF93C(TVShow *shows);
+static void sub_80EFA88(void);
+static void sub_80EF93C(TVShow *shows);
s8 sub_80EEE30(PokeNews *pokeNews);
bool8 sub_80EF0E4(u8 newsKind);
void ClearPokemonNewsI(u8 i);
-void sub_80F1254(TVShow *shows);
-void sub_80F12A4(TVShow *shows);
-void sub_80F0358(TVShow *player1, TVShow *player2, TVShow *player3, TVShow *player4);
-void sub_80F0C04(void);
-void sub_80F0708(void);
-void sub_80F0B64(void);
-s8 sub_80F06D0(TVShow *tvShows);
-bool8 sub_80F049C(TVShow *dest[], TVShow *src[], u8 idx);
-bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx);
-bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx);
-bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx);
-void sub_80F0B00(u8 showIdx);
-void sub_80F0B24(u16 species, u8 showIdx);
-void sub_80F0D60(PokeNews *player1, PokeNews *player2, PokeNews *player3, PokeNews *player4);
-void sub_80F0EEC(void);
-void sub_80F0F24(void);
-s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx);
-void sub_80F0E58(PokeNews *dest[], PokeNews *src[]);
-bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot);
+static void sub_80F1254(TVShow *shows);
+static void sub_80F12A4(TVShow *shows);
+static void sub_80F0358(TVShow *player1, TVShow *player2, TVShow *player3, TVShow *player4);
+static void sub_80F0C04(void);
+static void sub_80F0708(void);
+static void sub_80F0B64(void);
+static s8 sub_80F06D0(TVShow *tvShows);
+static bool8 sub_80F049C(TVShow *dest[], TVShow *src[], u8 idx);
+static bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx);
+static bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx);
+static bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx);
+void SetTvShowInactive(u8 showIdx);
+static void sub_80F0B24(u16 species, u8 showIdx);
+static void sub_80F0D60(PokeNews *player1, PokeNews *player2, PokeNews *player3, PokeNews *player4);
+static void sub_80F0EEC(void);
+static void sub_80F0F24(void);
+static s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx);
+static void sub_80F0E58(PokeNews *dest[], PokeNews *src[]);
+static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot);
void TVShowDone(void);
-void InterviewAfter_FanClubLetter(void);
-void InterviewAfter_RecentHappenings(void);
-void InterviewAfter_PkmnFanClubOpinions(void);
-void InterviewAfter_DummyShow4(void);
-void InterviewAfter_BravoTrainerPokemonProfile(void);
-void InterviewAfter_BravoTrainerBattleTowerProfile(void);
-void InterviewAfter_ContestLiveUpdates(void);
+static void InterviewAfter_FanClubLetter(void);
+static void InterviewAfter_RecentHappenings(void);
+static void InterviewAfter_PkmnFanClubOpinions(void);
+static void InterviewAfter_DummyShow4(void);
+static void InterviewAfter_BravoTrainerPokemonProfile(void);
+static void InterviewAfter_BravoTrainerBattleTowerProfile(void);
+static void InterviewAfter_ContestLiveUpdates(void);
void UpdateWorldOfMastersAndPutItOnTheAir(void);
void PutPokemonTodayFailedOnTheAir(void);
-void sub_80ED718(void);
-void sub_80EED88(void);
+static void sub_80ED718(void);
+static void sub_80EED88(void);
void TV_SortPurchasesByQuantity(void);
-void sub_80ED8B4(u16 days);
+static void sub_80ED8B4(u16 days);
void UpdateMassOutbreakTimeLeft(u16 days);
-void sub_80EF120(u16 days);
-void sub_80EDA48(u16 days);
-void sub_80EEB98(u16 days);
+static void sub_80EF120(u16 days);
+static void sub_80EDA48(u16 days);
+static void sub_80EEB98(u16 days);
void PutFishingAdviceShowOnTheAir(void);
-void sub_80EDA80(void);
u8 TV_MonDataIdxToRibbon(u8 monDataIdx);
-void sub_80EEBF4(u8 actionIdx);
+static void sub_80EEBF4(u8 actionIdx);
bool8 IsPriceDiscounted(u8 newsKind);
-void InterviewBefore_FanClubLetter(void);
-void InterviewBefore_RecentHappenings(void);
-void InterviewBefore_PkmnFanClubOpinions(void);
-void InterviewBefore_Dummy(void);
-void InterviewBefore_BravoTrainerBTProfile(void);
-void InterviewBefore_ContestLiveUpdates(void);
-void InterviewBefore_3CheersForPokeblocks(void);
-void InterviewBefore_FanClubSpecial(void);
+static void InterviewBefore_FanClubLetter(void);
+static void InterviewBefore_RecentHappenings(void);
+static void InterviewBefore_PkmnFanClubOpinions(void);
+static void InterviewBefore_Dummy(void);
+static void InterviewBefore_BravoTrainerBTProfile(void);
+static void InterviewBefore_ContestLiveUpdates(void);
+static void InterviewBefore_3CheersForPokeblocks(void);
+static void InterviewBefore_FanClubSpecial(void);
void ChangeBoxPokemonNickname_CB(void);
-void DoTVShowPokemonFanClubLetter(void);
-void DoTVShowRecentHappenings(void);
-void DoTVShowPokemonFanClubOpinions(void);
-void DoTVShowDummiedOut(void);
-void DoTVShowPokemonNewsMassOutbreak(void);
-void DoTVShowBravoTrainerPokemonProfile(void);
-void DoTVShowBravoTrainerBattleTower(void);
-void DoTVShowPokemonTodaySuccessfulCapture(void);
-void DoTVShowTodaysSmartShopper(void);
-void DoTVShowTheNameRaterShow(void);
-void DoTVShowPokemonContestLiveUpdates(void);
-void DoTVShowPokemonBattleUpdate(void);
-void DoTVShow3CheersForPokeblocks(void);
-void DoTVShowPokemonTodayFailedCapture(void);
-void DoTVShowPokemonAngler(void);
-void DoTVShowTheWorldOfMasters(void);
-void DoTVShowTodaysRivalTrainer(void);
-void DoTVShowDewfordTrendWatcherNetwork(void);
-void DoTVShowHoennTreasureInvestigators(void);
-void DoTVShowFindThatGamer(void);
-void DoTVShowBreakingNewsTV(void);
-void DoTVShowSecretBaseVisit(void);
-void DoTVShowPokemonLotteryWinnerFlashReport(void);
-void DoTVShowThePokemonBattleSeminar(void);
-void DoTVShowTrainerFanClubSpecial(void);
-void DoTVShowTrainerFanClub(void);
-void DoTVShowSpotTheCuties(void);
-void DoTVShowPokemonNewsBattleFrontier(void);
-void DoTVShowWhatsNo1InHoennToday(void);
-void DoTVShowSecretBaseSecrets(void);
-void DoTVShowSafariFanClub(void);
-void DoTVShowPokemonContestLiveUpdates2(void);
+static void DoTVShowPokemonFanClubLetter(void);
+static void DoTVShowRecentHappenings(void);
+static void DoTVShowPokemonFanClubOpinions(void);
+static void DoTVShowDummiedOut(void);
+static void DoTVShowPokemonNewsMassOutbreak(void);
+static void DoTVShowBravoTrainerPokemonProfile(void);
+static void DoTVShowBravoTrainerBattleTower(void);
+static void DoTVShowPokemonTodaySuccessfulCapture(void);
+static void DoTVShowTodaysSmartShopper(void);
+static void DoTVShowTheNameRaterShow(void);
+static void DoTVShowPokemonContestLiveUpdates(void);
+static void DoTVShowPokemonBattleUpdate(void);
+static void DoTVShow3CheersForPokeblocks(void);
+static void DoTVShowPokemonTodayFailedCapture(void);
+static void DoTVShowPokemonAngler(void);
+static void DoTVShowTheWorldOfMasters(void);
+static void DoTVShowTodaysRivalTrainer(void);
+static void DoTVShowDewfordTrendWatcherNetwork(void);
+static void DoTVShowHoennTreasureInvestigators(void);
+static void DoTVShowFindThatGamer(void);
+static void DoTVShowBreakingNewsTV(void);
+static void DoTVShowSecretBaseVisit(void);
+static void DoTVShowPokemonLotteryWinnerFlashReport(void);
+static void DoTVShowThePokemonBattleSeminar(void);
+static void DoTVShowTrainerFanClubSpecial(void);
+static void DoTVShowTrainerFanClub(void);
+static void DoTVShowSpotTheCuties(void);
+static void DoTVShowPokemonNewsBattleFrontier(void);
+static void DoTVShowWhatsNo1InHoennToday(void);
+static void DoTVShowSecretBaseSecrets(void);
+static void DoTVShowSafariFanClub(void);
+static void DoTVShowPokemonContestLiveUpdates2(void);
// .rodata
-const struct {
+static const struct {
u16 species;
u16 moves[4];
u8 level;
@@ -212,8 +211,7 @@ const struct {
}
};
-// TODO: Figure out what these are, and define constants in include/flags.h
-const u16 sGoldSymbolFlags[] = {
+static const u16 sGoldSymbolFlags[] = {
FLAG_SYS_TOWER_GOLD,
FLAG_SYS_DOME_GOLD,
FLAG_SYS_PALACE_GOLD,
@@ -223,7 +221,7 @@ const u16 sGoldSymbolFlags[] = {
FLAG_SYS_PYRAMID_GOLD
};
-const u16 sSilverSymbolFlags[] = {
+static const u16 sSilverSymbolFlags[] = {
FLAG_SYS_TOWER_SILVER,
FLAG_SYS_DOME_SILVER,
FLAG_SYS_PALACE_SILVER,
@@ -233,8 +231,7 @@ const u16 sSilverSymbolFlags[] = {
FLAG_SYS_PYRAMID_SILVER
};
-// TODO: Figure out what these are, and define constants in include/vars.h
-const u16 sNumberOneVarsAndThresholds[][2] = {
+static const u16 sNumberOneVarsAndThresholds[][2] = {
{VAR_DAILY_SLOTS, 100},
{VAR_DAILY_ROULETTE, 50},
{VAR_DAILY_WILDS, 100},
@@ -244,7 +241,7 @@ const u16 sNumberOneVarsAndThresholds[][2] = {
{VAR_DAILY_BP, 30}
};
-const u8 *const sPokeNewsTextGroup_Upcoming[] = {
+static const u8 *const sPokeNewsTextGroup_Upcoming[] = {
NULL,
gPokeNewsTextSlateport_Upcoming,
gPokeNewsTextGameCorner_Upcoming,
@@ -252,7 +249,7 @@ const u8 *const sPokeNewsTextGroup_Upcoming[] = {
gPokeNewsTextBlendMaster_Upcoming
};
-const u8 *const sPokeNewsTextGroup_Ongoing[] = {
+static const u8 *const sPokeNewsTextGroup_Ongoing[] = {
NULL,
gPokeNewsTextSlateport_Ongoing,
gPokeNewsTextGameCorner_Ongoing,
@@ -260,7 +257,7 @@ const u8 *const sPokeNewsTextGroup_Ongoing[] = {
gPokeNewsTextBlendMaster_Ongoing
};
-const u8 *const sPokeNewsTextGroup_Ending[] = {
+static const u8 *const sPokeNewsTextGroup_Ending[] = {
NULL,
gPokeNewsTextSlateport_Ending,
gPokeNewsTextGameCorner_Ending,
@@ -274,7 +271,7 @@ u8 *const gTVStringVarPtrs[] = {
gStringVar3
};
-const u8 *const sTVFanClubTextGroup[] = {
+static const u8 *const sTVFanClubTextGroup[] = {
gTVFanClubText00,
gTVFanClubText01,
gTVFanClubText02,
@@ -285,7 +282,7 @@ const u8 *const sTVFanClubTextGroup[] = {
gTVFanClubText07
};
-const u8 *const sTVRecentHappeninssTextGroup[] = {
+static const u8 *const sTVRecentHappeninssTextGroup[] = {
gTVRecentHappeningsText00,
gTVRecentHappeningsText01,
gTVRecentHappeningsText02,
@@ -294,7 +291,7 @@ const u8 *const sTVRecentHappeninssTextGroup[] = {
gTVRecentHappeningsText05
};
-const u8 *const sTVFanClubOpinionsTextGroup[] = {
+static const u8 *const sTVFanClubOpinionsTextGroup[] = {
gTVFanClubOpinionsText00,
gTVFanClubOpinionsText01,
gTVFanClubOpinionsText02,
@@ -302,11 +299,11 @@ const u8 *const sTVFanClubOpinionsTextGroup[] = {
gTVFanClubOpinionsText04
};
-const u8 *const sTVMassOutbreakTextGroup[] = {
+static const u8 *const sTVMassOutbreakTextGroup[] = {
gTVMassOutbreakText00
};
-const u8 *const sTVPokemonTodaySuccessfulTextGroup[] = {
+static const u8 *const sTVPokemonTodaySuccessfulTextGroup[] = {
gTVPokemonTodaySuccessfulText00,
gTVPokemonTodaySuccessfulText01,
gTVPokemonTodaySuccessfulText02,
@@ -321,7 +318,7 @@ const u8 *const sTVPokemonTodaySuccessfulTextGroup[] = {
gTVPokemonTodaySuccessfulText11
};
-const u8 *const sTVTodaysSmartShopperTextGroup[] = {
+static const u8 *const sTVTodaysSmartShopperTextGroup[] = {
gTVTodaysSmartShopperText00,
gTVTodaysSmartShopperText01,
gTVTodaysSmartShopperText02,
@@ -337,7 +334,7 @@ const u8 *const sTVTodaysSmartShopperTextGroup[] = {
gTVTodaysSmartShopperText12
};
-const u8 *const sTVBravoTrainerTextGroup[] = {
+static const u8 *const sTVBravoTrainerTextGroup[] = {
gTVBravoTrainerText00,
gTVBravoTrainerText01,
gTVBravoTrainerText02,
@@ -349,7 +346,7 @@ const u8 *const sTVBravoTrainerTextGroup[] = {
gTVBravoTrainerText08
};
-const u8 *const sTV3CheersForPokeblocksTextGroup[] = {
+static const u8 *const sTV3CheersForPokeblocksTextGroup[] = {
gTV3CheersForPokeblocksText00,
gTV3CheersForPokeblocksText01,
gTV3CheersForPokeblocksText02,
@@ -358,7 +355,7 @@ const u8 *const sTV3CheersForPokeblocksTextGroup[] = {
gTV3CheersForPokeblocksText05
};
-const u8 *const sTVBravoTrainerBattleTowerTextGroup[] = {
+static const u8 *const sTVBravoTrainerBattleTowerTextGroup[] = {
gTVBravoTrainerBattleTowerText00,
gTVBravoTrainerBattleTowerText01,
gTVBravoTrainerBattleTowerText02,
@@ -376,7 +373,7 @@ const u8 *const sTVBravoTrainerBattleTowerTextGroup[] = {
gTVBravoTrainerBattleTowerText14
};
-const u8 *const sTVContestLiveUpdatesTextGroup[] = {
+static const u8 *const sTVContestLiveUpdatesTextGroup[] = {
gTVContestLiveUpdatesText00,
gTVContestLiveUpdatesText01,
gTVContestLiveUpdatesText02,
@@ -412,7 +409,7 @@ const u8 *const sTVContestLiveUpdatesTextGroup[] = {
gTVContestLiveUpdatesText32
};
-const u8 *const sTVPokemonBattleUpdateTextGroup[] = {
+static const u8 *const sTVPokemonBattleUpdateTextGroup[] = {
gTVPokemonBattleUpdateText00,
gTVPokemonBattleUpdateText01,
gTVPokemonBattleUpdateText02,
@@ -423,7 +420,7 @@ const u8 *const sTVPokemonBattleUpdateTextGroup[] = {
gTVPokemonBattleUpdateText07
};
-const u8 *const sTVTrainerFanClubSpecialTextGroup[] = {
+static const u8 *const sTVTrainerFanClubSpecialTextGroup[] = {
gTVTrainerFanClubSpecialText00,
gTVTrainerFanClubSpecialText01,
gTVTrainerFanClubSpecialText02,
@@ -432,7 +429,7 @@ const u8 *const sTVTrainerFanClubSpecialTextGroup[] = {
gTVTrainerFanClubSpecialText05
};
-const u8 *const sTVNameRaterTextGroup[] = {
+static const u8 *const sTVNameRaterTextGroup[] = {
gTVNameRaterText00,
gTVNameRaterText01,
gTVNameRaterText02,
@@ -454,14 +451,14 @@ const u8 *const sTVNameRaterTextGroup[] = {
gTVNameRaterText18
};
-const u8 *const sTVPokemonContestLiveUpdates2TextGroup[] = {
+static const u8 *const sTVPokemonContestLiveUpdates2TextGroup[] = {
gTVPokemonContestLiveUpdates2Text00,
gTVPokemonContestLiveUpdates2Text01,
gTVPokemonContestLiveUpdates2Text02,
gTVPokemonContestLiveUpdates2Text03
};
-const u8 *const sTVPokemonTodayFailedTextGroup[] = {
+static const u8 *const sTVPokemonTodayFailedTextGroup[] = {
gTVPokemonTodayFailedText00,
gTVPokemonTodayFailedText01,
gTVPokemonTodayFailedText02,
@@ -471,18 +468,18 @@ const u8 *const sTVPokemonTodayFailedTextGroup[] = {
gTVPokemonTodayFailedText06
};
-const u8 *const sTVPokemonAnslerTextGroup[] = {
+static const u8 *const sTVPokemonAnslerTextGroup[] = {
gTVPokemonAnglerText00,
gTVPokemonAnglerText01
};
-const u8 *const sTVWorldOfMastersTextGroup[] = {
+static const u8 *const sTVWorldOfMastersTextGroup[] = {
gTVWorldOfMastersText00,
gTVWorldOfMastersText01,
gTVWorldOfMastersText02
};
-const u8 *const sTVTodaysRivalTrainerTextGroup[] = {
+static const u8 *const sTVTodaysRivalTrainerTextGroup[] = {
gTVTodaysRivalTrainerText00,
gTVTodaysRivalTrainerText01,
gTVTodaysRivalTrainerText02,
@@ -496,7 +493,7 @@ const u8 *const sTVTodaysRivalTrainerTextGroup[] = {
gTVTodaysRivalTrainerText10
};
-const u8 *const sTVDewfordTrendWatcherNetworkTextGroup[] = {
+static const u8 *const sTVDewfordTrendWatcherNetworkTextGroup[] = {
gTVDewfordTrendWatcherNetworkText00,
gTVDewfordTrendWatcherNetworkText01,
gTVDewfordTrendWatcherNetworkText02,
@@ -506,20 +503,20 @@ const u8 *const sTVDewfordTrendWatcherNetworkTextGroup[] = {
gTVDewfordTrendWatcherNetworkText06
};
-const u8 *const sTVHoennTreasureInvestisatorsTextGroup[] = {
+static const u8 *const sTVHoennTreasureInvestisatorsTextGroup[] = {
gTVHoennTreasureInvestigatorsText00,
gTVHoennTreasureInvestigatorsText01,
gTVHoennTreasureInvestigatorsText02
};
-const u8 *const sTVFindThatGamerTextGroup[] = {
+static const u8 *const sTVFindThatGamerTextGroup[] = {
gTVFindThatGamerText00,
gTVFindThatGamerText01,
gTVFindThatGamerText02,
gTVFindThatGamerText03
};
-const u8 *const sTVBreakinsNewsTextGroup[] = {
+static const u8 *const sTVBreakinsNewsTextGroup[] = {
gTVBreakingNewsText00,
gTVBreakingNewsText01,
gTVBreakingNewsText02,
@@ -535,7 +532,7 @@ const u8 *const sTVBreakinsNewsTextGroup[] = {
gTVBreakingNewsText12
};
-const u8 *const sTVSecretBaseVisitTextGroup[] = {
+static const u8 *const sTVSecretBaseVisitTextGroup[] = {
gTVSecretBaseVisitText00,
gTVSecretBaseVisitText01,
gTVSecretBaseVisitText02,
@@ -552,11 +549,11 @@ const u8 *const sTVSecretBaseVisitTextGroup[] = {
gTVSecretBaseVisitText13
};
-const u8 *const sTVPokemonLotteryWinnerFlashReportTextGroup[] = {
+static const u8 *const sTVPokemonLotteryWinnerFlashReportTextGroup[] = {
gTVPokemonLotteryWinnerFlashReportText00
};
-const u8 *const sTVThePokemonBattleSeminarTextGroup[] = {
+static const u8 *const sTVThePokemonBattleSeminarTextGroup[] = {
gTVThePokemonBattleSeminarText00,
gTVThePokemonBattleSeminarText01,
gTVThePokemonBattleSeminarText02,
@@ -566,7 +563,7 @@ const u8 *const sTVThePokemonBattleSeminarTextGroup[] = {
gTVThePokemonBattleSeminarText06
};
-const u8 *const sTVTrainerFanClubTextGroup[] = {
+static const u8 *const sTVTrainerFanClubTextGroup[] = {
gTVTrainerFanClubText00,
gTVTrainerFanClubText01,
gTVTrainerFanClubText02,
@@ -581,7 +578,7 @@ const u8 *const sTVTrainerFanClubTextGroup[] = {
gTVTrainerFanClubText11
};
-const u8 *const sTVCutiesTextGroup[] = {
+static const u8 *const sTVCutiesTextGroup[] = {
gTVCutiesText00,
gTVCutiesText01,
gTVCutiesText02,
@@ -600,7 +597,7 @@ const u8 *const sTVCutiesTextGroup[] = {
gTVCutiesText15
};
-const u8 *const sTVPokemonNewsBattleFrontierTextGroup[] = {
+static const u8 *const sTVPokemonNewsBattleFrontierTextGroup[] = {
gTVPokemonNewsBattleFrontierText00,
gTVPokemonNewsBattleFrontierText01,
gTVPokemonNewsBattleFrontierText02,
@@ -622,7 +619,7 @@ const u8 *const sTVPokemonNewsBattleFrontierTextGroup[] = {
gTVPokemonNewsBattleFrontierText18
};
-const u8 *const sTVWhatsNo1InHoennTodayTextGroup[] = {
+static const u8 *const sTVWhatsNo1InHoennTodayTextGroup[] = {
gTVWhatsNo1InHoennTodayText00,
gTVWhatsNo1InHoennTodayText01,
gTVWhatsNo1InHoennTodayText02,
@@ -634,7 +631,7 @@ const u8 *const sTVWhatsNo1InHoennTodayTextGroup[] = {
gTVWhatsNo1InHoennTodayText08
};
-const u8 *const sTVSecretBaseSecretsTextGroup[] = {
+static const u8 *const sTVSecretBaseSecretsTextGroup[] = {
gTVSecretBaseSecretsText00,
gTVSecretBaseSecretsText01,
gTVSecretBaseSecretsText02,
@@ -680,7 +677,7 @@ const u8 *const sTVSecretBaseSecretsTextGroup[] = {
gTVSecretBaseSecretsText42
};
-const u8 *const sTVSafariFanClubTextGroup[] = {
+static const u8 *const sTVSafariFanClubTextGroup[] = {
gTVSafariFanClubText00,
gTVSafariFanClubText01,
gTVSafariFanClubText02,
@@ -694,7 +691,7 @@ const u8 *const sTVSafariFanClubTextGroup[] = {
gTVSafariFanClubText10
};
-const u8 *const sTVInSearchOfTrainersTextGroup[] = {
+static const u8 *const sTVInSearchOfTrainersTextGroup[] = {
gTVInSearchOfTrainersText00,
gTVInSearchOfTrainersText01,
gTVInSearchOfTrainersText02,
@@ -832,7 +829,7 @@ void UpdateTVScreensOnMap(int width, int height)
case 2:
break;
default:
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F && gSaveBlock1Ptr->location.mapNum == MAP_ID_LILYCOVE_CITY_COVE_LILY_MOTEL_1F)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F))
{
SetTVMetatilesOnMap(width, height, 0x3);
}
@@ -1040,7 +1037,7 @@ u8 GabbyAndTyGetLastBattleTrivia(void)
return 0;
}
-void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void)
+void GabbyAndTySetScriptVarsToEventObjectLocalIds(void)
{
switch (GabbyAndTyGetBattleNum())
{
@@ -1206,7 +1203,7 @@ void PutPokemonTodayFailedOnTheAir(void)
{
ct = 0xFF;
}
- if (ct > 2 && (gBattleOutcome == BATTLE_POKE_FLED || gBattleOutcome == BATTLE_WON))
+ if (ct > 2 && (gBattleOutcome == B_OUTCOME_MON_FLED || gBattleOutcome == B_OUTCOME_WON))
{
sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_FAILED, FALSE) != TRUE)
@@ -1251,7 +1248,7 @@ void tv_store_id_2x(TVShow *show)
show->common.trainerIdHi = id >> 8;
}
-void InterviewAfter_ContestLiveUpdates(void)
+static void InterviewAfter_ContestLiveUpdates(void)
{
TVShow *show;
TVShow *show2;
@@ -1279,7 +1276,7 @@ void InterviewAfter_ContestLiveUpdates(void)
}
}
-void PutBattleUpdateOnTheAir(u8 a0, u16 a1, u16 a2, u16 a3)
+void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlayer, u16 speciesOpponent)
{
TVShow *show;
u8 name[32];
@@ -1306,21 +1303,21 @@ void PutBattleUpdateOnTheAir(u8 a0, u16 a1, u16 a2, u16 a3)
{
show->battleUpdate.battleType = 0;
}
- show->battleUpdate.move = a1;
- show->battleUpdate.species2 = a2;
- show->battleUpdate.species = a3;
- StringCopy(name, gLinkPlayers[a0].name);
+ show->battleUpdate.move = move;
+ show->battleUpdate.speciesPlayer = speciesPlayer;
+ show->battleUpdate.speciesOpponent = speciesOpponent;
+ StringCopy(name, gLinkPlayers[opponentLinkPlayerId].name);
StripExtCtrlCodes(name);
StringCopy(show->battleUpdate.linkOpponentName, name);
tv_store_id_2x(show);
show->battleUpdate.language = gGameLanguage;
- if (show->battleUpdate.language == LANGUAGE_JAPANESE || gLinkPlayers[a0].language == LANGUAGE_JAPANESE)
+ if (show->battleUpdate.language == LANGUAGE_JAPANESE || gLinkPlayers[opponentLinkPlayerId].language == LANGUAGE_JAPANESE)
{
show->battleUpdate.linkOpponentLanguage = LANGUAGE_JAPANESE;
}
else
{
- show->battleUpdate.linkOpponentLanguage = gLinkPlayers[a0].language;
+ show->battleUpdate.linkOpponentLanguage = gLinkPlayers[opponentLinkPlayerId].language;
}
}
}
@@ -1383,13 +1380,13 @@ void PutFanClubSpecialOnTheAir(void)
StringCopy(show->fanClubSpecial.idolName, name);
tv_store_id_2x(show);
show->fanClubSpecial.language = gGameLanguage;
- if (show->fanClubSpecial.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->unk_31A0 == LANGUAGE_JAPANESE)
+ if (show->fanClubSpecial.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->linkBattleRecords.languages[0] == LANGUAGE_JAPANESE)
{
show->fanClubSpecial.idolNameLanguage = LANGUAGE_JAPANESE;
}
else
{
- show->fanClubSpecial.idolNameLanguage = gSaveBlock1Ptr->unk_31A0;
+ show->fanClubSpecial.idolNameLanguage = gSaveBlock1Ptr->linkBattleRecords.languages[0];
}
}
@@ -1470,7 +1467,7 @@ void ContestLiveUpdates_BeforeInterview_5(u8 a0, u8 a1)
}
}
-void InterviewAfter_BravoTrainerPokemonProfile(void)
+static void InterviewAfter_BravoTrainerPokemonProfile(void)
{
TVShow *show;
TVShow *show2;
@@ -1536,7 +1533,7 @@ void BravoTrainerPokemonProfile_BeforeInterview2(u8 a0)
}
}
-void InterviewAfter_BravoTrainerBattleTowerProfile(void)
+static void InterviewAfter_BravoTrainerBattleTowerProfile(void)
{
TVShow *show;
@@ -1544,12 +1541,12 @@ void InterviewAfter_BravoTrainerBattleTowerProfile(void)
show->bravoTrainerTower.kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE;
show->bravoTrainerTower.active = TRUE;
StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2Ptr->playerName);
- StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2Ptr->field_BD8);
- show->bravoTrainerTower.species = gSaveBlock2Ptr->field_BD4;
- show->bravoTrainerTower.defeatedSpecies = gSaveBlock2Ptr->field_BD6;
- show->bravoTrainerTower.numFights = sub_8164FCC(gSaveBlock2Ptr->field_D07, 0);
- show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->field_D06;
- if (gSaveBlock2Ptr->field_D07 == 0)
+ StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2Ptr->frontier.field_BD8);
+ show->bravoTrainerTower.species = gSaveBlock2Ptr->frontier.field_BD4;
+ show->bravoTrainerTower.defeatedSpecies = gSaveBlock2Ptr->frontier.field_BD6;
+ show->bravoTrainerTower.numFights = sub_8164FCC(gSaveBlock2Ptr->frontier.field_D07, 0);
+ show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->frontier.field_D06;
+ if (gSaveBlock2Ptr->frontier.field_D07 == 0)
{
show->bravoTrainerTower.btLevel = 50;
}
@@ -1560,13 +1557,13 @@ void InterviewAfter_BravoTrainerBattleTowerProfile(void)
show->bravoTrainerTower.interviewResponse = gSpecialVar_0x8004;
tv_store_id_2x(show);
show->bravoTrainerTower.language = gGameLanguage;
- if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->field_BEB == LANGUAGE_JAPANESE)
+ if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->frontier.field_BEB == LANGUAGE_JAPANESE)
{
show->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE;
}
else
{
- show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->field_BEB;
+ show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->frontier.field_BEB;
}
}
@@ -1575,7 +1572,9 @@ void SaveRecordedItemPurchasesForTVShow(void)
TVShow *show;
u8 i;
- if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_TRAINER_HILL_LOBBY && gSaveBlock1Ptr->location.mapNum == MAP_ID_TRAINER_HILL_LOBBY) && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_BATTLE_FRONTIER_MART && gSaveBlock1Ptr->location.mapNum == MAP_ID_BATTLE_FRONTIER_MART) && !rbernoulli(1, 3))
+ if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_HILL_ENTRANCE))
+ && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_MART) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_MART))
+ && !rbernoulli(1, 3))
{
sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SMART_SHOPPER, FALSE) != TRUE)
@@ -1667,7 +1666,7 @@ void PutLilycoveContestLadyShowOnTheAir(void)
}
}
-void InterviewAfter_FanClubLetter(void)
+static void InterviewAfter_FanClubLetter(void)
{
TVShow *show;
@@ -1680,7 +1679,7 @@ void InterviewAfter_FanClubLetter(void)
show->fanclubLetter.language = gGameLanguage;
}
-void InterviewAfter_RecentHappenings(void)
+static void InterviewAfter_RecentHappenings(void)
{
TVShow *show;
@@ -1693,7 +1692,7 @@ void InterviewAfter_RecentHappenings(void)
show->recentHappenings.language = gGameLanguage;
}
-void InterviewAfter_PkmnFanClubOpinions(void)
+static void InterviewAfter_PkmnFanClubOpinions(void)
{
TVShow *show;
@@ -1718,14 +1717,14 @@ void InterviewAfter_PkmnFanClubOpinions(void)
}
}
-void InterviewAfter_DummyShow4()
+static void InterviewAfter_DummyShow4(void)
{
TVShow *show;
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
}
-void sub_80ED718(void)
+static void sub_80ED718(void)
{
u8 i;
u16 outbreakIdx;
@@ -1788,9 +1787,8 @@ void EndMassOutbreak(void)
gSaveBlock1Ptr->outbreakDaysLeft = 0;
}
-void sub_80ED888(u16 days)
+void UpdateTVShowsPerDay(u16 days)
{
-
sub_80ED8B4(days);
UpdateMassOutbreakTimeLeft(days);
sub_80EF120(days);
@@ -1798,7 +1796,7 @@ void sub_80ED888(u16 days)
sub_80EEB98(days);
}
-void sub_80ED8B4(u16 days)
+static void sub_80ED8B4(u16 days)
{
u8 i;
TVShow *show;
@@ -1868,7 +1866,7 @@ void PutFishingAdviceShowOnTheAir(void)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FISHING_ADVICE, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
@@ -1888,7 +1886,7 @@ void SetPokemonAnglerSpecies(u16 species)
sPokemonAnglerSpecies = species;
}
-void sub_80EDA48(u16 days)
+static void sub_80EDA48(u16 days)
{
TVShow *show;
@@ -1953,14 +1951,14 @@ void sub_80EDB44(void)
show->rivalTrainer.badgeCount = nBadges;
if (IsNationalPokedexEnabled())
{
- show->rivalTrainer.dexCount = pokedex_count(0x01);
+ show->rivalTrainer.dexCount = GetNationalPokedexCount(0x01);
}
else
{
- show->rivalTrainer.dexCount = sub_80C0844(0x01);
+ show->rivalTrainer.dexCount = GetHoennPokedexCount(0x01);
}
show->rivalTrainer.location = gMapHeader.regionMapSectionId;
- show->rivalTrainer.mapDataId = gMapHeader.mapDataId;
+ show->rivalTrainer.mapLayoutId = gMapHeader.mapLayoutId;
show->rivalTrainer.nSilverSymbols = 0;
show->rivalTrainer.nGoldSymbols = 0;
for (i = 0; i < 7; i ++)
@@ -1974,7 +1972,7 @@ void sub_80EDB44(void)
show->rivalTrainer.nGoldSymbols ++;
}
}
- show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontierBattlePoints;
+ show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontier.frontierBattlePoints;
StringCopy(show->rivalTrainer.playerName, gSaveBlock2Ptr->playerName);
tv_store_id_3x(show);
show->rivalTrainer.language = gGameLanguage;
@@ -2012,7 +2010,7 @@ void sub_80EDCE8(void)
show->treasureInvestigators.active = FALSE;
show->treasureInvestigators.item = gSpecialVar_0x8005;
show->treasureInvestigators.location = gMapHeader.regionMapSectionId;
- show->treasureInvestigators.mapDataId = gMapHeader.mapDataId;
+ show->treasureInvestigators.mapLayoutId = gMapHeader.mapLayoutId;
StringCopy(show->treasureInvestigators.playerName, gSaveBlock2Ptr->playerName);
tv_store_id_3x(show);
show->treasureInvestigators.language = gGameLanguage;
@@ -2084,8 +2082,7 @@ void sub_80EDE84(u16 nCoinsSpent)
sFindThatGamerCoinsSpent = nCoinsSpent;
}
-#ifdef NONMATCHING // FIXME: Register allocation shenanigans
-void sub_80EDE98(TVShow *show)
+static void sub_80EDE98(TVShow *show)
{
u8 i;
u8 j;
@@ -2136,11 +2133,11 @@ void sub_80EDE98(TVShow *show)
default:
for (k = 0; k < n * n; k ++)
{
- i = Random() % n;
+ deco = Random() % n;
j = Random() % n;
- x = sTV_DecorationsBuffer[i];
- sTV_DecorationsBuffer[i] = sTV_DecorationsBuffer[j];
- sTV_DecorationsBuffer[j] = x;
+ i = sTV_DecorationsBuffer[deco];
+ sTV_DecorationsBuffer[deco] = sTV_DecorationsBuffer[j];
+ sTV_DecorationsBuffer[j] = i;
}
for (i = 0; i < show->secretBaseVisit.nDecorations; i ++)
{
@@ -2149,157 +2146,8 @@ void sub_80EDE98(TVShow *show)
break;
}
}
-#else
-__attribute__((naked))
-void sub_80EDE98(TVShow *show)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r9\n"
- "\tmov r6, r8\n"
- "\tpush {r6,r7}\n"
- "\tmov r8, r0\n"
- "\tmovs r3, 0\n"
- "\tldr r6, =sTV_DecorationsBuffer\n"
- "\tldr r7, =gSaveBlock1Ptr\n"
- "\tadds r2, r6, 0\n"
- "\tmovs r1, 0\n"
- "_080EDEAC:\n"
- "\tadds r0, r3, r2\n"
- "\tstrb r1, [r0]\n"
- "\tadds r0, r3, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r3, r0, 24\n"
- "\tcmp r3, 0xF\n"
- "\tbls _080EDEAC\n"
- "\tmovs r3, 0\n"
- "\tmovs r5, 0\n"
- "_080EDEBE:\n"
- "\tldr r0, [r7]\n"
- "\tldr r1, =0x00001aae\n"
- "\tadds r0, r1\n"
- "\tadds r0, r3\n"
- "\tldrb r4, [r0]\n"
- "\tadds r3, 0x1\n"
- "\tcmp r4, 0\n"
- "\tbeq _080EDF0A\n"
- "\tmovs r1, 0\n"
- "\tldrb r0, [r6]\n"
- "\tcmp r0, 0\n"
- "\tbne _080EDEE8\n"
- "\tstrb r4, [r6]\n"
- "\tb _080EDF04\n"
- "\t.pool\n"
- "_080EDEE8:\n"
- "\tadds r0, r1, r6\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, r4\n"
- "\tbeq _080EDF0A\n"
- "\tadds r0, r1, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r1, r0, 24\n"
- "\tcmp r1, 0xF\n"
- "\tbhi _080EDF0A\n"
- "\tadds r2, r1, r6\n"
- "\tldrb r0, [r2]\n"
- "\tcmp r0, 0\n"
- "\tbne _080EDEE8\n"
- "\tstrb r4, [r2]\n"
- "_080EDF04:\n"
- "\tadds r0, r5, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r5, r0, 24\n"
- "_080EDF0A:\n"
- "\tlsls r0, r3, 24\n"
- "\tlsrs r3, r0, 24\n"
- "\tcmp r3, 0xF\n"
- "\tbls _080EDEBE\n"
- "\tcmp r5, 0x4\n"
- "\tbls _080EDF1E\n"
- "\tmovs r0, 0x4\n"
- "\tmov r1, r8\n"
- "\tstrb r0, [r1, 0x3]\n"
- "\tb _080EDF22\n"
- "_080EDF1E:\n"
- "\tmov r0, r8\n"
- "\tstrb r5, [r0, 0x3]\n"
- "_080EDF22:\n"
- "\tmov r1, r8\n"
- "\tldrb r0, [r1, 0x3]\n"
- "\tcmp r0, 0\n"
- "\tbeq _080EDFA4\n"
- "\tcmp r0, 0x1\n"
- "\tbne _080EDF34\n"
- "\tldrb r0, [r6]\n"
- "\tstrb r0, [r1, 0x4]\n"
- "\tb _080EDFA4\n"
- "_080EDF34:\n"
- "\tmovs r6, 0\n"
- "\tadds r7, r5, 0\n"
- "\tmuls r7, r5\n"
- "\tcmp r6, r7\n"
- "\tbge _080EDF7E\n"
- "\tldr r0, =sTV_DecorationsBuffer\n"
- "\tmov r9, r0\n"
- "_080EDF42:\n"
- "\tbl Random\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tadds r1, r5, 0\n"
- "\tbl __modsi3\n"
- "\tlsls r0, 24\n"
- "\tlsrs r4, r0, 24\n"
- "\tbl Random\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tadds r1, r5, 0\n"
- "\tbl __modsi3\n"
- "\tlsls r0, 24\n"
- "\tlsrs r1, r0, 24\n"
- "\tmov r0, r9\n"
- "\tadds r2, r4, r0\n"
- "\tldrb r3, [r2]\n"
- "\tadd r1, r9\n"
- "\tldrb r0, [r1]\n"
- "\tstrb r0, [r2]\n"
- "\tstrb r3, [r1]\n"
- "\tadds r0, r6, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r6, r0, 16\n"
- "\tcmp r6, r7\n"
- "\tblt _080EDF42\n"
- "_080EDF7E:\n"
- "\tmovs r3, 0\n"
- "\tmov r1, r8\n"
- "\tldrb r1, [r1, 0x3]\n"
- "\tcmp r3, r1\n"
- "\tbcs _080EDFA4\n"
- "\tmov r2, r8\n"
- "\tadds r2, 0x4\n"
- "\tldr r4, =sTV_DecorationsBuffer\n"
- "_080EDF8E:\n"
- "\tadds r1, r2, r3\n"
- "\tadds r0, r3, r4\n"
- "\tldrb r0, [r0]\n"
- "\tstrb r0, [r1]\n"
- "\tadds r0, r3, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r3, r0, 24\n"
- "\tmov r0, r8\n"
- "\tldrb r0, [r0, 0x3]\n"
- "\tcmp r3, r0\n"
- "\tbcc _080EDF8E\n"
- "_080EDFA4:\n"
- "\tpop {r3,r4}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.pool");
-}
-#endif
-void sub_80EDFB4(TVShow *show)
+static void sub_80EDFB4(TVShow *show)
{
u8 i;
u16 move;
@@ -2398,23 +2246,23 @@ void sub_80EE184(void)
show->breakingNews.poke1Species = gBattleResults.playerMon1Species;
switch (gBattleOutcome)
{
- case BATTLE_LOST:
- case BATTLE_DREW:
+ case B_OUTCOME_LOST:
+ case B_OUTCOME_DREW:
show->breakingNews.kind = TVSHOW_OFF_AIR;
return;
- case BATTLE_CAUGHT:
+ case B_OUTCOME_CAUGHT:
show->breakingNews.outcome = 0;
break;
- case BATTLE_WON:
+ case B_OUTCOME_WON:
show->breakingNews.outcome = 1;
break;
- case BATTLE_RAN:
- case BATTLE_PLAYER_TELEPORTED:
- case BATTLE_SAFARI_OUT_OF_BALLS:
+ case B_OUTCOME_RAN:
+ case B_OUTCOME_PLAYER_TELEPORTED:
+ case B_OUTCOME_NO_SAFARI_BALLS:
show->breakingNews.outcome = 2;
break;
- case BATTLE_POKE_FLED:
- case BATTLE_OPPONENT_TELEPORTED:
+ case B_OUTCOME_MON_FLED:
+ case B_OUTCOME_MON_TELEPORTED:
show->breakingNews.outcome = 3;
break;
}
@@ -2617,7 +2465,7 @@ bool8 sub_80EE7C0(void)
{
return TRUE;
}
- if (gSaveBlock1Ptr->linkBattleRecords[0].name[0] == EOS)
+ if (gSaveBlock1Ptr->linkBattleRecords.entries[0].name[0] == EOS)
{
return TRUE;
}
@@ -2692,8 +2540,8 @@ void sub_80EE8C8(u16 winStreak, u8 facility)
show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
break;
case 4:
- show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->field_CAA[0] - 1], MON_DATA_SPECIES, NULL);
- show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->field_CAA[1] - 1], MON_DATA_SPECIES, NULL);
+ show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.field_CAA[0] - 1], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.field_CAA[1] - 1], MON_DATA_SPECIES, NULL);
break;
}
tv_store_id_3x(show);
@@ -2736,7 +2584,7 @@ void sub_80EEA70(void)
}
}
-void sub_80EEB98(u16 days)
+static void sub_80EEB98(u16 days)
{
u8 i;
@@ -2754,7 +2602,7 @@ void sub_80EEB98(u16 days)
}
}
-void sub_80EEBF4(u8 actionIdx)
+static void sub_80EEBF4(u8 actionIdx)
{
TVShow *show;
@@ -2810,7 +2658,7 @@ void sub_80EED60(u16 delta)
// PokeNews
-void sub_80EED88(void)
+static void sub_80EED88(void)
{
u8 newsKind;
@@ -2861,7 +2709,7 @@ void ClearPokemonNewsI(u8 i)
gSaveBlock1Ptr->pokeNews[i].days = 0;
}
-void sub_80EEEB8(void)
+static void sub_80EEEB8(void)
{
u8 i;
u8 j;
@@ -2959,13 +2807,13 @@ bool8 IsPriceDiscounted(u8 newsKind)
switch (newsKind)
{
case POKENEWS_SLATEPORT:
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_SLATEPORT_CITY && gSaveBlock1Ptr->location.mapNum == MAP_ID_SLATEPORT_CITY && gSpecialVar_LastTalked == 25)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SLATEPORT_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SLATEPORT_CITY) && gSpecialVar_LastTalked == 25)
{
return TRUE;
}
return FALSE;
case POKENEWS_LILYCOVE:
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP && gSaveBlock1Ptr->location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP))
{
return TRUE;
}
@@ -2991,7 +2839,7 @@ bool8 sub_80EF0E4(u8 newsKind)
return FALSE;
}
-void sub_80EF120(u16 days)
+static void sub_80EF120(u16 days)
{
u8 i;
@@ -3069,48 +2917,25 @@ void TV_PrintIntToStringVar(u8 varIdx, int value)
{
int nDigits;
- nDigits = sub_80EF370(value);
+ nDigits = CountDigits(value);
ConvertIntToDecimalStringN(gTVStringVarPtrs[varIdx], value, STR_CONV_MODE_LEFT_ALIGN, nDigits);
}
-size_t sub_80EF370(int value)
+size_t CountDigits(int value)
{
- if (value / 10 == 0)
- {
- return 1;
- }
- if (value / 100 == 0)
- {
- return 2;
- }
- if (value / 1000 == 0)
- {
- return 3;
- }
- if (value / 10000 == 0)
- {
- return 4;
- }
- if (value / 100000 == 0)
- {
- return 5;
- }
- if (value / 1000000 == 0)
- {
- return 6;
- }
- if (value / 10000000 == 0)
- {
- return 7;
- }
- if (value / 100000000 == 0)
- {
- return 8;
- }
+ if (value / 10 == 0) return 1;
+ if (value / 100 == 0) return 2;
+ if (value / 1000 == 0) return 3;
+ if (value / 10000 == 0) return 4;
+ if (value / 100000 == 0) return 5;
+ if (value / 1000000 == 0) return 6;
+ if (value / 10000000 == 0) return 7;
+ if (value / 100000000 == 0) return 8;
+
return 1;
}
-void sub_80EF40C(u8 varIdx, TVShow *show)
+static void sub_80EF40C(u8 varIdx, TVShow *show)
{
u8 i;
int price;
@@ -3120,7 +2945,7 @@ void sub_80EF40C(u8 varIdx, TVShow *show)
{
if (show->smartshopperShow.itemIds[i] != ITEM_NONE)
{
- price += itemid_get_market_price(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i];
+ price += ItemId_GetPrice(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i];
}
}
if (show->smartshopperShow.priceReduced == TRUE)
@@ -3241,7 +3066,7 @@ void InterviewBefore(void)
}
}
-void InterviewBefore_FanClubLetter(void)
+static void InterviewBefore_FanClubLetter(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_LETTER);
if (!gSpecialVar_Result)
@@ -3251,7 +3076,7 @@ void InterviewBefore_FanClubLetter(void)
}
}
-void InterviewBefore_RecentHappenings(void)
+static void InterviewBefore_RecentHappenings(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_RECENT_HAPPENINGS);
if (!gSpecialVar_Result)
@@ -3260,7 +3085,7 @@ void InterviewBefore_RecentHappenings(void)
}
}
-void InterviewBefore_PkmnFanClubOpinions(void)
+static void InterviewBefore_PkmnFanClubOpinions(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_PKMN_FAN_CLUB_OPINIONS);
if (!gSpecialVar_Result)
@@ -3272,17 +3097,17 @@ void InterviewBefore_PkmnFanClubOpinions(void)
}
}
-void InterviewBefore_Dummy(void)
+static void InterviewBefore_Dummy(void)
{
gSpecialVar_Result = TRUE;
}
-void InterviewBefore_NameRater(void)
+static void InterviewBefore_NameRater(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_NAME_RATER_SHOW);
}
-void InterviewBefore_BravoTrainerPkmnProfile(void)
+static void InterviewBefore_BravoTrainerPkmnProfile(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE);
if (!gSpecialVar_Result)
@@ -3291,17 +3116,17 @@ void InterviewBefore_BravoTrainerPkmnProfile(void)
}
}
-void InterviewBefore_ContestLiveUpdates(void)
+static void InterviewBefore_ContestLiveUpdates(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_CONTEST_LIVE_UPDATES);
}
-void InterviewBefore_3CheersForPokeblocks(void)
+static void InterviewBefore_3CheersForPokeblocks(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_3_CHEERS_FOR_POKEBLOCKS);
}
-void InterviewBefore_BravoTrainerBTProfile(void)
+static void InterviewBefore_BravoTrainerBTProfile(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE);
if (!gSpecialVar_Result)
@@ -3310,7 +3135,7 @@ void InterviewBefore_BravoTrainerBTProfile(void)
}
}
-void InterviewBefore_FanClubSpecial(void)
+static void InterviewBefore_FanClubSpecial(void)
{
FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_SPECIAL);
if (!gSpecialVar_Result)
@@ -3351,7 +3176,7 @@ void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx)
}
}
-void sub_80EF93C(TVShow *shows)
+static void sub_80EF93C(TVShow *shows)
{
u8 i;
u8 j;
@@ -3423,7 +3248,7 @@ u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies)
return species;
}
-void sub_80EFA88(void)
+static void sub_80EFA88(void)
{
sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
gSpecialVar_0x8006 = sCurTVShowSlot;
@@ -3629,7 +3454,7 @@ void ChangePokemonNickname(void)
void ChangePokemonNickname_CB(void)
{
SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2);
- c2_exit_to_overworld_1_continue_scripts_restart_music();
+ CB2_ReturnToFieldContinueScriptPlayMapMusic();
}
void ChangeBoxPokemonNickname(void)
@@ -3645,7 +3470,7 @@ void ChangeBoxPokemonNickname(void)
void ChangeBoxPokemonNickname_CB(void)
{
SetBoxMonNickFromAnyBox(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2);
- c2_exit_to_overworld_1_continue_scripts_restart_music();
+ CB2_ReturnToFieldContinueScriptPlayMapMusic();
}
void TV_CopyNicknameToStringVar1AndEnsureTerminated(void)
@@ -3694,20 +3519,20 @@ u32 GetPlayerIDAsU32(void)
u8 CheckForBigMovieOrEmergencyNewsOnTV(void)
{
- if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
{
return 0;
}
if (gSaveBlock2Ptr->playerGender == MALE)
{
- if (gSaveBlock1Ptr->location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
{
return 0;
}
}
else
{
- if (gSaveBlock1Ptr->location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F)
+ if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F))
{
return 0;
}
@@ -3725,36 +3550,36 @@ u8 CheckForBigMovieOrEmergencyNewsOnTV(void)
void GetMomOrDadStringForTVMessage(void)
{
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
{
if (gSaveBlock2Ptr->playerGender == MALE)
{
- if (gSaveBlock1Ptr->location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
{
StringCopy(gStringVar1, gText_Mom);
- VarSet(VAR_0x4003, 1);
+ VarSet(VAR_TEMP_3, 1);
}
}
else
{
- if (gSaveBlock1Ptr->location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F)
+ if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F))
{
StringCopy(gStringVar1, gText_Mom);
- VarSet(VAR_0x4003, 1);
+ VarSet(VAR_TEMP_3, 1);
}
}
}
- if (VarGet(VAR_0x4003) == 1)
+ if (VarGet(VAR_TEMP_3) == 1)
{
StringCopy(gStringVar1, gText_Mom);
}
- else if (VarGet(VAR_0x4003) == 2)
+ else if (VarGet(VAR_TEMP_3) == 2)
{
StringCopy(gStringVar1, gText_Dad);
}
- else if (VarGet(VAR_0x4003) > 2)
+ else if (VarGet(VAR_TEMP_3) > 2)
{
- if (VarGet(VAR_0x4003) % 2 == 0)
+ if (VarGet(VAR_TEMP_3) % 2 == 0)
StringCopy(gStringVar1, gText_Mom);
else
StringCopy(gStringVar1, gText_Dad);
@@ -3764,12 +3589,12 @@ void GetMomOrDadStringForTVMessage(void)
if (Random() % 2 != 0)
{
StringCopy(gStringVar1, gText_Mom);
- VarSet(VAR_0x4003, 1);
+ VarSet(VAR_TEMP_3, 1);
}
else
{
StringCopy(gStringVar1, gText_Dad);
- VarSet(VAR_0x4003, 2);
+ VarSet(VAR_TEMP_3, 2);
}
}
}
@@ -3777,11 +3602,11 @@ void GetMomOrDadStringForTVMessage(void)
void sub_80F01B8(void)
{
VarSet(VAR_0x40BC, 0);
- RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ RemoveEventObjectByLocalIdAndMap(5, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
FlagSet(0x396);
}
-void sub_80F01E8(void *src, u32 size, u8 masterIdx)
+void ReceiveTvShowsData(void *src, u32 size, u8 masterIdx)
{
u8 i;
u16 version;
@@ -3832,7 +3657,7 @@ void sub_80F01E8(void *src, u32 size, u8 masterIdx)
}
}
-void sub_80F0358(TVShow player1[25], TVShow player2[25], TVShow player3[25], TVShow player4[25])
+static void sub_80F0358(TVShow player1[25], TVShow player2[25], TVShow player3[25], TVShow player4[25])
{
u8 i;
u8 j;
@@ -3880,7 +3705,7 @@ void sub_80F0358(TVShow player1[25], TVShow player2[25], TVShow player3[25], TVS
}
}
-bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx)
+static bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx)
{
u8 value;
u8 switchval;
@@ -3911,7 +3736,7 @@ bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx)
return FALSE;
}
-u8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx)
+static bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx)
{
u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
@@ -3928,7 +3753,7 @@ u8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx)
return TRUE;
}
-u8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx)
+static bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx)
{
u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi)
@@ -3948,7 +3773,7 @@ u8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx)
return TRUE;
}
-u8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx)
+static bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx)
{
u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi)
@@ -3965,7 +3790,7 @@ u8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx)
return TRUE;
}
-s8 sub_80F06D0(TVShow *tvShows)
+static s8 sub_80F06D0(TVShow *tvShows)
{
u8 i;
@@ -3980,7 +3805,7 @@ s8 sub_80F06D0(TVShow *tvShows)
}
#ifdef NONMATCHING
-void sub_80F0708(void) // FIXME: register allocation shenanigans
+static void sub_80F0708(void) // FIXME: register allocation shenanigans
{
u16 i;
TVShow *show;
@@ -3996,8 +3821,8 @@ void sub_80F0708(void) // FIXME: register allocation shenanigans
case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
break;
case TVSHOW_BATTLE_UPDATE:
- sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleUpdate.species2, i);
- sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleUpdate.species, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesPlayer, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesOpponent, i);
break;
case TVSHOW_FAN_CLUB_SPECIAL:
break;
@@ -4100,13 +3925,13 @@ void sub_80F0708(void) // FIXME: register allocation shenanigans
break;
default:
- sub_80F0B00(i);
+ SetTvShowInactive(i);
break;
}
}
}
#else
-__attribute__((naked)) void sub_80F0708(void)
+NAKED static void sub_80F0708(void)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmov r7, r9\n"
@@ -4523,7 +4348,7 @@ __attribute__((naked)) void sub_80F0708(void)
"\tmov r2, r9\n"
"\tlsls r0, r2, 24\n"
"\tlsrs r0, 24\n"
- "\tbl sub_80F0B00\n"
+ "\tbl SetTvShowInactive\n"
"_080F0AE2_break:\n"
"\tmov r0, r9\n"
"\tadds r0, 0x1\n"
@@ -4544,12 +4369,12 @@ __attribute__((naked)) void sub_80F0708(void)
}
#endif
-void sub_80F0B00(u8 showIdx)
+void SetTvShowInactive(u8 showIdx)
{
gSaveBlock1Ptr->tvShows[showIdx].common.active = FALSE;
}
-void sub_80F0B24(u16 species, u8 showIdx)
+static void sub_80F0B24(u16 species, u8 showIdx)
{
if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0)
{
@@ -4557,7 +4382,7 @@ void sub_80F0B24(u16 species, u8 showIdx)
}
}
-void sub_80F0B64(void)
+static void sub_80F0B64(void)
{
u16 i;
@@ -4590,7 +4415,7 @@ void sub_80F0BB8(void)
}
}
-void sub_80F0C04(void)
+static void sub_80F0C04(void)
{
s8 i;
s8 ct;
@@ -4609,7 +4434,7 @@ void sub_80F0C04(void)
}
}
-void sub_80F0C7C(void *src, u32 size, u8 masterIdx)
+void ReceivePokeNewsData(void *src, u32 size, u8 masterIdx)
{
u8 i;
PokeNews (*rmBuffer2)[4][16];
@@ -4644,7 +4469,7 @@ void sub_80F0C7C(void *src, u32 size, u8 masterIdx)
}
}
-void sub_80F0D60(PokeNews player1[16], PokeNews player2[16], PokeNews player3[16], PokeNews player4[16])
+static void sub_80F0D60(PokeNews player1[16], PokeNews player2[16], PokeNews player3[16], PokeNews player4[16])
{
u8 i;
u8 j;
@@ -4676,7 +4501,7 @@ void sub_80F0D60(PokeNews player1[16], PokeNews player2[16], PokeNews player3[16
}
}
-void sub_80F0E58(PokeNews *dest[16], PokeNews *src[16])
+static void sub_80F0E58(PokeNews *dest[16], PokeNews *src[16])
{
PokeNews *ptr1;
PokeNews *ptr2;
@@ -4687,7 +4512,7 @@ void sub_80F0E58(PokeNews *dest[16], PokeNews *src[16])
sub_80F0E84(ptr1, ptr2, sCurTVShowSlot);
}
-bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot)
+static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot)
{
u8 i;
u8 kind;
@@ -4709,7 +4534,7 @@ bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot)
return TRUE;
}
-s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx)
+static s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx)
{
if (pokeNews[idx].kind == POKENEWS_NONE)
{
@@ -4718,7 +4543,7 @@ s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx)
return idx;
}
-void sub_80F0EEC(void)
+static void sub_80F0EEC(void)
{
u8 i;
@@ -4732,7 +4557,7 @@ void sub_80F0EEC(void)
sub_80EEEB8();
}
-void sub_80F0F24(void)
+static void sub_80F0F24(void)
{
u8 i;
@@ -4755,7 +4580,7 @@ else \
(langptr) = langfix; \
}
-void sub_80F0F64(TVShow *show, u32 language)
+static void sub_80F0F64(TVShow *show, u32 language)
{
int i;
TVShow **r4;
@@ -4837,7 +4662,7 @@ void sub_80F1208(TVShow *shows)
}
}
-void sub_80F1254(TVShow *shows)
+static void sub_80F1254(TVShow *shows)
{
TVShow *curShow;
@@ -4862,7 +4687,7 @@ u8 TV_GetStringLanguage(u8 *str)
return IsStringJapanese(str) ? LANGUAGE_JAPANESE : LANGUAGE_ENGLISH;
}
-void sub_80F12A4(TVShow *shows)
+static void sub_80F12A4(TVShow *shows)
{
TVShow *curShow;
@@ -5102,7 +4927,7 @@ void DoTVShow(void)
}
}
-void DoTVShowBravoTrainerPokemonProfile(void)
+static void DoTVShowBravoTrainerPokemonProfile(void)
{
TVShow *show;
u8 state;
@@ -5174,7 +4999,7 @@ void DoTVShowBravoTrainerPokemonProfile(void)
ShowFieldMessage(sTVBravoTrainerTextGroup[state]);
}
-void DoTVShowBravoTrainerBattleTower(void)
+static void DoTVShowBravoTrainerBattleTower(void)
{
TVShow *show;
u8 state;
@@ -5271,7 +5096,7 @@ void DoTVShowBravoTrainerBattleTower(void)
ShowFieldMessage(sTVBravoTrainerBattleTowerTextGroup[state]);
}
-void DoTVShowTodaysSmartShopper(void)
+static void DoTVShowTodaysSmartShopper(void)
{
TVShow *show;
u8 state;
@@ -5295,7 +5120,7 @@ void DoTVShowTodaysSmartShopper(void)
break;
case 1:
TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
- StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0]));
TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0]);
sTVShowState += 1 + (Random() % 4);
break;
@@ -5323,7 +5148,7 @@ void DoTVShowTodaysSmartShopper(void)
}
break;
case 6:
- StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[1])->name);
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[1]));
TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[1]);
if (show->smartshopperShow.itemIds[2] != ITEM_NONE)
{
@@ -5339,7 +5164,7 @@ void DoTVShowTodaysSmartShopper(void)
}
break;
case 7:
- StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[2])->name);
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[2]));
TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[2]);
if (show->smartshopperShow.priceReduced == TRUE)
{
@@ -5376,7 +5201,7 @@ void DoTVShowTodaysSmartShopper(void)
break;
case 11:
TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
- StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0]));
if (show->smartshopperShow.priceReduced == TRUE)
{
sTVShowState = 8;
@@ -5394,7 +5219,7 @@ void DoTVShowTodaysSmartShopper(void)
ShowFieldMessage(sTVTodaysSmartShopperTextGroup[state]);
}
-void DoTVShowTheNameRaterShow(void)
+static void DoTVShowTheNameRaterShow(void)
{
TVShow *show;
u8 state;
@@ -5492,7 +5317,7 @@ void DoTVShowTheNameRaterShow(void)
ShowFieldMessage(sTVNameRaterTextGroup[state]);
}
-void DoTVShowPokemonTodaySuccessfulCapture(void)
+static void DoTVShowPokemonTodaySuccessfulCapture(void)
{
TVShow *show;
u8 state;
@@ -5519,7 +5344,7 @@ void DoTVShowPokemonTodaySuccessfulCapture(void)
sTVShowState = 2;
break;
case 2:
- StringCopy(gStringVar2, ItemId_GetItem(show->pokemonToday.ball)->name);
+ StringCopy(gStringVar2, ItemId_GetName(show->pokemonToday.ball));
TV_PrintIntToStringVar(2, show->pokemonToday.nBallsUsed);
if (show->pokemonToday.nBallsUsed < 4)
{
@@ -5570,7 +5395,7 @@ void DoTVShowPokemonTodaySuccessfulCapture(void)
ShowFieldMessage(sTVPokemonTodaySuccessfulTextGroup[state]);
}
-void DoTVShowPokemonTodayFailedCapture(void)
+static void DoTVShowPokemonTodayFailedCapture(void)
{
TVShow *show;
u8 state;
@@ -5623,7 +5448,7 @@ void DoTVShowPokemonTodayFailedCapture(void)
ShowFieldMessage(sTVPokemonTodayFailedTextGroup[state]);
}
-void DoTVShowPokemonFanClubLetter(void)
+static void DoTVShowPokemonFanClubLetter(void)
{
TVShow *show;
u8 state;
@@ -5677,7 +5502,7 @@ void DoTVShowPokemonFanClubLetter(void)
ShowFieldMessage(sTVFanClubTextGroup[state]);
}
-void DoTVShowRecentHappenings(void)
+static void DoTVShowRecentHappenings(void)
{
TVShow *show;
u8 state;
@@ -5712,7 +5537,7 @@ void DoTVShowRecentHappenings(void)
ShowFieldMessage(sTVRecentHappeninssTextGroup[state]);
}
-void DoTVShowPokemonFanClubOpinions(void)
+static void DoTVShowPokemonFanClubOpinions(void)
{
TVShow *show;
u8 state;
@@ -5745,12 +5570,12 @@ void DoTVShowPokemonFanClubOpinions(void)
ShowFieldMessage(sTVFanClubOpinionsTextGroup[state]);
}
-void DoTVShowDummiedOut(void)
+static void DoTVShowDummiedOut(void)
{
}
-void DoTVShowPokemonNewsMassOutbreak(void)
+static void DoTVShowPokemonNewsMassOutbreak(void)
{
TVShow *show;
@@ -5762,7 +5587,7 @@ void DoTVShowPokemonNewsMassOutbreak(void)
ShowFieldMessage(sTVMassOutbreakTextGroup[sTVShowState]);
}
-void DoTVShowPokemonContestLiveUpdates(void)
+static void DoTVShowPokemonContestLiveUpdates(void)
{
TVShow *show;
u8 state;
@@ -6109,7 +5934,7 @@ void DoTVShowPokemonContestLiveUpdates(void)
ShowFieldMessage(sTVContestLiveUpdatesTextGroup[state]);
}
-void DoTVShowPokemonBattleUpdate(void)
+static void DoTVShowPokemonBattleUpdate(void)
{
TVShow *show;
u8 state;
@@ -6146,13 +5971,13 @@ void DoTVShowPokemonBattleUpdate(void)
break;
case 2:
TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.species2]);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]);
StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
sTVShowState = 3;
break;
case 3:
TVShowConvertInternationalString(gStringVar1, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
- StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.species]);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesOpponent]);
sTVShowState = 4;
break;
case 4:
@@ -6167,21 +5992,21 @@ void DoTVShowPokemonBattleUpdate(void)
break;
case 6:
TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.species2]);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]);
StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
sTVShowState = 7;
break;
case 7:
TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
- StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.species]);
+ StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.speciesOpponent]);
TVShowDone();
break;
}
ShowFieldMessage(sTVPokemonBattleUpdateTextGroup[state]);
}
-void DoTVShow3CheersForPokeblocks(void)
+static void DoTVShow3CheersForPokeblocks(void)
{
TVShow *show;
u8 state;
@@ -6352,7 +6177,7 @@ void DoTVShowInSearchOfTrainers(void)
ShowFieldMessage(sTVInSearchOfTrainersTextGroup[state]);
}
-void DoTVShowPokemonAngler(void)
+static void DoTVShowPokemonAngler(void)
{
TVShow *show;
u8 state;
@@ -6386,7 +6211,7 @@ void DoTVShowPokemonAngler(void)
ShowFieldMessage(sTVPokemonAnslerTextGroup[state]);
}
-void DoTVShowTheWorldOfMasters(void)
+static void DoTVShowTheWorldOfMasters(void)
{
TVShow *show;
u8 state;
@@ -6416,7 +6241,7 @@ void DoTVShowTheWorldOfMasters(void)
ShowFieldMessage(sTVWorldOfMastersTextGroup[state]);
}
-void DoTVShowTodaysRivalTrainer(void)
+static void DoTVShowTodaysRivalTrainer(void)
{
TVShow *show;
u8 state;
@@ -6436,7 +6261,7 @@ void DoTVShowTodaysRivalTrainer(void)
sTVShowState = 8;
break;
case MAPSEC_DYNAMIC:
- switch (show->rivalTrainer.mapDataId)
+ switch (show->rivalTrainer.mapLayoutId)
{
case 0x115 ... 0x117:
sTVShowState = 10;
@@ -6499,7 +6324,7 @@ void DoTVShowTodaysRivalTrainer(void)
break;
case 1:
TV_PrintIntToStringVar(0, show->rivalTrainer.badgeCount);
- if (FlagGet(CODE_FLAGS + 0x48))
+ if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER))
{
if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
{
@@ -6516,7 +6341,7 @@ void DoTVShowTodaysRivalTrainer(void)
}
break;
case 2:
- if (FlagGet(CODE_FLAGS + 0x48))
+ if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER))
{
if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
{
@@ -6565,7 +6390,7 @@ void DoTVShowTodaysRivalTrainer(void)
ShowFieldMessage(sTVTodaysRivalTrainerTextGroup[state]);
}
-void DoTVShowDewfordTrendWatcherNetwork(void)
+static void DoTVShowDewfordTrendWatcherNetwork(void)
{
TVShow *show;
u8 state;
@@ -6621,7 +6446,7 @@ void DoTVShowDewfordTrendWatcherNetwork(void)
ShowFieldMessage(sTVDewfordTrendWatcherNetworkTextGroup[state]);
}
-void DoTVShowHoennTreasureInvestigators(void)
+static void DoTVShowHoennTreasureInvestigators(void)
{
TVShow *show;
u8 state;
@@ -6632,10 +6457,10 @@ void DoTVShowHoennTreasureInvestigators(void)
switch (state)
{
case 0:
- StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name);
+ StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
if (show->treasureInvestigators.location == MAPSEC_DYNAMIC)
{
- switch (show->treasureInvestigators.mapDataId)
+ switch (show->treasureInvestigators.mapLayoutId)
{
case 0x115 ... 0x117:
sTVShowState = 2;
@@ -6651,13 +6476,13 @@ void DoTVShowHoennTreasureInvestigators(void)
}
break;
case 1:
- StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name);
+ StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
GetMapName(gStringVar3, show->treasureInvestigators.location, 0);
TVShowDone();
break;
case 2:
- StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name);
+ StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
TVShowDone();
break;
@@ -6665,7 +6490,7 @@ void DoTVShowHoennTreasureInvestigators(void)
ShowFieldMessage(sTVHoennTreasureInvestisatorsTextGroup[state]);
}
-void DoTVShowFindThatGamer(void)
+static void DoTVShowFindThatGamer(void)
{
TVShow *show;
u8 state;
@@ -6739,7 +6564,7 @@ void DoTVShowFindThatGamer(void)
ShowFieldMessage(sTVFindThatGamerTextGroup[state]);
}
-void DoTVShowBreakingNewsTV(void)
+static void DoTVShowBreakingNewsTV(void)
{
TVShow *show;
u8 state;
@@ -6773,7 +6598,7 @@ void DoTVShowBreakingNewsTV(void)
break;
case 3:
TV_PrintIntToStringVar(0, show->breakingNews.balls);
- StringCopy(gStringVar2, ItemId_GetItem(show->breakingNews.caughtMonBall)->name);
+ StringCopy(gStringVar2, ItemId_GetName(show->breakingNews.caughtMonBall));
sTVShowState = 4;
break;
case 4:
@@ -6842,7 +6667,7 @@ void DoTVShowBreakingNewsTV(void)
ShowFieldMessage(sTVBreakinsNewsTextGroup[state]);
}
-void DoTVShowSecretBaseVisit(void)
+static void DoTVShowSecretBaseVisit(void)
{
TVShow *show;
u8 state;
@@ -6938,7 +6763,7 @@ void DoTVShowSecretBaseVisit(void)
ShowFieldMessage(sTVSecretBaseVisitTextGroup[state]);
}
-void DoTVShowPokemonLotteryWinnerFlashReport(void)
+static void DoTVShowPokemonLotteryWinnerFlashReport(void)
{
TVShow *show;
u8 state;
@@ -6963,12 +6788,12 @@ void DoTVShowPokemonLotteryWinnerFlashReport(void)
{
StringCopy(gStringVar2, gText_Third);
}
- StringCopy(gStringVar3, ItemId_GetItem(show->lottoWinner.item)->name);
+ StringCopy(gStringVar3, ItemId_GetName(show->lottoWinner.item));
TVShowDone();
ShowFieldMessage(sTVPokemonLotteryWinnerFlashReportTextGroup[state]);
}
-void DoTVShowThePokemonBattleSeminar(void)
+static void DoTVShowThePokemonBattleSeminar(void)
{
TVShow *show;
u8 state;
@@ -7032,7 +6857,7 @@ void DoTVShowThePokemonBattleSeminar(void)
ShowFieldMessage(sTVThePokemonBattleSeminarTextGroup[state]);
}
-void DoTVShowTrainerFanClubSpecial(void)
+static void DoTVShowTrainerFanClubSpecial(void)
{
TVShow *show;
u8 state;
@@ -7097,7 +6922,7 @@ void DoTVShowTrainerFanClubSpecial(void)
ShowFieldMessage(sTVTrainerFanClubSpecialTextGroup[state]);
}
-void DoTVShowTrainerFanClub(void)
+static void DoTVShowTrainerFanClub(void)
{
TVShow *show;
u8 state;
@@ -7184,7 +7009,7 @@ void DoTVShowTrainerFanClub(void)
ShowFieldMessage(sTVTrainerFanClubTextGroup[state]);
}
-void DoTVShowSpotTheCuties(void)
+static void DoTVShowSpotTheCuties(void)
{
TVShow *show;
u8 state;
@@ -7289,7 +7114,7 @@ void DoTVShowSpotTheCuties(void)
ShowFieldMessage(sTVCutiesTextGroup[state]);
}
-void DoTVShowPokemonNewsBattleFrontier(void)
+static void DoTVShowPokemonNewsBattleFrontier(void)
{
TVShow *show;
u8 state;
@@ -7438,7 +7263,7 @@ void DoTVShowPokemonNewsBattleFrontier(void)
ShowFieldMessage(sTVPokemonNewsBattleFrontierTextGroup[state]);
}
-void DoTVShowWhatsNo1InHoennToday(void)
+static void DoTVShowWhatsNo1InHoennToday(void)
{
TVShow *show;
u8 state;
@@ -7553,7 +7378,7 @@ u8 sub_80F51AC(TVShow *show, u8 a1)
return 0;
}
-void DoTVShowSecretBaseSecrets(void)
+static void DoTVShowSecretBaseSecrets(void)
{
TVShow *show;
u8 state;
@@ -7705,7 +7530,7 @@ void DoTVShowSecretBaseSecrets(void)
sTVShowState = show->secretBaseSecrets.savedState;
break;
case 19:
- StringCopy(gStringVar2, ItemId_GetItem(show->secretBaseSecrets.item)->name);
+ StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item));
sTVShowState = show->secretBaseSecrets.savedState;
break;
case 20:
@@ -7791,7 +7616,7 @@ void DoTVShowSecretBaseSecrets(void)
ShowFieldMessage(sTVSecretBaseSecretsTextGroup[state]);
}
-void DoTVShowSafariFanClub(void)
+static void DoTVShowSafariFanClub(void)
{
TVShow *show;
u8 state;
@@ -7878,7 +7703,7 @@ void DoTVShowSafariFanClub(void)
ShowFieldMessage(sTVSafariFanClubTextGroup[state]);
}
-void DoTVShowPokemonContestLiveUpdates2(void)
+static void DoTVShowPokemonContestLiveUpdates2(void)
{
TVShow *show;
u8 state;
diff --git a/src/unk_81BAD84.c b/src/unk_81BAD84.c
new file mode 100644
index 000000000..c0d891c12
--- /dev/null
+++ b/src/unk_81BAD84.c
@@ -0,0 +1,47 @@
+#include "global.h"
+#include "graphics.h"
+
+const struct {
+ const u8 *gfx;
+ const u8 *tileMap;
+ const u16 *pltt;
+} gUnknown_08617128[] = {
+ {
+ gBerryFixGameboy_Gfx,
+ gBerryFixGameboy_Tilemap,
+ gBerryFixGameboy_Pal
+ }, {
+ gBerryFixGameboyLogo_Gfx,
+ gBerryFixGameboyLogo_Tilemap,
+ gBerryFixGameboyLogo_Pal
+ }, {
+ gBerryFixGbaTransfer_Gfx,
+ gBerryFixGbaTransfer_Tilemap,
+ gBerryFixGbaTransfer_Pal
+ }, {
+ gBerryFixGbaTransferHighlight_Gfx,
+ gBerryFixGbaTransferHighlight_Tilemap,
+ gBerryFixGbaTransferHighlight_Pal
+ }, {
+ gBerryFixGbaTransferError_Gfx,
+ gBerryFixGbaTransferError_Tilemap,
+ gBerryFixGbaTransferError_Pal
+ }, {
+ gBerryFixWindow_Gfx,
+ gBerryFixWindow_Tilemap,
+ gBerryFixWindow_Pal
+ }
+};
+
+void sub_81BAD84(u32 idx)
+{
+ REG_DISPCNT = 0x0000;
+ REG_BG0HOFS = 0x0000;
+ REG_BG0VOFS = 0x0000;
+ REG_BLDCNT = 0x0000;
+ LZ77UnCompVram(gUnknown_08617128[idx].gfx, (void *)BG_CHAR_ADDR(0));
+ LZ77UnCompVram(gUnknown_08617128[idx].tileMap, (void *)BG_SCREEN_ADDR(31));
+ CpuCopy16(gUnknown_08617128[idx].pltt, (void *)PLTT, 0x200);
+ REG_BG0CNT = 0x1f00;
+ REG_DISPCNT = DISPCNT_BG0_ON;
+}
diff --git a/src/unk_text_util_2.c b/src/unk_text_util_2.c
index d88af611f..ca8246128 100644
--- a/src/unk_text_util_2.c
+++ b/src/unk_text_util_2.c
@@ -4,8 +4,8 @@
#include "text.h"
#include "sound.h"
-static const u8 gUnknown_08616124[] = {1, 2, 4};
-static const u16 gFont6BrailleGlyphs[] = INCBIN_U16("data/graphics/fonts/font6.fwjpnfont");
+static const u8 sUnknown_08616124[] = {1, 2, 4};
+static const u16 sFont6BrailleGlyphs[] = INCBIN_U16("data/graphics/fonts/font6.fwjpnfont");
static void DecompressGlyphFont6(u16);
@@ -13,7 +13,7 @@ u16 Font6Func(struct TextPrinter *textPrinter)
{
u16 char_;
struct TextPrinterSubStruct *sub;
-
+
sub = &textPrinter->sub_union.sub;
switch (textPrinter->state)
{
@@ -57,24 +57,24 @@ u16 Font6Func(struct TextPrinter *textPrinter)
switch (char_)
{
case 1:
- textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset ++;
- GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ textPrinter->subPrinter.fgColor = *textPrinter->subPrinter.current_text_offset ++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 2:
textPrinter->subPrinter.bgColor = *textPrinter->subPrinter.current_text_offset ++;
- GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 3:
textPrinter->subPrinter.shadowColor = *textPrinter->subPrinter.current_text_offset ++;
- GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 4:
- textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.fgColor = *textPrinter->subPrinter.current_text_offset;
textPrinter->subPrinter.bgColor = *++ textPrinter->subPrinter.current_text_offset;
textPrinter->subPrinter.shadowColor = *++ textPrinter->subPrinter.current_text_offset;
textPrinter->subPrinter.current_text_offset ++;
- GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 5:
textPrinter->subPrinter.current_text_offset ++;
@@ -163,15 +163,15 @@ u16 Font6Func(struct TextPrinter *textPrinter)
case 4:
if (textPrinter->scrollDistance)
{
- if (textPrinter->scrollDistance < gUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed])
+ if (textPrinter->scrollDistance < sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed])
{
ScrollWindow(textPrinter->subPrinter.windowId, 0, textPrinter->scrollDistance, textPrinter->subPrinter.bgColor | (textPrinter->subPrinter.bgColor << 4));
textPrinter->scrollDistance = 0;
}
else
{
- ScrollWindow(textPrinter->subPrinter.windowId, 0, gUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed], textPrinter->subPrinter.bgColor | (textPrinter->subPrinter.bgColor << 4));
- textPrinter->scrollDistance -= gUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed];
+ ScrollWindow(textPrinter->subPrinter.windowId, 0, sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed], textPrinter->subPrinter.bgColor | (textPrinter->subPrinter.bgColor << 4));
+ textPrinter->scrollDistance -= sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed];
}
CopyWindowToVram(textPrinter->subPrinter.windowId, 2);
}
@@ -204,7 +204,7 @@ static void DecompressGlyphFont6(u16 glyph)
{
const u16 *glyphs;
- glyphs = gFont6BrailleGlyphs + 0x100 * (glyph / 8) + 0x10 * (glyph % 8);
+ glyphs = sFont6BrailleGlyphs + 0x100 * (glyph / 8) + 0x10 * (glyph % 8);
DecompressGlyphTile(glyphs, (u16 *)gUnknown_03002F90);
DecompressGlyphTile(glyphs + 0x8, (u16 *)(gUnknown_03002F90 + 0x20));
DecompressGlyphTile(glyphs + 0x80, (u16 *)(gUnknown_03002F90 + 0x40));
diff --git a/src/unk_transition.c b/src/unk_transition.c
new file mode 100644
index 000000000..20692bb7c
--- /dev/null
+++ b/src/unk_transition.c
@@ -0,0 +1,633 @@
+#include "global.h"
+#include "sprite.h"
+#include "decompress.h"
+#include "unk_transition.h"
+#include "battle_transition.h"
+#include "task.h"
+#include "palette.h"
+#include "trig.h"
+#include "bg.h"
+#include "gpu_regs.h"
+
+typedef bool8 (*TransitionStateFunc)(struct Task *task);
+
+// this file's functions
+static void sub_81DA848(struct Sprite *sprite);
+static void sub_81DA9BC(struct Sprite *sprite);
+static bool8 sub_81DAACC(struct Task *task);
+static bool8 sub_81DAC14(struct Task *task);
+static bool8 sub_81DABBC(struct Task *task);
+static bool8 sub_81DAB4C(struct Task *task);
+static bool8 sub_81DAC80(struct Task *task);
+static bool8 sub_81DACEC(struct Task *task);
+static bool8 sub_81DAD58(struct Task *task);
+static bool8 sub_81DADC4(struct Task *task);
+static bool8 sub_81DAE44(struct Task *task);
+static bool8 sub_81DAEB0(struct Task *task);
+static bool8 sub_81DAF34(struct Task *task);
+static bool8 sub_81DAFA0(struct Task *task);
+static bool8 sub_81DB02C(struct Task *task);
+static bool8 sub_81DB098(struct Task *task);
+static bool8 sub_81DB124(struct Task *task);
+static bool8 sub_81DB190(struct Task *task);
+static bool8 sub_81DB224(struct Task *task);
+static bool8 sub_81DB290(struct Task *task);
+static bool8 sub_81DB328(struct Task *task);
+
+// const rom data
+// TODO: move those from .s file to .c
+extern const u8 gUnknown_0862AD54[];
+extern const u8 gUnknown_0862AF30[];
+extern const u8 gUnknown_0862B0DC[];
+extern const u16 gUnknown_0862B53C[];
+
+static const struct OamData sOamData_862B71C =
+{
+ .y = 0,
+ .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 struct CompressedSpriteSheet sUnknown_0862B724 =
+{
+ gUnknown_0862B0DC, 0x1800, 11920
+};
+
+static const struct SpritePalette sUnknown_0862B72C =
+{
+ gUnknown_0862B53C, 11920
+};
+
+static const union AnimCmd sSpriteAnim_862B734[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862B73C[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_862B744[] =
+{
+ ANIMCMD_FRAME(128, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_862B74C[] =
+{
+ sSpriteAnim_862B734,
+ sSpriteAnim_862B73C,
+ sSpriteAnim_862B744
+};
+
+static const struct SpriteTemplate sUnknown_0862B758 =
+{
+ .tileTag = 11920,
+ .paletteTag = 11920,
+ .oam = &sOamData_862B71C,
+ .anims = sSpriteAnimTable_862B74C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const TransitionStateFunc sPhase2_34_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DAC14,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DAC80
+};
+
+static const TransitionStateFunc sPhase2_35_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DACEC,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DAD58
+};
+
+static const TransitionStateFunc sPhase2_36_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DADC4,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DAE44
+};
+
+static const TransitionStateFunc sPhase2_37_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DAEB0,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DAF34
+};
+
+static const TransitionStateFunc sPhase2_38_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DAFA0,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DB02C
+};
+
+static const TransitionStateFunc sPhase2_39_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DB098,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DB124
+};
+
+static const TransitionStateFunc sPhase2_40_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DB190,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DB224
+};
+
+static const TransitionStateFunc sPhase2_41_Funcs[] =
+{
+ sub_81DAACC,
+ sub_81DB290,
+ sub_81DABBC,
+ sub_81DAB4C,
+ sub_81DB328
+};
+
+// code
+static void sub_81DA700(void)
+{
+ u16 *dst1, *dst2;
+
+ sub_8149F58(&dst1, &dst2);
+ LZ77UnCompVram(gUnknown_0862AD54, dst2);
+ LZ77UnCompVram(gUnknown_0862AF30, dst1);
+ LoadPalette(gUnknown_0862B53C, 0xF0, 0x20);
+ LoadCompressedObjectPic(&sUnknown_0862B724);
+ LoadSpritePalette(&sUnknown_0862B72C);
+}
+
+static u8 sub_81DA74C(s16 x, s16 y, u8 arg2, u8 arg3, s8 arg4, s8 arg5, u8 spriteAnimNum)
+{
+ u8 spriteId = CreateSprite(&sUnknown_0862B758, x, y, 0);
+
+ switch (spriteAnimNum)
+ {
+ case 0:
+ gSprites[spriteId].data[0] = 120;
+ gSprites[spriteId].data[1] = 45;
+ break;
+ case 1:
+ gSprites[spriteId].data[0] = 89;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ case 2:
+ gSprites[spriteId].data[0] = 151;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ }
+
+ gSprites[spriteId].data[2] = arg4;
+ gSprites[spriteId].data[3] = arg5;
+ gSprites[spriteId].data[6] = arg2;
+ gSprites[spriteId].data[7] = arg3;
+ gSprites[spriteId].data[4] = 0;
+ gSprites[spriteId].data[5] = 0;
+
+ StartSpriteAnim(&gSprites[spriteId], spriteAnimNum);
+ gSprites[spriteId].callback = sub_81DA848;
+
+ return spriteId;
+}
+
+static void sub_81DA848(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+
+ if (sprite->pos1.x == data[0] && sprite->pos1.y == data[1])
+ {
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else
+ {
+ if (data[4] == data[6])
+ {
+ sprite->pos1.x += data[2];
+ data[4] = 0;
+ }
+ else
+ {
+ data[4]++;
+ }
+
+ if (data[5] == data[7])
+ {
+ sprite->pos1.y += data[3];
+ data[5] = 0;
+ }
+ else
+ {
+ data[5]++;
+ }
+ }
+}
+
+static u8 sub_81DA8BC(s16 x, s16 y, s16 arg2, s16 arg3, s16 arg4, s16 arg5, s16 arg6, u8 spriteAnimNum)
+{
+ u8 spriteId = CreateSprite(&sUnknown_0862B758, x, y, 0);
+
+ switch (spriteAnimNum)
+ {
+ case 0:
+ gSprites[spriteId].data[0] = 120;
+ gSprites[spriteId].data[1] = 45;
+ break;
+ case 1:
+ gSprites[spriteId].data[0] = 89;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ case 2:
+ gSprites[spriteId].data[0] = 151;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ }
+
+ gSprites[spriteId].data[2] = arg2;
+ gSprites[spriteId].data[3] = arg3;
+ gSprites[spriteId].data[4] = arg4;
+ gSprites[spriteId].data[5] = arg5;
+ gSprites[spriteId].data[6] = arg6;
+
+ StartSpriteAnim(&gSprites[spriteId], spriteAnimNum);
+ gSprites[spriteId].callback = sub_81DA9BC;
+
+ return spriteId;
+}
+
+static void sub_81DA9BC(struct Sprite *sprite)
+{
+ sprite->pos2.x = (Sin2(sprite->data[2]) * sprite->data[4]) >> 12; // div by 4096
+ sprite->pos2.y = (Cos2(sprite->data[2]) * sprite->data[4]) >> 12; // div by 4096
+
+ sprite->data[2] = (sprite->data[2] + sprite->data[3]) % 360;
+
+ if (sprite->data[4] != sprite->data[5])
+ sprite->data[4] += sprite->data[6];
+ else
+ sprite->callback = SpriteCallbackDummy;
+}
+
+#define tState data[0]
+
+static void sub_81DAA20(struct Task *task)
+{
+ FreeSpriteTilesByTag(11920);
+ FreeSpritePaletteByTag(11920);
+
+ DestroySprite(&gSprites[task->data[4]]);
+ DestroySprite(&gSprites[task->data[5]]);
+ DestroySprite(&gSprites[task->data[6]]);
+}
+
+static bool8 sub_81DAA74(struct Task *task)
+{
+ if (gSprites[task->data[4]].callback == SpriteCallbackDummy
+ && gSprites[task->data[5]].callback == SpriteCallbackDummy
+ && gSprites[task->data[6]].callback == SpriteCallbackDummy)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 sub_81DAACC(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
+
+ task->data[1]++;
+ return FALSE;
+ }
+ else
+ {
+ sub_81DA700();
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x3F41);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgY(0, 0x500, 2);
+
+ task->data[1] = 0;
+ task->tState++;
+ return TRUE;
+ }
+}
+
+static bool8 sub_81DAB4C(struct Task *task)
+{
+ if (task->data[2] == 0)
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
+
+ if (task->data[2] == 16)
+ {
+ if (task->data[3] == 31)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0);
+ task->tState++;
+ }
+ else
+ {
+ task->data[3]++;
+ }
+ }
+ else
+ {
+ u16 var;
+
+ task->data[2]++;
+ var = task->data[2];
+ SetGpuReg(REG_OFFSET_BLDALPHA, (var) | ((16 - var) << 8));
+ }
+
+ return FALSE;
+}
+
+static bool8 sub_81DABBC(struct Task *task)
+{
+ if (sub_81DAA74(task) == TRUE)
+ task->tState++;
+
+ return FALSE;
+}
+
+void Phase2Task_34(u8 taskId)
+{
+ while (sPhase2_34_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DAC14(struct Task *task)
+{
+ task->data[4] = sub_81DA74C(120, -51, 0, 0, 0, 2, 0);
+ task->data[5] = sub_81DA74C(-7, 193, 0, 0, 2, -2, 1);
+ task->data[6] = sub_81DA74C(247, 193, 0, 0, -2, -2, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 sub_81DAC80(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_34));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_35(u8 taskId)
+{
+ while (sPhase2_35_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DACEC(struct Task *task)
+{
+ task->data[4] = sub_81DA74C(120, 197, 0, 0, 0, -4, 0);
+ task->data[5] = sub_81DA74C(241, 59, 0, 1, -4, 2, 1);
+ task->data[6] = sub_81DA74C(-1, 59, 0, 1, 4, 2, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 sub_81DAD58(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_35));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_36(u8 taskId)
+{
+ while (sPhase2_36_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DADC4(struct Task *task)
+{
+ task->data[4] = sub_81DA8BC(120, 45, 12, 4, 128, 0, -4, 0);
+ task->data[5] = sub_81DA8BC(89, 97, 252, 4, 128, 0, -4, 1);
+ task->data[6] = sub_81DA8BC(151, 97, 132, 4, 128, 0, -4, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 sub_81DAE44(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_36));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_37(u8 taskId)
+{
+ while (sPhase2_37_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DAEB0(struct Task *task)
+{
+ task->data[4] = sub_81DA8BC(120, 80, 284, 8, 131, 35, -3, 0);
+ task->data[5] = sub_81DA8BC(120, 80, 44, 8, 131, 35, -3, 1);
+ task->data[6] = sub_81DA8BC(121, 80, 164, 8, 131, 35, -3, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 sub_81DAF34(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_37));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_38(u8 taskId)
+{
+ while (sPhase2_38_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DAFA0(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = sub_81DA74C(120, -51, 0, 0, 0, 4, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = sub_81DA74C(-7, 193, 0, 0, 4, -4, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = sub_81DA74C(247, 193, 0, 0, -4, -4, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 sub_81DB02C(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_38));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_39(u8 taskId)
+{
+ while (sPhase2_39_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DB098(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = sub_81DA74C(120, 197, 0, 0, 0, -8, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = sub_81DA74C(241, 78, 0, 0, -8, 1, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = sub_81DA74C(-1, 78, 0, 0, 8, 1, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 sub_81DB124(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_39));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_40(u8 taskId)
+{
+ while (sPhase2_40_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DB190(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = sub_81DA8BC(120, 45, 12, 4, 128, 0, -4, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = sub_81DA8BC(89, 97, 252, 4, 128, 0, -4, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = sub_81DA8BC(151, 97, 132, 4, 128, 0, -4, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 sub_81DB224(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_40));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_41(u8 taskId)
+{
+ while (sPhase2_41_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 sub_81DB290(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = sub_81DA8BC(120, 80, 284, 8, 131, 35, -3, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = sub_81DA8BC(120, 80, 44, 8, 131, 35, -3, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = sub_81DA8BC(121, 80, 164, 8, 131, 35, -3, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 sub_81DB328(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81DAA20(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_41));
+ }
+
+ return FALSE;
+}
diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c
new file mode 100644
index 000000000..72c33100f
--- /dev/null
+++ b/src/use_pokeblock.c
@@ -0,0 +1,230 @@
+#include "global.h"
+#include "main.h"
+#include "pokeblock.h"
+#include "malloc.h"
+#include "palette.h"
+#include "pokenav.h"
+#include "scanline_effect.h"
+#include "text.h"
+#include "bg.h"
+#include "window.h"
+#include "text_window.h"
+
+struct UsePokeblockSubStruct
+{
+ void (*field_0)(void);
+ void (*callback)(void);
+ struct Pokeblock *pokeblock;
+ struct Pokemon *pokemon;
+ u8 stringBuffer[0x40];
+ u8 field_50;
+ u8 field_51;
+ u8 field_52;
+ u8 field_53;
+ u8 field_54;
+ u8 field_55;
+ u8 field_56;
+ u8 field_57[5];
+ u8 field_5c[5];
+ u8 field_61[5];
+ s16 field_66[5];
+};
+
+struct UsePokeblockStruct
+{
+ u8 field_0[0x7C58];
+ u8 field_7C58[0x378];
+ struct UsePokeblockSubStruct info;
+};
+
+extern u16 gKeyRepeatStartDelay;
+
+// this file's functions
+void sub_816636C(void (*func)(void));
+void sub_8166380(void);
+void sub_816631C(void);
+void sub_81662C0(void);
+void sub_8166564(void);
+void sub_8166304(void);
+void sub_81668F8(void);
+void sub_8167420(void);
+void sub_8167760(void);
+u8 sub_81672E4(u8 arg0);
+bool8 sub_8168328(void);
+bool8 sub_8167930(void);
+void sub_8167608(u8 arg0);
+void sub_8167BA0(u16 arg0, u8 copyToVramMode);
+
+extern const struct BgTemplate gUnknown_085DFCCC[4];
+extern const struct WindowTemplate gUnknown_085DFCDC[];
+
+// ram variables
+EWRAM_DATA struct UsePokeblockSubStruct *gUnknown_0203BC90 = NULL;
+EWRAM_DATA void (*gUnknown_0203BC94)(void) = NULL;
+EWRAM_DATA struct Pokeblock *gUnknown_0203BC98 = NULL;
+EWRAM_DATA u8 gPokeblockMonId = 0;
+EWRAM_DATA s16 gPokeblockGain = 0;
+EWRAM_DATA void *gUnknown_0203BCA0 = NULL;
+EWRAM_DATA void *gUnknown_0203BCA4 = NULL;
+EWRAM_DATA void *gUnknown_0203BCA8 = NULL;
+EWRAM_DATA struct UsePokeblockStruct *gUnknown_0203BCAC = NULL;
+
+// const rom data
+// todo: make it static once the file is decompiled
+
+// code
+void ChooseMonToGivePokeblock(struct Pokeblock *pokeblock, void (*callback)(void))
+{
+ gUnknown_0203BCAC = AllocZeroed(0x806C);
+ gUnknown_0203BC90 = &gUnknown_0203BCAC->info;
+ gUnknown_0203BC90->pokeblock = pokeblock;
+ gUnknown_0203BC90->callback = callback;
+ sub_816636C(sub_8166380);
+ SetMainCallback2(sub_816631C);
+}
+
+void CB2_ReturnAndChooseMonToGivePokeblock(void)
+{
+ gUnknown_0203BCAC = AllocZeroed(0x806C);
+ gUnknown_0203BC90 = &gUnknown_0203BCAC->info;
+ gUnknown_0203BC90->pokeblock = gUnknown_0203BC98;
+ gUnknown_0203BC90->callback = gUnknown_0203BC94;
+ gPokeblockMonId = sub_81672E4(gPokeblockMonId);
+ gUnknown_0203BC90->field_56 = gPokeblockMonId < 4 ? 0 : 1;
+ sub_816636C(sub_8166380);
+ SetMainCallback2(sub_81662C0);
+}
+
+void sub_81662C0(void)
+{
+ gUnknown_0203BC90->field_0();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ if (gUnknown_0203BC90->field_0 == sub_8166564)
+ {
+ gUnknown_0203BC90->field_50 = 0;
+ SetMainCallback2(sub_8166304);
+ }
+}
+
+void sub_8166304(void)
+{
+ sub_81668F8();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_816631C(void)
+{
+ gUnknown_0203BC90->field_0();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+void sub_8166340(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_81D2108(gUnknown_0203BCAC->field_7C58);
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+void sub_816636C(void (*func)(void))
+{
+ gUnknown_0203BC90->field_0 = func;
+ gUnknown_0203BC90->field_50 = 0;
+}
+
+void sub_8166380(void)
+{
+ switch (gUnknown_0203BC90->field_50)
+ {
+ case 0:
+ gUnknown_0203BCAC->field_0[0x7B10] = 0xFF;
+ sub_81D1ED4(gUnknown_0203BCAC->field_7C58);
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 1:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 2:
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void*)(VRAM), VRAM_SIZE);
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 3:
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_085DFCCC, ARRAY_COUNT(gUnknown_085DFCCC));
+ InitWindows(gUnknown_085DFCDC);
+ DeactivateAllTextPrinters();
+ LoadUserWindowBorderGfx(0, 0x97, 0xE0);
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 4:
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 5:
+ if (!sub_8168328())
+ {
+ gUnknown_0203BC90->field_50++;
+ }
+ break;
+ case 6:
+ gKeyRepeatStartDelay = 20;
+ sub_8167420();
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 7:
+ if (!sub_8167930())
+ {
+ gUnknown_0203BC90->field_50++;
+ }
+ break;
+ case 8:
+ sub_8167608(0);
+ sub_8167760();
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 9:
+ if (!sub_81D312C(&gUnknown_0203BCAC->field_0[0x7B0E]))
+ {
+ gUnknown_0203BC90->field_50++;
+ }
+ break;
+ case 10:
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 11:
+ sub_81D2754(gUnknown_0203BCAC->field_7C58, &gUnknown_0203BCAC->field_0[0x7C6C]);
+ sub_81D20AC(gUnknown_0203BCAC->field_7C58);
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 12:
+ if (!sub_81D20BC(gUnknown_0203BCAC->field_7C58))
+ {
+ sub_81D1F84(gUnknown_0203BCAC->field_7C58, &gUnknown_0203BCAC->field_7C58[0x14], &gUnknown_0203BCAC->field_7C58[0x14]);
+ gUnknown_0203BC90->field_50++;
+ }
+ break;
+ case 13:
+ sub_81D2230(gUnknown_0203BCAC->field_7C58);
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 14:
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ sub_8167BA0(0, 1);
+ gUnknown_0203BC90->field_50++;
+ break;
+ case 15:
+ sub_816636C(sub_8166564);
+ break;
+ }
+}
diff --git a/src/util.c b/src/util.c
index 58088c3ee..88be4e4a1 100644
--- a/src/util.c
+++ b/src/util.c
@@ -230,7 +230,7 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
}
#else
-__attribute__((naked)) void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
+NAKED void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
asm("\n\
.syntax unified\n\
diff --git a/src/walda_phrase.c b/src/walda_phrase.c
index 59fd3fedb..4a82be14f 100644
--- a/src/walda_phrase.c
+++ b/src/walda_phrase.c
@@ -6,15 +6,13 @@
#include "main.h"
#include "text.h"
#include "new_game.h"
-
-extern void (*gFieldCallback)(void);
+#include "overworld.h"
extern const u8 gText_Peekaboo[];
extern u8 *GetWaldaPhrasePtr(void);
extern bool32 IsWaldaPhraseEmpty(void);
extern void sub_80AF168(void);
-extern void c2_exit_to_overworld_2_switch(void);
extern void SetWaldaPhrase(const u8 *src);
extern void SetWaldaWallpaperPatternId(u8 patternId);
extern void SetWaldaWallpaperIconId(u8 iconId);
@@ -80,7 +78,7 @@ static void CB2_HandleGivenWaldaPhrase(void)
StringCopy(gStringVar1, GetWaldaPhrasePtr());
gFieldCallback = sub_80AF168;
- SetMainCallback2(c2_exit_to_overworld_2_switch);
+ SetMainCallback2(CB2_ReturnToField);
}
static u32 GetWaldaPhraseInputCase(u8 *inputPtr)
diff --git a/src/wallclock.c b/src/wallclock.c
new file mode 100644
index 000000000..9b96d416c
--- /dev/null
+++ b/src/wallclock.c
@@ -0,0 +1,1057 @@
+#include "global.h"
+#include "main.h"
+#include "palette.h"
+#include "gpu_regs.h"
+#include "bg.h"
+#include "rtc.h"
+#include "clock.h"
+#include "wallclock.h"
+#include "event_data.h"
+#include "graphics.h"
+#include "text.h"
+#include "window.h"
+#include "text_window.h"
+#include "menu.h"
+#include "scanline_effect.h"
+#include "task.h"
+#include "strings.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "trig.h"
+#include "decompress.h"
+
+// static types
+
+#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]
+
+#define TAG_GFX_WALL_CLOCK_HAND 0x1000
+#define TAG_PAL_WALL_CLOCK_HAND 0x1000
+
+// static declarations
+
+static void WallClockMainCallback(void);
+static void Task_SetClock1(u8 taskId);
+static void Task_SetClock2(u8 taskId);
+static void Task_SetClock3(u8 taskId);
+static void Task_SetClock4(u8 taskId);
+static void Task_SetClock5(u8 taskId);
+static void Task_SetClock6(u8 taskId);
+static void Task_ViewClock1(u8 taskId);
+static void Task_ViewClock2(u8 taskId);
+static void Task_ViewClock3(u8 taskId);
+static void Task_ViewClock4(u8 taskId);
+static u16 CalcNewMinHandAngle(u16 a0, u8 command, u8 a2);
+static bool32 AdvanceClock(u8 taskId, u8 command);
+static void UpdateClockPeriod(u8 taskId, u8 command);
+static void InitClockWithRtc(u8 taskId);
+static void SpriteCB_MinuteHand(struct Sprite *sprite);
+static void SpriteCB_HourHand(struct Sprite *sprite);
+static void SpriteCB_AMIndicator(struct Sprite *sprite);
+static void SpriteCB_PMIndicator(struct Sprite *sprite);
+
+// rodata
+
+static const u8 sUnknown_085B1F58[] = INCBIN_U8("graphics/wallclock/graphics_85b1f58.4bpp.lz");
+static const u16 sUnknown_085B21D4[] = INCBIN_U16("graphics/wallclock/palette_85b21d4.gbapal");
+static const struct WindowTemplate gUnknown_085B21DC[] = {
+ { 0x00, 0x03, 0x11, 0x18, 0x02, 0x0e, 0x200 },
+ { 0x02, 0x18, 0x10, 0x06, 0x02, 0x0c, 0x230 },
+ DUMMY_WIN_TEMPLATE
+};
+static const struct WindowTemplate gUnknown_085B21F4 = {
+ 0x00, 0x18, 0x09, 0x05, 0x04, 0x0e, 0x23c
+};
+static const struct BgTemplate gUnknown_085B21FC[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .priority = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 8,
+ .priority = 1
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 7,
+ .priority = 2
+ }
+};
+static const struct CompressedSpriteSheet gUnknown_085B2208 = {
+ sUnknown_085B1F58, 0x2000, TAG_GFX_WALL_CLOCK_HAND
+};
+static const u32 filler_85B2210[2] = {};
+static const struct SpritePalette gUnknown_085B2218[] = {
+ { gWallclockMale_Pal, TAG_PAL_WALL_CLOCK_HAND },
+ { gWallclockFemale_Pal, 0x1001 },
+ {}
+};
+static const struct OamData Unknown_085B2230 = {
+ .y = 0xa0,
+ .size = 3,
+ .priority = 1
+};
+static const union AnimCmd Unknown_085B2238[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END
+};
+static const union AnimCmd Unknown_085B2240[] = {
+ ANIMCMD_FRAME(64, 30),
+ ANIMCMD_END
+};
+static const union AnimCmd *const gUnknown_085B2248[] = {
+ Unknown_085B2238
+};
+static const union AnimCmd *const gUnknown_085B224C[] = {
+ Unknown_085B2240
+};
+static const struct SpriteTemplate gUnknown_085B2250 = {
+ TAG_GFX_WALL_CLOCK_HAND,
+ TAG_PAL_WALL_CLOCK_HAND,
+ &Unknown_085B2230,
+ gUnknown_085B2248,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCB_MinuteHand
+};
+static const struct SpriteTemplate gUnknown_085B2268 = {
+ TAG_GFX_WALL_CLOCK_HAND,
+ TAG_PAL_WALL_CLOCK_HAND,
+ &Unknown_085B2230,
+ gUnknown_085B224C,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCB_HourHand
+};
+static const struct OamData Unknown_085B2280 = {
+ .y = 0xa0,
+ .size = 1,
+ .priority = 3
+};
+static const union AnimCmd Unknown_085B2288[] = {
+ ANIMCMD_FRAME(0x84, 30),
+ ANIMCMD_END
+};
+static const union AnimCmd Unknown_085B2290[] = {
+ ANIMCMD_FRAME(0x80, 30),
+ ANIMCMD_END
+};
+static const union AnimCmd *const gUnknown_085B2298[] = {
+ Unknown_085B2288
+};
+static const union AnimCmd *const gUnknown_085B229C[] = {
+ Unknown_085B2290
+};
+static const struct SpriteTemplate gUnknown_085B22A0 = {
+ TAG_GFX_WALL_CLOCK_HAND,
+ TAG_PAL_WALL_CLOCK_HAND,
+ &Unknown_085B2280,
+ gUnknown_085B2298,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCB_AMIndicator
+};
+static const struct SpriteTemplate gUnknown_085B22B8 = {
+ TAG_GFX_WALL_CLOCK_HAND,
+ TAG_PAL_WALL_CLOCK_HAND,
+ &Unknown_085B2280,
+ gUnknown_085B229C,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCB_PMIndicator
+};
+static const s8 sClockHandCoords[][2] = {
+ { 0x00, -0x18},
+ { 0x01, -0x19},
+ { 0x01, -0x19},
+ { 0x02, -0x19},
+ { 0x02, -0x19},
+ { 0x02, -0x19},
+ { 0x03, -0x18},
+ { 0x03, -0x19},
+ { 0x04, -0x19},
+ { 0x04, -0x19},
+ { 0x04, -0x19},
+ { 0x05, -0x19},
+ { 0x05, -0x19},
+ { 0x06, -0x18},
+ { 0x06, -0x18},
+ { 0x06, -0x18},
+ { 0x07, -0x18},
+ { 0x07, -0x18},
+ { 0x07, -0x18},
+ { 0x08, -0x18},
+ { 0x08, -0x18},
+ { 0x09, -0x18},
+ { 0x09, -0x18},
+ { 0x0a, -0x17},
+ { 0x0a, -0x17},
+ { 0x0b, -0x16},
+ { 0x0b, -0x16},
+ { 0x0b, -0x16},
+ { 0x0c, -0x16},
+ { 0x0c, -0x15},
+ { 0x0d, -0x15},
+ { 0x0d, -0x15},
+ { 0x0d, -0x15},
+ { 0x0e, -0x15},
+ { 0x0e, -0x15},
+ { 0x0e, -0x14},
+ { 0x0e, -0x14},
+ { 0x0f, -0x14},
+ { 0x0f, -0x13},
+ { 0x10, -0x13},
+ { 0x10, -0x13},
+ { 0x10, -0x13},
+ { 0x10, -0x12},
+ { 0x10, -0x12},
+ { 0x11, -0x12},
+ { 0x11, -0x11},
+ { 0x11, -0x11},
+ { 0x12, -0x11},
+ { 0x12, -0x11},
+ { 0x12, -0x10},
+ { 0x12, -0x10},
+ { 0x13, -0x10},
+ { 0x13, -0x0f},
+ { 0x13, -0x0f},
+ { 0x14, -0x0f},
+ { 0x14, -0x0e},
+ { 0x14, -0x0e},
+ { 0x14, -0x0d},
+ { 0x14, -0x0d},
+ { 0x15, -0x0d},
+ { 0x15, -0x0d},
+ { 0x15, -0x0c},
+ { 0x16, -0x0c},
+ { 0x16, -0x0c},
+ { 0x16, -0x0b},
+ { 0x16, -0x0b},
+ { 0x16, -0x0a},
+ { 0x17, -0x0a},
+ { 0x17, -0x09},
+ { 0x17, -0x09},
+ { 0x17, -0x09},
+ { 0x17, -0x09},
+ { 0x17, -0x08},
+ { 0x17, -0x08},
+ { 0x17, -0x07},
+ { 0x17, -0x07},
+ { 0x17, -0x06},
+ { 0x18, -0x06},
+ { 0x18, -0x06},
+ { 0x19, -0x05},
+ { 0x19, -0x05},
+ { 0x18, -0x04},
+ { 0x19, -0x04},
+ { 0x18, -0x03},
+ { 0x19, -0x03},
+ { 0x19, -0x03},
+ { 0x19, -0x02},
+ { 0x19, -0x02},
+ { 0x18, -0x01},
+ { 0x19, -0x01},
+ { 0x18, 0x00},
+ { 0x18, 0x00},
+ { 0x18, 0x00},
+ { 0x18, 0x01},
+ { 0x18, 0x01},
+ { 0x19, 0x02},
+ { 0x18, 0x02},
+ { 0x19, 0x02},
+ { 0x18, 0x03},
+ { 0x18, 0x03},
+ { 0x19, 0x04},
+ { 0x18, 0x04},
+ { 0x18, 0x05},
+ { 0x18, 0x05},
+ { 0x18, 0x05},
+ { 0x18, 0x06},
+ { 0x17, 0x06},
+ { 0x17, 0x06},
+ { 0x17, 0x07},
+ { 0x17, 0x08},
+ { 0x17, 0x08},
+ { 0x17, 0x08},
+ { 0x17, 0x09},
+ { 0x17, 0x09},
+ { 0x17, 0x0a},
+ { 0x16, 0x0a},
+ { 0x16, 0x0a},
+ { 0x16, 0x0b},
+ { 0x16, 0x0b},
+ { 0x16, 0x0b},
+ { 0x16, 0x0c},
+ { 0x15, 0x0c},
+ { 0x15, 0x0c},
+ { 0x15, 0x0d},
+ { 0x14, 0x0d},
+ { 0x14, 0x0d},
+ { 0x13, 0x0d},
+ { 0x13, 0x0d},
+ { 0x13, 0x0e},
+ { 0x13, 0x0e},
+ { 0x13, 0x0f},
+ { 0x13, 0x0f},
+ { 0x12, 0x0f},
+ { 0x12, 0x10},
+ { 0x11, 0x10},
+ { 0x11, 0x10},
+ { 0x11, 0x11},
+ { 0x11, 0x11},
+ { 0x10, 0x11},
+ { 0x10, 0x12},
+ { 0x10, 0x12},
+ { 0x0f, 0x12},
+ { 0x0e, 0x12},
+ { 0x0f, 0x13},
+ { 0x0e, 0x13},
+ { 0x0e, 0x13},
+ { 0x0d, 0x13},
+ { 0x0d, 0x14},
+ { 0x0d, 0x14},
+ { 0x0d, 0x14},
+ { 0x0c, 0x14},
+ { 0x0c, 0x14},
+ { 0x0c, 0x15},
+ { 0x0b, 0x15},
+ { 0x0b, 0x15},
+ { 0x0b, 0x15},
+ { 0x0a, 0x15},
+ { 0x0a, 0x16},
+ { 0x0a, 0x16},
+ { 0x09, 0x16},
+ { 0x09, 0x16},
+ { 0x08, 0x16},
+ { 0x07, 0x16},
+ { 0x07, 0x17},
+ { 0x07, 0x17},
+ { 0x06, 0x17},
+ { 0x06, 0x17},
+ { 0x05, 0x17},
+ { 0x05, 0x17},
+ { 0x05, 0x18},
+ { 0x04, 0x18},
+ { 0x04, 0x18},
+ { 0x04, 0x18},
+ { 0x03, 0x18},
+ { 0x02, 0x18},
+ { 0x02, 0x18},
+ { 0x01, 0x18},
+ { 0x01, 0x18},
+ { 0x00, 0x18},
+ { 0x00, 0x18},
+ {-0x01, 0x17},
+ { 0x00, 0x18},
+ { 0x00, 0x18},
+ {-0x01, 0x18},
+ {-0x01, 0x18},
+ {-0x02, 0x18},
+ {-0x02, 0x18},
+ {-0x03, 0x18},
+ {-0x03, 0x18},
+ {-0x04, 0x18},
+ {-0x04, 0x18},
+ {-0x05, 0x18},
+ {-0x05, 0x17},
+ {-0x05, 0x17},
+ {-0x06, 0x17},
+ {-0x06, 0x17},
+ {-0x07, 0x17},
+ {-0x07, 0x17},
+ {-0x07, 0x17},
+ {-0x08, 0x17},
+ {-0x08, 0x16},
+ {-0x09, 0x16},
+ {-0x09, 0x16},
+ {-0x0a, 0x16},
+ {-0x0a, 0x16},
+ {-0x0a, 0x15},
+ {-0x0b, 0x15},
+ {-0x0b, 0x15},
+ {-0x0b, 0x15},
+ {-0x0b, 0x14},
+ {-0x0c, 0x14},
+ {-0x0c, 0x14},
+ {-0x0d, 0x14},
+ {-0x0d, 0x14},
+ {-0x0d, 0x13},
+ {-0x0e, 0x13},
+ {-0x0e, 0x13},
+ {-0x0e, 0x13},
+ {-0x0e, 0x12},
+ {-0x0f, 0x12},
+ {-0x0f, 0x12},
+ {-0x0f, 0x11},
+ {-0x10, 0x11},
+ {-0x10, 0x11},
+ {-0x11, 0x11},
+ {-0x11, 0x10},
+ {-0x11, 0x10},
+ {-0x12, 0x10},
+ {-0x11, 0x0f},
+ {-0x12, 0x0f},
+ {-0x12, 0x0f},
+ {-0x13, 0x0f},
+ {-0x13, 0x0e},
+ {-0x13, 0x0e},
+ {-0x13, 0x0d},
+ {-0x13, 0x0d},
+ {-0x14, 0x0d},
+ {-0x14, 0x0c},
+ {-0x14, 0x0c},
+ {-0x15, 0x0c},
+ {-0x15, 0x0c},
+ {-0x15, 0x0b},
+ {-0x15, 0x0b},
+ {-0x15, 0x0a},
+ {-0x15, 0x0a},
+ {-0x15, 0x09},
+ {-0x16, 0x09},
+ {-0x16, 0x09},
+ {-0x16, 0x08},
+ {-0x16, 0x08},
+ {-0x16, 0x07},
+ {-0x17, 0x07},
+ {-0x17, 0x07},
+ {-0x17, 0x06},
+ {-0x17, 0x06},
+ {-0x17, 0x05},
+ {-0x18, 0x05},
+ {-0x17, 0x04},
+ {-0x17, 0x04},
+ {-0x18, 0x04},
+ {-0x18, 0x04},
+ {-0x18, 0x03},
+ {-0x18, 0x03},
+ {-0x18, 0x02},
+ {-0x18, 0x02},
+ {-0x18, 0x01},
+ {-0x18, 0x01},
+ {-0x18, 0x01},
+ {-0x18, 0x00},
+ {-0x19, 0x00},
+ {-0x18, -0x01},
+ {-0x19, -0x01},
+ {-0x18, -0x01},
+ {-0x18, -0x02},
+ {-0x18, -0x02},
+ {-0x18, -0x03},
+ {-0x18, -0x03},
+ {-0x18, -0x04},
+ {-0x18, -0x04},
+ {-0x18, -0x04},
+ {-0x18, -0x05},
+ {-0x18, -0x05},
+ {-0x18, -0x06},
+ {-0x18, -0x06},
+ {-0x17, -0x06},
+ {-0x17, -0x07},
+ {-0x17, -0x07},
+ {-0x17, -0x08},
+ {-0x17, -0x08},
+ {-0x17, -0x09},
+ {-0x17, -0x09},
+ {-0x16, -0x09},
+ {-0x16, -0x09},
+ {-0x16, -0x0a},
+ {-0x16, -0x0a},
+ {-0x15, -0x0a},
+ {-0x15, -0x0b},
+ {-0x16, -0x0b},
+ {-0x16, -0x0c},
+ {-0x15, -0x0c},
+ {-0x15, -0x0d},
+ {-0x15, -0x0d},
+ {-0x14, -0x0d},
+ {-0x15, -0x0e},
+ {-0x14, -0x0e},
+ {-0x14, -0x0e},
+ {-0x13, -0x0e},
+ {-0x13, -0x0f},
+ {-0x13, -0x0f},
+ {-0x12, -0x10},
+ {-0x12, -0x10},
+ {-0x12, -0x10},
+ {-0x12, -0x11},
+ {-0x12, -0x11},
+ {-0x11, -0x11},
+ {-0x11, -0x12},
+ {-0x11, -0x12},
+ {-0x10, -0x12},
+ {-0x10, -0x12},
+ {-0x10, -0x13},
+ {-0x10, -0x13},
+ {-0x0f, -0x13},
+ {-0x0f, -0x13},
+ {-0x0f, -0x14},
+ {-0x0e, -0x14},
+ {-0x0e, -0x14},
+ {-0x0e, -0x15},
+ {-0x0d, -0x15},
+ {-0x0d, -0x15},
+ {-0x0d, -0x15},
+ {-0x0c, -0x15},
+ {-0x0c, -0x16},
+ {-0x0b, -0x16},
+ {-0x0b, -0x16},
+ {-0x0b, -0x16},
+ {-0x0a, -0x16},
+ {-0x0a, -0x16},
+ {-0x09, -0x16},
+ {-0x09, -0x17},
+ {-0x09, -0x17},
+ {-0x08, -0x17},
+ {-0x08, -0x17},
+ {-0x07, -0x17},
+ {-0x07, -0x17},
+ {-0x07, -0x18},
+ {-0x06, -0x18},
+ {-0x06, -0x18},
+ {-0x05, -0x18},
+ {-0x05, -0x18},
+ {-0x04, -0x18},
+ {-0x04, -0x18},
+ {-0x04, -0x18},
+ {-0x04, -0x19},
+ {-0x03, -0x19},
+ {-0x02, -0x19},
+ {-0x02, -0x18},
+ {-0x02, -0x18},
+ {-0x01, -0x19},
+ {-0x01, -0x19},
+ { 0x00, -0x19}
+};
+
+// text
+
+static void WallClockVblankCallback(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void LoadWallClockGraphics(void)
+{
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0x0000);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);
+ DmaClear32(3, (void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+ LZ77UnCompVram(gWallclock_Gfx, (void *)VRAM);
+ if (gSpecialVar_0x8004 == 0)
+ {
+ LoadPalette(gWallclockMale_Pal, 0x00, 0x20);
+ }
+ else
+ {
+ LoadPalette(gWallclockFemale_Pal, 0x00, 0x20);
+ }
+ LoadPalette(GetOverworldTextboxPalettePtr(), 0xe0, 0x20);
+ LoadPalette(sUnknown_085B21D4, 0xc0, 0x08);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_085B21FC, 3);
+ InitWindows(gUnknown_085B21DC);
+ DeactivateAllTextPrinters();
+ LoadUserWindowBorderGfx(0, 0x250, 0xd0);
+ clear_scheduled_bg_copies_to_vram();
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+ LoadCompressedObjectPic(&gUnknown_085B2208);
+ LoadSpritePalettes(gUnknown_085B2218);
+}
+
+static void WallClockInit(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetVBlankCallback(WallClockVblankCallback);
+ SetMainCallback2(WallClockMainCallback);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000);
+ SetGpuReg(REG_OFFSET_BLDY, 0x0000);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ ShowBg(0);
+ ShowBg(2);
+ ShowBg(3);
+}
+
+void Cb2_StartWallClock(void)
+{
+ u8 taskId;
+ u8 spriteId;
+
+ LoadWallClockGraphics();
+ LZ77UnCompVram(gUnknown_08DCC648, (u16 *)BG_SCREEN_ADDR(7));
+
+ taskId = CreateTask(Task_SetClock1, 0);
+ gTasks[taskId].tHours = 10;
+ gTasks[taskId].tMinutes = 0;
+ gTasks[taskId].tMvmtDir = 0;
+ gTasks[taskId].tPeriod = 0;
+ gTasks[taskId].tMvmtSpeed = 0;
+ gTasks[taskId].tMinuteHandAngle = 0;
+ gTasks[taskId].tHourHandAngle = 300;
+
+ spriteId = CreateSprite(&gUnknown_085B2250, 0x78, 0x50, 1);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
+ gSprites[spriteId].oam.matrixNum = 0;
+
+ spriteId = CreateSprite(&gUnknown_085B2268, 0x78, 0x50, 0);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
+ gSprites[spriteId].oam.matrixNum = 1;
+
+ spriteId = CreateSprite(&gUnknown_085B22A0, 0x78, 0x50, 2);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 45;
+
+ spriteId = CreateSprite(&gUnknown_085B22B8, 0x78, 0x50, 2);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 90;
+
+ WallClockInit();
+
+ PrintTextOnWindow(1, 1, gText_Confirm3, 0, 1, 0, NULL);
+ PutWindowTilemap(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+}
+
+void Cb2_ViewWallClock(void)
+{
+ u8 taskId;
+ u8 spriteId;
+ u8 angle1;
+ u8 angle2;
+
+ LoadWallClockGraphics();
+ LZ77UnCompVram(gUnknown_08DCC908, (u16 *)BG_SCREEN_ADDR(7));
+
+ taskId = CreateTask(Task_ViewClock1, 0);
+ InitClockWithRtc(taskId);
+ if (gTasks[taskId].tPeriod == 0)
+ {
+ angle1 = 45;
+ angle2 = 90;
+ }
+ else
+ {
+ angle1 = 90;
+ angle2 = 135;
+ }
+
+ spriteId = CreateSprite(&gUnknown_085B2250, 0x78, 0x50, 1);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
+ gSprites[spriteId].oam.matrixNum = 0;
+
+ spriteId = CreateSprite(&gUnknown_085B2268, 0x78, 0x50, 0);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
+ gSprites[spriteId].oam.matrixNum = 1;
+
+ spriteId = CreateSprite(&gUnknown_085B22A0, 0x78, 0x50, 2);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = angle1;
+
+ spriteId = CreateSprite(&gUnknown_085B22B8, 0x78, 0x50, 2);
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = angle2;
+
+ WallClockInit();
+
+ PrintTextOnWindow(1, 1, gText_Cancel4, 0, 1, 0, NULL);
+ PutWindowTilemap(1);
+ schedule_bg_copy_tilemap_to_vram(2);
+}
+
+static void WallClockMainCallback(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+static void Task_SetClock1(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].func = Task_SetClock2;
+ }
+}
+
+static void Task_SetClock2(u8 taskId)
+{
+ if (gTasks[taskId].tMinuteHandAngle % 6)
+ {
+ gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle(gTasks[taskId].tMinuteHandAngle, gTasks[taskId].tMvmtDir, gTasks[taskId].tMvmtSpeed);
+ }
+ else
+ {
+ 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;
+ }
+ else
+ {
+ gTasks[taskId].tMvmtDir = 0;
+ if (gMain.heldKeys & DPAD_LEFT)
+ {
+ gTasks[taskId].tMvmtDir = 1;
+ }
+ if (gMain.heldKeys & DPAD_RIGHT)
+ {
+ gTasks[taskId].tMvmtDir = 2;
+ }
+ if (gTasks[taskId].tMvmtDir != 0)
+ {
+ 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].tMvmtSpeed = 0;
+ }
+ }
+ }
+}
+
+static void Task_SetClock3(u8 taskId)
+{
+ SetWindowBorderStyle(0, FALSE, 0x250, 0x0d);
+ PrintTextOnWindow(0, 1, gText_IsThisTheCorrectTime, 0, 1, 0, NULL);
+ PutWindowTilemap(0);
+ schedule_bg_copy_tilemap_to_vram(0);
+ CreateYesNoMenu(&gUnknown_085B21F4, 0x250, 0x0d, 1);
+ gTasks[taskId].func = Task_SetClock4;
+}
+
+static void Task_SetClock4(u8 taskId)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = Task_SetClock5;
+ break;
+ case 1:
+ case -1:
+ PlaySE(SE_SELECT);
+ sub_8198070(0, FALSE);
+ ClearWindowTilemap(0);
+ gTasks[taskId].func = Task_SetClock2;
+ break;
+ }
+}
+
+static void Task_SetClock5(u8 taskId)
+{
+ RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = Task_SetClock6;
+}
+
+static void Task_SetClock6(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ SetMainCallback2(gMain.savedCallback);
+ }
+}
+
+static void Task_ViewClock1(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].func = Task_ViewClock2;
+ }
+}
+
+static void Task_ViewClock2(u8 taskId)
+{
+ InitClockWithRtc(taskId);
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ gTasks[taskId].func = Task_ViewClock3;
+ }
+}
+
+static void Task_ViewClock3(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = Task_ViewClock4;
+}
+
+static void Task_ViewClock4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(gMain.savedCallback);
+ }
+}
+
+static u8 CalcMinHandDelta(u16 a0)
+{
+ if (a0 > 60)
+ {
+ return 6;
+ }
+ if (a0 > 30)
+ {
+ return 3;
+ }
+ if (a0 > 10)
+ {
+ return 2;
+ }
+ return 1;
+}
+
+static u16 CalcNewMinHandAngle(u16 a0, u8 command, u8 a2)
+{
+ u8 r1 = CalcMinHandDelta(a2);
+ switch (command)
+ {
+ case 1:
+ if (a0) a0 -= r1;
+ else a0 = 360 - r1;
+ break;
+ case 2:
+ if (a0 < 360 - r1) a0 += r1;
+ else a0 = 0;
+ break;
+ }
+ return a0;
+}
+
+static bool32 AdvanceClock(u8 taskId, u8 command)
+{
+ switch (command)
+ {
+ case 1:
+ if (gTasks[taskId].tMinutes > 0)
+ {
+ gTasks[taskId].tMinutes--;
+ }
+ else
+ {
+ gTasks[taskId].tMinutes = 59;
+ if (gTasks[taskId].tHours > 0)
+ {
+ gTasks[taskId].tHours--;
+ }
+ else
+ {
+ gTasks[taskId].tHours = 23;
+ }
+ UpdateClockPeriod(taskId, command);
+ }
+ break;
+ case 2:
+ if (gTasks[taskId].tMinutes < 59)
+ {
+ gTasks[taskId].tMinutes++;
+ }
+ else
+ {
+ gTasks[taskId].tMinutes = 0;
+ if (gTasks[taskId].tHours < 23)
+ {
+ gTasks[taskId].tHours++;
+ }
+ else
+ {
+ gTasks[taskId].tHours = 0;
+ }
+ UpdateClockPeriod(taskId, command);
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static void UpdateClockPeriod(u8 taskId, u8 command)
+{
+ u8 hours = gTasks[taskId].tHours;
+ switch (command)
+ {
+ case 1:
+ switch (hours)
+ {
+ case 11:
+ gTasks[taskId].tPeriod = FALSE;
+ break;
+ case 23:
+ gTasks[taskId].tPeriod = TRUE;
+ break;
+ }
+ break;
+ case 2:
+ switch (hours)
+ {
+ case 0:
+ gTasks[taskId].tPeriod = FALSE;
+ break;
+ case 12:
+ gTasks[taskId].tPeriod = TRUE;
+ break;
+ }
+ break;
+ }
+}
+
+static void InitClockWithRtc(u8 taskId)
+{
+ RtcCalcLocalTime();
+ 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 < 12)
+ {
+ gTasks[taskId].tPeriod = FALSE;
+ }
+ else
+ {
+ gTasks[taskId].tPeriod = TRUE;
+ }
+}
+
+static void SpriteCB_MinuteHand(struct Sprite *sprite)
+{
+ u16 angle = gTasks[sprite->data[0]].tMinuteHandAngle;
+ s16 sin = Sin2(angle) / 16;
+ s16 cos = Cos2(angle) / 16;
+ u16 xhat;
+ u16 yhat;
+
+ SetOamMatrix(0, cos, sin, -sin, cos);
+ xhat = sClockHandCoords[angle][0];
+ yhat = sClockHandCoords[angle][1];
+
+ if (xhat > 0x80)
+ {
+ xhat |= 0xff00;
+ }
+ if (yhat > 0x80)
+ {
+ yhat |= 0xff00;
+ }
+ sprite->pos2.x = xhat;
+ sprite->pos2.y = yhat;
+}
+
+static void SpriteCB_HourHand(struct Sprite *sprite)
+{
+ u16 angle = gTasks[sprite->data[0]].tHourHandAngle;
+ s16 sin = Sin2(angle) / 16;
+ s16 cos = Cos2(angle) / 16;
+ u16 xhat;
+ u16 yhat;
+
+ SetOamMatrix(1, cos, sin, -sin, cos);
+ xhat = sClockHandCoords[angle][0];
+ yhat = sClockHandCoords[angle][1];
+ if (xhat > 0x80)
+ {
+ xhat |= 0xff00;
+ }
+ if (yhat > 0x80)
+ {
+ yhat |= 0xff00;
+ }
+ sprite->pos2.x = xhat;
+ sprite->pos2.y = yhat;
+}
+
+static void SpriteCB_AMIndicator(struct Sprite *sprite)
+{
+ if (gTasks[sprite->data[0]].tPeriod)
+ {
+ if (sprite->data[1] >= 60 && sprite->data[1] < 90)
+ {
+ sprite->data[1] += 5;
+ }
+ if (sprite->data[1] < 60)
+ {
+ sprite->data[1]++;
+ }
+ }
+ else
+ {
+ if (sprite->data[1] >= 46 && sprite->data[1] < 76)
+ {
+ sprite->data[1] -= 5;
+ }
+ if (sprite->data[1] > 75)
+ {
+ sprite->data[1]--;
+ }
+ }
+ sprite->pos2.x = Cos2(sprite->data[1]) * 30 / 0x1000;
+ sprite->pos2.y = Sin2(sprite->data[1]) * 30 / 0x1000;
+}
+
+static void SpriteCB_PMIndicator(struct Sprite *sprite)
+{
+ if (gTasks[sprite->data[0]].tPeriod)
+ {
+ if (sprite->data[1] >= 105 && sprite->data[1] < 135)
+ {
+ sprite->data[1] += 5;
+ }
+ if (sprite->data[1] < 105)
+ {
+ sprite->data[1]++;
+ }
+ }
+ else
+ {
+ if (sprite->data[1] >= 91 && sprite->data[1] < 121)
+ {
+ sprite->data[1] -= 5;
+ }
+ if (sprite->data[1] > 120)
+ {
+ sprite->data[1]--;
+ }
+ }
+ sprite->pos2.x = Cos2(sprite->data[1]) * 30 / 0x1000;
+ sprite->pos2.y = Sin2(sprite->data[1]) * 30 / 0x1000;
+}
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index ce1e02e5e..9a22323ff 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -1,33 +1,30 @@
#include "global.h"
#include "wild_encounter.h"
#include "pokemon.h"
-#include "species.h"
+#include "constants/species.h"
#include "metatile_behavior.h"
#include "fieldmap.h"
-#include "rng.h"
-#include "map_constants.h"
+#include "random.h"
+#include "constants/maps.h"
#include "field_player_avatar.h"
-#include "abilities.h"
+#include "constants/abilities.h"
#include "event_data.h"
#include "safari_zone.h"
+#include "overworld.h"
#include "pokeblock.h"
#include "battle_setup.h"
#include "roamer.h"
-#include "game_stat.h"
+#include "constants/game_stat.h"
#include "tv.h"
#include "link.h"
#include "script.h"
-#include "items.h"
+#include "constants/items.h"
+#include "constants/maps.h"
extern const u8 EventScript_RepelWoreOff[];
#define NUM_FEEBAS_SPOTS 6
-extern const u16 gRoute119WaterTileData[];
-extern const struct WildPokemonHeader gBattlePikeWildMonHeaders[];
-extern const struct WildPokemonHeader gBattlePyramidWildMonHeaders[];
-extern const struct WildPokemon gWildFeebasRoute119Data;
-
extern u8 GetBattlePikeWildMonHeaderId(void);
extern bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate);
extern void GenerateBattlePyramidWildMon(void);
@@ -43,9 +40,4564 @@ static void ApplyCleanseTagEncounterRateMod(u32 *encRate);
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex);
static bool8 IsAbilityAllowingEncounter(u8 level);
-EWRAM_DATA u8 sWildEncountersDisabled = 0;
-EWRAM_DATA u32 sFeebasRngValue = 0;
+// EWRAM vars
+EWRAM_DATA static u8 sWildEncountersDisabled = 0;
+EWRAM_DATA static u32 sFeebasRngValue = 0;
+
+// const rom data
+const struct WildPokemon gRoute101_LandMons[] =
+{
+ {2, 2, SPECIES_WURMPLE},
+ {2, 2, SPECIES_POOCHYENA},
+ {2, 2, SPECIES_WURMPLE},
+ {3, 3, SPECIES_WURMPLE},
+ {3, 3, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_WURMPLE},
+ {3, 3, SPECIES_POOCHYENA},
+ {2, 2, SPECIES_ZIGZAGOON},
+ {2, 2, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_ZIGZAGOON},
+};
+
+const struct WildPokemonInfo gRoute101_LandMonsInfo = {20, gRoute101_LandMons};
+
+const struct WildPokemon gRoute102_LandMons[] =
+{
+ {3, 3, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_WURMPLE},
+ {4, 4, SPECIES_POOCHYENA},
+ {4, 4, SPECIES_WURMPLE},
+ {3, 3, SPECIES_LOTAD},
+ {4, 4, SPECIES_LOTAD},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {4, 4, SPECIES_ZIGZAGOON},
+ {4, 4, SPECIES_RALTS},
+ {4, 4, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_SEEDOT},
+};
+
+const struct WildPokemonInfo gRoute102_LandMonsInfo = {20, gRoute102_LandMons};
+
+const struct WildPokemon gRoute102_WaterMons[] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_GOLDEEN},
+};
+
+const struct WildPokemonInfo gRoute102_WaterMonsInfo = {4, gRoute102_WaterMons};
+
+const struct WildPokemon gRoute102_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 gRoute102_FishingMonsInfo = {30, gRoute102_FishingMons};
+
+const struct WildPokemon gRoute103_LandMons[] =
+{
+ {2, 2, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+ {4, 4, SPECIES_POOCHYENA},
+ {2, 2, SPECIES_WINGULL},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {4, 4, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_WINGULL},
+ {3, 3, SPECIES_WINGULL},
+ {2, 2, SPECIES_WINGULL},
+ {4, 4, SPECIES_WINGULL},
+};
+
+const struct WildPokemonInfo gRoute103_LandMonsInfo = {20, gRoute103_LandMons};
+
+const struct WildPokemon gRoute103_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute103_WaterMonsInfo = {4, gRoute103_WaterMons};
+
+const struct WildPokemon gRoute103_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 gRoute103_FishingMonsInfo = {30, gRoute103_FishingMons};
+
+const struct WildPokemon gRoute104_LandMons[] =
+{
+ {4, 4, SPECIES_POOCHYENA},
+ {4, 4, SPECIES_WURMPLE},
+ {5, 5, SPECIES_POOCHYENA},
+ {5, 5, SPECIES_MARILL},
+ {4, 4, SPECIES_MARILL},
+ {5, 5, SPECIES_POOCHYENA},
+ {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 gRoute104_LandMonsInfo = {20, gRoute104_LandMons};
+
+const struct WildPokemon gRoute104_WaterMons[] =
+{
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute104_WaterMonsInfo = {4, gRoute104_WaterMons};
+
+const struct WildPokemon gRoute104_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 gRoute104_FishingMonsInfo = {30, gRoute104_FishingMons};
+
+const struct WildPokemon gRoute105_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute105_WaterMonsInfo = {4, gRoute105_WaterMons};
+
+const struct WildPokemon gRoute105_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 gRoute105_FishingMonsInfo = {30, gRoute105_FishingMons};
+
+const struct WildPokemon gRoute110_LandMons[] =
+{
+ {12, 12, SPECIES_POOCHYENA},
+ {12, 12, SPECIES_ELECTRIKE},
+ {12, 12, SPECIES_GULPIN},
+ {13, 13, SPECIES_ELECTRIKE},
+ {13, 13, SPECIES_MINUN},
+ {13, 13, SPECIES_ODDISH},
+ {13, 13, SPECIES_MINUN},
+ {13, 13, SPECIES_GULPIN},
+ {12, 12, SPECIES_WINGULL},
+ {12, 12, SPECIES_WINGULL},
+ {12, 12, SPECIES_PLUSLE},
+ {13, 13, SPECIES_PLUSLE},
+};
+
+const struct WildPokemonInfo gRoute110_LandMonsInfo = {20, gRoute110_LandMons};
+
+const struct WildPokemon gRoute110_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute110_WaterMonsInfo = {4, gRoute110_WaterMons};
+
+const struct WildPokemon gRoute110_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 gRoute110_FishingMonsInfo = {30, gRoute110_FishingMons};
+
+const struct WildPokemon gRoute111_LandMons[] =
+{
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {21, 21, SPECIES_SANDSHREW},
+ {21, 21, SPECIES_TRAPINCH},
+ {19, 19, SPECIES_BALTOY},
+ {21, 21, SPECIES_BALTOY},
+ {19, 19, SPECIES_SANDSHREW},
+ {19, 19, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_BALTOY},
+ {20, 20, SPECIES_CACNEA},
+ {22, 22, SPECIES_CACNEA},
+ {22, 22, SPECIES_CACNEA},
+};
+
+const struct WildPokemonInfo gRoute111_LandMonsInfo = {10, gRoute111_LandMons};
+
+const struct WildPokemon gRoute111_WaterMons[] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_GOLDEEN},
+};
+
+const struct WildPokemonInfo gRoute111_WaterMonsInfo = {4, gRoute111_WaterMons};
+
+const struct WildPokemon gRoute111_RockSmashMons[] =
+{
+ {10, 15, SPECIES_GEODUDE},
+ {5, 10, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+};
+
+const struct WildPokemonInfo gRoute111_RockSmashMonsInfo = {20, gRoute111_RockSmashMons};
+
+const struct WildPokemon gRoute111_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 gRoute111_FishingMonsInfo = {30, gRoute111_FishingMons};
+
+const struct WildPokemon gRoute112_LandMons[] =
+{
+ {15, 15, SPECIES_NUMEL},
+ {15, 15, SPECIES_NUMEL},
+ {15, 15, SPECIES_MARILL},
+ {14, 14, SPECIES_NUMEL},
+ {14, 14, SPECIES_NUMEL},
+ {14, 14, SPECIES_MARILL},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_MARILL},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_NUMEL},
+};
+
+const struct WildPokemonInfo gRoute112_LandMonsInfo = {20, gRoute112_LandMons};
+
+const struct WildPokemon gRoute113_LandMons[] =
+{
+ {15, 15, SPECIES_SPINDA},
+ {15, 15, SPECIES_SPINDA},
+ {15, 15, SPECIES_SLUGMA},
+ {14, 14, SPECIES_SPINDA},
+ {14, 14, SPECIES_SPINDA},
+ {14, 14, SPECIES_SLUGMA},
+ {16, 16, SPECIES_SPINDA},
+ {16, 16, SPECIES_SLUGMA},
+ {16, 16, SPECIES_SPINDA},
+ {16, 16, SPECIES_SKARMORY},
+ {16, 16, SPECIES_SPINDA},
+ {16, 16, SPECIES_SKARMORY},
+};
+
+const struct WildPokemonInfo gRoute113_LandMonsInfo = {20, gRoute113_LandMons};
+
+const struct WildPokemon gRoute114_LandMons[] =
+{
+ {16, 16, SPECIES_SWABLU},
+ {16, 16, SPECIES_LOTAD},
+ {17, 17, SPECIES_SWABLU},
+ {15, 15, SPECIES_SWABLU},
+ {15, 15, SPECIES_LOTAD},
+ {16, 16, SPECIES_LOMBRE},
+ {16, 16, SPECIES_LOMBRE},
+ {18, 18, SPECIES_LOMBRE},
+ {17, 17, SPECIES_SEVIPER},
+ {15, 15, SPECIES_SEVIPER},
+ {17, 17, SPECIES_SEVIPER},
+ {15, 15, SPECIES_NUZLEAF},
+};
+
+const struct WildPokemonInfo gRoute114_LandMonsInfo = {20, gRoute114_LandMons};
+
+const struct WildPokemon gRoute114_WaterMons[] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_GOLDEEN},
+};
+
+const struct WildPokemonInfo gRoute114_WaterMonsInfo = {4, gRoute114_WaterMons};
+
+const struct WildPokemon gRoute114_RockSmashMons[] =
+{
+ {10, 15, SPECIES_GEODUDE},
+ {5, 10, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+};
+
+const struct WildPokemonInfo gRoute114_RockSmashMonsInfo = {20, gRoute114_RockSmashMons};
+
+const struct WildPokemon gRoute114_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 gRoute114_FishingMonsInfo = {30, gRoute114_FishingMons};
+
+const struct WildPokemon gRoute116_LandMons[] =
+{
+ {6, 6, SPECIES_POOCHYENA},
+ {6, 6, SPECIES_WHISMUR},
+ {6, 6, SPECIES_NINCADA},
+ {7, 7, SPECIES_ABRA},
+ {7, 7, SPECIES_NINCADA},
+ {6, 6, SPECIES_TAILLOW},
+ {7, 7, SPECIES_TAILLOW},
+ {8, 8, SPECIES_TAILLOW},
+ {7, 7, SPECIES_POOCHYENA},
+ {8, 8, SPECIES_POOCHYENA},
+ {7, 7, SPECIES_SKITTY},
+ {8, 8, SPECIES_SKITTY},
+};
+
+const struct WildPokemonInfo gRoute116_LandMonsInfo = {20, gRoute116_LandMons};
+
+const struct WildPokemon gRoute117_LandMons[] =
+{
+ {13, 13, SPECIES_POOCHYENA},
+ {13, 13, SPECIES_ODDISH},
+ {14, 14, SPECIES_POOCHYENA},
+ {14, 14, SPECIES_ODDISH},
+ {13, 13, SPECIES_MARILL},
+ {13, 13, SPECIES_ODDISH},
+ {13, 13, SPECIES_ILLUMISE},
+ {13, 13, SPECIES_ILLUMISE},
+ {14, 14, SPECIES_ILLUMISE},
+ {14, 14, SPECIES_ILLUMISE},
+ {13, 13, SPECIES_VOLBEAT},
+ {13, 13, SPECIES_SEEDOT},
+};
+
+const struct WildPokemonInfo gRoute117_LandMonsInfo = {20, gRoute117_LandMons};
+
+const struct WildPokemon gRoute117_WaterMons[] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_GOLDEEN},
+};
+
+const struct WildPokemonInfo gRoute117_WaterMonsInfo = {4, gRoute117_WaterMons};
+
+const struct WildPokemon gRoute117_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 gRoute117_FishingMonsInfo = {30, gRoute117_FishingMons};
+
+const struct WildPokemon gRoute118_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 gRoute118_LandMonsInfo = {20, gRoute118_LandMons};
+
+const struct WildPokemon gRoute118_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute118_WaterMonsInfo = {4, gRoute118_WaterMons};
+
+const struct WildPokemon gRoute118_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 gRoute118_FishingMonsInfo = {30, gRoute118_FishingMons};
+
+const struct WildPokemon gRoute124_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute124_WaterMonsInfo = {4, gRoute124_WaterMons};
+
+const struct WildPokemon gRoute124_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 gRoute124_FishingMonsInfo = {30, gRoute124_FishingMons};
+
+const struct WildPokemon gPetalburgWoods_LandMons[] =
+{
+ {5, 5, SPECIES_POOCHYENA},
+ {5, 5, SPECIES_WURMPLE},
+ {5, 5, SPECIES_SHROOMISH},
+ {6, 6, SPECIES_POOCHYENA},
+ {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 gPetalburgWoods_LandMonsInfo = {20, gPetalburgWoods_LandMons};
+
+const struct WildPokemon gRusturfTunnel_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 gRusturfTunnel_LandMonsInfo = {10, gRusturfTunnel_LandMons};
+
+const struct WildPokemon gGraniteCave_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 gGraniteCave_1F_LandMonsInfo = {10, gGraniteCave_1F_LandMons};
+
+const struct WildPokemon gGraniteCave_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},
+ {10, 10, SPECIES_SABLEYE},
+ {10, 10, SPECIES_SABLEYE},
+ {9, 9, SPECIES_SABLEYE},
+ {11, 11, SPECIES_SABLEYE},
+};
+
+const struct WildPokemonInfo gGraniteCave_B1F_LandMonsInfo = {10, gGraniteCave_B1F_LandMons};
+
+const struct WildPokemon gMtPyre_1F_LandMons[] =
+{
+ {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},
+};
+
+const struct WildPokemonInfo gMtPyre_1F_LandMonsInfo = {10, gMtPyre_1F_LandMons};
+
+const struct WildPokemon gVictoryRoad_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 gVictoryRoad_1F_LandMonsInfo = {10, gVictoryRoad_1F_LandMons};
+
+const struct WildPokemon gSafariZone_South_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 gSafariZone_South_LandMonsInfo = {25, gSafariZone_South_LandMons};
+
+const struct WildPokemon gUnderwater2_WaterMons[] =
+{
+ {20, 30, SPECIES_CLAMPERL},
+ {20, 30, SPECIES_CHINCHOU},
+ {30, 35, SPECIES_CLAMPERL},
+ {30, 35, SPECIES_RELICANTH},
+ {30, 35, SPECIES_RELICANTH},
+};
+
+const struct WildPokemonInfo gUnderwater2_WaterMonsInfo = {4, gUnderwater2_WaterMons};
+
+const struct WildPokemon gAbandonedShip_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 gAbandonedShip_Rooms_B1F_WaterMonsInfo = {4, gAbandonedShip_Rooms_B1F_WaterMons};
+
+const struct WildPokemon gAbandonedShip_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 gAbandonedShip_Rooms_B1F_FishingMonsInfo = {20, gAbandonedShip_Rooms_B1F_FishingMons};
+
+const struct WildPokemon gGraniteCave_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},
+ {10, 10, SPECIES_SABLEYE},
+ {11, 11, SPECIES_SABLEYE},
+ {12, 12, SPECIES_SABLEYE},
+ {10, 10, SPECIES_SABLEYE},
+ {12, 12, SPECIES_SABLEYE},
+ {10, 10, SPECIES_SABLEYE},
+};
+
+const struct WildPokemonInfo gGraniteCave_B2F_LandMonsInfo = {10, gGraniteCave_B2F_LandMons};
+
+const struct WildPokemon gGraniteCave_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 gGraniteCave_B2F_RockSmashMonsInfo = {20, gGraniteCave_B2F_RockSmashMons};
+
+const struct WildPokemon gFieryPath_LandMons[] =
+{
+ {15, 15, SPECIES_NUMEL},
+ {15, 15, SPECIES_KOFFING},
+ {16, 16, SPECIES_NUMEL},
+ {15, 15, SPECIES_MACHOP},
+ {15, 15, SPECIES_TORKOAL},
+ {15, 15, SPECIES_SLUGMA},
+ {16, 16, SPECIES_KOFFING},
+ {16, 16, SPECIES_MACHOP},
+ {14, 14, SPECIES_TORKOAL},
+ {16, 16, SPECIES_TORKOAL},
+ {14, 14, SPECIES_GRIMER},
+ {14, 14, SPECIES_GRIMER},
+};
+
+const struct WildPokemonInfo gFieryPath_LandMonsInfo = {10, gFieryPath_LandMons};
+
+const struct WildPokemon gMeteorFalls_B1F_2R_LandMons[] =
+{
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {30, 30, SPECIES_BAGON},
+ {35, 35, SPECIES_SOLROCK},
+ {35, 35, SPECIES_BAGON},
+ {37, 37, SPECIES_SOLROCK},
+ {25, 25, SPECIES_BAGON},
+ {39, 39, SPECIES_SOLROCK},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+};
+
+const struct WildPokemonInfo gMeteorFalls_B1F_2R_LandMonsInfo = {10, gMeteorFalls_B1F_2R_LandMons};
+
+const struct WildPokemon gMeteorFalls_B1F_2R_WaterMons[] =
+{
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+};
+
+const struct WildPokemonInfo gMeteorFalls_B1F_2R_WaterMonsInfo = {4, gMeteorFalls_B1F_2R_WaterMons};
+
+const struct WildPokemon gMeteorFalls_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 gMeteorFalls_B1F_2R_FishingMonsInfo = {30, gMeteorFalls_B1F_2R_FishingMons};
+
+const struct WildPokemon gJaggedPass_LandMons[] =
+{
+ {21, 21, SPECIES_NUMEL},
+ {21, 21, SPECIES_NUMEL},
+ {21, 21, SPECIES_MACHOP},
+ {20, 20, SPECIES_NUMEL},
+ {20, 20, SPECIES_SPOINK},
+ {20, 20, SPECIES_MACHOP},
+ {21, 21, SPECIES_SPOINK},
+ {22, 22, SPECIES_MACHOP},
+ {22, 22, SPECIES_NUMEL},
+ {22, 22, SPECIES_SPOINK},
+ {22, 22, SPECIES_NUMEL},
+ {22, 22, SPECIES_SPOINK},
+};
+
+const struct WildPokemonInfo gJaggedPass_LandMonsInfo = {20, gJaggedPass_LandMons};
+
+const struct WildPokemon gRoute106_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute106_WaterMonsInfo = {4, gRoute106_WaterMons};
+
+const struct WildPokemon gRoute106_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 gRoute106_FishingMonsInfo = {30, gRoute106_FishingMons};
+
+const struct WildPokemon gRoute107_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute107_WaterMonsInfo = {4, gRoute107_WaterMons};
+
+const struct WildPokemon gRoute107_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 gRoute107_FishingMonsInfo = {30, gRoute107_FishingMons};
+
+const struct WildPokemon gRoute108_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute108_WaterMonsInfo = {4, gRoute108_WaterMons};
+
+const struct WildPokemon gRoute108_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 gRoute108_FishingMonsInfo = {30, gRoute108_FishingMons};
+
+const struct WildPokemon gRoute109_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute109_WaterMonsInfo = {4, gRoute109_WaterMons};
+
+const struct WildPokemon gRoute109_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 gRoute109_FishingMonsInfo = {30, gRoute109_FishingMons};
+
+const struct WildPokemon gRoute115_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 gRoute115_LandMonsInfo = {20, gRoute115_LandMons};
+
+const struct WildPokemon gRoute115_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute115_WaterMonsInfo = {4, gRoute115_WaterMons};
+
+const struct WildPokemon gRoute115_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 gRoute115_FishingMonsInfo = {30, gRoute115_FishingMons};
+
+const struct WildPokemon gNewMauville_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 gNewMauville_Inside_LandMonsInfo = {10, gNewMauville_Inside_LandMons};
+
+const struct WildPokemon gRoute119_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 gRoute119_LandMonsInfo = {15, gRoute119_LandMons};
+
+const struct WildPokemon gRoute119_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute119_WaterMonsInfo = {4, gRoute119_WaterMons};
+
+const struct WildPokemon gRoute119_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 gRoute119_FishingMonsInfo = {30, gRoute119_FishingMons};
+
+const struct WildPokemon gRoute120_LandMons[] =
+{
+ {25, 25, SPECIES_POOCHYENA},
+ {25, 25, SPECIES_MIGHTYENA},
+ {27, 27, SPECIES_MIGHTYENA},
+ {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_SEEDOT},
+};
+
+const struct WildPokemonInfo gRoute120_LandMonsInfo = {20, gRoute120_LandMons};
+
+const struct WildPokemon gRoute120_WaterMons[] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_GOLDEEN},
+};
+
+const struct WildPokemonInfo gRoute120_WaterMonsInfo = {4, gRoute120_WaterMons};
+
+const struct WildPokemon gRoute120_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 gRoute120_FishingMonsInfo = {30, gRoute120_FishingMons};
+
+const struct WildPokemon gRoute121_LandMons[] =
+{
+ {26, 26, SPECIES_POOCHYENA},
+ {26, 26, SPECIES_SHUPPET},
+ {26, 26, SPECIES_MIGHTYENA},
+ {28, 28, SPECIES_SHUPPET},
+ {28, 28, SPECIES_MIGHTYENA},
+ {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 gRoute121_LandMonsInfo = {20, gRoute121_LandMons};
+
+const struct WildPokemon gRoute121_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute121_WaterMonsInfo = {4, gRoute121_WaterMons};
+
+const struct WildPokemon gRoute121_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 gRoute121_FishingMonsInfo = {30, gRoute121_FishingMons};
+
+const struct WildPokemon gRoute122_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute122_WaterMonsInfo = {4, gRoute122_WaterMons};
+
+const struct WildPokemon gRoute122_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 gRoute122_FishingMonsInfo = {30, gRoute122_FishingMons};
+
+const struct WildPokemon gRoute123_LandMons[] =
+{
+ {26, 26, SPECIES_POOCHYENA},
+ {26, 26, SPECIES_SHUPPET},
+ {26, 26, SPECIES_MIGHTYENA},
+ {28, 28, SPECIES_SHUPPET},
+ {28, 28, SPECIES_MIGHTYENA},
+ {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 gRoute123_LandMonsInfo = {20, gRoute123_LandMons};
+
+const struct WildPokemon gRoute123_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute123_WaterMonsInfo = {4, gRoute123_WaterMons};
+
+const struct WildPokemon gRoute123_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 gRoute123_FishingMonsInfo = {30, gRoute123_FishingMons};
+
+const struct WildPokemon gMtPyre_2F_LandMons[] =
+{
+ {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},
+};
+
+const struct WildPokemonInfo gMtPyre_2F_LandMonsInfo = {10, gMtPyre_2F_LandMons};
+
+const struct WildPokemon gMtPyre_3F_LandMons[] =
+{
+ {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},
+};
+
+const struct WildPokemonInfo gMtPyre_3F_LandMonsInfo = {10, gMtPyre_3F_LandMons};
+
+const struct WildPokemon gMtPyre_4F_LandMons[] =
+{
+ {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},
+};
+
+const struct WildPokemonInfo gMtPyre_4F_LandMonsInfo = {10, gMtPyre_4F_LandMons};
+
+const struct WildPokemon gMtPyre_5F_LandMons[] =
+{
+ {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},
+};
+
+const struct WildPokemonInfo gMtPyre_5F_LandMonsInfo = {10, gMtPyre_5F_LandMons};
+
+const struct WildPokemon gMtPyre_6F_LandMons[] =
+{
+ {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},
+};
+
+const struct WildPokemonInfo gMtPyre_6F_LandMonsInfo = {10, gMtPyre_6F_LandMons};
+
+const struct WildPokemon gMtPyre_Exterior_LandMons[] =
+{
+ {27, 27, SPECIES_SHUPPET},
+ {27, 27, SPECIES_SHUPPET},
+ {28, 28, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {29, 29, SPECIES_VULPIX},
+ {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 gMtPyre_Exterior_LandMonsInfo = {10, gMtPyre_Exterior_LandMons};
+
+const struct WildPokemon gMtPyre_Summit_LandMons[] =
+{
+ {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},
+ {28, 28, SPECIES_CHIMECHO},
+ {28, 28, SPECIES_CHIMECHO},
+};
+
+const struct WildPokemonInfo gMtPyre_Summit_LandMonsInfo = {10, gMtPyre_Summit_LandMons};
+
+const struct WildPokemon gGraniteCave_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 gGraniteCave_StevensRoom_LandMonsInfo = {10, gGraniteCave_StevensRoom_LandMons};
+
+const struct WildPokemon gRoute125_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute125_WaterMonsInfo = {4, gRoute125_WaterMons};
+
+const struct WildPokemon gRoute125_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 gRoute125_FishingMonsInfo = {30, gRoute125_FishingMons};
+
+const struct WildPokemon gRoute126_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute126_WaterMonsInfo = {4, gRoute126_WaterMons};
+
+const struct WildPokemon gRoute126_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 gRoute126_FishingMonsInfo = {30, gRoute126_FishingMons};
+
+const struct WildPokemon gRoute127_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute127_WaterMonsInfo = {4, gRoute127_WaterMons};
+
+const struct WildPokemon gRoute127_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 gRoute127_FishingMonsInfo = {30, gRoute127_FishingMons};
+
+const struct WildPokemon gRoute128_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute128_WaterMonsInfo = {4, gRoute128_WaterMons};
+
+const struct WildPokemon gRoute128_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 gRoute128_FishingMonsInfo = {30, gRoute128_FishingMons};
+
+const struct WildPokemon gRoute129_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_WAILORD},
+};
+
+const struct WildPokemonInfo gRoute129_WaterMonsInfo = {4, gRoute129_WaterMons};
+
+const struct WildPokemon gRoute129_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 gRoute129_FishingMonsInfo = {30, gRoute129_FishingMons};
+
+const struct WildPokemon gRoute130_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 gRoute130_LandMonsInfo = {20, gRoute130_LandMons};
+
+const struct WildPokemon gRoute130_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute130_WaterMonsInfo = {4, gRoute130_WaterMons};
+
+const struct WildPokemon gRoute130_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 gRoute130_FishingMonsInfo = {30, gRoute130_FishingMons};
+
+const struct WildPokemon gRoute131_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute131_WaterMonsInfo = {4, gRoute131_WaterMons};
+
+const struct WildPokemon gRoute131_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 gRoute131_FishingMonsInfo = {30, gRoute131_FishingMons};
+
+const struct WildPokemon gRoute132_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute132_WaterMonsInfo = {4, gRoute132_WaterMons};
+
+const struct WildPokemon gRoute132_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 gRoute132_FishingMonsInfo = {30, gRoute132_FishingMons};
+
+const struct WildPokemon gRoute133_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute133_WaterMonsInfo = {4, gRoute133_WaterMons};
+
+const struct WildPokemon gRoute133_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 gRoute133_FishingMonsInfo = {30, gRoute133_FishingMons};
+
+const struct WildPokemon gRoute134_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gRoute134_WaterMonsInfo = {4, gRoute134_WaterMons};
+
+const struct WildPokemon gRoute134_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 gRoute134_FishingMonsInfo = {30, gRoute134_FishingMons};
+
+const struct WildPokemon gAbandonedShip_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 gAbandonedShip_HiddenFloorCorridors_WaterMonsInfo = {4, gAbandonedShip_HiddenFloorCorridors_WaterMons};
+
+const struct WildPokemon gAbandonedShip_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 gAbandonedShip_HiddenFloorCorridors_FishingMonsInfo = {20, gAbandonedShip_HiddenFloorCorridors_FishingMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room1_LandMonsInfo = {4, gSeafloorCavern_Room1_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room2_LandMonsInfo = {4, gSeafloorCavern_Room2_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room3_LandMonsInfo = {4, gSeafloorCavern_Room3_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room4_LandMonsInfo = {4, gSeafloorCavern_Room4_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room5_LandMonsInfo = {4, gSeafloorCavern_Room5_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room6_LandMonsInfo = {4, gSeafloorCavern_Room6_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room6_WaterMonsInfo = {4, gSeafloorCavern_Room6_WaterMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room6_FishingMonsInfo = {10, gSeafloorCavern_Room6_FishingMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room7_LandMonsInfo = {4, gSeafloorCavern_Room7_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room7_WaterMonsInfo = {4, gSeafloorCavern_Room7_WaterMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room7_FishingMonsInfo = {10, gSeafloorCavern_Room7_FishingMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Room8_LandMonsInfo = {4, gSeafloorCavern_Room8_LandMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Entrance_WaterMonsInfo = {4, gSeafloorCavern_Entrance_WaterMons};
+
+const struct WildPokemon gSeafloorCavern_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 gSeafloorCavern_Entrance_FishingMonsInfo = {10, gSeafloorCavern_Entrance_FishingMons};
+
+const struct WildPokemon gCaveOfOrigin_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 gCaveOfOrigin_Entrance_LandMonsInfo = {4, gCaveOfOrigin_Entrance_LandMons};
+
+const struct WildPokemon gCaveOfOrigin_1F_LandMons[] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+ {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 gCaveOfOrigin_1F_LandMonsInfo = {4, gCaveOfOrigin_1F_LandMons};
+
+const struct WildPokemon gCaveOfOrigin_UnusedRubySapphireMap1_LandMons[] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+ {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 gCaveOfOrigin_UnusedRubySapphireMap1_LandMonsInfo = {4, gCaveOfOrigin_UnusedRubySapphireMap1_LandMons};
+
+const struct WildPokemon gCaveOfOrigin_UnusedRubySapphireMap2_LandMons[] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+ {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 gCaveOfOrigin_UnusedRubySapphireMap2_LandMonsInfo = {4, gCaveOfOrigin_UnusedRubySapphireMap2_LandMons};
+
+const struct WildPokemon gCaveOfOrigin_UnusedRubySapphireMap3_LandMons[] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+ {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 gCaveOfOrigin_UnusedRubySapphireMap3_LandMonsInfo = {4, gCaveOfOrigin_UnusedRubySapphireMap3_LandMons};
+
+const struct WildPokemon gNewMauville_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 gNewMauville_Entrance_LandMonsInfo = {10, gNewMauville_Entrance_LandMons};
+
+const struct WildPokemon gSafariZone_Southwest_LandMons[] =
+{
+ {25, 25, SPECIES_ODDISH},
+ {27, 27, SPECIES_ODDISH},
+ {25, 25, SPECIES_GIRAFARIG},
+ {27, 27, SPECIES_GIRAFARIG},
+ {25, 25, SPECIES_NATU},
+ {27, 27, 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 gSafariZone_Southwest_LandMonsInfo = {25, gSafariZone_Southwest_LandMons};
+
+const struct WildPokemon gSafariZone_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 gSafariZone_Southwest_WaterMonsInfo = {9, gSafariZone_Southwest_WaterMons};
+
+const struct WildPokemon gSafariZone_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 gSafariZone_Southwest_FishingMonsInfo = {35, gSafariZone_Southwest_FishingMons};
+
+const struct WildPokemon gSafariZone_North_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 gSafariZone_North_LandMonsInfo = {25, gSafariZone_North_LandMons};
+
+const struct WildPokemon gSafariZone_North_RockSmashMons[] =
+{
+ {10, 15, SPECIES_GEODUDE},
+ {5, 10, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {20, 25, SPECIES_GEODUDE},
+ {25, 30, SPECIES_GEODUDE},
+};
+
+const struct WildPokemonInfo gSafariZone_North_RockSmashMonsInfo = {25, gSafariZone_North_RockSmashMons};
+
+const struct WildPokemon gSafariZone_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 gSafariZone_Northwest_LandMonsInfo = {25, gSafariZone_Northwest_LandMons};
+
+const struct WildPokemon gSafariZone_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 gSafariZone_Northwest_WaterMonsInfo = {9, gSafariZone_Northwest_WaterMons};
+
+const struct WildPokemon gSafariZone_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 gSafariZone_Northwest_FishingMonsInfo = {35, gSafariZone_Northwest_FishingMons};
+
+const struct WildPokemon gVictoryRoad_B1F_LandMons[] =
+{
+ {40, 40, SPECIES_GOLBAT},
+ {40, 40, SPECIES_HARIYAMA},
+ {40, 40, SPECIES_LAIRON},
+ {40, 40, SPECIES_LAIRON},
+ {38, 38, SPECIES_GOLBAT},
+ {38, 38, SPECIES_HARIYAMA},
+ {42, 42, SPECIES_GOLBAT},
+ {42, 42, SPECIES_HARIYAMA},
+ {42, 42, SPECIES_LAIRON},
+ {38, 38, SPECIES_MAWILE},
+ {42, 42, SPECIES_LAIRON},
+ {38, 38, SPECIES_MAWILE},
+};
+
+const struct WildPokemonInfo gVictoryRoad_B1F_LandMonsInfo = {10, gVictoryRoad_B1F_LandMons};
+
+const struct WildPokemon gVictoryRoad_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 gVictoryRoad_B1F_RockSmashMonsInfo = {20, gVictoryRoad_B1F_RockSmashMons};
+
+const struct WildPokemon gVictoryRoad_B2F_LandMons[] =
+{
+ {40, 40, SPECIES_GOLBAT},
+ {40, 40, SPECIES_SABLEYE},
+ {40, 40, SPECIES_LAIRON},
+ {40, 40, SPECIES_LAIRON},
+ {42, 42, SPECIES_GOLBAT},
+ {42, 42, SPECIES_SABLEYE},
+ {44, 44, SPECIES_GOLBAT},
+ {44, 44, SPECIES_SABLEYE},
+ {42, 42, SPECIES_LAIRON},
+ {42, 42, SPECIES_MAWILE},
+ {44, 44, SPECIES_LAIRON},
+ {44, 44, SPECIES_MAWILE},
+};
+
+const struct WildPokemonInfo gVictoryRoad_B2F_LandMonsInfo = {10, gVictoryRoad_B2F_LandMons};
+
+const struct WildPokemon gVictoryRoad_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 gVictoryRoad_B2F_WaterMonsInfo = {4, gVictoryRoad_B2F_WaterMons};
+
+const struct WildPokemon gVictoryRoad_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 gVictoryRoad_B2F_FishingMonsInfo = {30, gVictoryRoad_B2F_FishingMons};
+
+const struct WildPokemon gMeteorFalls_1F_1R_LandMons[] =
+{
+ {16, 16, SPECIES_ZUBAT},
+ {17, 17, SPECIES_ZUBAT},
+ {18, 18, SPECIES_ZUBAT},
+ {15, 15, SPECIES_ZUBAT},
+ {14, 14, SPECIES_ZUBAT},
+ {16, 16, SPECIES_SOLROCK},
+ {18, 18, SPECIES_SOLROCK},
+ {14, 14, SPECIES_SOLROCK},
+ {19, 19, SPECIES_ZUBAT},
+ {20, 20, SPECIES_ZUBAT},
+ {19, 19, SPECIES_ZUBAT},
+ {20, 20, SPECIES_ZUBAT},
+};
+
+const struct WildPokemonInfo gMeteorFalls_1F_1R_LandMonsInfo = {10, gMeteorFalls_1F_1R_LandMons};
+
+const struct WildPokemon gMeteorFalls_1F_1R_WaterMons[] =
+{
+ {5, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_ZUBAT},
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+};
+
+const struct WildPokemonInfo gMeteorFalls_1F_1R_WaterMonsInfo = {4, gMeteorFalls_1F_1R_WaterMons};
+
+const struct WildPokemon gMeteorFalls_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 gMeteorFalls_1F_1R_FishingMonsInfo = {30, gMeteorFalls_1F_1R_FishingMons};
+
+const struct WildPokemon gMeteorFalls_1F_2R_LandMons[] =
+{
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_SOLROCK},
+ {33, 33, SPECIES_SOLROCK},
+ {37, 37, SPECIES_SOLROCK},
+ {35, 35, SPECIES_GOLBAT},
+ {39, 39, SPECIES_SOLROCK},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+};
+
+const struct WildPokemonInfo gMeteorFalls_1F_2R_LandMonsInfo = {10, gMeteorFalls_1F_2R_LandMons};
+
+const struct WildPokemon gMeteorFalls_1F_2R_WaterMons[] =
+{
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+};
+
+const struct WildPokemonInfo gMeteorFalls_1F_2R_WaterMonsInfo = {4, gMeteorFalls_1F_2R_WaterMons};
+
+const struct WildPokemon gMeteorFalls_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 gMeteorFalls_1F_2R_FishingMonsInfo = {30, gMeteorFalls_1F_2R_FishingMons};
+
+const struct WildPokemon gMeteorFalls_B1F_1R_LandMons[] =
+{
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_SOLROCK},
+ {33, 33, SPECIES_SOLROCK},
+ {37, 37, SPECIES_SOLROCK},
+ {35, 35, SPECIES_GOLBAT},
+ {39, 39, SPECIES_SOLROCK},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+};
+
+const struct WildPokemonInfo gMeteorFalls_B1F_1R_LandMonsInfo = {10, gMeteorFalls_B1F_1R_LandMons};
+
+const struct WildPokemon gMeteorFalls_B1F_1R_WaterMons[] =
+{
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+};
+
+const struct WildPokemonInfo gMeteorFalls_B1F_1R_WaterMonsInfo = {4, gMeteorFalls_B1F_1R_WaterMons};
+
+const struct WildPokemon gMeteorFalls_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 gMeteorFalls_B1F_1R_FishingMonsInfo = {30, gMeteorFalls_B1F_1R_FishingMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideStairsRoom_LandMonsInfo = {10, gShoalCave_LowTideStairsRoom_LandMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideLowerRoom_LandMonsInfo = {10, gShoalCave_LowTideLowerRoom_LandMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideInnerRoom_LandMonsInfo = {10, gShoalCave_LowTideInnerRoom_LandMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideInnerRoom_WaterMonsInfo = {4, gShoalCave_LowTideInnerRoom_WaterMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideInnerRoom_FishingMonsInfo = {10, gShoalCave_LowTideInnerRoom_FishingMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideEntranceRoom_LandMonsInfo = {10, gShoalCave_LowTideEntranceRoom_LandMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideEntranceRoom_WaterMonsInfo = {4, gShoalCave_LowTideEntranceRoom_WaterMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideEntranceRoom_FishingMonsInfo = {10, gShoalCave_LowTideEntranceRoom_FishingMons};
+
+const struct WildPokemon gLilycoveCity_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gLilycoveCity_WaterMonsInfo = {4, gLilycoveCity_WaterMons};
+
+const struct WildPokemon gLilycoveCity_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 gLilycoveCity_FishingMonsInfo = {10, gLilycoveCity_FishingMons};
+
+const struct WildPokemon gDewfordTown_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gDewfordTown_WaterMonsInfo = {4, gDewfordTown_WaterMons};
+
+const struct WildPokemon gDewfordTown_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 gDewfordTown_FishingMonsInfo = {10, gDewfordTown_FishingMons};
+
+const struct WildPokemon gSlateportCity_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gSlateportCity_WaterMonsInfo = {4, gSlateportCity_WaterMons};
+
+const struct WildPokemon gSlateportCity_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 gSlateportCity_FishingMonsInfo = {10, gSlateportCity_FishingMons};
+
+const struct WildPokemon gMossdeepCity_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gMossdeepCity_WaterMonsInfo = {4, gMossdeepCity_WaterMons};
+
+const struct WildPokemon gMossdeepCity_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 gMossdeepCity_FishingMonsInfo = {10, gMossdeepCity_FishingMons};
+
+const struct WildPokemon gPacifidlogTown_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gPacifidlogTown_WaterMonsInfo = {4, gPacifidlogTown_WaterMons};
+
+const struct WildPokemon gPacifidlogTown_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 gPacifidlogTown_FishingMonsInfo = {10, gPacifidlogTown_FishingMons};
+
+const struct WildPokemon gEverGrandeCity_WaterMons[] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+
+const struct WildPokemonInfo gEverGrandeCity_WaterMonsInfo = {4, gEverGrandeCity_WaterMons};
+
+const struct WildPokemon gEverGrandeCity_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 gEverGrandeCity_FishingMonsInfo = {10, gEverGrandeCity_FishingMons};
+
+const struct WildPokemon gPetalburgCity_WaterMons[] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+};
+
+const struct WildPokemonInfo gPetalburgCity_WaterMonsInfo = {1, gPetalburgCity_WaterMons};
+
+const struct WildPokemon gPetalburgCity_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 gPetalburgCity_FishingMonsInfo = {10, gPetalburgCity_FishingMons};
+
+const struct WildPokemon gUnderwater1_WaterMons[] =
+{
+ {20, 30, SPECIES_CLAMPERL},
+ {20, 30, SPECIES_CHINCHOU},
+ {30, 35, SPECIES_CLAMPERL},
+ {30, 35, SPECIES_RELICANTH},
+ {30, 35, SPECIES_RELICANTH},
+};
+
+const struct WildPokemonInfo gUnderwater1_WaterMonsInfo = {4, gUnderwater1_WaterMons};
+
+const struct WildPokemon gShoalCave_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 gShoalCave_LowTideIceRoom_LandMonsInfo = {10, gShoalCave_LowTideIceRoom_LandMons};
+
+const struct WildPokemon gSkyPillar_1F_LandMons[] =
+{
+ {33, 33, SPECIES_SABLEYE},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {34, 34, SPECIES_SABLEYE},
+ {36, 36, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_BANETTE},
+ {38, 38, SPECIES_BANETTE},
+ {36, 36, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_CLAYDOL},
+ {38, 38, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_CLAYDOL},
+ {38, 38, SPECIES_CLAYDOL},
+};
+
+const struct WildPokemonInfo gSkyPillar_1F_LandMonsInfo = {10, gSkyPillar_1F_LandMons};
+
+const struct WildPokemon gSootopolisCity_WaterMons[] =
+{
+ {5, 35, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_MAGIKARP},
+ {15, 25, SPECIES_MAGIKARP},
+ {25, 30, SPECIES_MAGIKARP},
+ {25, 30, SPECIES_MAGIKARP},
+};
+
+const struct WildPokemonInfo gSootopolisCity_WaterMonsInfo = {1, gSootopolisCity_WaterMons};
+
+const struct WildPokemon gSootopolisCity_FishingMons[] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {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 gSootopolisCity_FishingMonsInfo = {10, gSootopolisCity_FishingMons};
+
+const struct WildPokemon gSkyPillar_3F_LandMons[] =
+{
+ {33, 33, SPECIES_SABLEYE},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {34, 34, SPECIES_SABLEYE},
+ {36, 36, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_BANETTE},
+ {38, 38, SPECIES_BANETTE},
+ {36, 36, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_CLAYDOL},
+ {38, 38, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_CLAYDOL},
+ {38, 38, SPECIES_CLAYDOL},
+};
+
+const struct WildPokemonInfo gSkyPillar_3F_LandMonsInfo = {10, gSkyPillar_3F_LandMons};
+
+const struct WildPokemon gSkyPillar_5F_LandMons[] =
+{
+ {33, 33, SPECIES_SABLEYE},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {34, 34, SPECIES_SABLEYE},
+ {36, 36, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_BANETTE},
+ {38, 38, SPECIES_BANETTE},
+ {36, 36, SPECIES_CLAYDOL},
+ {37, 37, SPECIES_CLAYDOL},
+ {38, 38, SPECIES_ALTARIA},
+ {39, 39, SPECIES_ALTARIA},
+ {39, 39, SPECIES_ALTARIA},
+};
+
+const struct WildPokemonInfo gSkyPillar_5F_LandMonsInfo = {10, gSkyPillar_5F_LandMons};
+
+const struct WildPokemon gSafariZone_Southeast_LandMons[] =
+{
+ {33, 33, SPECIES_SUNKERN},
+ {34, 34, SPECIES_MAREEP},
+ {35, 35, SPECIES_SUNKERN},
+ {36, 36, SPECIES_MAREEP},
+ {34, 34, SPECIES_AIPOM},
+ {33, 33, SPECIES_SPINARAK},
+ {35, 35, SPECIES_HOOTHOOT},
+ {34, 34, SPECIES_SNUBBULL},
+ {36, 36, SPECIES_STANTLER},
+ {37, 37, SPECIES_GLIGAR},
+ {39, 39, SPECIES_STANTLER},
+ {40, 40, SPECIES_GLIGAR},
+};
+
+const struct WildPokemonInfo gSafariZone_Southeast_LandMonsInfo = {25, gSafariZone_Southeast_LandMons};
+
+const struct WildPokemon gSafariZone_Southeast_WaterMons[] =
+{
+ {25, 30, SPECIES_WOOPER},
+ {25, 30, SPECIES_MARILL},
+ {25, 30, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {35, 40, SPECIES_QUAGSIRE},
+};
+
+const struct WildPokemonInfo gSafariZone_Southeast_WaterMonsInfo = {9, gSafariZone_Southeast_WaterMons};
+
+const struct WildPokemon gSafariZone_Southeast_FishingMons[] =
+{
+ {25, 30, SPECIES_MAGIKARP},
+ {25, 30, SPECIES_GOLDEEN},
+ {25, 30, SPECIES_MAGIKARP},
+ {25, 30, SPECIES_GOLDEEN},
+ {30, 35, SPECIES_REMORAID},
+ {25, 30, SPECIES_GOLDEEN},
+ {25, 30, SPECIES_REMORAID},
+ {30, 35, SPECIES_REMORAID},
+ {30, 35, SPECIES_REMORAID},
+ {35, 40, SPECIES_OCTILLERY},
+};
+
+const struct WildPokemonInfo gSafariZone_Southeast_FishingMonsInfo = {35, gSafariZone_Southeast_FishingMons};
+
+const struct WildPokemon gSafariZone_Northeast_LandMons[] =
+{
+ {33, 33, SPECIES_AIPOM},
+ {34, 34, SPECIES_TEDDIURSA},
+ {35, 35, SPECIES_AIPOM},
+ {36, 36, SPECIES_TEDDIURSA},
+ {34, 34, SPECIES_SUNKERN},
+ {33, 33, SPECIES_LEDYBA},
+ {35, 35, SPECIES_HOOTHOOT},
+ {34, 34, SPECIES_PINECO},
+ {36, 36, SPECIES_HOUNDOUR},
+ {37, 37, SPECIES_MILTANK},
+ {39, 39, SPECIES_HOUNDOUR},
+ {40, 40, SPECIES_MILTANK},
+};
+
+const struct WildPokemonInfo gSafariZone_Northeast_LandMonsInfo = {25, gSafariZone_Northeast_LandMons};
+
+const struct WildPokemon gSafariZone_Northeast_RockSmashMons[] =
+{
+ {25, 30, SPECIES_SHUCKLE},
+ {20, 25, SPECIES_SHUCKLE},
+ {30, 35, SPECIES_SHUCKLE},
+ {30, 35, SPECIES_SHUCKLE},
+ {35, 40, SPECIES_SHUCKLE},
+};
+
+const struct WildPokemonInfo gSafariZone_Northeast_RockSmashMonsInfo = {25, gSafariZone_Northeast_RockSmashMons};
+
+const struct WildPokemon gMagmaHideout_1F_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_1F_LandMonsInfo = {10, gMagmaHideout_1F_LandMons};
+
+const struct WildPokemon gMagmaHideout_2F_1R_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_2F_1R_LandMonsInfo = {10, gMagmaHideout_2F_1R_LandMons};
+
+const struct WildPokemon gMagmaHideout_2F_2R_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_2F_2R_LandMonsInfo = {10, gMagmaHideout_2F_2R_LandMons};
+
+const struct WildPokemon gMagmaHideout_3F_1R_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_3F_1R_LandMonsInfo = {10, gMagmaHideout_3F_1R_LandMons};
+
+const struct WildPokemon gMagmaHideout_3F_2R_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_3F_2R_LandMonsInfo = {10, gMagmaHideout_3F_2R_LandMons};
+
+const struct WildPokemon gMagmaHideout_4F_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_4F_LandMonsInfo = {10, gMagmaHideout_4F_LandMons};
+
+const struct WildPokemon gMagmaHideout_3F_3R_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_3F_3R_LandMonsInfo = {10, gMagmaHideout_3F_3R_LandMons};
+
+const struct WildPokemon gMagmaHideout_2F_3R_LandMons[] =
+{
+ {27, 27, SPECIES_GEODUDE},
+ {28, 28, SPECIES_TORKOAL},
+ {28, 28, SPECIES_GEODUDE},
+ {30, 30, SPECIES_TORKOAL},
+ {29, 29, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GEODUDE},
+ {30, 30, SPECIES_GRAVELER},
+ {30, 30, SPECIES_GRAVELER},
+ {31, 31, SPECIES_GRAVELER},
+ {32, 32, SPECIES_GRAVELER},
+ {33, 33, SPECIES_GRAVELER},
+};
+
+const struct WildPokemonInfo gMagmaHideout_2F_3R_LandMonsInfo = {10, gMagmaHideout_2F_3R_LandMons};
+
+const struct WildPokemon gMirageTower_1F_LandMons[] =
+{
+ {21, 21, SPECIES_SANDSHREW},
+ {21, 21, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {22, 22, SPECIES_SANDSHREW},
+ {22, 22, SPECIES_TRAPINCH},
+ {23, 23, SPECIES_SANDSHREW},
+ {23, 23, SPECIES_TRAPINCH},
+ {24, 24, SPECIES_SANDSHREW},
+ {24, 24, SPECIES_TRAPINCH},
+};
+
+const struct WildPokemonInfo gMirageTower_1F_LandMonsInfo = {10, gMirageTower_1F_LandMons};
+
+const struct WildPokemon gMirageTower_2F_LandMons[] =
+{
+ {21, 21, SPECIES_SANDSHREW},
+ {21, 21, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {22, 22, SPECIES_SANDSHREW},
+ {22, 22, SPECIES_TRAPINCH},
+ {23, 23, SPECIES_SANDSHREW},
+ {23, 23, SPECIES_TRAPINCH},
+ {24, 24, SPECIES_SANDSHREW},
+ {24, 24, SPECIES_TRAPINCH},
+};
+
+const struct WildPokemonInfo gMirageTower_2F_LandMonsInfo = {10, gMirageTower_2F_LandMons};
+
+const struct WildPokemon gMirageTower_3F_LandMons[] =
+{
+ {21, 21, SPECIES_SANDSHREW},
+ {21, 21, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {22, 22, SPECIES_SANDSHREW},
+ {22, 22, SPECIES_TRAPINCH},
+ {23, 23, SPECIES_SANDSHREW},
+ {23, 23, SPECIES_TRAPINCH},
+ {24, 24, SPECIES_SANDSHREW},
+ {24, 24, SPECIES_TRAPINCH},
+};
+
+const struct WildPokemonInfo gMirageTower_3F_LandMonsInfo = {10, gMirageTower_3F_LandMons};
+
+const struct WildPokemon gMirageTower_4F_LandMons[] =
+{
+ {21, 21, SPECIES_SANDSHREW},
+ {21, 21, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {22, 22, SPECIES_SANDSHREW},
+ {22, 22, SPECIES_TRAPINCH},
+ {23, 23, SPECIES_SANDSHREW},
+ {23, 23, SPECIES_TRAPINCH},
+ {24, 24, SPECIES_SANDSHREW},
+ {24, 24, SPECIES_TRAPINCH},
+};
+
+const struct WildPokemonInfo gMirageTower_4F_LandMonsInfo = {10, gMirageTower_4F_LandMons};
+
+const struct WildPokemon gDesertUnderpass_LandMons[] =
+{
+ {38, 38, SPECIES_DITTO},
+ {35, 35, SPECIES_WHISMUR},
+ {40, 40, SPECIES_DITTO},
+ {40, 40, SPECIES_LOUDRED},
+ {41, 41, SPECIES_DITTO},
+ {36, 36, SPECIES_WHISMUR},
+ {38, 38, SPECIES_LOUDRED},
+ {42, 42, SPECIES_DITTO},
+ {38, 38, SPECIES_WHISMUR},
+ {43, 43, SPECIES_DITTO},
+ {44, 44, SPECIES_LOUDRED},
+ {45, 45, SPECIES_DITTO},
+};
+
+const struct WildPokemonInfo gDesertUnderpass_LandMonsInfo = {10, gDesertUnderpass_LandMons};
+
+const struct WildPokemon gArtisanCave_B1F_LandMons[] =
+{
+ {40, 40, SPECIES_SMEARGLE},
+ {41, 41, SPECIES_SMEARGLE},
+ {42, 42, SPECIES_SMEARGLE},
+ {43, 43, SPECIES_SMEARGLE},
+ {44, 44, SPECIES_SMEARGLE},
+ {45, 45, SPECIES_SMEARGLE},
+ {46, 46, SPECIES_SMEARGLE},
+ {47, 47, SPECIES_SMEARGLE},
+ {48, 48, SPECIES_SMEARGLE},
+ {49, 49, SPECIES_SMEARGLE},
+ {50, 50, SPECIES_SMEARGLE},
+ {50, 50, SPECIES_SMEARGLE},
+};
+
+const struct WildPokemonInfo gArtisanCave_B1F_LandMonsInfo = {10, gArtisanCave_B1F_LandMons};
+
+const struct WildPokemon gArtisanCave_1F_LandMons[] =
+{
+ {40, 40, SPECIES_SMEARGLE},
+ {41, 41, SPECIES_SMEARGLE},
+ {42, 42, SPECIES_SMEARGLE},
+ {43, 43, SPECIES_SMEARGLE},
+ {44, 44, SPECIES_SMEARGLE},
+ {45, 45, SPECIES_SMEARGLE},
+ {46, 46, SPECIES_SMEARGLE},
+ {47, 47, SPECIES_SMEARGLE},
+ {48, 48, SPECIES_SMEARGLE},
+ {49, 49, SPECIES_SMEARGLE},
+ {50, 50, SPECIES_SMEARGLE},
+ {50, 50, SPECIES_SMEARGLE},
+};
+
+const struct WildPokemonInfo gArtisanCave_1F_LandMonsInfo = {10, gArtisanCave_1F_LandMons};
+
+const struct WildPokemon gAlteringCave1_LandMons[] =
+{
+ {10, 10, SPECIES_ZUBAT},
+ {12, 12, SPECIES_ZUBAT},
+ {8, 8, SPECIES_ZUBAT},
+ {14, 14, SPECIES_ZUBAT},
+ {10, 10, SPECIES_ZUBAT},
+ {12, 12, SPECIES_ZUBAT},
+ {16, 16, SPECIES_ZUBAT},
+ {6, 6, SPECIES_ZUBAT},
+ {8, 8, SPECIES_ZUBAT},
+ {14, 14, SPECIES_ZUBAT},
+ {8, 8, SPECIES_ZUBAT},
+ {14, 14, SPECIES_ZUBAT},
+};
+
+const struct WildPokemonInfo gAlteringCave1_LandMonsInfo = {7, gAlteringCave1_LandMons};
+
+const struct WildPokemon gAlteringCave2_LandMons[] =
+{
+ {7, 7, SPECIES_MAREEP},
+ {9, 9, SPECIES_MAREEP},
+ {5, 5, SPECIES_MAREEP},
+ {11, 11, SPECIES_MAREEP},
+ {7, 7, SPECIES_MAREEP},
+ {9, 9, SPECIES_MAREEP},
+ {13, 13, SPECIES_MAREEP},
+ {3, 3, SPECIES_MAREEP},
+ {5, 5, SPECIES_MAREEP},
+ {11, 11, SPECIES_MAREEP},
+ {5, 5, SPECIES_MAREEP},
+ {11, 11, SPECIES_MAREEP},
+};
+
+const struct WildPokemonInfo gAlteringCave2_LandMonsInfo = {7, gAlteringCave2_LandMons};
+
+const struct WildPokemon gAlteringCave3_LandMons[] =
+{
+ {23, 23, SPECIES_PINECO},
+ {25, 25, SPECIES_PINECO},
+ {22, 22, SPECIES_PINECO},
+ {27, 27, SPECIES_PINECO},
+ {23, 23, SPECIES_PINECO},
+ {25, 25, SPECIES_PINECO},
+ {29, 29, SPECIES_PINECO},
+ {19, 19, SPECIES_PINECO},
+ {21, 21, SPECIES_PINECO},
+ {27, 27, SPECIES_PINECO},
+ {21, 21, SPECIES_PINECO},
+ {27, 27, SPECIES_PINECO},
+};
+
+const struct WildPokemonInfo gAlteringCave3_LandMonsInfo = {7, gAlteringCave3_LandMons};
+
+const struct WildPokemon gAlteringCave4_LandMons[] =
+{
+ {16, 16, SPECIES_HOUNDOUR},
+ {18, 18, SPECIES_HOUNDOUR},
+ {14, 14, SPECIES_HOUNDOUR},
+ {20, 20, SPECIES_HOUNDOUR},
+ {16, 16, SPECIES_HOUNDOUR},
+ {18, 18, SPECIES_HOUNDOUR},
+ {22, 22, SPECIES_HOUNDOUR},
+ {12, 12, SPECIES_HOUNDOUR},
+ {14, 14, SPECIES_HOUNDOUR},
+ {20, 20, SPECIES_HOUNDOUR},
+ {14, 14, SPECIES_HOUNDOUR},
+ {20, 20, SPECIES_HOUNDOUR},
+};
+
+const struct WildPokemonInfo gAlteringCave4_LandMonsInfo = {7, gAlteringCave4_LandMons};
+
+const struct WildPokemon gAlteringCave5_LandMons[] =
+{
+ {10, 10, SPECIES_TEDDIURSA},
+ {12, 12, SPECIES_TEDDIURSA},
+ {8, 8, SPECIES_TEDDIURSA},
+ {14, 14, SPECIES_TEDDIURSA},
+ {10, 10, SPECIES_TEDDIURSA},
+ {12, 12, SPECIES_TEDDIURSA},
+ {16, 16, SPECIES_TEDDIURSA},
+ {6, 6, SPECIES_TEDDIURSA},
+ {8, 8, SPECIES_TEDDIURSA},
+ {14, 14, SPECIES_TEDDIURSA},
+ {8, 8, SPECIES_TEDDIURSA},
+ {14, 14, SPECIES_TEDDIURSA},
+};
+
+const struct WildPokemonInfo gAlteringCave5_LandMonsInfo = {7, gAlteringCave5_LandMons};
+
+const struct WildPokemon gAlteringCave6_LandMons[] =
+{
+ {22, 22, SPECIES_AIPOM},
+ {24, 24, SPECIES_AIPOM},
+ {20, 20, SPECIES_AIPOM},
+ {26, 26, SPECIES_AIPOM},
+ {22, 22, SPECIES_AIPOM},
+ {24, 24, SPECIES_AIPOM},
+ {28, 28, SPECIES_AIPOM},
+ {18, 18, SPECIES_AIPOM},
+ {20, 20, SPECIES_AIPOM},
+ {26, 26, SPECIES_AIPOM},
+ {20, 20, SPECIES_AIPOM},
+ {26, 26, SPECIES_AIPOM},
+};
+
+const struct WildPokemonInfo gAlteringCave6_LandMonsInfo = {7, gAlteringCave6_LandMons};
+
+const struct WildPokemon gAlteringCave7_LandMons[] =
+{
+ {22, 22, SPECIES_SHUCKLE},
+ {24, 24, SPECIES_SHUCKLE},
+ {20, 20, SPECIES_SHUCKLE},
+ {26, 26, SPECIES_SHUCKLE},
+ {22, 22, SPECIES_SHUCKLE},
+ {24, 24, SPECIES_SHUCKLE},
+ {28, 28, SPECIES_SHUCKLE},
+ {18, 18, SPECIES_SHUCKLE},
+ {20, 20, SPECIES_SHUCKLE},
+ {26, 26, SPECIES_SHUCKLE},
+ {20, 20, SPECIES_SHUCKLE},
+ {26, 26, SPECIES_SHUCKLE},
+};
+
+const struct WildPokemonInfo gAlteringCave7_LandMonsInfo = {7, gAlteringCave7_LandMons};
+
+const struct WildPokemon gAlteringCave8_LandMons[] =
+{
+ {22, 22, SPECIES_STANTLER},
+ {24, 24, SPECIES_STANTLER},
+ {20, 20, SPECIES_STANTLER},
+ {26, 26, SPECIES_STANTLER},
+ {22, 22, SPECIES_STANTLER},
+ {24, 24, SPECIES_STANTLER},
+ {28, 28, SPECIES_STANTLER},
+ {18, 18, SPECIES_STANTLER},
+ {20, 20, SPECIES_STANTLER},
+ {26, 26, SPECIES_STANTLER},
+ {20, 20, SPECIES_STANTLER},
+ {26, 26, SPECIES_STANTLER},
+};
+
+const struct WildPokemonInfo gAlteringCave8_LandMonsInfo = {7, gAlteringCave8_LandMons};
+
+const struct WildPokemon gAlteringCave9_LandMons[] =
+{
+ {22, 22, SPECIES_SMEARGLE},
+ {24, 24, SPECIES_SMEARGLE},
+ {20, 20, SPECIES_SMEARGLE},
+ {26, 26, SPECIES_SMEARGLE},
+ {22, 22, SPECIES_SMEARGLE},
+ {24, 24, SPECIES_SMEARGLE},
+ {28, 28, SPECIES_SMEARGLE},
+ {18, 18, SPECIES_SMEARGLE},
+ {20, 20, SPECIES_SMEARGLE},
+ {26, 26, SPECIES_SMEARGLE},
+ {20, 20, SPECIES_SMEARGLE},
+ {26, 26, SPECIES_SMEARGLE},
+};
+
+const struct WildPokemonInfo gAlteringCave9_LandMonsInfo = {7, gAlteringCave9_LandMons};
+
+const struct WildPokemon gMeteorFalls_StevensCave_LandMons[] =
+{
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_SOLROCK},
+ {33, 33, SPECIES_SOLROCK},
+ {37, 37, SPECIES_SOLROCK},
+ {35, 35, SPECIES_GOLBAT},
+ {39, 39, SPECIES_SOLROCK},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+};
+
+const struct WildPokemonInfo gMeteorFalls_StevensCave_LandMonsInfo = {10, gMeteorFalls_StevensCave_LandMons};
+
+const struct WildPokemonHeader gWildMonHeaders[] =
+{
+ {
+ .mapGroup = MAP_GROUP(ROUTE101),
+ .mapNum = MAP_NUM(ROUTE101),
+ .landMonsInfo = &gRoute101_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE102),
+ .mapNum = MAP_NUM(ROUTE102),
+ .landMonsInfo = &gRoute102_LandMonsInfo,
+ .waterMonsInfo = &gRoute102_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute102_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE103),
+ .mapNum = MAP_NUM(ROUTE103),
+ .landMonsInfo = &gRoute103_LandMonsInfo,
+ .waterMonsInfo = &gRoute103_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute103_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE104),
+ .mapNum = MAP_NUM(ROUTE104),
+ .landMonsInfo = &gRoute104_LandMonsInfo,
+ .waterMonsInfo = &gRoute104_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute104_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE105),
+ .mapNum = MAP_NUM(ROUTE105),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute105_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute105_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE110),
+ .mapNum = MAP_NUM(ROUTE110),
+ .landMonsInfo = &gRoute110_LandMonsInfo,
+ .waterMonsInfo = &gRoute110_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute110_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE111),
+ .mapNum = MAP_NUM(ROUTE111),
+ .landMonsInfo = &gRoute111_LandMonsInfo,
+ .waterMonsInfo = &gRoute111_WaterMonsInfo,
+ .rockSmashMonsInfo = &gRoute111_RockSmashMonsInfo,
+ .fishingMonsInfo = &gRoute111_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE112),
+ .mapNum = MAP_NUM(ROUTE112),
+ .landMonsInfo = &gRoute112_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE113),
+ .mapNum = MAP_NUM(ROUTE113),
+ .landMonsInfo = &gRoute113_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE114),
+ .mapNum = MAP_NUM(ROUTE114),
+ .landMonsInfo = &gRoute114_LandMonsInfo,
+ .waterMonsInfo = &gRoute114_WaterMonsInfo,
+ .rockSmashMonsInfo = &gRoute114_RockSmashMonsInfo,
+ .fishingMonsInfo = &gRoute114_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE116),
+ .mapNum = MAP_NUM(ROUTE116),
+ .landMonsInfo = &gRoute116_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE117),
+ .mapNum = MAP_NUM(ROUTE117),
+ .landMonsInfo = &gRoute117_LandMonsInfo,
+ .waterMonsInfo = &gRoute117_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute117_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE118),
+ .mapNum = MAP_NUM(ROUTE118),
+ .landMonsInfo = &gRoute118_LandMonsInfo,
+ .waterMonsInfo = &gRoute118_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute118_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE124),
+ .mapNum = MAP_NUM(ROUTE124),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute124_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute124_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(PETALBURG_WOODS),
+ .mapNum = MAP_NUM(PETALBURG_WOODS),
+ .landMonsInfo = &gPetalburgWoods_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(RUSTURF_TUNNEL),
+ .mapNum = MAP_NUM(RUSTURF_TUNNEL),
+ .landMonsInfo = &gRusturfTunnel_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_1F),
+ .mapNum = MAP_NUM(GRANITE_CAVE_1F),
+ .landMonsInfo = &gGraniteCave_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_B1F),
+ .mapNum = MAP_NUM(GRANITE_CAVE_B1F),
+ .landMonsInfo = &gGraniteCave_B1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_1F),
+ .mapNum = MAP_NUM(MT_PYRE_1F),
+ .landMonsInfo = &gMtPyre_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(VICTORY_ROAD_1F),
+ .mapNum = MAP_NUM(VICTORY_ROAD_1F),
+ .landMonsInfo = &gVictoryRoad_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTH),
+ .mapNum = MAP_NUM(SAFARI_ZONE_SOUTH),
+ .landMonsInfo = &gSafariZone_South_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(UNDERWATER2),
+ .mapNum = MAP_NUM(UNDERWATER2),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gUnderwater2_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ABANDONED_SHIP_ROOMS_B1F),
+ .mapNum = MAP_NUM(ABANDONED_SHIP_ROOMS_B1F),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gAbandonedShip_Rooms_B1F_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gAbandonedShip_Rooms_B1F_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_B2F),
+ .mapNum = MAP_NUM(GRANITE_CAVE_B2F),
+ .landMonsInfo = &gGraniteCave_B2F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = &gGraniteCave_B2F_RockSmashMonsInfo,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(FIERY_PATH),
+ .mapNum = MAP_NUM(FIERY_PATH),
+ .landMonsInfo = &gFieryPath_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_2R),
+ .mapNum = MAP_NUM(METEOR_FALLS_B1F_2R),
+ .landMonsInfo = &gMeteorFalls_B1F_2R_LandMonsInfo,
+ .waterMonsInfo = &gMeteorFalls_B1F_2R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gMeteorFalls_B1F_2R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(JAGGED_PASS),
+ .mapNum = MAP_NUM(JAGGED_PASS),
+ .landMonsInfo = &gJaggedPass_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE106),
+ .mapNum = MAP_NUM(ROUTE106),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute106_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute106_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE107),
+ .mapNum = MAP_NUM(ROUTE107),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute107_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute107_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE108),
+ .mapNum = MAP_NUM(ROUTE108),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute108_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute108_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE109),
+ .mapNum = MAP_NUM(ROUTE109),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute109_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute109_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE115),
+ .mapNum = MAP_NUM(ROUTE115),
+ .landMonsInfo = &gRoute115_LandMonsInfo,
+ .waterMonsInfo = &gRoute115_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute115_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(NEW_MAUVILLE_INSIDE),
+ .mapNum = MAP_NUM(NEW_MAUVILLE_INSIDE),
+ .landMonsInfo = &gNewMauville_Inside_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE119),
+ .mapNum = MAP_NUM(ROUTE119),
+ .landMonsInfo = &gRoute119_LandMonsInfo,
+ .waterMonsInfo = &gRoute119_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute119_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE120),
+ .mapNum = MAP_NUM(ROUTE120),
+ .landMonsInfo = &gRoute120_LandMonsInfo,
+ .waterMonsInfo = &gRoute120_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute120_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE121),
+ .mapNum = MAP_NUM(ROUTE121),
+ .landMonsInfo = &gRoute121_LandMonsInfo,
+ .waterMonsInfo = &gRoute121_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute121_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE122),
+ .mapNum = MAP_NUM(ROUTE122),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute122_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute122_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE123),
+ .mapNum = MAP_NUM(ROUTE123),
+ .landMonsInfo = &gRoute123_LandMonsInfo,
+ .waterMonsInfo = &gRoute123_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute123_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_2F),
+ .mapNum = MAP_NUM(MT_PYRE_2F),
+ .landMonsInfo = &gMtPyre_2F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_3F),
+ .mapNum = MAP_NUM(MT_PYRE_3F),
+ .landMonsInfo = &gMtPyre_3F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_4F),
+ .mapNum = MAP_NUM(MT_PYRE_4F),
+ .landMonsInfo = &gMtPyre_4F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_5F),
+ .mapNum = MAP_NUM(MT_PYRE_5F),
+ .landMonsInfo = &gMtPyre_5F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_6F),
+ .mapNum = MAP_NUM(MT_PYRE_6F),
+ .landMonsInfo = &gMtPyre_6F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_EXTERIOR),
+ .mapNum = MAP_NUM(MT_PYRE_EXTERIOR),
+ .landMonsInfo = &gMtPyre_Exterior_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_SUMMIT),
+ .mapNum = MAP_NUM(MT_PYRE_SUMMIT),
+ .landMonsInfo = &gMtPyre_Summit_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_STEVENS_ROOM),
+ .mapNum = MAP_NUM(GRANITE_CAVE_STEVENS_ROOM),
+ .landMonsInfo = &gGraniteCave_StevensRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE125),
+ .mapNum = MAP_NUM(ROUTE125),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute125_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute125_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE126),
+ .mapNum = MAP_NUM(ROUTE126),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute126_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute126_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE127),
+ .mapNum = MAP_NUM(ROUTE127),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute127_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute127_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE128),
+ .mapNum = MAP_NUM(ROUTE128),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute128_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute128_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE129),
+ .mapNum = MAP_NUM(ROUTE129),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute129_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute129_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE130),
+ .mapNum = MAP_NUM(ROUTE130),
+ .landMonsInfo = &gRoute130_LandMonsInfo,
+ .waterMonsInfo = &gRoute130_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute130_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE131),
+ .mapNum = MAP_NUM(ROUTE131),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute131_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute131_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE132),
+ .mapNum = MAP_NUM(ROUTE132),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute132_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute132_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE133),
+ .mapNum = MAP_NUM(ROUTE133),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute133_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute133_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE134),
+ .mapNum = MAP_NUM(ROUTE134),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gRoute134_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gRoute134_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS),
+ .mapNum = MAP_NUM(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gAbandonedShip_HiddenFloorCorridors_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gAbandonedShip_HiddenFloorCorridors_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM1),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM1),
+ .landMonsInfo = &gSeafloorCavern_Room1_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM2),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM2),
+ .landMonsInfo = &gSeafloorCavern_Room2_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM3),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM3),
+ .landMonsInfo = &gSeafloorCavern_Room3_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM4),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM4),
+ .landMonsInfo = &gSeafloorCavern_Room4_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM5),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM5),
+ .landMonsInfo = &gSeafloorCavern_Room5_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM6),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM6),
+ .landMonsInfo = &gSeafloorCavern_Room6_LandMonsInfo,
+ .waterMonsInfo = &gSeafloorCavern_Room6_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSeafloorCavern_Room6_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM7),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM7),
+ .landMonsInfo = &gSeafloorCavern_Room7_LandMonsInfo,
+ .waterMonsInfo = &gSeafloorCavern_Room7_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSeafloorCavern_Room7_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM8),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM8),
+ .landMonsInfo = &gSeafloorCavern_Room8_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ENTRANCE),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ENTRANCE),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gSeafloorCavern_Entrance_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSeafloorCavern_Entrance_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_ENTRANCE),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_ENTRANCE),
+ .landMonsInfo = &gCaveOfOrigin_Entrance_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_1F),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_1F),
+ .landMonsInfo = &gCaveOfOrigin_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1),
+ .landMonsInfo = &gCaveOfOrigin_UnusedRubySapphireMap1_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2),
+ .landMonsInfo = &gCaveOfOrigin_UnusedRubySapphireMap2_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3),
+ .landMonsInfo = &gCaveOfOrigin_UnusedRubySapphireMap3_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(NEW_MAUVILLE_ENTRANCE),
+ .mapNum = MAP_NUM(NEW_MAUVILLE_ENTRANCE),
+ .landMonsInfo = &gNewMauville_Entrance_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHWEST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHWEST),
+ .landMonsInfo = &gSafariZone_Southwest_LandMonsInfo,
+ .waterMonsInfo = &gSafariZone_Southwest_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSafariZone_Southwest_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH),
+ .mapNum = MAP_NUM(SAFARI_ZONE_NORTH),
+ .landMonsInfo = &gSafariZone_North_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = &gSafariZone_North_RockSmashMonsInfo,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHWEST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_NORTHWEST),
+ .landMonsInfo = &gSafariZone_Northwest_LandMonsInfo,
+ .waterMonsInfo = &gSafariZone_Northwest_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSafariZone_Northwest_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(VICTORY_ROAD_B1F),
+ .mapNum = MAP_NUM(VICTORY_ROAD_B1F),
+ .landMonsInfo = &gVictoryRoad_B1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = &gVictoryRoad_B1F_RockSmashMonsInfo,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(VICTORY_ROAD_B2F),
+ .mapNum = MAP_NUM(VICTORY_ROAD_B2F),
+ .landMonsInfo = &gVictoryRoad_B2F_LandMonsInfo,
+ .waterMonsInfo = &gVictoryRoad_B2F_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gVictoryRoad_B2F_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_1F_1R),
+ .mapNum = MAP_NUM(METEOR_FALLS_1F_1R),
+ .landMonsInfo = &gMeteorFalls_1F_1R_LandMonsInfo,
+ .waterMonsInfo = &gMeteorFalls_1F_1R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gMeteorFalls_1F_1R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_1F_2R),
+ .mapNum = MAP_NUM(METEOR_FALLS_1F_2R),
+ .landMonsInfo = &gMeteorFalls_1F_2R_LandMonsInfo,
+ .waterMonsInfo = &gMeteorFalls_1F_2R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gMeteorFalls_1F_2R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_1R),
+ .mapNum = MAP_NUM(METEOR_FALLS_B1F_1R),
+ .landMonsInfo = &gMeteorFalls_B1F_1R_LandMonsInfo,
+ .waterMonsInfo = &gMeteorFalls_B1F_1R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gMeteorFalls_B1F_1R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM),
+ .landMonsInfo = &gShoalCave_LowTideStairsRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM),
+ .landMonsInfo = &gShoalCave_LowTideLowerRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_INNER_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_INNER_ROOM),
+ .landMonsInfo = &gShoalCave_LowTideInnerRoom_LandMonsInfo,
+ .waterMonsInfo = &gShoalCave_LowTideInnerRoom_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gShoalCave_LowTideInnerRoom_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM),
+ .landMonsInfo = &gShoalCave_LowTideEntranceRoom_LandMonsInfo,
+ .waterMonsInfo = &gShoalCave_LowTideEntranceRoom_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gShoalCave_LowTideEntranceRoom_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(LILYCOVE_CITY),
+ .mapNum = MAP_NUM(LILYCOVE_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gLilycoveCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gLilycoveCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(DEWFORD_TOWN),
+ .mapNum = MAP_NUM(DEWFORD_TOWN),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gDewfordTown_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gDewfordTown_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SLATEPORT_CITY),
+ .mapNum = MAP_NUM(SLATEPORT_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gSlateportCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSlateportCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(MOSSDEEP_CITY),
+ .mapNum = MAP_NUM(MOSSDEEP_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gMossdeepCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gMossdeepCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(PACIFIDLOG_TOWN),
+ .mapNum = MAP_NUM(PACIFIDLOG_TOWN),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gPacifidlogTown_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gPacifidlogTown_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(EVER_GRANDE_CITY),
+ .mapNum = MAP_NUM(EVER_GRANDE_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gEverGrandeCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gEverGrandeCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(PETALBURG_CITY),
+ .mapNum = MAP_NUM(PETALBURG_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gPetalburgCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gPetalburgCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(UNDERWATER1),
+ .mapNum = MAP_NUM(UNDERWATER1),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gUnderwater1_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ICE_ROOM),
+ .landMonsInfo = &gShoalCave_LowTideIceRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SKY_PILLAR_1F),
+ .mapNum = MAP_NUM(SKY_PILLAR_1F),
+ .landMonsInfo = &gSkyPillar_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SOOTOPOLIS_CITY),
+ .mapNum = MAP_NUM(SOOTOPOLIS_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &gSootopolisCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSootopolisCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SKY_PILLAR_3F),
+ .mapNum = MAP_NUM(SKY_PILLAR_3F),
+ .landMonsInfo = &gSkyPillar_3F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SKY_PILLAR_5F),
+ .mapNum = MAP_NUM(SKY_PILLAR_5F),
+ .landMonsInfo = &gSkyPillar_5F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHEAST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHEAST),
+ .landMonsInfo = &gSafariZone_Southeast_LandMonsInfo,
+ .waterMonsInfo = &gSafariZone_Southeast_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &gSafariZone_Southeast_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHEAST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_NORTHEAST),
+ .landMonsInfo = &gSafariZone_Northeast_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = &gSafariZone_Northeast_RockSmashMonsInfo,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_1F),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_1F),
+ .landMonsInfo = &gMagmaHideout_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_2F_1R),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_2F_1R),
+ .landMonsInfo = &gMagmaHideout_2F_1R_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_2F_2R),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_2F_2R),
+ .landMonsInfo = &gMagmaHideout_2F_2R_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_3F_1R),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_3F_1R),
+ .landMonsInfo = &gMagmaHideout_3F_1R_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_3F_2R),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_3F_2R),
+ .landMonsInfo = &gMagmaHideout_3F_2R_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_4F),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_4F),
+ .landMonsInfo = &gMagmaHideout_4F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_3F_3R),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_3F_3R),
+ .landMonsInfo = &gMagmaHideout_3F_3R_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MAGMA_HIDEOUT_2F_3R),
+ .mapNum = MAP_NUM(MAGMA_HIDEOUT_2F_3R),
+ .landMonsInfo = &gMagmaHideout_2F_3R_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MIRAGE_TOWER_1F),
+ .mapNum = MAP_NUM(MIRAGE_TOWER_1F),
+ .landMonsInfo = &gMirageTower_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MIRAGE_TOWER_2F),
+ .mapNum = MAP_NUM(MIRAGE_TOWER_2F),
+ .landMonsInfo = &gMirageTower_2F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MIRAGE_TOWER_3F),
+ .mapNum = MAP_NUM(MIRAGE_TOWER_3F),
+ .landMonsInfo = &gMirageTower_3F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MIRAGE_TOWER_4F),
+ .mapNum = MAP_NUM(MIRAGE_TOWER_4F),
+ .landMonsInfo = &gMirageTower_4F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(DESERT_UNDERPASS),
+ .mapNum = MAP_NUM(DESERT_UNDERPASS),
+ .landMonsInfo = &gDesertUnderpass_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ARTISAN_CAVE_B1F),
+ .mapNum = MAP_NUM(ARTISAN_CAVE_B1F),
+ .landMonsInfo = &gArtisanCave_B1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ARTISAN_CAVE_1F),
+ .mapNum = MAP_NUM(ARTISAN_CAVE_1F),
+ .landMonsInfo = &gArtisanCave_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave1_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave2_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave3_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave4_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave5_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave6_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave7_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave8_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ALTERING_CAVE),
+ .mapNum = MAP_NUM(ALTERING_CAVE),
+ .landMonsInfo = &gAlteringCave9_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_STEVENS_CAVE),
+ .mapNum = MAP_NUM(METEOR_FALLS_STEVENS_CAVE),
+ .landMonsInfo = &gMeteorFalls_StevensCave_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(UNDEFINED),
+ .mapNum = MAP_NUM(UNDEFINED),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+};
+
+const struct WildPokemon gBattlePyramidPlaceholders_1[] =
+{
+ {5, 5, SPECIES_BULBASAUR},
+ {5, 5, SPECIES_BULBASAUR},
+ {5, 5, SPECIES_BULBASAUR},
+ {5, 5, SPECIES_BULBASAUR},
+ {5, 5, SPECIES_IVYSAUR},
+ {5, 5, SPECIES_IVYSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_CHARMANDER},
+};
+
+const struct WildPokemonInfo gBattlePyramidPlaceholders_1Info = {4, gBattlePyramidPlaceholders_1};
+
+const struct WildPokemon gBattlePyramidPlaceholders_2[] =
+{
+ {5, 5, SPECIES_IVYSAUR},
+ {5, 5, SPECIES_IVYSAUR},
+ {5, 5, SPECIES_IVYSAUR},
+ {5, 5, SPECIES_IVYSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMANDER},
+};
+
+const struct WildPokemonInfo gBattlePyramidPlaceholders_2Info = {4, gBattlePyramidPlaceholders_2};
+
+const struct WildPokemon gBattlePyramidPlaceholders_3[] =
+{
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_VENUSAUR},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARIZARD},
+};
+
+const struct WildPokemonInfo gBattlePyramidPlaceholders_3Info = {4, gBattlePyramidPlaceholders_3};
+
+const struct WildPokemon gBattlePyramidPlaceholders_4[] =
+{
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMANDER},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_SQUIRTLE},
+};
+
+const struct WildPokemonInfo gBattlePyramidPlaceholders_4Info = {4, gBattlePyramidPlaceholders_4};
+
+const struct WildPokemon gBattlePyramidPlaceholders_5[] =
+{
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_WARTORTLE},
+};
+
+const struct WildPokemonInfo gBattlePyramidPlaceholders_5Info = {4, gBattlePyramidPlaceholders_5};
+
+const struct WildPokemon gBattlePyramidPlaceholders_6[] =
+{
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_WARTORTLE},
+};
+
+const struct WildPokemonInfo gBattlePyramidPlaceholders_6Info = {4, gBattlePyramidPlaceholders_6};
+
+const struct WildPokemon gBattlePyramidPlaceholders_7[] =
+{
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_WARTORTLE},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_SQUIRTLE},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARIZARD},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+ {5, 5, SPECIES_CHARMELEON},
+};
+
+const struct WildPokemonInfo gBattlePyramidPlaceholders_7Info = {8, gBattlePyramidPlaceholders_7};
+
+const struct WildPokemonHeader gBattlePyramidWildMonHeaders[] =
+{
+ {
+ .mapGroup = 0,
+ .mapNum = 1,
+ .landMonsInfo = &gBattlePyramidPlaceholders_1Info,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 2,
+ .landMonsInfo = &gBattlePyramidPlaceholders_2Info,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 3,
+ .landMonsInfo = &gBattlePyramidPlaceholders_3Info,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 4,
+ .landMonsInfo = &gBattlePyramidPlaceholders_4Info,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 5,
+ .landMonsInfo = &gBattlePyramidPlaceholders_5Info,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 6,
+ .landMonsInfo = &gBattlePyramidPlaceholders_6Info,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 7,
+ .landMonsInfo = &gBattlePyramidPlaceholders_7Info,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 255,
+ .mapNum = 255,
+ .landMonsInfo = NULL,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+};
+
+const struct WildPokemon gBattlePikeMons_1[] =
+{
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_DUSCLOPS},
+ {5, 5, SPECIES_DUSCLOPS},
+ {5, 5, SPECIES_DUSCLOPS},
+ {5, 5, SPECIES_DUSCLOPS},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_DUSCLOPS},
+ {5, 5, SPECIES_DUSCLOPS},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+};
+
+const struct WildPokemonInfo gBattlePikeMonsInfo_1 = {10, gBattlePikeMons_1};
+
+const struct WildPokemon gBattlePikeMons_2[] =
+{
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_ELECTRODE},
+ {5, 5, SPECIES_ELECTRODE},
+ {5, 5, SPECIES_ELECTRODE},
+ {5, 5, SPECIES_ELECTRODE},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_ELECTRODE},
+ {5, 5, SPECIES_ELECTRODE},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+};
+
+const struct WildPokemonInfo gBattlePikeMonsInfo_2 = {10, gBattlePikeMons_2};
+
+const struct WildPokemon gBattlePikeMons_3[] =
+{
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_BRELOOM},
+ {5, 5, SPECIES_BRELOOM},
+ {5, 5, SPECIES_BRELOOM},
+ {5, 5, SPECIES_BRELOOM},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_BRELOOM},
+ {5, 5, SPECIES_BRELOOM},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+};
+
+const struct WildPokemonInfo gBattlePikeMonsInfo_3 = {10, gBattlePikeMons_3};
+
+const struct WildPokemon gBattlePikeMons_4[] =
+{
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_WOBBUFFET},
+ {5, 5, SPECIES_WOBBUFFET},
+ {5, 5, SPECIES_WOBBUFFET},
+ {5, 5, SPECIES_WOBBUFFET},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+ {5, 5, SPECIES_WOBBUFFET},
+ {5, 5, SPECIES_WOBBUFFET},
+ {5, 5, SPECIES_SEVIPER},
+ {5, 5, SPECIES_MILOTIC},
+};
+
+const struct WildPokemonInfo gBattlePikeMonsInfo_4 = {10, gBattlePikeMons_4};
+
+const struct WildPokemonHeader gBattlePikeWildMonHeaders[] =
+{
+ {
+ .mapGroup = 0,
+ .mapNum = 1,
+ .landMonsInfo = &gBattlePikeMonsInfo_1,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 2,
+ .landMonsInfo = &gBattlePikeMonsInfo_2,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 3,
+ .landMonsInfo = &gBattlePikeMonsInfo_3,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 0,
+ .mapNum = 4,
+ .landMonsInfo = &gBattlePikeMonsInfo_4,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = 255,
+ .mapNum = 255,
+ .landMonsInfo = NULL,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+};
+
+const struct WildPokemon gWildFeebasRoute119Data = {20, 25, SPECIES_FEEBAS};
+
+const u16 gRoute119WaterTileData[] =
+{
+ 0, 0x2D, 0,
+ 0x2E, 0x5B, 0x83,
+ 0x5C, 0x8B, 0x12A,
+};
+// code
void DisableWildEncounters(bool8 disabled)
{
sWildEncountersDisabled = disabled;
@@ -61,7 +4613,7 @@ static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section)
for (yCur = yMin; yCur <= yMax; yCur++)
{
- for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++)
+ for (xCur = 0; xCur < gMapHeader.mapLayout->width; xCur++)
{
u8 tileBehaviorId = MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7);
if (MetatileBehavior_IsSurfableAndNotWaterfall(tileBehaviorId) == TRUE)
@@ -84,8 +4636,8 @@ static bool8 CheckFeebas(void)
u8 route119Section = 0;
u16 waterTileNum;
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ROUTE119
- && gSaveBlock1Ptr->location.mapNum == MAP_ID_ROUTE119)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE119)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE119))
{
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
x -= 7;
@@ -283,8 +4835,8 @@ static u16 GetCurrentMapWildMonHeaderId(void)
if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup &&
gWildMonHeaders[i].mapNum == gSaveBlock1Ptr->location.mapNum)
{
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ALTERING_CAVE &&
- gSaveBlock1Ptr->location.mapNum == MAP_ID_ALTERING_CAVE)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ALTERING_CAVE) &&
+ gSaveBlock1Ptr->location.mapNum == MAP_NUM(ALTERING_CAVE))
{
u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET);
if (alteringCaveId > 8)
@@ -424,7 +4976,7 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar
level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level))
return FALSE;
- if (gMapHeader.mapDataId != 0x166 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level))
+ if (gMapHeader.mapLayoutId != 0x166 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level))
return FALSE;
CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level);
@@ -485,7 +5037,7 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility)
{
u32 ability = GetMonAbility(&gPlayerParty[0]);
- if (ability == ABILITY_STENCH && gMapHeader.mapDataId == 0x169)
+ if (ability == ABILITY_STENCH && gMapHeader.mapLayoutId == 0x169)
encounterRate = encounterRate * 3 / 4;
else if (ability == ABILITY_STENCH)
encounterRate /= 2;
@@ -513,8 +5065,8 @@ static bool8 DoGlobalWildEncounterDiceRoll(void)
static bool8 AreLegendariesInSootopolisPreventingEncounters(void)
{
- if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP_SOOTOPOLIS_CITY
- || gSaveBlock1Ptr->location.mapNum != MAP_ID_SOOTOPOLIS_CITY)
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(SOOTOPOLIS_CITY)
+ || gSaveBlock1Ptr->location.mapNum != MAP_NUM(SOOTOPOLIS_CITY))
{
return FALSE;
}
@@ -533,7 +5085,7 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
headerId = GetCurrentMapWildMonHeaderId();
if (headerId == 0xFFFF) // invalid
{
- if (gMapHeader.mapDataId == 0x166)
+ if (gMapHeader.mapLayoutId == 0x166)
{
headerId = GetBattlePikeWildMonHeaderId();
if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
@@ -548,9 +5100,9 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
BattleSetup_StartBattlePikeWildBattle();
return TRUE;
}
- if (gMapHeader.mapDataId == 0x169)
+ if (gMapHeader.mapLayoutId == 0x169)
{
- headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId;
+ headerId = gSaveBlock2Ptr->frontier.field_CB2;
if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
return FALSE;
else if (DoWildEncounterRateTest(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
@@ -676,7 +5228,7 @@ bool8 SweetScentWildEncounter(void)
headerId = GetCurrentMapWildMonHeaderId();
if (headerId == 0xFFFF) // invalid
{
- if (gMapHeader.mapDataId == 0x166)
+ if (gMapHeader.mapLayoutId == 0x166)
{
headerId = GetBattlePikeWildMonHeaderId();
if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE)
@@ -686,9 +5238,9 @@ bool8 SweetScentWildEncounter(void)
BattleSetup_StartBattlePikeWildBattle();
return TRUE;
}
- if (gMapHeader.mapDataId == 0x169)
+ if (gMapHeader.mapLayoutId == 0x169)
{
- headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId;
+ headerId = gSaveBlock2Ptr->frontier.field_CB2;
if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE)
return FALSE;
diff --git a/src/window.c b/src/window.c
index f4cb48ec0..9a52a5a20 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1,9 +1,14 @@
#include "global.h"
#include "window.h"
#include "malloc.h"
-
-extern u8 gUnknown_03002F60;
-extern void* gUnknown_03002F70[];
+#include "bg.h"
+#include "blit.h"
+
+u32 filler_03002F58;
+u32 filler_03002F5C;
+u8 gUnknown_03002F60;
+u32 filler_03002F64;
+void *gUnknown_03002F70[4];
extern u32 gUnneededFireRedVariable;
#define WINDOWS_MAX 32
@@ -12,19 +17,6 @@ EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0};
EWRAM_DATA static struct Window* sWindowPtr = NULL;
EWRAM_DATA static u16 sWindowSize = 0;
-extern void* GetBgTilemapBuffer(u8 bg);
-extern int DummiedOutFireRedLeafGreenTileAllocFunc(int, int, int, int);
-extern u16 GetBgAttribute(u8 bg, u8 attributeId);
-extern void SetBgTilemapBuffer(u8 bg, void *tilemap);
-extern void CopyBgTilemapBufferToVram(u8 bg);
-extern u8 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset);
-extern void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, u16 tileNumDelta);
-extern void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette);
-extern void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey);
-extern void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey, u8 paletteNum);
-extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
-extern void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
-
static u8 GetNumActiveWindowsOnBg(u8 bgId);
static u8 GetNumActiveWindowsOnBg8Bit(u8 bgId);
@@ -127,13 +119,13 @@ u16 AddWindow(const struct WindowTemplate *template)
u8 *allocatedTilemapBuffer;
int i;
- for (win = 0; win < 0x20; ++win)
+ for (win = 0; win < WINDOWS_MAX; ++win)
{
if ((bgLayer = gWindows[win].window.priority) == 0xFF)
break;
}
- if (win == 0x20)
+ if (win == WINDOWS_MAX)
return 0xFF;
bgLayer = template->priority;
@@ -196,13 +188,13 @@ int AddWindowWithoutTileMap(const struct WindowTemplate *template)
u8 bgLayer;
int allocatedBaseBlock;
- for (win = 0; win < 0x20; ++win)
+ for (win = 0; win < WINDOWS_MAX; ++win)
{
if (gWindows[win].window.priority == 0xFF)
break;
}
- if (win == 0x20)
+ if (win == WINDOWS_MAX)
return 0xFF;
bgLayer = template->priority;
@@ -403,7 +395,7 @@ void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height)
}
}
-void BlitBitmapToWindow(u8 windowId, u8 *pixels, u16 x, u16 y, u16 width, u16 height)
+void BlitBitmapToWindow(u8 windowId, const u8 *pixels, u16 x, u16 y, u16 width, u16 height)
{
BlitBitmapRectToWindow(windowId, pixels, 0, 0, width, height, x, y, width, height);
}
@@ -465,696 +457,74 @@ void FillWindowPixelBuffer(u8 windowId, u8 fillValue)
CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize);
}
-// functionally equivalent, its fucking hard to match
-#ifdef NONMATCHING
+#define MOVE_TILES_DOWN(a) \
+{ \
+ destOffset = i + (a); \
+ srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
+ if (srcOffset < size) \
+ *(u32*)(tileData + destOffset) = *(u32*)(tileData + srcOffset); \
+ else \
+ *(u32*)(tileData + destOffset) = fillValue32; \
+ distanceLoop++; \
+}
+
+#define MOVE_TILES_UP(a) \
+{ \
+ destOffset = i + (a); \
+ srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \
+ if (srcOffset < size) \
+ *(u32*)(tileData - destOffset) = *(u32*)(tileData - srcOffset); \
+ else \
+ *(u32*)(tileData - destOffset) = fillValue32; \
+ distanceLoop++; \
+}
+
void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
{
- s32 i, id1, id2, size;
- u32 distanceLoop, toFill, width;
- u8 *tileData;
- struct WindowTemplate window;
-
- tileData = gWindows[windowId].tileData;
- toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue;
- window = gWindows[windowId].window;
- size = 0x20 * (window.height * window.width);
- width = window.width;
- if (direction != 1)
+ struct WindowTemplate window = gWindows[windowId].window;
+ u8 *tileData = gWindows[windowId].tileData;
+ u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue;
+ s32 size = window.height * window.width * 32;
+ u32 width = window.width;
+ s32 i;
+ s32 srcOffset, destOffset;
+ u32 distanceLoop;
+
+ switch (direction)
{
- s32 signedDirection = direction;
- if (signedDirection <= 1)
+ case 0:
+ for (i = 0; i < size; i += 32)
{
- if (signedDirection == 0)
- {
- for (i = 0; i < size; i += 0x20)
- {
- distanceLoop = distance;
- id1 = i + 0;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 4;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 8;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 12;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 16;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 20;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 24;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
-
- distanceLoop++;
- id1 = i + 28;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData + id1) = *(u32*)(tileData + id2);
- else
- *(u32*)(tileData + id1) = toFill;
- }
- }
+ distanceLoop = distance;
+ MOVE_TILES_DOWN(0)
+ MOVE_TILES_DOWN(4)
+ MOVE_TILES_DOWN(8)
+ MOVE_TILES_DOWN(12)
+ MOVE_TILES_DOWN(16)
+ MOVE_TILES_DOWN(20)
+ MOVE_TILES_DOWN(24)
+ MOVE_TILES_DOWN(28)
}
- }
- else
- {
+ break;
+ case 1:
tileData += size - 4;
- for (i = 0; i < size; i += 0x20)
+ for (i = 0; i < size; i += 32)
{
distanceLoop = distance;
- id1 = i + 0;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 4;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 8;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 12;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 16;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 20;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 24;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
-
- distanceLoop++;
- id1 = i + 28;
- id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4);
- if (id2 < size)
- *(u32*)(tileData - id1) = *(u32*)(tileData - id2);
- else
- *(u32*)(tileData - id1) = toFill;
+ MOVE_TILES_UP(0)
+ MOVE_TILES_UP(4)
+ MOVE_TILES_UP(8)
+ MOVE_TILES_UP(12)
+ MOVE_TILES_UP(16)
+ MOVE_TILES_UP(20)
+ MOVE_TILES_UP(24)
+ MOVE_TILES_UP(28)
}
+ break;
+ case 2:
+ break;
}
}
-#else
-__attribute__((naked))
-void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue)
-{
- 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, 24\n\
- lsrs r0, 24\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r8, r1\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- str r2, [sp]\n\
- lsls r3, 24\n\
- lsrs r3, 24\n\
- ldr r2, =gWindows\n\
- lsls r1, r0, 1\n\
- adds r1, r0\n\
- lsls r1, 2\n\
- adds r4, r1, r2\n\
- adds r2, 0x8\n\
- adds r1, r2\n\
- ldr r5, [r1]\n\
- lsls r7, r3, 24\n\
- lsls r0, r3, 16\n\
- orrs r7, r0\n\
- lsls r0, r3, 8\n\
- orrs r7, r0\n\
- orrs r7, r3\n\
- ldr r1, [r4]\n\
- ldr r2, [r4, 0x4]\n\
- ldrb r3, [r4, 0x4]\n\
- lsrs r0, r1, 24\n\
- muls r0, r3\n\
- lsls r6, r0, 5\n\
- lsrs r1, 24\n\
- mov r12, r1\n\
- mov r0, r8\n\
- cmp r0, 0x1\n\
- bne _08003CE8\n\
- b _08003E9E\n\
-_08003CE8:\n\
- cmp r0, 0x1\n\
- ble _08003CEE\n\
- b _08004046\n\
-_08003CEE:\n\
- cmp r0, 0\n\
- beq _08003CF4\n\
- b _08004046\n\
-_08003CF4:\n\
- movs r4, 0\n\
- cmp r4, r6\n\
- blt _08003CFC\n\
- b _08004046\n\
-_08003CFC:\n\
- movs r1, 0x8\n\
- negs r1, r1\n\
- mov r9, r1\n\
- movs r2, 0x7\n\
- mov r8, r2\n\
- mov r10, r5\n\
-_08003D08:\n\
- ldr r3, [sp]\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r3, 0\n\
- mov r2, r8\n\
- ands r0, r2\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003D34\n\
- adds r0, r5, r1\n\
- ldr r0, [r0]\n\
- mov r1, r10\n\
- str r0, [r1]\n\
- b _08003D38\n\
- .pool\n\
-_08003D34:\n\
- mov r2, r10\n\
- str r7, [r2]\n\
-_08003D38:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0x4\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003D64\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003D68\n\
-_08003D64:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003D68:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x8\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003D96\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003D9A\n\
-_08003D96:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003D9A:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0xC\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003DC8\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003DCC\n\
-_08003DC8:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003DCC:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x10\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003DFA\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003DFE\n\
-_08003DFA:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003DFE:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x14\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003E2C\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003E30\n\
-_08003E2C:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003E30:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x18\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003E5E\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003E62\n\
-_08003E5E:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003E62:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x1C\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- mov r1, r8\n\
- ands r3, r1\n\
- orrs r0, r3\n\
- lsls r0, 2\n\
- adds r1, r4, r0\n\
- cmp r1, r6\n\
- bge _08003E8C\n\
- adds r0, r5, r2\n\
- adds r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003E90\n\
-_08003E8C:\n\
- adds r0, r5, r2\n\
- str r7, [r0]\n\
-_08003E90:\n\
- movs r2, 0x20\n\
- add r10, r2\n\
- adds r4, 0x20\n\
- cmp r4, r6\n\
- bge _08003E9C\n\
- b _08003D08\n\
-_08003E9C:\n\
- b _08004046\n\
-_08003E9E:\n\
- subs r0, r6, 0x4\n\
- adds r5, r0\n\
- movs r4, 0\n\
- cmp r4, r6\n\
- blt _08003EAA\n\
- b _08004046\n\
-_08003EAA:\n\
- movs r0, 0x8\n\
- negs r0, r0\n\
- mov r9, r0\n\
- movs r1, 0x7\n\
- mov r8, r1\n\
- mov r10, r5\n\
-_08003EB6:\n\
- ldr r3, [sp]\n\
- adds r0, r3, 0\n\
- mov r2, r9\n\
- ands r0, r2\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r3, 0\n\
- mov r2, r8\n\
- ands r0, r2\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003EDC\n\
- subs r0, r5, r1\n\
- ldr r0, [r0]\n\
- mov r1, r10\n\
- str r0, [r1]\n\
- b _08003EE0\n\
-_08003EDC:\n\
- mov r2, r10\n\
- str r7, [r2]\n\
-_08003EE0:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0x4\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003F0C\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003F10\n\
-_08003F0C:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003F10:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x8\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003F3E\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003F42\n\
-_08003F3E:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003F42:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0xC\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003F70\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003F74\n\
-_08003F70:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003F74:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x10\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003FA2\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003FA6\n\
-_08003FA2:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003FA6:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x14\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08003FD4\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08003FD8\n\
-_08003FD4:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08003FD8:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x18\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- str r1, [sp, 0x4]\n\
- adds r0, r3, 0\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldr r1, [sp, 0x4]\n\
- orrs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r4, r1\n\
- cmp r1, r6\n\
- bge _08004006\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _0800400A\n\
-_08004006:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_0800400A:\n\
- adds r3, 0x1\n\
- adds r2, r4, 0\n\
- adds r2, 0x1C\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r12\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- mov r1, r8\n\
- ands r3, r1\n\
- orrs r0, r3\n\
- lsls r0, 2\n\
- adds r1, r4, r0\n\
- cmp r1, r6\n\
- bge _08004034\n\
- subs r0, r5, r2\n\
- subs r1, r5, r1\n\
- ldr r1, [r1]\n\
- str r1, [r0]\n\
- b _08004038\n\
-_08004034:\n\
- subs r0, r5, r2\n\
- str r7, [r0]\n\
-_08004038:\n\
- movs r2, 0x20\n\
- negs r2, r2\n\
- add r10, r2\n\
- adds r4, 0x20\n\
- cmp r4, r6\n\
- bge _08004046\n\
- b _08003EB6\n\
-_08004046:\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\
- .syntax divided");
-}
-#endif // NONMATCHING
void CallWindowFunction(u8 windowId, void ( *func)(u8, u8, u8, u8, u8, u8))
{